github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/external_network_v2_test.go (about) 1 //go:build extnetwork || network || nsxt || functional || openapi || ALL 2 3 /* 4 * Copyright 2020 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 5 */ 6 7 package govcd 8 9 import ( 10 "fmt" 11 12 "github.com/vmware/go-vcloud-director/v2/types/v56" 13 . "gopkg.in/check.v1" 14 ) 15 16 func (vcd *TestVCD) Test_CreateExternalNetworkV2Nsxt(check *C) { 17 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.Tier0router, types.ExternalNetworkBackingTypeNsxtTier0Router, false, "") 18 } 19 20 func (vcd *TestVCD) Test_CreateExternalNetworkV2NsxtVrf(check *C) { 21 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.Tier0routerVrf, types.ExternalNetworkBackingTypeNsxtTier0Router, false, "") 22 } 23 24 func (vcd *TestVCD) Test_CreateExternalNetworkV2NsxtSegment(check *C) { 25 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.NsxtImportSegment, types.ExternalNetworkBackingTypeNsxtSegment, false, "") 26 } 27 28 func (vcd *TestVCD) testCreateExternalNetworkV2Nsxt(check *C, backingName, backingType string, useIpSpace bool, ownerOrgId string) { 29 if vcd.skipAdminTests { 30 check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName())) 31 } 32 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 33 skipOpenApiEndpointTest(vcd, check, endpoint) 34 skipNoNsxtConfiguration(vcd, check) 35 36 fmt.Printf("Running: %s\n", check.TestName()) 37 38 // NSX-T details 39 man, err := vcd.client.QueryNsxtManagerByName(vcd.config.VCD.Nsxt.Manager) 40 check.Assert(err, IsNil) 41 nsxtManagerId, err := BuildUrnWithUuid("urn:vcloud:nsxtmanager:", extractUuid(man[0].HREF)) 42 check.Assert(err, IsNil) 43 44 backingId := getBackingIdByNameAndType(check, backingName, backingType, vcd, nsxtManagerId) 45 46 // Create network and test CRUD capabilities 47 netNsxt := testExternalNetworkV2(vcd, check.TestName(), backingType, backingId, nsxtManagerId, useIpSpace, ownerOrgId) 48 createdNet, err := CreateExternalNetworkV2(vcd.client, netNsxt) 49 check.Assert(err, IsNil) 50 51 // Use generic "OpenApiEntity" resource cleanup type 52 openApiEndpoint := endpoint + createdNet.ExternalNetwork.ID 53 AddToCleanupListOpenApi(createdNet.ExternalNetwork.Name, check.TestName(), openApiEndpoint) 54 55 createdNet.ExternalNetwork.Name = check.TestName() + "changed_name" 56 updatedNet, err := createdNet.Update() 57 check.Assert(err, IsNil) 58 check.Assert(updatedNet.ExternalNetwork.Name, Equals, createdNet.ExternalNetwork.Name) 59 60 read1, err := GetExternalNetworkV2ById(vcd.client, createdNet.ExternalNetwork.ID) 61 check.Assert(err, IsNil) 62 check.Assert(createdNet.ExternalNetwork.ID, Equals, read1.ExternalNetwork.ID) 63 64 byName, err := GetExternalNetworkV2ByName(vcd.client, read1.ExternalNetwork.Name) 65 check.Assert(err, IsNil) 66 check.Assert(createdNet.ExternalNetwork.ID, Equals, byName.ExternalNetwork.ID) 67 68 readAllNetworks, err := GetAllExternalNetworksV2(vcd.client, nil) 69 check.Assert(err, IsNil) 70 var foundNetwork bool 71 for i := range readAllNetworks { 72 if readAllNetworks[i].ExternalNetwork.ID == createdNet.ExternalNetwork.ID { 73 foundNetwork = true 74 break 75 } 76 } 77 check.Assert(foundNetwork, Equals, true) 78 79 err = createdNet.Delete() 80 check.Assert(err, IsNil) 81 82 _, err = GetExternalNetworkV2ById(vcd.client, createdNet.ExternalNetwork.ID) 83 check.Assert(ContainsNotFound(err), Equals, true) 84 } 85 86 // getBackingIdByNameAndType looks up Backing ID by name and type 87 func getBackingIdByNameAndType(check *C, backingName string, backingType string, vcd *TestVCD, nsxtManagerId string) string { 88 var backingId string 89 switch { 90 case backingType == types.ExternalNetworkBackingTypeNsxtTier0Router || backingType == types.ExternalNetworkBackingTypeNsxtVrfTier0Router: // Lookup T0 or T0 VRF 91 tier0RouterVrf, err := vcd.client.GetImportableNsxtTier0RouterByName(backingName, nsxtManagerId) 92 check.Assert(err, IsNil) 93 backingId = tier0RouterVrf.NsxtTier0Router.ID 94 case backingType == types.ExternalNetworkBackingTypeNsxtSegment: // Lookup segment ID 95 bareNsxtManagerId, err := getBareEntityUuid(nsxtManagerId) 96 check.Assert(err, IsNil) 97 filter := map[string]string{"nsxTManager": bareNsxtManagerId} 98 99 nsxtSegment, err := vcd.client.GetFilteredNsxtImportableSwitches(filter) 100 check.Assert(err, IsNil) 101 backingId = nsxtSegment[0].NsxtImportableSwitch.ID 102 } 103 return backingId 104 } 105 106 func (vcd *TestVCD) Test_CreateExternalNetworkV2Nsxv(check *C) { 107 vcd.skipIfNotSysAdmin(check) 108 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointExternalNetworks 109 skipOpenApiEndpointTest(vcd, check, endpoint) 110 111 fmt.Printf("Running: %s\n", check.TestName()) 112 113 var err error 114 var pgs []*types.PortGroupRecordType 115 116 switch vcd.config.VCD.ExternalNetworkPortGroupType { 117 case types.ExternalNetworkBackingDvPortgroup: 118 pgs, err = QueryDistributedPortGroup(vcd.client, vcd.config.VCD.ExternalNetworkPortGroup) 119 case types.ExternalNetworkBackingTypeNetwork: 120 pgs, err = QueryNetworkPortGroup(vcd.client, vcd.config.VCD.ExternalNetworkPortGroup) 121 default: 122 check.Errorf("unrecognized external network portgroup type: %s", vcd.config.VCD.ExternalNetworkPortGroupType) 123 } 124 check.Assert(err, IsNil) 125 check.Assert(len(pgs), Equals, 1) 126 127 // Query 128 vcHref, err := getVcenterHref(vcd.client, vcd.config.VCD.VimServer) 129 check.Assert(err, IsNil) 130 vcUuid := extractUuid(vcHref) 131 132 vcUrn, err := BuildUrnWithUuid("urn:vcloud:vimserver:", vcUuid) 133 check.Assert(err, IsNil) 134 135 net := testExternalNetworkV2(vcd, check.TestName(), vcd.config.VCD.ExternalNetworkPortGroupType, pgs[0].MoRef, vcUrn, false, "") 136 137 r, err := CreateExternalNetworkV2(vcd.client, net) 138 check.Assert(err, IsNil) 139 140 // Use generic "OpenApiEntity" resource cleanup type 141 openApiEndpoint := endpoint + r.ExternalNetwork.ID 142 AddToCleanupListOpenApi(r.ExternalNetwork.Name, check.TestName(), openApiEndpoint) 143 144 r.ExternalNetwork.Name = check.TestName() + "changed_name" 145 updatedNet, err := r.Update() 146 check.Assert(err, IsNil) 147 check.Assert(updatedNet.ExternalNetwork.Name, Equals, r.ExternalNetwork.Name) 148 149 err = r.Delete() 150 check.Assert(err, IsNil) 151 } 152 153 func testExternalNetworkV2(vcd *TestVCD, name, backingType, backingId, NetworkProviderId string, useIpSpace bool, ownerOrgId string) *types.ExternalNetworkV2 { 154 net := &types.ExternalNetworkV2{ 155 ID: "", 156 Name: name, 157 Description: "", 158 Subnets: types.ExternalNetworkV2Subnets{Values: []types.ExternalNetworkV2Subnet{ 159 { 160 Gateway: "1.1.1.1", 161 PrefixLength: 24, 162 DNSSuffix: "", 163 DNSServer1: "", 164 DNSServer2: "", 165 IPRanges: types.ExternalNetworkV2IPRanges{Values: []types.ExternalNetworkV2IPRange{ 166 { 167 StartAddress: "1.1.1.3", 168 EndAddress: "1.1.1.50", 169 }, 170 }}, 171 Enabled: true, 172 UsedIPCount: 0, 173 TotalIPCount: 0, 174 }, 175 }}, 176 NetworkBackings: types.ExternalNetworkV2Backings{Values: []types.ExternalNetworkV2Backing{ 177 { 178 BackingID: backingId, 179 NetworkProvider: types.NetworkProvider{ 180 ID: NetworkProviderId, 181 }, 182 BackingTypeValue: backingType, 183 }, 184 }}, 185 } 186 187 if useIpSpace { 188 // removing subnet definition when using IP Spaces 189 net.Subnets = types.ExternalNetworkV2Subnets{} 190 net.UsingIpSpace = &useIpSpace 191 } 192 193 if ownerOrgId != "" { 194 net.DedicatedOrg = &types.OpenApiReference{ID: ownerOrgId} 195 } 196 197 return net 198 } 199 200 func (vcd *TestVCD) Test_CreateExternalNetworkV2NsxtIpSpaceT0(check *C) { 201 if vcd.client.Client.APIVCDMaxVersionIs("< 37.1") { 202 check.Skip("IP Spaces are supported in VCD 10.4.1+") 203 } 204 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.Tier0router, types.ExternalNetworkBackingTypeNsxtTier0Router, true, "") 205 } 206 207 func (vcd *TestVCD) Test_CreateExternalNetworkV2NsxtIpSpaceVrf(check *C) { 208 if vcd.client.Client.APIVCDMaxVersionIs("< 37.1") { 209 check.Skip("IP Spaces are supported in VCD 10.4.1+") 210 } 211 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.Tier0routerVrf, types.ExternalNetworkBackingTypeNsxtTier0Router, true, "") 212 } 213 214 func (vcd *TestVCD) Test_CreateExternalNetworkV2NsxtIpSpaceT0DedicatedOrg(check *C) { 215 if vcd.client.Client.APIVCDMaxVersionIs("< 37.1") { 216 check.Skip("IP Spaces are supported in VCD 10.4.1+") 217 } 218 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.Tier0router, types.ExternalNetworkBackingTypeNsxtTier0Router, true, vcd.org.Org.ID) 219 } 220 221 func (vcd *TestVCD) Test_CreateExternalNetworkV2NsxtIpSpaceVrfDedicatedOrg(check *C) { 222 if vcd.client.Client.APIVCDMaxVersionIs("< 37.1") { 223 check.Skip("IP Spaces are supported in VCD 10.4.1+") 224 } 225 vcd.testCreateExternalNetworkV2Nsxt(check, vcd.config.VCD.Nsxt.Tier0routerVrf, types.ExternalNetworkBackingTypeNsxtTier0Router, true, vcd.org.Org.ID) 226 } 227 228 func getVcenterHref(vcdClient *VCDClient, name string) (string, error) { 229 virtualCenters, err := QueryVirtualCenters(vcdClient, fmt.Sprintf("(name==%s)", name)) 230 if err != nil { 231 return "", err 232 } 233 if len(virtualCenters) == 0 || len(virtualCenters) > 1 { 234 return "", fmt.Errorf("vSphere server found %d instances with name '%s' while expected one", len(virtualCenters), name) 235 } 236 return virtualCenters[0].HREF, nil 237 }