From 9037656233b7966af4859dcdf068e0e350b4df17 Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Tue, 29 Mar 2016 15:29:03 +0100 Subject: [PATCH 1/9] WIP templates/converged infrastructure --- pom.xml | 14 +- .../org/dasein/cloud/azurearm/AzureArm.java | 16 +- .../cloud/azurearm/AzureArmLocation.java | 65 ++- .../AzureArmLocationCapabilities.java | 2 +- .../cloud/azurearm/AzureArmRequester.java | 3 +- ...rmConvergedInfrastructureCapabilities.java | 48 +++ ...ureArmConvergedInfrastructureRequests.java | 83 ++++ ...zureArmConvergedInfrastructureService.java | 44 ++ ...zureArmConvergedInfrastructureSupport.java | 324 +++++++++++++++ ...rmConvergedInfrastructureRequestModel.java | 100 +++++ ...mConvergedInfrastructureResponseModel.java | 167 ++++++++ ...ConvergedInfrastructuresResponseModel.java | 44 ++ .../network/AzureArmNetworkSupport.java | 27 +- ...rmConvergedInfrastructureSupportTests.java | 381 ++++++++++++++++++ 14 files changed, 1253 insertions(+), 65 deletions(-) create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureService.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructuresResponseModel.java create mode 100644 src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java diff --git a/pom.xml b/pom.xml index 6be2e16..a20a8a2 100644 --- a/pom.xml +++ b/pom.xml @@ -56,14 +56,14 @@ org.dasein dasein-cloud-core - 1.0.0 + 0.9.5-SNAPSHOT compile false dasein-cloud dasein-cloud-utils - 1.0.0 + 1.0.1 compile false @@ -122,9 +122,10 @@ - mockit + org.jmockit jmockit - 0.999.4 + 1.19 + test @@ -137,7 +138,7 @@ org.dasein dasein-cloud-test - 1.0.0 + 1.0.1-SNAPSHOT test false @@ -229,6 +230,9 @@ **/TestSuite.class + + **/tests/*.class + diff --git a/src/main/java/org/dasein/cloud/azurearm/AzureArm.java b/src/main/java/org/dasein/cloud/azurearm/AzureArm.java index cfafd87..6d1f8a8 100644 --- a/src/main/java/org/dasein/cloud/azurearm/AzureArm.java +++ b/src/main/java/org/dasein/cloud/azurearm/AzureArm.java @@ -25,9 +25,11 @@ import org.dasein.cloud.AbstractCloud; import org.dasein.cloud.CloudException; import org.dasein.cloud.ContextRequirements; +import org.dasein.cloud.GeneralCloudException; +import org.dasein.cloud.azurearm.ci.AzureArmConvergedInfrastructureService; import org.dasein.cloud.azurearm.compute.AzureArmComputeService; import org.dasein.cloud.azurearm.network.AzureArmNetworkServices; -import org.dasein.cloud.dc.DataCenterServices; +import org.dasein.cloud.ci.ConvergedInfrastructureServices; import org.dasein.cloud.network.NetworkServices; import javax.annotation.Nonnull; @@ -54,7 +56,7 @@ public HttpClientBuilder getAzureArmClientBuilder() throws CloudException { builder.setConnectionManager(ccm); return builder; } catch (Exception e) { - throw new CloudException(e.getMessage()); + throw new GeneralCloudException(e.getMessage()); } } @@ -68,7 +70,7 @@ public HttpClientBuilder getAzureClientBuilderWithPooling() throws CloudExceptio builder.setConnectionManager(connManager); return builder; } catch (Exception e) { - throw new CloudException(e.getMessage()); + throw new GeneralCloudException(e.getMessage()); } } @@ -89,11 +91,17 @@ public HttpClientBuilder getAzureClientBuilderWithPooling() throws CloudExceptio ); } + @Nullable + @Override + public ConvergedInfrastructureServices getConvergedInfrastructureServices() { + return new AzureArmConvergedInfrastructureService(this); + } + @Override public @Nonnull AzureArmComputeService getComputeServices() { return new AzureArmComputeService(this); } @Override - public @Nonnull DataCenterServices getDataCenterServices() { + public @Nonnull AzureArmLocation getDataCenterServices() { return new AzureArmLocation(this); } diff --git a/src/main/java/org/dasein/cloud/azurearm/AzureArmLocation.java b/src/main/java/org/dasein/cloud/azurearm/AzureArmLocation.java index c8241ad..1eb0b2a 100644 --- a/src/main/java/org/dasein/cloud/azurearm/AzureArmLocation.java +++ b/src/main/java/org/dasein/cloud/azurearm/AzureArmLocation.java @@ -28,7 +28,14 @@ import org.dasein.cloud.azurearm.model.ArmResourceGroupModel; import org.dasein.cloud.azurearm.model.ArmResourceGroupsModel; import org.dasein.cloud.azurearm.model.ArmResourceTypeModel; -import org.dasein.cloud.dc.*; +import org.dasein.cloud.dc.AbstractDataCenterServices; +import org.dasein.cloud.dc.DataCenter; +import org.dasein.cloud.dc.DataCenterCapabilities; +import org.dasein.cloud.dc.Folder; +import org.dasein.cloud.dc.Jurisdiction; +import org.dasein.cloud.dc.Region; +import org.dasein.cloud.dc.ResourcePool; +import org.dasein.cloud.dc.StoragePool; import org.dasein.cloud.util.requester.DriverToCoreMapper; import org.dasein.cloud.util.requester.entities.DaseinObjectToJsonEntity; @@ -37,7 +44,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Locale; /** * Displays the available locations for Microsoft Azure services. @@ -45,37 +51,26 @@ * @since 2015.06.1 * @version 2015.06.1 */ -public class AzureArmLocation implements DataCenterServices{ - private AzureArm provider; +public class AzureArmLocation extends AbstractDataCenterServices{ - AzureArmLocation(AzureArm provider) { this.provider = provider; } + protected AzureArmLocation(AzureArm provider) { super(provider); } private transient volatile AzureArmLocationCapabilities capabilities; @Nonnull @Override public DataCenterCapabilities getCapabilities() throws InternalException, CloudException { if( capabilities == null ) { - capabilities = new AzureArmLocationCapabilities(provider); + capabilities = new AzureArmLocationCapabilities(getProvider()); } return capabilities; } - @Override - public String getProviderTermForDataCenter(Locale locale) { - return "datacenter"; - } - - @Override - public String getProviderTermForRegion(Locale locale) { - return "location"; - } - @Override public @Nonnull Region getRegion(@Nonnull String providerRegionId) throws InternalException, CloudException { for(Region region : listRegions()){ if(providerRegionId.equals(region.getProviderRegionId()))return region; } - throw new InternalException("The requested region does not exist or cannot be found"); + return null; } @Nonnull @@ -83,8 +78,10 @@ public String getProviderTermForRegion(Locale locale) { public Iterable listDataCenters(@Nonnull String providerRegionId) throws InternalException, CloudException { List dataCenters = new ArrayList(); for(Region region : listRegions()){ - DataCenter dc = new DataCenter(region.getProviderRegionId() + "-dc", region.getProviderRegionId() + "-dc", region.getProviderRegionId(), true, true); - dataCenters.add(dc); + if (region.getProviderRegionId().equals(providerRegionId)) { + DataCenter dc = new DataCenter(region.getProviderRegionId() + "-dc", region.getProviderRegionId() + "-dc", region.getProviderRegionId(), true, true); + dataCenters.add(dc); + } } return dataCenters; } @@ -96,12 +93,12 @@ public Iterable listDataCenters(@Nonnull String providerRegionId) th if(dc.getProviderDataCenterId().equals(providerDataCenterId))return dc; } } - throw new InternalException("The requested datacenter does not exist or cannot be found"); + return null; } @Override public @Nonnull Iterable listRegions() throws InternalException, CloudException { - ArmProviderModel result = RequestsDsl.createGetRequest(provider).forLocations().withJsonProcessor(ArmProviderModel.class).execute(); + ArmProviderModel result = RequestsDsl.createGetRequest(getProvider()).forLocations().withJsonProcessor(ArmProviderModel.class).execute(); ArmResourceTypeModel azureArmResourceTypeModel = (ArmResourceTypeModel)CollectionUtils.find(result.getAzureArmResourceTypes(), new Predicate() { @Override @@ -144,10 +141,10 @@ private Region regionFromString(String locationName) { @Override public @Nonnull Iterable listResourcePools(@Nonnull String providerDataCenterId) throws InternalException, CloudException { RequestBuilder requestBuilder = RequestBuilder.get(); - addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(this.provider)); - requestBuilder.setUri(String.format("https://management.azure.com/Subscriptions/%s/resourceGroups?api-version=2014-04-01", this.provider.getContext().getAccountNumber())); + addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(getProvider())); + requestBuilder.setUri(String.format("https://management.azure.com/Subscriptions/%s/resourceGroups?api-version=2014-04-01", getProvider().getContext().getAccountNumber())); - ArmResourceGroupsModel armResourceGroupsModel = new AzureArmRequester(this.provider, this.provider.getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(ArmResourceGroupsModel.class).execute(); + ArmResourceGroupsModel armResourceGroupsModel = new AzureArmRequester(getProvider(), getProvider().getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(ArmResourceGroupsModel.class).execute(); final ArrayList resourcePools = new ArrayList(); CollectionUtils.forAllDo(armResourceGroupsModel.getArmResourceGroupModels(), new Closure() { @@ -163,10 +160,10 @@ public void execute(Object input) { @Override public @Nullable ResourcePool getResourcePool(@Nonnull String providerResourcePoolId) throws InternalException, CloudException { RequestBuilder requestBuilder = RequestBuilder.get(); - addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(this.provider)); - requestBuilder.setUri(String.format("%s/%s?api-version=2014-04-01", this.provider.getContext().getCloud().getEndpoint(), providerResourcePoolId)); + addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(getProvider())); + requestBuilder.setUri(String.format("%s/%s?api-version=2014-04-01", getProvider().getContext().getCloud().getEndpoint(), providerResourcePoolId)); - return new AzureArmRequester(this.provider, this.provider.getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper() { + return new AzureArmRequester(getProvider(), getProvider().getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper() { @Override public ResourcePool mapFrom(ArmResourceGroupModel entity) { return getResourcePoolFrom(entity); @@ -176,13 +173,13 @@ public ResourcePool mapFrom(ArmResourceGroupModel entity) { public @Nonnull ResourcePool createResourcePool(String name) throws InternalException, CloudException { RequestBuilder requestBuilder = RequestBuilder.put(); - addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(this.provider)); - requestBuilder.setUri(String.format("%s/subscriptions/%s/resourcegroups/%s?api-version=2014-04-01", this.provider.getContext().getCloud().getEndpoint(), this.provider.getContext().getAccountNumber(), name)); + addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(getProvider())); + requestBuilder.setUri(String.format("%s/subscriptions/%s/resourcegroups/%s?api-version=2014-04-01", getProvider().getContext().getCloud().getEndpoint(), getProvider().getContext().getAccountNumber(), name)); ArmResourceGroupModel armResourceGroupModel = new ArmResourceGroupModel(); - armResourceGroupModel.setLocation(this.provider.getContext().getRegionId()); + armResourceGroupModel.setLocation(getProvider().getContext().getRegionId()); requestBuilder.setEntity(new DaseinObjectToJsonEntity(armResourceGroupModel)); - return new AzureArmRequester(this.provider, this.provider.getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper() { + return new AzureArmRequester(getProvider(), getProvider().getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper() { @Override public ResourcePool mapFrom(ArmResourceGroupModel entity) { return getResourcePoolFrom(entity); @@ -192,10 +189,10 @@ public ResourcePool mapFrom(ArmResourceGroupModel entity) { public void deleteResourcePool(@Nonnull String providerResourcePoolId )throws InternalException, CloudException { RequestBuilder requestBuilder = RequestBuilder.delete(); - addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(this.provider)); - requestBuilder.setUri(String.format("%s/%s?api-version=2014-04-01", this.provider.getContext().getCloud().getEndpoint(), providerResourcePoolId)); + addCommonHeaders(requestBuilder, AzureArmRequester.getAuthenticationToken(getProvider())); + requestBuilder.setUri(String.format("%s/%s?api-version=2014-04-01", getProvider().getContext().getCloud().getEndpoint(), providerResourcePoolId)); - new AzureArmRequester(this.provider, this.provider.getAzureClientBuilderWithPooling(), requestBuilder.build()).execute(); + new AzureArmRequester(getProvider(), getProvider().getAzureClientBuilderWithPooling(), requestBuilder.build()).execute(); } private ResourcePool getResourcePoolFrom(ArmResourceGroupModel input) { diff --git a/src/main/java/org/dasein/cloud/azurearm/AzureArmLocationCapabilities.java b/src/main/java/org/dasein/cloud/azurearm/AzureArmLocationCapabilities.java index 3b2e4e6..3267497 100644 --- a/src/main/java/org/dasein/cloud/azurearm/AzureArmLocationCapabilities.java +++ b/src/main/java/org/dasein/cloud/azurearm/AzureArmLocationCapabilities.java @@ -52,7 +52,7 @@ public boolean supportsAffinityGroups() { @Override public boolean supportsResourcePools() { - return false; + return true; } /** diff --git a/src/main/java/org/dasein/cloud/azurearm/AzureArmRequester.java b/src/main/java/org/dasein/cloud/azurearm/AzureArmRequester.java index 9352af8..7500bca 100644 --- a/src/main/java/org/dasein/cloud/azurearm/AzureArmRequester.java +++ b/src/main/java/org/dasein/cloud/azurearm/AzureArmRequester.java @@ -7,6 +7,7 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.dasein.cloud.CloudException; import org.dasein.cloud.CloudProvider; +import org.dasein.cloud.GeneralCloudException; import org.dasein.cloud.util.requester.fluent.DaseinRequest; import java.util.concurrent.ExecutorService; @@ -58,7 +59,7 @@ public static String getAuthenticationToken(AzureArm provider) throws CloudExcep AuthenticationResult result = future.get(); return result.getAccessToken(); } catch(Exception ex){ - throw new CloudException("Could not obtain authentication token. " + ex.getMessage()); + throw new GeneralCloudException("Could not obtain authentication token. " + ex.getMessage()); } finally { service.shutdown(); diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java new file mode 100644 index 0000000..bd79a1d --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci; + +import org.dasein.cloud.AbstractCapabilities; +import org.dasein.cloud.Requirement; +import org.dasein.cloud.azurearm.AzureArm; +import org.dasein.cloud.ci.ConvergedInfrastructureCapabilities; + +import javax.annotation.Nonnull; + +/** + * User: daniellemayne + * Date: 24/03/2016 + * Time: 11:59 + */ +public class AzureArmConvergedInfrastructureCapabilities extends AbstractCapabilities implements ConvergedInfrastructureCapabilities { + public AzureArmConvergedInfrastructureCapabilities(@Nonnull AzureArm provider) {super(provider);} + + @Nonnull + @Override + public Requirement identifyResourcePoolLaunchRequirement() { + return Requirement.REQUIRED; + } + + @Nonnull + @Override + public Requirement identifyTemplateContentLaunchRequirement() { + return Requirement.OPTIONAL; + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java new file mode 100644 index 0000000..1d559f8 --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci; + +import org.apache.http.client.methods.RequestBuilder; +import org.dasein.cloud.CloudException; +import org.dasein.cloud.azurearm.AzureArm; +import org.dasein.cloud.azurearm.AzureArmRequester; +import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureRequestModel; +import org.dasein.cloud.util.requester.entities.DaseinObjectToJsonEntity; + +/** + * User: daniellemayne + * Date: 15/03/2016 + * Time: 08:40 + */ +public class AzureArmConvergedInfrastructureRequests { + private static final String LIST_TEMPLATE_DEPLOYMENTS = "%s/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Resources/deployments?api-version=2016-02-01"; + private static final String CREATE_TEMPLATE_DEPLOYMENT = "%s/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Resources/deployments/%s?api-version=2016-02-01"; + private static final String RESOURCE_WITH_ID = "%s/%s?api-version=2016-02-01"; + private static final String CANCEL_TEMPLATE_DEPLOYMENT = "%s/%s/cancel?api-version=2016-02-01"; + private static final String VALIDATE_TEMPLATE_DEPLOYMENT = "%s/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Resources/deployments/%s/validate?api-version=2016-02-01"; + + private AzureArm provider; + + public AzureArmConvergedInfrastructureRequests(AzureArm provider) { + this.provider = provider; + } + + public RequestBuilder listTemplateDeployments(String resourceGroup) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.get(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(LIST_TEMPLATE_DEPLOYMENTS, this.provider.getContext().getCloud().getEndpoint(), this.provider.getContext().getAccountNumber(), resourceGroup)); + return requestBuilder; + } + + public RequestBuilder createTemplateDeployment(ArmConvergedInfrastructureRequestModel armConvergedInfrastructureModel, String resourceGroup, String deploymentName) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.put(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(CREATE_TEMPLATE_DEPLOYMENT, this.provider.getContext().getCloud().getEndpoint(), this.provider.getContext().getAccountNumber(), resourceGroup, deploymentName)); + requestBuilder.setEntity(new DaseinObjectToJsonEntity(armConvergedInfrastructureModel)); + return requestBuilder; + } + + public RequestBuilder deleteTemplateDeployment(String tdId) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.delete(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(RESOURCE_WITH_ID, this.provider.getContext().getCloud().getEndpoint(), tdId)); + return requestBuilder; + } + + public RequestBuilder cancelTemplateDeployment(String tdId) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.post(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(CANCEL_TEMPLATE_DEPLOYMENT, this.provider.getContext().getCloud().getEndpoint(), tdId)); + return requestBuilder; + } + + public RequestBuilder validateTemplateDeployment(ArmConvergedInfrastructureRequestModel armConvergedInfrastructureModel, String resourceGroup, String deploymentName) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.post(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(VALIDATE_TEMPLATE_DEPLOYMENT, this.provider.getContext().getCloud().getEndpoint(), this.provider.getContext().getAccountNumber(), resourceGroup, deploymentName)); + requestBuilder.setEntity(new DaseinObjectToJsonEntity(armConvergedInfrastructureModel)); + return requestBuilder; + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureService.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureService.java new file mode 100644 index 0000000..e5e9efa --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureService.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci; + +import org.dasein.cloud.azurearm.AzureArm; +import org.dasein.cloud.ci.AbstractConvergedInfrastructureServices; +import org.dasein.cloud.ci.ConvergedInfrastructureSupport; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +/** + * User: daniellemayne + * Date: 14/03/2016 + * Time: 11:09 + */ +public class AzureArmConvergedInfrastructureService extends AbstractConvergedInfrastructureServices { + public AzureArmConvergedInfrastructureService(@Nonnull AzureArm provider) { + super(provider); + } + + @Nullable + @Override + public ConvergedInfrastructureSupport getConvergedInfrastructureSupport() { + return new AzureArmConvergedInfrastructureSupport(getProvider()); + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java new file mode 100644 index 0000000..b3fdd71 --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java @@ -0,0 +1,324 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci; + +import org.apache.log4j.Logger; +import org.dasein.cloud.CloudException; +import org.dasein.cloud.InternalException; +import org.dasein.cloud.ResourceNotFoundException; +import org.dasein.cloud.ResourceType; +import org.dasein.cloud.azurearm.AzureArm; +import org.dasein.cloud.azurearm.AzureArmLocation; +import org.dasein.cloud.azurearm.AzureArmRequester; +import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureRequestModel; +import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureResponseModel; +import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructuresResponseModel; +import org.dasein.cloud.ci.AbstractConvergedInfrastructureSupport; +import org.dasein.cloud.ci.ConvergedInfrastructure; +import org.dasein.cloud.ci.ConvergedInfrastructureCapabilities; +import org.dasein.cloud.ci.ConvergedInfrastructureFilterOptions; +import org.dasein.cloud.ci.ConvergedInfrastructureProvisionOptions; +import org.dasein.cloud.ci.ConvergedInfrastructureResource; +import org.dasein.cloud.ci.ConvergedInfrastructureState; +import org.dasein.cloud.dc.ResourcePool; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.SimpleTimeZone; + +/** + * User: daniellemayne + * Date: 14/03/2016 + * Time: 11:29 + */ +public class AzureArmConvergedInfrastructureSupport extends AbstractConvergedInfrastructureSupport { + static private final Logger logger = Logger.getLogger(AzureArmConvergedInfrastructureSupport.class); + + public AzureArmConvergedInfrastructureSupport(AzureArm provider) { + super(provider); + } + + @Nonnull + @Override + public ConvergedInfrastructureCapabilities getCapabilities() throws InternalException, CloudException { + return new AzureArmConvergedInfrastructureCapabilities(this.getProvider()); + } + + @Override + public boolean isSubscribed() throws CloudException, InternalException { + return true; + } + + @Nonnull + @Override + public Iterable listConvergedInfrastructures(@Nullable ConvergedInfrastructureFilterOptions options) throws CloudException, InternalException { + final ArrayList cis = new ArrayList(); + + String resourceGroupName = ""; + boolean continueSearchingResourceGroups = true; + AzureArmLocation locationSupport = this.getProvider().getDataCenterServices(); + Iterable resourceGroups = locationSupport.listResourcePools("ignore"); + + for (ResourcePool resourceGroup : resourceGroups) { + if (continueSearchingResourceGroups) { + if ( options == null || options.getResourceGroupId() == null ) { + resourceGroupName = resourceGroup.getName(); + } else { + if ( resourceGroup.getProvideResourcePoolId().equals(options.getResourceGroupId()) ) { + resourceGroupName = resourceGroup.getName(); + continueSearchingResourceGroups = false; + } + else { + continue; + } + } + ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = + new AzureArmRequester(this.getProvider(), + new AzureArmConvergedInfrastructureRequests(this.getProvider()).listTemplateDeployments(resourceGroupName).build()) + .withJsonProcessor(ArmConvergedInfrastructuresResponseModel.class).execute(); + + + for (ArmConvergedInfrastructureResponseModel acim : armConvergedInfrastructuresResponseModel.getArmConvergedInfrastructureModels()) { + acim.setProviderDatacenterId(resourceGroup.getDataCenterId()); + acim.setProviderResourceGroupId(resourceGroup.getProvideResourcePoolId()); + acim.setProviderRegionId(resourceGroup.getDataCenterId().substring(0, resourceGroup.getDataCenterId().lastIndexOf("-"))); + ConvergedInfrastructure ci = convergedInfrastructureFrom(acim); + if ( options == null || options.matches(ci) ) { + cis.add(ci); + } + } + } + } + + return cis; + } + + @Nonnull + @Override + public ConvergedInfrastructure provision(@Nonnull ConvergedInfrastructureProvisionOptions options) throws CloudException, InternalException { + if (options == null) { + throw new InternalException("ConvergedInfrastructureProvisionOptions parameter cannot be null"); + } + if (options.getResourceGroupId() == null) { + throw new InternalException("Resource group is required for provisioning of converged infrastructure"); + } + AzureArmLocation locationSupport = this.getProvider().getDataCenterServices(); + ResourcePool resourceGroup = locationSupport.getResourcePool(options.getResourceGroupId()); + String resourceGroupName = null; + if ( resourceGroup != null ) { + resourceGroupName = resourceGroup.getName(); + } + else { + throw new ResourceNotFoundException("Resource group", options.getResourceGroupId()); + } + + ArmConvergedInfrastructureRequestModel armConvergedInfrastructureModel = new ArmConvergedInfrastructureRequestModel(); + ArmConvergedInfrastructureRequestModel.Properties ciProperties = new ArmConvergedInfrastructureRequestModel.Properties(); + if (options.getMode() == null) { + ciProperties.setMode("Incremental"); + } + else { + ciProperties.setMode(options.getMode()); + } + if (options.isTemplateContentProvided()) { + ciProperties.setTemplate(options.getTemplate()); + ciProperties.setParameters(options.getParameters()); + } + else { + ciProperties.setTemplateLink(options.getTemplate()); + ciProperties.setParametersLink(options.getParameters()); + } + armConvergedInfrastructureModel.setProperties(ciProperties); + + ArmConvergedInfrastructureResponseModel armConvergedInfrastructureModelResult = + new AzureArmRequester(this.getProvider(), new AzureArmConvergedInfrastructureRequests(this.getProvider()) + .createTemplateDeployment(armConvergedInfrastructureModel, resourceGroupName, options.getName()).build()) + .withJsonProcessor(ArmConvergedInfrastructureResponseModel.class).execute(); + + armConvergedInfrastructureModelResult.setProviderDatacenterId(resourceGroup.getDataCenterId()); + armConvergedInfrastructureModelResult.setProviderResourceGroupId(resourceGroup.getProvideResourcePoolId()); + armConvergedInfrastructureModelResult.setProviderRegionId(resourceGroup.getDataCenterId().substring(0, resourceGroup.getDataCenterId().lastIndexOf("-"))); + + return convergedInfrastructureFrom(armConvergedInfrastructureModelResult); + } + + @Override + public void terminate(@Nonnull String ciId, @Nullable String explanation) throws CloudException, InternalException { + new AzureArmRequester(this.getProvider(), new AzureArmConvergedInfrastructureRequests(this.getProvider()).deleteTemplateDeployment(ciId).build()).execute(); + } + + @Override + public void cancelDeployment(@Nonnull String ciId, @Nullable String explanation) throws CloudException, InternalException { + new AzureArmRequester(this.getProvider(), new AzureArmConvergedInfrastructureRequests(this.getProvider()).cancelTemplateDeployment(ciId).build()).execute(); + } + + @Override + public ConvergedInfrastructure validateDeployment(@Nonnull ConvergedInfrastructureProvisionOptions options) throws CloudException, InternalException { + if (options == null) { + throw new InternalException("ConvergedInfrastructureProvisionOptions parameter cannot be null"); + } + if (options.getResourceGroupId() == null) { + throw new InternalException("Resource group is required for provisioning of converged infrastructure"); + } + + AzureArmLocation locationSupport = this.getProvider().getDataCenterServices(); + ResourcePool resourceGroup = locationSupport.getResourcePool(options.getResourceGroupId()); + String resourceGroupName = "" ; + if ( resourceGroup != null ) { + resourceGroupName = resourceGroup.getName(); + } + else { + throw new ResourceNotFoundException("Resource group", options.getResourceGroupId()); + } + + ArmConvergedInfrastructureRequestModel armConvergedInfrastructureModel = new ArmConvergedInfrastructureRequestModel(); + ArmConvergedInfrastructureRequestModel.Properties ciProperties = new ArmConvergedInfrastructureRequestModel.Properties(); + ciProperties.setMode("Incremental"); + if (options.isTemplateContentProvided()) { + ciProperties.setTemplate(options.getTemplate()); + ciProperties.setParameters(options.getParameters()); + } + else { + ciProperties.setTemplateLink(options.getTemplate()); + ciProperties.setParametersLink(options.getParameters()); + } + armConvergedInfrastructureModel.setProperties(ciProperties); + + ArmConvergedInfrastructureResponseModel armConvergedInfrastructureModelResult = + new AzureArmRequester(this.getProvider(), new AzureArmConvergedInfrastructureRequests(this.getProvider()) + .validateTemplateDeployment(armConvergedInfrastructureModel, resourceGroupName, options.getName()).build()) + .withJsonProcessor(ArmConvergedInfrastructureResponseModel.class).execute(); + + armConvergedInfrastructureModelResult.setProviderDatacenterId(resourceGroup.getDataCenterId()); + armConvergedInfrastructureModelResult.setProviderResourceGroupId(resourceGroup.getProvideResourcePoolId()); + armConvergedInfrastructureModelResult.setProviderRegionId(resourceGroup.getDataCenterId().substring(0, resourceGroup.getDataCenterId().lastIndexOf("-"))); + + return convergedInfrastructureFrom(armConvergedInfrastructureModelResult); + } + + private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastructureResponseModel armConvergedInfrastructureModel) throws InternalException{ + String id = armConvergedInfrastructureModel.getId(); + String name = armConvergedInfrastructureModel.getName(); + String regionId = armConvergedInfrastructureModel.getProviderRegionId(); + String datacenterID = armConvergedInfrastructureModel.getProviderDatacenterId(); + String resourceGroupName = armConvergedInfrastructureModel.getProviderResourceGroupId(); + Map tags = new HashMap(); + + ConvergedInfrastructureState state = ConvergedInfrastructureState.PENDING; + long timestamp = System.currentTimeMillis(); + List list = new ArrayList(); + + if (armConvergedInfrastructureModel.getProperties() != null) { + tags = armConvergedInfrastructureModel.getProperties().getTags(); + if (armConvergedInfrastructureModel.getProperties().getCiState() != null) { + String ciState = armConvergedInfrastructureModel.getProperties().getCiState(); + switch (ciState.toLowerCase()) { + case "accepted": + state = ConvergedInfrastructureState.ACCEPTED; + break; + case "ready": + state = ConvergedInfrastructureState.READY; + break; + case "cancelled": + state = ConvergedInfrastructureState.CANCELLED; + break; + case "failed": + state = ConvergedInfrastructureState.FAILED; + break; + case "deleted": + state = ConvergedInfrastructureState.DELETED; + break; + case "succeeded": + state = ConvergedInfrastructureState.SUCCEEDED; + break; + } + } + + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + fmt.setCalendar(Calendar.getInstance(new SimpleTimeZone(0, "GMT"))); + String provisioningTimestamp = armConvergedInfrastructureModel.getProperties().getProvisioningTimestamp(); + + try { + timestamp = fmt.parse(provisioningTimestamp).getTime(); + } + catch ( ParseException e ) { + logger.warn(e); + timestamp = System.currentTimeMillis(); + } + if (armConvergedInfrastructureModel.getProperties().getDependencies() != null) { + List resources = armConvergedInfrastructureModel.getProperties().getDependencies(); + for (ArmConvergedInfrastructureResponseModel.Properties.Dependency d : resources) { + String r = d.getOutputResourceId(); + String[] tokens = r.split("/"); + String subtype = ""; + String resourceId = ""; + if (tokens.length == 3) { + subtype = tokens[1]; + resourceId = tokens[2]; + } + else { + subtype = tokens[tokens.length-2]; + resourceId = tokens[tokens.length-1]; + } + ResourceType type = null; + switch (subtype.toLowerCase()) { + case "virtualmachines": + type = ResourceType.VIRTUAL_MACHINE; + break; + case "loadbalancers": + type = ResourceType.LOAD_BALANCER; + break; + case "inboundnatrules": + type = ResourceType.IP_FORWARDING_RULE; + break; + case "virtualnetworks": + type = ResourceType.VLAN; + break; + case "publicipaddresses": + type = ResourceType.IP_ADDRESS; + break; + case "networksecuritygroups": + type = ResourceType.FIREWALL; + break; + } + if (type != null) { + + ConvergedInfrastructureResource resource = ConvergedInfrastructureResource.getInstance(type, resourceId); + list.add(resource); + } + + } + } + } + ConvergedInfrastructure ci = ConvergedInfrastructure.getInstance(id, name, null, state, timestamp, datacenterID, regionId, resourceGroupName); + ConvergedInfrastructureResource[] resources = new ConvergedInfrastructureResource[list.size()]; + resources = list.toArray(resources); + ci.withResources(resources); + ci.setTags(tags); + return ci; + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java new file mode 100644 index 0000000..9fb5384 --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java @@ -0,0 +1,100 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRawValue; + +/** + * User: daniellemayne + * Date: 22/03/2016 + * Time: 11:17 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ArmConvergedInfrastructureRequestModel { + @JsonProperty("properties") + private Properties properties; + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class Properties { + @JsonRawValue + private String template; + @JsonProperty("mode") + private String mode; + @JsonRawValue + private String parameters; + @JsonProperty("templateLink") + private String templateLink; + @JsonProperty("parametersLink") + private String parametersLink; + + public String getTemplate() { + return template; + } + + public void setTemplate(String template) { + this.template = template; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getParameters() { + return parameters; + } + + public void setParameters(String parameters) { + this.parameters = parameters; + } + + public String getTemplateLink() { + return templateLink; + } + + public void setTemplateLink(String templateLink) { + this.templateLink = templateLink; + } + + public String getParametersLink() { + return parametersLink; + } + + public void setParametersLink(String parametersLink) { + this.parametersLink = parametersLink; + } + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java new file mode 100644 index 0000000..7f091c1 --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java @@ -0,0 +1,167 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * User: daniellemayne + * Date: 14/03/2016 + * Time: 11:41 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ArmConvergedInfrastructureResponseModel { + @JsonProperty("id") + private String id; + @JsonProperty("name") + private String name; + @JsonProperty("properties") + private Properties properties; + + private String providerDatacenterId; + private String providerRegionId; + private String providerResourceGroupId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + + public String getProviderDatacenterId() { + return providerDatacenterId; + } + + public void setProviderDatacenterId(String providerDatacenterId) { + this.providerDatacenterId = providerDatacenterId; + } + + public String getProviderRegionId() { + return providerRegionId; + } + + public void setProviderRegionId(String providerRegionId) { + this.providerRegionId = providerRegionId; + } + + public String getProviderResourceGroupId() { + return providerResourceGroupId; + } + + public void setProviderResourceGroupId(String providerResourceGroupId) { + this.providerResourceGroupId = providerResourceGroupId; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class Properties { + @JsonProperty("mode") + private String mode; + @JsonProperty("provisioningState") + private String ciState; + @JsonProperty("timestamp") + private String provisioningTimestamp; + @JsonProperty("outputResources") + private List dependencies; + private Map tags; + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getCiState() { + return ciState; + } + + public void setCiState(String ciState) { + this.ciState = ciState; + } + + public String getProvisioningTimestamp() { + return provisioningTimestamp; + } + + public void setProvisioningTimestamp(String provisioningTimestamp) { + this.provisioningTimestamp = provisioningTimestamp; + } + + public List getDependencies() { + return dependencies; + } + + public void setDependencies(List dependencies) { + this.dependencies = dependencies; + } + + public Map getTags() { + if (tags == null) { + tags = new HashMap(); + } + return tags; + } + + public void setTags(Map tags) { + this.tags = tags; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Dependency { + @JsonProperty("id") + private String resourceId; + + public String getOutputResourceId() { + return resourceId; + } + + public void setOutputResourceId(String resourceId) { + this.resourceId = resourceId; + } + } + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructuresResponseModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructuresResponseModel.java new file mode 100644 index 0000000..ef507aa --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructuresResponseModel.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +/** + * User: daniellemayne + * Date: 15/03/2016 + * Time: 08:31 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ArmConvergedInfrastructuresResponseModel { + @JsonProperty("value") + private List armConvergedInfrastructureModels; + + public List getArmConvergedInfrastructureModels() { + return armConvergedInfrastructureModels; + } + + public void setArmConvergedInfrastructureModels(List armConvergedInfrastructureModels) { + this.armConvergedInfrastructureModels = armConvergedInfrastructureModels; + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/network/AzureArmNetworkSupport.java b/src/main/java/org/dasein/cloud/azurearm/network/AzureArmNetworkSupport.java index 3bd02ef..3b5f147 100644 --- a/src/main/java/org/dasein/cloud/azurearm/network/AzureArmNetworkSupport.java +++ b/src/main/java/org/dasein/cloud/azurearm/network/AzureArmNetworkSupport.java @@ -9,12 +9,17 @@ import org.dasein.cloud.azurearm.network.model.ArmSubnetModel; import org.dasein.cloud.azurearm.network.model.ArmSubnetsModel; import org.dasein.cloud.dc.ResourcePool; -import org.dasein.cloud.network.*; +import org.dasein.cloud.network.AbstractVLANSupport; +import org.dasein.cloud.network.Subnet; +import org.dasein.cloud.network.SubnetCreateOptions; +import org.dasein.cloud.network.SubnetState; +import org.dasein.cloud.network.VLAN; +import org.dasein.cloud.network.VLANCapabilities; +import org.dasein.cloud.network.VlanCreateOptions; import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Arrays; -import java.util.Locale; /** * Created by vmunthiu on 1/21/2016. @@ -159,24 +164,6 @@ public VLANCapabilities getCapabilities() throws CloudException, InternalExcepti return new AzureArmNetworkCapabilities(this.getProvider()); } - @Nonnull - @Override - public String getProviderTermForNetworkInterface(@Nonnull Locale locale) { - return "Network Interface"; - } - - @Nonnull - @Override - public String getProviderTermForSubnet(@Nonnull Locale locale) { - return "Subnet"; - } - - @Nonnull - @Override - public String getProviderTermForVlan(@Nonnull Locale locale) { - return "Virtual Networks"; - } - @Override public boolean isSubscribed() throws CloudException, InternalException { return true; diff --git a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java new file mode 100644 index 0000000..2fc329c --- /dev/null +++ b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java @@ -0,0 +1,381 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.tests; + +import mockit.Mock; +import mockit.MockUp; +import mockit.Mocked; +import mockit.NonStrictExpectations; +import org.apache.commons.collections.IteratorUtils; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.HttpClientBuilder; +import org.dasein.cloud.Cloud; +import org.dasein.cloud.CloudException; +import org.dasein.cloud.InternalException; +import org.dasein.cloud.ProviderContext; +import org.dasein.cloud.ResourceType; +import org.dasein.cloud.azurearm.AzureArm; +import org.dasein.cloud.azurearm.AzureArmLocation; +import org.dasein.cloud.azurearm.AzureArmRequester; +import org.dasein.cloud.azurearm.ci.AzureArmConvergedInfrastructureSupport; +import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureResponseModel; +import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructuresResponseModel; +import org.dasein.cloud.ci.ConvergedInfrastructure; +import org.dasein.cloud.ci.ConvergedInfrastructureFilterOptions; +import org.dasein.cloud.ci.ConvergedInfrastructureProvisionOptions; +import org.dasein.cloud.ci.ConvergedInfrastructureResource; +import org.dasein.cloud.ci.ConvergedInfrastructureState; +import org.dasein.cloud.dc.ResourcePool; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * User: daniellemayne + * Date: 16/03/2016 + * Time: 08:45 + */ +@RunWith(JUnit4.class) +public class AzureArmConvergedInfrastructureSupportTests { + @Mocked + AzureArm armProviderMock; + @Mocked + ProviderContext providerContextMock; + @Mocked + Cloud cloudMock; + @Mocked + HttpClientBuilder httpClientBuilderMock; + @Mocked + AzureArmLocation armLocationMock; + + final String TEST_ACCOUNT_NO = "12323232323"; + final String TEST_REGION = "East US"; + final String TEST_ENDPOINT = "http://testendpoint/"; + final String TEST_RESOURCE_GROUP = "rg1"; + final String TEST_DEPLOYMENT_NAME = "testDeploymentName"; + final String TEST_TEMPLATE_CONTENT = "{template content goes here}"; + final String TEST_PARAMETERS_CONTENT = "{parameter content goes here}"; + + @Before + public void setUp() throws CloudException, InternalException { + new NonStrictExpectations() { + { armProviderMock.getContext(); result = providerContextMock; } + { armProviderMock.getAzureArmClientBuilder(); result = httpClientBuilderMock; } + { armProviderMock.getAzureClientBuilderWithPooling(); result = httpClientBuilderMock; } + { providerContextMock.getCloud(); result = cloudMock; } + { providerContextMock.getAccountNumber(); result = TEST_ACCOUNT_NO; } + { providerContextMock.getRegionId(); result = TEST_REGION; } + { cloudMock.getEndpoint(); result = TEST_ENDPOINT; } + { armProviderMock.getDataCenterServices(); result = armLocationMock; } + { armLocationMock.listResourcePools(anyString); result = getTestResourcePoolList(); } + }; + + new MockUp(){ + @Mock + String getAuthenticationToken(AzureArm provider){ + return "myauthenticationtoken"; + } + }; + } + + private List getTestResourcePoolList() { + ResourcePool rp = new ResourcePool(); + rp.setProvideResourcePoolId(TEST_RESOURCE_GROUP + "-id"); + rp.setName(TEST_RESOURCE_GROUP); + rp.setDataCenterId(TEST_REGION + "-dc"); + + final List rpList = new ArrayList(); + rpList.add(rp); + return rpList; + } + + private ArmConvergedInfrastructuresResponseModel getTestArmConvergedInfrastructuresModel() { + ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); + acim1.setId("acim1"); + acim1.setName("deployment1"); + + ArmConvergedInfrastructureResponseModel acim2 = new ArmConvergedInfrastructureResponseModel(); + acim2.setId("acim2"); + acim2.setName("deployment2"); + + List armConvergedInfrastructureModelList = new ArrayList(); + armConvergedInfrastructureModelList.add(acim1); + armConvergedInfrastructureModelList.add(acim2); + + final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); + armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); + + return armConvergedInfrastructuresResponseModel; + } + + @Test + public void listTemplateDeployments_shouldReturnAllAvailableTDs() throws CloudException, InternalException{ + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(getTestArmConvergedInfrastructuresModel()); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + } + }; + + Iterable actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + ConvergedInfrastructureFilterOptions options = ConvergedInfrastructureFilterOptions.getInstance().withResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + actualResult = convergedInfrastructureSupport.listConvergedInfrastructures(options); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertNotNull(actualResult); + List actualResultAsList = IteratorUtils.toList(actualResult.iterator()); + assertTrue(actualResultAsList.size() == 2); + } + + @Test + public void getTemplateDeployment_shouldReturnCorrectTD() throws InternalException, CloudException{ + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(getTestArmConvergedInfrastructuresModel()); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + } + }; + + ConvergedInfrastructure actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertNotNull(actualResult); + assertTrue(actualResult.getName().equals("deployment1")); + } + + @Test + public void convergedInfrastructureFrom_shouldReturnObjectWithCorrectAttributes() throws CloudException, InternalException{ + ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); + acim1.setId("acim1"); + acim1.setName("deployment1"); + acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + acim1.setProviderRegionId(TEST_REGION); + acim1.setProviderDatacenterId(TEST_REGION+"-dc"); + + ArmConvergedInfrastructureResponseModel.Properties properties = new ArmConvergedInfrastructureResponseModel.Properties(); + properties.setCiState("Accepted"); + properties.setProvisioningTimestamp("2015-01-01T18:26:20.6229141Z"); + + List dependencies = new ArrayList(); + ArmConvergedInfrastructureResponseModel.Properties.Dependency resource1 = new ArmConvergedInfrastructureResponseModel.Properties.Dependency(); + resource1.setOutputResourceId("microsoft.compute/virtualmachines/vm_001"); + dependencies.add(resource1); + + properties.setDependencies(dependencies); + acim1.setProperties(properties); + + List armConvergedInfrastructureModelList = new ArrayList(); + armConvergedInfrastructureModelList.add(acim1); + + final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); + armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); + + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + } + }; + + ConvergedInfrastructure actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertNotNull(actualResult); + assertTrue(actualResult.getName().equals("deployment1")); + assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); + assertTrue(actualResult.getProviderRegionId().equals(TEST_REGION)); + assertTrue(actualResult.getProviderDatacenterId().equals(TEST_REGION + "-dc")); + assertTrue(actualResult.getCiState().equals(ConvergedInfrastructureState.ACCEPTED)); + + String testTimestamp = "2015-01-01T18:26:20.6229141Z"; + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + try { + calendar.setTime(sdf.parse(testTimestamp)); + } + catch ( ParseException ignore ) {} + assertTrue(actualResult.getProvisioningTimestamp() == calendar.getTimeInMillis()); + + assertNotNull(actualResult.getResources()); + List resources = actualResult.getResources(); + assertTrue(resources.size() == 1); + ConvergedInfrastructureResource resource = resources.iterator().next(); + assertTrue(resource.getResourceId().equals("vm_001")); + assertTrue(resource.getResourceType().equals(ResourceType.VIRTUAL_MACHINE)); + } + + @Test + public void terminateTemplateDeployment_shouldDoADeleteToTerminateTDWithTDId(){ + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient("ok"); + new NonStrictExpectations(){{ httpClientBuilderMock.build(); result = closeableHttpClient; } }; + + String testTDId = "testtdid"; + String expectedDeleteUri = String.format("%s?api-version=2016-02-01", testTDId); + try{ + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.terminate(testTDId, ""); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("delete")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().endsWith(expectedDeleteUri)); + + } + + @Test + public void cancelTemplateDeployment_shouldDoAPostToCancelTDWithTDId(){ + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient("ok"); + new NonStrictExpectations(){{ httpClientBuilderMock.build(); result = closeableHttpClient; } }; + + String testTDId = "testtdid"; + String expectedCancelUri = String.format("%s/cancel?api-version=2016-02-01", testTDId); + try{ + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.cancelDeployment(testTDId, ""); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("post")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().endsWith(expectedCancelUri)); + } + + @Test + public void createTemplateDeployment_shouldDoAPutToCreateTDWithJsonEntity() throws CloudException, InternalException{ + ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, + TEST_RESOURCE_GROUP+"-id", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + + ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); + acim1.setId("acim1"); + acim1.setName(TEST_DEPLOYMENT_NAME); + acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + acim1.setProviderRegionId(TEST_REGION); + acim1.setProviderDatacenterId(TEST_REGION+"-dc"); + + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(acim1); + new NonStrictExpectations(){ + { armLocationMock.getResourcePool(anyString); + result = getTestResourcePoolList().get(0); + } + { httpClientBuilderMock.build(); + result = closeableHttpClient; + } + }; + + ConvergedInfrastructure actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.provision(options); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("put")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments/" + options.getName() + "?api-version=2016-02-01")); + assertNotNull(actualResult); + assertTrue(actualResult.getName().equals(options.getName())); + assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); + } + + @Test + public void validateTemplateDeployment_shouldDoAPostToValidateTDWithJsonEntity() throws CloudException, InternalException{ + ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, + TEST_RESOURCE_GROUP+"-id", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + + ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); + acim1.setId("acim1"); + acim1.setName(TEST_DEPLOYMENT_NAME); + acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + acim1.setProviderRegionId(TEST_REGION); + acim1.setProviderDatacenterId(TEST_REGION+"-dc"); + + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(acim1); + new NonStrictExpectations(){ + { armLocationMock.getResourcePool(anyString); + result = getTestResourcePoolList().get(0); + } + { httpClientBuilderMock.build(); + result = closeableHttpClient; + } + }; + + ConvergedInfrastructure actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.validateDeployment(options); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("post")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments/" + options.getName() + "/validate?api-version=2016-02-01")); + assertNotNull(actualResult); + assertTrue(actualResult.getName().equals(options.getName())); + assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); + } +} From 29059d6b8bf258d65710b6d58427be9546e835f0 Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Thu, 31 Mar 2016 15:19:46 +0100 Subject: [PATCH 2/9] extract error messages from failed deployments --- ...ureArmConvergedInfrastructureRequests.java | 8 + ...zureArmConvergedInfrastructureSupport.java | 64 ++++++- ...mConvergedInfrastructureResponseModel.java | 68 ++++++++ ...plateDeploymentOperationResponseModel.java | 164 ++++++++++++++++++ ...lateDeploymentOperationsResponseModel.java | 44 +++++ 5 files changed, 341 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationResponseModel.java create mode 100644 src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationsResponseModel.java diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java index 1d559f8..52e37e9 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java @@ -37,6 +37,7 @@ public class AzureArmConvergedInfrastructureRequests { private static final String RESOURCE_WITH_ID = "%s/%s?api-version=2016-02-01"; private static final String CANCEL_TEMPLATE_DEPLOYMENT = "%s/%s/cancel?api-version=2016-02-01"; private static final String VALIDATE_TEMPLATE_DEPLOYMENT = "%s/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Resources/deployments/%s/validate?api-version=2016-02-01"; + private static final String LIST_TEMPLATE_DEPLOYMENT_OPERATIONS = "%s/%s/operations?api-version=2016-02-01"; private AzureArm provider; @@ -80,4 +81,11 @@ public RequestBuilder validateTemplateDeployment(ArmConvergedInfrastructureReque requestBuilder.setEntity(new DaseinObjectToJsonEntity(armConvergedInfrastructureModel)); return requestBuilder; } + + public RequestBuilder listTemplateDeploymentOperations(String tdId) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.get(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(LIST_TEMPLATE_DEPLOYMENT_OPERATIONS, this.provider.getContext().getCloud().getEndpoint(), tdId)); + return requestBuilder; + } } diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java index b3fdd71..7404795 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java @@ -30,6 +30,8 @@ import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureRequestModel; import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureResponseModel; import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructuresResponseModel; +import org.dasein.cloud.azurearm.ci.model.ArmTemplateDeploymentOperationResponseModel; +import org.dasein.cloud.azurearm.ci.model.ArmTemplateDeploymentOperationsResponseModel; import org.dasein.cloud.ci.AbstractConvergedInfrastructureSupport; import org.dasein.cloud.ci.ConvergedInfrastructure; import org.dasein.cloud.ci.ConvergedInfrastructureCapabilities; @@ -220,7 +222,7 @@ public ConvergedInfrastructure validateDeployment(@Nonnull ConvergedInfrastructu return convergedInfrastructureFrom(armConvergedInfrastructureModelResult); } - private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastructureResponseModel armConvergedInfrastructureModel) throws InternalException{ + private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastructureResponseModel armConvergedInfrastructureModel) throws CloudException, InternalException{ String id = armConvergedInfrastructureModel.getId(); String name = armConvergedInfrastructureModel.getName(); String regionId = armConvergedInfrastructureModel.getProviderRegionId(); @@ -233,9 +235,10 @@ private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastr List list = new ArrayList(); if (armConvergedInfrastructureModel.getProperties() != null) { - tags = armConvergedInfrastructureModel.getProperties().getTags(); - if (armConvergedInfrastructureModel.getProperties().getCiState() != null) { - String ciState = armConvergedInfrastructureModel.getProperties().getCiState(); + ArmConvergedInfrastructureResponseModel.Properties properties = armConvergedInfrastructureModel.getProperties(); + tags = properties.getTags(); + if (properties.getCiState() != null) { + String ciState = properties.getCiState(); switch (ciState.toLowerCase()) { case "accepted": state = ConvergedInfrastructureState.ACCEPTED; @@ -258,9 +261,28 @@ private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastr } } + if (state.equals(ConvergedInfrastructureState.FAILED)) { + //get error related info and add as a tag + if (properties.getDeploymentError() != null) { + ArmConvergedInfrastructureResponseModel.Properties.DeploymentError deploymentError = properties.getDeploymentError(); + List detailsList = deploymentError.getErrorDetails(); + if (detailsList!= null && !detailsList.isEmpty()) { + int errorCount = 0; + for (ArmConvergedInfrastructureResponseModel.Properties.DeploymentError.ErrorDetails error : detailsList) { + String message = error.getMessage(); + errorCount++; + tags.put("error"+errorCount, message); + } + } + } + else { + getFailedOperationErrorMessages(id, tags); + } + } + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); fmt.setCalendar(Calendar.getInstance(new SimpleTimeZone(0, "GMT"))); - String provisioningTimestamp = armConvergedInfrastructureModel.getProperties().getProvisioningTimestamp(); + String provisioningTimestamp = properties.getProvisioningTimestamp(); try { timestamp = fmt.parse(provisioningTimestamp).getTime(); @@ -269,8 +291,8 @@ private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastr logger.warn(e); timestamp = System.currentTimeMillis(); } - if (armConvergedInfrastructureModel.getProperties().getDependencies() != null) { - List resources = armConvergedInfrastructureModel.getProperties().getDependencies(); + if (properties.getDependencies() != null) { + List resources = properties.getDependencies(); for (ArmConvergedInfrastructureResponseModel.Properties.Dependency d : resources) { String r = d.getOutputResourceId(); String[] tokens = r.split("/"); @@ -321,4 +343,32 @@ private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastr ci.setTags(tags); return ci; } + + private void getFailedOperationErrorMessages(String tdId, Map tags) throws CloudException, InternalException{ + ArmTemplateDeploymentOperationsResponseModel armTemplateDeploymentOperationsResponseModel = + new AzureArmRequester(this.getProvider(), + new AzureArmConvergedInfrastructureRequests(this.getProvider()).listTemplateDeploymentOperations(tdId).build()) + .withJsonProcessor(ArmTemplateDeploymentOperationsResponseModel.class).execute(); + + for (ArmTemplateDeploymentOperationResponseModel atdom : armTemplateDeploymentOperationsResponseModel.getArmTemplateDeploymentOperationModels()) { + if (atdom.getProperties() != null) { + ArmTemplateDeploymentOperationResponseModel.Properties properties = atdom.getProperties(); + if (properties.getProvisioningState().toLowerCase().equals("failed")) { + String statusCode = properties.getStatusCode(); + ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage statusMessage = properties.getStatusMessage(); + ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError statusError = statusMessage.getStatusError(); + List detailsList = statusError.getErrorDetails(); + if (detailsList!= null && !detailsList.isEmpty()) { + int errorCount = 0; + for (ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError.ErrorDetails error : detailsList) { + String message = error.getMessage(); + errorCount++; + String fullError = statusCode+": "+message; + tags.put("opError"+errorCount, fullError); + } + } + } + } + } + } } diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java index 7f091c1..9f63575 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureResponseModel.java @@ -105,6 +105,8 @@ public static class Properties { private String provisioningTimestamp; @JsonProperty("outputResources") private List dependencies; + @JsonProperty("error") + private DeploymentError deploymentError; private Map tags; public String getMode() { @@ -139,6 +141,14 @@ public void setDependencies(List dependencies) { this.dependencies = dependencies; } + public DeploymentError getDeploymentError() { + return deploymentError; + } + + public void setDeploymentError(DeploymentError deploymentError) { + this.deploymentError = deploymentError; + } + public Map getTags() { if (tags == null) { tags = new HashMap(); @@ -163,5 +173,63 @@ public void setOutputResourceId(String resourceId) { this.resourceId = resourceId; } } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class DeploymentError { + @JsonProperty("code") + private String code; + @JsonProperty("message") + private String message; + @JsonProperty("details") + private List errorDetails; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public List getErrorDetails() { + return errorDetails; + } + + public void setErrorDetails(List errorDetails) { + this.errorDetails = errorDetails; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class ErrorDetails { + @JsonProperty("code") + private String code; + @JsonProperty("message") + private String message; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } + } } } diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationResponseModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationResponseModel.java new file mode 100644 index 0000000..c967064 --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationResponseModel.java @@ -0,0 +1,164 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +/** + * User: daniellemayne + * Date: 31/03/2016 + * Time: 12:49 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ArmTemplateDeploymentOperationResponseModel { + @JsonProperty("properties") + private Properties properties; + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class Properties { + @JsonProperty("provisioningState") + private String provisioningState; + @JsonProperty("statusCode") + private String statusCode; + @JsonProperty("statusMessage") + private StatusMessage statusMessage; + + public String getProvisioningState() { + return provisioningState; + } + + public void setProvisioningState(String provisioningState) { + this.provisioningState = provisioningState; + } + + public String getStatusCode() { + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public StatusMessage getStatusMessage() { + return statusMessage; + } + + public void setStatusMessage(StatusMessage statusMessage) { + this.statusMessage = statusMessage; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class StatusMessage { + @JsonProperty("status") + private String status; + @JsonProperty("error") + private StatusError statusError; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public StatusError getStatusError() { + return statusError; + } + + public void setStatusError(StatusError statusError) { + this.statusError = statusError; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class StatusError { + @JsonProperty("code") + private String code; + @JsonProperty("message") + private String message; + @JsonProperty("details") + private List errorDetails; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public List getErrorDetails() { + return errorDetails; + } + + public void setErrorDetails(List errorDetails) { + this.errorDetails = errorDetails; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class ErrorDetails { + @JsonProperty("code") + private String code; + @JsonProperty("message") + private String message; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } + } + } + } +} diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationsResponseModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationsResponseModel.java new file mode 100644 index 0000000..aa711dd --- /dev/null +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmTemplateDeploymentOperationsResponseModel.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2009-2016 Dell, Inc. + * See annotations for authorship information + *

+ * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.dasein.cloud.azurearm.ci.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +/** + * User: daniellemayne + * Date: 31/03/2016 + * Time: 12:48 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ArmTemplateDeploymentOperationsResponseModel { + @JsonProperty("value") + private List armTemplateDeploymentOperationModels; + + public List getArmTemplateDeploymentOperationModels() { + return armTemplateDeploymentOperationModels; + } + + public void setArmTemplateDeploymentOperationModels(List armTemplateDeploymentOperationModels) { + this.armTemplateDeploymentOperationModels = armTemplateDeploymentOperationModels; + } +} From 64f8200059da153cc7a2d594d86e21a0e326d766 Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Thu, 31 Mar 2016 16:35:34 +0100 Subject: [PATCH 3/9] more tests --- ...rmConvergedInfrastructureSupportTests.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java index 2fc329c..d20e58b 100644 --- a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java +++ b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java @@ -30,6 +30,7 @@ import org.dasein.cloud.CloudException; import org.dasein.cloud.InternalException; import org.dasein.cloud.ProviderContext; +import org.dasein.cloud.ResourceNotFoundException; import org.dasein.cloud.ResourceType; import org.dasein.cloud.azurearm.AzureArm; import org.dasein.cloud.azurearm.AzureArmLocation; @@ -54,6 +55,7 @@ import java.util.Calendar; import java.util.List; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -163,12 +165,64 @@ public void listTemplateDeployments_shouldReturnAllAvailableTDs() throws CloudEx assertTrue(actualResultAsList.size() == 2); } + @Test + public void listTemplateDeployments_shouldReturnEmptyListIfInvalidResourceGroup() throws CloudException, InternalException { + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient<>("ok"); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + times = 0; + } + }; + + Iterable actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + ConvergedInfrastructureFilterOptions options = ConvergedInfrastructureFilterOptions.getInstance().withResourceGroupId("random_id"); + actualResult = convergedInfrastructureSupport.listConvergedInfrastructures(options); + } catch (Exception e) {} + + assertFalse(closeableHttpClient.isExecuteCalled()); + assertNotNull(actualResult); + List actualResultAsList = IteratorUtils.toList(actualResult.iterator()); + assertTrue(actualResultAsList.size() == 0); + } + + @Test + public void listTemplateDeployments_shouldReturnEmptyListIfNoFilterMatch() throws CloudException, InternalException { + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(getTestArmConvergedInfrastructuresModel()); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + } + }; + + Iterable actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + ConvergedInfrastructureFilterOptions options = ConvergedInfrastructureFilterOptions.getInstance("filter").withResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + actualResult = convergedInfrastructureSupport.listConvergedInfrastructures(options); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertNotNull(actualResult); + List actualResultAsList = IteratorUtils.toList(actualResult.iterator()); + assertTrue(actualResultAsList.size() == 0); + } + @Test public void getTemplateDeployment_shouldReturnCorrectTD() throws InternalException, CloudException{ final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(getTestArmConvergedInfrastructuresModel()); new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; + minTimes = 1; } }; @@ -339,6 +393,39 @@ public void createTemplateDeployment_shouldDoAPutToCreateTDWithJsonEntity() thro assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); } + @Test(expected = InternalException.class) + public void createTemplateDeployment_shouldThrowExceptionIfOptionsIsNull() throws CloudException, InternalException{ + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.provision(null); + } + + @Test(expected = InternalException.class) + public void createTemplateDeployment_shouldThrowExceptionIfResourceGroupIdIsNull() throws CloudException, InternalException{ + ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, + null, "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.provision(options); + } + + @Test(expected = ResourceNotFoundException.class) + public void createTemplateDeployment_shouldThrowExceptionIfResourceGroupNotValid() throws CloudException, InternalException{ + ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, + "myFakeId", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + + new NonStrictExpectations(){ + { armLocationMock.getResourcePool(anyString); + result = null; + } + { httpClientBuilderMock.build(); + times = 0; + } + }; + + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.provision(options); + } + @Test public void validateTemplateDeployment_shouldDoAPostToValidateTDWithJsonEntity() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, From dd21aeb032f2598819e2364d19af0de54474d06a Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Mon, 4 Apr 2016 16:12:07 +0100 Subject: [PATCH 4/9] support provision of public links for templates and parameters --- ...zureArmConvergedInfrastructureSupport.java | 20 ++++++++--- ...rmConvergedInfrastructureRequestModel.java | 35 +++++++++++++++---- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java index 7404795..9d62056 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java @@ -151,8 +151,14 @@ public ConvergedInfrastructure provision(@Nonnull ConvergedInfrastructureProvisi ciProperties.setParameters(options.getParameters()); } else { - ciProperties.setTemplateLink(options.getTemplate()); - ciProperties.setParametersLink(options.getParameters()); + ArmConvergedInfrastructureRequestModel.Properties.FileLink templateLink = new ArmConvergedInfrastructureRequestModel.Properties.FileLink(); + templateLink.setUri(options.getTemplate()); + templateLink.setContentVersion("1.0.0.0"); + ArmConvergedInfrastructureRequestModel.Properties.FileLink parametersLink = new ArmConvergedInfrastructureRequestModel.Properties.FileLink(); + parametersLink.setUri(options.getParameters()); + parametersLink.setContentVersion("1.0.0.0"); + ciProperties.setTemplateLink(templateLink); + ciProperties.setParametersLink(parametersLink); } armConvergedInfrastructureModel.setProperties(ciProperties); @@ -205,8 +211,14 @@ public ConvergedInfrastructure validateDeployment(@Nonnull ConvergedInfrastructu ciProperties.setParameters(options.getParameters()); } else { - ciProperties.setTemplateLink(options.getTemplate()); - ciProperties.setParametersLink(options.getParameters()); + ArmConvergedInfrastructureRequestModel.Properties.FileLink templateLink = new ArmConvergedInfrastructureRequestModel.Properties.FileLink(); + templateLink.setUri(options.getTemplate()); + templateLink.setContentVersion("1.0.0.0"); + ArmConvergedInfrastructureRequestModel.Properties.FileLink parametersLink = new ArmConvergedInfrastructureRequestModel.Properties.FileLink(); + parametersLink.setUri(options.getParameters()); + parametersLink.setContentVersion("1.0.0.0"); + ciProperties.setTemplateLink(templateLink); + ciProperties.setParametersLink(parametersLink); } armConvergedInfrastructureModel.setProperties(ciProperties); diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java index 9fb5384..f11e71d 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/model/ArmConvergedInfrastructureRequestModel.java @@ -53,9 +53,9 @@ public static class Properties { @JsonRawValue private String parameters; @JsonProperty("templateLink") - private String templateLink; + private FileLink templateLink; @JsonProperty("parametersLink") - private String parametersLink; + private FileLink parametersLink; public String getTemplate() { return template; @@ -81,20 +81,43 @@ public void setParameters(String parameters) { this.parameters = parameters; } - public String getTemplateLink() { + public FileLink getTemplateLink() { return templateLink; } - public void setTemplateLink(String templateLink) { + public void setTemplateLink(FileLink templateLink) { this.templateLink = templateLink; } - public String getParametersLink() { + public FileLink getParametersLink() { return parametersLink; } - public void setParametersLink(String parametersLink) { + public void setParametersLink(FileLink parametersLink) { this.parametersLink = parametersLink; } + + public static class FileLink { + @JsonProperty("uri") + private String uri; + @JsonProperty("contentVersion") + private String contentVersion; + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getContentVersion() { + return contentVersion; + } + + public void setContentVersion(String contentVersion) { + this.contentVersion = contentVersion; + } + } } } From f9a2869322b39377e884d0d0ba6ae21e43d69e5b Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Mon, 4 Apr 2016 16:14:22 +0100 Subject: [PATCH 5/9] supporting unit tests --- ...rmConvergedInfrastructureSupportTests.java | 263 +++++++++++++++++- 1 file changed, 259 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java index d20e58b..0938a38 100644 --- a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java +++ b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java @@ -38,6 +38,8 @@ import org.dasein.cloud.azurearm.ci.AzureArmConvergedInfrastructureSupport; import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructureResponseModel; import org.dasein.cloud.azurearm.ci.model.ArmConvergedInfrastructuresResponseModel; +import org.dasein.cloud.azurearm.ci.model.ArmTemplateDeploymentOperationResponseModel; +import org.dasein.cloud.azurearm.ci.model.ArmTemplateDeploymentOperationsResponseModel; import org.dasein.cloud.ci.ConvergedInfrastructure; import org.dasein.cloud.ci.ConvergedInfrastructureFilterOptions; import org.dasein.cloud.ci.ConvergedInfrastructureProvisionOptions; @@ -53,11 +55,10 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.List; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; /** * User: daniellemayne @@ -113,8 +114,14 @@ private List getTestResourcePoolList() { rp.setName(TEST_RESOURCE_GROUP); rp.setDataCenterId(TEST_REGION + "-dc"); + ResourcePool rp2 = new ResourcePool(); + rp2.setProvideResourcePoolId(TEST_RESOURCE_GROUP + "2-id"); + rp2.setName(TEST_RESOURCE_GROUP+"2"); + rp2.setDataCenterId(TEST_REGION + "-dc"); + final List rpList = new ArrayList(); rpList.add(rp); + rpList.add(rp2); return rpList; } @@ -143,6 +150,7 @@ public void listTemplateDeployments_shouldReturnAllAvailableTDs() throws CloudEx new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; + times = 1; } }; @@ -165,6 +173,29 @@ public void listTemplateDeployments_shouldReturnAllAvailableTDs() throws CloudEx assertTrue(actualResultAsList.size() == 2); } + @Test + public void listTemplateDeployments_shouldReturnEmptyListIfNoResourceGroupsFound() throws CloudException, InternalException { + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient<>("ok"); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + times = 0; + } + { armLocationMock.listResourcePools(anyString); result = Collections.EMPTY_LIST; } + }; + + Iterable actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.listConvergedInfrastructures(null); + } catch (Exception e) {} + + assertFalse(closeableHttpClient.isExecuteCalled()); + assertNotNull(actualResult); + List actualResultAsList = IteratorUtils.toList(actualResult.iterator()); + assertTrue(actualResultAsList.size() == 0); + } + @Test public void listTemplateDeployments_shouldReturnEmptyListIfInvalidResourceGroup() throws CloudException, InternalException { final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient<>("ok"); @@ -194,6 +225,7 @@ public void listTemplateDeployments_shouldReturnEmptyListIfNoFilterMatch() throw new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; + times = 1; } }; @@ -222,7 +254,7 @@ public void getTemplateDeployment_shouldReturnCorrectTD() throws InternalExcepti new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; - minTimes = 1; + times = 2; // 2 available resource groups to search } }; @@ -274,6 +306,7 @@ public void convergedInfrastructureFrom_shouldReturnObjectWithCorrectAttributes( new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; + times = 2; } }; @@ -314,6 +347,195 @@ public void convergedInfrastructureFrom_shouldReturnObjectWithCorrectAttributes( assertTrue(resource.getResourceType().equals(ResourceType.VIRTUAL_MACHINE)); } + @Test + public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentsInErrorState() throws CloudException, InternalException{ + ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); + acim1.setId("acim1"); + acim1.setName("deployment1"); + acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + acim1.setProviderRegionId(TEST_REGION); + acim1.setProviderDatacenterId(TEST_REGION+"-dc"); + + ArmConvergedInfrastructureResponseModel.Properties properties = new ArmConvergedInfrastructureResponseModel.Properties(); + properties.setCiState("Failed"); + properties.setProvisioningTimestamp("2015-01-01T18:26:20.6229141Z"); + + List dependencies = new ArrayList(); + ArmConvergedInfrastructureResponseModel.Properties.Dependency resource1 = new ArmConvergedInfrastructureResponseModel.Properties.Dependency(); + resource1.setOutputResourceId("microsoft.compute/virtualmachines/vm_001"); + dependencies.add(resource1); + + properties.setDependencies(dependencies); + + ArmConvergedInfrastructureResponseModel.Properties.DeploymentError deploymentError = new ArmConvergedInfrastructureResponseModel.Properties.DeploymentError(); + ArmConvergedInfrastructureResponseModel.Properties.DeploymentError.ErrorDetails errorDetails = new ArmConvergedInfrastructureResponseModel.Properties.DeploymentError.ErrorDetails(); + errorDetails.setCode("Conflict Error"); + errorDetails.setMessage("Unable to create due to conflict"); + List errorList = new ArrayList(); + errorList.add(errorDetails); + deploymentError.setErrorDetails(errorList); + properties.setDeploymentError(deploymentError); + + acim1.setProperties(properties); + + List armConvergedInfrastructureModelList = new ArrayList(); + armConvergedInfrastructureModelList.add(acim1); + + final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); + armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); + + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + times = 2; + } + }; + + ConvergedInfrastructure actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertNotNull(actualResult); + assertTrue(actualResult.getName().equals("deployment1")); + assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); + assertTrue(actualResult.getProviderRegionId().equals(TEST_REGION)); + assertTrue(actualResult.getProviderDatacenterId().equals(TEST_REGION + "-dc")); + assertTrue(actualResult.getCiState().equals(ConvergedInfrastructureState.FAILED)); + + String testTimestamp = "2015-01-01T18:26:20.6229141Z"; + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + try { + calendar.setTime(sdf.parse(testTimestamp)); + } + catch ( ParseException ignore ) {} + assertTrue(actualResult.getProvisioningTimestamp() == calendar.getTimeInMillis()); + + assertNotNull(actualResult.getResources()); + List resources = actualResult.getResources(); + assertTrue(resources.size() == 1); + ConvergedInfrastructureResource resource = resources.iterator().next(); + assertTrue(resource.getResourceId().equals("vm_001")); + assertTrue(resource.getResourceType().equals(ResourceType.VIRTUAL_MACHINE)); + assertNotNull(actualResult.getTags()); + assertNotNull(actualResult.getTag("error1")); + assertTrue(actualResult.getTag("error1").equals("Unable to create due to conflict")); + } + + @Test + public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentOperationsInErrorState() throws CloudException, InternalException{ + ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); + acim1.setId("acim1"); + acim1.setName("deployment1"); + acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); + acim1.setProviderRegionId(TEST_REGION); + acim1.setProviderDatacenterId(TEST_REGION+"-dc"); + + ArmConvergedInfrastructureResponseModel.Properties properties = new ArmConvergedInfrastructureResponseModel.Properties(); + properties.setCiState("Failed"); + properties.setProvisioningTimestamp("2015-01-02T18:26:20.6229141Z"); + + List dependencies = new ArrayList(); + ArmConvergedInfrastructureResponseModel.Properties.Dependency resource1 = new ArmConvergedInfrastructureResponseModel.Properties.Dependency(); + resource1.setOutputResourceId("microsoft.compute/virtualmachines/vm_001"); + dependencies.add(resource1); + + properties.setDependencies(dependencies); + + ArmTemplateDeploymentOperationResponseModel.Properties operationProperties = new ArmTemplateDeploymentOperationResponseModel.Properties(); + ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage statusMessage = new ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage(); + ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError statusError = new ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError(); + ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError.ErrorDetails errorDetails = new ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError.ErrorDetails(); + errorDetails.setCode("Conflict Error"); + errorDetails.setMessage("Unable to create due to conflict"); + List errorList = new ArrayList(); + errorList.add(errorDetails); + statusError.setErrorDetails(errorList); + statusMessage.setStatusError(statusError); + operationProperties.setStatusMessage(statusMessage); + operationProperties.setStatusCode("Conflict"); + operationProperties.setProvisioningState("Failed"); + + ArmTemplateDeploymentOperationResponseModel atdom1 = new ArmTemplateDeploymentOperationResponseModel(); + atdom1.setProperties(operationProperties); + + List armTemplateDeploymentOperationModelList = new ArrayList(); + armTemplateDeploymentOperationModelList.add(atdom1); + + final ArmTemplateDeploymentOperationsResponseModel armTemplateDeploymentOperationsResponseModel = new ArmTemplateDeploymentOperationsResponseModel(); + armTemplateDeploymentOperationsResponseModel.setArmTemplateDeploymentOperationModels(armTemplateDeploymentOperationModelList); + + final TestCloseableHttpClient closeableHttpClient2 = new TestCloseableHttpClient(armTemplateDeploymentOperationsResponseModel); + + + acim1.setProperties(properties); + + List armConvergedInfrastructureModelList = new ArrayList(); + armConvergedInfrastructureModelList.add(acim1); + + final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); + armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); + + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + new NonStrictExpectations(){ + { httpClientBuilderMock.build(); + result = closeableHttpClient; + result = closeableHttpClient2; + result = closeableHttpClient; + result = closeableHttpClient2; + } + }; + + ConvergedInfrastructure actualResult = null; + try { + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + } catch (Exception e) {} + + assertTrue(closeableHttpClient.isExecuteCalled()); + HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); + assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); + assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); + assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); + assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertNotNull(actualResult); + assertTrue(actualResult.getName().equals("deployment1")); + assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); + assertTrue(actualResult.getProviderRegionId().equals(TEST_REGION)); + assertTrue(actualResult.getProviderDatacenterId().equals(TEST_REGION + "-dc")); + assertTrue(actualResult.getCiState().equals(ConvergedInfrastructureState.FAILED)); + + String testTimestamp = "2015-01-02T18:26:20.6229141Z"; + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + try { + calendar.setTime(sdf.parse(testTimestamp)); + } + catch ( ParseException ignore ) {} + assertTrue(actualResult.getProvisioningTimestamp() == calendar.getTimeInMillis()); + + assertNotNull(actualResult.getResources()); + List resources = actualResult.getResources(); + assertTrue(resources.size() == 1); + ConvergedInfrastructureResource resource = resources.iterator().next(); + assertTrue(resource.getResourceId().equals("vm_001")); + assertTrue(resource.getResourceType().equals(ResourceType.VIRTUAL_MACHINE)); + assertNotNull(actualResult.getTags()); + assertNotNull(actualResult.getTag("opError1")); + assertTrue(actualResult.getTag("opError1").equals("Conflict: Unable to create due to conflict")); + } + @Test public void terminateTemplateDeployment_shouldDoADeleteToTerminateTDWithTDId(){ final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient("ok"); @@ -465,4 +687,37 @@ public void validateTemplateDeployment_shouldDoAPostToValidateTDWithJsonEntity() assertTrue(actualResult.getName().equals(options.getName())); assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); } + + @Test(expected = InternalException.class) + public void validateTemplateDeployment_shouldThrowExceptionIfOptionsIsNull() throws CloudException, InternalException{ + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.validateDeployment(null); + } + + @Test(expected = InternalException.class) + public void validateTemplateDeployment_shouldThrowExceptionIfResourceGroupIdIsNull() throws CloudException, InternalException{ + ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, + null, "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.validateDeployment(options); + } + + @Test(expected = ResourceNotFoundException.class) + public void validateTemplateDeployment_shouldThrowExceptionIfResourceGroupNotValid() throws CloudException, InternalException{ + ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, + "myFakeId", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + + new NonStrictExpectations(){ + { armLocationMock.getResourcePool(anyString); + result = null; + } + { httpClientBuilderMock.build(); + times = 0; + } + }; + + AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); + convergedInfrastructureSupport.validateDeployment(options); + } } From 45d8f73d90c1d9387a9e1c4df53e85d932c21401 Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Mon, 4 Apr 2016 16:30:19 +0100 Subject: [PATCH 6/9] tidy up logical code groupings --- ...zureArmConvergedInfrastructureSupport.java | 7 ++----- ...rmConvergedInfrastructureSupportTests.java | 21 +++++++------------ 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java index 9d62056..830ab65 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java @@ -276,8 +276,7 @@ private ConvergedInfrastructure convergedInfrastructureFrom(ArmConvergedInfrastr if (state.equals(ConvergedInfrastructureState.FAILED)) { //get error related info and add as a tag if (properties.getDeploymentError() != null) { - ArmConvergedInfrastructureResponseModel.Properties.DeploymentError deploymentError = properties.getDeploymentError(); - List detailsList = deploymentError.getErrorDetails(); + List detailsList = properties.getDeploymentError().getErrorDetails(); if (detailsList!= null && !detailsList.isEmpty()) { int errorCount = 0; for (ArmConvergedInfrastructureResponseModel.Properties.DeploymentError.ErrorDetails error : detailsList) { @@ -367,9 +366,7 @@ private void getFailedOperationErrorMessages(String tdId, Map ta ArmTemplateDeploymentOperationResponseModel.Properties properties = atdom.getProperties(); if (properties.getProvisioningState().toLowerCase().equals("failed")) { String statusCode = properties.getStatusCode(); - ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage statusMessage = properties.getStatusMessage(); - ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError statusError = statusMessage.getStatusError(); - List detailsList = statusError.getErrorDetails(); + List detailsList = properties.getStatusMessage().getStatusError().getErrorDetails(); if (detailsList!= null && !detailsList.isEmpty()) { int errorCount = 0; for (ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError.ErrorDetails error : detailsList) { diff --git a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java index 0938a38..c5367a3 100644 --- a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java +++ b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java @@ -364,7 +364,6 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentsInErrorSt ArmConvergedInfrastructureResponseModel.Properties.Dependency resource1 = new ArmConvergedInfrastructureResponseModel.Properties.Dependency(); resource1.setOutputResourceId("microsoft.compute/virtualmachines/vm_001"); dependencies.add(resource1); - properties.setDependencies(dependencies); ArmConvergedInfrastructureResponseModel.Properties.DeploymentError deploymentError = new ArmConvergedInfrastructureResponseModel.Properties.DeploymentError(); @@ -449,8 +448,14 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentOperations ArmConvergedInfrastructureResponseModel.Properties.Dependency resource1 = new ArmConvergedInfrastructureResponseModel.Properties.Dependency(); resource1.setOutputResourceId("microsoft.compute/virtualmachines/vm_001"); dependencies.add(resource1); - properties.setDependencies(dependencies); + acim1.setProperties(properties); + + List armConvergedInfrastructureModelList = new ArrayList(); + armConvergedInfrastructureModelList.add(acim1); + + final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); + armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); ArmTemplateDeploymentOperationResponseModel.Properties operationProperties = new ArmTemplateDeploymentOperationResponseModel.Properties(); ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage statusMessage = new ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage(); @@ -475,18 +480,8 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentOperations final ArmTemplateDeploymentOperationsResponseModel armTemplateDeploymentOperationsResponseModel = new ArmTemplateDeploymentOperationsResponseModel(); armTemplateDeploymentOperationsResponseModel.setArmTemplateDeploymentOperationModels(armTemplateDeploymentOperationModelList); - final TestCloseableHttpClient closeableHttpClient2 = new TestCloseableHttpClient(armTemplateDeploymentOperationsResponseModel); - - - acim1.setProperties(properties); - - List armConvergedInfrastructureModelList = new ArrayList(); - armConvergedInfrastructureModelList.add(acim1); - - final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); - armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); - final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + final TestCloseableHttpClient closeableHttpClient2 = new TestCloseableHttpClient(armTemplateDeploymentOperationsResponseModel); new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; From 0e3a61d929fdc7d8943e4b3ccc3ce304f11f50db Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Tue, 5 Apr 2016 11:25:35 +0100 Subject: [PATCH 7/9] implement getConvergedInfrastructure + unit test updates --- ...ureArmConvergedInfrastructureRequests.java | 7 ++ ...zureArmConvergedInfrastructureSupport.java | 22 +++++ ...rmConvergedInfrastructureSupportTests.java | 83 +++++++++---------- 3 files changed, 68 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java index 52e37e9..3b4bdde 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java @@ -45,6 +45,13 @@ public AzureArmConvergedInfrastructureRequests(AzureArm provider) { this.provider = provider; } + public RequestBuilder getTemplateDeployment(String tdId) throws CloudException { + RequestBuilder requestBuilder = RequestBuilder.get(); + AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); + requestBuilder.setUri(String.format(RESOURCE_WITH_ID, this.provider.getContext().getCloud().getEndpoint(), tdId)); + return requestBuilder; + } + public RequestBuilder listTemplateDeployments(String resourceGroup) throws CloudException { RequestBuilder requestBuilder = RequestBuilder.get(); AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java index 830ab65..b3483b1 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureSupport.java @@ -75,6 +75,28 @@ public boolean isSubscribed() throws CloudException, InternalException { return true; } + @Nonnull + @Override + public ConvergedInfrastructure getConvergedInfrastructure(@Nonnull String ciId) throws CloudException, InternalException { + ArmConvergedInfrastructureResponseModel acim = + new AzureArmRequester(this.getProvider(), + new AzureArmConvergedInfrastructureRequests(this.getProvider()).getTemplateDeployment(ciId).build()) + .withJsonProcessor(ArmConvergedInfrastructureResponseModel.class).execute(); + + String resourceGroupId = ""; + String[] tokens = ciId.split("/providers"); + resourceGroupId = tokens[0]; + AzureArmLocation locationSupport = this.getProvider().getDataCenterServices(); + ResourcePool resourceGroup = locationSupport.getResourcePool(resourceGroupId); + + acim.setProviderDatacenterId(resourceGroup.getDataCenterId()); + acim.setProviderResourceGroupId(resourceGroup.getProvideResourcePoolId()); + acim.setProviderRegionId(resourceGroup.getDataCenterId().substring(0, resourceGroup.getDataCenterId().lastIndexOf("-"))); + ConvergedInfrastructure ci = convergedInfrastructureFrom(acim); + + return ci; + } + @Nonnull @Override public Iterable listConvergedInfrastructures(@Nullable ConvergedInfrastructureFilterOptions options) throws CloudException, InternalException { diff --git a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java index c5367a3..ca1aad5 100644 --- a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java +++ b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java @@ -127,11 +127,11 @@ private List getTestResourcePoolList() { private ArmConvergedInfrastructuresResponseModel getTestArmConvergedInfrastructuresModel() { ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); - acim1.setId("acim1"); + acim1.setId(TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"); acim1.setName("deployment1"); ArmConvergedInfrastructureResponseModel acim2 = new ArmConvergedInfrastructureResponseModel(); - acim2.setId("acim2"); + acim2.setId(TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim2"); acim2.setName("deployment2"); List armConvergedInfrastructureModelList = new ArrayList(); @@ -250,27 +250,30 @@ public void listTemplateDeployments_shouldReturnEmptyListIfNoFilterMatch() throw @Test public void getTemplateDeployment_shouldReturnCorrectTD() throws InternalException, CloudException{ - final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(getTestArmConvergedInfrastructuresModel()); + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(getTestArmConvergedInfrastructuresModel().getArmConvergedInfrastructureModels().get(0)); new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; - times = 2; // 2 available resource groups to search + } + { armLocationMock.getResourcePool(anyString); + result = getTestResourcePoolList().get(0); } }; ConvergedInfrastructure actualResult = null; + String testTDId = TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"; try { AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); - actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure(testTDId); } catch (Exception e) {} + String expectedGetUri = String.format("%s?api-version=2016-02-01", testTDId); assertTrue(closeableHttpClient.isExecuteCalled()); HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); - assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); - assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertTrue(actualHttpRequest.getURI().toString().endsWith(expectedGetUri)); assertNotNull(actualResult); assertTrue(actualResult.getName().equals("deployment1")); } @@ -278,7 +281,7 @@ public void getTemplateDeployment_shouldReturnCorrectTD() throws InternalExcepti @Test public void convergedInfrastructureFrom_shouldReturnObjectWithCorrectAttributes() throws CloudException, InternalException{ ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); - acim1.setId("acim1"); + acim1.setId(TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"); acim1.setName("deployment1"); acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); acim1.setProviderRegionId(TEST_REGION); @@ -296,33 +299,31 @@ public void convergedInfrastructureFrom_shouldReturnObjectWithCorrectAttributes( properties.setDependencies(dependencies); acim1.setProperties(properties); - List armConvergedInfrastructureModelList = new ArrayList(); - armConvergedInfrastructureModelList.add(acim1); - - final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); - armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); - - final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(acim1); new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; - times = 2; + times = 1; + } + { armLocationMock.getResourcePool(anyString); + result = getTestResourcePoolList().get(0); } }; ConvergedInfrastructure actualResult = null; + String testTDId = TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"; try { AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); - actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure(testTDId); } catch (Exception e) {} + String expectedGetUri = String.format("%s?api-version=2016-02-01", testTDId); assertTrue(closeableHttpClient.isExecuteCalled()); HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); - assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); - assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertTrue(actualHttpRequest.getURI().toString().endsWith(expectedGetUri)); assertNotNull(actualResult); assertTrue(actualResult.getName().equals("deployment1")); assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); @@ -350,7 +351,7 @@ public void convergedInfrastructureFrom_shouldReturnObjectWithCorrectAttributes( @Test public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentsInErrorState() throws CloudException, InternalException{ ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); - acim1.setId("acim1"); + acim1.setId(TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"); acim1.setName("deployment1"); acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); acim1.setProviderRegionId(TEST_REGION); @@ -377,33 +378,31 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentsInErrorSt acim1.setProperties(properties); - List armConvergedInfrastructureModelList = new ArrayList(); - armConvergedInfrastructureModelList.add(acim1); - - final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); - armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); - - final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(acim1); new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; - times = 2; + times = 1; + } + { armLocationMock.getResourcePool(anyString); + result = getTestResourcePoolList().get(0); } }; ConvergedInfrastructure actualResult = null; + String testTDId = TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"; try { AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); - actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure(testTDId); } catch (Exception e) {} + String expectedGetUri = String.format("%s?api-version=2016-02-01", testTDId); assertTrue(closeableHttpClient.isExecuteCalled()); HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); - assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); - assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertTrue(actualHttpRequest.getURI().toString().endsWith(expectedGetUri)); assertNotNull(actualResult); assertTrue(actualResult.getName().equals("deployment1")); assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); @@ -434,7 +433,7 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentsInErrorSt @Test public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentOperationsInErrorState() throws CloudException, InternalException{ ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); - acim1.setId("acim1"); + acim1.setId(TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"); acim1.setName("deployment1"); acim1.setProviderResourceGroupId(TEST_RESOURCE_GROUP+"-id"); acim1.setProviderRegionId(TEST_REGION); @@ -451,12 +450,6 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentOperations properties.setDependencies(dependencies); acim1.setProperties(properties); - List armConvergedInfrastructureModelList = new ArrayList(); - armConvergedInfrastructureModelList.add(acim1); - - final ArmConvergedInfrastructuresResponseModel armConvergedInfrastructuresResponseModel = new ArmConvergedInfrastructuresResponseModel(); - armConvergedInfrastructuresResponseModel.setArmConvergedInfrastructureModels(armConvergedInfrastructureModelList); - ArmTemplateDeploymentOperationResponseModel.Properties operationProperties = new ArmTemplateDeploymentOperationResponseModel.Properties(); ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage statusMessage = new ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage(); ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError statusError = new ArmTemplateDeploymentOperationResponseModel.Properties.StatusMessage.StatusError(); @@ -480,30 +473,32 @@ public void convergedInfrastructureFrom_shouldHandleTemplateDeploymentOperations final ArmTemplateDeploymentOperationsResponseModel armTemplateDeploymentOperationsResponseModel = new ArmTemplateDeploymentOperationsResponseModel(); armTemplateDeploymentOperationsResponseModel.setArmTemplateDeploymentOperationModels(armTemplateDeploymentOperationModelList); - final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(armConvergedInfrastructuresResponseModel); + final TestCloseableHttpClient closeableHttpClient = new TestCloseableHttpClient(acim1); final TestCloseableHttpClient closeableHttpClient2 = new TestCloseableHttpClient(armTemplateDeploymentOperationsResponseModel); new NonStrictExpectations(){ { httpClientBuilderMock.build(); result = closeableHttpClient; result = closeableHttpClient2; - result = closeableHttpClient; - result = closeableHttpClient2; + } + { armLocationMock.getResourcePool(anyString); + result = getTestResourcePoolList().get(0); } }; ConvergedInfrastructure actualResult = null; + String testTDId = TEST_RESOURCE_GROUP + "-id/providers/microsoft.resources/deployments/acim1"; try { AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); - actualResult = convergedInfrastructureSupport.getConvergedInfrastructure("acim1"); + actualResult = convergedInfrastructureSupport.getConvergedInfrastructure(testTDId); } catch (Exception e) {} + String expectedGetUri = String.format("%s?api-version=2016-02-01", testTDId); assertTrue(closeableHttpClient.isExecuteCalled()); HttpUriRequest actualHttpRequest = closeableHttpClient.getActualHttpUriRequest(); assertTrue(actualHttpRequest.getMethod().equalsIgnoreCase("get")); assertTrue(actualHttpRequest.getURI().toString().startsWith(TEST_ENDPOINT)); - assertTrue(actualHttpRequest.getURI().toString().contains(TEST_ACCOUNT_NO)); assertTrue(actualHttpRequest.getURI().toString().contains(TEST_RESOURCE_GROUP)); - assertTrue(actualHttpRequest.getURI().toString().endsWith("providers/Microsoft.Resources/deployments?api-version=2016-02-01")); + assertTrue(actualHttpRequest.getURI().toString().endsWith(expectedGetUri)); assertNotNull(actualResult); assertTrue(actualResult.getName().equals("deployment1")); assertTrue(actualResult.getProviderResourcePoolId().equals(TEST_RESOURCE_GROUP + "-id")); From ead14ed75977803b204ade3886e45d2d772f3f84 Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Thu, 7 Apr 2016 10:42:45 +0100 Subject: [PATCH 8/9] fixed cancel request --- .../azurearm/ci/AzureArmConvergedInfrastructureRequests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java index 3b4bdde..c57a94b 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureRequests.java @@ -78,6 +78,7 @@ public RequestBuilder cancelTemplateDeployment(String tdId) throws CloudExceptio RequestBuilder requestBuilder = RequestBuilder.post(); AzureArmRequester.addCommonHeaders(this.provider, requestBuilder); requestBuilder.setUri(String.format(CANCEL_TEMPLATE_DEPLOYMENT, this.provider.getContext().getCloud().getEndpoint(), tdId)); + requestBuilder.addHeader("Content-Length", "0"); return requestBuilder; } From 2d92481f7c32840b610d54383abb8abff895eb07 Mon Sep 17 00:00:00 2001 From: Danielle Mayne Date: Tue, 19 Apr 2016 14:51:28 +0100 Subject: [PATCH 9/9] core updates --- .../AzureArmConvergedInfrastructureCapabilities.java | 12 ++++++++++++ .../AzureArmConvergedInfrastructureSupportTests.java | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java index bd79a1d..092093e 100644 --- a/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java +++ b/src/main/java/org/dasein/cloud/azurearm/ci/AzureArmConvergedInfrastructureCapabilities.java @@ -23,6 +23,7 @@ import org.dasein.cloud.Requirement; import org.dasein.cloud.azurearm.AzureArm; import org.dasein.cloud.ci.ConvergedInfrastructureCapabilities; +import org.dasein.cloud.util.NamingConstraints; import javax.annotation.Nonnull; @@ -45,4 +46,15 @@ public Requirement identifyResourcePoolLaunchRequirement() { public Requirement identifyTemplateContentLaunchRequirement() { return Requirement.OPTIONAL; } + + @Nonnull + @Override + public NamingConstraints getConvergedInfrastructureNamingConstraints() { + return NamingConstraints.getAlphaNumeric(1, 63) + .withRegularExpression("^[a-z][-a-z0-9]{0,61}[a-z0-9]$") + .lowerCaseOnly() + .withNoSpaces() + .withLastCharacterSymbolAllowed(false) + .constrainedBy('-'); + } } diff --git a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java index ca1aad5..b81bb11 100644 --- a/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java +++ b/src/test/java/org/dasein/cloud/azurearm/tests/AzureArmConvergedInfrastructureSupportTests.java @@ -568,7 +568,7 @@ public void cancelTemplateDeployment_shouldDoAPostToCancelTDWithTDId(){ @Test public void createTemplateDeployment_shouldDoAPutToCreateTDWithJsonEntity() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, - TEST_RESOURCE_GROUP+"-id", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + "description", TEST_RESOURCE_GROUP+"-id", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); acim1.setId("acim1"); @@ -614,7 +614,7 @@ public void createTemplateDeployment_shouldThrowExceptionIfOptionsIsNull() throw @Test(expected = InternalException.class) public void createTemplateDeployment_shouldThrowExceptionIfResourceGroupIdIsNull() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, - null, "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + "description", null, "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); convergedInfrastructureSupport.provision(options); @@ -623,7 +623,7 @@ public void createTemplateDeployment_shouldThrowExceptionIfResourceGroupIdIsNull @Test(expected = ResourceNotFoundException.class) public void createTemplateDeployment_shouldThrowExceptionIfResourceGroupNotValid() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, - "myFakeId", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + "description", "myFakeId", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); new NonStrictExpectations(){ { armLocationMock.getResourcePool(anyString); @@ -641,7 +641,7 @@ public void createTemplateDeployment_shouldThrowExceptionIfResourceGroupNotValid @Test public void validateTemplateDeployment_shouldDoAPostToValidateTDWithJsonEntity() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, - TEST_RESOURCE_GROUP+"-id", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + "description", TEST_RESOURCE_GROUP+"-id", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); ArmConvergedInfrastructureResponseModel acim1 = new ArmConvergedInfrastructureResponseModel(); acim1.setId("acim1"); @@ -687,7 +687,7 @@ public void validateTemplateDeployment_shouldThrowExceptionIfOptionsIsNull() thr @Test(expected = InternalException.class) public void validateTemplateDeployment_shouldThrowExceptionIfResourceGroupIdIsNull() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, - null, "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + "description", null, "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); AzureArmConvergedInfrastructureSupport convergedInfrastructureSupport = new AzureArmConvergedInfrastructureSupport(armProviderMock); convergedInfrastructureSupport.validateDeployment(options); @@ -696,7 +696,7 @@ public void validateTemplateDeployment_shouldThrowExceptionIfResourceGroupIdIsNu @Test(expected = ResourceNotFoundException.class) public void validateTemplateDeployment_shouldThrowExceptionIfResourceGroupNotValid() throws CloudException, InternalException{ ConvergedInfrastructureProvisionOptions options = ConvergedInfrastructureProvisionOptions.getInstance(TEST_DEPLOYMENT_NAME, - "myFakeId", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); + "description", "myFakeId", "Incremental", TEST_TEMPLATE_CONTENT, TEST_PARAMETERS_CONTENT, true); new NonStrictExpectations(){ { armLocationMock.getResourcePool(anyString);