diff --git a/controllers/devfileregistry_controller.go b/controllers/devfileregistry_controller.go index d4aa3f2..a8de52e 100644 --- a/controllers/devfileregistry_controller.go +++ b/controllers/devfileregistry_controller.go @@ -94,7 +94,7 @@ func (r *DevfileRegistryReconciler) Reconcile(ctx context.Context, req ctrl.Requ } // Generate labels for any subresources generated by the operator - labels := registry.LabelsForDevfileRegistry(devfileRegistry.Name) + labels := registry.LabelsForDevfileRegistry(devfileRegistry) log.Info("Deploying registry") @@ -141,7 +141,7 @@ func (r *DevfileRegistryReconciler) Reconcile(ctx context.Context, req ctrl.Requ // Get the hostname of the generated devfile route devfilesRoute := &routev1.Route{} - err = r.Get(ctx, types.NamespacedName{Name: registry.IngressName(devfileRegistry.Name), Namespace: devfileRegistry.Namespace}, devfilesRoute) + err = r.Get(ctx, types.NamespacedName{Name: registry.IngressName(devfileRegistry), Namespace: devfileRegistry.Namespace}, devfilesRoute) if err != nil { // Log an error, but requeue, as the controller's cached kube client likely hasn't registered the new route yet. // See https://github.com/operator-framework/operator-sdk/issues/4013#issuecomment-707267616 for an explanation on why we requeue rather than error out here diff --git a/controllers/ensure.go b/controllers/ensure.go index e28b30d..0c95ad2 100644 --- a/controllers/ensure.go +++ b/controllers/ensure.go @@ -36,7 +36,7 @@ import ( func (r *DevfileRegistryReconciler) ensure(ctx context.Context, cr *registryv1alpha1.DevfileRegistry, resource client.Object, labels map[string]string, ingressDomain string) (*reconcile.Result, error) { resourceType := reflect.TypeOf(resource).Elem().Name() - resourceName := getResourceName(resource, cr.Name) + resourceName := getResourceName(resource, cr) //use the controller log // Check to see if the requested resource exists on the cluster. If it doesn't exist, create it and return. err := r.Get(ctx, types.NamespacedName{Name: resourceName, Namespace: cr.Namespace}, resource) @@ -74,20 +74,20 @@ func (r *DevfileRegistryReconciler) ensure(ctx context.Context, cr *registryv1al return nil, nil } -func getResourceName(resource runtime.Object, crName string) string { +func getResourceName(resource runtime.Object, cr *registryv1alpha1.DevfileRegistry) string { switch resource.(type) { case *appsv1.Deployment: - return registry.DeploymentName(crName) + return registry.DeploymentName(cr) case *corev1.ConfigMap: - return registry.ConfigMapName(crName) + return registry.ConfigMapName(cr) case *corev1.PersistentVolumeClaim: - return registry.PVCName(crName) + return registry.PVCName(cr) case *corev1.Service: - return registry.ServiceName(crName) + return registry.ServiceName(cr) case *routev1.Route, *networkingv1.Ingress: - return registry.IngressName(crName) + return registry.IngressName(cr) } - return registry.GenericResourceName(crName) + return registry.GenericResourceName(cr) } func (r *DevfileRegistryReconciler) generateResourceObject(cr *registryv1alpha1.DevfileRegistry, resource client.Object, labels map[string]string, ingressDomain string) client.Object { diff --git a/controllers/update.go b/controllers/update.go index d13f2d3..0d13a30 100644 --- a/controllers/update.go +++ b/controllers/update.go @@ -197,7 +197,7 @@ func (r *DevfileRegistryReconciler) deleteOldPVCIfNeeded(ctx context.Context, cr // Check to see if a PVC exists, if so, need to clean it up because storage was disabled if !registry.IsStorageEnabled(cr) { pvc := &corev1.PersistentVolumeClaim{} - err := r.Get(ctx, types.NamespacedName{Name: registry.PVCName(cr.Name), Namespace: cr.Namespace}, pvc) + err := r.Get(ctx, types.NamespacedName{Name: registry.PVCName(cr), Namespace: cr.Namespace}, pvc) if err != nil { if errors.IsNotFound(err) { // PVC not found, so there's no old PVC to delete. Just return nil, nothing to do. diff --git a/pkg/registry/configmap.go b/pkg/registry/configmap.go index 9963ff3..e39fa8f 100644 --- a/pkg/registry/configmap.go +++ b/pkg/registry/configmap.go @@ -59,7 +59,7 @@ DEVFILE_REGISTRIES=[{"name":"%s","url":"http://localhost:8080","fqdn":"%s"}]`, configMapData[".env.registry-viewer"] = viewerEnvfile cm := &corev1.ConfigMap{ - ObjectMeta: generateObjectMeta(ConfigMapName(cr.Name), cr.Namespace, labels), + ObjectMeta: generateObjectMeta(ConfigMapName(cr), cr.Namespace, labels), Data: configMapData, } diff --git a/pkg/registry/constants.go b/pkg/registry/constants.go new file mode 100644 index 0000000..9fdff4c --- /dev/null +++ b/pkg/registry/constants.go @@ -0,0 +1,19 @@ +// +// +// Copyright Red Hat +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package registry + +const maxTruncLength = 63 diff --git a/pkg/registry/defaults.go b/pkg/registry/defaults.go index a04e664..37b29d7 100644 --- a/pkg/registry/defaults.go +++ b/pkg/registry/defaults.go @@ -17,6 +17,9 @@ package registry import ( + "fmt" + "strings" + registryv1alpha1 "github.com/devfile/registry-operator/api/v1alpha1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -65,6 +68,9 @@ const ( DefaultHostnameOverride = "" DefaultNameOverride = "" DefaultFullnameOverride = "" + + // App name default + DefaultAppName = "devfile-registry" ) // GetRegistryViewerImage returns the container image for the registry viewer to be deployed on the Devfile Registry. @@ -159,7 +165,7 @@ func GetDevfileRegistryVolumeSource(cr *registryv1alpha1.DevfileRegistry) corev1 if IsStorageEnabled(cr) { return corev1.VolumeSource{ PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: PVCName(cr.Name), + ClaimName: PVCName(cr), }, } } @@ -251,3 +257,44 @@ func getDevfileRegistrySpecContainer(quantity string, defaultValue string) resou } return resource.MustParse(defaultValue) } + +// getAppName returns app name of a devfile registry +// truncated to 63 characters max, if `DevfileRegistry.NameOverride` +// is set it will return the override name truncated to 63 characters max +func getAppName(cr *registryv1alpha1.DevfileRegistry) string { + if cr != nil { + nameOverride := GetNameOverride(cr) + + if nameOverride == DefaultNameOverride { + return truncateName(DefaultAppName) + } + + return truncateName(nameOverride) + } + + return truncateName(DefaultAppName) +} + +// getAppFullName returns fully qualified app name of a devfile registry +// truncated to 63 characters max, if `DevfileRegistry.FullnameOverride` +// is set it will return the override name truncated to 63 characters max +func getAppFullName(cr *registryv1alpha1.DevfileRegistry) string { + if cr != nil { + fullNameOverride := GetFullnameOverride(cr) + + if fullNameOverride == DefaultFullnameOverride { + appName := getAppName(cr) + if cr.Name == "" { + return truncateName(appName) + } else if strings.Contains(cr.Name, appName) { + return truncateName(cr.Name) + } else { + return truncateName(fmt.Sprintf("%s-%s", cr.Name, appName)) + } + } + + return truncateName(fullNameOverride) + } + + return truncateName(DefaultAppName) +} diff --git a/pkg/registry/defaults_test.go b/pkg/registry/defaults_test.go index bd7b00a..68b98b6 100644 --- a/pkg/registry/defaults_test.go +++ b/pkg/registry/defaults_test.go @@ -17,6 +17,7 @@ package registry import ( + "fmt" "reflect" "testing" @@ -130,58 +131,63 @@ func TestGetDevfileRegistryVolumeSource(t *testing.T) { storageEnabled := true storageDisabled := false crName := "devfileregistry-test" + crTestData := []registryv1alpha1.DevfileRegistry{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: crName, + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + Storage: registryv1alpha1.DevfileRegistrySpecStorage{ + Enabled: &storageEnabled, + }, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: crName, + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + Storage: registryv1alpha1.DevfileRegistrySpecStorage{ + Enabled: &storageDisabled, + }, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: crName, + }, + Spec: registryv1alpha1.DevfileRegistrySpec{}, + }, + } tests := []struct { name string - cr registryv1alpha1.DevfileRegistry + cr *registryv1alpha1.DevfileRegistry want corev1.VolumeSource }{ { name: "Case 1: Storage enabled in DevfileRegistry CR", - cr: registryv1alpha1.DevfileRegistry{ - ObjectMeta: metav1.ObjectMeta{ - Name: crName, - }, - Spec: registryv1alpha1.DevfileRegistrySpec{ - Storage: registryv1alpha1.DevfileRegistrySpecStorage{ - Enabled: &storageEnabled, - }, - }, - }, + cr: &crTestData[0], want: corev1.VolumeSource{ PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: PVCName(crName), + ClaimName: PVCName(&crTestData[0]), }, }, }, { name: "Case 2: Storage disabled in DevfileRegistry CR", - cr: registryv1alpha1.DevfileRegistry{ - ObjectMeta: metav1.ObjectMeta{ - Name: crName, - }, - Spec: registryv1alpha1.DevfileRegistrySpec{ - Storage: registryv1alpha1.DevfileRegistrySpecStorage{ - Enabled: &storageDisabled, - }, - }, - }, + cr: &crTestData[1], want: corev1.VolumeSource{}, }, { name: "Case 3: Storage not set, default set to false", - cr: registryv1alpha1.DevfileRegistry{ - ObjectMeta: metav1.ObjectMeta{ - Name: crName, - }, - Spec: registryv1alpha1.DevfileRegistrySpec{}, - }, + cr: &crTestData[2], want: corev1.VolumeSource{}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tlsSetting := GetDevfileRegistryVolumeSource(&tt.cr) + tlsSetting := GetDevfileRegistryVolumeSource(tt.cr) if !reflect.DeepEqual(tlsSetting, tt.want) { t.Errorf("TestGetDevfileRegistryVolumeSource error: storage source mismatch, expected: %v got: %v", tt.want, tlsSetting) } @@ -559,3 +565,152 @@ func TestGetFullnameOverride(t *testing.T) { }) } } + +func Test_getAppName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Overridden Short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Overridden Long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := getAppName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func Test_getAppFullName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: fmt.Sprintf("%s-%s", "dr", DefaultAppName), + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-reg", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := getAppFullName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} diff --git a/pkg/registry/deployment.go b/pkg/registry/deployment.go index 7d67f24..0d12dab 100644 --- a/pkg/registry/deployment.go +++ b/pkg/registry/deployment.go @@ -39,7 +39,7 @@ func GenerateDeployment(cr *registryv1alpha1.DevfileRegistry, scheme *runtime.Sc fsGroup := int64(3001) dep := &appsv1.Deployment{ - ObjectMeta: generateObjectMeta(cr.Name, cr.Namespace, labels), + ObjectMeta: generateObjectMeta(DeploymentName(cr), cr.Namespace, labels), Spec: appsv1.DeploymentSpec{ Replicas: &replicas, Selector: &metav1.LabelSelector{ @@ -184,7 +184,7 @@ func GenerateDeployment(cr *registryv1alpha1.DevfileRegistry, scheme *runtime.Sc VolumeSource: corev1.VolumeSource{ ConfigMap: &corev1.ConfigMapVolumeSource{ LocalObjectReference: corev1.LocalObjectReference{ - Name: ConfigMapName(cr.Name), + Name: ConfigMapName(cr), }, Items: []corev1.KeyToPath{ { diff --git a/pkg/registry/ingress.go b/pkg/registry/ingress.go index 4fab98e..e840367 100644 --- a/pkg/registry/ingress.go +++ b/pkg/registry/ingress.go @@ -28,7 +28,7 @@ import ( func GenerateIngress(cr *registryv1alpha1.DevfileRegistry, host string, scheme *runtime.Scheme, labels map[string]string) *networkingv1.Ingress { pathTypeImplementationSpecific := networkingv1.PathTypeImplementationSpecific ingress := &networkingv1.Ingress{ - ObjectMeta: generateObjectMeta(IngressName(cr.Name), cr.Namespace, labels), + ObjectMeta: generateObjectMeta(IngressName(cr), cr.Namespace, labels), Spec: networkingv1.IngressSpec{ Rules: []networkingv1.IngressRule{ { @@ -40,7 +40,7 @@ func GenerateIngress(cr *registryv1alpha1.DevfileRegistry, host string, scheme * Path: "/", Backend: networkingv1.IngressBackend{ Service: &networkingv1.IngressServiceBackend{ - Name: ServiceName(cr.Name), + Name: ServiceName(cr), Port: networkingv1.ServiceBackendPort{ Number: int32(DevfileIndexPort), }, @@ -76,5 +76,5 @@ func GetDevfileRegistryIngress(cr *registryv1alpha1.DevfileRegistry) string { } func GetHostname(cr *registryv1alpha1.DevfileRegistry) string { - return fmt.Sprintf("%s-%s", cr.Name, cr.Namespace) + return fmt.Sprintf("%s-%s", getAppFullName(cr), cr.Namespace) } diff --git a/pkg/registry/ingress_test.go b/pkg/registry/ingress_test.go index 6b51449..51e23f7 100644 --- a/pkg/registry/ingress_test.go +++ b/pkg/registry/ingress_test.go @@ -20,6 +20,7 @@ import ( "testing" registryv1alpha1 "github.com/devfile/registry-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestGetDevfileRegistryIngress(t *testing.T) { @@ -32,18 +33,20 @@ func TestGetDevfileRegistryIngress(t *testing.T) { { name: "Case 1: Correct Conjunction", cr: registryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-name", + Namespace: "test-namespace", + }, Spec: registryv1alpha1.DevfileRegistrySpec{ K8s: registryv1alpha1.DevfileRegistrySpecK8sOnly{ IngressDomain: "my-domain", }, }}, - want: "test-name-test-namespace.my-domain", + want: "test-name-devfile-registry-test-namespace.my-domain", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tt.cr.Name = "test-name" - tt.cr.Namespace = "test-namespace" ingress := GetDevfileRegistryIngress(&tt.cr) if ingress != tt.want { t.Errorf("expected: %v got: %v", tt.want, ingress) @@ -63,18 +66,20 @@ func TestGetHostname(t *testing.T) { { name: "Case 1: Correct Hostname", cr: registryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-name", + Namespace: "test-namespace", + }, Spec: registryv1alpha1.DevfileRegistrySpec{ K8s: registryv1alpha1.DevfileRegistrySpecK8sOnly{ IngressDomain: "my-domain", }, }}, - want: "test-name-test-namespace", + want: "test-name-devfile-registry-test-namespace", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tt.cr.Name = "test-name" - tt.cr.Namespace = "test-namespace" hostname := GetHostname(&tt.cr) if hostname != tt.want { t.Errorf("expected: %v got: %v", tt.want, hostname) diff --git a/pkg/registry/naming.go b/pkg/registry/naming.go index 57255f3..f93af5f 100644 --- a/pkg/registry/naming.go +++ b/pkg/registry/naming.go @@ -16,36 +16,48 @@ package registry -// genericResourceName returns just the name of the custom resource, to be used -func GenericResourceName(devfileRegistryName string) string { - return devfileRegistryName +import ( + registryv1alpha1 "github.com/devfile/registry-operator/api/v1alpha1" +) + +// GenericResourceName returns just the fully qualified app name, to be used +func GenericResourceName(cr *registryv1alpha1.DevfileRegistry) string { + return getAppFullName(cr) } // DeploymentName returns the name of the deployment object associated with the DevfileRegistry CR -// Just returns the CR name right now, but extracting to a function to avoid relying on that assumption in the future -func DeploymentName(devfileRegistryName string) string { - return GenericResourceName(devfileRegistryName) +// Just returns the fully qualified app name right now, but extracting to a function to avoid relying on that assumption in the future +func DeploymentName(cr *registryv1alpha1.DevfileRegistry) string { + return GenericResourceName(cr) } // ServiceName returns the name of the service object associated with the DevfileRegistry CR -// Just returns the CR name right now, but extracting to a function to avoid relying on that assumption in the future -func ServiceName(devfileRegistryName string) string { - return GenericResourceName(devfileRegistryName) +// Just returns the fully qualified app name right now, but extracting to a function to avoid relying on that assumption in the future +func ServiceName(cr *registryv1alpha1.DevfileRegistry) string { + return GenericResourceName(cr) } // ConfigMapName returns the name of the service object associated with the DevfileRegistry CR -func ConfigMapName(devfileRegistryName string) string { - return devfileRegistryName + "-registry-config" +func ConfigMapName(cr *registryv1alpha1.DevfileRegistry) string { + const suffixLength = 15 + appFullName := getAppFullName(cr) + configMapNameLength := (len(appFullName) + suffixLength) + + if configMapNameLength > maxTruncLength { + return truncateNameLengthN(appFullName, len(appFullName)-suffixLength) + "-registry-config" + } + + return appFullName + "-registry-config" } // PVCName returns the name of the PVC object associated with the DevfileRegistry CR -// Just returns the CR name right now, but extracting to a function to avoid relying on that assumption in the future -func PVCName(devfileRegistryName string) string { - return GenericResourceName(devfileRegistryName) +// Just returns the fully qualified app name right now, but extracting to a function to avoid relying on that assumption in the future +func PVCName(cr *registryv1alpha1.DevfileRegistry) string { + return GenericResourceName(cr) } // IngressName returns the name of the Ingress object associated with the DevfileRegistry CR -// Just returns the CR name right now, but extracting to a function to avoid relying on that assumption in the future -func IngressName(devfileRegistryName string) string { - return GenericResourceName(devfileRegistryName) +// Just returns the fully qualified app name right now, but extracting to a function to avoid relying on that assumption in the future +func IngressName(cr *registryv1alpha1.DevfileRegistry) string { + return GenericResourceName(cr) } diff --git a/pkg/registry/naming_test.go b/pkg/registry/naming_test.go new file mode 100644 index 0000000..1536fe1 --- /dev/null +++ b/pkg/registry/naming_test.go @@ -0,0 +1,643 @@ +// +// +// Copyright Red Hat +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package registry + +import ( + "fmt" + "testing" + + registryv1alpha1 "github.com/devfile/registry-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestGenericResourceName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: fmt.Sprintf("%s-%s", "dr", DefaultAppName), + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-reg", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := GenericResourceName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func TestDeploymentName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: fmt.Sprintf("%s-%s", "dr", DefaultAppName), + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-reg", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := DeploymentName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func TestConfigMapName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: "devfile-registry-registry-config", + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-registry-config", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-pr-registry-config", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr-registry-config", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-pr-registry-config", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: "dr-devfile-registry-registry-config", + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0r-registry-config", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test-registry-config", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test-registry-config", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: "devfile-registry-registry-config", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := ConfigMapName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func TestServiceName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: fmt.Sprintf("%s-%s", "dr", DefaultAppName), + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-reg", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := ServiceName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func TestPVCName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: fmt.Sprintf("%s-%s", "dr", DefaultAppName), + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-reg", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := PVCName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func TestIngressName(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want string + }{ + { + name: "Case 1: Default App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: DefaultAppName, + }, + { + name: "Case 2: Default App Full Name with overridden short App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 3: Default App Full Name with overridden long App Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 4: Overridden Short App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "dr", + }, + }, + want: "dr", + }, + { + name: "Case 5: Overridden Long App Full Name", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + FullnameOverride: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + }, + }, + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + { + name: "Case 6: Default App Full Name with short CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr", + }, + }, + want: fmt.Sprintf("%s-%s", "dr", DefaultAppName), + }, + { + name: "Case 7: Default App Full Name with long CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-registry", + }, + }, + want: "testregistry-devfile-io-k8s-prow-af4325d2dcb2d0rte1-devfile-reg", + }, + { + name: "Case 8: Default App Full Name with CR name contains default app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: "devfile-registry-test", + }, + { + name: "Case 9: Default App Full Name with CR name contains overridden app name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "dr-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: "dr-test", + }, + { + name: "Case 10: CR set to nil", + cr: nil, + want: DefaultAppName, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := IngressName(test.cr) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} diff --git a/pkg/registry/route.go b/pkg/registry/route.go index 24a6c08..6f5d5d3 100644 --- a/pkg/registry/route.go +++ b/pkg/registry/route.go @@ -30,11 +30,11 @@ func GenerateRoute(cr *registryv1alpha1.DevfileRegistry, scheme *runtime.Scheme, weight := int32(100) route := &routev1.Route{ - ObjectMeta: generateObjectMeta(IngressName(cr.Name), cr.Namespace, labels), + ObjectMeta: generateObjectMeta(IngressName(cr), cr.Namespace, labels), Spec: routev1.RouteSpec{ To: routev1.RouteTargetReference{ Kind: "Service", - Name: ServiceName(cr.Name), + Name: ServiceName(cr), Weight: &weight, }, Port: &routev1.RoutePort{ diff --git a/pkg/registry/service.go b/pkg/registry/service.go index 0ac4c60..33161e3 100644 --- a/pkg/registry/service.go +++ b/pkg/registry/service.go @@ -27,7 +27,7 @@ import ( // GenerateDevfileRegistryService returns a devfileregistry Service object func GenerateService(cr *registryv1alpha1.DevfileRegistry, scheme *runtime.Scheme, labels map[string]string) *corev1.Service { svc := &corev1.Service{ - ObjectMeta: generateObjectMeta(ServiceName(cr.Name), cr.Namespace, labels), + ObjectMeta: generateObjectMeta(ServiceName(cr), cr.Namespace, labels), Spec: corev1.ServiceSpec{ Ports: []corev1.ServicePort{ { diff --git a/pkg/registry/util.go b/pkg/registry/util.go index 29f0402..c16daca 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -16,7 +16,32 @@ package registry -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + "strings" + + registryv1alpha1 "github.com/devfile/registry-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// truncateName truncates given name to default 63 characters, +// trims "-" from suffix if last character +func truncateName(name string) string { + return truncateNameLengthN(name, maxTruncLength) +} + +// truncateNameLengthN truncates given name to given n characters, +// trims "-" from suffix if last character +func truncateNameLengthN(name string, n int) string { + if n < 0 { + n = 0 + } + + if len(name) > n { + return strings.TrimSuffix(name[:n], "-") + } + + return strings.TrimSuffix(name, "-") +} func generateObjectMeta(name string, namespace string, labels map[string]string) metav1.ObjectMeta { return metav1.ObjectMeta{ @@ -28,6 +53,10 @@ func generateObjectMeta(name string, namespace string, labels map[string]string) // LabelsForDevfileRegistry returns the labels for selecting the resources // belonging to the given devfileregistry CR name. -func LabelsForDevfileRegistry(name string) map[string]string { - return map[string]string{"app": "devfileregistry", "devfileregistry_cr": name} +func LabelsForDevfileRegistry(cr *registryv1alpha1.DevfileRegistry) map[string]string { + if cr != nil { + return map[string]string{"app": getAppName(cr), "devfileregistry_cr": cr.Name} + } + + return map[string]string{"app": DefaultAppName} } diff --git a/pkg/registry/util_test.go b/pkg/registry/util_test.go new file mode 100644 index 0000000..ce4c0a8 --- /dev/null +++ b/pkg/registry/util_test.go @@ -0,0 +1,190 @@ +// +// +// Copyright Red Hat +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package registry + +import ( + "reflect" + "testing" + + registryv1alpha1 "github.com/devfile/registry-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func Test_truncateName(t *testing.T) { + tests := []struct { + name string + input string + want string + }{ + { + name: "Case 1: Short name", + input: "devfile-registry-test", + want: "devfile-registry-test", + }, + { + name: "Case 2: Long name", + input: "devfile-registry-testregistry-devfile-io-k8s-prow-test-environment-afdfs2345j2234j2k42ljl234", + want: "devfile-registry-testregistry-devfile-io-k8s-prow-test-environm", + }, + { + name: "Case 3: Short name with leftover suffix", + input: "devfile-registry-test-", + want: "devfile-registry-test", + }, + { + name: "Case 4: Long name with leftover suffix", + input: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + want: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := truncateName(test.input) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func Test_truncateNameLengthN(t *testing.T) { + tests := []struct { + name string + inputName string + inputLength int + want string + }{ + { + name: "Case 1: Short name", + inputName: "devfile-registry-test", + want: "devfile-registry", + inputLength: 17, + }, + { + name: "Case 2: Long name", + inputName: "devfile-registry-testregistry-devfile-io-k8s-prow-test-environment-afdfs2345j2234j2k42ljl234", + want: "devfile-registry-testregistry-devfile-io-k8s-prow", + inputLength: 49, + }, + { + name: "Case 3: Short name with leftover suffix", + inputName: "devfile-registry-test-", + want: "devfile-registry-test", + inputLength: 30, + }, + { + name: "Case 4: Long name with leftover suffix", + inputName: "devfile-registry-testregistry-devfile-io-k8s-prow-environment1-tf433", + want: "devfile-registry-testregistry", + inputLength: 30, + }, + { + name: "Case 5: Negative truncation length", + inputName: "devfile-registry-test", + want: "", + inputLength: -17, + }, + { + name: "Case 6: Truncation length zero", + inputName: "devfile-registry-test", + want: "", + inputLength: 0, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := truncateNameLengthN(test.inputName, test.inputLength) + if got != test.want { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} + +func TestLabelsForDevfileRegistry(t *testing.T) { + tests := []struct { + name string + cr *registryv1alpha1.DevfileRegistry + want map[string]string + }{ + { + name: "Case 1: Labels with set CR name", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + }, + want: map[string]string{ + "app": DefaultAppName, + "devfileregistry_cr": "devfile-registry-test", + }, + }, + { + name: "Case 2: Labels with set CR name and app name override", + cr: ®istryv1alpha1.DevfileRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: "devfile-registry-test", + }, + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: map[string]string{ + "app": "dr", + "devfileregistry_cr": "devfile-registry-test", + }, + }, + { + name: "Case 3: Labels with set app name override", + cr: ®istryv1alpha1.DevfileRegistry{ + Spec: registryv1alpha1.DevfileRegistrySpec{ + NameOverride: "dr", + }, + }, + want: map[string]string{ + "app": "dr", + "devfileregistry_cr": "", + }, + }, + { + name: "Case 4: Labels with empty CR", + cr: ®istryv1alpha1.DevfileRegistry{}, + want: map[string]string{ + "app": DefaultAppName, + "devfileregistry_cr": "", + }, + }, + { + name: "Case 5: Labels with nil passed as CR", + cr: nil, + want: map[string]string{ + "app": DefaultAppName, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := LabelsForDevfileRegistry(test.cr) + if !reflect.DeepEqual(got, test.want) { + t.Errorf("\nGot: %v\nExpected: %v\n", got, test.want) + } + }) + } +} diff --git a/pkg/registry/volume.go b/pkg/registry/volume.go index 1d4e10e..5eab21b 100644 --- a/pkg/registry/volume.go +++ b/pkg/registry/volume.go @@ -28,7 +28,7 @@ import ( // GenerateDevfileRegistryPVC returns a PVC for providing storage on the OCI registry container func GeneratePVC(cr *registryv1alpha1.DevfileRegistry, scheme *runtime.Scheme, labels map[string]string) *corev1.PersistentVolumeClaim { pvc := &corev1.PersistentVolumeClaim{ - ObjectMeta: generateObjectMeta(cr.Name, cr.Namespace, labels), + ObjectMeta: generateObjectMeta(PVCName(cr), cr.Namespace, labels), Spec: corev1.PersistentVolumeClaimSpec{ AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, Resources: corev1.ResourceRequirements{ diff --git a/tests/integration/examples/create/devfileregistry-headless.yaml b/tests/integration/examples/create/devfileregistry-headless.yaml index f36eb4d..95ec8df 100644 --- a/tests/integration/examples/create/devfileregistry-headless.yaml +++ b/tests/integration/examples/create/devfileregistry-headless.yaml @@ -1,7 +1,7 @@ apiVersion: registry.devfile.io/v1alpha1 kind: DevfileRegistry metadata: - name: devfileregistry-headless + name: devfile-registry-headless spec: devfileIndex: image: quay.io/devfile/devfile-index:next diff --git a/tests/integration/examples/create/devfileregistry-tls.yaml b/tests/integration/examples/create/devfileregistry-tls.yaml index 6f04ae5..04d37f8 100644 --- a/tests/integration/examples/create/devfileregistry-tls.yaml +++ b/tests/integration/examples/create/devfileregistry-tls.yaml @@ -1,7 +1,7 @@ apiVersion: registry.devfile.io/v1alpha1 kind: DevfileRegistry metadata: - name: devfileregistry-tls + name: devfile-registry-tls spec: devfileIndex: image: quay.io/devfile/devfile-index:next diff --git a/tests/integration/examples/create/devfileregistry.yaml b/tests/integration/examples/create/devfileregistry.yaml index 3b66684..70a8b63 100644 --- a/tests/integration/examples/create/devfileregistry.yaml +++ b/tests/integration/examples/create/devfileregistry.yaml @@ -1,7 +1,7 @@ apiVersion: registry.devfile.io/v1alpha1 kind: DevfileRegistry metadata: - name: devfileregistry + name: devfile-registry spec: devfileIndex: image: quay.io/devfile/devfile-index:next diff --git a/tests/integration/examples/update/devfileregistry-new.yaml b/tests/integration/examples/update/devfileregistry-new.yaml index ea262d6..c65e859 100644 --- a/tests/integration/examples/update/devfileregistry-new.yaml +++ b/tests/integration/examples/update/devfileregistry-new.yaml @@ -1,7 +1,7 @@ apiVersion: registry.devfile.io/v1alpha1 kind: DevfileRegistry metadata: - name: devfileregistry-update + name: devfile-registry-update spec: devfileIndex: image: quay.io/devfile/devfile-index:next diff --git a/tests/integration/examples/update/devfileregistry-old.yaml b/tests/integration/examples/update/devfileregistry-old.yaml index 5334548..3a381d2 100644 --- a/tests/integration/examples/update/devfileregistry-old.yaml +++ b/tests/integration/examples/update/devfileregistry-old.yaml @@ -1,7 +1,7 @@ apiVersion: registry.devfile.io/v1alpha1 kind: DevfileRegistry metadata: - name: devfileregistry-update + name: devfile-registry-update spec: devfileIndex: image: quay.io/devfile/devfile-index:next diff --git a/tests/integration/pkg/tests/devfileregistry_tests.go b/tests/integration/pkg/tests/devfileregistry_tests.go index 8e18ba9..914e032 100644 --- a/tests/integration/pkg/tests/devfileregistry_tests.go +++ b/tests/integration/pkg/tests/devfileregistry_tests.go @@ -33,7 +33,7 @@ var K8sClient *client.K8sClient var _ = ginkgo.Describe("[Create Devfile Registry resource]", func() { ginkgo.It("Should deploy a devfile registry on to the cluster", func() { - crName := "devfileregistry" + crName := "devfile-registry" label := "devfileregistry_cr=" + crName // Deploy the devfileregistry resource for this test case and wait for the pod to be running @@ -88,7 +88,7 @@ var _ = ginkgo.Describe("[Create Devfile Registry resource]", func() { var _ = ginkgo.Describe("[Create Devfile Registry resource with TLS enabled]", func() { ginkgo.It("Should deploy a devfile registry on to the cluster with HTTPS", func() { - crName := "devfileregistry-tls" + crName := "devfile-registry-tls" label := "devfileregistry_cr=" + crName // Deploy the devfileregistry resource for this test case and wait for the pod to be running @@ -123,7 +123,7 @@ var _ = ginkgo.Describe("[Create Devfile Registry resource with TLS enabled]", f var _ = ginkgo.Describe("[Create Devfile Registry resource with headless enabled]", func() { ginkgo.It("Should deploy a headless devfile registry on to the cluster", func() { - crName := "devfileregistry-headless" + crName := "devfile-registry-headless" label := "devfileregistry_cr=" + crName // Deploy the devfileregistry resource for this test case and wait for the pod to be running @@ -165,7 +165,7 @@ var _ = ginkgo.Describe("[Create Devfile Registry resource with headless enabled var _ = ginkgo.Describe("[Update Devfile Registry resource]", func() { ginkgo.It("Should deploy a devfile registry on to the cluster and properly update it", func() { - crName := "devfileregistry-update" + crName := "devfile-registry-update" label := "devfileregistry_cr=" + crName // Deploy the devfileregistry resource for this test case and wait for the pod to be running