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