diff --git a/internal/controller/nova/common.go b/internal/controller/nova/common.go index a6dff9594..ca4523fc9 100644 --- a/internal/controller/nova/common.go +++ b/internal/controller/nova/common.go @@ -157,6 +157,8 @@ var ( // ErrACSecretMissingKeys indicates that the ApplicationCredential secret is missing required keys ErrACSecretMissingKeys = errors.New("ApplicationCredential secret missing required keys") + // ErrTemplateDirUnset indicates that no template directory was provided. + ErrTemplateDirUnset = errors.New("templateDir must be set") ) type conditionsGetter interface { @@ -169,32 +171,6 @@ type topologyHandler interface { SetLastAppliedTopology(t *topologyv1.TopoRef) } -// getTemplateInstanceType converts the CR Kind to the template directory path. -// templates are in templates/nova// -// e.g. NovaScheduler -> nova/scheduler, NovaAPI -> nova/api -func getTemplateInstanceType(instance client.Object) string { - kind := instance.GetObjectKind().GroupVersionKind().Kind - - // Kind to template dir mapping - switch kind { - case "NovaAPI": - return "nova/api" - case "NovaConductor": - return "nova/conductor" - case "NovaMetadata": - return "nova/metadata" - case "NovaScheduler": - return "nova/scheduler" - case "NovaNoVNCProxy": - return "nova/novncproxy" - case "NovaCompute": - return "nova/compute" - default: - // For other types (like Nova itself), use the kind as it is - return strings.ToLower(kind) - } -} - // ensureTopology - when a Topology CR is referenced, remove the // finalizer from a previous referenced Topology (if any), and retrieve the // newly referenced topology object @@ -533,12 +509,16 @@ func (r *ReconcilerBase) generateConfigsGeneric( extraData map[string]string, cmLabels map[string]string, additionalTemplates map[string]string, withScripts bool, + templateDir string, ) error { extraTemplates := map[string]string{ "01-nova.conf": "/nova/nova.conf", "nova-blank.conf": "/nova/nova-blank.conf", } + if templateDir == "" { + return ErrTemplateDirUnset + } maps.Copy(extraTemplates, additionalTemplates) cms := []util.Template{ @@ -546,7 +526,8 @@ func (r *ReconcilerBase) generateConfigsGeneric( Name: configName, Namespace: instance.GetNamespace(), Type: util.TemplateTypeConfig, - InstanceType: getTemplateInstanceType(instance), + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, + MultiTemplateDir: templateDir, ConfigOptions: templateParameters, Labels: cmLabels, CustomData: extraData, @@ -559,7 +540,8 @@ func (r *ReconcilerBase) generateConfigsGeneric( Name: nova.GetScriptSecretName(instance.GetName()), Namespace: instance.GetNamespace(), Type: util.TemplateTypeScripts, - InstanceType: getTemplateInstanceType(instance), + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, + MultiTemplateDir: templateDir, AdditionalTemplate: map[string]string{}, Annotations: map[string]string{}, Labels: cmLabels, @@ -575,10 +557,11 @@ func (r *ReconcilerBase) GenerateConfigs( templateParameters map[string]any, extraData map[string]string, cmLabels map[string]string, additionalTemplates map[string]string, + templateDir string, ) error { return r.generateConfigsGeneric( ctx, h, instance, configName, envVars, templateParameters, extraData, - cmLabels, additionalTemplates, false, + cmLabels, additionalTemplates, false, templateDir, ) } @@ -590,11 +573,12 @@ func (r *ReconcilerBase) GenerateConfigsWithScripts( templateParameters map[string]any, extraData map[string]string, cmLabels map[string]string, additionalTemplates map[string]string, + templateDir string, ) error { return r.generateConfigsGeneric( ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), envVars, templateParameters, extraData, - cmLabels, additionalTemplates, true, + cmLabels, additionalTemplates, true, templateDir, ) } diff --git a/internal/controller/nova/nova_controller.go b/internal/controller/nova/nova_controller.go index 1960f2fd7..4efcb433e 100644 --- a/internal/controller/nova/nova_controller.go +++ b/internal/controller/nova/nova_controller.go @@ -56,7 +56,7 @@ import ( novav1 "github.com/openstack-k8s-operators/nova-operator/api/nova/v1beta1" "github.com/openstack-k8s-operators/nova-operator/internal/nova" - "github.com/openstack-k8s-operators/nova-operator/internal/nova/api" + novaapi "github.com/openstack-k8s-operators/nova-operator/internal/nova/api" memcachedv1 "github.com/openstack-k8s-operators/infra-operator/apis/memcached/v1beta1" rabbitmqv1 "github.com/openstack-k8s-operators/infra-operator/apis/rabbitmq/v1beta1" @@ -1143,17 +1143,19 @@ func (r *NovaReconciler) ensureNovaManageJobSecret( cms := []util.Template{ { - Name: scriptName, - Namespace: instance.Namespace, - Type: util.TemplateTypeScripts, - InstanceType: "nova/nova-manage", - Labels: cmLabels, + Name: scriptName, + Namespace: instance.Namespace, + Type: util.TemplateTypeScripts, + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, + MultiTemplateDir: "nova/nova-manage", + Labels: cmLabels, }, { Name: configName, Namespace: instance.Namespace, Type: util.TemplateTypeConfig, - InstanceType: "nova/nova-manage", + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, + MultiTemplateDir: "nova/nova-manage", ConfigOptions: templateParameters, Labels: cmLabels, CustomData: extraData, @@ -2142,10 +2144,11 @@ func (r *NovaReconciler) ensureCellSecret( ) template := util.Template{ - Name: secretName, - Namespace: instance.Namespace, - Type: util.TemplateTypeNone, - InstanceType: getTemplateInstanceType(instance), + Name: secretName, + Namespace: instance.Namespace, + Type: util.TemplateTypeNone, + // No MultiTemplateDir: TemplateTypeNone does not load templates from a directory. + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, Labels: labels, CustomData: data, } @@ -2202,10 +2205,11 @@ func (r *NovaReconciler) ensureTopLevelSecret( ) template := util.Template{ - Name: secretName, - Namespace: instance.Namespace, - Type: util.TemplateTypeNone, - InstanceType: getTemplateInstanceType(instance), + Name: secretName, + Namespace: instance.Namespace, + Type: util.TemplateTypeNone, + // No MultiTemplateDir: TemplateTypeNone does not load templates from a directory. + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, Labels: labels, CustomData: data, } diff --git a/internal/controller/nova/novaapi_controller.go b/internal/controller/nova/novaapi_controller.go index e01a33ce1..6e5185039 100644 --- a/internal/controller/nova/novaapi_controller.go +++ b/internal/controller/nova/novaapi_controller.go @@ -574,7 +574,7 @@ func (r *NovaAPIReconciler) generateConfigs( err = r.GenerateConfigs( ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), - hashes, templateParameters, extraData, cmLabels, map[string]string{}, + hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/api", ) return err } diff --git a/internal/controller/nova/novacell_controller.go b/internal/controller/nova/novacell_controller.go index 4252de2a9..71bde0dd9 100644 --- a/internal/controller/nova/novacell_controller.go +++ b/internal/controller/nova/novacell_controller.go @@ -815,7 +815,7 @@ func (r *NovaCellReconciler) generateComputeConfigs( configName := instance.GetName() + "-compute-config" err := r.GenerateConfigs( - ctx, h, instance, configName, &hashes, templateParameters, extraData, cmLabels, map[string]string{}, + ctx, h, instance, configName, &hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/compute", ) if err != nil { return err diff --git a/internal/controller/nova/novacompute_controller.go b/internal/controller/nova/novacompute_controller.go index 34910122e..44837a889 100644 --- a/internal/controller/nova/novacompute_controller.go +++ b/internal/controller/nova/novacompute_controller.go @@ -396,7 +396,7 @@ func (r *NovaComputeReconciler) generateConfigs( ) err := r.GenerateConfigs( - ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), hashes, templateParameters, extraData, cmLabels, map[string]string{}, + ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/compute", ) return err } diff --git a/internal/controller/nova/novaconductor_controller.go b/internal/controller/nova/novaconductor_controller.go index 6b746554b..8fe3fd15f 100644 --- a/internal/controller/nova/novaconductor_controller.go +++ b/internal/controller/nova/novaconductor_controller.go @@ -517,7 +517,7 @@ func (r *NovaConductorReconciler) generateConfigs( instance, labels.GetGroupLabel(NovaConductorLabelPrefix), map[string]string{}) return r.GenerateConfigsWithScripts( - ctx, h, instance, hashes, templateParameters, extraData, cmLabels, map[string]string{}, + ctx, h, instance, hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/conductor", ) } diff --git a/internal/controller/nova/novametadata_controller.go b/internal/controller/nova/novametadata_controller.go index a645f2e94..c8335fdbf 100644 --- a/internal/controller/nova/novametadata_controller.go +++ b/internal/controller/nova/novametadata_controller.go @@ -580,7 +580,7 @@ func (r *NovaMetadataReconciler) generateConfigs( err = r.GenerateConfigs( ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), - hashes, templateParameters, extraData, cmLabels, map[string]string{}, + hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/metadata", ) return err } @@ -898,7 +898,7 @@ func (r *NovaMetadataReconciler) generateNeutronConfigs( Name: configName, Namespace: instance.GetNamespace(), Type: util.TemplateTypeNone, - InstanceType: getTemplateInstanceType(instance), + InstanceType: instance.GetObjectKind().GroupVersionKind().Kind, ConfigOptions: templateParameters, Labels: labels, AdditionalTemplate: templates, diff --git a/internal/controller/nova/novanovncproxy_controller.go b/internal/controller/nova/novanovncproxy_controller.go index 96b4bd6b3..b375d902e 100644 --- a/internal/controller/nova/novanovncproxy_controller.go +++ b/internal/controller/nova/novanovncproxy_controller.go @@ -536,7 +536,7 @@ func (r *NovaNoVNCProxyReconciler) generateConfigs( err = r.GenerateConfigs( ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), - hashes, templateParameters, extraData, cmLabels, map[string]string{}, + hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/novncproxy", ) return err } diff --git a/internal/controller/nova/novascheduler_controller.go b/internal/controller/nova/novascheduler_controller.go index e34a3f5cc..9a8556dc3 100644 --- a/internal/controller/nova/novascheduler_controller.go +++ b/internal/controller/nova/novascheduler_controller.go @@ -638,7 +638,7 @@ func (r *NovaSchedulerReconciler) generateConfigs( return r.GenerateConfigs( ctx, h, instance, nova.GetServiceConfigSecretName(instance.GetName()), - hashes, templateParameters, extraData, cmLabels, map[string]string{}, + hashes, templateParameters, extraData, cmLabels, map[string]string{}, "nova/scheduler", ) }