2727import com .cloud .agent .api .ReadyAnswer ;
2828import com .cloud .agent .api .Answer ;
2929import com .cloud .agent .api .PingCommand ;
30+ import com .cloud .exception .InvalidParameterValueException ;
3031import com .cloud .host .Host ;
3132import com .cloud .resource .ServerResource ;
3233import com .cloud .utils .exception .CloudRuntimeException ;
3334import com .vmware .nsx_policy .infra .Tier1s ;
35+ import com .vmware .nsx_policy .infra .tier_0s .LocaleServices ;
3436import com .vmware .nsx_policy .model .ApiError ;
37+ import com .vmware .nsx_policy .model .ChildLocaleServices ;
38+ import com .vmware .nsx_policy .model .LocaleServicesListResult ;
3539import com .vmware .nsx_policy .model .Tier1 ;
40+ import com .vmware .vapi .bindings .Service ;
3641import com .vmware .vapi .std .errors .Error ;
3742import org .apache .cloudstack .NsxAnswer ;
3843import org .apache .cloudstack .StartupNsxCommand ;
3944import org .apache .cloudstack .agent .api .CreateNsxTier1GatewayCommand ;
45+ import org .apache .cloudstack .agent .api .DeleteNsxTier1GatewayCommand ;
4046import org .apache .cloudstack .service .NsxApi ;
4147import org .apache .log4j .Logger ;
4248
4349
4450import javax .naming .ConfigurationException ;
51+ import java .util .List ;
4552import java .util .Map ;
4653
4754public 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 }
0 commit comments