/* Copyright 2014 CoreOS, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package initialize import ( "io/ioutil" "os" "path" "testing" "github.com/coreos/coreos-cloudinit/system" ) func TestEnvironmentApply(t *testing.T) { os.Setenv("COREOS_PUBLIC_IPV4", "1.2.3.4") os.Setenv("COREOS_PRIVATE_IPV4", "5.6.7.8") os.Setenv("COREOS_PUBLIC_IPV6", "1234::") os.Setenv("COREOS_PRIVATE_IPV6", "5678::") for _, tt := range []struct { subs map[string]string input string out string }{ { // Substituting both values directly should always take precedence // over environment variables map[string]string{ "$public_ipv4": "192.0.2.3", "$private_ipv4": "192.0.2.203", "$public_ipv6": "fe00:1234::", "$private_ipv6": "fe00:5678::", }, `[Service] ExecStart=/usr/bin/echo "$public_ipv4 $public_ipv6" ExecStop=/usr/bin/echo $private_ipv4 $private_ipv6 ExecStop=/usr/bin/echo $unknown`, `[Service] ExecStart=/usr/bin/echo "192.0.2.3 fe00:1234::" ExecStop=/usr/bin/echo 192.0.2.203 fe00:5678:: ExecStop=/usr/bin/echo $unknown`, }, { // Substituting one value directly while falling back with the other map[string]string{"$private_ipv4": "127.0.0.1"}, "$private_ipv4\n$public_ipv4", "127.0.0.1\n1.2.3.4", }, { // Falling back to environment variables for both values map[string]string{"foo": "bar"}, "$private_ipv4\n$public_ipv4", "5.6.7.8\n1.2.3.4", }, { // No substitutions nil, "$private_ipv4\nfoobar", "5.6.7.8\nfoobar", }, { // Escaping substitutions map[string]string{"$private_ipv4": "127.0.0.1"}, `\$private_ipv4 $private_ipv4 addr: \$private_ipv4 \\$private_ipv4`, `$private_ipv4 127.0.0.1 addr: $private_ipv4 \$private_ipv4`, }, { // No substitutions with escaping nil, "\\$test\n$test", "\\$test\n$test", }, } { env := NewEnvironment("./", "./", "./", "", "", tt.subs) got := env.Apply(tt.input) if got != tt.out { t.Fatalf("Environment incorrectly applied.\ngot:\n%s\nwant:\n%s", got, tt.out) } } } func TestEnvironmentFile(t *testing.T) { subs := map[string]string{ "$public_ipv4": "1.2.3.4", "$private_ipv4": "5.6.7.8", "$public_ipv6": "1234::", "$private_ipv6": "5678::", } expect := "COREOS_PRIVATE_IPV4=5.6.7.8\nCOREOS_PRIVATE_IPV6=5678::\nCOREOS_PUBLIC_IPV4=1.2.3.4\nCOREOS_PUBLIC_IPV6=1234::\n" dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") if err != nil { t.Fatalf("Unable to create tempdir: %v", err) } defer os.RemoveAll(dir) env := NewEnvironment("./", "./", "./", "", "", subs) ef := env.DefaultEnvironmentFile() err = system.WriteEnvFile(ef, dir) if err != nil { t.Fatalf("WriteEnvFile failed: %v", err) } fullPath := path.Join(dir, "etc", "environment") contents, err := ioutil.ReadFile(fullPath) if err != nil { t.Fatalf("Unable to read expected file: %v", err) } if string(contents) != expect { t.Fatalf("File has incorrect contents: %q", contents) } } func TestEnvironmentFileNil(t *testing.T) { subs := map[string]string{ "$public_ipv4": "", "$private_ipv4": "", "$public_ipv6": "", "$private_ipv6": "", } env := NewEnvironment("./", "./", "./", "", "", subs) ef := env.DefaultEnvironmentFile() if ef != nil { t.Fatalf("Environment file not nil: %v", ef) } }