Esempio n. 1
0
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)
	}
}
Esempio n. 2
0
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
}