github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_application_profile_test.go (about)

     1  //go:build network || nsxt || functional || openapi || ALL
     2  
     3  package govcd
     4  
     5  import (
     6  	"fmt"
     7  	"net/url"
     8  
     9  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    10  	. "gopkg.in/check.v1"
    11  )
    12  
    13  func (vcd *TestVCD) Test_NsxtApplicationPortProfileProvider(check *C) {
    14  	skipNoNsxtConfiguration(vcd, check)
    15  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointAppPortProfiles)
    16  	vcd.skipIfNotSysAdmin(check)
    17  
    18  	appPortProfileConfig := getAppProfileProvider(vcd, check)
    19  	testAppPortProfile(appPortProfileConfig, types.ApplicationPortProfileScopeProvider, vcd, check)
    20  }
    21  
    22  func (vcd *TestVCD) Test_NsxtApplicationPortProfileTenant(check *C) {
    23  	vcd.skipIfNotSysAdmin(check)
    24  	skipNoNsxtConfiguration(vcd, check)
    25  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointAppPortProfiles)
    26  
    27  	appPortProfileConfig := getAppProfileTenant(vcd, check)
    28  	testAppPortProfile(appPortProfileConfig, types.ApplicationPortProfileScopeTenant, vcd, check)
    29  }
    30  
    31  func (vcd *TestVCD) Test_NsxtApplicationPortProfileReadSystem(check *C) {
    32  	skipNoNsxtConfiguration(vcd, check)
    33  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointAppPortProfiles)
    34  
    35  	testApplicationProfilesForScope(types.ApplicationPortProfileScopeSystem, check, vcd)
    36  }
    37  
    38  func (vcd *TestVCD) Test_NsxtApplicationPortProfileReadProvider(check *C) {
    39  	skipNoNsxtConfiguration(vcd, check)
    40  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointAppPortProfiles)
    41  
    42  	testApplicationProfilesForScope(types.ApplicationPortProfileScopeProvider, check, vcd)
    43  }
    44  
    45  func (vcd *TestVCD) Test_NsxtApplicationPortProfileReadTenant(check *C) {
    46  	skipNoNsxtConfiguration(vcd, check)
    47  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointAppPortProfiles)
    48  
    49  	testApplicationProfilesForScope(types.ApplicationPortProfileScopeTenant, check, vcd)
    50  }
    51  
    52  func getAppProfileProvider(vcd *TestVCD, check *C) *types.NsxtAppPortProfile {
    53  	nsxtManager, err := vcd.client.QueryNsxtManagerByName(vcd.config.VCD.Nsxt.Manager)
    54  	check.Assert(err, IsNil)
    55  
    56  	nsxtManagerUuid, err := GetUuidFromHref(nsxtManager[0].HREF, true)
    57  	check.Assert(err, IsNil)
    58  
    59  	nsxtManagerUrn, err := BuildUrnWithUuid("urn:vcloud:nsxtmanager:", nsxtManagerUuid)
    60  	check.Assert(err, IsNil)
    61  
    62  	// For PROVIDER scope application port profile must have ContextEntityId set as NSX-T Managers URN and no Org
    63  	appPortProfileConfig := &types.NsxtAppPortProfile{
    64  		Name:        check.TestName() + "PROVIDER",
    65  		Description: "Provider config",
    66  		ApplicationPorts: []types.NsxtAppPortProfilePort{
    67  			types.NsxtAppPortProfilePort{
    68  				Protocol:         "TCP",
    69  				DestinationPorts: []string{"11000-12000"},
    70  			},
    71  		},
    72  		ContextEntityId: nsxtManagerUrn,
    73  		Scope:           types.ApplicationPortProfileScopeProvider,
    74  	}
    75  	return appPortProfileConfig
    76  }
    77  
    78  func getAppProfileTenant(vcd *TestVCD, check *C) *types.NsxtAppPortProfile {
    79  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
    80  	check.Assert(err, IsNil)
    81  
    82  	// For PROVIDER scope application port profile must have ContextEntityId set as NSX-T Managers URN and no Org
    83  	appPortProfileConfig := &types.NsxtAppPortProfile{
    84  		Name:        check.TestName() + "TENANT",
    85  		Description: "Provider config",
    86  		ApplicationPorts: []types.NsxtAppPortProfilePort{
    87  			types.NsxtAppPortProfilePort{
    88  				Protocol:         "ICMPv4",
    89  				DestinationPorts: []string{"any"},
    90  			},
    91  		},
    92  		OrgRef: &types.OpenApiReference{ID: org.Org.ID, Name: org.Org.Name},
    93  
    94  		ContextEntityId: vcd.nsxtVdc.Vdc.ID, // VDC ID
    95  		Scope:           types.ApplicationPortProfileScopeTenant,
    96  	}
    97  	return appPortProfileConfig
    98  }
    99  
   100  func testAppPortProfile(appPortProfileConfig *types.NsxtAppPortProfile, scope string, vcd *TestVCD, check *C) {
   101  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
   102  	check.Assert(err, IsNil)
   103  	appProfile, err := org.CreateNsxtAppPortProfile(appPortProfileConfig)
   104  	check.Assert(err, IsNil)
   105  
   106  	openApiEndpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAppPortProfiles + appProfile.NsxtAppPortProfile.ID
   107  	AddToCleanupListOpenApi(appProfile.NsxtAppPortProfile.Name, check.TestName(), openApiEndpoint)
   108  
   109  	appPortProfileConfig.ID = appProfile.NsxtAppPortProfile.ID // Inject ID into original creation
   110  	appPortProfileConfig.ContextEntityId = ""                  // Remove NSX-T Manager URN because read does not return it
   111  	check.Assert(appProfile.NsxtAppPortProfile, DeepEquals, appPortProfileConfig)
   112  
   113  	// Check update
   114  	appProfile.NsxtAppPortProfile.Description = appProfile.NsxtAppPortProfile.Description + "-Update"
   115  	updatedAppProfile, err := appProfile.Update(appProfile.NsxtAppPortProfile)
   116  	check.Assert(err, IsNil)
   117  	check.Assert(updatedAppProfile.NsxtAppPortProfile, DeepEquals, appProfile.NsxtAppPortProfile)
   118  
   119  	// Check lookup
   120  	foundAppProfileById, err := org.GetNsxtAppPortProfileById(appProfile.NsxtAppPortProfile.ID)
   121  	check.Assert(err, IsNil)
   122  	check.Assert(foundAppProfileById.NsxtAppPortProfile, DeepEquals, appProfile.NsxtAppPortProfile)
   123  
   124  	foundAppProfileByName, err := org.GetNsxtAppPortProfileByName(appProfile.NsxtAppPortProfile.Name, scope)
   125  	check.Assert(err, IsNil)
   126  	check.Assert(foundAppProfileByName.NsxtAppPortProfile, DeepEquals, foundAppProfileById.NsxtAppPortProfile)
   127  
   128  	// Check VDC and VDC Group lookup
   129  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
   130  	check.Assert(err, IsNil)
   131  	check.Assert(adminOrg, NotNil)
   132  	vdc, vdcGroup := test_CreateVdcGroup(check, adminOrg, vcd)
   133  
   134  	// Lookup by VDC
   135  	foundAppProfileByNameInVdc, err := vdc.GetNsxtAppPortProfileByName(appProfile.NsxtAppPortProfile.Name, scope)
   136  	check.Assert(err, IsNil)
   137  	check.Assert(foundAppProfileByNameInVdc.NsxtAppPortProfile, DeepEquals, foundAppProfileById.NsxtAppPortProfile)
   138  
   139  	foundAppProfileByNameInVdcGroup, err := vdcGroup.GetNsxtAppPortProfileByName(appProfile.NsxtAppPortProfile.Name, scope)
   140  	check.Assert(err, IsNil)
   141  	check.Assert(foundAppProfileByNameInVdcGroup.NsxtAppPortProfile, DeepEquals, foundAppProfileById.NsxtAppPortProfile)
   142  	// Remove VDC group
   143  	err = vdcGroup.Delete()
   144  	check.Assert(err, IsNil)
   145  	err = vdc.DeleteWait(true, true)
   146  	check.Assert(err, IsNil)
   147  
   148  	err = appProfile.Delete()
   149  	check.Assert(err, IsNil)
   150  
   151  	// Expect a not found error
   152  	_, err = org.GetNsxtAppPortProfileById(appProfile.NsxtAppPortProfile.ID)
   153  	check.Assert(ContainsNotFound(err), Equals, true)
   154  
   155  	_, err = org.GetNsxtAppPortProfileByName(appProfile.NsxtAppPortProfile.Name, scope)
   156  	check.Assert(ContainsNotFound(err), Equals, true)
   157  }
   158  
   159  func testApplicationProfilesForScope(scope string, check *C, vcd *TestVCD) {
   160  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
   161  	check.Assert(err, IsNil)
   162  
   163  	resultCount := getResultCountByScope(scope, check, vcd)
   164  	if testVerbose {
   165  		fmt.Printf("# API shows results for scope '%s': %d\n", scope, resultCount)
   166  	}
   167  
   168  	appProfileSlice, err := org.GetAllNsxtAppPortProfiles(nil, scope)
   169  	check.Assert(err, IsNil)
   170  
   171  	if testVerbose {
   172  		fmt.Printf("# Paginated item number for scope '%s': %d\n", scope, len(appProfileSlice))
   173  	}
   174  
   175  	// Ensure the amount of results is exactly the same as returned by getResultCountByScope which makes sure that
   176  	// pagination is not broken.
   177  	check.Assert(len(appProfileSlice), Equals, resultCount)
   178  }
   179  
   180  func getResultCountByScope(scope string, check *C, vcd *TestVCD) int {
   181  	// Get element count by using a simple query and parse response directly to compare it against paginated list of items
   182  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAppPortProfiles
   183  	skipOpenApiEndpointTest(vcd, check, endpoint)
   184  	apiVersion, err := vcd.client.Client.checkOpenApiEndpointCompatibility(endpoint)
   185  	check.Assert(err, IsNil)
   186  
   187  	urlRef, err := vcd.client.Client.OpenApiBuildEndpoint(endpoint)
   188  	check.Assert(err, IsNil)
   189  
   190  	// Limit search of audits trails to the last 12 hours so that it doesn't take too long and set pageSize to be 1 result
   191  	// to force following pages
   192  	queryParams := url.Values{}
   193  	queryParams.Add("filter", "scope=="+scope)
   194  
   195  	result := struct {
   196  		Resulttotal int `json:"resultTotal"`
   197  	}{}
   198  
   199  	err = vcd.vdc.client.OpenApiGetItem(apiVersion, urlRef, queryParams, &result, nil)
   200  	check.Assert(err, IsNil)
   201  	return result.Resulttotal
   202  }