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

     1  //go:build nsxt || alb || functional || ALL
     2  
     3  package govcd
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"github.com/vmware/go-vcloud-director/v2/types/v56"
     9  
    10  	. "gopkg.in/check.v1"
    11  )
    12  
    13  func (vcd *TestVCD) Test_AlbPool(check *C) {
    14  	if vcd.skipAdminTests {
    15  		check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
    16  	}
    17  	skipNoNsxtAlbConfiguration(vcd, check)
    18  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointAlbEdgeGateway)
    19  
    20  	// Setup prerequisite components
    21  	controller, cloud, seGroup, edge, assignment := setupAlbPoolPrerequisites(check, vcd)
    22  
    23  	// Setup Org user and connection
    24  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.config.VCD.Org)
    25  	check.Assert(err, IsNil)
    26  	orgUserVcdClient, orgUser, err := newOrgUserConnection(adminOrg, "alb-pool-testing", "CHANGE-ME", vcd.config.Provider.Url, true)
    27  	check.Assert(err, IsNil)
    28  
    29  	// defer prerequisite teardown
    30  	defer func() { tearDownAlbPoolPrerequisites(check, assignment, edge, seGroup, cloud, controller) }()
    31  
    32  	// Run tests with System user
    33  	testMinimalPoolConfig(check, edge, vcd, vcd.client)
    34  	testAdvancedPoolConfig(check, edge, vcd, vcd.client)
    35  	testPoolWithCertNoPrivateKey(check, vcd, edge.EdgeGateway.ID, vcd.client)
    36  	testPoolWithCertAndPrivateKey(check, vcd, edge.EdgeGateway.ID, vcd.client)
    37  
    38  	// Run tests with Org admin user
    39  	testMinimalPoolConfig(check, edge, vcd, orgUserVcdClient)
    40  	testAdvancedPoolConfig(check, edge, vcd, orgUserVcdClient)
    41  	testPoolWithCertNoPrivateKey(check, vcd, edge.EdgeGateway.ID, orgUserVcdClient)
    42  	testPoolWithCertAndPrivateKey(check, vcd, edge.EdgeGateway.ID, orgUserVcdClient)
    43  
    44  	// Cleanup Org user
    45  	err = orgUser.Delete(true)
    46  	check.Assert(err, IsNil)
    47  }
    48  
    49  func testMinimalPoolConfig(check *C, edge *NsxtEdgeGateway, vcd *TestVCD, client *VCDClient) {
    50  	poolConfigMinimal := &types.NsxtAlbPool{
    51  		Name:       check.TestName() + "Minimal",
    52  		GatewayRef: types.OpenApiReference{ID: edge.EdgeGateway.ID},
    53  	}
    54  
    55  	poolConfigMinimalUpdated := &types.NsxtAlbPool{
    56  		Name:       poolConfigMinimal.Name + "-updated",
    57  		GatewayRef: types.OpenApiReference{ID: edge.EdgeGateway.ID},
    58  	}
    59  
    60  	testAlbPoolConfig(check, vcd, "Minimal", poolConfigMinimal, poolConfigMinimalUpdated, client)
    61  }
    62  
    63  func testAdvancedPoolConfig(check *C, edge *NsxtEdgeGateway, vcd *TestVCD, client *VCDClient) {
    64  	poolConfigAdvanced := &types.NsxtAlbPool{
    65  		Name:                     check.TestName() + "-Advanced",
    66  		GatewayRef:               types.OpenApiReference{ID: edge.EdgeGateway.ID},
    67  		Algorithm:                "FEWEST_SERVERS",
    68  		DefaultPort:              addrOf(8443),
    69  		GracefulTimeoutPeriod:    addrOf(1),
    70  		PassiveMonitoringEnabled: addrOf(true),
    71  		HealthMonitors:           nil,
    72  		Members: []types.NsxtAlbPoolMember{
    73  			{
    74  				Enabled:   true,
    75  				IpAddress: "1.1.1.1",
    76  				Port:      8400,
    77  				Ratio:     addrOf(2),
    78  			},
    79  			{
    80  				Enabled:   false,
    81  				IpAddress: "1.1.1.2",
    82  			},
    83  			{
    84  				Enabled:   true,
    85  				IpAddress: "1.1.1.3",
    86  			},
    87  		},
    88  		PersistenceProfile: &types.NsxtAlbPoolPersistenceProfile{
    89  			Name:  "PersistenceProfile1",
    90  			Type:  "CLIENT_IP",
    91  			Value: "",
    92  		},
    93  	}
    94  
    95  	poolConfigAdvancedUpdated := &types.NsxtAlbPool{
    96  		Name:                     poolConfigAdvanced.Name + "-Updated",
    97  		GatewayRef:               types.OpenApiReference{ID: edge.EdgeGateway.ID},
    98  		Enabled:                  addrOf(false),
    99  		Algorithm:                "LEAST_LOAD",
   100  		GracefulTimeoutPeriod:    addrOf(0),
   101  		PassiveMonitoringEnabled: addrOf(false),
   102  		HealthMonitors:           nil,
   103  		Members: []types.NsxtAlbPoolMember{
   104  			{
   105  				Enabled:   true,
   106  				IpAddress: "1.1.1.1",
   107  				Port:      8300,
   108  				Ratio:     addrOf(3),
   109  			},
   110  			{
   111  				Enabled:   true,
   112  				IpAddress: "1.1.1.2",
   113  			},
   114  		},
   115  		PersistenceProfile: nil,
   116  	}
   117  
   118  	testAlbPoolConfig(check, vcd, "Advanced", poolConfigAdvanced, poolConfigAdvancedUpdated, client)
   119  }
   120  
   121  func testPoolWithCertNoPrivateKey(check *C, vcd *TestVCD, edgeGatewayId string, client *VCDClient) {
   122  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name)
   123  	check.Assert(err, IsNil)
   124  	check.Assert(adminOrg, NotNil)
   125  
   126  	certificateConfigWithoutPrivateKey := &types.CertificateLibraryItem{
   127  		Alias:       check.TestName(),
   128  		Certificate: certificate,
   129  	}
   130  	openApiEndpoint, err := getEndpointByVersion(&vcd.client.Client)
   131  	check.Assert(err, IsNil)
   132  	createdCertificate, err := adminOrg.AddCertificateToLibrary(certificateConfigWithoutPrivateKey)
   133  	check.Assert(err, IsNil)
   134  	PrependToCleanupListOpenApi(createdCertificate.CertificateLibrary.Alias, check.TestName(), openApiEndpoint+createdCertificate.CertificateLibrary.Id)
   135  
   136  	poolConfigWithCert := &types.NsxtAlbPool{
   137  		Name:                   check.TestName() + "-complicated",
   138  		GatewayRef:             types.OpenApiReference{ID: edgeGatewayId},
   139  		Algorithm:              "FASTEST_RESPONSE",
   140  		CaCertificateRefs:      []types.OpenApiReference{types.OpenApiReference{ID: createdCertificate.CertificateLibrary.Id}},
   141  		CommonNameCheckEnabled: addrOf(true),
   142  		DomainNames:            []string{"one", "two", "three"},
   143  		DefaultPort:            addrOf(1211),
   144  		SslEnabled:             addrOf(true),
   145  	}
   146  
   147  	testAlbPoolConfig(check, vcd, "CertificateWithNoPrivateKey", poolConfigWithCert, nil, client)
   148  
   149  	err = createdCertificate.Delete()
   150  	check.Assert(err, IsNil)
   151  }
   152  
   153  func testPoolWithCertAndPrivateKey(check *C, vcd *TestVCD, edgeGatewayId string, client *VCDClient) {
   154  	adminOrg, err := vcd.client.GetAdminOrgByName(vcd.org.Org.Name)
   155  	check.Assert(err, IsNil)
   156  	check.Assert(adminOrg, NotNil)
   157  
   158  	certificateConfigWithoutPrivateKey := &types.CertificateLibraryItem{
   159  		Alias:                check.TestName(),
   160  		Certificate:          certificate,
   161  		PrivateKey:           privateKey,
   162  		PrivateKeyPassphrase: "test",
   163  	}
   164  
   165  	openApiEndpoint, err := getEndpointByVersion(&vcd.client.Client)
   166  	check.Assert(err, IsNil)
   167  	createdCertificate, err := adminOrg.AddCertificateToLibrary(certificateConfigWithoutPrivateKey)
   168  	check.Assert(err, IsNil)
   169  	PrependToCleanupListOpenApi(createdCertificate.CertificateLibrary.Alias, check.TestName(), openApiEndpoint+createdCertificate.CertificateLibrary.Id)
   170  
   171  	poolConfigWithCertAndKey := &types.NsxtAlbPool{
   172  		Name:       check.TestName() + "-complicated",
   173  		GatewayRef: types.OpenApiReference{ID: edgeGatewayId},
   174  
   175  		Algorithm:         "FASTEST_RESPONSE",
   176  		CaCertificateRefs: []types.OpenApiReference{types.OpenApiReference{ID: createdCertificate.CertificateLibrary.Id}},
   177  		DefaultPort:       addrOf(1211),
   178  		SslEnabled:        addrOf(true),
   179  	}
   180  
   181  	testAlbPoolConfig(check, vcd, "CertificateWithPrivateKey", poolConfigWithCertAndKey, nil, client)
   182  
   183  	err = createdCertificate.Delete()
   184  	check.Assert(err, IsNil)
   185  }
   186  
   187  func testAlbPoolConfig(check *C, vcd *TestVCD, name string, setupConfig *types.NsxtAlbPool, updateConfig *types.NsxtAlbPool, client *VCDClient) {
   188  	fmt.Printf("# Running ALB Pool test with config %s ('System' user: %t) ", name, client.Client.IsSysAdmin)
   189  
   190  	edge, err := vcd.nsxtVdc.GetNsxtEdgeGatewayByName(vcd.config.VCD.Nsxt.EdgeGateway)
   191  	check.Assert(err, IsNil)
   192  
   193  	createdPool, err := client.CreateNsxtAlbPool(setupConfig)
   194  	check.Assert(err, IsNil)
   195  	check.Assert(createdPool, NotNil)
   196  	check.Assert(createdPool.NsxtAlbPool, NotNil)
   197  
   198  	// Verify mandatory fields
   199  	check.Assert(createdPool.NsxtAlbPool.ID, NotNil)
   200  	check.Assert(createdPool.NsxtAlbPool.Name, NotNil)
   201  	check.Assert(createdPool.NsxtAlbPool.GatewayRef.ID, NotNil)
   202  
   203  	openApiEndpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbPools + createdPool.NsxtAlbPool.ID
   204  	PrependToCleanupListOpenApi(createdPool.NsxtAlbPool.Name, check.TestName(), openApiEndpoint)
   205  
   206  	// Get By ID
   207  	poolById, err := client.GetAlbPoolById(createdPool.NsxtAlbPool.ID)
   208  	check.Assert(err, IsNil)
   209  	check.Assert(poolById.NsxtAlbPool.ID, Equals, createdPool.NsxtAlbPool.ID)
   210  	check.Assert(poolById, NotNil)
   211  	check.Assert(poolById.NsxtAlbPool, NotNil)
   212  
   213  	// Get By Name
   214  	poolByName, err := client.GetAlbPoolByName(edge.EdgeGateway.ID, createdPool.NsxtAlbPool.Name)
   215  	check.Assert(err, IsNil)
   216  	check.Assert(poolByName.NsxtAlbPool.ID, Equals, createdPool.NsxtAlbPool.ID)
   217  	check.Assert(poolByName, NotNil)
   218  	check.Assert(poolByName.NsxtAlbPool, NotNil)
   219  
   220  	// Get All Pool summaries
   221  	allPoolSummaries, err := client.GetAllAlbPoolSummaries(edge.EdgeGateway.ID, nil)
   222  	check.Assert(err, IsNil)
   223  	check.Assert(len(allPoolSummaries) > 0, Equals, true)
   224  
   225  	// Get All Pools
   226  	allPools, err := client.GetAllAlbPools(edge.EdgeGateway.ID, nil)
   227  	check.Assert(err, IsNil)
   228  	check.Assert(len(allPools) > 0, Equals, true)
   229  
   230  	check.Assert(len(allPoolSummaries), Equals, len(allPools))
   231  
   232  	// Attempt an update if config is provided
   233  	if updateConfig != nil {
   234  		updateConfig.ID = createdPool.NsxtAlbPool.ID
   235  		updatedPool, err := createdPool.Update(updateConfig)
   236  		check.Assert(err, IsNil)
   237  		check.Assert(createdPool.NsxtAlbPool.ID, Equals, updatedPool.NsxtAlbPool.ID)
   238  		check.Assert(updatedPool.NsxtAlbPool.Name, NotNil)
   239  		check.Assert(updatedPool.NsxtAlbPool.GatewayRef.ID, NotNil)
   240  		check.Assert(updatedPool, NotNil)
   241  		check.Assert(updatedPool.NsxtAlbPool, NotNil)
   242  	}
   243  
   244  	err = createdPool.Delete()
   245  	check.Assert(err, IsNil)
   246  	fmt.Printf("Done.\n")
   247  }
   248  
   249  func setupAlbPoolPrerequisites(check *C, vcd *TestVCD) (*NsxtAlbController, *NsxtAlbCloud, *NsxtAlbServiceEngineGroup, *NsxtEdgeGateway, *NsxtAlbServiceEngineGroupAssignment) {
   250  	controller, cloud, seGroup := spawnAlbControllerCloudServiceEngineGroup(vcd, check, "SHARED")
   251  	edge, err := vcd.nsxtVdc.GetNsxtEdgeGatewayByName(vcd.config.VCD.Nsxt.EdgeGateway)
   252  	check.Assert(err, IsNil)
   253  
   254  	// Enable ALB on Edge Gateway with default ServiceNetworkDefinition
   255  	albSettingsConfig := &types.NsxtAlbConfig{
   256  		Enabled: true,
   257  	}
   258  
   259  	// Field is only available when using API version v37.0 onwards
   260  	if vcd.client.Client.APIVCDMaxVersionIs(">= 37.0") {
   261  		albSettingsConfig.SupportedFeatureSet = "PREMIUM"
   262  	}
   263  
   264  	// Enable IPv6 service network definition (VCD 10.4.0+)
   265  	if vcd.client.Client.APIVCDMaxVersionIs(">= 37.0") {
   266  		printVerbose("# Enabling IPv6 service network definition (VCD 10.4.0+)\n")
   267  		albSettingsConfig.ServiceNetworkDefinition = "192.168.255.125/25"
   268  		albSettingsConfig.Ipv6ServiceNetworkDefinition = "2001:0db8:85a3:0000:0000:8a2e:0370:7334/120"
   269  	}
   270  
   271  	// Enable Transparent mode on VCD >= 10.4.1
   272  	if vcd.client.Client.APIVCDMaxVersionIs(">= 37.1") {
   273  		printVerbose("# Enabling Transparent mode on Edge Gateway (VCD 10.4.1+)\n")
   274  		albSettingsConfig.TransparentModeEnabled = addrOf(true)
   275  	}
   276  
   277  	enabledSettings, err := edge.UpdateAlbSettings(albSettingsConfig)
   278  	if err != nil {
   279  		fmt.Printf("# error occured while enabling ALB on Edge Gateway. Cleaning up Service Engine Group, ALB Cloud and ALB Controller: %s", err)
   280  		err2 := seGroup.Delete()
   281  		if err2 != nil {
   282  			fmt.Printf("# got error while cleaning up Service Engine Group: %s", err)
   283  		}
   284  		err2 = cloud.Delete()
   285  		if err2 != nil {
   286  			fmt.Printf("# got error while cleaning up ALB Cloud: %s", err)
   287  		}
   288  		err2 = controller.Delete()
   289  		if err2 != nil {
   290  			fmt.Printf("# got error while cleaning up ALB Controller: %s", err)
   291  		}
   292  	}
   293  	check.Assert(err, IsNil)
   294  	check.Assert(enabledSettings.Enabled, Equals, true)
   295  	PrependToCleanupList(check.TestName()+"-ALB-settings", "OpenApiEntityAlbSettingsDisable", edge.EdgeGateway.Name, check.TestName())
   296  
   297  	serviceEngineGroupAssignmentConfig := &types.NsxtAlbServiceEngineGroupAssignment{
   298  		GatewayRef:            &types.OpenApiReference{ID: edge.EdgeGateway.ID},
   299  		ServiceEngineGroupRef: &types.OpenApiReference{ID: seGroup.NsxtAlbServiceEngineGroup.ID},
   300  		MaxVirtualServices:    addrOf(89),
   301  		MinVirtualServices:    addrOf(20),
   302  	}
   303  
   304  	assignment, err := vcd.client.CreateAlbServiceEngineGroupAssignment(serviceEngineGroupAssignmentConfig)
   305  	check.Assert(err, IsNil)
   306  	check.Assert(assignment.NsxtAlbServiceEngineGroupAssignment.ID, Not(Equals), "")
   307  	openApiEndpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroupAssignments + assignment.NsxtAlbServiceEngineGroupAssignment.ID
   308  	PrependToCleanupListOpenApi(assignment.NsxtAlbServiceEngineGroupAssignment.ServiceEngineGroupRef.Name, check.TestName(), openApiEndpoint)
   309  	return controller, cloud, seGroup, edge, assignment
   310  }
   311  
   312  func tearDownAlbPoolPrerequisites(check *C, assignment *NsxtAlbServiceEngineGroupAssignment, edge *NsxtEdgeGateway, seGroup *NsxtAlbServiceEngineGroup, cloud *NsxtAlbCloud, controller *NsxtAlbController) {
   313  	err := assignment.Delete()
   314  	check.Assert(err, IsNil)
   315  	err = edge.DisableAlb()
   316  	check.Assert(err, IsNil)
   317  	err = seGroup.Delete()
   318  	check.Assert(err, IsNil)
   319  	err = cloud.Delete()
   320  	check.Assert(err, IsNil)
   321  	err = controller.Delete()
   322  	check.Assert(err, IsNil)
   323  }