@@ -69,6 +69,10 @@ func getEpName(net *ConfigNetworkJson, ep *ConfigEpJson) string {
69
69
}
70
70
}
71
71
72
+ func postProcessing () {
73
+ time .Sleep (1 * time .Second )
74
+ }
75
+
72
76
func tenantPresent (allCfg * ConfigJson , tenantId string ) bool {
73
77
for _ , tenant := range allCfg .Tenants {
74
78
if tenantId == tenant .Name {
@@ -105,20 +109,25 @@ func epPresent(allCfg *ConfigJson, epId string) bool {
105
109
return false
106
110
}
107
111
108
- func deleteDelta (allCfg * ConfigJson , defOpts * cliOpts ) error {
109
-
112
+ func initEtcd (defOpts * cliOpts ) (* drivers.EtcdStateDriver , error ) {
110
113
etcdDriver := & drivers.EtcdStateDriver {}
111
114
driverConfig := & drivers.EtcdStateDriverConfig {}
112
115
driverConfig .Etcd .Machines = []string {defOpts .etcdUrl }
113
116
config := & core.Config {V : driverConfig }
114
117
err := etcdDriver .Init (config )
118
+ return etcdDriver , err
119
+ }
120
+
121
+ func deleteDelta (allCfg * ConfigJson , defOpts * cliOpts ) error {
122
+
123
+ etcdDriver , err := initEtcd (defOpts )
115
124
if err != nil {
116
125
log .Fatalf ("Failed to init etcd driver. Error: %s" , err )
117
126
}
118
127
119
128
keys , err := etcdDriver .ReadRecursive (drivers .EP_CFG_PATH_PREFIX )
120
129
if err != nil {
121
- return err
130
+ return core . ErrIfKeyExists ( err )
122
131
}
123
132
for _ , key := range keys {
124
133
epId := strings .TrimPrefix (key , drivers .EP_CFG_PATH_PREFIX )
@@ -133,7 +142,7 @@ func deleteDelta(allCfg *ConfigJson, defOpts *cliOpts) error {
133
142
if err != nil {
134
143
log .Printf ("error '%s' deleting ep %s \n " , err , epId )
135
144
}
136
- time . Sleep ( 1 * time . Second )
145
+ postProcessing ( )
137
146
}
138
147
}
139
148
@@ -154,7 +163,7 @@ func deleteDelta(allCfg *ConfigJson, defOpts *cliOpts) error {
154
163
if err != nil {
155
164
log .Printf ("error '%s' deleting net %s \n " , err , netId )
156
165
}
157
- time . Sleep ( 1 * time . Second )
166
+ postProcessing ( )
158
167
}
159
168
}
160
169
@@ -175,64 +184,84 @@ func deleteDelta(allCfg *ConfigJson, defOpts *cliOpts) error {
175
184
if err != nil {
176
185
log .Printf ("error '%s' deleting tenant %s \n " , err , tenantId )
177
186
}
178
- time . Sleep ( 1 * time . Second )
187
+ postProcessing ( )
179
188
}
180
189
}
181
190
182
191
return nil
183
192
}
184
193
185
- func executeJsonCfg (defOpts * cliOpts ) error {
186
- data , err := ioutil .ReadFile (opts .idStr )
187
- if err != nil {
188
- return err
189
- }
190
-
191
- allCfg := & ConfigJson {}
192
- err = json .Unmarshal (data , allCfg )
194
+ func processAdditions (allCfg * ConfigJson , defOpts * cliOpts ) (err error ) {
195
+ etcdDriver , err := initEtcd (defOpts )
193
196
if err != nil {
194
- log .Printf ("unmarshal error '%s', tenants %v \n " , err , allCfg )
195
- return err
197
+ log .Fatalf ("Failed to init etcd driver. Error: %s" , err )
196
198
}
197
- // log.Printf("parsed config %v \n", allCfg)
198
-
199
- deleteDelta (allCfg , defOpts )
200
199
201
200
for _ , tenant := range allCfg .Tenants {
202
- opts := * defOpts
203
- opts .construct .Set (CLI_CONSTRUCT_GLOBAL )
204
- opts .oper .Set (CLI_OPER_CREATE )
205
- opts .tenant = tenant .Name
206
- opts .pktTagType = tenant .DefaultNetType
207
- opts .subnetCidr = tenant .SubnetPool
208
- opts .allocSubnetLen = tenant .AllocSubnetLen
209
- opts .vlans = tenant .Vlans
210
- opts .vxlans = tenant .Vxlans
211
-
212
- log .Printf ("creating tenant %s \n " , opts .tenant )
213
- err = executeOpts (& opts )
214
- if err != nil {
215
- log .Printf ("error pushing global config state: %s \n " , err )
216
- return err
201
+ addTenant := true
202
+ if defOpts .cfgAdditions && len (tenant .Networks ) != 0 {
203
+ gcfg := gstate.Cfg {}
204
+ err = gcfg .Read (etcdDriver , tenant .Name )
205
+ if core .ErrIfKeyExists (err ) != nil {
206
+ log .Fatalf ("error reading the tenant %s , err '%s'\n " ,
207
+ tenant , err )
208
+ }
209
+ if err == nil {
210
+ addTenant = false
211
+ }
217
212
}
218
213
219
- for _ , net := range tenant .Networks {
220
- opts = * defOpts
221
-
222
- opts .construct .Set (CLI_CONSTRUCT_NW )
214
+ if addTenant {
215
+ opts := * defOpts
216
+ opts .construct .Set (CLI_CONSTRUCT_GLOBAL )
223
217
opts .oper .Set (CLI_OPER_CREATE )
224
218
opts .tenant = tenant .Name
225
- opts .idStr = net .Name
226
- if net .PktTag != "" {
227
- opts .pktTag = net .PktTag
228
- }
229
- log .Printf (" creating network %s \n " , opts .idStr )
219
+ opts .pktTagType = tenant .DefaultNetType
220
+ opts .subnetCidr = tenant .SubnetPool
221
+ opts .allocSubnetLen = tenant .AllocSubnetLen
222
+ opts .vlans = tenant .Vlans
223
+ opts .vxlans = tenant .Vxlans
224
+
225
+ log .Printf ("creating tenant %s \n " , opts .tenant )
230
226
err = executeOpts (& opts )
231
227
if err != nil {
232
- log .Printf ("error pushing network config state: %s \n " , err )
233
- return err
228
+ log .Printf ("error pushing global config state: %s \n " , err )
229
+ return
230
+ }
231
+ }
232
+
233
+ for _ , net := range tenant .Networks {
234
+
235
+ addNetwork := true
236
+ if defOpts .cfgAdditions && len (tenant .Networks ) != 0 {
237
+ nwCfg := & drivers.OvsCfgNetworkState {StateDriver : etcdDriver }
238
+ err = nwCfg .Read (net .Name )
239
+ if core .ErrIfKeyExists (err ) != nil {
240
+ log .Fatalf ("error reading the net %s , err '%s'\n " ,
241
+ net , err )
242
+ }
243
+ if err == nil {
244
+ addNetwork = false
245
+ }
246
+ }
247
+
248
+ if addNetwork {
249
+ opts = * defOpts
250
+ opts .construct .Set (CLI_CONSTRUCT_NW )
251
+ opts .oper .Set (CLI_OPER_CREATE )
252
+ opts .tenant = tenant .Name
253
+ opts .idStr = net .Name
254
+ if net .PktTag != "" {
255
+ opts .pktTag = net .PktTag
256
+ }
257
+ log .Printf (" creating network %s \n " , opts .idStr )
258
+ err = executeOpts (& opts )
259
+ if err != nil {
260
+ log .Printf ("error pushing network config state: %s \n " , err )
261
+ return
262
+ }
263
+ postProcessing ()
234
264
}
235
- time .Sleep (1 * time .Second )
236
265
237
266
for _ , ep := range net .Endpoints {
238
267
opts = * defOpts
@@ -247,12 +276,101 @@ func executeJsonCfg(defOpts *cliOpts) error {
247
276
err = executeOpts (& opts )
248
277
if err != nil {
249
278
log .Printf ("error pushing ep config state: %s \n " , err )
250
- return err
279
+ return
251
280
}
252
- time . Sleep ( 1 * time . Second )
281
+ postProcessing ( )
253
282
}
254
283
}
255
284
}
256
285
257
- return err
286
+ return
287
+ }
288
+
289
+ func processDeletions (allCfg * ConfigJson , defOpts * cliOpts ) (err error ) {
290
+ for _ , tenant := range allCfg .Tenants {
291
+ for _ , net := range tenant .Networks {
292
+ for _ , ep := range net .Endpoints {
293
+ opts = * defOpts
294
+ opts .construct .Set (CLI_CONSTRUCT_EP )
295
+ opts .oper .Set (CLI_OPER_DELETE )
296
+ opts .idStr = getEpName (& net , & ep )
297
+ opts .netId = net .Name
298
+ opts .contName = ep .Container
299
+ opts .homingHost = ep .Host
300
+ opts .intfName = ep .Intf
301
+ log .Printf ("deleting ep %s \n " , opts .idStr )
302
+ err = executeOpts (& opts )
303
+ if err != nil {
304
+ log .Printf ("error pushing ep config state: %s \n " , err )
305
+ return
306
+ }
307
+ postProcessing ()
308
+ }
309
+
310
+ if len (net .Endpoints ) == 0 {
311
+ opts = * defOpts
312
+ opts .construct .Set (CLI_CONSTRUCT_NW )
313
+ opts .oper .Set (CLI_OPER_DELETE )
314
+ opts .tenant = tenant .Name
315
+ opts .idStr = net .Name
316
+ log .Printf ("deleting network %s \n " , opts .idStr )
317
+ err = executeOpts (& opts )
318
+ if err != nil {
319
+ log .Printf ("error pushing network config state: %s \n " , err )
320
+ return
321
+ }
322
+ postProcessing ()
323
+ }
324
+ }
325
+
326
+ if len (tenant .Networks ) == 0 {
327
+ opts := * defOpts
328
+ opts .construct .Set (CLI_CONSTRUCT_GLOBAL )
329
+ opts .oper .Set (CLI_OPER_DELETE )
330
+ opts .tenant = tenant .Name
331
+
332
+ log .Printf ("deleting tenant %s \n " , opts .tenant )
333
+ err = executeOpts (& opts )
334
+ if err != nil {
335
+ log .Printf ("error pushing global config state: %s \n " , err )
336
+ return
337
+ }
338
+ }
339
+ }
340
+ return
341
+ }
342
+
343
+ func executeJsonCfg (defOpts * cliOpts ) (err error ) {
344
+ data , err := ioutil .ReadFile (opts .idStr )
345
+ if err != nil {
346
+ return err
347
+ }
348
+
349
+ allCfg := & ConfigJson {}
350
+ err = json .Unmarshal (data , allCfg )
351
+ if err != nil {
352
+ log .Printf ("unmarshal error '%s', tenants %v \n " , err , allCfg )
353
+ return
354
+ }
355
+ // log.Printf("parsed config %v \n", allCfg)
356
+
357
+ if defOpts .cfgDesired {
358
+ err = deleteDelta (allCfg , defOpts )
359
+ }
360
+ if err != nil {
361
+ log .Printf ("error deleting delta '%s' \n " , err )
362
+ return
363
+ }
364
+
365
+ if defOpts .cfgDeletions {
366
+ err = processDeletions (allCfg , defOpts )
367
+ } else {
368
+ err = processAdditions (allCfg , defOpts )
369
+ }
370
+ if err != nil {
371
+ log .Printf ("error processing cfg '%s' \n " , err )
372
+ return
373
+ }
374
+
375
+ return
258
376
}
0 commit comments