You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by de...@apache.org on 2016/02/19 16:33:16 UTC
[06/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider
- Server & Image API
JCLOUDS-702: JCloud ProfitBricks provider - Server & Image API
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/ee24ddb2
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/ee24ddb2
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/ee24ddb2
Branch: refs/heads/master
Commit: ee24ddb2b4d9001f8fdf47a483985c0c2c912bb4
Parents: 8206d19
Author: Reijhanniel <de...@gmail.com>
Authored: Fri Jan 23 10:05:41 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Jan 26 11:27:18 2015 +0100
----------------------------------------------------------------------
providers/profitbricks/pom.xml | 8 +-
.../jclouds/profitbricks/ProfitBricksApi.java | 8 +
.../binder/BaseProfitBricksRequestBinder.java | 2 +-
.../server/CreateServerRequestBinder.java | 57 +++
.../server/UpdateServerRequestBinder.java | 56 +++
.../internal/ProvisioningStatusAware.java | 2 +-
.../ProvisioningStatusPollingPredicate.java | 2 +
.../profitbricks/domain/AvailabilityZone.java | 35 ++
.../org/jclouds/profitbricks/domain/Image.java | 207 +++++++++
.../org/jclouds/profitbricks/domain/OsType.java | 30 ++
.../org/jclouds/profitbricks/domain/Server.java | 424 +++++++++++++++++++
.../domain/internal/ServerCommonProperties.java | 49 +++
.../jclouds/profitbricks/features/ImageApi.java | 65 +++
.../profitbricks/features/ServerApi.java | 164 +++++++
.../parser/BaseProfitBricksResponseHandler.java | 8 +
.../parser/RequestIdOnlyResponseHandler.java | 49 +++
.../parser/image/BaseImageResponseHandler.java | 76 ++++
.../parser/image/ImageInfoResponseHandler.java | 48 +++
.../parser/image/ImageListResponseHandler.java | 51 +++
.../server/BaseServerResponseHandler.java | 75 ++++
.../server/ServerIdOnlyResponseHandler.java | 55 +++
.../server/ServerInfoResponseHandler.java | 48 +++
.../server/ServerListResponseHandler.java | 51 +++
.../server/CreateServerRequestBinderTest.java | 65 +++
.../server/UpdateServerRequestBinderTest.java | 64 +++
.../profitbricks/domain/ServerBuilderTest.java | 164 +++++++
.../features/DataCenterApiMockTest.java | 41 +-
.../profitbricks/features/ImageApiLiveTest.java | 58 +++
.../profitbricks/features/ImageApiMockTest.java | 116 +++++
.../features/ServerApiLiveTest.java | 139 ++++++
.../features/ServerApiMockTest.java | 338 +++++++++++++++
.../RequestIdOnlyResponseHandlerTest.java | 76 ++++
.../parser/ServiceFaultResponseHandlerTest.java | 4 +-
.../DataCenterInfoResponseHandlerTest.java | 3 +-
.../image/ImageInfoResponseHandlerTest.java | 65 +++
.../image/ImageListResponseHandlerTest.java | 183 ++++++++
.../server/ServerIdOnlyResponseHandlerTest.java | 40 ++
.../server/ServerInfoResponseHandlerTest.java | 76 ++++
.../server/ServerListResponseHandlerTest.java | 97 +++++
.../internal/BaseProfitBricksMockTest.java | 18 +-
.../datacenter/datacenter-not-found.xml | 17 +
.../src/test/resources/fault-404.xml | 30 +-
.../test/resources/image/image-not-found.xml | 17 +
.../src/test/resources/image/image.xml | 26 ++
.../src/test/resources/image/images.xml | 140 ++++++
.../src/test/resources/server/server-create.xml | 13 +
.../src/test/resources/server/server-delete.xml | 13 +
.../src/test/resources/server/server-reset.xml | 11 +
.../src/test/resources/server/server-start.xml | 11 +
.../src/test/resources/server/server-stop.xml | 11 +
.../src/test/resources/server/server-update.xml | 13 +
.../src/test/resources/server/server.xml | 57 +++
.../src/test/resources/server/servers.xml | 104 +++++
53 files changed, 3542 insertions(+), 38 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index b48e589..84f49b4 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -57,13 +57,13 @@
<version>${jclouds.version}</version>
</dependency>
<dependency>
- <groupId>com.google.auto.value</groupId>
- <artifactId>auto-value</artifactId>
+ <groupId>com.google.auto.service</groupId>
+ <artifactId>auto-service</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
- <groupId>com.google.auto.service</groupId>
- <artifactId>auto-service</artifactId>
+ <groupId>com.google.auto.value</groupId>
+ <artifactId>auto-value</artifactId>
<scope>provided</scope>
</dependency>
<!-- Test dependencies -->
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index d1cb1e1..7ab121a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -19,10 +19,18 @@ package org.jclouds.profitbricks;
import java.io.Closeable;
import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.features.ImageApi;
+import org.jclouds.profitbricks.features.ServerApi;
import org.jclouds.rest.annotations.Delegate;
public interface ProfitBricksApi extends Closeable {
@Delegate
DataCenterApi dataCenterApi();
+
+ @Delegate
+ ImageApi imageApi();
+
+ @Delegate
+ ServerApi serverApi();
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
index af85c5e..8c2d36b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
@@ -56,7 +56,7 @@ public abstract class BaseProfitBricksRequestBinder<T> implements MapBinder {
protected abstract String createPayload(T payload);
protected String formatIfNotEmpty(String pattern, Object param) {
- return Strings.isNullOrEmpty(param.toString()) ? "" : String.format(pattern, param);
+ return Strings.isNullOrEmpty(nullableToString( param )) ? "" : String.format(pattern, param);
}
protected String nullableToString(Object object) {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
new file mode 100644
index 0000000..4acf33b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
@@ -0,0 +1,57 @@
+/*
+ * 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.profitbricks.binder.server;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Server;
+
+public class CreateServerRequestBinder extends BaseProfitBricksRequestBinder<Server.Request.CreatePayload> {
+
+ protected final StringBuilder requestBuilder;
+
+ CreateServerRequestBinder() {
+ super( "server" );
+ this.requestBuilder = new StringBuilder( 128 * 4 );
+ }
+
+ @Override
+ protected String createPayload( Server.Request.CreatePayload payload ) {
+ requestBuilder.append( "<ws:createServer>" )
+ .append( "<request>" )
+ .append( format( "<dataCenterId>%s</dataCenterId>", payload.dataCenterId() ) )
+ .append( format( "<cores>%s</cores>", payload.cores() ) )
+ .append( format( "<ram>%s</ram>", payload.ram() ) )
+ .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
+ .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
+ .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
+ .append( formatIfNotEmpty( "<internetAccess>%s</internetAccess>", payload.hasInternetAccess() ) )
+ .append( formatIfNotEmpty( "<lanId>%s</lanId>", payload.lanId() ) )
+ .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
+ .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
+ .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
+ .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
+ .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
+ .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
+ .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
+ .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
+ .append( "</request>" )
+ .append( "</ws:createServer>" );
+ return requestBuilder.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
new file mode 100644
index 0000000..d051b88
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
@@ -0,0 +1,56 @@
+/*
+ * 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.profitbricks.binder.server;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Server;
+
+public class UpdateServerRequestBinder extends BaseProfitBricksRequestBinder<Server.Request.UpdatePayload> {
+
+ protected final StringBuilder requestBuilder;
+
+ UpdateServerRequestBinder() {
+ super( "server" );
+ this.requestBuilder = new StringBuilder( 128 * 4 );
+
+ }
+
+ @Override
+ protected String createPayload( Server.Request.UpdatePayload payload ) {
+ requestBuilder.append( "<ws:updateServer>" )
+ .append( "<request>" )
+ .append( format( "<serverId>%s</serverId>", payload.id() ) )
+ .append( format( "<cores>%s</cores>", payload.cores() ) )
+ .append( format( "<ram>%s</ram>", payload.ram() ) )
+ .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
+ .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
+ .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
+ .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
+ .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
+ .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
+ .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
+ .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
+ .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
+ .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
+ .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
+ .append( "</request>" )
+ .append( "</ws:updateServer>" );
+ return requestBuilder.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
index 84f7128..5056243 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -23,5 +23,5 @@ package org.jclouds.profitbricks.compute.internal;
*/
public enum ProvisioningStatusAware {
- DATACENTER;
+ DATACENTER, SERVER;
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index d8a7521..73db33f 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -48,6 +48,8 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
switch (domain) {
case DATACENTER:
return expect == api.dataCenterApi().getDataCenterState(input);
+ case SERVER:
+ return expect == api.serverApi().getServer( input ).state();
default:
throw new IllegalArgumentException("Unknown domain '" + domain + "'");
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
new file mode 100644
index 0000000..b582d69
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
@@ -0,0 +1,35 @@
+/*
+ * 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.profitbricks.domain;
+
+public enum AvailabilityZone {
+
+ AUTO, ZONE_1, ZONE_2, UNRECOGNIZED;
+
+ public String value() {
+ return name();
+ }
+
+ public static AvailabilityZone fromValue( String v ) {
+ try {
+ return valueOf( v );
+ } catch ( Exception ex ) {
+ return UNRECOGNIZED;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
new file mode 100644
index 0000000..d272e27
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
@@ -0,0 +1,207 @@
+/*
+ * 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.profitbricks.domain;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class Image {
+
+ public enum Type {
+
+ HDD, CDROM, UNRECOGNIZED;
+
+ public static Type fromValue(String v) {
+ try {
+ return valueOf(v);
+ } catch (IllegalArgumentException ex) {
+ return UNRECOGNIZED;
+ }
+ }
+ }
+
+ public abstract String id();
+
+ public abstract String name();
+
+ public abstract float size(); // MB
+
+ public abstract Type type();
+
+ public abstract Location location();
+
+ public abstract OsType osType();
+
+ public abstract boolean isPublic();
+
+ public abstract boolean isWriteable();
+
+ public abstract boolean isBootable();
+
+ public abstract boolean isCpuHotPlug();
+
+ public abstract boolean isCpuHotUnPlug();
+
+ public abstract boolean isRamHotPlug();
+
+ public abstract boolean isRamHotUnPlug();
+
+ public abstract boolean isNicHotPlug();
+
+ public abstract boolean isNicHotUnPlug();
+
+ public abstract boolean isDiscVirtioHotPlug();
+
+ public abstract boolean isDiscVirtioHotUnPlug();
+
+ public static Image create(String id, String name, float size, Type type, Location location, OsType osType,
+ boolean isPublic, boolean isWriteable, boolean isBootable, boolean cpuHotPlug, boolean cpuHotUnPlug,
+ boolean ramHotPlug, boolean ramHotUnPlug, boolean nicHotPlug, boolean nicHotUnPlug,
+ boolean discVirtioHotPlug, boolean discVirtioHotUnPlug) {
+ return new AutoValue_Image(id, name, size, type, location, osType, isPublic, isWriteable,
+ isBootable, cpuHotPlug, cpuHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return builder().fromImage(this);
+ }
+
+ public static class Builder {
+
+ private String id;
+ private String name;
+ private float size;
+ private Type type;
+ private Location location;
+ private OsType osType;
+ private boolean isPublic;
+ private boolean isWriteable;
+ private boolean isBootable;
+ private boolean cpuHotPlug;
+ private boolean cpuHotUnPlug;
+ private boolean ramHotPlug;
+ private boolean ramHotUnPlug;
+ private boolean nicHotPlug;
+ private boolean nicHotUnPlug;
+ private boolean discVirtioHotPlug;
+ private boolean discVirtioHotUnPlug;
+
+ public Builder id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ public Builder name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Builder size(float size) {
+ this.size = size;
+ return this;
+ }
+
+ public Builder type(Type type) {
+ this.type = type;
+ return this;
+ }
+
+ public Builder osType(OsType osType) {
+ this.osType = osType;
+ return this;
+ }
+
+ public Builder location(Location location) {
+ this.location = location;
+ return this;
+ }
+
+ public Builder isPublic(boolean isPublic) {
+ this.isPublic = isPublic;
+ return this;
+ }
+
+ public Builder isWriteable(boolean isWriteable) {
+ this.isWriteable = isWriteable;
+ return this;
+ }
+
+ public Builder isBootable(boolean isBootable) {
+ this.isBootable = isBootable;
+ return this;
+ }
+
+ public Builder isCpuHotPlug(boolean cpuHotPlug) {
+ this.cpuHotPlug = cpuHotPlug;
+ return this;
+ }
+
+ public Builder isCpuHotUnPlug(boolean cpuHotUnPlug) {
+ this.cpuHotUnPlug = cpuHotUnPlug;
+ return this;
+ }
+
+ public Builder isRamHotPlug(boolean ramHotPlug) {
+ this.ramHotPlug = ramHotPlug;
+ return this;
+ }
+
+ public Builder isRamHotUnPlug(boolean ramHotUnPlug) {
+ this.ramHotUnPlug = ramHotUnPlug;
+ return this;
+ }
+
+ public Builder isNicHotPlug(boolean nicHotPlug) {
+ this.nicHotPlug = nicHotPlug;
+ return this;
+ }
+
+ public Builder isNicHotUnPlug(boolean nicHotUnPlug) {
+ this.nicHotUnPlug = nicHotUnPlug;
+ return this;
+ }
+
+ public Builder isDiscVirtioHotPlug(boolean discVirtioHotPlug) {
+ this.discVirtioHotPlug = discVirtioHotPlug;
+ return this;
+ }
+
+ public Builder isDiscVirtioHotUnPlug(boolean discVirtioHotUnPlug) {
+ this.discVirtioHotUnPlug = discVirtioHotUnPlug;
+ return this;
+ }
+
+ public Image build() {
+ return Image.create(id, name, size, type, location, osType, isPublic, isWriteable, isBootable, cpuHotPlug, cpuHotUnPlug,
+ ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+ }
+
+ public Builder fromImage(Image in) {
+ return this.id(in.id()).isBootable(in.isBootable()).isCpuHotPlug(in.isCpuHotPlug()).isCpuHotUnPlug(in.isCpuHotUnPlug())
+ .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
+ .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isPublic(in.isPublic())
+ .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug()).isWriteable(in.isWriteable())
+ .location(in.location()).name(in.name()).osType(in.osType()).size(in.size());
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
new file mode 100644
index 0000000..c21f1c4
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
@@ -0,0 +1,30 @@
+/*
+ * 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.profitbricks.domain;
+
+public enum OsType {
+
+ WINDOWS, LINUX, OTHER, UNRECOGNIZED;
+
+ public static OsType fromValue(String v) {
+ try {
+ return valueOf(v);
+ } catch (IllegalArgumentException ex) {
+ return UNRECOGNIZED;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
new file mode 100644
index 0000000..703eb59
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -0,0 +1,424 @@
+/*
+ * 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.profitbricks.domain;
+
+import org.jclouds.profitbricks.domain.internal.ServerCommonProperties;
+import com.google.auto.value.AutoValue;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Date;
+import org.jclouds.javax.annotation.Nullable;
+
+@AutoValue
+public abstract class Server implements ServerCommonProperties {
+
+ public enum Status {
+
+ NOSTATE, RUNNING, BLOCKED, PAUSED, SHUTDOWN, SHUTOFF, CRASHED, UNRECOGNIZED;
+
+ public String value() {
+ return name();
+ }
+
+ public static Status fromValue( String v ) {
+ try {
+ return valueOf( v );
+ } catch ( IllegalArgumentException ex ) {
+ return UNRECOGNIZED;
+ }
+ }
+ }
+
+ @Nullable
+ public abstract String id();
+
+ @Nullable
+ @Override
+ public abstract String name();
+
+ @Nullable
+ public abstract Boolean hasInternetAccess();
+
+ public abstract ProvisioningState state();
+
+ @Nullable
+ public abstract Status status();
+
+ @Nullable
+ public abstract OsType osType();
+
+ @Nullable
+ public abstract AvailabilityZone availabilityZone();
+
+ @Nullable
+ public abstract Date creationTime();
+
+ @Nullable
+ public abstract Date lastModificationTime();
+
+// public abstract List<Storage> storages();
+// public abstract List<Nic> storages();
+ public static Server create( String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
+ Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime, Boolean isCpuHotPlug,
+ Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
+ return new AutoValue_Server( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
+ cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime );
+
+ }
+
+ public static DescribingBuilder builder() {
+ return new DescribingBuilder();
+ }
+
+ public DescribingBuilder toBuilder() {
+ return builder().fromServer( this );
+ }
+
+ public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> {
+
+ protected String name;
+ protected int cores;
+ protected int ram;
+ protected Boolean cpuHotPlug;
+ protected Boolean ramHotPlug;
+ protected Boolean nicHotPlug;
+ protected Boolean nicHotUnPlug;
+ protected Boolean discVirtioHotPlug;
+ protected Boolean discVirtioHotUnPlug;
+
+ public B name( String name ) {
+ this.name = name;
+ return self();
+ }
+
+ public B cores( int cores ) {
+ this.cores = cores;
+ return self();
+ }
+
+ public B ram( int ram ) {
+ this.ram = ram;
+ return self();
+ }
+
+ public B isCpuHotPlug( Boolean cpuHotPlug ) {
+ this.cpuHotPlug = cpuHotPlug;
+ return self();
+ }
+
+ public B isRamHotPlug( Boolean ramHotPlug ) {
+ this.ramHotPlug = ramHotPlug;
+ return self();
+
+ }
+
+ public B isNicHotPlug( Boolean nicHotPlug ) {
+ this.nicHotPlug = nicHotPlug;
+ return self();
+ }
+
+ public B isNicHotUnPlug( Boolean nicHotUnPlug ) {
+ this.nicHotUnPlug = nicHotUnPlug;
+ return self();
+ }
+
+ public B isDiscVirtioHotPlug( Boolean discVirtioHotPlug ) {
+ this.discVirtioHotPlug = discVirtioHotPlug;
+ return self();
+ }
+
+ public B isDiscVirtioHotUnPlug( Boolean discVirtioHotUnPlug ) {
+ this.discVirtioHotUnPlug = discVirtioHotUnPlug;
+ return self();
+ }
+
+ public abstract B self();
+
+ public abstract D build();
+ }
+
+ public static class DescribingBuilder extends Builder<DescribingBuilder, Server> {
+
+ private String id;
+ private ProvisioningState state;
+ private Status status;
+ private OsType osType;
+ private AvailabilityZone zone;
+ private Date creationTime;
+ private Date lastModificationTime;
+ private Boolean hasInternetAccess;
+
+ public DescribingBuilder id( String id ) {
+ this.id = id;
+ return this;
+ }
+
+ public DescribingBuilder state( ProvisioningState state ) {
+ this.state = state;
+ return this;
+ }
+
+ public DescribingBuilder status( Status status ) {
+ this.status = status;
+ return this;
+ }
+
+ public DescribingBuilder osType( OsType osType ) {
+ this.osType = osType;
+ return this;
+ }
+
+ public DescribingBuilder availabilityZone( AvailabilityZone zone ) {
+ this.zone = zone;
+ return this;
+ }
+
+ public DescribingBuilder creationTime( Date creationTime ) {
+ this.creationTime = creationTime;
+ return this;
+ }
+
+ public DescribingBuilder lastModificationTime( Date lastModificationTime ) {
+ this.lastModificationTime = lastModificationTime;
+ return this;
+ }
+
+ public DescribingBuilder hasInternetAccess( Boolean hasInternetAccess ) {
+ this.hasInternetAccess = hasInternetAccess;
+ return this;
+ }
+
+ @Override
+ public Server build() {
+ return Server.create( id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
+ lastModificationTime, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+ }
+
+ private DescribingBuilder fromServer( Server in ) {
+ return this.id( in.id() ).cores( in.cores() ).creationTime( in.creationTime() ).hasInternetAccess( in.hasInternetAccess() )
+ .isCpuHotPlug( in.isCpuHotPlug() ).isDiscVirtioHotPlug( in.isDiscVirtioHotPlug() ).isDiscVirtioHotUnPlug( in.isDiscVirtioHotUnPlug() )
+ .isNicHotPlug( in.isNicHotPlug() ).isNicHotUnPlug( in.isNicHotUnPlug() ).isRamHotPlug( in.isRamHotPlug() )
+ .lastModificationTime( in.lastModificationTime() ).name( in.name() ).osType( in.osType() ).ram( in.ram() ).state( in.state() )
+ .status( in.status() );
+ }
+
+ @Override
+ public DescribingBuilder self() {
+ return this;
+ }
+
+ }
+
+ public static final class Request {
+
+ public static CreatePayload.Builder creatingBuilder() {
+ return new CreatePayload.Builder();
+ }
+
+ public static UpdatePayload.Builder updatingBuilder() {
+ return new UpdatePayload.Builder();
+ }
+
+ @AutoValue
+ public abstract static class CreatePayload implements ServerCommonProperties {
+
+ public abstract String dataCenterId();
+
+ @Nullable
+ public abstract String bootFromStorageId();
+
+ @Nullable
+ public abstract String bootFromImageId();
+
+ @Nullable
+ public abstract Integer lanId();
+
+ @Nullable
+ public abstract Boolean hasInternetAccess();
+
+ @Nullable
+ public abstract AvailabilityZone availabilityZone();
+
+ @Nullable
+ public abstract OsType osType();
+
+ public static CreatePayload create( String dataCenterId, String name, int core, int ram ) {
+ return create( dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null );
+ }
+
+ public static CreatePayload create( String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+ Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug,
+ Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
+ validateCores( cores );
+ validateRam( ram, isRamHotPlug );
+ return new AutoValue_Server_Request_CreatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+ isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
+ availabilityZone, osType );
+ }
+
+ public static class Builder extends Server.Builder<Builder, CreatePayload> {
+
+ private String dataCenterId;
+ private String bootFromStorageId;
+ private String bootFromImageId;
+ private Integer lanId;
+ private Boolean hasInternetAccess;
+ private AvailabilityZone availabilityZone;
+ private OsType osType;
+
+ public Builder dataCenterId( String dataCenterId ) {
+ this.dataCenterId = dataCenterId;
+ return this;
+ }
+
+ public Builder dataCenterId( DataCenter dataCenter ) {
+ this.dataCenterId = checkNotNull( dataCenter, "Cannot pass null datacenter" ).id();
+ return this;
+ }
+
+ public Builder bootFromStorageId( String storageId ) {
+ this.bootFromStorageId = storageId;
+ return this;
+ }
+
+ public Builder bootFromImageId( String image ) {
+ this.bootFromImageId = image;
+ return this;
+ }
+
+ public Builder lanId( Integer lanId ) {
+ this.lanId = lanId;
+ return this;
+ }
+
+ public Builder availabilityZone( AvailabilityZone zone ) {
+ this.availabilityZone = zone;
+ return this;
+ }
+
+ public Builder osType( OsType osType ) {
+ this.osType = osType;
+ return this;
+ }
+
+ public Builder hasInternetAccess( Boolean hasInternetAccess ) {
+ this.hasInternetAccess = hasInternetAccess;
+ return this;
+ }
+
+ @Override
+ public Builder self() {
+ return this;
+ }
+
+ @Override
+ public CreatePayload build() {
+ return CreatePayload.create( dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
+ availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+ }
+
+ }
+ }
+
+ @AutoValue
+ public abstract static class UpdatePayload implements ServerCommonProperties {
+
+ @Nullable
+ @Override
+ public abstract String name();
+
+ public abstract String id();
+
+ @Nullable
+ public abstract String bootFromStorageId();
+
+ @Nullable
+ public abstract String bootFromImageId();
+
+ @Nullable
+ public abstract AvailabilityZone availabilityZone();
+
+ @Nullable
+ public abstract OsType osType();
+
+ public static UpdatePayload create( String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+ AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
+ Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
+ return new AutoValue_Server_Request_UpdatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+ isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType );
+ }
+
+ public static class Builder extends Server.Builder<Builder, UpdatePayload> {
+
+ private String id;
+ private String bootFromStorageId;
+ private String bootFromImageId;
+ private AvailabilityZone availabilityZone;
+ private OsType osType;
+
+ public Builder id( String id ) {
+ this.id = id;
+ return this;
+ }
+
+ public Builder bootFromStorageId( String storageId ) {
+ this.bootFromStorageId = storageId;
+ return this;
+ }
+
+ public Builder bootFromImageId( String image ) {
+ this.bootFromImageId = image;
+ return this;
+ }
+
+ public Builder availabilityZone( AvailabilityZone zone ) {
+ this.availabilityZone = zone;
+ return this;
+ }
+
+ public Builder osType( OsType osType ) {
+ this.osType = osType;
+ return this;
+ }
+
+ @Override
+ public Builder self() {
+ return this;
+ }
+
+ @Override
+ public UpdatePayload build() {
+ return UpdatePayload.create( id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
+ cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+
+ }
+
+ }
+ }
+
+ }
+
+ private static void validateCores( int cores ) {
+ checkArgument( cores > 0, "Core must be atleast 1." );
+ }
+
+ private static void validateRam( int ram, Boolean isRamHotPlug ) {
+ int minRam = ( isRamHotPlug == null || !isRamHotPlug ) ? 256 : 1024;
+ checkArgument( ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)" );
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
new file mode 100644
index 0000000..7366fb1
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
@@ -0,0 +1,49 @@
+/*
+ * 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.profitbricks.domain.internal;
+
+import org.jclouds.javax.annotation.Nullable;
+
+/**
+ * An interface used as common data type for {@link org.jclouds.profitbricks.domain.Server.Builder}
+ */
+public interface ServerCommonProperties {
+
+ @Nullable
+ Boolean isCpuHotPlug();
+
+ @Nullable
+ Boolean isRamHotPlug();
+
+ @Nullable
+ Boolean isNicHotPlug();
+
+ @Nullable
+ Boolean isNicHotUnPlug();
+
+ @Nullable
+ Boolean isDiscVirtioHotPlug();
+
+ @Nullable
+ Boolean isDiscVirtioHotUnPlug();
+
+ String name();
+
+ int cores();
+
+ int ram(); // in MB
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java
new file mode 100644
index 0000000..95d27c4
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java
@@ -0,0 +1,65 @@
+/*
+ * 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.profitbricks.features;
+
+import java.util.List;
+import javax.inject.Named;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.Fallbacks;
+
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.image.ImageInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.image.ImageListResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface ImageApi {
+
+ /**
+ * @return Outputs a list of all HDD and/or CD-ROM/DVD images existing on or uploaded to the ProfitBricks FTP server.
+ */
+ @POST
+ @Named("image:getall")
+ @Payload("<ws:getAllImages/>")
+ @XMLResponseParser(ImageListResponseHandler.class)
+ @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+ List<Image> getAllImages();
+
+ /**
+ *
+ * @param identifier Image Id
+ * @return Returns information about a HDD or CD-ROM/DVD (ISO) image.
+ */
+ @POST
+ @Named("image:get")
+ @Payload("<ws:getImage><imageId>{id}</imageId></ws:getImage>")
+ @XMLResponseParser(ImageInfoResponseHandler.class)
+ @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+ Image getImage(@PayloadParam("id") String identifier);
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
new file mode 100644
index 0000000..1fa89b3
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
@@ -0,0 +1,164 @@
+/*
+ * 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.profitbricks.features;
+
+import java.util.List;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.server.CreateServerRequestBinder;
+import org.jclouds.profitbricks.binder.server.UpdateServerRequestBinder;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters( { BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class } )
+@Consumes( MediaType.TEXT_XML )
+@Produces( MediaType.TEXT_XML )
+public interface ServerApi {
+
+ /**
+ * @return Returns information about all virtual server, such as configuration, provisioning status, power status, etc.
+ */
+ @POST
+ @Named( "server:getall" )
+ @Payload( "<ws:getAllServers/>" )
+ @XMLResponseParser( ServerListResponseHandler.class )
+ @Fallback( Fallbacks.EmptyListOnNotFoundOr404.class )
+ List<Server> getAllServers();
+
+ /**
+ * @param identifier Identifier of the virtual server
+ * @return Returns information about a virtual server, such as configuration, provisioning status, power status, etc.
+ */
+ @POST
+ @Named( "server:get" )
+ @Payload( "<ws:getServer><serverId>{id}</serverId></ws:getServer>" )
+ @XMLResponseParser( ServerInfoResponseHandler.class )
+ @Fallback( Fallbacks.NullOnNotFoundOr404.class )
+ Server getServer( @PayloadParam( "id" ) String identifier );
+
+ /**
+ * Starts an existing virtual server
+ * <ul>
+ * <li>Server may receive new public IP addresses if necessary </li>
+ * <li>Billing will continue</li>
+ * </ul>
+ *
+ *
+ * @param id Identifier of the target virtual server
+ * @return Identifier of current request
+ */
+ @POST
+ @Named( "server:start" )
+ @Payload( "<ws:startServer><serverId>{id}</serverId></ws:startServer>" )
+ @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+ String startServer( @PayloadParam( "id" ) String id );
+
+ /**
+ *
+ * Stops an existing virtual server forcefully (HARD stop)
+ * <ul>
+ * <li>Server will be forcefully powered off. Any unsaved data may be lost! </li>
+ * <li>Billing for this server will be stopped </li>
+ * <li>When restarting the server a new public IP gets assigned, alternatively, you can reserve IP addresses, see reservation of public
+ * IP blocks</li>
+ * </ul>
+ *
+ * A graceful stop of a server is not possible through the ProfitBricks API. We recommend to access and execute the command on the
+ * virtual server directly. Once the server was shutdown you still can use the "stopServer" method that will stop billing.
+ *
+ * @param id Identifier of the target virtual server
+ * @return Identifier of current request
+ */
+ @POST
+ @Named( "server:stop" )
+ @Payload( "<ws:stopServer><serverId>{id}</serverId></ws:stopServer>" )
+ @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+ String stopServer( @PayloadParam( "id" ) String id );
+
+ /**
+ * Resets an existing virtual server (POWER CYCLE).
+ * <ul>
+ * <li>Server will be forcefully powered off and restarted immediately. Any unsaved data may be lost!</li>
+ * <li> Billing will continue</li>
+ * </ul>
+ * <b>Graceful REBOOT</b>
+ *
+ * A graceful reboot of a server is not possible through the ProfitBricks API. We recommend to access and execute the command on the
+ * virtual server directly.
+ *
+ * @param id Identifier of the target virtual server
+ * @return Identifier of current request
+ */
+ @POST
+ @Named( "server:reset" )
+ @Payload( "<ws:resetServer><serverId>{id}</serverId></ws:resetServer>" )
+ @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+ String resetServer( @PayloadParam( "id" ) String id );
+
+ /**
+ * Creates a Virtual Server within an existing data center. Parameters can be specified to set up a boot device and connect the server to
+ * an existing LAN or the Internet.
+ *
+ * @param payload Payload
+ * @return serverId of the created server
+ */
+ @POST
+ @Named( "server:create" )
+ @MapBinder( CreateServerRequestBinder.class )
+ @XMLResponseParser( ServerIdOnlyResponseHandler.class )
+ String createServer( @PayloadParam( "server" ) Server.Request.CreatePayload payload );
+
+ /**
+ * Updates parameters of an existing virtual server device.
+ *
+ * @param payload Paylaod
+ * @return Identifier of current request
+ */
+ @POST
+ @Named( "server:update" )
+ @MapBinder( UpdateServerRequestBinder.class )
+ @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+ String updateServer( @PayloadParam( "server" ) Server.Request.UpdatePayload payload );
+
+ /**
+ * Deletes an existing Virtual Server.
+ *
+ * @param id Identifier of the target virtual server
+ * @return Identifier of current request
+ */
+ @POST
+ @Named( "server:delete" )
+ @Payload( "<ws:deleteServer><serverId>{id}</serverId></ws:deleteServer>" )
+ @Fallback( Fallbacks.FalseOnNotFoundOr404.class )
+ boolean deleteServer( @PayloadParam( "id" ) String id );
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
index 9e66159..c61f2b5 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
@@ -49,6 +49,14 @@ public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.Handle
return strBuilder.toString().trim();
}
+ protected Float textToFloatValue() {
+ return Float.valueOf(textToStringValue());
+ }
+
+ protected Double textToDoubleValue(){
+ return Double.valueOf( textToStringValue());
+ }
+
protected int textToIntValue() {
return Integer.parseInt(textToStringValue());
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
new file mode 100644
index 0000000..6e6b288
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
@@ -0,0 +1,49 @@
+/*
+ * 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.profitbricks.http.parser;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.xml.sax.SAXException;
+
+public class RequestIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+ private String requestId;
+
+ @Inject
+ RequestIdOnlyResponseHandler( DateCodecFactory dateCodec ) {
+ super( dateCodec );
+ }
+
+ @Override
+ public void endElement( String uri, String localName, String qName ) throws SAXException {
+ setPropertyOnEndTag( qName );
+ clearTextBuffer();
+ }
+
+ @Override
+ protected void setPropertyOnEndTag( String qName ) {
+ if ( "requestId".equals( qName ) )
+ requestId = textToStringValue();
+ }
+
+ @Override
+ public String getResult() {
+ return requestId;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
new file mode 100644
index 0000000..1a6ff94
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
@@ -0,0 +1,76 @@
+/*
+ * 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.profitbricks.http.parser.image;
+
+import javax.inject.Inject;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Image.Type;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseImageResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+ protected Image.Builder builder;
+
+ @Inject
+ BaseImageResponseHandler(DateCodecFactory dateCodecFactory) {
+ super(dateCodecFactory);
+ this.builder = Image.builder();
+ }
+
+ @Override
+ protected void setPropertyOnEndTag(String qName) {
+ if ("imageId".equals(qName))
+ builder.id(textToStringValue());
+ else if ("imageName".equals(qName))
+ builder.name(textToStringValue());
+ else if ("imageSize".equals(qName))
+ builder.size(textToFloatValue());
+ else if ("imageType".equals(qName))
+ builder.type(Type.fromValue(textToStringValue()));
+ else if ("location".equals(qName))
+ builder.location(Location.fromId(textToStringValue()));
+ else if ("osType".equals(qName))
+ builder.osType(OsType.fromValue(textToStringValue()));
+ else if ("public".equals(qName))
+ builder.isPublic(textToBooleanValue());
+ else if ("writeable".equals(qName))
+ builder.isWriteable(textToBooleanValue());
+ else if ("bootable".equals(qName))
+ builder.isBootable(textToBooleanValue());
+ else if ("cpuHotPlug".equals(qName))
+ builder.isCpuHotPlug(textToBooleanValue());
+ else if ("cpuHotUnPlug".equals(qName))
+ builder.isCpuHotUnPlug(textToBooleanValue());
+ else if ("ramHotPlug".equals(qName))
+ builder.isRamHotPlug(textToBooleanValue());
+ else if ("ramHotUnPlug".equals(qName))
+ builder.isRamHotUnPlug(textToBooleanValue());
+ else if ("nicHotPlug".equals(qName))
+ builder.isNicHotPlug(textToBooleanValue());
+ else if ("nicHotUnPlug".equals(qName))
+ builder.isNicHotUnPlug(textToBooleanValue());
+ else if ("discVirtioHotPlug".equals(qName))
+ builder.isDiscVirtioHotPlug(textToBooleanValue());
+ else if ("discVirtioHotUnPlug".equals(qName))
+ builder.isDiscVirtioHotUnPlug(textToBooleanValue());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
new file mode 100644
index 0000000..0736acb
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
@@ -0,0 +1,48 @@
+/*
+ * 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.profitbricks.http.parser.image;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Image;
+import org.xml.sax.SAXException;
+
+public class ImageInfoResponseHandler extends BaseImageResponseHandler<Image> {
+
+ private boolean done = false;
+
+ @Inject
+ ImageInfoResponseHandler(DateCodecFactory dateCodecFactory) {
+ super(dateCodecFactory);
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ if (done)
+ return;
+ setPropertyOnEndTag(qName);
+ if ("return".equals(qName))
+ done = true;
+ clearTextBuffer();
+ }
+
+ @Override
+ public Image getResult() {
+ return builder.build();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
new file mode 100644
index 0000000..8fc8091
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * 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.profitbricks.http.parser.image;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Image;
+import org.xml.sax.SAXException;
+
+public class ImageListResponseHandler extends BaseImageResponseHandler<List<Image>> {
+
+ private final List<Image> images;
+
+ @Inject
+ ImageListResponseHandler(DateCodecFactory dateCodecFactory) {
+ super(dateCodecFactory);
+ this.images = Lists.newArrayList();
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ setPropertyOnEndTag(qName);
+ if ("return".equals(qName)) {
+ images.add(builder.build());
+ builder = Image.builder();
+ }
+ clearTextBuffer();
+ }
+
+ @Override
+ public List<Image> getResult() {
+ return images;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
new file mode 100644
index 0000000..e594ce4
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -0,0 +1,75 @@
+/*
+ * 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.profitbricks.http.parser.server;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+ protected Server.DescribingBuilder builder;
+
+ @Inject
+ BaseServerResponseHandler( DateCodecFactory dateCodec ) {
+ super( dateCodec );
+ this.builder = Server.builder();
+ }
+
+ @Override
+ protected void setPropertyOnEndTag( String qName ) {
+ if ( "serverId".equals( qName ) )
+ builder.id( textToStringValue() );
+ else if ( "serverName".equals( qName ) )
+ builder.name( textToStringValue() );
+ else if ( "cores".equals( qName ) )
+ builder.cores( textToIntValue() );
+ else if ( "ram".equals( qName ) )
+ builder.ram( textToIntValue() );
+ else if ( "provisioningState".equals( qName ) )
+ builder.state( ProvisioningState.fromValue( textToStringValue() ) );
+ else if ( "virtualMachineState".equals( qName ) )
+ builder.status( Server.Status.fromValue( textToStringValue() ) );
+ else if ( "osType".equals( qName ) )
+ builder.osType( OsType.fromValue( textToStringValue() ) );
+ else if ( "availabilityZone".equals( qName ) )
+ builder.availabilityZone( AvailabilityZone.fromValue( textToStringValue() ) );
+ else if ( "creationTime".equals( qName ) )
+ builder.creationTime( textToIso8601Date() );
+ else if ( "lastModificationTime".equals( qName ) )
+ builder.lastModificationTime( textToIso8601Date() );
+ else if ( "internetAccess".equals( qName ) )
+ builder.hasInternetAccess( textToBooleanValue() );
+ else if ( "cpuHotPlug".equals( qName ) )
+ builder.isCpuHotPlug( textToBooleanValue() );
+ else if ( "ramHotPlug".equals( qName ) )
+ builder.isRamHotPlug( textToBooleanValue() );
+ else if ( "nicHotPlug".equals( qName ) )
+ builder.isNicHotPlug( textToBooleanValue() );
+ else if ( "nicHotUnPlug".equals( qName ) )
+ builder.isNicHotUnPlug( textToBooleanValue() );
+ else if ( "discVirtioHotPlug".equals( qName ) )
+ builder.isDiscVirtioHotPlug( textToBooleanValue() );
+ else if ( "discVirtioHotUnPlug".equals( qName ) )
+ builder.isDiscVirtioHotUnPlug( textToBooleanValue() );
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
new file mode 100644
index 0000000..ed88018
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
@@ -0,0 +1,55 @@
+/*
+ * 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.profitbricks.http.parser.server;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * Handler for parsing SOAP response where <i>serverId</i> is the only <i>usable</i> value.
+ *
+ * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion
+ */
+public class ServerIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+ private String serverId;
+
+ @Inject
+ ServerIdOnlyResponseHandler( DateCodecFactory dateCodec ) {
+ super( dateCodec );
+ }
+
+ @Override
+ public void endElement( String uri, String localName, String qName ) throws SAXException {
+ setPropertyOnEndTag( qName );
+ clearTextBuffer();
+ }
+
+ @Override
+ protected void setPropertyOnEndTag( String qName ) {
+ if ( "serverId".equals( qName ) )
+ serverId = textToStringValue();
+ }
+
+ @Override
+ public String getResult() {
+ return serverId;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
new file mode 100644
index 0000000..dfac4ff
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
@@ -0,0 +1,48 @@
+/*
+ * 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.profitbricks.http.parser.server;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Server;
+import org.xml.sax.SAXException;
+
+public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server> {
+
+ private boolean done = false;
+
+ @Inject
+ ServerInfoResponseHandler( DateCodecFactory dateCodec ) {
+ super( dateCodec );
+ }
+
+ @Override
+ public void endElement( String uri, String localName, String qName ) throws SAXException {
+ if ( done )
+ return;
+ setPropertyOnEndTag( qName );
+ if ( "return".equals( qName ) )
+ done = true;
+ clearTextBuffer();
+ }
+
+ @Override
+ public Server getResult() {
+ return builder.build();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
new file mode 100644
index 0000000..f50027c
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * 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.profitbricks.http.parser.server;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Server;
+import org.xml.sax.SAXException;
+
+public class ServerListResponseHandler extends BaseServerResponseHandler<List<Server>> {
+
+ private final List<Server> servers;
+
+ @Inject
+ ServerListResponseHandler( DateCodecFactory dateCodec ) {
+ super( dateCodec );
+ this.servers = Lists.newArrayList();
+ }
+
+ @Override
+ public void endElement( String uri, String localName, String qName ) throws SAXException {
+ setPropertyOnEndTag( qName );
+ if ( "return".equals( qName ) ) {
+ servers.add( builder.build() );
+ builder = Server.builder();
+ }
+ clearTextBuffer();
+ }
+
+ @Override
+ public List<Server> getResult() {
+ return servers;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
new file mode 100644
index 0000000..bf18841
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.profitbricks.binder.server;
+
+import org.jclouds.profitbricks.domain.Server;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "CreateServerRequestBinderTest" )
+public class CreateServerRequestBinderTest {
+
+ @Test
+ public void testCreatePayload() {
+ CreateServerRequestBinder binder = new CreateServerRequestBinder();
+
+ Server.Request.CreatePayload payload = Server.Request.creatingBuilder()
+ .name( "jclouds-node" )
+ .cores( 4 )
+ .ram( 4 * 1024 )
+ .dataCenterId( "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" )
+ .build();
+
+ String actual = binder.createPayload( payload );
+ assertNotNull( actual, "Binder returned null payload" );
+ assertEquals( actual, expectedPayload );
+ }
+
+ private final String expectedPayload
+ = ( " <ws:createServer>\n"
+ + " <request>\n"
+ + " <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
+ + " <cores>4</cores>\n"
+ + " <ram>4096</ram>\n"
+ + " <serverName>jclouds-node</serverName>\n"
+// + " <bootFromStorageId>?</bootFromStorageId>\n"
+// + " <bootFromImageId>?</bootFromImageId>\n"
+// + " <internetAccess>false</internetAccess>\n"
+// + " <lanId>?</lanId>\n"
+// + " <osType>?</osType>\n"
+// + " <availabilityZone>AUTO</availabilityZone>\n"
+// + " <cpuHotPlug>false</cpuHotPlug>\n"
+// + " <ramHotPlug>false</ramHotPlug>\n"
+// + " <nicHotPlug>false</nicHotPlug>\n"
+// + " <nicHotUnPlug>false</nicHotUnPlug>\n"
+// + " <discVirtioHotPlug>false</discVirtioHotPlug>\n"
+// + " <discVirtioHotUnPlug>false</discVirtioHotUnPlug>\n"
+ + " </request>\n"
+ + " </ws:createServer>" )
+ .replaceAll( "\\s+", "" );
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
new file mode 100644
index 0000000..cba666b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.profitbricks.binder.server;
+
+import org.jclouds.profitbricks.domain.Server;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "UpdateServerRequestBinderTest" )
+public class UpdateServerRequestBinderTest {
+
+ @Test
+ public void testCreatePayload() {
+ UpdateServerRequestBinder binder = new UpdateServerRequestBinder();
+
+ Server.Request.UpdatePayload payload = Server.Request.updatingBuilder()
+ .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
+ .cores( 8 )
+ .ram( 8 * 1024 )
+ .name( "apache-node")
+ .build();
+
+ String actual = binder.createPayload( payload );
+ assertNotNull(actual, "Binder returned null payload");
+ assertEquals(actual, expectedPayload);
+ }
+
+ private final String expectedPayload
+ = ( " <ws:updateServer>\n"
+ + " <request>\n"
+ + " <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>\n"
+ + " <cores>8</cores>\n"
+ + " <ram>8192</ram>\n"
+ + " <serverName>apache-node</serverName>\n"
+// + " <bootFromStorageId>?</bootFromStorageId>\n"
+// + " <bootFromImageId>?</bootFromImageId>\n"
+// + " <osType>?</osType>\n"
+// + " <availabilityZone>?</availabilityZone>\n"
+// + " <cpuHotPlug>?</cpuHotPlug>\n"
+// + " <ramHotPlug>?</ramHotPlug>\n"
+// + " <nicHotPlug>?</nicHotPlug>\n"
+// + " <nicHotUnPlug>?</nicHotUnPlug>\n"
+// + " <discVirtioHotPlug>?</discVirtioHotPlug>\n"
+// + " <discVirtioHotUnPlug>?</discVirtioHotUnPlug>\n"
+ + " </request>\n"
+ + " </ws:updateServer>" )
+ .replaceAll( "\\s+", "" );
+
+}