Skip to content

Commit 693e518

Browse files
authored
Add support for NSX-T Alb General Settings in NSX-T Edge Gateway (#403)
This PR starts adding NSX-T ALB support for Tenant view. It is in tenant view, but still requires System user (just like creating an edge gateway) This is the first resource in series to allow controlling ALB on NSX-T Edge Gateway. It still requires system user to modify, just as creating an edge gateway, but is presented in Tenants view
1 parent a9cf9f3 commit 693e518

9 files changed

+203
-1
lines changed

.changes/v2.14.0/403-features.md

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
* Added type `NsxtAlbConfig` and functions `NsxtEdgeGateway.UpdateAlbSettings`, `NsxtEdgeGateway.GetAlbSettings`,
2+
`NsxtEdgeGateway.DisableAlb` [GH-403]

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.14.0 (Unreleased)
2+
3+
Changes in progress for v2.14.0 are available at [.changes/v2.14.0](https://github.com/vmware/go-vcloud-director/tree/master/.changes/v2.14.0) until the release.
4+
5+
16
## 2.13.0 (September 30, 2021)
27

38
## FEATURES

govcd/nsxt_alb_clouds_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func spawnAlbControllerAndCloud(vcd *TestVCD, check *C) (*NsxtAlbController, *Ns
115115
check.Assert(err, IsNil)
116116

117117
openApiEndpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbCloud + createdAlbCloud.NsxtAlbCloud.ID
118-
AddToCleanupListOpenApi(createdAlbCloud.NsxtAlbCloud.Name, check.TestName(), openApiEndpoint)
118+
PrependToCleanupListOpenApi(createdAlbCloud.NsxtAlbCloud.Name, check.TestName(), openApiEndpoint)
119119

120120
return albController, createdAlbCloud
121121
}

govcd/nsxt_alb_service_engine_groups_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,34 @@ func (vcd *TestVCD) Test_GetAllAlbServiceEngineGroups(check *C) {
7878
err = controller.Delete()
7979
check.Assert(err, IsNil)
8080
}
81+
82+
// spawnAlbControllerCloudServiceEngineGroup is a helper function to spawn NSX-T ALB Controller, ALB Cloud, and ALB
83+
// Service Engine Group
84+
func spawnAlbControllerCloudServiceEngineGroup(vcd *TestVCD, check *C) (*NsxtAlbController, *NsxtAlbCloud, *NsxtAlbServiceEngineGroup) {
85+
skipNoNsxtAlbConfiguration(vcd, check)
86+
87+
albController, createdAlbCloud := spawnAlbControllerAndCloud(vcd, check)
88+
89+
importableSeGroups, err := vcd.client.GetAllAlbImportableServiceEngineGroups(createdAlbCloud.NsxtAlbCloud.ID, nil)
90+
check.Assert(err, IsNil)
91+
check.Assert(len(importableSeGroups) > 0, Equals, true)
92+
albSeGroup := &types.NsxtAlbServiceEngineGroup{
93+
Name: check.TestName() + "SE-group",
94+
Description: "Service Engine Group created by " + check.TestName(),
95+
ReservationType: "DEDICATED",
96+
ServiceEngineGroupBacking: types.ServiceEngineGroupBacking{
97+
BackingId: importableSeGroups[0].NsxtAlbImportableServiceEngineGroups.ID,
98+
LoadBalancerCloudRef: &types.OpenApiReference{
99+
ID: createdAlbCloud.NsxtAlbCloud.ID,
100+
},
101+
},
102+
}
103+
104+
createdSeGroup, err := vcd.client.CreateNsxtAlbServiceEngineGroup(albSeGroup)
105+
check.Assert(err, IsNil)
106+
107+
openApiEndpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups + createdSeGroup.NsxtAlbServiceEngineGroup.ID
108+
PrependToCleanupListOpenApi(createdSeGroup.NsxtAlbServiceEngineGroup.Name, check.TestName(), openApiEndpoint)
109+
110+
return albController, createdAlbCloud, createdSeGroup
111+
}

govcd/nsxt_alb_settings.go

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package govcd
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/vmware/go-vcloud-director/v2/types/v56"
7+
)
8+
9+
// GetAlbSettings retrieves NSX-T ALB settings for a particular Edge Gateway
10+
func (egw *NsxtEdgeGateway) GetAlbSettings() (*types.NsxtAlbConfig, error) {
11+
client := egw.client
12+
endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayAlb
13+
apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
14+
if err != nil {
15+
return nil, err
16+
}
17+
18+
urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID))
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
typeResponse := &types.NsxtAlbConfig{}
24+
err = client.OpenApiGetItem(apiVersion, urlRef, nil, &typeResponse, nil)
25+
if err != nil {
26+
return nil, err
27+
}
28+
29+
return typeResponse, nil
30+
}
31+
32+
// UpdateAlbSettings updates NSX-T ALB settings for a particular Edge Gateway
33+
func (egw *NsxtEdgeGateway) UpdateAlbSettings(config *types.NsxtAlbConfig) (*types.NsxtAlbConfig, error) {
34+
client := egw.client
35+
endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayAlb
36+
apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
37+
if err != nil {
38+
return nil, err
39+
}
40+
41+
urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID))
42+
if err != nil {
43+
return nil, err
44+
}
45+
46+
typeResponse := &types.NsxtAlbConfig{}
47+
err = client.OpenApiPutItem(apiVersion, urlRef, nil, config, typeResponse, nil)
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
return typeResponse, nil
53+
}
54+
55+
// DisableAlb is a shortcut wrapping UpdateAlbSettings which disables ALB configuration
56+
func (egw *NsxtEdgeGateway) DisableAlb() error {
57+
config := &types.NsxtAlbConfig{
58+
Enabled: false,
59+
}
60+
_, err := egw.UpdateAlbSettings(config)
61+
if err != nil {
62+
return fmt.Errorf("error disabling NSX-T ALB: %s", err)
63+
}
64+
65+
return nil
66+
}

