You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/01/21 01:11:14 UTC
[6/6] jclouds-labs git commit: Promoted DigitalOcean v2
Promoted DigitalOcean v2
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/a6044372
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/a6044372
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/a6044372
Branch: refs/heads/master
Commit: a6044372ce5bf8be3a1d7817684ad9a27aef321c
Parents: 7d5854b
Author: Ignasi Barrera <na...@apache.org>
Authored: Thu Jan 21 00:58:53 2016 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu Jan 21 00:59:12 2016 +0100
----------------------------------------------------------------------
digitalocean2/pom.xml | 152 -------
.../jclouds/digitalocean2/DigitalOcean2Api.java | 73 ----
.../digitalocean2/DigitalOcean2ApiMetadata.java | 111 -----
.../DigitalOcean2ProviderMetadata.java | 78 ----
.../DigitalOcean2ComputeServiceAdapter.java | 243 -----------
...igitalOcean2ComputeServiceContextModule.java | 218 ----------
.../extensions/DigitalOcean2ImageExtension.java | 149 -------
.../functions/DropletStatusToStatus.java | 46 ---
.../functions/DropletToNodeMetadata.java | 165 --------
.../compute/functions/ImageInRegionToImage.java | 92 -----
.../compute/functions/RegionToLocation.java | 59 ---
.../compute/functions/SizeToHardware.java | 58 ---
...plateOptionsToStatementWithoutPublicKey.java | 59 ---
.../compute/internal/ImageInRegion.java | 54 ---
.../options/DigitalOcean2TemplateOptions.java | 174 --------
.../strategy/CreateKeyPairsThenCreateNodes.java | 216 ----------
.../config/DigitalOcean2HttpApiModule.java | 57 ---
.../config/DigitalOcean2Properties.java | 33 --
.../config/DigitalOcean2RateLimitModule.java | 30 --
.../config/DigitalOceanParserModule.java | 144 -------
.../jclouds/digitalocean2/domain/Action.java | 71 ----
.../jclouds/digitalocean2/domain/Backup.java | 43 --
.../digitalocean2/domain/Distribution.java | 69 ----
.../jclouds/digitalocean2/domain/Droplet.java | 92 -----
.../digitalocean2/domain/DropletCreate.java | 66 ---
.../org/jclouds/digitalocean2/domain/Image.java | 48 ---
.../jclouds/digitalocean2/domain/Kernel.java | 35 --
.../org/jclouds/digitalocean2/domain/Key.java | 39 --
.../jclouds/digitalocean2/domain/Networks.java | 77 ----
.../digitalocean2/domain/OperatingSystem.java | 60 ---
.../jclouds/digitalocean2/domain/Region.java | 39 --
.../org/jclouds/digitalocean2/domain/Size.java | 46 ---
.../jclouds/digitalocean2/domain/Snapshot.java | 47 ---
.../domain/internal/PaginatedCollection.java | 111 -----
.../domain/options/CreateDropletOptions.java | 179 ---------
.../domain/options/ImageListOptions.java | 74 ----
.../domain/options/ListOptions.java | 60 ---
...DigitalOcean2RateLimitExceededException.java | 81 ----
.../digitalocean2/features/ActionApi.java | 113 ------
.../digitalocean2/features/DropletApi.java | 350 ----------------
.../digitalocean2/features/ImageApi.java | 131 ------
.../jclouds/digitalocean2/features/KeyApi.java | 164 --------
.../digitalocean2/features/RegionApi.java | 107 -----
.../jclouds/digitalocean2/features/SizeApi.java | 100 -----
.../functions/BaseToPagedIterable.java | 59 ---
.../functions/LinkToImageListOptions.java | 67 ----
.../functions/LinkToListOptions.java | 61 ---
.../handlers/DigitalOcean2ErrorHandler.java | 72 ----
.../handlers/RateLimitRetryHandler.java | 111 -----
.../org/jclouds/digitalocean2/ssh/DSAKeys.java | 172 --------
.../jclouds/digitalocean2/ssh/ECDSAKeys.java | 343 ----------------
.../DigitalOcean2ProviderMetadataTest.java | 29 --
.../DigitalOcean2ComputeServiceLiveTest.java | 66 ---
.../DigitalOcean2TemplateBuilderLiveTest.java | 55 ---
.../compute/config/ActionDonePredicateTest.java | 74 ----
.../config/DropletInStatusPredicateTest.java | 58 ---
.../config/DropletTerminatedPredicateTest.java | 57 ---
.../DigitalOcean2ImageExtensionLiveTest.java | 40 --
.../functions/DropletStatusToStatusTest.java | 36 --
.../functions/DropletToNodeMetadataTest.java | 237 -----------
.../functions/ImageInRegionToImageTest.java | 98 -----
.../compute/functions/RegionToLocationTest.java | 56 ---
.../compute/functions/SizeToHardwareTest.java | 49 ---
...eOptionsToStatementWithoutPublicKeyTest.java | 75 ----
.../DigitalOcean2TemplateOptionsTest.java | 52 ---
.../domain/OperatingSystemTest.java | 104 -----
.../exceptions/RateLimitExceptionMockTest.java | 63 ---
.../features/ActionApiLiveTest.java | 70 ----
.../features/ActionApiMockTest.java | 110 -----
.../features/DropletApiLiveTest.java | 186 ---------
.../features/DropletApiMockTest.java | 401 -------------------
.../features/ImageApiLiveTest.java | 97 -----
.../features/ImageApiMockTest.java | 150 -------
.../digitalocean2/features/KeyApiLiveTest.java | 99 -----
.../digitalocean2/features/KeyApiMockTest.java | 203 ----------
.../features/RegionApiLiveTest.java | 62 ---
.../features/RegionApiMockTest.java | 77 ----
.../digitalocean2/features/SizeApiLiveTest.java | 62 ---
.../digitalocean2/features/SizeApiMockTest.java | 77 ----
.../functions/LinkToImageListOptionsTest.java | 65 ---
.../functions/LinkToListOptionsTest.java | 58 ---
.../handlers/RateLimitRetryHandlerTest.java | 153 -------
.../internal/BaseDigitalOcean2ApiLiveTest.java | 140 -------
.../internal/BaseDigitalOcean2ApiMockTest.java | 142 -------
.../jclouds/digitalocean2/ssh/DSAKeysTest.java | 54 ---
.../digitalocean2/ssh/ECDSAKeysTest.java | 55 ---
digitalocean2/src/test/resources/action.json | 33 --
.../src/test/resources/actions-first.json | 168 --------
.../src/test/resources/actions-last.json | 106 -----
.../src/test/resources/backups-first.json | 26 --
.../src/test/resources/backups-last.json | 26 --
.../src/test/resources/droplet-create-req.json | 12 -
.../src/test/resources/droplet-create-res.json | 35 --
digitalocean2/src/test/resources/droplet.json | 105 -----
.../src/test/resources/droplets-first.json | 115 ------
.../src/test/resources/droplets-last.json | 115 ------
digitalocean2/src/test/resources/image.json | 24 --
.../src/test/resources/images-first.json | 108 -----
.../src/test/resources/images-last.json | 123 ------
.../src/test/resources/kernels-first.json | 38 --
.../src/test/resources/kernels-last.json | 38 --
digitalocean2/src/test/resources/key.json | 8 -
.../src/test/resources/keys-first.json | 43 --
digitalocean2/src/test/resources/keys-last.json | 25 --
.../src/test/resources/logback-test.xml | 42 --
.../src/test/resources/power-cycle.json | 33 --
digitalocean2/src/test/resources/power-off.json | 33 --
digitalocean2/src/test/resources/power-on.json | 33 --
digitalocean2/src/test/resources/reboot.json | 33 --
.../src/test/resources/regions-first.json | 111 -----
.../src/test/resources/regions-last.json | 128 ------
digitalocean2/src/test/resources/shutdown.json | 33 --
.../src/test/resources/sizes-first.json | 123 ------
.../src/test/resources/sizes-last.json | 98 -----
digitalocean2/src/test/resources/snapshot.json | 33 --
.../src/test/resources/snapshots-first.json | 27 --
.../src/test/resources/snapshots-last.json | 27 --
digitalocean2/src/test/resources/ssh-dsa.pub | 1 -
digitalocean2/src/test/resources/ssh-ecdsa.pub | 1 -
pom.xml | 1 -
120 files changed, 10613 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/pom.xml
----------------------------------------------------------------------
diff --git a/digitalocean2/pom.xml b/digitalocean2/pom.xml
deleted file mode 100644
index 5b211d4..0000000
--- a/digitalocean2/pom.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You 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.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.apache.jclouds.labs</groupId>
- <artifactId>jclouds-labs</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- </parent>
-
- <groupId>org.apache.jclouds.labs</groupId>
- <artifactId>digitalocean2</artifactId>
- <name>jclouds DigitalOcean v2 API Provider</name>
- <description>jclouds provider for Digital Ocean v2 Compute API</description>
-
- <properties>
- <test.digitalocean2.endpoint>https://api.digitalocean.com/v2/</test.digitalocean2.endpoint>
- <test.digitalocean2.api-version>2</test.digitalocean2.api-version>
- <test.digitalocean2.identity>FIXME</test.digitalocean2.identity>
- <test.digitalocean2.credential>FIXME</test.digitalocean2.credential>
- <test.digitalocean2.template>osFamily=UBUNTU,os64Bit=true</test.digitalocean2.template>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.jclouds</groupId>
- <artifactId>jclouds-core</artifactId>
- <version>${jclouds.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds.api</groupId>
- <artifactId>oauth</artifactId>
- <version>${jclouds.version}</version>
- <type>jar</type>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds.api</groupId>
- <artifactId>oauth</artifactId>
- <version>${jclouds.version}</version>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds</groupId>
- <artifactId>jclouds-compute</artifactId>
- <version>${jclouds.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds</groupId>
- <artifactId>jclouds-compute</artifactId>
- <version>${jclouds.version}</version>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds</groupId>
- <artifactId>jclouds-core</artifactId>
- <version>${jclouds.version}</version>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds.driver</groupId>
- <artifactId>jclouds-slf4j</artifactId>
- <version>${jclouds.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.jclouds.driver</groupId>
- <artifactId>jclouds-sshj</artifactId>
- <version>${jclouds.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.squareup.okhttp</groupId>
- <artifactId>mockwebserver</artifactId>
- <scope>test</scope>
- <exclusions>
- <!-- Already provided by jclouds-sshj -->
- <exclusion>
- <groupId>org.bouncycastle</groupId>
- <artifactId>bcprov-jdk15on</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.google.auto.value</groupId>
- <artifactId>auto-value</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.google.auto.service</groupId>
- <artifactId>auto-service</artifactId>
- <scope>provided</scope>
- </dependency>
- </dependencies>
- <profiles>
- <profile>
- <id>live</id>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <executions>
- <execution>
- <id>integration</id>
- <phase>integration-test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <systemPropertyVariables>
- <test.digitalocean2.endpoint>${test.digitalocean2.endpoint}</test.digitalocean2.endpoint>
- <test.digitalocean2.api-version>${test.digitalocean2.api-version}</test.digitalocean2.api-version>
- <test.digitalocean2.build-version>${test.digitalocean2.build-version}</test.digitalocean2.build-version>
- <test.digitalocean2.identity>${test.digitalocean2.identity}</test.digitalocean2.identity>
- <test.digitalocean2.credential>${test.digitalocean2.credential}</test.digitalocean2.credential>
- <test.digitalocean2.template>${test.digitalocean2.template}</test.digitalocean2.template>
- </systemPropertyVariables>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-</project>
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2Api.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2Api.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2Api.java
deleted file mode 100644
index 773fa59..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2Api.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2;
-
-import java.io.Closeable;
-
-import org.jclouds.digitalocean2.features.ActionApi;
-import org.jclouds.digitalocean2.features.DropletApi;
-import org.jclouds.digitalocean2.features.ImageApi;
-import org.jclouds.digitalocean2.features.KeyApi;
-import org.jclouds.digitalocean2.features.RegionApi;
-import org.jclouds.digitalocean2.features.SizeApi;
-import org.jclouds.rest.annotations.Delegate;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Provides access to DigitalOcean.
- */
-@Beta
-public interface DigitalOcean2Api extends Closeable {
-
- /**
- * Provides access to Droplet features
- */
- @Delegate
- DropletApi dropletApi();
-
- /**
- * Provides access to SSH Key features
- */
- @Delegate
- KeyApi keyApi();
-
- /**
- * Provides access to Images
- */
- @Delegate
- ImageApi imageApi();
-
- /**
- * Provides access to Actions
- */
- @Delegate
- ActionApi actionApi();
-
- /**
- * Provides access to Sizes
- */
- @Delegate
- SizeApi sizeApi();
-
- /**
- * Provides access to Regions
- */
- @Delegate
- RegionApi regionApi();
-
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ApiMetadata.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ApiMetadata.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ApiMetadata.java
deleted file mode 100644
index 25b42c7..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ApiMetadata.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2;
-
-import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
-import static org.jclouds.compute.config.ComputeServiceProperties.POLL_INITIAL_PERIOD;
-import static org.jclouds.compute.config.ComputeServiceProperties.POLL_MAX_PERIOD;
-import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
-import static org.jclouds.oauth.v2.config.CredentialType.BEARER_TOKEN_CREDENTIALS;
-import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
-import static org.jclouds.oauth.v2.config.OAuthProperties.CREDENTIAL_TYPE;
-import static org.jclouds.oauth.v2.config.OAuthProperties.JWS_ALG;
-import static org.jclouds.reflect.Reflection2.typeToken;
-
-import java.net.URI;
-import java.util.Properties;
-
-import org.jclouds.apis.ApiMetadata;
-import org.jclouds.compute.ComputeServiceContext;
-import org.jclouds.digitalocean2.compute.config.DigitalOcean2ComputeServiceContextModule;
-import org.jclouds.digitalocean2.config.DigitalOcean2HttpApiModule;
-import org.jclouds.digitalocean2.config.DigitalOceanParserModule;
-import org.jclouds.oauth.v2.config.OAuthModule;
-import org.jclouds.rest.internal.BaseHttpApiMetadata;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-
-/**
- * Implementation of {@link ApiMetadata} for DigitalOcean v2 API
- */
-public class DigitalOcean2ApiMetadata extends BaseHttpApiMetadata<DigitalOcean2Api> {
-
- @Override
- public Builder toBuilder() {
- return new Builder().fromApiMetadata(this);
- }
-
- public DigitalOcean2ApiMetadata() {
- this(new Builder());
- }
-
- protected DigitalOcean2ApiMetadata(Builder builder) {
- super(builder);
- }
-
- public static Properties defaultProperties() {
- Properties properties = BaseHttpApiMetadata.defaultProperties();
- properties.put("oauth.endpoint", "https://cloud.digitalocean.com/v1/oauth/token");
- properties.put(JWS_ALG, "RS256");
- properties.put(AUDIENCE, "https://cloud.digitalocean.com/v1/oauth/token");
- properties.put(CREDENTIAL_TYPE, BEARER_TOKEN_CREDENTIALS.toString());
- properties.put(PROPERTY_SESSION_INTERVAL, 3600);
- properties.put(TEMPLATE, "osFamily=UBUNTU,os64Bit=true");
- properties.put(POLL_INITIAL_PERIOD, 5000);
- properties.put(POLL_MAX_PERIOD, 20000);
- // Node operations in DigitalOcean can be quite slow. Use a 5 minutes
- // timeout by default
- properties.put(TIMEOUT_NODE_RUNNING, 300000);
- properties.put(TIMEOUT_NODE_SUSPENDED, 300000);
- properties.put(TIMEOUT_NODE_TERMINATED, 300000);
- return properties;
- }
-
- public static class Builder extends BaseHttpApiMetadata.Builder<DigitalOcean2Api, Builder> {
-
- protected Builder() {
- id("digitalocean2")
- .name("Digital Ocean v2 API")
- .identityName("Not used for OAuth")
- .credentialName("Must be oauth2 Bearer Token")
- .documentation(URI.create("https://developers.digitalocean.com/v2/"))
- .defaultEndpoint("https://api.digitalocean.com/v2")
- .defaultProperties(DigitalOcean2ApiMetadata.defaultProperties())
- .view(typeToken(ComputeServiceContext.class))
- .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
- .add(DigitalOcean2HttpApiModule.class)
- .add(OAuthModule.class)
- .add(DigitalOceanParserModule.class)
- .add(DigitalOcean2ComputeServiceContextModule.class)
- .build());
- }
-
- @Override
- public DigitalOcean2ApiMetadata build() {
- return new DigitalOcean2ApiMetadata(this);
- }
-
- @Override
- protected Builder self() {
- return this;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ProviderMetadata.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ProviderMetadata.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ProviderMetadata.java
deleted file mode 100644
index 0f64f78..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/DigitalOcean2ProviderMetadata.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2;
-
-import java.net.URI;
-import java.util.Properties;
-
-import org.jclouds.providers.ProviderMetadata;
-import org.jclouds.providers.internal.BaseProviderMetadata;
-
-import com.google.auto.service.AutoService;
-
-/**
- * Implementation of {@link org.jclouds.providers.ProviderMetadata} for DigitalOcean.
- */
-@AutoService(ProviderMetadata.class)
-public class DigitalOcean2ProviderMetadata extends BaseProviderMetadata {
-
- public static Builder builder() {
- return new Builder();
- }
-
- @Override
- public Builder toBuilder() {
- return builder().fromProviderMetadata(this);
- }
-
- public DigitalOcean2ProviderMetadata() {
- super(builder());
- }
-
- public DigitalOcean2ProviderMetadata(Builder builder) {
- super(builder);
- }
-
- public static Properties defaultProperties() {
- Properties properties = DigitalOcean2ApiMetadata.defaultProperties();
- return properties;
- }
-
- public static class Builder extends BaseProviderMetadata.Builder {
-
- protected Builder() {
- id("digitalocean2")
- .name("DigitalOcean Compute Services")
- .apiMetadata(new DigitalOcean2ApiMetadata())
- .homepage(URI.create("https://www.digitalocean.com/"))
- .console(URI.create("https://cloud.digitalocean.com/"))
- .endpoint("https://api.digitalocean.com/v2")
- .defaultProperties(DigitalOcean2ProviderMetadata.defaultProperties());
- }
-
- @Override
- public DigitalOcean2ProviderMetadata build() {
- return new DigitalOcean2ProviderMetadata(this);
- }
-
- @Override
- public Builder fromProviderMetadata(ProviderMetadata in) {
- super.fromProviderMetadata(in);
- return this;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java
deleted file mode 100644
index f520f45..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.base.Predicates.notNull;
-import static com.google.common.collect.Iterables.concat;
-import static com.google.common.collect.Iterables.contains;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.transform;
-import static com.google.common.collect.Sets.newHashSet;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
-import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.jclouds.compute.ComputeServiceAdapter;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.digitalocean2.DigitalOcean2Api;
-import org.jclouds.digitalocean2.compute.internal.ImageInRegion;
-import org.jclouds.digitalocean2.compute.options.DigitalOcean2TemplateOptions;
-import org.jclouds.digitalocean2.domain.Droplet;
-import org.jclouds.digitalocean2.domain.DropletCreate;
-import org.jclouds.digitalocean2.domain.Image;
-import org.jclouds.digitalocean2.domain.Region;
-import org.jclouds.digitalocean2.domain.Size;
-import org.jclouds.digitalocean2.domain.options.CreateDropletOptions;
-import org.jclouds.domain.LoginCredentials;
-import org.jclouds.json.Json;
-import org.jclouds.logging.Logger;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.primitives.Ints;
-
-/**
- * Implementation of the Compute Service for the DigitalOcean API.
- */
-public class DigitalOcean2ComputeServiceAdapter implements ComputeServiceAdapter<Droplet, Size, ImageInRegion, Region> {
-
- @Resource
- @Named(ComputeServiceConstants.COMPUTE_LOGGER)
- protected Logger logger = Logger.NULL;
-
- private final DigitalOcean2Api api;
- private final Predicate<Integer> nodeRunningPredicate;
- private final Predicate<Integer> nodeStoppedPredicate;
- private final Predicate<Integer> nodeTerminatedPredicate;
- private final Json json;
-
- @Inject DigitalOcean2ComputeServiceAdapter(DigitalOcean2Api api,
- @Named(TIMEOUT_NODE_RUNNING) Predicate<Integer> nodeRunningPredicate,
- @Named(TIMEOUT_NODE_SUSPENDED) Predicate<Integer> nodeStoppedPredicate,
- @Named(TIMEOUT_NODE_TERMINATED) Predicate<Integer> nodeTerminatedPredicate,
- Json json) {
- this.api = api;
- this.nodeRunningPredicate = nodeRunningPredicate;
- this.nodeStoppedPredicate = nodeStoppedPredicate;
- this.nodeTerminatedPredicate = nodeTerminatedPredicate;
- this.json = json;
- }
-
- @Override
- public NodeAndInitialCredentials<Droplet> createNodeWithGroupEncodedIntoName(String group, final String name,
- Template template) {
- DigitalOcean2TemplateOptions templateOptions = template.getOptions().as(DigitalOcean2TemplateOptions.class);
- CreateDropletOptions.Builder options = CreateDropletOptions.builder();
-
- // DigitalOcean specific options
- options.privateNetworking(templateOptions.getPrivateNetworking());
- options.backupsEnabled(templateOptions.getBackupsEnabled());
- if (!templateOptions.getSshKeyIds().isEmpty()) {
- options.addSshKeyIds(templateOptions.getSshKeyIds());
- }
-
- Map<String, String> metadataAndTags = metadataAndTagsAsCommaDelimitedValue(templateOptions);
- if (!metadataAndTags.isEmpty()) {
- @SuppressWarnings("unchecked")
- List<String> regionFeatures = (List<String>) template.getLocation().getMetadata().get("features");
- if (regionFeatures.contains("metadata")) {
- options.userData(json.toJson(metadataAndTags));
- } else {
- logger.debug(">> region %s does not support metadata, ignoring provided user data", template.getLocation()
- .getId());
- }
- }
-
- DropletCreate dropletCreated = api.dropletApi().create(name,
- template.getLocation().getId(),
- template.getHardware().getProviderId(),
- template.getImage().getProviderId(),
- options.build());
-
- // We have to actively wait until the droplet has been provisioned until
- // we can build the entire Droplet object we want to return
- nodeRunningPredicate.apply(dropletCreated.droplet().id());
- Droplet droplet = api.dropletApi().get(dropletCreated.droplet().id());
-
- LoginCredentials defaultCredentials = LoginCredentials.builder().user("root")
- .privateKey(templateOptions.getLoginPrivateKey()).build();
-
- return new NodeAndInitialCredentials<Droplet>(droplet, String.valueOf(droplet.id()), defaultCredentials);
- }
-
- @Override
- public Iterable<ImageInRegion> listImages() {
- // Images can claim to be available in a region that is currently marked as "unavailable". We shouldn't return
- // the images scoped to those regions.
- final Set<String> availableRegionsIds = newHashSet(transform(listLocations(), new Function<Region, String>() {
- @Override
- public String apply(Region input) {
- return input.slug();
- }
- }));
-
- // Public images re globally available, but non-public ones can only be available in certain regions.
- // For these kind of images, return one instance of an ImageInRegion for each region where the image is
- // available. This way we can properly scope global and concrete images so they can be properly looked up.
- return concat(filter(api.imageApi().list().concat().transform(new Function<Image, Iterable<ImageInRegion>>() {
- @Override
- public Iterable<ImageInRegion> apply(final Image image) {
- return transform(image.regions(), new Function<String, ImageInRegion>() {
- @Override
- public ImageInRegion apply(String region) {
- return availableRegionsIds.contains(region) ? ImageInRegion.create(image, region) : null;
- }
- });
- }
- }), notNull()));
- }
-
- @Override
- public Iterable<Size> listHardwareProfiles() {
- return filter(api.sizeApi().list().concat(), new Predicate<Size>() {
- @Override
- public boolean apply(Size size) {
- return size.available();
- }
- });
- }
-
- @Override
- public Iterable<Region> listLocations() {
- // DigitalOcean lists regions that are unavailable for droplet creation
- return filter(api.regionApi().list().concat(), new Predicate<Region>() {
- @Override
- public boolean apply(Region region) {
- return region.available();
- }
- });
- }
-
- @Override
- public Iterable<Droplet> listNodes() {
- return api.dropletApi().list().concat();
- }
-
- @Override
- public Iterable<Droplet> listNodesByIds(final Iterable<String> ids) {
- return filter(listNodes(), new Predicate<Droplet>() {
- @Override
- public boolean apply(Droplet droplet) {
- return contains(ids, String.valueOf(droplet.id()));
- }
- });
- }
-
- @Override
- public ImageInRegion getImage(String id) {
- String region = ImageInRegion.extractRegion(id);
- String imageId = ImageInRegion.extractImageId(id);
- // The id of the image can be an id or a slug. Use the corresponding method of the API depending on what is
- // provided. If it can be parsed as a number, use the method to get by ID. Otherwise, get by slug.
- Integer numericId = Ints.tryParse(imageId);
- Image image = numericId == null ? api.imageApi().get(imageId) : api.imageApi().get(numericId);
- return image == null ? null : ImageInRegion.create(image, region);
- }
-
- @Override
- public Droplet getNode(String id) {
- return api.dropletApi().get(Integer.parseInt(id));
- }
-
- @Override
- public void destroyNode(String id) {
- // We have to wait here, as the api does not properly populate the state
- // but fails if there is a pending event
- int dropletId = Integer.parseInt(id);
- api.dropletApi().delete(dropletId);
- checkState(nodeTerminatedPredicate.apply(dropletId), "node was not destroyed in the configured timeout");
- }
-
- @Override
- public void rebootNode(String id) {
- // We have to wait here, as the api does not properly populate the state
- // but fails if there is a pending event
- int dropletId = Integer.parseInt(id);
- api.dropletApi().reboot(dropletId);
- checkState(nodeRunningPredicate.apply(dropletId), "node did not restart in the configured timeout");
- }
-
- @Override
- public void resumeNode(String id) {
- // We have to wait here, as the api does not properly populate the state
- // but fails if there is a pending event
- int dropletId = Integer.parseInt(id);
- api.dropletApi().powerOn(dropletId);
- checkState(nodeRunningPredicate.apply(dropletId), "node did not started in the configured timeout");
- }
-
- @Override
- public void suspendNode(String id) {
- // We have to wait here, as the api does not properly populate the state
- // but fails if there is a pending event
- int dropletId = Integer.parseInt(id);
- api.dropletApi().powerOff(dropletId);
- checkState(nodeStoppedPredicate.apply(dropletId), "node did not stop in the configured timeout");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/config/DigitalOcean2ComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/config/DigitalOcean2ComputeServiceContextModule.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/config/DigitalOcean2ComputeServiceContextModule.java
deleted file mode 100644
index 03caf85..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/config/DigitalOcean2ComputeServiceContextModule.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.config;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
-import static org.jclouds.util.Predicates2.retry;
-
-import javax.inject.Singleton;
-
-import org.jclouds.compute.ComputeServiceAdapter;
-import org.jclouds.compute.config.ComputeServiceAdapterContextModule;
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.NodeMetadata.Status;
-import org.jclouds.compute.extensions.ImageExtension;
-import org.jclouds.compute.functions.TemplateOptionsToStatement;
-import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.compute.reference.ComputeServiceConstants.PollPeriod;
-import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
-import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
-import org.jclouds.digitalocean2.DigitalOcean2Api;
-import org.jclouds.digitalocean2.compute.DigitalOcean2ComputeServiceAdapter;
-import org.jclouds.digitalocean2.compute.extensions.DigitalOcean2ImageExtension;
-import org.jclouds.digitalocean2.compute.functions.DropletStatusToStatus;
-import org.jclouds.digitalocean2.compute.functions.DropletToNodeMetadata;
-import org.jclouds.digitalocean2.compute.functions.ImageInRegionToImage;
-import org.jclouds.digitalocean2.compute.functions.RegionToLocation;
-import org.jclouds.digitalocean2.compute.functions.SizeToHardware;
-import org.jclouds.digitalocean2.compute.functions.TemplateOptionsToStatementWithoutPublicKey;
-import org.jclouds.digitalocean2.compute.internal.ImageInRegion;
-import org.jclouds.digitalocean2.compute.options.DigitalOcean2TemplateOptions;
-import org.jclouds.digitalocean2.compute.strategy.CreateKeyPairsThenCreateNodes;
-import org.jclouds.digitalocean2.domain.Action;
-import org.jclouds.digitalocean2.domain.Droplet;
-import org.jclouds.digitalocean2.domain.Region;
-import org.jclouds.digitalocean2.domain.Size;
-import org.jclouds.domain.Location;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.inject.Provides;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-
-/**
- * Configures the compute service classes for the DigitalOcean API.
- */
-public class DigitalOcean2ComputeServiceContextModule extends
- ComputeServiceAdapterContextModule<Droplet, Size, ImageInRegion, Region> {
-
- @Override
- protected void configure() {
- super.configure();
-
- bind(new TypeLiteral<ComputeServiceAdapter<Droplet, Size, ImageInRegion, Region>>() {
- }).to(DigitalOcean2ComputeServiceAdapter.class);
-
- bind(new TypeLiteral<Function<Droplet, NodeMetadata>>() {
- }).to(DropletToNodeMetadata.class);
- bind(new TypeLiteral<Function<ImageInRegion, Image>>() {
- }).to(ImageInRegionToImage.class);
- bind(new TypeLiteral<Function<Region, Location>>() {
- }).to(RegionToLocation.class);
- bind(new TypeLiteral<Function<Size, Hardware>>() {
- }).to(SizeToHardware.class);
- bind(new TypeLiteral<Function<Droplet.Status, Status>>() {
- }).to(DropletStatusToStatus.class);
-
- install(new LocationsFromComputeServiceAdapterModule<Droplet, Size, ImageInRegion, Region>() {
- });
-
- bind(CreateNodesInGroupThenAddToSet.class).to(CreateKeyPairsThenCreateNodes.class);
- bind(TemplateOptions.class).to(DigitalOcean2TemplateOptions.class);
- bind(TemplateOptionsToStatement.class).to(TemplateOptionsToStatementWithoutPublicKey.class);
-
- bind(new TypeLiteral<ImageExtension>() {
- }).to(DigitalOcean2ImageExtension.class);
- }
-
- @Provides
- @Named(TIMEOUT_NODE_RUNNING)
- protected Predicate<Integer> provideDropletRunningPredicate(final DigitalOcean2Api api, Timeouts timeouts,
- PollPeriod pollPeriod) {
- return retry(new DropletInStatusPredicate(api, Droplet.Status.ACTIVE), timeouts.nodeRunning,
- pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
- }
-
- @Provides
- @Named(TIMEOUT_NODE_SUSPENDED)
- protected Predicate<Integer> provideDropletSuspendedPredicate(final DigitalOcean2Api api, Timeouts timeouts,
- PollPeriod pollPeriod) {
- return retry(new DropletInStatusPredicate(api, Droplet.Status.OFF), timeouts.nodeSuspended,
- pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
- }
-
- @Provides
- @Named(TIMEOUT_NODE_TERMINATED)
- protected Predicate<Integer> provideDropletTerminatedPredicate(final DigitalOcean2Api api, Timeouts timeouts,
- PollPeriod pollPeriod) {
- return retry(new DropletTerminatedPredicate(api), timeouts.nodeTerminated, pollPeriod.pollInitialPeriod,
- pollPeriod.pollMaxPeriod);
- }
-
- @Provides
- @Named(TIMEOUT_IMAGE_AVAILABLE)
- protected Predicate<Integer> provideImageAvailablePredicate(final DigitalOcean2Api api, Timeouts timeouts,
- PollPeriod pollPeriod) {
- return retry(new ActionDonePredicate(api), timeouts.imageAvailable, pollPeriod.pollInitialPeriod,
- pollPeriod.pollMaxPeriod);
- }
-
- @Provides
- @Singleton
- protected Predicate<Region> provideRegionAvailablePredicate(final DigitalOcean2Api api, Timeouts timeouts,
- PollPeriod pollPeriod) {
- return retry(new RegionAvailablePredicate(), timeouts.imageAvailable, pollPeriod.pollInitialPeriod,
- pollPeriod.pollMaxPeriod);
- }
-
- @Provides
- protected Predicate<Integer> provideActionCompletedPredicate(final DigitalOcean2Api api, Timeouts timeouts,
- PollPeriod pollPeriod) {
- return retry(new ActionDonePredicate(api), timeouts.imageAvailable, pollPeriod.pollInitialPeriod,
- pollPeriod.pollMaxPeriod);
- }
-
- @VisibleForTesting
- static class ActionDonePredicate implements Predicate<Integer> {
-
- private final DigitalOcean2Api api;
-
- public ActionDonePredicate(DigitalOcean2Api api) {
- this.api = checkNotNull(api, "api must not be null");
- }
-
- @Override
- public boolean apply(Integer input) {
- checkNotNull(input, "action id cannot be null");
- Action current = api.actionApi().get(input);
- switch (current.status()) {
- case COMPLETED:
- return true;
- case IN_PROGRESS:
- return false;
- case ERRORED:
- default:
- throw new IllegalStateException("Resource is in invalid status: " + current.status().name());
- }
- }
-
- }
-
- @VisibleForTesting
- static class DropletTerminatedPredicate implements Predicate<Integer> {
-
- private final DigitalOcean2Api api;
-
- public DropletTerminatedPredicate(DigitalOcean2Api api) {
- this.api = checkNotNull(api, "api must not be null");
- }
-
- @Override
- public boolean apply(Integer input) {
- checkNotNull(input, "droplet id");
- Droplet droplet = api.dropletApi().get(input);
- return droplet == null;
- }
- }
-
- @VisibleForTesting
- static class DropletInStatusPredicate implements Predicate<Integer> {
-
- private final DigitalOcean2Api api;
- private final Droplet.Status status;
-
- public DropletInStatusPredicate(DigitalOcean2Api api, Droplet.Status status) {
- this.api = checkNotNull(api, "api must not be null");
- this.status = checkNotNull(status, "status must not be null");
- }
-
- @Override
- public boolean apply(Integer input) {
- checkNotNull(input, "droplet id");
- Droplet droplet = api.dropletApi().get(input);
- return droplet != null && status == droplet.status();
- }
- }
-
- @VisibleForTesting
- static class RegionAvailablePredicate implements Predicate<Region> {
- @Override
- public boolean apply(Region input) {
- return input.available();
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
deleted file mode 100644
index 3baf146..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.extensions;
-
-import static com.google.common.base.Preconditions.checkState;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
-
-import java.util.NoSuchElementException;
-import java.util.concurrent.Callable;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.Constants;
-import org.jclouds.compute.domain.CloneImageTemplate;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.ImageTemplate;
-import org.jclouds.compute.domain.ImageTemplateBuilder;
-import org.jclouds.compute.extensions.ImageExtension;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.digitalocean2.DigitalOcean2Api;
-import org.jclouds.digitalocean2.compute.internal.ImageInRegion;
-import org.jclouds.digitalocean2.domain.Action;
-import org.jclouds.digitalocean2.domain.Droplet;
-import org.jclouds.digitalocean2.domain.Droplet.Status;
-import org.jclouds.logging.Logger;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.primitives.Ints;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.UncheckedTimeoutException;
-
-/**
- * The {@link org.jclouds.compute.extensions.ImageExtension} implementation for the DigitalOcean provider.
- */
-@Singleton
-public class DigitalOcean2ImageExtension implements ImageExtension {
-
- @Resource
- @Named(ComputeServiceConstants.COMPUTE_LOGGER)
- protected Logger logger = Logger.NULL;
-
- private final DigitalOcean2Api api;
- private final Predicate<Integer> imageAvailablePredicate;
- private final Predicate<Integer> nodeStoppedPredicate;
- private final Function<ImageInRegion, Image> imageTransformer;
- private final ListeningExecutorService userExecutor;
-
- @Inject DigitalOcean2ImageExtension(DigitalOcean2Api api,
- @Named(TIMEOUT_IMAGE_AVAILABLE) Predicate<Integer> imageAvailablePredicate,
- @Named(TIMEOUT_NODE_SUSPENDED) Predicate<Integer> nodeStoppedPredicate,
- Function<ImageInRegion, Image> imageTransformer,
- @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
- this.api = api;
- this.imageAvailablePredicate = imageAvailablePredicate;
- this.nodeStoppedPredicate = nodeStoppedPredicate;
- this.imageTransformer = imageTransformer;
- this.userExecutor = userExecutor;
- }
-
- @Override
- public ImageTemplate buildImageTemplateFromNode(String name, String id) {
- Droplet droplet = api.dropletApi().get(Integer.parseInt(id));
-
- if (droplet == null) {
- throw new NoSuchElementException("Cannot find droplet with id: " + id);
- }
-
- return new ImageTemplateBuilder.CloneImageTemplateBuilder().nodeId(id).name(name).build();
- }
-
- @Override
- public ListenableFuture<Image> createImage(ImageTemplate template) {
- checkState(template instanceof CloneImageTemplate, "DigitalOcean only supports creating images through cloning.");
- final CloneImageTemplate cloneTemplate = (CloneImageTemplate) template;
- int dropletId = Integer.parseInt(cloneTemplate.getSourceNodeId());
-
- // Droplet needs to be stopped
- final Droplet droplet = api.dropletApi().get(dropletId);
- if (droplet.status() != Status.OFF) {
- api.dropletApi().powerOff(dropletId);
- checkState(nodeStoppedPredicate.apply(dropletId), "node was not powered off in the configured timeout");
- }
-
- final Action snapshotEvent = api.dropletApi().snapshot(Integer.parseInt(cloneTemplate.getSourceNodeId()),
- cloneTemplate.getName());
-
- logger.info(">> registered new Image, waiting for it to become available");
-
- return userExecutor.submit(new Callable<Image>() {
- @Override
- public Image call() throws Exception {
- if (imageAvailablePredicate.apply(snapshotEvent.id())) {
- org.jclouds.digitalocean2.domain.Image snapshot = api.imageApi().list().concat()
- .firstMatch(new Predicate<org.jclouds.digitalocean2.domain.Image>() {
- @Override
- public boolean apply(org.jclouds.digitalocean2.domain.Image input) {
- return input.name().equals(cloneTemplate.getName());
- }
- }).get();
-
- return imageTransformer.apply(ImageInRegion.create(snapshot, droplet.region().slug()));
- }
-
- throw new UncheckedTimeoutException("Image was not created within the time limit: "
- + cloneTemplate.getName());
- }
- });
- }
-
- @Override
- public boolean deleteImage(String id) {
- String imageId = ImageInRegion.extractImageId(id);
- Integer numericId = Ints.tryParse(imageId); // User images don't have a slug, so we expect a numeric id here
-
- if (numericId != null) {
- try {
- logger.debug(">> deleting image %s...", id);
- api.imageApi().delete(numericId);
- return true;
- } catch (Exception ex) {
- logger.error(ex, ">> error deleting image %s", id);
- }
- } else {
- logger.warn(">> image %s is not a user image and cannot be deleted", id);
- }
-
- return false;
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletStatusToStatus.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletStatusToStatus.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletStatusToStatus.java
deleted file mode 100644
index 6edadb9..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletStatusToStatus.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.functions;
-
-import javax.inject.Singleton;
-
-import org.jclouds.compute.domain.NodeMetadata.Status;
-import org.jclouds.digitalocean2.domain.Droplet;
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Transforms an {@link org.jclouds.compute.domain.NodeMetadata.Status} to the jclouds portable model.
- */
-@Singleton
-public class DropletStatusToStatus implements Function<Droplet.Status, Status> {
-
- private static final Function<Droplet.Status, Status> toPortableStatus = Functions.forMap(
- ImmutableMap.<Droplet.Status, Status> builder()
- .put(Droplet.Status.NEW, Status.PENDING)
- .put(Droplet.Status.ACTIVE, Status.RUNNING)
- .put(Droplet.Status.ARCHIVE, Status.TERMINATED)
- .put(Droplet.Status.OFF, Status.SUSPENDED)
- .build(),
- Status.UNRECOGNIZED);
-
- @Override
- public Status apply(final Droplet.Status input) {
- return toPortableStatus.apply(input);
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletToNodeMetadata.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletToNodeMetadata.java
deleted file mode 100644
index 11594f8..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/DropletToNodeMetadata.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.functions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.find;
-import static org.jclouds.digitalocean2.compute.internal.ImageInRegion.encodeId;
-
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.collect.Memoized;
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.NodeMetadata.Status;
-import org.jclouds.compute.domain.NodeMetadataBuilder;
-import org.jclouds.compute.functions.GroupNamingConvention;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.digitalocean2.compute.internal.ImageInRegion;
-import org.jclouds.digitalocean2.domain.Droplet;
-import org.jclouds.digitalocean2.domain.Networks;
-import org.jclouds.digitalocean2.domain.Region;
-import org.jclouds.domain.Credentials;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LoginCredentials;
-import org.jclouds.logging.Logger;
-
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Iterables;
-
-/**
- * Transforms an {@link Droplet} to the jclouds portable model.
- */
-@Singleton
-public class DropletToNodeMetadata implements Function<Droplet, NodeMetadata> {
-
- @Resource
- @Named(ComputeServiceConstants.COMPUTE_LOGGER)
- protected Logger logger = Logger.NULL;
-
- private final Supplier<Map<String, ? extends Image>> images;
- private final Supplier<Map<String, ? extends Hardware>> hardwares;
- private final Supplier<Set<? extends Location>> locations;
- private final Function<Droplet.Status, Status> toPortableStatus;
- private final GroupNamingConvention groupNamingConvention;
- private final Map<String, Credentials> credentialStore;
-
- @Inject
- DropletToNodeMetadata(Supplier<Map<String, ? extends Image>> images,
- Supplier<Map<String, ? extends Hardware>> hardwares, @Memoized Supplier<Set<? extends Location>> locations,
- Function<Droplet.Status, Status> toPortableStatus, GroupNamingConvention.Factory groupNamingConvention,
- Map<String, Credentials> credentialStore) {
- this.images = checkNotNull(images, "images cannot be null");
- this.hardwares = checkNotNull(hardwares, "hardwares cannot be null");
- this.locations = checkNotNull(locations, "locations cannot be null");
- this.toPortableStatus = checkNotNull(toPortableStatus, "toPortableStatus cannot be null");
- this.groupNamingConvention = checkNotNull(groupNamingConvention, "groupNamingConvention cannot be null")
- .createWithoutPrefix();
- this.credentialStore = checkNotNull(credentialStore, "credentialStore cannot be null");
- }
-
- @Override
- public NodeMetadata apply(Droplet input) {
- NodeMetadataBuilder builder = new NodeMetadataBuilder();
- builder.ids(String.valueOf(input.id()));
- builder.name(input.name());
- builder.hostname(input.name());
- builder.group(groupNamingConvention.extractGroup(input.name()));
-
- builder.hardware(getHardware(input.sizeSlug()));
- builder.location(getLocation(input.region()));
-
- Optional<? extends Image> image = findImage(input.image(), input.region().slug());
- if (image.isPresent()) {
- builder.imageId(image.get().getId());
- builder.operatingSystem(image.get().getOperatingSystem());
- } else {
- logger.info(">> image with id %s for droplet %s was not found. "
- + "This might be because the image that was used to create the droplet has a new id.",
- input.image().id(), input.id());
- }
-
- builder.status(toPortableStatus.apply(input.status()));
- builder.backendStatus(input.status().name());
-
- if (!input.getPublicAddresses().isEmpty()) {
- builder.publicAddresses(FluentIterable
- .from(input.getPublicAddresses())
- .transform(new Function<Networks.Address, String>() {
- @Override
- public String apply(final Networks.Address input) {
- return input.ip();
- }
- })
- );
- }
-
- if (!input.getPrivateAddresses().isEmpty()) {
- builder.privateAddresses(FluentIterable
- .from(input.getPrivateAddresses())
- .transform(new Function<Networks.Address, String>() {
- @Override
- public String apply(final Networks.Address input) {
- return input.ip();
- }
- })
- );
- }
-
- // DigitalOcean does not provide a way to get the credentials.
- // Try to return them from the credential store
- Credentials credentials = credentialStore.get("node#" + input.id());
- if (credentials instanceof LoginCredentials) {
- builder.credentials(LoginCredentials.class.cast(credentials));
- }
-
- return builder.build();
- }
-
- protected Optional<? extends Image> findImage(org.jclouds.digitalocean2.domain.Image image, String region) {
- return Optional.fromNullable(images.get().get(encodeId(ImageInRegion.create(image, region))));
- }
-
- protected Hardware getHardware(final String slug) {
- return Iterables.find(hardwares.get().values(), new Predicate<Hardware>() {
- @Override
- public boolean apply(Hardware input) {
- return input.getId().equals(slug);
- }
- });
- }
-
- protected Location getLocation(final Region region) {
- return find(locations.get(), new Predicate<Location>() {
- @Override
- public boolean apply(Location location) {
- return region != null && region.slug().equals(location.getId());
- }
- }, null);
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/ImageInRegionToImage.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/ImageInRegionToImage.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/ImageInRegionToImage.java
deleted file mode 100644
index 08c6c71..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/ImageInRegionToImage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.functions;
-
-import static com.google.common.collect.Iterables.find;
-import static org.jclouds.compute.domain.OperatingSystem.builder;
-import static org.jclouds.digitalocean2.compute.internal.ImageInRegion.encodeId;
-
-import java.util.Set;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.collect.Memoized;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.Image.Status;
-import org.jclouds.compute.domain.ImageBuilder;
-import org.jclouds.digitalocean2.compute.internal.ImageInRegion;
-import org.jclouds.digitalocean2.domain.OperatingSystem;
-import org.jclouds.domain.Location;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Transforms an {@link ImageInRegion} to the jclouds portable model.
- */
-@Singleton
-public class ImageInRegionToImage implements Function<ImageInRegion, Image> {
-
- private final Supplier<Set<? extends Location>> locations;
-
- @Inject ImageInRegionToImage(@Memoized Supplier<Set<? extends Location>> locations) {
- this.locations = locations;
- }
-
- @Override
- public Image apply(final ImageInRegion input) {
- String description = input.image().distribution() + " " + input.image().name();
- ImageBuilder builder = new ImageBuilder();
- // Private images don't have a slug
- builder.id(encodeId(input));
- builder.providerId(String.valueOf(input.image().id()));
- builder.name(input.image().name());
- builder.description(description);
- builder.status(Status.AVAILABLE);
- builder.location(getLocation(input.region()));
-
- OperatingSystem os = OperatingSystem.create(input.image().name(), input.image().distribution());
-
- builder.operatingSystem(builder()
- .name(os.distribution().value())
- .family(os.distribution().osFamily())
- .description(description)
- .arch(os.arch())
- .version(os.version())
- .is64Bit(os.is64bit())
- .build());
-
- ImmutableMap.Builder<String, String> metadata = ImmutableMap.builder();
- metadata.put("publicImage", String.valueOf(input.image().isPublic()));
- builder.userMetadata(metadata.build());
-
- return builder.build();
- }
-
- protected Location getLocation(final String region) {
- return find(locations.get(), new Predicate<Location>() {
- @Override
- public boolean apply(Location location) {
- return region.equals(location.getId());
- }
- });
- }
-
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/RegionToLocation.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/RegionToLocation.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/RegionToLocation.java
deleted file mode 100644
index adde1b7..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/RegionToLocation.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.functions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.getOnlyElement;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.digitalocean2.domain.Region;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.location.suppliers.all.JustProvider;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
-/**
- * Transforms an {@link Region} to the jclouds portable model.
- */
-@Singleton
-public class RegionToLocation implements Function<Region, Location> {
-
- private final JustProvider justProvider;
-
- @Inject
- RegionToLocation(JustProvider justProvider) {
- this.justProvider = checkNotNull(justProvider, "justProvider cannot be null");
- }
-
- @Override
- public Location apply(Region input) {
- LocationBuilder builder = new LocationBuilder();
- builder.id(input.slug());
- builder.description(input.name());
- builder.scope(LocationScope.REGION);
- builder.parent(getOnlyElement(justProvider.get()));
- builder.iso3166Codes(ImmutableSet.<String> of());
- builder.metadata(ImmutableMap.<String, Object> of("available", input.available(), "features", input.features()));
- return builder.build();
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/SizeToHardware.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/SizeToHardware.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/SizeToHardware.java
deleted file mode 100644
index 5645d3b..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/SizeToHardware.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.functions;
-
-import javax.inject.Singleton;
-
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.HardwareBuilder;
-import org.jclouds.compute.domain.Processor;
-import org.jclouds.compute.domain.Volume.Type;
-import org.jclouds.compute.domain.VolumeBuilder;
-import org.jclouds.digitalocean2.domain.Size;
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Transforms an {@link Size} to the jclouds portable model.
- */
-@Singleton
-public class SizeToHardware implements Function<Size, Hardware> {
-
- @Override
- public Hardware apply(Size input) {
- HardwareBuilder builder = new HardwareBuilder();
- builder.id(input.slug());
- builder.providerId(input.slug());
- builder.name(input.slug());
- builder.ram(input.memory());
- // No cpu speed from DigitalOcean API, so assume more cores == faster
- builder.processor(new Processor(input.vcpus(), input.vcpus()));
-
- builder.volume(new VolumeBuilder()
- .size(Float.valueOf(input.disk()))
- .type(Type.LOCAL)
- .build());
-
- ImmutableMap.Builder<String, String> metadata = ImmutableMap.builder();
- metadata.put("costPerHour", String.valueOf(input.priceHourly()));
- metadata.put("costPerMonth", String.valueOf(input.priceMonthly()));
- builder.userMetadata(metadata.build());
-
- return builder.build();
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/TemplateOptionsToStatementWithoutPublicKey.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/TemplateOptionsToStatementWithoutPublicKey.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/TemplateOptionsToStatementWithoutPublicKey.java
deleted file mode 100644
index 52dcb0e..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/functions/TemplateOptionsToStatementWithoutPublicKey.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.functions;
-
-import javax.inject.Singleton;
-
-import org.jclouds.compute.functions.TemplateOptionsToStatement;
-import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.scriptbuilder.InitScript;
-import org.jclouds.scriptbuilder.domain.Statement;
-import org.jclouds.scriptbuilder.domain.StatementList;
-import org.jclouds.scriptbuilder.statements.ssh.InstallRSAPrivateKey;
-import com.google.common.collect.ImmutableList;
-
-/**
- * Convert the template options into a statement, but ignoring the public key.
- * <p>
- * The {@link org.jclouds.DigitalOcean2ComputeServiceAdapter.compute.strategy.DigitalOceanComputeServiceAdapter} already takes care of
- * installing it using the {@link org.jclouds.digitalocean.features.KeyPairApi}.
- */
-@Singleton
-public class TemplateOptionsToStatementWithoutPublicKey extends TemplateOptionsToStatement {
-
- @Override
- public Statement apply(TemplateOptions options) {
- ImmutableList.Builder<Statement> builder = ImmutableList.builder();
- if (options.getRunScript() != null) {
- builder.add(options.getRunScript());
- }
- if (options.getPrivateKey() != null) {
- builder.add(new InstallRSAPrivateKey(options.getPrivateKey()));
- }
-
- ImmutableList<Statement> bootstrap = builder.build();
- if (!bootstrap.isEmpty()) {
- if (options.getTaskName() == null && !(options.getRunScript() instanceof InitScript)) {
- options.nameTask("bootstrap");
- }
- return bootstrap.size() == 1 ? bootstrap.get(0) : new StatementList(bootstrap);
- }
-
- return null;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/internal/ImageInRegion.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/internal/ImageInRegion.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/internal/ImageInRegion.java
deleted file mode 100644
index b5beb8d..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/internal/ImageInRegion.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.internal;
-
-import org.jclouds.digitalocean2.domain.Image;
-
-import com.google.auto.value.AutoValue;
-
-/**
- * Scopes an image to a particular region.
- */
-@AutoValue
-public abstract class ImageInRegion {
-
- public abstract Image image();
- public abstract String region();
-
- public static ImageInRegion create(Image image, String region) {
- return new AutoValue_ImageInRegion(image, region);
- }
-
- public static String encodeId(ImageInRegion imageInRegion) {
- // Private images don't have a slug
- return String.format("%s/%s", imageInRegion.region(), slugOrId(imageInRegion.image()));
- }
-
- public static String extractRegion(String imageId) {
- return imageId.substring(0, imageId.indexOf('/'));
- }
-
- public static String extractImageId(String imageId) {
- return imageId.substring(imageId.indexOf('/') + 1);
- }
-
- private static String slugOrId(Image image) {
- return image.slug() != null ? image.slug() : String.valueOf(image.id());
- }
-
- ImageInRegion() { }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/a6044372/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java
deleted file mode 100644
index cafcdb1..0000000
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.jclouds.digitalocean2.compute.options;
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Set;
-
-import org.jclouds.compute.options.TemplateOptions;
-import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-
-/**
- * Custom options for the DigitalOcean API.
- */
-public class DigitalOcean2TemplateOptions extends TemplateOptions implements Cloneable {
-
- private Set<Integer> sshKeyIds = ImmutableSet.of();
- private boolean privateNetworking = false;
- private boolean backupsEnabled = false;
- private boolean autoCreateKeyPair = true;
-
- /**
- * Enables a private network interface if the region supports private networking.
- */
- public DigitalOcean2TemplateOptions privateNetworking(boolean privateNetworking) {
- this.privateNetworking = privateNetworking;
- return this;
- }
-
- /**
- * Enabled backups for the droplet.
- */
- public DigitalOcean2TemplateOptions backupsEnabled(boolean backupsEnabled) {
- this.backupsEnabled = backupsEnabled;
- return this;
- }
-
- /**
- * Sets the ssh key ids to be added to the droplet.
- */
- public DigitalOcean2TemplateOptions sshKeyIds(Iterable<Integer> sshKeyIds) {
- this.sshKeyIds = ImmutableSet.copyOf(checkNotNull(sshKeyIds, "sshKeyIds cannot be null"));
- return this;
- }
-
- /**
- * Sets whether an SSH key pair should be created automatically.
- */
- public DigitalOcean2TemplateOptions autoCreateKeyPair(boolean autoCreateKeyPair) {
- this.autoCreateKeyPair = autoCreateKeyPair;
- return this;
- }
-
- public Set<Integer> getSshKeyIds() {
- return sshKeyIds;
- }
-
- public boolean getPrivateNetworking() {
- return privateNetworking;
- }
-
- public boolean getBackupsEnabled() {
- return backupsEnabled;
- }
-
- public boolean getAutoCreateKeyPair() {
- return autoCreateKeyPair;
- }
-
- @Override
- public DigitalOcean2TemplateOptions clone() {
- DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions();
- copyTo(options);
- return options;
- }
-
- @Override
- public void copyTo(TemplateOptions to) {
- super.copyTo(to);
- if (to instanceof DigitalOcean2TemplateOptions) {
- DigitalOcean2TemplateOptions eTo = DigitalOcean2TemplateOptions.class.cast(to);
- eTo.privateNetworking(privateNetworking);
- eTo.backupsEnabled(backupsEnabled);
- eTo.autoCreateKeyPair(autoCreateKeyPair);
- eTo.sshKeyIds(sshKeyIds);
- }
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(super.hashCode(), backupsEnabled, privateNetworking, autoCreateKeyPair, sshKeyIds);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- DigitalOcean2TemplateOptions other = (DigitalOcean2TemplateOptions) obj;
- return super.equals(other) && equal(this.backupsEnabled, other.backupsEnabled)
- && equal(this.privateNetworking, other.privateNetworking)
- && equal(this.autoCreateKeyPair, other.autoCreateKeyPair) && equal(this.sshKeyIds, other.sshKeyIds);
- }
-
- @Override
- public ToStringHelper string() {
- ToStringHelper toString = super.string().omitNullValues();
- toString.add("privateNetworking", privateNetworking);
- toString.add("backupsEnabled", backupsEnabled);
- if (!sshKeyIds.isEmpty()) {
- toString.add("sshKeyIds", sshKeyIds);
- }
- toString.add("autoCreateKeyPair", autoCreateKeyPair);
- return toString;
- }
-
- public static class Builder {
-
- /**
- * @see DigitalOcean2TemplateOptions#privateNetworking
- */
- public static DigitalOcean2TemplateOptions privateNetworking(boolean privateNetworking) {
- DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions();
- return options.privateNetworking(privateNetworking);
- }
-
- /**
- * @see DigitalOcean2TemplateOptions#backupsEnabled
- */
- public static DigitalOcean2TemplateOptions backupsEnabled(boolean backupsEnabled) {
- DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions();
- return options.backupsEnabled(backupsEnabled);
- }
-
- /**
- * @see DigitalOcean2TemplateOptions#sshKeyIds
- */
- public static DigitalOcean2TemplateOptions sshKeyIds(Iterable<Integer> sshKeyIds) {
- DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions();
- return options.sshKeyIds(sshKeyIds);
- }
-
- /**
- * @see DigitalOcean2TemplateOptions#autoCreateKeyPair
- */
- public static DigitalOcean2TemplateOptions autoCreateKeyPair(boolean autoCreateKeyPair) {
- DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions();
- return options.autoCreateKeyPair(autoCreateKeyPair);
- }
- }
-}