diff --git a/pkg/loader/compose/v3.go b/pkg/loader/compose/v3.go index 3bd2108d..0b6fd4d2 100644 --- a/pkg/loader/compose/v3.go +++ b/pkg/loader/compose/v3.go @@ -262,27 +262,34 @@ func dockerComposeToKomposeMapping(composeObject *types.Config) (kobject.Kompose // memory: // TODO: Refactor yaml.MemStringorInt in kobject.go to int64 - // Since Deploy.Resources.Limits does not initialize, we must check type Resources before continuing - serviceConfig.MemLimit = libcomposeyaml.MemStringorInt(composeServiceConfig.Deploy.Resources.Limits.MemoryBytes) - serviceConfig.MemReservation = libcomposeyaml.MemStringorInt(composeServiceConfig.Deploy.Resources.Reservations.MemoryBytes) - // cpu: // convert to k8s format, for example: 0.5 = 500m // See: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ // "The expression 0.1 is equivalent to the expression 100m, which can be read as “one hundred millicpu”." - cpuLimit, err := strconv.ParseFloat(composeServiceConfig.Deploy.Resources.Limits.NanoCPUs, 64) - if err != nil { - return kobject.KomposeObject{}, errors.Wrap(err, "Unable to convert cpu limits resources value") - } - serviceConfig.CPULimit = int64(cpuLimit * 1000) + // Since Deploy.Resources.Limits does not initialize, we must check type Resources before continuing + if composeServiceConfig.Deploy.Resources.Limits != nil { + serviceConfig.MemLimit = libcomposeyaml.MemStringorInt(composeServiceConfig.Deploy.Resources.Limits.MemoryBytes) - cpuReservation, err := strconv.ParseFloat(composeServiceConfig.Deploy.Resources.Reservations.NanoCPUs, 64) - if err != nil { - return kobject.KomposeObject{}, errors.Wrap(err, "Unable to convert cpu limits reservation value") + if composeServiceConfig.Deploy.Resources.Limits.NanoCPUs != "" { + cpuLimit, err := strconv.ParseFloat(composeServiceConfig.Deploy.Resources.Limits.NanoCPUs, 64) + if err != nil { + return kobject.KomposeObject{}, errors.Wrap(err, "Unable to convert cpu limits resources value") + } + serviceConfig.CPULimit = int64(cpuLimit * 1000) + } } - serviceConfig.CPUReservation = int64(cpuReservation * 1000) + if composeServiceConfig.Deploy.Resources.Reservations != nil { + serviceConfig.MemReservation = libcomposeyaml.MemStringorInt(composeServiceConfig.Deploy.Resources.Reservations.MemoryBytes) + if composeServiceConfig.Deploy.Resources.Reservations.NanoCPUs != "" { + cpuReservation, err := strconv.ParseFloat(composeServiceConfig.Deploy.Resources.Reservations.NanoCPUs, 64) + if err != nil { + return kobject.KomposeObject{}, errors.Wrap(err, "Unable to convert cpu limits reservation value") + } + serviceConfig.CPUReservation = int64(cpuReservation * 1000) + } + } } // restart-policy: deploy.restart_policy.condition will rewrite restart option diff --git a/script/test/cmd/tests.sh b/script/test/cmd/tests.sh index 9c66a56c..892f3b7b 100755 --- a/script/test/cmd/tests.sh +++ b/script/test/cmd/tests.sh @@ -498,6 +498,10 @@ cmd="kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/v3/output-memcpu-k8s.json" > /tmp/output-k8s.json convert::expect_success "kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-memcpu.yaml" "/tmp/output-k8s.json" +cmd="kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-memcpu-partial.yaml" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/v3/output-memcpu-partial-k8s.json" > /tmp/output-k8s.json +convert::expect_success "$cmd" "/tmp/output-k8s.json" + # Test volumes are passed correctly cmd="kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-volumes.yaml" sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" $KOMPOSE_ROOT/script/test/fixtures/v3/output-volumes-k8s-template.json > /tmp/output-k8s.json diff --git a/script/test/fixtures/v3/docker-compose-memcpu-partial.yaml b/script/test/fixtures/v3/docker-compose-memcpu-partial.yaml new file mode 100644 index 00000000..7c9ac1bf --- /dev/null +++ b/script/test/fixtures/v3/docker-compose-memcpu-partial.yaml @@ -0,0 +1,11 @@ +version: "3" + +services: + foo: + deploy: + resources: + limits: + memory: 50M + reservations: + cpus: '0.001' + image: redis diff --git a/script/test/fixtures/v3/output-memcpu-partial-k8s.json b/script/test/fixtures/v3/output-memcpu-partial-k8s.json new file mode 100644 index 00000000..b333d2fb --- /dev/null +++ b/script/test/fixtures/v3/output-memcpu-partial-k8s.json @@ -0,0 +1,83 @@ +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "foo", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "foo" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "ports": [ + { + "name": "headless", + "port": 55555, + "targetPort": 0 + } + ], + "selector": { + "io.kompose.service": "foo" + }, + "clusterIP": "None" + }, + "status": { + "loadBalancer": {} + } + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "foo", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "foo" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "foo" + } + }, + "spec": { + "containers": [ + { + "name": "foo", + "image": "redis", + "resources": { + "limits": { + "memory": "52428800" + }, + "requests": { + "cpu": "1m" + } + } + } + ], + "restartPolicy": "Always" + } + }, + "strategy": {} + }, + "status": {} + } + ] +} \ No newline at end of file