Skip to content

Commit cd7bdbc

Browse files
author
Rakesh Venkatesh
committed
HAproxy based load balancer customization
Add new feature for load balancers based on haproxy
1 parent 41d25d5 commit cd7bdbc

File tree

52 files changed

+3941
-89
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+3941
-89
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
package com.cloud.agent.api.to;
18+
19+
import org.apache.cloudstack.network.lb.LoadBalancerConfig;
20+
21+
public class LoadBalancerConfigTO {
22+
private String name;
23+
private String value;
24+
25+
public LoadBalancerConfigTO(String name, String value) {
26+
this.name = name;
27+
this.value = value;
28+
}
29+
30+
public LoadBalancerConfigTO(LoadBalancerConfig config) {
31+
this.name = config.getName();
32+
this.value = config.getValue();
33+
}
34+
35+
public String getName() {
36+
return name;
37+
}
38+
39+
public String getValue() {
40+
return value;
41+
}
42+
}

api/src/main/java/com/cloud/agent/api/to/LoadBalancerTO.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
3636
import com.cloud.utils.Pair;
3737

38+
import org.apache.cloudstack.network.lb.LoadBalancerConfig;
39+
import org.springframework.util.CollectionUtils;
40+
3841
public class LoadBalancerTO {
3942
String uuid;
4043
String srcIp;
@@ -50,6 +53,7 @@ public class LoadBalancerTO {
5053
String srcIpNetmask;
5154
Long networkId;
5255
DestinationTO[] destinations;
56+
private LoadBalancerConfigTO[] lbConfigs;
5357
private StickinessPolicyTO[] stickinessPolicies;
5458
private HealthCheckPolicyTO[] healthCheckPolicies;
5559
private LbSslCert sslCert; /* XXX: Should this be SslCertTO? */
@@ -179,6 +183,22 @@ public boolean isInline() {
179183
return inline;
180184
}
181185

186+
public LoadBalancerConfigTO[] getLbConfigs() {
187+
return this.lbConfigs;
188+
}
189+
190+
public void setLbConfigs(List<? extends LoadBalancerConfig> lbConfigs) {
191+
if (CollectionUtils.isEmpty(lbConfigs)) {
192+
this.lbConfigs = new LoadBalancerConfigTO[0];
193+
return;
194+
}
195+
this.lbConfigs = new LoadBalancerConfigTO[lbConfigs.size()];
196+
int i = 0;
197+
for (LoadBalancerConfig lbConfig : lbConfigs) {
198+
this.lbConfigs[i++] = new LoadBalancerConfigTO(lbConfig);
199+
}
200+
}
201+
182202
public StickinessPolicyTO[] getStickinessPolicies() {
183203
return stickinessPolicies;
184204
}
@@ -207,6 +227,10 @@ public LbSslCert getSslCert() {
207227
return this.sslCert;
208228
}
209229

230+
public void setLbSslCert(LbSslCert sslCert) {
231+
this.sslCert = sslCert;
232+
}
233+
210234
public String getSrcIpVlan() {
211235
return srcIpVlan;
212236
}

api/src/main/java/com/cloud/event/EventTypes.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ public class EventTypes {
175175
public static final String EVENT_LB_CERT_DELETE = "LB.CERT.DELETE";
176176
public static final String EVENT_LB_CERT_ASSIGN = "LB.CERT.ASSIGN";
177177
public static final String EVENT_LB_CERT_REMOVE = "LB.CERT.REMOVE";
178+
public static final String EVENT_LOAD_BALANCER_CONFIG_CREATE = "LB.CONFIG.CREATE";
179+
public static final String EVENT_LOAD_BALANCER_CONFIG_DELETE = "LB.CONFIG.DELETE";
180+
public static final String EVENT_LOAD_BALANCER_CONFIG_REPLACE = "LB.CONFIG.REPLACE";
181+
public static final String EVENT_LOAD_BALANCER_CONFIG_UPDATE = "LB.CONFIG.UPDATE";
178182

179183
// Global Load Balancer rules
180184
public static final String EVENT_ASSIGN_TO_GLOBAL_LOAD_BALANCER_RULE = "GLOBAL.LB.ASSIGN";

api/src/main/java/com/cloud/network/lb/LoadBalancingRulesService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ LoadBalancer createPublicLoadBalancerRule(String xId, String name, String descri
102102

103103
boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException;
104104

105-
boolean assignCertToLoadBalancer(long lbRuleId, Long certId);
105+
boolean assignCertToLoadBalancer(long lbRuleId, Long certId, boolean forced);
106106

107107
boolean removeCertFromLoadBalancer(long lbRuleId);
108108

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public class ApiConstants {
8282
public static final String CLUSTER_TYPE = "clustertype";
8383
public static final String CN = "cn";
8484
public static final String COMMAND = "command";
85+
public static final String CONFIG = "config";
8586
public static final String CMD_EVENT_TYPE = "cmdeventtype";
8687
public static final String COMPONENT = "component";
8788
public static final String CPU_CORE_PER_SOCKET = "cpucorepersocket";
@@ -104,6 +105,7 @@ public class ApiConstants {
104105
public static final String MAX_IOPS = "maxiops";
105106
public static final String HYPERVISOR_SNAPSHOT_RESERVE = "hypervisorsnapshotreserve";
106107
public static final String DATADISK_OFFERING_LIST = "datadiskofferinglist";
108+
public static final String DEFAULT_VALUE = "defaultvalue";
107109
public static final String DESCRIPTION = "description";
108110
public static final String DESTINATION_ZONE_ID = "destzoneid";
109111
public static final String DETAILS = "details";
@@ -554,6 +556,7 @@ public class ApiConstants {
554556
public static final String LOAD_BALANCER_DEVICE_STATE = "lbdevicestate";
555557
public static final String LOAD_BALANCER_DEVICE_CAPACITY = "lbdevicecapacity";
556558
public static final String LOAD_BALANCER_DEVICE_DEDICATED = "lbdevicededicated";
559+
public static final String LOAD_BALANCER_ID = "loadbalancerid";
557560
public static final String LOAD_BALANCER_RULE = "loadbalancerrule";
558561
public static final String LOAD_BALANCER_RULE_LIST = "loadbalancerrulelist";
559562
public static final String FIREWALL_DEVICE_ID = "fwdeviceid";

api/src/main/java/org/apache/cloudstack/api/BaseCmd.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
4545
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService;
4646
import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
47+
import org.apache.cloudstack.network.lb.LoadBalancerConfigService;
4748
import org.apache.cloudstack.query.QueryService;
4849
import org.apache.cloudstack.storage.ImageStoreService;
4950
import org.apache.cloudstack.usage.UsageService;
@@ -152,6 +153,8 @@ public static enum CommandType {
152153
@Inject
153154
public LoadBalancingRulesService _lbService;
154155
@Inject
156+
public LoadBalancerConfigService _lbConfigService;
157+
@Inject
155158
public RemoteAccessVpnService _ravService;
156159
@Inject
157160
public ProjectService _projectService;

api/src/main/java/org/apache/cloudstack/api/ResponseGenerator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import org.apache.cloudstack.api.response.LBHealthCheckResponse;
7272
import org.apache.cloudstack.api.response.LBStickinessResponse;
7373
import org.apache.cloudstack.api.response.ListResponse;
74+
import org.apache.cloudstack.api.response.LoadBalancerConfigResponse;
7475
import org.apache.cloudstack.api.response.LoadBalancerResponse;
7576
import org.apache.cloudstack.api.response.ManagementServerResponse;
7677
import org.apache.cloudstack.api.response.NetworkACLItemResponse;
@@ -131,6 +132,7 @@
131132
import org.apache.cloudstack.backup.BackupSchedule;
132133
import org.apache.cloudstack.config.Configuration;
133134
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
135+
import org.apache.cloudstack.network.lb.LoadBalancerConfig;
134136
import org.apache.cloudstack.region.PortableIp;
135137
import org.apache.cloudstack.region.PortableIpRange;
136138
import org.apache.cloudstack.region.Region;
@@ -262,6 +264,10 @@ public interface ResponseGenerator {
262264

263265
LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer);
264266

267+
LoadBalancerConfigResponse createLoadBalancerConfigResponse(LoadBalancerConfig config);
268+
269+
List<LoadBalancerConfigResponse> createLoadBalancerConfigResponse(List<? extends LoadBalancerConfig> configs);
270+
265271
LBStickinessResponse createLBStickinessPolicyResponse(List<? extends StickinessPolicy> stickinessPolicies, LoadBalancer lb);
266272

267273
LBStickinessResponse createLBStickinessPolicyResponse(StickinessPolicy stickinessPolicy, LoadBalancer lb);

api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/AssignCertToLoadBalancerCmd.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
// under the License.
1818
package org.apache.cloudstack.api.command.user.loadbalancer;
1919

20+
import org.apache.commons.lang3.BooleanUtils;
2021
import org.apache.log4j.Logger;
2122

2223
import org.apache.cloudstack.api.APICommand;
24+
import org.apache.cloudstack.api.ApiCommandJobType;
2325
import org.apache.cloudstack.api.ApiConstants;
2426
import org.apache.cloudstack.api.ApiErrorCode;
2527
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -44,7 +46,7 @@ public class AssignCertToLoadBalancerCmd extends BaseAsyncCmd {
4446

4547
public static final Logger s_logger = Logger.getLogger(AssignCertToLoadBalancerCmd.class.getName());
4648

47-
private static final String s_name = "assigncerttoloadbalancerresponse";
49+
private static final String RESPONSE_NAME = "assigncerttoloadbalancerresponse";
4850

4951
@Parameter(name = ApiConstants.LBID,
5052
type = CommandType.UUID,
@@ -60,11 +62,17 @@ public class AssignCertToLoadBalancerCmd extends BaseAsyncCmd {
6062
description = "the ID of the certificate")
6163
Long certId;
6264

65+
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false,
66+
since = "4.17",
67+
description = "Force assign the certificate. If there is a certificate bound to the LB, it will be removed")
68+
private Boolean forced;
69+
70+
6371
@Override
6472
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
6573
ResourceAllocationException, NetworkRuleConflictException {
6674
//To change body of implemented methods use File | Settings | File Templates.
67-
if (_lbService.assignCertToLoadBalancer(getLbRuleId(), getCertId())) {
75+
if (_lbService.assignCertToLoadBalancer(getLbRuleId(), getCertId(), isForced())) {
6876
SuccessResponse response = new SuccessResponse(getCommandName());
6977
this.setResponseObject(response);
7078
} else {
@@ -79,7 +87,7 @@ public String getEventType() {
7987

8088
@Override
8189
public String getCommandName() {
82-
return s_name;
90+
return RESPONSE_NAME;
8391
}
8492

8593
@Override
@@ -103,4 +111,29 @@ public Long getCertId() {
103111
public Long getLbRuleId() {
104112
return lbRuleId;
105113
}
114+
115+
public boolean isForced() {
116+
return BooleanUtils.toBoolean(forced);
117+
}
118+
119+
@Override
120+
public ApiCommandJobType getInstanceType() {
121+
return ApiCommandJobType.LoadBalancerRule;
122+
}
123+
124+
@Override
125+
public Long getInstanceId() {
126+
return lbRuleId;
127+
}
128+
129+
@Override
130+
public String getSyncObjType() {
131+
return BaseAsyncCmd.networkSyncObject;
132+
}
133+
134+
@Override
135+
public Long getSyncObjId() {
136+
LoadBalancer lb = _entityMgr.findById(LoadBalancer.class, getLbRuleId());
137+
return (lb != null )? lb.getNetworkId(): null;
138+
}
106139
}

0 commit comments

Comments
 (0)