func CreateNetworkWithSubnet( client contrail.ApiClient, project_id, name, prefix string) ( string, error) { expr := regexp.MustCompile(`(([0-9]{1,3}\.){3}[0-9]{1,3})/([0-9]{1,2})`) match := expr.FindStringSubmatch(prefix) if match == nil { return "", fmt.Errorf("Invalid subnet prefix %s", prefix) } address := match[1] prefixlen, _ := strconv.Atoi(match[3]) obj, err := client.FindByUuid("project", project_id) if err != nil { return "", err } project := obj.(*types.Project) refList, err := project.GetNetworkIpams() if err != nil { return "", err } var ipam *types.NetworkIpam if len(refList) > 0 { obj, err := client.FindByUuid("network-ipam", refList[0].Uuid) if err != nil { return "", err } ipam = obj.(*types.NetworkIpam) } else { obj, err := client.FindByName("network-ipam", "default-domain:default-project:default-network-ipam") if err != nil { return "", err } ipam = obj.(*types.NetworkIpam) } net := new(types.VirtualNetwork) net.SetParent(project) net.SetName(name) subnets := types.VnSubnetsType{} subnets.AddIpamSubnets( &types.IpamSubnetType{ Subnet: &types.SubnetType{address, prefixlen}}) net.AddNetworkIpam(ipam, subnets) err = client.Create(net) if err != nil { return "", err } return net.GetUuid(), nil }
func TestCreate(t *testing.T) { client := contrail.NewClient("localhost", 8082) net := types.VirtualNetwork{} net.SetName("test") ipam, err := client.FindByName("network-ipam", "default-domain:default-project:default-network-ipam") if err != nil { t.Fatal(err) } subnets := types.VnSubnetsType{} subnets.AddIpamSubnets( &types.IpamSubnetType{ Subnet: &types.SubnetType{"10.0.0.0", 8}}) net.AddNetworkIpam(ipam.(*types.NetworkIpam), subnets) err = client.Create(&net) if err != nil { t.Error(err) } if len(net.GetUuid()) == 0 { t.Error("No uuid assigned") } netPtr, err := client.FindByUuid("virtual-network", net.GetUuid()) if err != nil { t.Error(err) } else { xnet := netPtr.(*types.VirtualNetwork) refs, err := xnet.GetNetworkIpamRefs() if err != nil { t.Error(err) } else if len(refs) > 0 { xattr := refs[0].Attr.(types.VnSubnetsType) if len(xattr.IpamSubnets) == 1 { isubnet := xattr.IpamSubnets[0] if isubnet.Subnet.IpPrefix != "10.0.0.0" || isubnet.Subnet.IpPrefixLen != 8 { t.Errorf("Bad subnet %s/%d", isubnet.Subnet.IpPrefix, isubnet.Subnet.IpPrefixLen) } } else { t.Errorf("%d subnets", len(xattr.IpamSubnets)) } } else { t.Error("Empty network-ipam reference list") } } err = client.Delete(&net) if err != nil { t.Error(err) } }
func TestReference(t *testing.T) { db := NewInMemDatabase() ipam := new(types.NetworkIpam) ipam.SetUuid(uuid.New()) ipam.SetFQName("project", strings.Split("default-domain:p1:ipam", ":")) assert.NoError(t, db.Put(ipam, nil, UIDList{})) net := new(types.VirtualNetwork) net.SetUuid(uuid.New()) net.SetFQName("project", strings.Split("default-domain:p1:network", ":")) subnets := types.VnSubnetsType{} subnets.AddIpamSubnets( &types.IpamSubnetType{ Subnet: &types.SubnetType{"10.0.0.0", 8}}) net.AddNetworkIpam(ipam, subnets) refs := GetReferenceList(net) assert.NoError(t, db.Put(net, nil, refs)) result, err := db.GetBackReferences(parseUID(ipam.GetUuid()), "virtual_network") assert.NoError(t, err) assert.Contains(t, result, parseUID(net.GetUuid())) }
func TestReferenceUpdate(t *testing.T) { client := contrail.NewClient("localhost", 8082) net := types.VirtualNetwork{} net.SetName("test2") ipam, err := client.FindByName("network-ipam", "default-domain:default-project:default-network-ipam") if err != nil { t.Fatal(err) } subnets := types.VnSubnetsType{} subnets.AddIpamSubnets( &types.IpamSubnetType{ Subnet: &types.SubnetType{"10.0.0.0", 8}}) net.AddNetworkIpam(ipam.(*types.NetworkIpam), subnets) err = client.Create(&net) if err != nil { t.Error(err) } defer client.Delete(&net) obj, err := client.FindByUuid("virtual-network", net.GetUuid()) if err != nil { t.Fatal(err) } netPtr := obj.(*types.VirtualNetwork) refs, err := netPtr.GetNetworkIpamRefs() if err != nil { t.Error(err) } else if len(refs) > 0 { netPtr.DeleteNetworkIpam(refs[0].Uuid) nsubnets := types.VnSubnetsType{} nsubnets.AddIpamSubnets( &types.IpamSubnetType{ Subnet: &types.SubnetType{"192.168.0.0", 16}}) netPtr.AddNetworkIpam(ipam.(*types.NetworkIpam), nsubnets) client.Update(netPtr) } else { t.Error("Empty network-ipam reference list") } obj, err = client.FindByUuid("virtual-network", net.GetUuid()) if err != nil { t.Fatal(err) } netPtr = obj.(*types.VirtualNetwork) refs, err = netPtr.GetNetworkIpamRefs() if err != nil { t.Error(err) } else if len(refs) != 1 { t.Errorf("Expected: 1 reference, %d actual", len(refs)) } else { xattr := refs[0].Attr.(types.VnSubnetsType) if len(xattr.IpamSubnets) == 1 { isubnet := xattr.IpamSubnets[0] if isubnet.Subnet.IpPrefix != "192.168.0.0" || isubnet.Subnet.IpPrefixLen != 16 { t.Errorf("Bad subnet %s/%d", isubnet.Subnet.IpPrefix, isubnet.Subnet.IpPrefixLen) } } else { t.Errorf("%d subnets", len(xattr.IpamSubnets)) } } netPtr.ClearNetworkIpam() client.Update(netPtr) obj, err = client.FindByUuid("virtual-network", net.GetUuid()) if err != nil { t.Fatal(err) } netPtr = obj.(*types.VirtualNetwork) refs, err = netPtr.GetNetworkIpamRefs() if err != nil { t.Error(err) } else if len(refs) != 0 { t.Errorf("Expected: 1 reference, %d actual", len(refs)) } }