@@ -1252,6 +1252,59 @@ func (p *ironicProvisioner) Prepare(data provisioner.PrepareData, unprepared boo
1252
1252
return
1253
1253
}
1254
1254
1255
+ func (p * ironicProvisioner ) getConfigDrive (data provisioner.ProvisionData ) (configDrive nodes.ConfigDrive , err error ) {
1256
+ // Retrieve instance specific user data (cloud-init, ignition, etc).
1257
+ userData , err := data .HostConfig .UserData ()
1258
+ if err != nil {
1259
+ return configDrive , errors .Wrap (err , "could not retrieve user data" )
1260
+ }
1261
+ if userData != "" {
1262
+ configDrive .UserData = userData
1263
+ }
1264
+
1265
+ // Retrieve OpenStack network_data. Default value is empty.
1266
+ networkDataRaw , err := data .HostConfig .NetworkData ()
1267
+ if err != nil {
1268
+ return configDrive , errors .Wrap (err , "could not retrieve network data" )
1269
+ }
1270
+ if networkDataRaw != "" {
1271
+ var networkData map [string ]interface {}
1272
+ if err = yaml .Unmarshal ([]byte (networkDataRaw ), & networkData ); err != nil {
1273
+ return configDrive , errors .Wrap (err , "failed to unmarshal network_data.json from secret" )
1274
+ }
1275
+ configDrive .NetworkData = networkData
1276
+ }
1277
+
1278
+ // Retrieve meta data with fallback to defaults from provisioner.
1279
+ metaData := map [string ]interface {}{
1280
+ "uuid" : string (p .objectMeta .UID ),
1281
+ "metal3-namespace" : p .objectMeta .Namespace ,
1282
+ "metal3-name" : p .objectMeta .Name ,
1283
+ "local-hostname" : p .objectMeta .Name ,
1284
+ "local_hostname" : p .objectMeta .Name ,
1285
+ "name" : p .objectMeta .Name ,
1286
+ }
1287
+ metaDataRaw , err := data .HostConfig .MetaData ()
1288
+ if err != nil {
1289
+ return configDrive , errors .Wrap (err , "could not retrieve metadata" )
1290
+ }
1291
+ if metaDataRaw != "" {
1292
+ if err = yaml .Unmarshal ([]byte (metaDataRaw ), & metaData ); err != nil {
1293
+ return configDrive , errors .Wrap (err , "failed to unmarshal metadata from secret" )
1294
+ }
1295
+ }
1296
+
1297
+ // Set metaData if any field is populated by a user.
1298
+ if metaDataRaw != "" || networkDataRaw != "" || userData != "" {
1299
+ configDrive .MetaData = metaData
1300
+ p .log .Info ("triggering provisioning with config drive" )
1301
+ } else {
1302
+ p .log .Info ("triggering provisioning without config drive" )
1303
+ }
1304
+
1305
+ return
1306
+ }
1307
+
1255
1308
// Provision writes the image from the host spec to the host. It may
1256
1309
// be called multiple times, and should return true for its dirty flag
1257
1310
// until the deprovisioning operation is completed.
@@ -1290,8 +1343,18 @@ func (p *ironicProvisioner) Provision(data provisioner.ProvisionData) (result pr
1290
1343
return provResult , err
1291
1344
}
1292
1345
1293
- return p .changeNodeProvisionState (ironicNode ,
1294
- nodes.ProvisionStateOpts {Target : nodes .TargetActive })
1346
+ configDrive , err := p .getConfigDrive (data )
1347
+ if err != nil {
1348
+ return transientError (err )
1349
+ }
1350
+
1351
+ return p .changeNodeProvisionState (
1352
+ ironicNode ,
1353
+ nodes.ProvisionStateOpts {
1354
+ Target : nodes .TargetActive ,
1355
+ ConfigDrive : configDrive ,
1356
+ },
1357
+ )
1295
1358
1296
1359
case nodes .Manageable :
1297
1360
return p .changeNodeProvisionState (ironicNode ,
@@ -1316,54 +1379,9 @@ func (p *ironicProvisioner) Provision(data provisioner.ProvisionData) (result pr
1316
1379
// setting the state to "active".
1317
1380
p .log .Info ("making host active" )
1318
1381
1319
- // Retrieve cloud-init user data
1320
- userData , err := data .HostConfig .UserData ()
1321
- if err != nil {
1322
- return transientError (errors .Wrap (err , "could not retrieve user data" ))
1323
- }
1324
-
1325
- // Retrieve cloud-init network_data.json. Default value is empty
1326
- networkDataRaw , err := data .HostConfig .NetworkData ()
1327
- if err != nil {
1328
- return transientError (errors .Wrap (err , "could not retrieve network data" ))
1329
- }
1330
- var networkData map [string ]interface {}
1331
- if err = yaml .Unmarshal ([]byte (networkDataRaw ), & networkData ); err != nil {
1332
- return transientError (errors .Wrap (err , "failed to unmarshal network_data.json from secret" ))
1333
- }
1334
-
1335
- // Retrieve cloud-init meta_data.json with falback to default
1336
- metaData := map [string ]interface {}{
1337
- "uuid" : string (p .objectMeta .UID ),
1338
- "metal3-namespace" : p .objectMeta .Namespace ,
1339
- "metal3-name" : p .objectMeta .Name ,
1340
- "local-hostname" : p .objectMeta .Name ,
1341
- "local_hostname" : p .objectMeta .Name ,
1342
- "name" : p .objectMeta .Name ,
1343
- }
1344
- metaDataRaw , err := data .HostConfig .MetaData ()
1382
+ configDrive , err := p .getConfigDrive (data )
1345
1383
if err != nil {
1346
- return transientError (errors .Wrap (err , "could not retrieve metadata" ))
1347
- }
1348
- if metaDataRaw != "" {
1349
- if err = yaml .Unmarshal ([]byte (metaDataRaw ), & metaData ); err != nil {
1350
- return transientError (errors .Wrap (err , "failed to unmarshal metadata from secret" ))
1351
- }
1352
- }
1353
-
1354
- var configDrive nodes.ConfigDrive
1355
- if userData != "" {
1356
- configDrive = nodes.ConfigDrive {
1357
- UserData : userData ,
1358
- MetaData : metaData ,
1359
- NetworkData : networkData ,
1360
- }
1361
- if err != nil {
1362
- return transientError (errors .Wrap (err , "failed to build config drive" ))
1363
- }
1364
- p .log .Info ("triggering provisioning with config drive" )
1365
- } else {
1366
- p .log .Info ("triggering provisioning without config drive" )
1384
+ return transientError (err )
1367
1385
}
1368
1386
1369
1387
return p .changeNodeProvisionState (
0 commit comments