govcd/nsxt_alb_settings_test.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//go:build nsxt || alb || functional || ALL
2+
// +build nsxt alb functional ALL
3+
4+
package govcd
5+
6+
import (
7+
"fmt"
8+
9+
"github.com/vmware/go-vcloud-director/v2/types/v56"
10+
11+
. "gopkg.in/check.v1"
12+
)
13+
14+
func (vcd *TestVCD) Test_GetAlbSettings(check *C) {
15+
skipNoNsxtAlbConfiguration(vcd, check)
16+
skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointEdgeGatewayAlb)
17+
18+
edge, err := vcd.nsxtVdc.GetNsxtEdgeGatewayByName(vcd.config.VCD.Nsxt.EdgeGateway)
19+
check.Assert(err, IsNil)
20+
21+
albSettings, err := edge.GetAlbSettings()
22+
check.Assert(err, IsNil)
23+
check.Assert(albSettings, NotNil)
24+
check.Assert(albSettings.Enabled, Equals, false)
25+
}
26+
27+
func (vcd *TestVCD) Test_UpdateAlbSettings(check *C) {
28+
if vcd.skipAdminTests {
29+
check.Skip(fmt.Sprintf(TestRequiresSysAdminPrivileges, check.TestName()))
30+
}
31+
skipNoNsxtAlbConfiguration(vcd, check)
32+
skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointEdgeGatewayAlb)
33+
34+
controller, cloud, seGroup := spawnAlbControllerCloudServiceEngineGroup(vcd, check)
35+
edge, err := vcd.nsxtVdc.GetNsxtEdgeGatewayByName(vcd.config.VCD.Nsxt.EdgeGateway)
36+
check.Assert(err, IsNil)
37+
38+
// Enable ALB on Edge Gateway with default ServiceNetworkDefinition
39+
albSettingsConfig := &types.NsxtAlbConfig{
40+
Enabled: true,
41+
}
42+
enabledSettings, err := edge.UpdateAlbSettings(albSettingsConfig)
43+
check.Assert(err, IsNil)
44+
check.Assert(enabledSettings.Enabled, Equals, true)
45+
check.Assert(enabledSettings.ServiceNetworkDefinition, Equals, "192.168.255.1/25")
46+
47+
// Disable ALB on Edge Gateway
48+
albSettingsConfig.Enabled = false
49+
disabledSettings, err := edge.UpdateAlbSettings(albSettingsConfig)
50+
check.Assert(err, IsNil)
51+
check.Assert(disabledSettings.Enabled, Equals, false)
52+
53+
// Enable ALB on Edge Gateway with custom ServiceNetworkDefinition
54+
albSettingsConfig.Enabled = true
55+
albSettingsConfig.ServiceNetworkDefinition = "93.93.11.1/25"
56+
enabledSettingsCustomServiceDefinition, err := edge.UpdateAlbSettings(albSettingsConfig)
57+
check.Assert(err, IsNil)
58+
check.Assert(enabledSettingsCustomServiceDefinition.Enabled, Equals, true)
59+
check.Assert(enabledSettingsCustomServiceDefinition.ServiceNetworkDefinition, Equals, "93.93.11.1/25")
60+
61+
// Disable ALB on Edge Gateway again and ensure it was disabled
62+
err = edge.DisableAlb()
63+
check.Assert(err, IsNil)
64+
65+
albSettings, err := edge.GetAlbSettings()
66+
check.Assert(err, IsNil)
67+
check.Assert(albSettings, NotNil)
68+
check.Assert(albSettings.Enabled, Equals, false)
69+
70+
// Remove objects
71+
err = seGroup.Delete()
72+
check.Assert(err, IsNil)
73+
err = cloud.Delete()
74+
check.Assert(err, IsNil)
75+
err = controller.Delete()
76+
check.Assert(err, IsNil)
77+
}

