diff --git a/docs/user-guide.md b/docs/user-guide.md index e59cb627..c2531829 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -182,6 +182,7 @@ The currently supported options are: | kompose.service.expose | true / hostnames (separated by comma) | | kompose.service.nodeport.port | port value (string) | | kompose.service.expose.tls-secret | secret name | +| kompose.service.expose.ingress-class-name | ingress class name | | kompose.volume.size | kubernetes supported volume size | | kompose.volume.storage-class-name | kubernetes supported volume storageClassName | | kompose.volume.type | use k8s volume type, eg "configMap", "persistentVolumeClaim", "emptyDir", "hostPath" | @@ -250,6 +251,7 @@ services: - For the OpenShift provider, a route is created. - `kompose.service.nodeport.port` defines the port value when service type is `nodeport`, this label should only be set when the service only contains 1 port. Usually kubernetes define a port range for node port values, kompose will not validate this. - `kompose.service.expose.tls-secret` provides the name of the TLS secret to use with the Kubernetes ingress controller. This requires kompose.service.expose to be set. +- `kompose.service.expose.ingress-class-name` provides the name of ingress class to use with the Kubernetes ingress controller. This requires kompose.service. For example: @@ -265,6 +267,7 @@ services: labels: kompose.service.expose: "counter.example.com,foobar.example.com" kompose.service.expose.tls-secret: "example-secret" + kompose.service.expose.ingress-class-name: "nginx" redis: image: redis:3.0 ports: diff --git a/pkg/kobject/kobject.go b/pkg/kobject/kobject.go index 3cd6aea0..f2cf67c2 100644 --- a/pkg/kobject/kobject.go +++ b/pkg/kobject/kobject.go @@ -94,50 +94,51 @@ type ServiceConfigGroup []ServiceConfig // ServiceConfig holds the basic struct of a container // which should not introduce any kubernetes specific struct type ServiceConfig struct { - Name string - ContainerName string - Image string `compose:"image"` - Environment []EnvVar `compose:"environment"` - EnvFile []string `compose:"env_file"` - Port []Ports `compose:"ports"` - Command []string `compose:"command"` - WorkingDir string `compose:""` - DomainName string `compose:"domainname"` - HostName string `compose:"hostname"` - Args []string `compose:"args"` - VolList []string `compose:"volumes"` - Network []string `compose:"network"` - Labels map[string]string `compose:"labels"` - Annotations map[string]string `compose:""` - CPUSet string `compose:"cpuset"` - CPUShares int64 `compose:"cpu_shares"` - CPUQuota int64 `compose:"cpu_quota"` - CPULimit int64 `compose:""` - CPUReservation int64 `compose:""` - CapAdd []string `compose:"cap_add"` - CapDrop []string `compose:"cap_drop"` - Expose []string `compose:"expose"` - ImagePullPolicy string `compose:"kompose.image-pull-policy"` - Pid string `compose:"pid"` - Privileged bool `compose:"privileged"` - Restart string `compose:"restart"` - User string `compose:"user"` - VolumesFrom []string `compose:"volumes_from"` - ServiceType string `compose:"kompose.service.type"` - NodePortPort int32 `compose:"kompose.service.nodeport.port"` - StopGracePeriod string `compose:"stop_grace_period"` - Build string `compose:"build"` - BuildArgs map[string]*string `compose:"build-args"` - ExposeService string `compose:"kompose.service.expose"` - ExposeServicePath string `compose:"kompose.service.expose.path"` - BuildLabels map[string]string `compose:"build-labels"` - ExposeServiceTLS string `compose:"kompose.service.expose.tls-secret"` - ImagePullSecret string `compose:"kompose.image-pull-secret"` - Stdin bool `compose:"stdin_open"` - Tty bool `compose:"tty"` - MemLimit yaml.MemStringorInt `compose:"mem_limit"` - MemReservation yaml.MemStringorInt `compose:""` - DeployMode string `compose:""` + Name string + ContainerName string + Image string `compose:"image"` + Environment []EnvVar `compose:"environment"` + EnvFile []string `compose:"env_file"` + Port []Ports `compose:"ports"` + Command []string `compose:"command"` + WorkingDir string `compose:""` + DomainName string `compose:"domainname"` + HostName string `compose:"hostname"` + Args []string `compose:"args"` + VolList []string `compose:"volumes"` + Network []string `compose:"network"` + Labels map[string]string `compose:"labels"` + Annotations map[string]string `compose:""` + CPUSet string `compose:"cpuset"` + CPUShares int64 `compose:"cpu_shares"` + CPUQuota int64 `compose:"cpu_quota"` + CPULimit int64 `compose:""` + CPUReservation int64 `compose:""` + CapAdd []string `compose:"cap_add"` + CapDrop []string `compose:"cap_drop"` + Expose []string `compose:"expose"` + ImagePullPolicy string `compose:"kompose.image-pull-policy"` + Pid string `compose:"pid"` + Privileged bool `compose:"privileged"` + Restart string `compose:"restart"` + User string `compose:"user"` + VolumesFrom []string `compose:"volumes_from"` + ServiceType string `compose:"kompose.service.type"` + NodePortPort int32 `compose:"kompose.service.nodeport.port"` + StopGracePeriod string `compose:"stop_grace_period"` + Build string `compose:"build"` + BuildArgs map[string]*string `compose:"build-args"` + ExposeService string `compose:"kompose.service.expose"` + ExposeServicePath string `compose:"kompose.service.expose.path"` + BuildLabels map[string]string `compose:"build-labels"` + ExposeServiceTLS string `compose:"kompose.service.expose.tls-secret"` + ExposeServiceIngressClassName *string `compose:"kompose.service.expose.ingress-class-name"` + ImagePullSecret string `compose:"kompose.image-pull-secret"` + Stdin bool `compose:"stdin_open"` + Tty bool `compose:"tty"` + MemLimit yaml.MemStringorInt `compose:"mem_limit"` + MemReservation yaml.MemStringorInt `compose:""` + DeployMode string `compose:""` // DeployLabels mapping to kubernetes labels DeployLabels map[string]string `compose:""` DeployUpdateConfig dockerCliTypes.UpdateConfig `compose:""` diff --git a/pkg/loader/compose/utils.go b/pkg/loader/compose/utils.go index e2dea0e5..6c3eb165 100644 --- a/pkg/loader/compose/utils.go +++ b/pkg/loader/compose/utils.go @@ -40,6 +40,8 @@ const ( LabelServiceExpose = "kompose.service.expose" // LabelServiceExposeTLSSecret provides the name of the TLS secret to use with the Kubernetes ingress controller LabelServiceExposeTLSSecret = "kompose.service.expose.tls-secret" + // LabelServiceExposeIngressClassName provides the name of ingress class to use with the Kubernetes ingress controller + LabelServiceExposeIngressClassName = "kompose.service.expose.ingress-class-name" // LabelServiceAccountName defines the service account name to provide the credential info of the pod. LabelServiceAccountName = "kompose.serviceaccount-name" // LabelControllerType defines the type of controller to be created diff --git a/pkg/loader/compose/v3.go b/pkg/loader/compose/v3.go index cf4af85f..0b935b4e 100644 --- a/pkg/loader/compose/v3.go +++ b/pkg/loader/compose/v3.go @@ -658,6 +658,8 @@ func parseKomposeLabels(labels map[string]string, serviceConfig *kobject.Service serviceConfig.NodePortPort = cast.ToInt32(value) case LabelServiceExposeTLSSecret: serviceConfig.ExposeServiceTLS = value + case LabelServiceExposeIngressClassName: + serviceConfig.ExposeServiceIngressClassName = &value case LabelImagePullSecret: serviceConfig.ImagePullSecret = value case LabelImagePullPolicy: @@ -671,6 +673,10 @@ func parseKomposeLabels(labels map[string]string, serviceConfig *kobject.Service return errors.New("kompose.service.expose.tls-secret was specified without kompose.service.expose") } + if serviceConfig.ExposeService == "" && serviceConfig.ExposeServiceIngressClassName != nil { + return errors.New("kompose.service.expose.ingress-class-name was specified without kompose.service.expose") + } + if serviceConfig.ServiceType != string(api.ServiceTypeNodePort) && serviceConfig.NodePortPort != 0 { return errors.New("kompose.service.type must be nodeport when assign node port value") } diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index b2fd42f7..6d2dd1ac 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -525,6 +525,10 @@ func (k *Kubernetes) initIngress(name string, service kobject.ServiceConfig, por } } + if service.ExposeServiceIngressClassName != nil { + ingress.Spec.IngressClassName = service.ExposeServiceIngressClassName + } + return ingress } diff --git a/script/test/fixtures/expose/compose.yaml b/script/test/fixtures/expose/compose.yaml index 315a39f0..d38009ca 100644 --- a/script/test/fixtures/expose/compose.yaml +++ b/script/test/fixtures/expose/compose.yaml @@ -7,6 +7,7 @@ web: labels: kompose.service.expose: "batman.example.com/dev,batwoman.example.com" kompose.service.expose.tls-secret: "test-secret" + kompose.service.expose.ingress-class-name: "nginx" redis: image: redis:3.0 ports: diff --git a/script/test/fixtures/expose/output-k8s.json b/script/test/fixtures/expose/output-k8s.json index 81f19751..8f30cf6d 100644 --- a/script/test/fixtures/expose/output-k8s.json +++ b/script/test/fixtures/expose/output-k8s.json @@ -40,6 +40,7 @@ }, "annotations": { "kompose.service.expose": "batman.example.com/dev,batwoman.example.com", + "kompose.service.expose.ingress-class-name": "nginx", "kompose.service.expose.tls-secret": "test-secret" } }, @@ -114,6 +115,7 @@ }, "annotations": { "kompose.service.expose": "batman.example.com/dev,batwoman.example.com", + "kompose.service.expose.ingress-class-name": "nginx", "kompose.service.expose.tls-secret": "test-secret" } }, @@ -132,6 +134,7 @@ }, "annotations": { "kompose.service.expose": "batman.example.com/dev,batwoman.example.com", + "kompose.service.expose.ingress-class-name": "nginx", "kompose.service.expose.tls-secret": "test-secret" } }, @@ -166,10 +169,12 @@ }, "annotations": { "kompose.service.expose": "batman.example.com/dev,batwoman.example.com", + "kompose.service.expose.ingress-class-name": "nginx", "kompose.service.expose.tls-secret": "test-secret" } }, "spec": { + "ingressClassName": "nginx", "tls": [ { "hosts": [ diff --git a/script/test/fixtures/expose/output-ocp.json b/script/test/fixtures/expose/output-ocp.json index 2a575204..f474457e 100644 --- a/script/test/fixtures/expose/output-ocp.json +++ b/script/test/fixtures/expose/output-ocp.json @@ -40,6 +40,7 @@ }, "annotations": { "kompose.service.expose": "batman.example.com/dev,batwoman.example.com", + "kompose.service.expose.ingress-class-name": "nginx", "kompose.service.expose.tls-secret": "test-secret" } }, @@ -174,6 +175,7 @@ }, "annotations": { "kompose.service.expose": "batman.example.com/dev,batwoman.example.com", + "kompose.service.expose.ingress-class-name": "nginx", "kompose.service.expose.tls-secret": "test-secret" } },