diff --git a/deploy/osps/default/osp-flatcar.yaml b/deploy/osps/default/osp-flatcar.yaml index 41442932..a132f904 100644 --- a/deploy/osps/default/osp-flatcar.yaml +++ b/deploy/osps/default/osp-flatcar.yaml @@ -343,10 +343,13 @@ spec: content: | [Install] WantedBy=multi-user.target + + {{- if not (eq .CloudProviderName "vmware-cloud-director") }} [Unit] Requires=network-online.target After=network-online.target + {{- end }} [Service] Type=oneshot diff --git a/pkg/controllers/osc/resources/operating_system_config.go b/pkg/controllers/osc/resources/operating_system_config.go index d931ee6b..391886f1 100644 --- a/pkg/controllers/osc/resources/operating_system_config.go +++ b/pkg/controllers/osc/resources/operating_system_config.go @@ -234,7 +234,17 @@ func GenerateOperatingSystemConfig( // Render files for provisioning config renderedProvisioningFiles, err := renderedFiles(osp.Spec.ProvisioningConfig, containerRuntime, data) if err != nil { - return nil, fmt.Errorf("failed to render bootstrapping file templates: %w", err) + return nil, fmt.Errorf("failed to render provisioning file templates: %w", err) + } + + renderedBootstrappingUnits, err := renederedUnits(osp.Spec.BootstrapConfig, data) + if err != nil { + return nil, fmt.Errorf("failed to render bootstrapping Unit templates: %w", err) + } + + renderedProvisioningUnits, err := renederedUnits(osp.Spec.ProvisioningConfig, data) + if err != nil { + return nil, fmt.Errorf("failed to render provisioning Unit templates: %w", err) } osc.Spec = osmv1alpha1.OperatingSystemConfigSpec{ @@ -245,13 +255,13 @@ func GenerateOperatingSystemConfig( Spec: providerConfig.CloudProviderSpec, }, BootstrapConfig: osmv1alpha1.OSCConfig{ - Units: ospOriginal.Spec.BootstrapConfig.Units, + Units: renderedBootstrappingUnits, Files: renderedBootstrappingFiles, UserSSHKeys: providerConfig.SSHPublicKeys, CloudInitModules: osp.Spec.BootstrapConfig.CloudInitModules, }, ProvisioningConfig: osmv1alpha1.OSCConfig{ - Units: ospOriginal.Spec.ProvisioningConfig.Units, + Units: renderedProvisioningUnits, Files: renderedProvisioningFiles, UserSSHKeys: providerConfig.SSHPublicKeys, CloudInitModules: osp.Spec.ProvisioningConfig.CloudInitModules, @@ -411,6 +421,38 @@ func selectAdditionalTemplates(config osmv1alpha1.OSPConfig, containerRuntime st return templates, nil } +func renederedUnits(config osmv1alpha1.OSPConfig, data filesData) ([]osmv1alpha1.Unit, error) { + populatedUnits, err := populateUnitList(config.Units, data) + if err != nil { + return nil, fmt.Errorf("failed to populate OSP Unit template: %w", err) + } + return populatedUnits, nil +} + +func populateUnitList(units []osmv1alpha1.Unit, d filesData) ([]osmv1alpha1.Unit, error) { + funcMap := fm.ExtraTxtFuncMap() + var punits []osmv1alpha1.Unit + for _, unit := range units { + content := unit.Content + tmpl, err := template.New(unit.Name).Funcs(funcMap).Parse(*content) + if err != nil { + return nil, fmt.Errorf("failed to parse OSP Unit [%s] template: %w", unit.Name, err) + } + + buff := bytes.Buffer{} + if err := tmpl.Execute(&buff, &d); err != nil { + return nil, err + } + pcontent := buff.String() + punit := unit.DeepCopy() + punit.Content = &pcontent + + punits = append(punits, *punit) + } + + return punits, nil +} + func addTemplatingSequence(templateName, template string) string { return fmt.Sprintf("\n{{- define \"%s\" }}\n%s\n{{- end }}", templateName, template) }