govcd/openapi_endpoints.go

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ var endpointMinApiVersions = map[string]string{
5050
types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbImportableServiceEngineGroups: "35.0", // VCD 10.2+
5151
types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbCloud: "35.0", // VCD 10.2+
5252
types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups: "35.0", // VCD 10.2+
53+
types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayAlb: "35.0", // VCD 10.2+
5354
}
5455

5556
// elevateNsxtNatRuleApiVersion helps to elevate API version to consume newer NSX-T NAT Rule features

types/v56/constants.go

+2
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,8 @@ const (
366366
OpenApiEndpointAlbImportableServiceEngineGroups = "nsxAlbResources/importableServiceEngineGroups"
367367
OpenApiEndpointAlbCloud = "loadBalancer/clouds/"
368368
OpenApiEndpointAlbServiceEngineGroups = "loadBalancer/serviceEngineGroups/"
369+
370+
OpenApiEndpointEdgeGatewayAlb = "edgeGateways/%s/loadBalancer"
369371
)
370372

371373
// Header keys to run operations in tenant context

types/v56/nsxt_types.go

+18
Original file line numberDiff line numberDiff line change
@@ -813,3 +813,21 @@ type NsxtAlbImportableServiceEngineGroups struct {
813813
// HaMode (e.g. 'ELASTIC_N_PLUS_M_BUFFER')
814814
HaMode string `json:"haMode"`
815815
}
816+
817+
// NsxtAlbConfig describes Load Balancer Service configuration on an NSX-T Edge Gateway
818+
type NsxtAlbConfig struct {
819+
// Enabled is a mandatory flag indicating whether Load Balancer Service is enabled or not
820+
Enabled bool `json:"enabled"`
821+
// LicenseType of the backing Load Balancer Cloud.
822+
// * BASIC - Basic edition of the NSX Advanced Load Balancer.
823+
// * ENTERPRISE - Full featured edition of the NSX Advanced Load Balancer.
824+
LicenseType string `json:"licenseType,omitempty"`
825+
// LoadBalancerCloudRef
826+
LoadBalancerCloudRef *OpenApiReference `json:"loadBalancerCloudRef,omitempty"`
827+
828+
// ServiceNetworkDefinition in Gateway CIDR format which will be used by Load Balancer service. All the load balancer
829+
// service engines associated with the Service Engine Group will be attached to this network. The subnet prefix length
830+
// must be 25. If nothing is set, the default is 192.168.255.1/25. Default CIDR can be configured. This field cannot
831+
// be updated.
832+
ServiceNetworkDefinition string `json:"serviceNetworkDefinition,omitempty"`
833+
}

0 commit comments

Comments
 (0)