Merge pull request #227 from crawford/ipv6
metadata: add support for IPv6 variable substitution
This commit is contained in:
		| @@ -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 { | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
| @@ -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"}`), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user