// Copyright 2015 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) } }