diff --git a/pkg/loader/compose/compose.go b/pkg/loader/compose/compose.go index 5a3abb9b..c11a7cc1 100644 --- a/pkg/loader/compose/compose.go +++ b/pkg/loader/compose/compose.go @@ -59,10 +59,15 @@ func loadEnvVars(envars []string) []kobject.EnvVar { if character == "" { envs = append(envs, kobject.EnvVar{ - Name: e, + Name: e, + Value: os.Getenv(e), }) } else { values := strings.SplitN(e, character, 2) + // try to get value from os env + if values[1] == "" { + values[1] = os.Getenv(values[0]) + } envs = append(envs, kobject.EnvVar{ Name: values[0], Value: values[1], diff --git a/pkg/loader/compose/compose_test.go b/pkg/loader/compose/compose_test.go index d9d08129..91e7131d 100644 --- a/pkg/loader/compose/compose_test.go +++ b/pkg/loader/compose/compose_test.go @@ -16,7 +16,12 @@ limitations under the License. package compose -import "testing" +import ( + "os" + "testing" + + "github.com/kubernetes-incubator/kompose/pkg/kobject" +) // Test if service types are parsed properly on user input // give a service type and expect correct input @@ -41,3 +46,69 @@ func TestHandleServiceType(t *testing.T) { } } } + +func TestLoadEnvVar(t *testing.T) { + ev1 := []string{"foo=bar"} + rs1 := kobject.EnvVar{ + Name: "foo", + Value: "bar", + } + ev2 := []string{"foo:bar"} + rs2 := kobject.EnvVar{ + Name: "foo", + Value: "bar", + } + ev3 := []string{"foo"} + rs3 := kobject.EnvVar{ + Name: "foo", + Value: "", + } + ev4 := []string{"osfoo"} + rs4 := kobject.EnvVar{ + Name: "osfoo", + Value: "osbar", + } + ev5 := []string{"foo:bar=foobar"} + rs5 := kobject.EnvVar{ + Name: "foo", + Value: "bar=foobar", + } + ev6 := []string{"foo=foo:bar"} + rs6 := kobject.EnvVar{ + Name: "foo", + Value: "foo:bar", + } + ev7 := []string{"foo:"} + rs7 := kobject.EnvVar{ + Name: "foo", + Value: "", + } + ev8 := []string{"foo="} + rs8 := kobject.EnvVar{ + Name: "foo", + Value: "", + } + + tests := []struct { + envvars []string + results kobject.EnvVar + }{ + {ev1, rs1}, + {ev2, rs2}, + {ev3, rs3}, + {ev4, rs4}, + {ev5, rs5}, + {ev6, rs6}, + {ev7, rs7}, + {ev8, rs8}, + } + + os.Setenv("osfoo", "osbar") + + for _, tt := range tests { + result := loadEnvVars(tt.envvars) + if result[0] != tt.results { + t.Errorf("Expected %q, got %q", tt.results, result[0]) + } + } +} diff --git a/script/test/cmd/tests.sh b/script/test/cmd/tests.sh index 9ff0230d..06190858 100755 --- a/script/test/cmd/tests.sh +++ b/script/test/cmd/tests.sh @@ -103,7 +103,6 @@ convert::expect_success "kompose --bundle $KOMPOSE_ROOT/script/test/fixtures/bun # Test related to kompose --bundle convert to ensure that DSB bundles are converted properly convert::expect_success_and_warning "kompose --bundle $KOMPOSE_ROOT/script/test/fixtures/bundles/dsb/docker-voting-bundle.dsb convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/bundles/dsb/output-k8s.json" "Service cannot be created because of missing port." - ###### # Test related to restart options in docker-compose # kubernetes test @@ -113,4 +112,10 @@ convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-o convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compose-restart-no.yml --provider openshift convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-os-restart-no.json" convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compose-restart-onfail.yml --provider openshift convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-os-restart-onfail.json" +###### +# Test key-only envrionment variable +export $(cat $KOMPOSE_ROOT/script/test/fixtures/keyonly-envs/envs) +convert::expect_success "kompose --file $KOMPOSE_ROOT/script/test/fixtures/keyonly-envs/env.yml convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/keyonly-envs/output-k8s.json" +unset $(cat $KOMPOSE_ROOT/script/test/fixtures/keyonly-envs/envs | cut -d'=' -f1) + exit $EXIT_STATUS diff --git a/script/test/fixtures/keyonly-envs/env.yml b/script/test/fixtures/keyonly-envs/env.yml new file mode 100644 index 00000000..d13923f7 --- /dev/null +++ b/script/test/fixtures/keyonly-envs/env.yml @@ -0,0 +1,25 @@ +version: "2" + +services: + redis-master: + image: gcr.io/google_containers/redis:e2e + ports: + - "6379" + redis-slave: + image: gcr.io/google_samples/gb-redisslave:v1 + ports: + - "6379" + environment: + - GET_HOSTS_FROM=dns + - RACK_ENV=development + - SHOW=true + - SESSION_SECRET + frontend: + image: gcr.io/google-samples/gb-frontend:v4 + ports: + - "80:80" + environment: + GET_HOSTS_FROM: dns + RACK_ENV: development + SHOW: 'true' + SESSION_SECRET: diff --git a/script/test/fixtures/keyonly-envs/envs b/script/test/fixtures/keyonly-envs/envs new file mode 100644 index 00000000..870a7250 --- /dev/null +++ b/script/test/fixtures/keyonly-envs/envs @@ -0,0 +1 @@ +SESSION_SECRET=session diff --git a/script/test/fixtures/keyonly-envs/output-k8s.json b/script/test/fixtures/keyonly-envs/output-k8s.json new file mode 100644 index 00000000..c9bcf7ed --- /dev/null +++ b/script/test/fixtures/keyonly-envs/output-k8s.json @@ -0,0 +1,235 @@ +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "frontend", + "creationTimestamp": null, + "labels": { + "service": "frontend" + } + }, + "spec": { + "ports": [ + { + "name": "80", + "protocol": "TCP", + "port": 80, + "targetPort": 80 + } + ], + "selector": { + "service": "frontend" + } + }, + "status": { + "loadBalancer": {} + } + }, + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "redis-master", + "creationTimestamp": null, + "labels": { + "service": "redis-master" + } + }, + "spec": { + "ports": [ + { + "name": "6379", + "protocol": "TCP", + "port": 6379, + "targetPort": 6379 + } + ], + "selector": { + "service": "redis-master" + } + }, + "status": { + "loadBalancer": {} + } + }, + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "redis-slave", + "creationTimestamp": null, + "labels": { + "service": "redis-slave" + } + }, + "spec": { + "ports": [ + { + "name": "6379", + "protocol": "TCP", + "port": 6379, + "targetPort": 6379 + } + ], + "selector": { + "service": "redis-slave" + } + }, + "status": { + "loadBalancer": {} + } + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "frontend", + "creationTimestamp": null + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "service": "frontend" + } + }, + "spec": { + "containers": [ + { + "name": "frontend", + "image": "gcr.io/google-samples/gb-frontend:v4", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "GET_HOSTS_FROM", + "value": "dns" + }, + { + "name": "RACK_ENV", + "value": "development" + }, + { + "name": "SESSION_SECRET", + "value": "session" + }, + { + "name": "SHOW", + "value": "true" + } + ], + "resources": {} + } + ], + "restartPolicy": "Always" + } + }, + "strategy": {} + }, + "status": {} + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "redis-master", + "creationTimestamp": null + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "service": "redis-master" + } + }, + "spec": { + "containers": [ + { + "name": "redis-master", + "image": "gcr.io/google_containers/redis:e2e", + "ports": [ + { + "containerPort": 6379, + "protocol": "TCP" + } + ], + "resources": {} + } + ], + "restartPolicy": "Always" + } + }, + "strategy": {} + }, + "status": {} + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "redis-slave", + "creationTimestamp": null + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "service": "redis-slave" + } + }, + "spec": { + "containers": [ + { + "name": "redis-slave", + "image": "gcr.io/google_samples/gb-redisslave:v1", + "ports": [ + { + "containerPort": 6379, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "GET_HOSTS_FROM", + "value": "dns" + }, + { + "name": "RACK_ENV", + "value": "development" + }, + { + "name": "SHOW", + "value": "true" + }, + { + "name": "SESSION_SECRET", + "value": "session" + } + ], + "resources": {} + } + ], + "restartPolicy": "Always" + } + }, + "strategy": {} + }, + "status": {} + } + ] +}