Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP templates/converged infrastructure #3

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@
<dependency>
<groupId>org.dasein</groupId>
<artifactId>dasein-cloud-core</artifactId>
<version>1.0.0</version>
<version>0.9.5-SNAPSHOT</version>
<scope>compile</scope>
<optional>false</optional>
</dependency>
<dependency>
<groupId>dasein-cloud</groupId>
<artifactId>dasein-cloud-utils</artifactId>
<version>1.0.0</version>
<version>1.0.1</version>
<scope>compile</scope>
<optional>false</optional>
</dependency>
Expand Down Expand Up @@ -122,9 +122,10 @@
</dependency>

<dependency>
<groupId>mockit</groupId>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>0.999.4</version>
<version>1.19</version>
<scope>test</scope>
</dependency>

<!-- Test -->
Expand All @@ -137,7 +138,7 @@
<dependency>
<groupId>org.dasein</groupId>
<artifactId>dasein-cloud-test</artifactId>
<version>1.0.0</version>
<version>1.0.1-SNAPSHOT</version>
<scope>test</scope>
<optional>false</optional>
</dependency>
Expand Down Expand Up @@ -229,6 +230,9 @@
<excludes>
<exclude>**/TestSuite.class</exclude>
</excludes>
<includes>
<include>**/tests/*.class</include>
</includes>
</configuration>
</plugin>

Expand Down
16 changes: 12 additions & 4 deletions src/main/java/org/dasein/cloud/azurearm/AzureArm.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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());
}
}

Expand All @@ -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());
}
}

Expand All @@ -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);
}

Expand Down
65 changes: 31 additions & 34 deletions src/main/java/org/dasein/cloud/azurearm/AzureArmLocation.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -37,54 +44,44 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

/**
* Displays the available locations for Microsoft Azure services.
* @author Drew Lyall ([email protected])
* @since 2015.06.1
* @version 2015.06.1
*/
public class AzureArmLocation implements DataCenterServices{
private AzureArm provider;
public class AzureArmLocation extends AbstractDataCenterServices<AzureArm>{

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
@Override
public Iterable<DataCenter> listDataCenters(@Nonnull String providerRegionId) throws InternalException, CloudException {
List<DataCenter> dataCenters = new ArrayList<DataCenter>();
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;
}
Expand All @@ -96,12 +93,12 @@ public Iterable<DataCenter> 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<Region> 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
Expand Down Expand Up @@ -144,10 +141,10 @@ private Region regionFromString(String locationName) {
@Override
public @Nonnull Iterable<ResourcePool> 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<ResourcePool> resourcePools = new ArrayList<ResourcePool>();

CollectionUtils.forAllDo(armResourceGroupsModel.getArmResourceGroupModels(), new Closure() {
Expand All @@ -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<ArmResourceGroupModel, ResourcePool>() {
return new AzureArmRequester(getProvider(), getProvider().getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper<ArmResourceGroupModel, ResourcePool>() {
@Override
public ResourcePool mapFrom(ArmResourceGroupModel entity) {
return getResourcePoolFrom(entity);
Expand All @@ -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>(armResourceGroupModel));

return new AzureArmRequester(this.provider, this.provider.getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper<ArmResourceGroupModel, ResourcePool>() {
return new AzureArmRequester(getProvider(), getProvider().getAzureClientBuilderWithPooling(), requestBuilder.build()).withJsonProcessor(new DriverToCoreMapper<ArmResourceGroupModel, ResourcePool>() {
@Override
public ResourcePool mapFrom(ArmResourceGroupModel entity) {
return getResourcePoolFrom(entity);
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public boolean supportsAffinityGroups() {

@Override
public boolean supportsResourcePools() {
return false;
return true;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
* Copyright (C) 2009-2016 Dell, Inc.
* See annotations for authorship information
* <p>
* ====================================================================
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 org.dasein.cloud.util.NamingConstraints;

import javax.annotation.Nonnull;

/**
* User: daniellemayne
* Date: 24/03/2016
* Time: 11:59
*/
public class AzureArmConvergedInfrastructureCapabilities extends AbstractCapabilities<AzureArm> 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;
}

@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('-');
}
}
Loading