// NodeAddresses is an implementation of Instances.NodeAddresses. func (i *Instances) NodeAddresses(nodeName k8stypes.NodeName) ([]api.NodeAddress, error) { addrs := []api.NodeAddress{} // Create context ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Create vSphere client c, err := vsphereLogin(i.cfg, ctx) if err != nil { return nil, err } defer c.Logout(ctx) vm, err := getVirtualMachineByName(i.cfg, ctx, c, nodeName) if err != nil { return nil, err } var mvm mo.VirtualMachine err = getVirtualMachineManagedObjectReference(ctx, c, vm, "guest.net", &mvm) if err != nil { return nil, err } // retrieve VM's ip(s) for _, v := range mvm.Guest.Net { var addressType api.NodeAddressType if i.cfg.Network.PublicNetwork == v.Network { addressType = api.NodeExternalIP } else { addressType = api.NodeInternalIP } for _, ip := range v.IpAddress { api.AddToNodeAddresses(&addrs, api.NodeAddress{ Type: addressType, Address: ip, }, ) } } return addrs, nil }
func (i *Instances) NodeAddresses(name string) ([]api.NodeAddress, error) { glog.V(4).Infof("NodeAddresses(%v) called", name) srv, err := getServerByName(i.compute, name) if err != nil { return nil, err } addrs := []api.NodeAddress{} for _, addr := range findAddrs(srv.Addresses["private"]) { addrs = append(addrs, api.NodeAddress{ Type: api.NodeInternalIP, Address: addr, }) } for _, addr := range findAddrs(srv.Addresses["public"]) { addrs = append(addrs, api.NodeAddress{ Type: api.NodeExternalIP, Address: addr, }) } // AccessIPs are usually duplicates of "public" addresses. api.AddToNodeAddresses(&addrs, api.NodeAddress{ Type: api.NodeExternalIP, Address: srv.AccessIPv6, }, api.NodeAddress{ Type: api.NodeExternalIP, Address: srv.AccessIPv4, }, ) glog.V(4).Infof("NodeAddresses(%v) => %v", name, addrs) return addrs, nil }
func getAddressesByName(client *gophercloud.ServiceClient, name string) ([]api.NodeAddress, error) { srv, err := getServerByName(client, name) if err != nil { return nil, err } addrs := []api.NodeAddress{} for network, netblob := range srv.Addresses { list, ok := netblob.([]interface{}) if !ok { continue } for _, item := range list { var addressType api.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 = api.NodeExternalIP } else { addressType = api.NodeInternalIP } tmp, ok := props["addr"] if !ok { continue } addr, ok := tmp.(string) if !ok { continue } api.AddToNodeAddresses(&addrs, api.NodeAddress{ Type: addressType, Address: addr, }, ) } } // AccessIPs are usually duplicates of "public" addresses. if srv.AccessIPv4 != "" { api.AddToNodeAddresses(&addrs, api.NodeAddress{ Type: api.NodeExternalIP, Address: srv.AccessIPv4, }, ) } if srv.AccessIPv6 != "" { api.AddToNodeAddresses(&addrs, api.NodeAddress{ Type: api.NodeExternalIP, Address: srv.AccessIPv6, }, ) } return addrs, nil }
// NodeAddresses is an implementation of Instances.NodeAddresses. func (pc *PCCloud) NodeAddresses(nodeName k8stypes.NodeName) ([]api.NodeAddress, error) { addrs := []api.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 != "-" { api.AddToNodeAddresses(&addrs, api.NodeAddress{ // TODO: figure out the type of the IP Type: api.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) }