func (m *InstanceManager) LocateInstanceIp( network *types.VirtualNetwork, instanceUID string, nic *types.VirtualMachineInterface) *types.InstanceIp { tenant := nic.GetFQName()[len(nic.GetFQName())-2] name := makeInstanceIpName(tenant, nic.GetName()) obj, err := m.client.FindByName("instance-ip", name) if err == nil { // TODO(prm): ensure that attributes are as expected return obj.(*types.InstanceIp) } address, err := m.allocator.LocateIpAddress(instanceUID) if err != nil { return nil } // Create InstanceIp ipObj := new(types.InstanceIp) ipObj.SetName(name) ipObj.AddVirtualNetwork(network) ipObj.AddVirtualMachineInterface(nic) ipObj.SetInstanceIpAddress(address) ipObj.SetInstanceIpMode("active-active") err = m.client.Create(ipObj) if err != nil { glog.Errorf("Create instance-ip %s for %s: %v", address, nic.GetName(), err) return nil } obj, err = m.client.FindByUuid(ipObj.GetType(), ipObj.GetUuid()) if err != nil { glog.Errorf("Get instance-ip %s for %s: %v", address, ipObj.GetUuid(), err) return nil } return ipObj }
func (c *Controller) updateInstanceMetadata( pod *api.Pod, nic *types.VirtualMachineInterface, address, gateway string) { doUpdate := false if pod.Annotations == nil { pod.Annotations = make(map[string]string) doUpdate = true } var newValue, oldValue InstanceMetadata if data, ok := pod.Annotations[MetadataAnnotationTag]; ok { json.Unmarshal([]byte(data), &oldValue) } newValue.Uuid = nic.GetUuid() var mac_address string addressArr := nic.GetVirtualMachineInterfaceMacAddresses() if len(addressArr.MacAddress) > 0 { mac_address = addressArr.MacAddress[0] } else { glog.Errorf("interface %s: no mac-addresses", nic.GetName()) } newValue.MacAddress = mac_address newValue.IpAddress = address newValue.Gateway = gateway if !doUpdate && reflect.DeepEqual(newValue, oldValue) { return } encoded, err := json.Marshal(&newValue) if err != nil { glog.Errorf("JSON encode: %v", err) return } pod.Annotations[MetadataAnnotationTag] = string(encoded) _, err = c.kube.Pods(pod.Namespace).Update(pod) if err != nil { // Update will return an error if the pod object that we are // working with is stale. glog.Infof("Pod Update %s: %v", pod.Name, err) } }
func (c *Controller) updateInstanceMetadata( pod *api.Pod, nic *types.VirtualMachineInterface, address, gateway string) { doUpdate := false if pod.Annotations == nil { pod.Annotations = make(map[string]string) doUpdate = true } if updateElement(pod.Annotations, "nic_uuid", nic.GetUuid()) { doUpdate = true } var mac_address string addressArr := nic.GetVirtualMachineInterfaceMacAddresses() if len(addressArr.MacAddress) > 0 { mac_address = addressArr.MacAddress[0] } else { glog.Errorf("interface %s: no mac-addresses", nic.GetName()) } if updateElement(pod.Annotations, "mac_address", mac_address) { doUpdate = true } if updateElement(pod.Annotations, "ip_address", address) { doUpdate = true } if updateElement(pod.Annotations, "gateway", gateway) { doUpdate = true } if !doUpdate { return } _, err := c.kube.Pods(pod.Namespace).Update(pod) if err != nil { // Update will return an error if the pod object that we are // working with is stale. glog.Infof("Pod Update %s: %v", pod.Name, err) } }