From 56815a6756a2f43010c06cfb16aae8cf53f36c8f Mon Sep 17 00:00:00 2001 From: Alex Crawford Date: Thu, 11 Sep 2014 08:35:09 -0700 Subject: [PATCH] metadata: add support for IPv6 variable substitution --- initialize/env.go | 8 ++++++++ initialize/env_test.go | 18 +++++++++++++----- initialize/meta_data.go | 29 +++++++++++++++++++---------- initialize/meta_data_test.go | 4 ++-- 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/initialize/env.go b/initialize/env.go index cae32f7..245fe05 100644 --- a/initialize/env.go +++ b/initialize/env.go @@ -28,6 +28,8 @@ func NewEnvironment(root, configRoot, workspace, netconfType, sshKeyName string, for k, v := range map[string]string{ "$public_ipv4": os.Getenv("COREOS_PUBLIC_IPV4"), "$private_ipv4": os.Getenv("COREOS_PRIVATE_IPV4"), + "$public_ipv6": os.Getenv("COREOS_PUBLIC_IPV6"), + "$private_ipv6": os.Getenv("COREOS_PRIVATE_IPV6"), } { if _, ok := substitutions[k]; !ok { substitutions[k] = v @@ -80,6 +82,12 @@ func (e *Environment) DefaultEnvironmentFile() *system.EnvFile { if ip, ok := e.substitutions["$private_ipv4"]; ok && len(ip) > 0 { ef.Vars["COREOS_PRIVATE_IPV4"] = ip } + if ip, ok := e.substitutions["$public_ipv6"]; ok && len(ip) > 0 { + ef.Vars["COREOS_PUBLIC_IPV6"] = ip + } + if ip, ok := e.substitutions["$private_ipv6"]; ok && len(ip) > 0 { + ef.Vars["COREOS_PRIVATE_IPV6"] = ip + } if len(ef.Vars) == 0 { return nil } else { diff --git a/initialize/env_test.go b/initialize/env_test.go index 61d929f..c45283d 100644 --- a/initialize/env_test.go +++ b/initialize/env_test.go @@ -12,6 +12,8 @@ import ( 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 @@ -23,14 +25,16 @@ func TestEnvironmentApply(t *testing.T) { 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" -ExecStop=/usr/bin/echo $private_ipv4 +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" -ExecStop=/usr/bin/echo 192.0.2.203 +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`, }, { @@ -65,8 +69,10 @@ 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_PUBLIC_IPV4=1.2.3.4\n" + 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 { @@ -96,6 +102,8 @@ func TestEnvironmentFileNil(t *testing.T) { subs := map[string]string{ "$public_ipv4": "", "$private_ipv4": "", + "$public_ipv6": "", + "$private_ipv6": "", } env := NewEnvironment("./", "./", "./", "", "", subs) diff --git a/initialize/meta_data.go b/initialize/meta_data.go index 49b975c..23ef08c 100644 --- a/initialize/meta_data.go +++ b/initialize/meta_data.go @@ -5,8 +5,8 @@ import ( "sort" ) -// ParseMetaData parses a JSON blob in the OpenStack metadata service format, and -// converts it to a partially hydrated CloudConfig +// ParseMetaData parses a JSON blob in the OpenStack metadata service format, +// and converts it to a partially hydrated CloudConfig. func ParseMetaData(contents string) (*CloudConfig, error) { if len(contents) == 0 { return nil, nil @@ -34,22 +34,31 @@ func ParseMetaData(contents string) (*CloudConfig, error) { return &cfg, nil } -// ExtractIPsFromMetaData parses a JSON blob in the OpenStack metadata service format, -// and returns a substitution map possibly containing private_ipv4 and public_ipv4 addresses +// ExtractIPsFromMetaData parses a JSON blob in the OpenStack metadata service +// format and returns a substitution map possibly containing private_ipv4, +// public_ipv4, private_ipv6, and public_ipv6 addresses. func ExtractIPsFromMetadata(contents []byte) (map[string]string, error) { var ips struct { - Public string `json:"public-ipv4"` - Private string `json:"local-ipv4"` + PublicIPv4 string `json:"public-ipv4"` + PrivateIPv4 string `json:"local-ipv4"` + PublicIPv6 string `json:"public-ipv6"` + PrivateIPv6 string `json:"local-ipv6"` } if err := json.Unmarshal(contents, &ips); err != nil { return nil, err } m := make(map[string]string) - if ips.Private != "" { - m["$private_ipv4"] = ips.Private + if ips.PrivateIPv4 != "" { + m["$private_ipv4"] = ips.PrivateIPv4 } - if ips.Public != "" { - m["$public_ipv4"] = ips.Public + if ips.PublicIPv4 != "" { + m["$public_ipv4"] = ips.PublicIPv4 + } + if ips.PrivateIPv6 != "" { + m["$private_ipv6"] = ips.PrivateIPv6 + } + if ips.PublicIPv6 != "" { + m["$public_ipv6"] = ips.PublicIPv6 } return m, nil } diff --git a/initialize/meta_data_test.go b/initialize/meta_data_test.go index 2e03281..5b09fbf 100644 --- a/initialize/meta_data_test.go +++ b/initialize/meta_data_test.go @@ -43,9 +43,9 @@ func TestExtractIPsFromMetadata(t *testing.T) { out map[string]string }{ { - []byte(`{"public-ipv4": "12.34.56.78", "local-ipv4": "1.2.3.4"}`), + []byte(`{"public-ipv4": "12.34.56.78", "local-ipv4": "1.2.3.4", "public-ipv6": "1234::", "local-ipv6": "5678::"}`), false, - map[string]string{"$public_ipv4": "12.34.56.78", "$private_ipv4": "1.2.3.4"}, + map[string]string{"$public_ipv4": "12.34.56.78", "$private_ipv4": "1.2.3.4", "$public_ipv6": "1234::", "$private_ipv6": "5678::"}, }, { []byte(`{"local-ipv4": "127.0.0.1", "something_else": "don't care"}`),