diff --git a/docs/user-guide.md b/docs/user-guide.md index 943f23dbf..6ae14e9e4 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -401,3 +401,7 @@ If the Docker Compose file has a volume specified for a service, the Deployment If the Docker Compose file has service name with `_` in it (eg.`web_service`), then it will be replaced by `-` and the service name will be renamed accordingly (eg.`web-service`). Kompose does this because "Kubernetes" doesn't allow `_` in object name. Please note that changing service name might break some `docker-compose` files. + +#### Warning about Labels + +`kompose.service.type` label should be defined with `ports` only, otherwise `kompose` will fail. diff --git a/pkg/loader/compose/compose.go b/pkg/loader/compose/compose.go index aaeb444bc..00a7a4a0b 100644 --- a/pkg/loader/compose/compose.go +++ b/pkg/loader/compose/compose.go @@ -367,6 +367,10 @@ func (c *Compose) LoadFile(files []string) (kobject.KomposeObject, error) { } } + err = checkLabelsPorts(len(serviceConfig.Port), composeServiceConfig.Labels["kompose.service.type"], name) + if err != nil { + return kobject.KomposeObject{}, errors.Wrap(err, "kompose.service.type can't be set if service doesn't expose any ports.") + } // convert compose labels to annotations serviceConfig.Annotations = map[string]string(composeServiceConfig.Labels) serviceConfig.CPUQuota = int64(composeServiceConfig.CPUQuota) @@ -408,3 +412,10 @@ func handleServiceType(ServiceType string) (string, error) { func normalizeServiceNames(svcName string) string { return strings.Replace(svcName, "_", "-", -1) } + +func checkLabelsPorts(noOfPort int, labels string, svcName string) error { + if noOfPort == 0 && labels == "NodePort" || labels == "LoadBalancer" { + return errors.Errorf("%s defined in service %s with no ports present. Issues may occur when bringing up artifacts.", labels, svcName) + } + return nil +} diff --git a/pkg/loader/compose/compose_test.go b/pkg/loader/compose/compose_test.go index 6960f4af7..7a61fb58d 100644 --- a/pkg/loader/compose/compose_test.go +++ b/pkg/loader/compose/compose_test.go @@ -286,3 +286,27 @@ func TestNormalizeServiceNames(t *testing.T) { } } } + +func TestCheckLabelsPorts(t *testing.T) { + testCases := []struct { + name string + noOfPort int + labels string + svcName string + expectError bool + }{ + {"ports is defined", 1, "NodePort", "foo", false}, + {"ports is not defined", 0, "NodePort", "foo", true}, + } + + var err error + for _, testcase := range testCases { + t.Log(testcase.name) + err = checkLabelsPorts(testcase.noOfPort, testcase.labels, testcase.svcName) + if testcase.expectError && err == nil { + t.Log("Expected error, got ", err) + + } + + } +} diff --git a/script/test/cmd/tests.sh b/script/test/cmd/tests.sh index 04256cf99..90f71f064 100755 --- a/script/test/cmd/tests.sh +++ b/script/test/cmd/tests.sh @@ -200,6 +200,10 @@ convert::expect_success_and_warning "kompose --provider openshift -f $KOMPOSE_RO # Test regarding validating dockerfilepath convert::expect_failure "kompose -f $KOMPOSE_ROOT/script/test/fixtures/dockerfilepath/docker-compose.yml convert --stdout" +# Test regarding while label (nodeport or loadbalancer ) is provided but not ports +convert::expect_failure "kompose -f $KOMPOSE_ROOT/script/test/fixtures/label-port/docker-compose.yml convert --stdout" + + ###### # Test the output file behavior of kompose convert # Default behavior without -o diff --git a/script/test/fixtures/label-port/docker-compose.yml b/script/test/fixtures/label-port/docker-compose.yml new file mode 100644 index 000000000..ce80f9587 --- /dev/null +++ b/script/test/fixtures/label-port/docker-compose.yml @@ -0,0 +1,6 @@ +version: "2" +services: + webapiapplication: + image: webapiapplication + labels: + kompose.service.type: NodePort