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 }