// Create floating-ip with 2 vmi references, delete it and verify that // the back_refs are updated as expected. func TestDeleteRefs(t *testing.T) { db := NewInMemDatabase() vmi1 := new(types.VirtualMachineInterface) vmi1.SetUuid(uuid.New()) vmi1.SetName("port1") assert.NoError(t, db.Put(vmi1, nil, GetReferenceList(vmi1))) vmi2 := new(types.VirtualMachineInterface) vmi2.SetUuid(uuid.New()) vmi2.SetName("port2") assert.NoError(t, db.Put(vmi2, nil, GetReferenceList(vmi2))) fip := new(types.FloatingIp) fip.SetUuid(uuid.New()) fip.SetName("fip") fip.AddVirtualMachineInterface(vmi1) fip.AddVirtualMachineInterface(vmi2) assert.NoError(t, db.Put(fip, nil, GetReferenceList(fip))) assert.Error(t, db.Delete(vmi1)) result, err := db.GetBackReferences(parseUID(vmi2.GetUuid()), "floating_ip") assert.NoError(t, err) assert.Len(t, result, 1) assert.NoError(t, db.Delete(fip)) result, err = db.GetBackReferences(parseUID(vmi2.GetUuid()), "floating_ip") assert.NoError(t, err) assert.Len(t, result, 0) assert.NoError(t, db.Delete(vmi1)) assert.NoError(t, db.Delete(vmi2)) }
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 }