func nodeAddresses(srv *servers.Server) ([]v1.NodeAddress, error) { addrs := []v1.NodeAddress{} type Address struct { IpType string `mapstructure:"OS-EXT-IPS:type"` Addr string } var addresses map[string][]Address err := mapstructure.Decode(srv.Addresses, &addresses) if err != nil { return nil, err } for network, addrlist := range addresses { for _, props := range addrlist { var addressType v1.NodeAddressType if props.IpType == "floating" || network == "public" { addressType = v1.NodeExternalIP } else { addressType = v1.NodeInternalIP } v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: addressType, Address: props.Addr, }, ) } } // AccessIPs are usually duplicates of "public" addresses. if srv.AccessIPv4 != "" { v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: v1.NodeExternalIP, Address: srv.AccessIPv4, }, ) } if srv.AccessIPv6 != "" { v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: v1.NodeExternalIP, Address: srv.AccessIPv6, }, ) } return addrs, nil }
// NodeAddresses is an implementation of Instances.NodeAddresses. func (i *Instances) NodeAddresses(nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) { addrs := []v1.NodeAddress{} // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() vm, err := getVirtualMachineByName(i.cfg, ctx, i.client, nodeName) if err != nil { return nil, err } var mvm mo.VirtualMachine err = getVirtualMachineManagedObjectReference(ctx, i.client, vm, "guest.net", &mvm) if err != nil { return nil, err } // retrieve VM's ip(s) for _, v := range mvm.Guest.Net { var addressType v1.NodeAddressType if i.cfg.Network.PublicNetwork == v.Network { addressType = v1.NodeExternalIP } else { addressType = v1.NodeInternalIP } for _, ip := range v.IpAddress { v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: addressType, Address: ip, }, ) } } return addrs, nil }
// NodeAddresses is an implementation of Instances.NodeAddresses. func (pc *PCCloud) NodeAddresses(nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) { addrs := []v1.NodeAddress{} name := string(nodeName) var vmID string var err error if name == pc.localK8sHostname { vmID = pc.localInstanceID } else { vmID, err = getInstanceID(name, pc.projID) if err != nil { glog.Errorf("Photon Cloud Provider: getInstanceID failed for NodeAddresses. Error[%v]", err) return addrs, err } } // Retrieve the Photon VM's IP addresses from the Photon Controller endpoint based on the VM ID vmList, err := photonClient.Projects.GetVMs(pc.projID, nil) if err != nil { glog.Errorf("Photon Cloud Provider: Failed to GetVMs for project %s. Error[%v]", pc.projID, err) return addrs, err } for _, vm := range vmList.Items { if vm.ID == vmID { task, err := photonClient.VMs.GetNetworks(vm.ID) if err != nil { glog.Errorf("Photon Cloud Provider: GetNetworks failed for node %s with vm.ID %s. Error[%v]", name, vm.ID, err) return addrs, err } else { task, err = photonClient.Tasks.Wait(task.ID) if err != nil { glog.Errorf("Photon Cloud Provider: Wait task for GetNetworks failed for node %s with vm.ID %s. Error[%v]", name, vm.ID, err) return addrs, err } else { networkConnections := task.ResourceProperties.(map[string]interface{}) networks := networkConnections["networkConnections"].([]interface{}) for _, nt := range networks { network := nt.(map[string]interface{}) if val, ok := network["ipAddress"]; ok && val != nil { ipAddr := val.(string) if ipAddr != "-" { v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ // TODO: figure out the type of the IP Type: v1.NodeInternalIP, Address: ipAddr, }, ) } } } return addrs, nil } } } } glog.Errorf("Failed to find the node %s from Photon Controller endpoint", name) return addrs, fmt.Errorf("Failed to find the node %s from Photon Controller endpoint", name) }
func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName) ([]v1.NodeAddress, error) { srv, err := getServerByName(client, name) if err != nil { return nil, err } addrs := []v1.NodeAddress{} for network, netblob := range srv.Addresses { list, ok := netblob.([]interface{}) if !ok { continue } for _, item := range list { var addressType v1.NodeAddressType props, ok := item.(map[string]interface{}) if !ok { continue } extIPType, ok := props["OS-EXT-IPS:type"] if (ok && extIPType == "floating") || (!ok && network == "public") { addressType = v1.NodeExternalIP } else { addressType = v1.NodeInternalIP } tmp, ok := props["addr"] if !ok { continue } addr, ok := tmp.(string) if !ok { continue } v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: addressType, Address: addr, }, ) } } // AccessIPs are usually duplicates of "public" addresses. if srv.AccessIPv4 != "" { v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: v1.NodeExternalIP, Address: srv.AccessIPv4, }, ) } if srv.AccessIPv6 != "" { v1.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: v1.NodeExternalIP, Address: srv.AccessIPv6, }, ) } return addrs, nil }