-
Notifications
You must be signed in to change notification settings - Fork 247
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
✨ Pass preprovisioningNetworkData to Ironic #1380
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -456,6 +456,25 @@ func (p *ironicProvisioner) ValidateManagementAccess(data provisioner.Management | |
// below. | ||
} | ||
|
||
// If no PreprovisioningImage builder is enabled we set the Node network_data | ||
// this enables Ironic to inject the network_data into the ramdisk image | ||
if !p.config.havePreprovImgBuilder { | ||
networkDataRaw := data.PreprovisioningNetworkData | ||
if networkDataRaw != "" { | ||
var networkData map[string]interface{} | ||
if yamlErr := yaml.Unmarshal([]byte(networkDataRaw), &networkData); yamlErr != nil { | ||
p.log.Info("failed to unmarshal networkData from PreprovisioningNetworkData") | ||
result, err = transientError(fmt.Errorf("invalid preprovisioningNetworkData: %w", yamlErr)) | ||
return | ||
} | ||
numUpdates := len(updater.Updates) | ||
updater.SetTopLevelOpt("network_data", networkData, ironicNode.NetworkData) | ||
if len(updater.Updates) != numUpdates { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: maybe we should change SetTopLevelOpt to return a boolean (updated or not) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes I thought the same - I can perhaps look at a follow-up which refactors things to do that, but it seemed outside of the scope of this PR. |
||
p.log.Info("adding preprovisioning network_data for node", "node", ironicNode.UUID) | ||
} | ||
} | ||
} | ||
|
||
ironicNode, success, result, err := p.tryUpdateNode(ironicNode, updater) | ||
if !success { | ||
return | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did some more digging into the difference between
ObtainSecret()
(used here) andAcquireSecret()
, after having got it wrong several times 😄Both add a label to the Secret so that it gets watched and cached.
Only
AcquireSecret()
adds an owner reference so that the BMH gets reconciled if the Secret changes.In the case of network/user/metaData, what matters is the value at a point in time, when you start provisioning. It's the start of provisioning that kicks off the reconcile, so there's no need to re-reconcile when the Secret changes.
There's a strong argument that preprovisioningNetworkData is the same, and what matters is the value at the point in time where you start inspecting/preparing/deprovisioning.
There's probably another argument that since ironic may reboot the node in response to its own internal events (not the BMO), then we should always provide it with the most up-to-date data we know of. In practice we will get there eventually because we always requeue every few minutes at most, but there may be situations where something unintuitive happens.
This would be interesting to discuss further but not worth blocking on.