Skip to content

Commit bedfe44

Browse files
committed
Add support to create and delete nsx tier-1 gateway
1 parent b37a9f7 commit bedfe44

File tree

10 files changed

+237
-32
lines changed

10 files changed

+237
-32
lines changed

engine/schema/src/main/java/com/cloud/network/element/NsxProviderVO.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public class NsxProviderVO implements NsxProvider {
3939
@Column(name = "zone_id")
4040
private long zoneId;
4141

42+
@Column(name = "host_id")
43+
private long hostId;
44+
4245
@Column(name = "uuid")
4346
private String uuid;
4447

@@ -68,8 +71,9 @@ public NsxProviderVO() {
6871
this.uuid = UUID.randomUUID().toString();
6972
}
7073

71-
public NsxProviderVO( long zoneId,String providerName, String hostname, String username, String password, String tier0Gateway, String edgeCluster) {
74+
public NsxProviderVO( long zoneId, long hostId, String providerName, String hostname, String username, String password, String tier0Gateway, String edgeCluster) {
7275
this.zoneId = zoneId;
76+
this.hostId = hostId;
7377
this.uuid = UUID.randomUUID().toString();
7478
this.providerName = providerName;
7579
this.hostname = hostname;
@@ -97,6 +101,14 @@ public void setZoneId(long zoneId) {
97101
this.zoneId = zoneId;
98102
}
99103

104+
public long getHostId() {
105+
return hostId;
106+
}
107+
108+
public void setHostId(long hostId) {
109+
this.hostId = hostId;
110+
}
111+
100112
@Override
101113
public String getUuid() {
102114
return uuid;

engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ CREATE TABLE `cloud`.`nsx_providers` (
185185
`id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
186186
`uuid` varchar(40),
187187
`zone_id` bigint unsigned NOT NULL COMMENT 'Zone ID',
188+
`host_id` bigint unsigned NOT NULL COMMENT 'Host ID',
188189
`provider_name` varchar(40),
189190
`hostname` varchar(255) NOT NULL,
190191
`port` varchar(255),
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.apache.cloudstack.agent.api;
2+
3+
public class DeleteNsxTier1GatewayCommand extends CreateNsxTier1GatewayCommand {
4+
5+
public DeleteNsxTier1GatewayCommand(String zoneName, Long zoneId, String accountName, Long accountId, String vpcName) {
6+
super(zoneName, zoneId, accountName, accountId, vpcName);
7+
}
8+
}

plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/response/NsxControllerResponse.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class NsxControllerResponse extends BaseResponse {
3434

3535
@SerializedName(ApiConstants.ZONE_ID)
3636
@Param(description = "Zone ID to which the NSX controller is associated with")
37-
private long zoneId;
37+
private String zoneId;
3838

3939
@SerializedName(ApiConstants.ZONE_NAME)
4040
@Param(description = "Zone name to which the NSX controller is associated with")
@@ -76,11 +76,11 @@ public void setName(String name) {
7676
this.name = name;
7777
}
7878

79-
public long getZoneId() {
79+
public String getZoneId() {
8080
return zoneId;
8181
}
8282

83-
public void setZoneId(long zoneId) {
83+
public void setZoneId(String zoneId) {
8484
this.zoneId = zoneId;
8585
}
8686

plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,32 @@
2727
import com.cloud.agent.api.ReadyAnswer;
2828
import com.cloud.agent.api.Answer;
2929
import com.cloud.agent.api.PingCommand;
30+
import com.cloud.exception.InvalidParameterValueException;
3031
import com.cloud.host.Host;
3132
import com.cloud.resource.ServerResource;
3233
import com.cloud.utils.exception.CloudRuntimeException;
3334
import com.vmware.nsx_policy.infra.Tier1s;
35+
import com.vmware.nsx_policy.infra.tier_0s.LocaleServices;
3436
import com.vmware.nsx_policy.model.ApiError;
37+
import com.vmware.nsx_policy.model.ChildLocaleServices;
38+
import com.vmware.nsx_policy.model.LocaleServicesListResult;
3539
import com.vmware.nsx_policy.model.Tier1;
40+
import com.vmware.vapi.bindings.Service;
3641
import com.vmware.vapi.std.errors.Error;
3742
import org.apache.cloudstack.NsxAnswer;
3843
import org.apache.cloudstack.StartupNsxCommand;
3944
import org.apache.cloudstack.agent.api.CreateNsxTier1GatewayCommand;
45+
import org.apache.cloudstack.agent.api.DeleteNsxTier1GatewayCommand;
4046
import org.apache.cloudstack.service.NsxApi;
4147
import org.apache.log4j.Logger;
4248

4349

4450
import javax.naming.ConfigurationException;
51+
import java.util.List;
4552
import java.util.Map;
4653

4754
public class NsxResource implements ServerResource {
48-
private static final Logger s_logger = Logger.getLogger(NsxResource.class);
55+
private static final Logger LOGGER = Logger.getLogger(NsxResource.class);
4956
private static final String TIER_0_GATEWAY_PATH_PREFIX = "/infra/tier-0s/";
5057
private static final String TIER_1_RESOURCE_TYPE = "Tier1";
5158
// private static final String ROUTING = "ROUTING";
@@ -88,7 +95,9 @@ public PingCommand getCurrentStatus(long id) {
8895
public Answer executeRequest(Command cmd) {
8996
if (cmd instanceof ReadyCommand) {
9097
return executeRequest((ReadyCommand) cmd);
91-
} if (cmd instanceof CreateNsxTier1GatewayCommand) {
98+
} else if (cmd instanceof DeleteNsxTier1GatewayCommand) {
99+
return executeRequest((DeleteNsxTier1GatewayCommand) cmd);
100+
} else if (cmd instanceof CreateNsxTier1GatewayCommand) {
92101
return executeRequest((CreateNsxTier1GatewayCommand) cmd);
93102
} else {
94103
return Answer.createUnsupportedCommandAnswer(cmd);
@@ -176,6 +185,11 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
176185
throw new ConfigurationException("Unable to find zone");
177186
}
178187

188+
tier0Gateway = (String) params.get("tier0Gateway");
189+
if (tier0Gateway == null) {
190+
throw new ConfigurationException("Missing NSX tier0 gateway");
191+
}
192+
179193
edgeCluster = (String) params.get("edgeCluster");
180194
if (edgeCluster == null) {
181195
throw new ConfigurationException("Missing NSX edgeCluster");
@@ -190,18 +204,35 @@ private Answer executeRequest(ReadyCommand cmd) {
190204
return new ReadyAnswer(cmd);
191205
}
192206

207+
private Service getService(Class serviceClass) {
208+
return nsxApi.getApiClient().createStub(serviceClass);
209+
}
210+
193211
private Answer executeRequest(CreateNsxTier1GatewayCommand cmd) {
194-
String tier0GatewayPath = TIER_0_GATEWAY_PATH_PREFIX + tier0Gateway;
195212
String name = getVpcName(cmd);
196-
Tier1s tier1service = nsxApi.getApiClient().createStub(Tier1s.class);
197-
Tier1 tier1 = new Tier1.Builder()
213+
Tier1 tier1 = getTier1Gateway(name);
214+
if (tier1 != null) {
215+
throw new InvalidParameterValueException(String.format("VPC network with name %s exists in NSX zone: %s and account %s", name, cmd.getZoneName(), cmd.getAccountName()));
216+
}
217+
List<com.vmware.nsx_policy.model.LocaleServices> localeServices = getTier0LocalServices(tier0Gateway);
218+
String tier0GatewayPath = TIER_0_GATEWAY_PATH_PREFIX + tier0Gateway;
219+
220+
Tier1s tier1service = (Tier1s) getService(Tier1s.class);
221+
tier1 = new Tier1.Builder()
198222
.setTier0Path(tier0GatewayPath)
199223
.setResourceType(TIER_1_RESOURCE_TYPE)
200224
.setPoolAllocation(ROUTING.name())
201225
.setHaMode(ACTIVE_STANDBY.name())
202226
.setId(name)
203227
.setDisplayName(name)
204-
.build();
228+
.setChildren(
229+
List.of(new ChildLocaleServices.Builder("ChildLocaleServices")
230+
.setLocaleServices(
231+
new com.vmware.nsx_policy.model.LocaleServices.Builder()
232+
.setEdgeClusterPath(localeServices.get(0).getEdgeClusterPath())
233+
.setResourceType("LocaleServices")
234+
.build()
235+
).build())).build();
205236
try {
206237
tier1service.patch(name, tier1);
207238
} catch (Error error) {
@@ -211,6 +242,36 @@ private Answer executeRequest(CreateNsxTier1GatewayCommand cmd) {
211242
return new NsxAnswer(cmd, true, "");
212243
}
213244

245+
private Answer executeRequest(DeleteNsxTier1GatewayCommand cmd) {
246+
try {
247+
Tier1s tier1service = (Tier1s) getService(Tier1s.class);
248+
tier1service.delete(cmd.getVpcName());
249+
} catch (Exception e) {
250+
return new Answer(cmd, new CloudRuntimeException(e.getMessage()));
251+
}
252+
return new Answer(cmd, true, null);
253+
}
254+
255+
private List<com.vmware.nsx_policy.model.LocaleServices> getTier0LocalServices(String tier0Gateway) {
256+
try {
257+
LocaleServices tier0LocaleServices = (LocaleServices) getService(LocaleServices.class);
258+
LocaleServicesListResult result =tier0LocaleServices.list(tier0Gateway, null, false, null, null, null, null);
259+
return result.getResults();
260+
} catch (Exception e) {
261+
throw new CloudRuntimeException(String.format("Failed to fetch locale services for tier gateway %s due to %s", tier0Gateway, e.getMessage()));
262+
}
263+
}
264+
265+
private Tier1 getTier1Gateway(String tier1GatewayId) {
266+
try {
267+
Tier1s tier1service = (Tier1s) getService(Tier1s.class);
268+
return tier1service.get(tier1GatewayId);
269+
} catch (Exception e) {
270+
LOGGER.debug(String.format("NSX Tier-1 gateway with name: %s not found", tier1GatewayId));
271+
}
272+
return null;
273+
}
274+
214275
private String getVpcName(CreateNsxTier1GatewayCommand cmd) {
215276
return cmd.getZoneName() + "-" + cmd.getAccountName() + "-" + cmd.getVpcName();
216277
}

plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxControllerUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.cloud.agent.AgentManager;
2020
import com.cloud.agent.api.Answer;
2121
import com.cloud.exception.InvalidParameterValueException;
22-
import com.cloud.hypervisor.Hypervisor;
2322
import com.cloud.network.dao.NsxProviderDao;
2423
import com.cloud.network.element.NsxProviderVO;
2524
import org.apache.cloudstack.NsxAnswer;
@@ -46,7 +45,8 @@ public NsxAnswer sendNsxCommand(NsxCommand cmd, long zoneId) throws IllegalArgum
4645
throw new InvalidParameterValueException("Failed to find an NSX controller");
4746
}
4847

49-
Answer answer = agentMgr.sendTo(zoneId, Hypervisor.HypervisorType.VMware, cmd);
48+
//Answer answer = agentMgr.sendTo(zoneId, Hypervisor.HypervisorType.VMware, cmd);
49+
Answer answer = agentMgr.easySend(nsxProviderVO.getHostId(), cmd);
5050

5151
if (answer == null || !answer.getResult()) {
5252
s_logger.error("NSX API Command failed");

0 commit comments

Comments
 (0)