func (m *InstanceManager) ReleaseInterface(tenant, podName string) { fqn := interfaceFQName(m.config.DefaultDomain, tenant, podName) obj, err := m.client.FindByName("virtual-machine-interface", strings.Join(fqn, ":")) if err != nil { glog.Errorf("Get vmi %s: %v", strings.Join(fqn, ":"), err) return } vmi := obj.(*types.VirtualMachineInterface) refs, err := vmi.GetFloatingIpBackRefs() if err == nil { for _, ref := range refs { fip, err := types.FloatingIpByUuid(m.client, ref.Uuid) if err != nil { glog.Errorf("Get floating-ip %s: %v", ref.Uuid, err) continue } fip.DeleteVirtualMachineInterface(vmi.GetUuid()) err = m.client.Update(fip) if err != nil { glog.Errorf("Remove floating-ip reference %s: %v", ref.Uuid, err) } } } else { glog.Errorf("Get %s floating-ip back refs: %v", podName, err) } err = m.client.Delete(obj) if err != nil { glog.Errorf("Delete vmi %s: %v", obj.GetUuid(), err) } }
func (m *NetworkManagerImpl) LocateFloatingIp(network *types.VirtualNetwork, resourceName, targetAddress string) (*types.FloatingIp, error) { obj, err := m.client.FindByName("floating-ip-pool", makePoolName(network)) if err != nil { glog.Errorf("Get floating-ip-pool %s: %v", network.GetName(), err) return nil, err } pool := obj.(*types.FloatingIpPool) fqn := AppendConst(pool.GetFQName(), resourceName) obj, err = m.client.FindByName("floating-ip", strings.Join(fqn, ":")) if err == nil { fip := obj.(*types.FloatingIp) if targetAddress != "" && fip.GetFloatingIpAddress() != targetAddress { fip.SetFloatingIpAddress(targetAddress) err = m.client.Update(fip) if err != nil { glog.Errorf("Update floating-ip %s: %v", resourceName, err) return nil, err } } return fip, nil } projectFQN := network.GetFQName()[0 : len(network.GetFQName())-1] obj, err = m.client.FindByName("project", strings.Join(projectFQN, ":")) if err != nil { glog.Errorf("Get project %s: %v", projectFQN[len(projectFQN)-1], err) return nil, err } project := obj.(*types.Project) fip := new(types.FloatingIp) fip.SetParent(pool) fip.SetName(resourceName) if targetAddress != "" { fip.SetFloatingIpAddress(targetAddress) } fip.AddProject(project) err = m.client.Create(fip) if err != nil { glog.Errorf("Create floating-ip %s: %v", resourceName, err) return nil, err } if targetAddress == "" { fip, err = types.FloatingIpByUuid(m.client, fip.GetUuid()) } return fip, err }