diff --git a/cmd/cloudinitsave/cloudinitsave.go b/cmd/cloudinitsave/cloudinitsave.go index 5e7593b3..71415b6b 100755 --- a/cmd/cloudinitsave/cloudinitsave.go +++ b/cmd/cloudinitsave/cloudinitsave.go @@ -65,6 +65,11 @@ func Main() { if err := SaveCloudConfig(true); err != nil { log.Errorf("Failed to save cloud-config: %v", err) } + + // Apply any newly detected network config. + //consider putting this in a separate init phase... + cfg = rancherConfig.LoadConfig() + network.ApplyNetworkConfig(cfg) } func SaveCloudConfig(network bool) error { diff --git a/config/cloudinit/datasource/metadata/digitalocean/metadata.go b/config/cloudinit/datasource/metadata/digitalocean/metadata.go index 045b1044..cc55c899 100755 --- a/config/cloudinit/datasource/metadata/digitalocean/metadata.go +++ b/config/cloudinit/datasource/metadata/digitalocean/metadata.go @@ -76,6 +76,22 @@ func NewDatasource(root string) *MetadataService { return &MetadataService{Service: metadata.NewDatasource(root, apiVersion, userdataURL, metadataPath, nil)} } +// Parse IPv4 netmask written in IP form (e.g. "255.255.255.0"). +func ipmask(addr *Address) string { + ip := net.ParseIP(addr.IPAddress) + var mask net.IPMask + if addr.Netmask != "" { + mask = net.IPMask(net.ParseIP(addr.Netmask)) + } else { + mask = net.CIDRMask(addr.Cidr, 32) + } + ipnet := net.IPNet{ + IP: ip, + Mask: mask, + } + return ipnet.String() +} + func (ms *MetadataService) FetchMetadata() (metadata datasource.Metadata, err error) { var data []byte var m Metadata @@ -114,17 +130,16 @@ func (ms *MetadataService) FetchMetadata() (metadata datasource.Metadata, err er if eth.IPv4 != nil { network.Gateway = eth.IPv4.Gateway - network.Addresses = append(network.Addresses, fmt.Sprintf("%s/%s", eth.IPv4.IPAddress, eth.IPv4.Netmask)) + network.Addresses = append(network.Addresses, ipmask(eth.IPv4)) if metadata.PublicIPv4 == nil { metadata.PublicIPv4 = net.ParseIP(eth.IPv4.IPAddress) } } if eth.AnchorIPv4 != nil { - network.Addresses = append(network.Addresses, fmt.Sprintf("%s/%s", eth.AnchorIPv4.IPAddress, eth.AnchorIPv4.Netmask)) - + network.Addresses = append(network.Addresses, ipmask(eth.AnchorIPv4)) } if eth.IPv6 != nil { - network.Addresses = append(network.Addresses, eth.IPv6.IPAddress) + network.Addresses = append(network.Addresses, fmt.Sprintf("%s/%d", eth.IPv6.IPAddress, eth.IPv6.Cidr)) network.GatewayIpv6 = eth.IPv6.Gateway if metadata.PublicIPv6 == nil { metadata.PublicIPv6 = net.ParseIP(eth.IPv6.IPAddress) @@ -139,17 +154,17 @@ func (ms *MetadataService) FetchMetadata() (metadata datasource.Metadata, err er if eth.IPv4 != nil { network.Gateway = eth.IPv4.Gateway - network.Addresses = append(network.Addresses, fmt.Sprintf("%s/%s", eth.IPv4.IPAddress, eth.IPv4.Netmask)) + network.Addresses = append(network.Addresses, ipmask(eth.IPv4)) + if metadata.PrivateIPv4 == nil { metadata.PrivateIPv4 = net.ParseIP(eth.IPv6.IPAddress) } } if eth.AnchorIPv4 != nil { - network.Addresses = append(network.Addresses, fmt.Sprintf("%s/%s", eth.AnchorIPv4.IPAddress, eth.AnchorIPv4.Netmask)) - + network.Addresses = append(network.Addresses, ipmask(eth.AnchorIPv4)) } if eth.IPv6 != nil { - network.Address = eth.IPv6.IPAddress + network.Addresses = append(network.Addresses, fmt.Sprintf("%s/%d", eth.IPv6.IPAddress, eth.IPv6.Cidr)) network.GatewayIpv6 = eth.IPv6.Gateway if metadata.PrivateIPv6 == nil { metadata.PrivateIPv6 = net.ParseIP(eth.IPv6.IPAddress) @@ -166,7 +181,6 @@ func (ms *MetadataService) FetchMetadata() (metadata datasource.Metadata, err er for i, key := range m.PublicKeys { metadata.SSHPublicKeys[strconv.Itoa(i)] = key } - // metadata.NetworkConfig = m return } diff --git a/config/cloudinit/datasource/metadata/digitalocean/metadata_test.go b/config/cloudinit/datasource/metadata/digitalocean/metadata_test.go index bc0d36fa..335f1a85 100755 --- a/config/cloudinit/datasource/metadata/digitalocean/metadata_test.go +++ b/config/cloudinit/datasource/metadata/digitalocean/metadata_test.go @@ -96,8 +96,8 @@ func TestFetchMetadata(t *testing.T) { Interfaces: map[string]netconf.InterfaceConfig{ "eth0": netconf.InterfaceConfig{ Addresses: []string{ - "192.168.1.2/255.255.255.0", - "fe00::", + "192.168.1.2/24", + "fe00::/126", }, //Netmask: "255.255.255.0", Gateway: "192.168.1.1", diff --git a/config/cloudinit/datasource/metadata/packet/metadata.go b/config/cloudinit/datasource/metadata/packet/metadata.go index 0ec92377..c246d494 100755 --- a/config/cloudinit/datasource/metadata/packet/metadata.go +++ b/config/cloudinit/datasource/metadata/packet/metadata.go @@ -15,6 +15,7 @@ package packet import ( + "bytes" "fmt" "net/http" "strconv" @@ -129,6 +130,12 @@ func (ms *MetadataService) FetchMetadata() (metadata datasource.Metadata, err er metadata.NetworkConfig = netCfg + // This is not really the right place - perhaps we should add a call-home function in each datasource to be called after the network is applied + //(see the original in cmd/cloudsave/packet) + if _, err = http.Post(m.PhoneHomeURL, "application/json", bytes.NewReader([]byte{})); err != nil { + log.Errorf("Failed to post to Packet phone home URL: %v", err) + } + return } diff --git a/config/cloudinit/network/packet.go b/config/cloudinit/network/packet.go index c786fe90..8bed1888 100755 --- a/config/cloudinit/network/packet.go +++ b/config/cloudinit/network/packet.go @@ -41,6 +41,7 @@ func parseNetwork(netdata netconf.NetworkConfig, nameservers []net.IP) ([]Interf var interfaces []InterfaceGenerator var addresses []net.IPNet var routes []route + // TODO: commented out because we don't use it - should combine with the code we do use... /* for _, netblock := range netdata.Netblocks { addresses = append(addresses, net.IPNet{ IP: netblock.Address,