@@ -97,11 +97,6 @@ func edgeNodeUpdateBaseOs(client *zedcloudapi.Client, cfg *swagger_models.Device
97
97
return nil
98
98
}
99
99
100
- // Create the Edge Node
101
- func createEdgeNodeResource (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
102
- return diag .Errorf ("[ERROR] terraform-provider-zededa does not support Creation of Edge Nodes" )
103
- }
104
-
105
100
func rdConfigItems (d * schema.ResourceData ) ([]* swagger_models.EDConfigItem , error ) {
106
101
cfgItems := make ([]* swagger_models.EDConfigItem , 0 )
107
102
val , exists := d .GetOk ("config_items" )
@@ -205,16 +200,38 @@ func setSystemInterface(cfg *swagger_models.DeviceConfig, d *schema.ResourceData
205
200
return nil
206
201
}
207
202
208
- func rdDeviceConfig (cfg * swagger_models.DeviceConfig , d * schema.ResourceData ) error {
203
+ func setAdminState (cfg * swagger_models.DeviceConfig , d * schema.ResourceData , create bool ) error {
204
+ strVal := rdEntryStr (d , "adminstate_config" )
205
+ switch strVal {
206
+ case "ADMIN_STATE_ACTIVE" :
207
+ case "ADMIN_STATE_INACTIVE" :
208
+ break
209
+ default :
210
+ return fmt .Errorf ("adminstate_config must be specified and be one of " +
211
+ "ADMIN_STATE_ACTIVE, ADMIN_STATE_INACTIVE" )
212
+ }
213
+ if ! create {
214
+ // Device Update. If adminstate_config is ACTIVE and the device is
215
+ // already in Registered state, do not change Admin State
216
+ if strVal == "ADMIN_STATE_ACTIVE" && cfg .AdminState != nil &&
217
+ * cfg .AdminState == swagger_models .AdminStateADMINSTATEREGISTERED {
218
+ return nil
219
+ }
220
+ }
221
+ adminstate := swagger_models .AdminState (strVal )
222
+ cfg .AdminState = & adminstate
223
+ return nil
224
+ }
225
+
226
+ func rdDeviceConfig (cfg * swagger_models.DeviceConfig , d * schema.ResourceData , create bool ) error {
227
+ var err error
228
+ cfg .Description = rdEntryStr (d , "description" )
229
+ cfg .Title = rdEntryStrPtrOrNil (d , "title" )
230
+
231
+ setAdminState (cfg , d , create )
209
232
cfg .AssetID = rdEntryStr (d , "asset_id" )
210
233
cfg .ClientIP = rdEntryStr (d , "client_ip" )
211
234
cfg .ClusterID = rdEntryStr (d , "cluster_id" )
212
- cfg .Description = rdEntryStr (d , "description" )
213
- eve_image_version := rdEntryStr (d , "eve_image_version" )
214
- if eve_image_version == "" {
215
- return fmt .Errorf ("eve_image_version must be specified." )
216
- }
217
- var err error
218
235
cfg .ConfigItem , err = rdConfigItems (d )
219
236
if err != nil {
220
237
return err
@@ -223,18 +240,83 @@ func rdDeviceConfig(cfg *swagger_models.DeviceConfig, d *schema.ResourceData) er
223
240
if err != nil {
224
241
return err
225
242
}
243
+ eve_image_version := rdEntryStr (d , "eve_image_version" )
244
+ if eve_image_version == "" {
245
+ return fmt .Errorf ("eve_image_version must be specified." )
246
+ }
247
+ if create {
248
+ // EVE image version is set here only during create. Eve Image change is
249
+ // handled differently during update
250
+ cfg .BaseImage = cfgBaseosForEveVersionStr (rdEntryStr (d , "eve_image_version" ))
251
+ }
226
252
err = setSystemInterface (cfg , d )
227
253
if err != nil {
228
254
return err
229
255
}
256
+ if create {
257
+ // model id and project id will be set only during create.
258
+ cfg .ModelID = rdEntryStrPtrOrNil (d , "model_id" )
259
+ if cfg .ModelID == nil || * cfg .ModelID == "" {
260
+ return fmt .Errorf ("model_id must be specified for the EdgeNode." )
261
+ }
262
+ cfg .Obkey = rdEntryStr (d , "onboard_key" )
263
+ }
264
+ projectIdPtr := rdEntryStrPtrOrNil (d , "project_id" )
265
+ if create {
266
+ if projectIdPtr == nil || * projectIdPtr == "" {
267
+ return fmt .Errorf ("project_id must be specified for the EdgeNode." )
268
+ }
269
+ cfg .ProjectID = projectIdPtr
270
+ } else {
271
+ if cfg .ProjectID != nil && * cfg .ProjectID == * projectIdPtr {
272
+ // Update. Project cannot be changed
273
+ return fmt .Errorf ("project_id cannot be changed after EdgeNode is " +
274
+ "created. Current: %s, New: %s" , * cfg .ProjectID , * projectIdPtr )
275
+ }
276
+ }
277
+ cfg .Serialno = rdEntryStr (d , "serialno" )
230
278
cfg .Tags = rdEntryStrMap (d , "tags" )
231
- cfg .Title = rdEntryStrPtrOrNil (d , "title" )
232
279
return nil
233
280
}
234
281
282
+ // Create the Edge Node
283
+ func createEdgeNodeResource (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
284
+ var diags diag.Diagnostics
285
+
286
+ client := (meta .(Client )).Client
287
+ name := rdEntryStr (d , "name" )
288
+ id := rdEntryStr (d , "id" )
289
+ errMsgPrefix := getErrMsgPrefix (name , id , "EdgeNode" , "Create" )
290
+ if client == nil {
291
+ return diag .Errorf ("%s err: %s" , errMsgPrefix , "nil Client" )
292
+ }
293
+ cfg := & swagger_models.DeviceConfig {
294
+ Name : & name ,
295
+ }
296
+ err := rdDeviceConfig (cfg , d , true )
297
+ if err != nil {
298
+ return diag .Errorf ("%s Error: %s" , errMsgPrefix , err .Error ())
299
+ }
300
+ log .Printf ("[INFO] Creating EdgeNode: %s" , name )
301
+ client .XRequestIdPrefix = "TF-edgenode-create"
302
+ rspData := & swagger_models.ZsrvResponse {}
303
+ _ , err = client .SendReq ("POST" , deviceUrlExtension , cfg , rspData )
304
+ if err != nil {
305
+ return diag .Errorf ("%s err: %s" , errMsgPrefix , err .Error ())
306
+ }
307
+ id = rspData .ObjectID
308
+ log .Printf ("EdgeNode %s (ID: %s) Successfully created\n " , rspData .ObjectName , id )
309
+ d .SetId (id )
310
+ err = getEdgeNodeAndPublishData (client , d , name , id , true )
311
+ if err != nil {
312
+ log .Printf ("***[ERROR]- Failed to get EdgeNode: %s (ID: %s) after " +
313
+ "creating it. Err: %s" , name , id , err .Error ())
314
+ }
315
+ return diags
316
+ }
317
+
235
318
// Update the Resource Group
236
319
func updateEdgeNodeResource (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
237
- // Warning or errors can be collected in a slice type
238
320
var diags diag.Diagnostics
239
321
240
322
client := (meta .(Client )).Client
@@ -258,7 +340,7 @@ func updateEdgeNodeResource(ctx context.Context, d *schema.ResourceData, meta in
258
340
"Object in zedcontrol is not same as expected by Terraform." ,
259
341
errMsgPrefix , id , cfg .ID )
260
342
}
261
- err = rdDeviceConfig (cfg , d )
343
+ err = rdDeviceConfig (cfg , d , false )
262
344
if err != nil {
263
345
return diag .Errorf ("%s Error: %s" , errMsgPrefix , err .Error ())
264
346
}
@@ -271,20 +353,22 @@ func updateEdgeNodeResource(ctx context.Context, d *schema.ResourceData, meta in
271
353
if err != nil {
272
354
return diag .Errorf ("%s %s" , errMsgPrefix , err .Error ())
273
355
}
356
+ err = getEdgeNodeAndPublishData (client , d , name , id , true )
357
+ if err != nil {
358
+ return diag .Errorf ("%s" , err .Error ())
359
+ }
274
360
log .Printf ("[INFO] EdgeNode %s (ID: %s) Update Successful." , name , cfg .ID )
275
361
return diags
276
362
}
277
363
278
364
// Delete the Resource Group
279
365
func deleteEdgeNodeResource (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
280
- // Warning or errors can be collected in a slice type
281
366
var diags diag.Diagnostics
282
367
283
368
client := (meta .(Client )).Client
284
369
name := rdEntryStr (d , "name" )
285
370
id := rdEntryStr (d , "id" )
286
- errMsgPrefix := fmt .Sprintf ("[ERROR] Edge Node %s ( id: %s) Delete Failed." ,
287
- name , id )
371
+ errMsgPrefix := getErrMsgPrefix (name , id , "Edge Node" , "Delete" )
288
372
client .XRequestIdPrefix = "TF-edgenode-delete"
289
373
urlExtension := getEdgeNodeUrl (name , id , "delete" )
290
374
rspData := & swagger_models.ZsrvResponse {}
0 commit comments