1
1
package db
2
2
3
3
import (
4
+ "encoding/json"
4
5
"strings"
5
6
6
7
"github.com/pkg/errors"
@@ -33,7 +34,8 @@ func (db Database) autoMigrate() error {
33
34
34
35
func (db Database ) migrateNodes () error {
35
36
// if nodes are already migrated skip migration
36
- if result := db .gormDB .First (& Node {}); result .Error == nil {
37
+ var nodes []Node
38
+ if result := db .gormDB .Model (& Node {}).Find (& nodes ); result .Error == nil {
37
39
log .Info ().Msg ("nodes Interfaces are already migrated" )
38
40
return nil
39
41
}
@@ -54,7 +56,27 @@ func (db Database) migrateNodes() error {
54
56
return db .Transaction (func (tx * gorm.DB ) error {
55
57
var nodes []nodeType
56
58
if err := tx .Model (& Node {}).Find (& nodes ).Error ; err != nil {
57
- return err
59
+ // if it has an error then it's dev net bug we need to fix it
60
+ type faultyNodeType struct {
61
+ NodeID uint64 `json:"node_id" gorm:"primaryKey"`
62
+ Interfaces Interface `gorm:"type:jsonb;serializer:json"`
63
+ }
64
+
65
+ var faultyNodes []faultyNodeType
66
+ if err := tx .Model (& Node {}).Find (& faultyNodes ).Error ; err != nil {
67
+ return err
68
+ }
69
+
70
+ nodes = []nodeType {}
71
+ for _ , n := range faultyNodes {
72
+ i := oldInterface {
73
+ Name : n .Interfaces .Name ,
74
+ Mac : n .Interfaces .Mac ,
75
+ IPs : strings .Join (n .Interfaces .IPs , "/" ),
76
+ }
77
+
78
+ nodes = append (nodes , nodeType {NodeID : n .NodeID , Interfaces : []oldInterface {i }})
79
+ }
58
80
}
59
81
60
82
for _ , node := range nodes {
@@ -69,17 +91,24 @@ func (db Database) migrateNodes() error {
69
91
interfaces = append (interfaces , newInterface )
70
92
}
71
93
72
- // skip the node if it has no interfaces
73
- if len (interfaces ) != 0 {
74
- // Update only the interfaces field
75
- if err := tx .Model (& Node {}).
76
- Where ("node_id = ?" , node .NodeID ).
77
- Update ("interfaces" , interfaces ).Error ; err != nil {
78
- return err // This will roll back the entire transaction
79
- }
94
+ // if node has no interfaces set it to empty interface
95
+ if len (interfaces ) == 0 {
96
+ interfaces = append (interfaces , Interface {})
97
+ }
80
98
81
- log .Info ().Uint64 ("node_id" , node .NodeID ).Msg ("Migration: updating node" )
99
+ // Update only the interfaces field
100
+ // Marshal the interfaces slice into JSON format
101
+ jsonData , err := json .Marshal (interfaces )
102
+ if err != nil {
103
+ return err
82
104
}
105
+ if err := tx .Model (& Node {}).
106
+ Where ("node_id = ?" , node .NodeID ).
107
+ Update ("interfaces" , jsonData ).Error ; err != nil {
108
+ return err // This will roll back the entire transaction
109
+ }
110
+
111
+ log .Info ().Uint64 ("node_id" , node .NodeID ).Msg ("Migration: updating node" )
83
112
84
113
}
85
114
0 commit comments