diff --git a/pkg/devfile/generator/generators.go b/pkg/devfile/generator/generators.go index 913c4fdf..6a2c5a18 100644 --- a/pkg/devfile/generator/generators.go +++ b/pkg/devfile/generator/generators.go @@ -161,7 +161,7 @@ type DeploymentParams struct { } // GetDeployment gets a deployment object -func GetDeployment(deployParams DeploymentParams) *appsv1.Deployment { +func GetDeployment(devfileObj parser.DevfileObj, deployParams DeploymentParams) (*appsv1.Deployment, error) { podTemplateSpecParams := podTemplateSpecParams{ ObjectMeta: deployParams.ObjectMeta, @@ -175,13 +175,19 @@ func GetDeployment(deployParams DeploymentParams) *appsv1.Deployment { PodSelectorLabels: deployParams.PodSelectorLabels, } + containerAnnotations, err := getContainerAnnotations(devfileObj, common.DevfileOptions{}) + if err != nil { + return nil, err + } + deployParams.ObjectMeta.Annotations = mergeMaps(deployParams.ObjectMeta.Annotations, containerAnnotations.Deployment) + deployment := &appsv1.Deployment{ TypeMeta: deployParams.TypeMeta, ObjectMeta: deployParams.ObjectMeta, Spec: *getDeploymentSpec(deploySpecParams), } - return deployment + return deployment, nil } // PVCParams is a struct to create PVC @@ -218,7 +224,11 @@ func GetService(devfileObj parser.DevfileObj, serviceParams ServiceParams, optio if err != nil { return nil, err } - + containerAnnotations, err := getContainerAnnotations(devfileObj, options) + if err != nil { + return nil, err + } + serviceParams.ObjectMeta.Annotations = mergeMaps(serviceParams.ObjectMeta.Annotations, containerAnnotations.Service) service := &corev1.Service{ TypeMeta: serviceParams.TypeMeta, ObjectMeta: serviceParams.ObjectMeta, @@ -236,9 +246,9 @@ type IngressParams struct { } // GetIngress gets an ingress -func GetIngress(ingressParams IngressParams) *extensionsv1.Ingress { - +func GetIngress(endpoint v1.Endpoint, ingressParams IngressParams) *extensionsv1.Ingress { ingressSpec := getIngressSpec(ingressParams.IngressSpecParams) + ingressParams.ObjectMeta.Annotations = mergeMaps(ingressParams.ObjectMeta.Annotations, endpoint.Annotations) ingress := &extensionsv1.Ingress{ TypeMeta: ingressParams.TypeMeta, @@ -250,8 +260,9 @@ func GetIngress(ingressParams IngressParams) *extensionsv1.Ingress { } // GetNetworkingV1Ingress gets a networking v1 ingress -func GetNetworkingV1Ingress(ingressParams IngressParams) *networkingv1.Ingress { +func GetNetworkingV1Ingress(endpoint v1.Endpoint, ingressParams IngressParams) *networkingv1.Ingress { ingressSpec := getNetworkingV1IngressSpec(ingressParams.IngressSpecParams) + ingressParams.ObjectMeta.Annotations = mergeMaps(ingressParams.ObjectMeta.Annotations, endpoint.Annotations) ingress := &networkingv1.Ingress{ TypeMeta: ingressParams.TypeMeta, @@ -270,9 +281,10 @@ type RouteParams struct { } // GetRoute gets a route -func GetRoute(routeParams RouteParams) *routev1.Route { +func GetRoute(endpoint v1.Endpoint, routeParams RouteParams) *routev1.Route { routeSpec := getRouteSpec(routeParams.RouteSpecParams) + routeParams.ObjectMeta.Annotations = mergeMaps(routeParams.ObjectMeta.Annotations, endpoint.Annotations) route := &routev1.Route{ TypeMeta: routeParams.TypeMeta, diff --git a/pkg/devfile/generator/generators_test.go b/pkg/devfile/generator/generators_test.go index 1a199bb5..2bcbbab2 100644 --- a/pkg/devfile/generator/generators_test.go +++ b/pkg/devfile/generator/generators_test.go @@ -3,6 +3,9 @@ package generator import ( "fmt" "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" "reflect" "strings" "testing" @@ -860,3 +863,275 @@ func TestGetInitContainers(t *testing.T) { } } + +func TestGetService(t *testing.T) { + trueBool := true + + serviceParams := ServiceParams{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + "preserved-key": "preserved-value", + }, + }, + } + + tests := []struct { + name string + containerComponents []v1.Component + expected corev1.Service + }{ + { + // Currently dedicatedPod can only filter out annotations + // ToDo: dedicatedPod support: https://github.com/devfile/api/issues/670 + name: "has dedicated pod", + containerComponents: []v1.Component{ + testingutil.GenerateDummyContainerComponent("container1", nil, []v1.Endpoint{ + { + Name: "http-8080", + TargetPort: 8080, + }, + }, nil, v1.Annotation{ + Service: map[string]string{ + "key1": "value1", + }, + }, nil), + testingutil.GenerateDummyContainerComponent("container2", nil, nil, nil, v1.Annotation{ + Service: map[string]string{ + "key2": "value2", + }, + }, &trueBool), + }, + expected: corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + "preserved-key": "preserved-value", + "key1": "value1", + }, + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Name: "port-8080", + Port: 8080, + TargetPort: intstr.FromInt(8080), + }, + }, + }, + }, + }, + { + name: "no dedicated pod", + containerComponents: []v1.Component{ + testingutil.GenerateDummyContainerComponent("container1", nil, []v1.Endpoint{ + { + Name: "http-8080", + TargetPort: 8080, + }, + }, nil, v1.Annotation{ + Service: map[string]string{ + "key1": "value1", + }, + }, nil), + testingutil.GenerateDummyContainerComponent("container2", nil, nil, nil, v1.Annotation{ + Service: map[string]string{ + "key2": "value2", + }, + }, nil), + }, + expected: corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + "preserved-key": "preserved-value", + "key1": "value1", + "key2": "value2", + }, + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Name: "port-8080", + Port: 8080, + TargetPort: intstr.FromInt(8080), + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockDevfileData := data.NewMockDevfileData(ctrl) + + options := common.DevfileOptions{ + ComponentOptions: common.ComponentOptions{ + ComponentType: v1.ContainerComponentType, + }, + } + // set up the mock data + mockGetComponents := mockDevfileData.EXPECT().GetComponents(options) + mockGetComponents.Return(tt.containerComponents, nil).AnyTimes() + mockDevfileData.EXPECT().GetProjects(common.DevfileOptions{}).Return(nil, nil).AnyTimes() + mockDevfileData.EXPECT().GetEvents().Return(v1.Events{}).AnyTimes() + + devObj := parser.DevfileObj{ + Data: mockDevfileData, + } + svc, err := GetService(devObj, serviceParams, common.DevfileOptions{}) + // Checks for unexpected error cases + if err != nil { + t.Errorf("TestGetService(): unexpected error %v", err) + } + assert.Equal(t, tt.expected, *svc, "TestGetService(): The two values should be the same.") + + }) + } +} + +func TestGetDeployment(t *testing.T) { + trueBool := true + containers := []corev1.Container{ + { + Name: "container1", + }, + { + Name: "container2", + }, + } + deploymentParams := DeploymentParams{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + "preserved-key": "preserved-value", + }, + }, + Containers: containers, + } + + objectMeta := metav1.ObjectMeta{ + Annotations: map[string]string{ + "preserved-key": "preserved-value", + "key1": "value1", + "key2": "value2", + }, + } + + objectMetaDedicatedPod := metav1.ObjectMeta{ + Annotations: map[string]string{ + "preserved-key": "preserved-value", + "key1": "value1", + }, + } + + tests := []struct { + name string + containerComponents []v1.Component + expected appsv1.Deployment + }{ + { + // Currently dedicatedPod can only filter out annotations + // ToDo: dedicatedPod support: https://github.com/devfile/api/issues/670 + name: "has dedicated pod", + containerComponents: []v1.Component{ + testingutil.GenerateDummyContainerComponent("container1", nil, []v1.Endpoint{ + { + Name: "http-8080", + TargetPort: 8080, + }, + }, nil, v1.Annotation{ + Deployment: map[string]string{ + "key1": "value1", + }, + }, nil), + testingutil.GenerateDummyContainerComponent("container2", nil, nil, nil, v1.Annotation{ + Deployment: map[string]string{ + "key2": "value2", + }, + }, &trueBool), + }, + expected: appsv1.Deployment{ + ObjectMeta: objectMetaDedicatedPod, + Spec: appsv1.DeploymentSpec{ + Strategy: appsv1.DeploymentStrategy{ + Type: appsv1.RecreateDeploymentStrategyType, + }, + Selector: &metav1.LabelSelector{ + MatchLabels: nil, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: objectMetaDedicatedPod, + Spec: corev1.PodSpec{ + Containers: containers, + }, + }, + }, + }, + }, + { + name: "no dedicated pod", + containerComponents: []v1.Component{ + testingutil.GenerateDummyContainerComponent("container1", nil, []v1.Endpoint{ + { + Name: "http-8080", + TargetPort: 8080, + }, + }, nil, v1.Annotation{ + Deployment: map[string]string{ + "key1": "value1", + }, + }, nil), + testingutil.GenerateDummyContainerComponent("container2", nil, nil, nil, v1.Annotation{ + Deployment: map[string]string{ + "key2": "value2", + }, + }, nil), + }, + expected: appsv1.Deployment{ + ObjectMeta: objectMeta, + Spec: appsv1.DeploymentSpec{ + Strategy: appsv1.DeploymentStrategy{ + Type: appsv1.RecreateDeploymentStrategyType, + }, + Selector: &metav1.LabelSelector{ + MatchLabels: nil, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: objectMeta, + Spec: corev1.PodSpec{ + Containers: containers, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockDevfileData := data.NewMockDevfileData(ctrl) + + options := common.DevfileOptions{ + ComponentOptions: common.ComponentOptions{ + ComponentType: v1.ContainerComponentType, + }, + } + // set up the mock data + mockGetComponents := mockDevfileData.EXPECT().GetComponents(options) + mockGetComponents.Return(tt.containerComponents, nil).AnyTimes() + + devObj := parser.DevfileObj{ + Data: mockDevfileData, + } + deploy, err := GetDeployment(devObj, deploymentParams) + // Checks for unexpected error cases + if err != nil { + t.Errorf("TestGetDeployment(): unexpected error %v", err) + } + assert.Equal(t, tt.expected, *deploy, "TestGetDeployment(): The two values should be the same.") + + }) + } +} diff --git a/pkg/devfile/generator/utils.go b/pkg/devfile/generator/utils.go index 452cb052..f6816462 100644 --- a/pkg/devfile/generator/utils.go +++ b/pkg/devfile/generator/utils.go @@ -602,3 +602,39 @@ func getAllContainers(devfileObj parser.DevfileObj, options common.DevfileOption } return containers, nil } + +// getContainerAnnotations iterates through container components and returns all annotations +func getContainerAnnotations(devfileObj parser.DevfileObj, options common.DevfileOptions) (v1.Annotation, error) { + options.ComponentOptions = common.ComponentOptions{ + ComponentType: v1.ContainerComponentType, + } + containerComponents, err := devfileObj.Data.GetComponents(options) + if err != nil { + return v1.Annotation{}, err + } + var annotations v1.Annotation + annotations.Service = make(map[string]string) + annotations.Deployment = make(map[string]string) + for _, comp := range containerComponents { + // ToDo: dedicatedPod support: https://github.com/devfile/api/issues/670 + if comp.Container.DedicatedPod != nil && *comp.Container.DedicatedPod { + continue + } + if comp.Container.Annotation != nil { + mergeMaps(annotations.Service, comp.Container.Annotation.Service) + mergeMaps(annotations.Deployment, comp.Container.Annotation.Deployment) + } + } + + return annotations, nil +} + +func mergeMaps(dest map[string]string, src map[string]string) map[string]string { + if dest == nil { + dest = make(map[string]string) + } + for k, v := range src { + dest[k] = v + } + return dest +} diff --git a/pkg/devfile/generator/utils_test.go b/pkg/devfile/generator/utils_test.go index b547c5f5..f095d2ce 100644 --- a/pkg/devfile/generator/utils_test.go +++ b/pkg/devfile/generator/utils_test.go @@ -1536,3 +1536,158 @@ func TestAddVolumeMountToContainers(t *testing.T) { }) } } + +func TestGetContainerAnnotations(t *testing.T) { + trueBool := true + + tests := []struct { + name string + containerComponents []v1.Component + expected v1.Annotation + }{ + { + name: "no dedicated pod", + containerComponents: []v1.Component{ + testingutil.GenerateDummyContainerComponent("container1", nil, nil, nil, v1.Annotation{ + Service: map[string]string{ + "key1": "value1", + }, + Deployment: map[string]string{ + "key1": "value1", + }, + }, nil), + testingutil.GenerateDummyContainerComponent("container2", nil, nil, nil, v1.Annotation{ + Service: map[string]string{ + "key2": "value2", + }, + Deployment: map[string]string{ + "key2": "value2", + }, + }, nil), + }, + expected: v1.Annotation{ + Service: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + Deployment: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + }, + }, + { + name: "has dedicated pod", + containerComponents: []v1.Component{ + testingutil.GenerateDummyContainerComponent("container1", nil, nil, nil, v1.Annotation{ + Service: map[string]string{ + "key1": "value1", + }, + Deployment: map[string]string{ + "key1": "value1", + }, + }, nil), + testingutil.GenerateDummyContainerComponent("container2", nil, nil, nil, v1.Annotation{ + Service: map[string]string{ + "key2": "value2", + }, + Deployment: map[string]string{ + "key2": "value2", + }, + }, &trueBool), + }, + expected: v1.Annotation{ + Service: map[string]string{ + "key1": "value1", + }, + Deployment: map[string]string{ + "key1": "value1", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockDevfileData := data.NewMockDevfileData(ctrl) + + options := common.DevfileOptions{ + ComponentOptions: common.ComponentOptions{ + ComponentType: v1.ContainerComponentType, + }, + } + // set up the mock data + mockGetComponents := mockDevfileData.EXPECT().GetComponents(options) + mockGetComponents.Return(tt.containerComponents, nil).AnyTimes() + + devObj := parser.DevfileObj{ + Data: mockDevfileData, + } + annotations, err := getContainerAnnotations(devObj, common.DevfileOptions{}) + // Checks for unexpected error cases + if err != nil { + t.Errorf("TestGetContainerAnnotations(): unexpected error %v", err) + } + assert.Equal(t, tt.expected, annotations, "TestGetContainerAnnotations(): The two values should be the same.") + + }) + } +} + +func TestMergeMaps(t *testing.T) { + + tests := []struct { + name string + dest map[string]string + src map[string]string + expected map[string]string + }{ + { + name: "dest is nil", + dest: nil, + src: map[string]string{ + "key3": "value3", + }, + expected: map[string]string{ + "key3": "value3", + }, + }, + { + name: "src is nil", + dest: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + src: nil, + expected: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + }, + { + name: "no nil maps", + dest: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + src: map[string]string{ + "key3": "value3", + }, + expected: map[string]string{ + "key1": "value1", + "key2": "value2", + "key3": "value3", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := mergeMaps(tt.dest, tt.src) + assert.Equal(t, tt.expected, result, "TestmergeMaps(): The two values should be the same.") + + }) + } +} diff --git a/pkg/devfile/parser/parse_test.go b/pkg/devfile/parser/parse_test.go index 7cbcc79b..fccc9d8c 100644 --- a/pkg/devfile/parser/parse_test.go +++ b/pkg/devfile/parser/parse_test.go @@ -25,10 +25,7 @@ import ( "testing" ) -const ( - schemaV210 = string(data.APISchemaVersion210) - schemaV220 = string(data.APISchemaVersion220) -) +const schemaVersion = string(data.APISchemaVersion220) var isTrue bool = true var isFalse bool = false @@ -58,7 +55,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV220, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -104,6 +101,16 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value2", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value2", + }, + }, Image: "quay.io/nodejs-10", DedicatedPod: &isTrue, }, @@ -112,6 +119,10 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Name: "log", TargetPort: 443, Secure: &isFalse, + Annotations: map[string]string{ + "ingress-key1": "ingress-value1", + "ingress-key2": "ingress-value2", + }, }, }, }, @@ -248,6 +259,16 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnionParentOverride: v1.ComponentUnionParentOverride{ Container: &v1.ContainerComponentParentOverride{ ContainerParentOverride: v1.ContainerParentOverride{ + Annotation: &v1.AnnotationParentOverride{ + Deployment: map[string]string{ + "deploy-key2": "deploy-value3", + "deploy-key3": "deploy-value3", + }, + Service: map[string]string{ + "svc-key2": "svc-value3", + "svc-key3": "svc-value3", + }, + }, Image: "quay.io/nodejs-12", DedicatedPod: &isFalse, MountSources: &isTrue, //overrides an unset value to true @@ -257,6 +278,10 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Name: "log", TargetPort: 443, Secure: &isTrue, + Annotations: map[string]string{ + "ingress-key2": "ingress-value3", + "ingress-key3": "ingress-value3", + }, }, }, }, @@ -399,6 +424,18 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value3", + "deploy-key3": "deploy-value3", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value3", + "svc-key3": "svc-value3", + }, + }, Image: "quay.io/nodejs-12", DedicatedPod: &isFalse, MountSources: &isTrue, @@ -408,6 +445,11 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Name: "log", TargetPort: 443, Secure: &isTrue, + Annotations: map[string]string{ + "ingress-key1": "ingress-value1", + "ingress-key2": "ingress-value3", + "ingress-key3": "ingress-value3", + }, }, }, }, @@ -618,6 +660,16 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value2", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value2", + }, + }, Image: "quay.io/nodejs-10", DedicatedPod: &isTrue, }, @@ -626,6 +678,10 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Name: "log", TargetPort: 443, Secure: &isFalse, + Annotations: map[string]string{ + "ingress-key1": "ingress-value1", + "ingress-key2": "ingress-value2", + }, }, }, }, @@ -777,7 +833,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -823,7 +879,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -878,7 +934,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -928,7 +984,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -995,7 +1051,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1076,7 +1132,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV220, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1097,6 +1153,16 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value2", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value2", + }, + }, Image: "quay.io/nodejs-10", }, }, @@ -1160,6 +1226,16 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value2", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value2", + }, + }, Image: "quay.io/nodejs-10", }, }, @@ -1262,7 +1338,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV220, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1283,8 +1359,28 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value2", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value2", + }, + }, Image: "quay.io/nodejs-10", }, + Endpoints: []v1.Endpoint{ + { + Annotations: map[string]string{ + "ingress-key1": "ingress-value1", + "ingress-key2": "ingress-value2", + }, + Name: "url", + TargetPort: 8080, + }, + }, }, }, }, @@ -1324,8 +1420,28 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnionPluginOverride: v1.ComponentUnionPluginOverride{ Container: &v1.ContainerComponentPluginOverride{ ContainerPluginOverride: v1.ContainerPluginOverride{ + Annotation: &v1.AnnotationPluginOverride{ + Deployment: map[string]string{ + "deploy-key2": "deploy-value3", + "deploy-key3": "deploy-value3", + }, + Service: map[string]string{ + "svc-key2": "svc-value3", + "svc-key3": "svc-value3", + }, + }, Image: "quay.io/nodejs-12", }, + Endpoints: []v1.EndpointPluginOverride{ + { + Annotations: map[string]string{ + "ingress-key2": "ingress-value3", + "ingress-key3": "ingress-value3", + }, + Name: "url", + TargetPort: 9090, + }, + }, }, }, }, @@ -1375,8 +1491,31 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { ComponentUnion: v1.ComponentUnion{ Container: &v1.ContainerComponent{ Container: v1.Container{ + Annotation: &v1.Annotation{ + Deployment: map[string]string{ + "deploy-key1": "deploy-value1", + "deploy-key2": "deploy-value3", + "deploy-key3": "deploy-value3", + }, + Service: map[string]string{ + "svc-key1": "svc-value1", + "svc-key2": "svc-value3", + "svc-key3": "svc-value3", + }, + }, Image: "quay.io/nodejs-12", }, + Endpoints: []v1.Endpoint{ + { + Annotations: map[string]string{ + "ingress-key1": "ingress-value1", + "ingress-key2": "ingress-value3", + "ingress-key3": "ingress-value3", + }, + Name: "url", + TargetPort: 9090, + }, + }, }, }, }, @@ -1442,7 +1581,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1500,7 +1639,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1555,7 +1694,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1615,7 +1754,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1678,7 +1817,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1706,7 +1845,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1764,7 +1903,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1787,7 +1926,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1842,7 +1981,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1867,7 +2006,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -1965,7 +2104,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -2009,7 +2148,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -2183,7 +2322,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -2237,7 +2376,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -2313,7 +2452,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -2372,7 +2511,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -2431,7 +2570,7 @@ func Test_parseParentAndPluginFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ Parent: &v1.Parent{ @@ -2605,7 +2744,7 @@ func Test_parseParentAndPlugin_RecursivelyReference(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ Parent: &v1.Parent{ @@ -2642,7 +2781,7 @@ func Test_parseParentAndPlugin_RecursivelyReference(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ Parent: &v1.Parent{ @@ -2796,7 +2935,7 @@ func Test_parseParentFromRegistry(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV220, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -3500,7 +3639,7 @@ func Test_parseFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -3554,7 +3693,7 @@ func Test_parseFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ Parent: &v1.Parent{ @@ -3587,7 +3726,7 @@ func Test_parseFromURI(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -3744,7 +3883,7 @@ func Test_parseFromRegistry(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ @@ -3770,7 +3909,7 @@ func Test_parseFromRegistry(t *testing.T) { Data: &v2.DevfileV2{ Devfile: v1.Devfile{ DevfileHeader: devfilepkg.DevfileHeader{ - SchemaVersion: schemaV210, + SchemaVersion: schemaVersion, }, DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{ DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{ diff --git a/pkg/testingutil/devfile.go b/pkg/testingutil/devfile.go index 02fb1282..afea57a4 100644 --- a/pkg/testingutil/devfile.go +++ b/pkg/testingutil/devfile.go @@ -6,32 +6,17 @@ import ( ) // GetFakeContainerComponent returns a fake container component for testing. +// Deprecated: use GenerateDummyContainerComponent instead func GetFakeContainerComponent(name string) v1.Component { - image := "docker.io/maven:latest" - memoryLimit := "128Mi" volumeName := "myvolume1" volumePath := "/my/volume/mount/path1" - mountSources := true - - return v1.Component{ - Name: name, - ComponentUnion: v1.ComponentUnion{ - Container: &v1.ContainerComponent{ - Container: v1.Container{ - Image: image, - Env: []v1.EnvVar{}, - MemoryLimit: memoryLimit, - VolumeMounts: []v1.VolumeMount{ - { - Name: volumeName, - Path: volumePath, - }, - }, - MountSources: &mountSources, - }, - }, + VolumeMounts := []v1.VolumeMount{ + { + Name: volumeName, + Path: volumePath, }, } + return GenerateDummyContainerComponent(name, VolumeMounts, nil, []v1.EnvVar{}, v1.Annotation{}, nil) } // GetFakeVolumeComponent returns a fake volume component for testing @@ -101,6 +86,27 @@ func GetFakeVolumeMountParentOverride(name, path string) v1.VolumeMountParentOve } } +// GenerateDummyContainerComponent returns a dummy container component for testing +func GenerateDummyContainerComponent(name string, volMounts []v1.VolumeMount, endpoints []v1.Endpoint, envs []v1.EnvVar, annotation v1.Annotation, dedicatedPod *bool) v1.Component { + image := "docker.io/maven:latest" + mountSources := true + + return v1.Component{ + Name: name, + ComponentUnion: v1.ComponentUnion{ + Container: &v1.ContainerComponent{ + Container: v1.Container{ + Image: image, + Annotation: &annotation, + Env: envs, + VolumeMounts: volMounts, + MountSources: &mountSources, + DedicatedPod: dedicatedPod, + }, + Endpoints: endpoints, + }}} +} + //DockerImageValues struct can be used to set override or main component struct values type DockerImageValues struct { //maps to Image.ImageName diff --git a/tests/v2/utils/library/test_utils.go b/tests/v2/utils/library/test_utils.go index 88c35c6a..3a71b4d5 100644 --- a/tests/v2/utils/library/test_utils.go +++ b/tests/v2/utils/library/test_utils.go @@ -25,6 +25,8 @@ const ( numDevfiles = 5 // numThreads : Number of threads used by multi-thread tests numThreads = 5 + // schemaVersion: Latest schemaVersion + schemaVersion = "2.2.0" ) // DevfileValidator struct for DevfileValidator interface. @@ -280,11 +282,11 @@ func RunTest(testContent commonUtils.TestContent, t *testing.T) { validator := DevfileValidator{} follower := DevfileFollower{} - libraryData, err := devfileData.NewDevfileData("2.0.0") + libraryData, err := devfileData.NewDevfileData(schemaVersion) if err != nil { t.Fatalf(commonUtils.LogMessage(fmt.Sprintf("Error creating parser data : %v", err))) } - libraryData.SetSchemaVersion("2.0.0") + libraryData.SetSchemaVersion(schemaVersion) follower.LibraryData = libraryData commonUtils.LogMessage(fmt.Sprintf("Parser data created with schema version : %s", follower.LibraryData.GetSchemaVersion()))