Skip to content

Commit 0f7d8de

Browse files
Adding support for loadbalancer policy update in hns. (#2085)
Signed-off-by: Prince Pereira <[email protected]>
1 parent f9a5c7b commit 0f7d8de

3 files changed

Lines changed: 141 additions & 0 deletions

File tree

hcn/hcnloadbalancer.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,49 @@ func createLoadBalancer(settings string) (*HostComputeLoadBalancer, error) {
163163
return &outputLoadBalancer, nil
164164
}
165165

166+
func updateLoadBalancer(loadbalancerId string, settings string) (*HostComputeLoadBalancer, error) {
167+
loadBalancerGuid, err := guid.FromString(loadbalancerId)
168+
if err != nil {
169+
return nil, errInvalidLoadBalancerID
170+
}
171+
// Update loadBalancer.
172+
var (
173+
loadBalancerHandle hcnLoadBalancer
174+
resultBuffer *uint16
175+
propertiesBuffer *uint16
176+
)
177+
hr := hcnOpenLoadBalancer(&loadBalancerGuid, &loadBalancerHandle, &resultBuffer)
178+
if err := checkForErrors("hcnOpenLoadBalancer", hr, resultBuffer); err != nil {
179+
return nil, err
180+
}
181+
hr = hcnModifyLoadBalancer(loadBalancerHandle, settings, &resultBuffer)
182+
if err := checkForErrors("hcnModifyLoadBalancer", hr, resultBuffer); err != nil {
183+
return nil, err
184+
}
185+
// Query loadBalancer.
186+
hcnQuery := defaultQuery()
187+
query, err := json.Marshal(hcnQuery)
188+
if err != nil {
189+
return nil, err
190+
}
191+
hr = hcnQueryLoadBalancerProperties(loadBalancerHandle, string(query), &propertiesBuffer, &resultBuffer)
192+
if err := checkForErrors("hcnQueryLoadBalancerProperties", hr, resultBuffer); err != nil {
193+
return nil, err
194+
}
195+
properties := interop.ConvertAndFreeCoTaskMemString(propertiesBuffer)
196+
// Close loadBalancer.
197+
hr = hcnCloseLoadBalancer(loadBalancerHandle)
198+
if err := checkForErrors("hcnCloseLoadBalancer", hr, nil); err != nil {
199+
return nil, err
200+
}
201+
// Convert output to HostComputeLoadBalancer
202+
var outputLoadBalancer HostComputeLoadBalancer
203+
if err := json.Unmarshal([]byte(properties), &outputLoadBalancer); err != nil {
204+
return nil, err
205+
}
206+
return &outputLoadBalancer, nil
207+
}
208+
166209
func deleteLoadBalancer(loadBalancerID string) error {
167210
loadBalancerGUID, err := guid.FromString(loadBalancerID)
168211
if err != nil {
@@ -237,6 +280,23 @@ func (loadBalancer *HostComputeLoadBalancer) Create() (*HostComputeLoadBalancer,
237280
return loadBalancer, nil
238281
}
239282

283+
// Update Loadbalancer.
284+
func (loadBalancer *HostComputeLoadBalancer) Update(hnsLoadbalancerID string) (*HostComputeLoadBalancer, error) {
285+
logrus.Debugf("hcn::HostComputeLoadBalancer::Create id=%s", hnsLoadbalancerID)
286+
287+
jsonString, err := json.Marshal(loadBalancer)
288+
if err != nil {
289+
return nil, err
290+
}
291+
292+
logrus.Debugf("hcn::HostComputeLoadBalancer::Update JSON: %s", jsonString)
293+
loadBalancer, hcnErr := updateLoadBalancer(hnsLoadbalancerID, string(jsonString))
294+
if hcnErr != nil {
295+
return nil, hcnErr
296+
}
297+
return loadBalancer, nil
298+
}
299+
240300
// Delete LoadBalancer.
241301
func (loadBalancer *HostComputeLoadBalancer) Delete() error {
242302
logrus.Debugf("hcn::HostComputeLoadBalancer::Delete id=%s", loadBalancer.Id)

hcn/hcnloadbalancer_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,70 @@ func TestCreateDeleteLoadBalancer(t *testing.T) {
4242
}
4343
}
4444

45+
func TestCreateUpdateDeleteLoadBalancer(t *testing.T) {
46+
network, err := CreateTestOverlayNetwork()
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
endpoint, err := HcnCreateTestEndpoint(network)
51+
if err != nil {
52+
t.Fatal(err)
53+
}
54+
loadBalancer, err := HcnCreateTestLoadBalancer(endpoint)
55+
if err != nil {
56+
t.Fatal(err)
57+
}
58+
jsonString, err := json.Marshal(loadBalancer)
59+
if err != nil {
60+
t.Fatal(err)
61+
}
62+
fmt.Printf("LoadBalancer JSON:\n%s \n", jsonString)
63+
64+
secondEndpoint, err := HcnCreateTestEndpoint(network)
65+
if err != nil {
66+
t.Fatal(err)
67+
}
68+
69+
HcnLoadBalancerTestAddBackend(loadBalancer, secondEndpoint.Id)
70+
71+
loadBalancer, err = loadBalancer.Update(loadBalancer.Id)
72+
if err != nil {
73+
t.Fatal(err)
74+
}
75+
76+
if len(loadBalancer.HostComputeEndpoints) != 2 {
77+
t.Fatalf("Update loadBalancer with backend add failed")
78+
}
79+
80+
HcnLoadBalancerTestRemoveBackend(loadBalancer, secondEndpoint.Id)
81+
82+
loadBalancer, err = loadBalancer.Update(loadBalancer.Id)
83+
if err != nil {
84+
t.Fatal(err)
85+
}
86+
87+
if len(loadBalancer.HostComputeEndpoints) != 1 {
88+
t.Fatalf("Update loadBalancer with backend remove failed")
89+
}
90+
91+
err = loadBalancer.Delete()
92+
if err != nil {
93+
t.Fatal(err)
94+
}
95+
err = secondEndpoint.Delete()
96+
if err != nil {
97+
t.Fatal(err)
98+
}
99+
err = endpoint.Delete()
100+
if err != nil {
101+
t.Fatal(err)
102+
}
103+
err = network.Delete()
104+
if err != nil {
105+
t.Fatal(err)
106+
}
107+
}
108+
45109
func TestGetLoadBalancerById(t *testing.T) {
46110
network, err := CreateTestOverlayNetwork()
47111
if err != nil {

hcn/hcnutils_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,23 @@ func HcnCreateTestLoadBalancer(endpoint *HostComputeEndpoint) (*HostComputeLoadB
317317
return loadBalancer.Create()
318318
}
319319

320+
func HcnLoadBalancerTestAddBackend(loadBalancer *HostComputeLoadBalancer, endpointId string) {
321+
endpointIds := loadBalancer.HostComputeEndpoints
322+
endpointIds = append(endpointIds, endpointId)
323+
loadBalancer.HostComputeEndpoints = endpointIds
324+
}
325+
326+
func HcnLoadBalancerTestRemoveBackend(loadBalancer *HostComputeLoadBalancer, endpointId string) {
327+
endpointIds := loadBalancer.HostComputeEndpoints
328+
for i, v := range endpointIds {
329+
if v == endpointId {
330+
endpointIds = append(endpointIds[:i], endpointIds[i+1:]...)
331+
break
332+
}
333+
}
334+
loadBalancer.HostComputeEndpoints = endpointIds
335+
}
336+
320337
func HcnCreateTestRemoteSubnetRoute() (*PolicyNetworkRequest, error) {
321338
rsr := RemoteSubnetRoutePolicySetting{
322339
DestinationPrefix: "192.168.2.0/24",

0 commit comments

Comments
 (0)