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  }