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/22 13:20:23 UTC

[10/11] jclouds-labs git commit: Remove ProfitBricks

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java b/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
deleted file mode 100644
index 1414c69..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
+++ /dev/null
@@ -1,53 +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.profitbricks.binder.snapshot;
-
-import static java.lang.String.format;
-import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
-import org.jclouds.profitbricks.domain.Snapshot;
-
-public class UpdateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<Snapshot.Request.UpdatePayload> {
-
-   protected final StringBuilder requestBuilder;
-
-   protected UpdateSnapshotRequestBinder() {
-      super("snapshot");
-      this.requestBuilder = new StringBuilder(128);
-   }
-
-   @Override
-   protected String createPayload(Snapshot.Request.UpdatePayload payload) {
-      requestBuilder.append("<ws:updateSnapshot>")
-              .append("<request>")
-              .append(format("<snapshotId>%s</snapshotId>", payload.id()))
-              .append(format("<description>%s</description>", payload.description()))
-              .append(format("<snapshotName>%s</snapshotName>", payload.name()))
-              .append(formatIfNotEmpty("<bootable>%s</bootable>", payload.bootable()))
-              .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
-              .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug()))
-              .append(formatIfNotEmpty("<cpuHotUnPlug>%s</cpuHotUnPlug>", payload.isCpuHotUnPlug()))
-              .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug()))
-              .append(formatIfNotEmpty("<ramHotUnPlug>%s</ramHotUnPlug>", payload.isRamHotUnPlug()))
-              .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:updateSnapshot>");
-      return requestBuilder.toString();
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java b/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
deleted file mode 100644
index 2c2e08d..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
+++ /dev/null
@@ -1,45 +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.profitbricks.binder.storage;
-
-import static java.lang.String.format;
-
-import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
-import org.jclouds.profitbricks.domain.Storage;
-
-public class ConnectStorageToServerRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.ConnectPayload> {
-
-   protected final StringBuilder requestBuilder;
-
-   ConnectStorageToServerRequestBinder() {
-      super("storage");
-      this.requestBuilder = new StringBuilder(128 * 2);
-   }
-
-   @Override
-   protected String createPayload(Storage.Request.ConnectPayload payload) {
-      requestBuilder.append("<ws:connectStorageToServer>")
-              .append("<request>")
-              .append(format("<storageId>%s</storageId>", payload.storageId()))
-              .append(format("<serverId>%s</serverId>", payload.serverId()))
-              .append(formatIfNotEmpty("<busType>%s</busType>", payload.busType()))
-              .append(formatIfNotEmpty("<deviceNumber>%s</deviceNumber>", payload.deviceNumber()))
-              .append("</request>")
-              .append("</ws:connectStorageToServer>");
-      return requestBuilder.toString();
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java b/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
deleted file mode 100644
index 9681b64..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.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.profitbricks.binder.storage;
-
-import static java.lang.String.format;
-import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
-import org.jclouds.profitbricks.domain.Storage;
-
-public class CreateStorageRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.CreatePayload> {
-
-   protected final StringBuilder requestBuilder;
-
-   CreateStorageRequestBinder() {
-      super("storage");
-      this.requestBuilder = new StringBuilder(128 * 2);
-   }
-
-   @Override
-   protected String createPayload(Storage.Request.CreatePayload payload) {
-      requestBuilder.append("<ws:createStorage>")
-              .append("<request>")
-              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
-              .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
-              .append(format("<size>%.0f</size>", payload.size()))
-              .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
-              .append(formatIfNotEmpty("<profitBricksImagePassword>%s</profitBricksImagePassword>", payload.imagePassword()))
-              .append("</request>")
-              .append("</ws:createStorage>");
-      return requestBuilder.toString();
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java b/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
deleted file mode 100644
index 9a80b83..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
+++ /dev/null
@@ -1,47 +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.profitbricks.binder.storage;
-
-import static java.lang.String.format;
-import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
-import org.jclouds.profitbricks.domain.Storage;
-
-public class UpdateStorageRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.UpdatePayload> {
-
-   protected final StringBuilder requestBuilder;
-
-   UpdateStorageRequestBinder() {
-      super("storage");
-      this.requestBuilder = new StringBuilder(128 * 2);
-   }
-
-   @Override
-   protected String createPayload(Storage.Request.UpdatePayload payload) {
-      requestBuilder
-              .append("<ws:updateStorage>")
-              .append("<request>")
-              .append(format("<storageId>%s</storageId>", payload.id()))
-              .append(formatIfNotEmpty("<size>%.0f</size>", payload.size()))
-              .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
-              .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
-              .append("</request>")
-              .append("</ws:updateStorage>");
-
-      return requestBuilder.toString();
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
deleted file mode 100644
index fe02c41..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
+++ /dev/null
@@ -1,483 +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.profitbricks.compute;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static com.google.common.collect.Iterables.transform;
-import static com.google.common.util.concurrent.Futures.allAsList;
-import static com.google.common.util.concurrent.Futures.getUnchecked;
-import static java.lang.String.format;
-import static org.jclouds.Constants.PROPERTY_USER_THREADS;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
-
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.compute.ComputeServiceAdapter;
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.HardwareBuilder;
-import org.jclouds.compute.domain.Processor;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.compute.domain.Volume;
-import org.jclouds.compute.domain.internal.VolumeImpl;
-import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.compute.util.ComputeServiceUtils;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.domain.LoginCredentials;
-import org.jclouds.logging.Logger;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
-import org.jclouds.profitbricks.compute.concurrent.ProvisioningManager;
-import org.jclouds.profitbricks.compute.function.ProvisionableToImage;
-import org.jclouds.profitbricks.compute.strategy.TemplateWithDataCenter;
-import org.jclouds.profitbricks.domain.AvailabilityZone;
-import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.domain.Image;
-import org.jclouds.profitbricks.domain.Provisionable;
-import org.jclouds.profitbricks.domain.Server;
-import org.jclouds.profitbricks.domain.Snapshot;
-import org.jclouds.profitbricks.domain.Storage;
-import org.jclouds.profitbricks.features.ServerApi;
-import org.jclouds.profitbricks.util.Passwords;
-import org.jclouds.rest.ResourceNotFoundException;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.inject.Inject;
-
-@Singleton
-public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<Server, Hardware, Provisionable, Location> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final ProfitBricksApi api;
-   private final Predicate<String> waitDcUntilAvailable;
-   private final ListeningExecutorService executorService;
-   private final ProvisioningJob.Factory jobFactory;
-   private final ProvisioningManager provisioningManager;
-
-   private static final Integer DEFAULT_LAN_ID = 1;
-
-   @Inject
-   ProfitBricksComputeServiceAdapter(ProfitBricksApi api,
-           @Named(POLL_PREDICATE_DATACENTER) Predicate<String> waitDcUntilAvailable,
-           @Named(PROPERTY_USER_THREADS) ListeningExecutorService executorService,
-           ProvisioningJob.Factory jobFactory,
-           ProvisioningManager provisioningManager) {
-      this.api = api;
-      this.waitDcUntilAvailable = waitDcUntilAvailable;
-      this.executorService = executorService;
-      this.jobFactory = jobFactory;
-      this.provisioningManager = provisioningManager;
-   }
-   
-   @Override
-   public NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
-      checkArgument(template instanceof TemplateWithDataCenter, "This implementation requires a TemplateWithDataCenter");
-      return createNodeWithGroupEncodedIntoName(group, name, TemplateWithDataCenter.class.cast(template));
-   }
-
-   protected NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, TemplateWithDataCenter template) {
-      checkArgument(template.getLocation().getScope() == LocationScope.ZONE, "Template must use a ZONE-scoped location");
-      final String dataCenterId = template.getDataCenter().id();
-
-      Hardware hardware = template.getHardware();
-
-      TemplateOptions options = template.getOptions();
-      final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser();
-      final String password = options.hasLoginPassword() ? options.getLoginPassword() : Passwords.generate();
-
-      final org.jclouds.compute.domain.Image image = template.getImage();
-
-      // provision all storages based on hardware
-      List<? extends Volume> volumes = hardware.getVolumes();
-      List<String> storageIds = Lists.newArrayListWithExpectedSize(volumes.size());
-
-      int i = 1;
-      for (final Volume volume : volumes)
-         try {
-            logger.trace("<< provisioning storage '%s'", volume);
-            final Storage.Request.CreatePayload.Builder storageBuilder = Storage.Request.creatingBuilder();
-            if (i == 1) {
-               storageBuilder.mountImageId(image.getId());
-               // we don't need to pass password to the API if we're using a snapshot
-               Provisionable.Type provisionableType = Provisionable.Type.fromValue(
-                       image.getUserMetadata().get(ProvisionableToImage.KEY_PROVISIONABLE_TYPE));
-               if (provisionableType == Provisionable.Type.IMAGE)
-                  storageBuilder.imagePassword(password);
-            }
-            storageBuilder.dataCenterId(dataCenterId)
-                    .name(format("%s-disk-%d", name, i++))
-                    .size(volume.getSize());
-
-            String storageId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
-
-               @Override
-               public Object get() {
-                  return api.storageApi().createStorage(storageBuilder.build());
-               }
-            }));
-
-            storageIds.add(storageId);
-            logger.trace(">> provisioning complete for storage. returned id='%s'", storageId);
-         } catch (Exception ex) {
-            if (i - 1 == 1) // if first storage (one with image) provisioning fails; stop method
-               throw Throwables.propagate(ex);
-            logger.warn(ex, ">> failed to provision storage. skipping..");
-         }
-
-      int lanId = DEFAULT_LAN_ID;
-      if (options.getNetworks() != null)
-         try {
-            String networkId = Iterables.get(options.getNetworks(), 0);
-            lanId = Integer.valueOf(networkId);
-         } catch (Exception ex) {
-            logger.warn("no valid network id found from options. using default id='%d'", DEFAULT_LAN_ID);
-         }
-
-      Double cores = ComputeServiceUtils.getCores(hardware);
-
-      // provision server and connect boot storage (first provisioned)
-      String serverId = null;
-      try {
-         String storageBootDeviceId = Iterables.get(storageIds, 0); // must have atleast 1
-         final Server.Request.CreatePayload serverRequest = Server.Request.creatingBuilder()
-                 .dataCenterId(dataCenterId)
-                 .name(name)
-                 .bootFromStorageId(storageBootDeviceId)
-                 .cores(cores.intValue())
-                 .ram(hardware.getRam())
-                 .availabilityZone(AvailabilityZone.AUTO)
-                 .hasInternetAccess(true)
-                 .lanId(lanId)
-                 .build();
-         logger.trace("<< provisioning server '%s'", serverRequest);
-
-         serverId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
-
-            @Override
-            public Object get() {
-               return api.serverApi().createServer(serverRequest);
-            }
-         }));
-         logger.trace(">> provisioning complete for server. returned id='%s'", serverId);
-
-      } catch (Exception ex) {
-         logger.error(ex, ">> failed to provision server. rollbacking..");
-         destroyStorages(storageIds, dataCenterId);
-         throw Throwables.propagate(ex);
-      }
-
-      // connect the rest of storages to server; delete if fails
-      final int storageCount = storageIds.size();
-      for (int j = 1; j < storageCount; j++) { // skip first; already connected
-         String storageId = storageIds.get(j);
-         try {
-            logger.trace("<< connecting storage '%s' to server '%s'", storageId, serverId);
-            final Storage.Request.ConnectPayload request = Storage.Request.connectingBuilder()
-                    .storageId(storageId)
-                    .serverId(serverId)
-                    .build();
-
-            provisioningManager.provision(jobFactory.create(group, new Supplier<Object>() {
-
-               @Override
-               public Object get() {
-                  return api.storageApi().connectStorageToServer(request);
-               }
-            }));
-
-            logger.trace(">> storage connected.");
-         } catch (Exception ex) {
-            // delete unconnected storage
-            logger.warn(ex, ">> failed to connect storage '%s'. deleting..", storageId);
-            destroyStorage(storageId, dataCenterId);
-         }
-      }
-
-      // Last paranoid check
-      waitDcUntilAvailable.apply(dataCenterId);
-
-      LoginCredentials serverCredentials = LoginCredentials.builder()
-              .user(loginUser)
-              .password(password)
-              .build();
-
-      Server server = getNode(serverId);
-
-      return new NodeAndInitialCredentials<Server>(server, serverId, serverCredentials);
-   }
-
-   @Override
-   public Iterable<Hardware> listHardwareProfiles() {
-      // Max [cores=48] [disk size per storage=2048GB] [ram=200704 MB]
-      List<Hardware> hardwares = Lists.newArrayList();
-      for (int core = 1; core <= 48; core++)
-         for (int ram : new int[]{1024, 2 * 1024, 4 * 1024, 8 * 1024,
-            10 * 1024, 16 * 1024, 24 * 1024, 28 * 1024, 32 * 1024})
-            for (float size : new float[]{10, 20, 30, 50, 80, 100, 150, 200, 250, 500}) {
-               String id = String.format("cpu=%d,ram=%s,disk=%f", core, ram, size);
-               hardwares.add(new HardwareBuilder()
-                       .ids(id)
-                       .ram(ram)
-                       .hypervisor("kvm")
-                       .name(id)
-                       .processor(new Processor(core, 1d))
-                       .volume(new VolumeImpl(size, true, true))
-                       .build());
-            }
-      return hardwares;
-   }
-
-   @Override
-   public Iterable<Provisionable> listImages() {
-      // fetch images..
-      ListenableFuture<List<Image>> images = executorService.submit(new Callable<List<Image>>() {
-
-         @Override
-         public List<Image> call() throws Exception {
-            logger.trace("<< fetching images..");
-            // Filter HDD types only, since JClouds doesn't have a concept of "CD-ROM" anyway
-            Iterable<Image> filteredImages = Iterables.filter(api.imageApi().getAllImages(), new Predicate<Image>() {
-
-               @Override
-               public boolean apply(Image image) {
-                  return image.type() == Image.Type.HDD;
-               }
-            });
-            logger.trace(">> images fetched.");
-
-            return ImmutableList.copyOf(filteredImages);
-         }
-
-      });
-      // and snapshots at the same time
-      ListenableFuture<List<Snapshot>> snapshots = executorService.submit(new Callable<List<Snapshot>>() {
-
-         @Override
-         public List<Snapshot> call() throws Exception {
-            logger.trace("<< fetching snapshots");
-            List<Snapshot> remoteSnapshots = api.snapshotApi().getAllSnapshots();
-            logger.trace(">> snapshots feched.");
-
-            return remoteSnapshots;
-         }
-
-      });
-
-      return Iterables.concat(getUnchecked(images), getUnchecked(snapshots));
-   }
-
-   @Override
-   public Provisionable getImage(String id) {
-      // try search images
-      logger.trace("<< searching for image with id=%s", id);
-      Image image = api.imageApi().getImage(id);
-      if (image != null) {
-         logger.trace(">> found image [%s].", image.name());
-         return image;
-      }
-      // try search snapshots
-      logger.trace("<< not found from images. searching for snapshot with id=%s", id);
-      Snapshot snapshot = api.snapshotApi().getSnapshot(id);
-      if (snapshot != null) {
-         logger.trace(">> found snapshot [%s]", snapshot.name());
-         return snapshot;
-      }
-      throw new ResourceNotFoundException("No image/snapshot with id '" + id + "' was found");
-   }
-
-   @Override
-   public Iterable<Location> listLocations() {
-      // Will never be called
-      throw new UnsupportedOperationException("Locations are configured in jclouds properties");
-   }
-
-   @Override
-   public Server getNode(String id) {
-      logger.trace("<< searching for server with id=%s", id);
-
-      Server server = api.serverApi().getServer(id);
-      if (server != null)
-         logger.trace(">> found server [%s]", server.name());
-      return server;
-   }
-
-   @Override
-   public void destroyNode(String nodeId) {
-      ServerApi serverApi = api.serverApi();
-      Server server = serverApi.getServer(nodeId);
-      if (server != null) {
-         String dataCenterId = server.dataCenter().id();
-         for (Storage storage : server.storages())
-            destroyStorage(storage.id(), dataCenterId);
-
-         try {
-            destroyServer(nodeId, dataCenterId);
-         } catch (Exception ex) {
-            logger.warn(ex, ">> failed to delete server with id=%s", nodeId);
-         }
-      }
-   }
-
-   @Override
-   public void rebootNode(final String id) {
-      // Fail pre-emptively if not found
-      final Server node = getRequiredNode(id);
-      final DataCenter dataCenter = node.dataCenter();
-      provisioningManager.provision(jobFactory.create(dataCenter.id(), new Supplier<Object>() {
-
-         @Override
-         public Object get() {
-            api.serverApi().resetServer(id);
-
-            return node;
-         }
-      }));
-   }
-
-   @Override
-   public void resumeNode(final String id) {
-      final Server node = getRequiredNode(id);
-      if (node.status() == Server.Status.RUNNING)
-         return;
-
-      final DataCenter dataCenter = node.dataCenter();
-      provisioningManager.provision(jobFactory.create(dataCenter.id(), new Supplier<Object>() {
-
-         @Override
-         public Object get() {
-            api.serverApi().startServer(id);
-
-            return node;
-         }
-      }));
-   }
-
-   @Override
-   public void suspendNode(final String id) {
-      final Server node = getRequiredNode(id);
-      // Intentionally didn't include SHUTDOWN (only achieved via UI; soft-shutdown). 
-      // A SHUTOFF server is no longer billed, so we execute method for all other status
-      if (node.status() == Server.Status.SHUTOFF)
-         return;
-
-      final DataCenter dataCenter = node.dataCenter();
-      provisioningManager.provision(jobFactory.create(dataCenter.id(), new Supplier<Object>() {
-
-         @Override
-         public Object get() {
-            api.serverApi().stopServer(id);
-
-            return node;
-         }
-      }));
-   }
-
-   @Override
-   public Iterable<Server> listNodes() {
-      logger.trace(">> fetching all servers..");
-      List<Server> servers = api.serverApi().getAllServers();
-      logger.trace(">> servers fetched.");
-      return servers;
-   }
-
-   @Override
-   public Iterable<Server> listNodesByIds(final Iterable<String> ids) {
-      // Only fetch the requested nodes. Do it in parallel.
-      ListenableFuture<List<Server>> futures = allAsList(transform(ids,
-              new Function<String, ListenableFuture<Server>>() {
-
-                 @Override
-                 public ListenableFuture<Server> apply(final String input) {
-                    return executorService.submit(new Callable<Server>() {
-
-                       @Override
-                       public Server call() throws Exception {
-                          return getNode(input);
-                       }
-                    });
-                 }
-              }));
-
-      return getUnchecked(futures);
-   }
-
-   private void destroyServer(final String serverId, final String dataCenterId) {
-      try {
-         logger.trace("<< deleting server with id=%s", serverId);
-         provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
-
-            @Override
-            public Object get() {
-               api.serverApi().deleteServer(serverId);
-
-               return serverId;
-            }
-         }));
-         logger.trace(">> server '%s' deleted.", serverId);
-      } catch (Exception ex) {
-         logger.warn(ex, ">> failed to delete server with id=%s", serverId);
-      }
-   }
-
-   private void destroyStorages(List<String> storageIds, String dataCenterId) {
-      for (String storageId : storageIds)
-         destroyStorage(storageId, dataCenterId);
-   }
-
-   private void destroyStorage(final String storageId, final String dataCenterId) {
-      try {
-         logger.trace("<< deleting storage with id=%s", storageId);
-         provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
-
-            @Override
-            public Object get() {
-               api.storageApi().deleteStorage(storageId);
-
-               return storageId;
-            }
-         }));
-         logger.trace(">> storage '%s' deleted.", storageId);
-      } catch (Exception ex) {
-         logger.warn(ex, ">> failed to delete storage with id=%s", storageId);
-      }
-   }
-
-   private Server getRequiredNode(String nodeId) {
-      Server node = getNode(nodeId);
-      if (node == null)
-         throw new ResourceNotFoundException("Node with id'" + nodeId + "' was not found.");
-      return node;
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java
deleted file mode 100644
index 7da7d3c..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java
+++ /dev/null
@@ -1,62 +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.profitbricks.compute.concurrent;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
-
-import java.util.concurrent.Callable;
-
-import javax.inject.Named;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class ProvisioningJob implements Callable {
-
-   public interface Factory {
-
-      ProvisioningJob create(String group, Supplier<Object> operation);
-   }
-
-   private final Predicate<String> waitDataCenterUntilReady;
-   private final String group;
-   private final Supplier<Object> operation;
-
-   @Inject
-   ProvisioningJob(@Named(POLL_PREDICATE_DATACENTER) Predicate<String> waitDataCenterUntilReady,
-           @Assisted String group, @Assisted Supplier<Object> operation) {
-      this.waitDataCenterUntilReady = waitDataCenterUntilReady;
-      this.group = checkNotNull(group, "group cannot be null");
-      this.operation = checkNotNull(operation, "operation cannot be null");
-   }
-
-   @Override
-   public Object call() throws Exception {
-      waitDataCenterUntilReady.apply(group);
-      Object obj = operation.get();
-      waitDataCenterUntilReady.apply(group);
-
-      return obj;
-   }
-
-   public String getGroup() {
-      return group;
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java
deleted file mode 100644
index 820cafe..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java
+++ /dev/null
@@ -1,88 +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.profitbricks.compute.concurrent;
-
-import static com.google.common.util.concurrent.Futures.getUnchecked;
-import static com.google.common.util.concurrent.MoreExecutors.listeningDecorator;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.annotation.Resource;
-
-import org.jclouds.concurrent.config.WithSubmissionTrace;
-import org.jclouds.logging.Logger;
-
-import com.google.common.util.concurrent.ListeningExecutorService;
-
-/**
- * Delegates {@link Job} to single-threaded executor services based on it's group.
- *
- */
-public final class ProvisioningManager implements Closeable {
-
-   @Resource
-   private Logger logger = Logger.NULL;
-
-   private final Map<String, ListeningExecutorService> workers
-           = new ConcurrentHashMap<String, ListeningExecutorService>(1);
-
-   private final AtomicBoolean terminated = new AtomicBoolean(false);
-
-   public Object provision(ProvisioningJob job) {
-      if (terminated.get()) {
-         logger.warn("Job(%s) submitted but the provisioning manager is already closed", job);
-         return null;
-      }
-
-      logger.debug("Job(%s) submitted to group '%s'", job, job.getGroup());
-      ListeningExecutorService workerGroup = getWorkerGroup(job.getGroup());
-      return getUnchecked(workerGroup.submit(job));
-   }
-
-   protected ListeningExecutorService newExecutorService() {
-      return WithSubmissionTrace.wrap(listeningDecorator(Executors.newSingleThreadExecutor()));
-   }
-
-   private void newWorkerGroupIfAbsent(String name) {
-      if (!workers.containsKey(name))
-         workers.put(name, newExecutorService());
-   }
-
-   private ListeningExecutorService getWorkerGroup(String name) {
-      newWorkerGroupIfAbsent(name);
-      return workers.get(name);
-   }
-
-   @Override
-   public void close() throws IOException {
-      terminated.set(true); // Do not allow to enqueue more jobs
-      Collection<ListeningExecutorService> executors = workers.values();
-      for (ListeningExecutorService executor : executors) {
-         List<Runnable> runnables = executor.shutdownNow();
-         if (!runnables.isEmpty())
-            logger.warn("when shutting down executor %s, runnables outstanding: %s", executor, runnables);
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
deleted file mode 100644
index abc732d..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
+++ /dev/null
@@ -1,223 +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.profitbricks.compute.config;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_INITIAL_PERIOD;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_MAX_PERIOD;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_SNAPSHOT;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.TIMEOUT_DATACENTER_AVAILABLE;
-import static org.jclouds.util.Predicates2.retry;
-
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Named;
-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.Volume;
-import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
-import org.jclouds.domain.Location;
-import org.jclouds.functions.IdentityFunction;
-import org.jclouds.lifecycle.Closer;
-import org.jclouds.location.suppliers.ImplicitLocationSupplier;
-import org.jclouds.location.suppliers.implicit.OnlyLocationOrFirstZone;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.compute.ProfitBricksComputeServiceAdapter;
-import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
-import org.jclouds.profitbricks.compute.concurrent.ProvisioningManager;
-import org.jclouds.profitbricks.compute.function.ProvisionableToImage;
-import org.jclouds.profitbricks.compute.function.ServerToNodeMetadata;
-import org.jclouds.profitbricks.compute.function.StorageToVolume;
-import org.jclouds.profitbricks.compute.strategy.AssignDataCenterToTemplate;
-import org.jclouds.profitbricks.domain.Provisionable;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.domain.Server;
-import org.jclouds.profitbricks.domain.Storage;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.inject.Inject;
-import com.google.inject.Provides;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import com.google.inject.assistedinject.FactoryModuleBuilder;
-
-
-public class ProfitBricksComputeServiceContextModule extends
-        ComputeServiceAdapterContextModule<Server, Hardware, Provisionable, Location> {
-
-   @SuppressWarnings("unchecked")
-   @Override
-   protected void configure() {
-      super.configure();
-
-      install(new FactoryModuleBuilder().build(ProvisioningJob.Factory.class));
-
-      bind(ImplicitLocationSupplier.class).to(OnlyLocationOrFirstZone.class).in(Scopes.SINGLETON);
-
-      bind(CreateNodesInGroupThenAddToSet.class).to(AssignDataCenterToTemplate.class).in(Scopes.SINGLETON);
-
-      bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Provisionable, Location>>() {
-      }).to(ProfitBricksComputeServiceAdapter.class);
-
-      bind(new TypeLiteral<Function<Server, NodeMetadata>>() {
-      }).to(ServerToNodeMetadata.class);
-
-      bind(new TypeLiteral<Function<Provisionable, Image>>() {
-      }).to(ProvisionableToImage.class);
-
-      bind(new TypeLiteral<Function<Storage, Volume>>() {
-      }).to(StorageToVolume.class);
-
-      bind(new TypeLiteral<Function<Hardware, Hardware>>() {
-      }).to(Class.class.cast(IdentityFunction.class));
-   }
-
-   @Provides
-   @Singleton
-   @Named(POLL_PREDICATE_DATACENTER)
-   Predicate<String> provideDataCenterAvailablePredicate(
-           final ProfitBricksApi api, ComputeConstants constants) {
-      return retry(new DataCenterProvisioningStatePredicate(
-              api, ProvisioningState.AVAILABLE),
-              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
-   }
-
-   @Provides
-   @Named(TIMEOUT_NODE_RUNNING)
-   Predicate<String> provideServerRunningPredicate(final ProfitBricksApi api, ComputeConstants constants) {
-      return retry(new ServerStatusPredicate(
-              api, Server.Status.RUNNING),
-              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
-   }
-
-   @Provides
-   @Named(TIMEOUT_NODE_SUSPENDED)
-   Predicate<String> provideServerSuspendedPredicate(final ProfitBricksApi api, ComputeConstants constants) {
-      return retry(new ServerStatusPredicate(
-              api, Server.Status.SHUTOFF),
-              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
-   }
-
-   @Provides
-   @Singleton
-   ProvisioningManager provideProvisioningManager(Closer closer) {
-      ProvisioningManager provisioningManager = new ProvisioningManager();
-      closer.addToClose(provisioningManager);
-
-      return provisioningManager;
-   }
-
-   @Provides
-   @Singleton
-   @Named(POLL_PREDICATE_SNAPSHOT)
-   Predicate<String> provideSnapshotAvailablePredicate(final ProfitBricksApi api, ComputeConstants constants) {
-      return retry(new SnapshotProvisioningStatePredicate(
-              api, ProvisioningState.AVAILABLE),
-              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
-   }
-
-   static class DataCenterProvisioningStatePredicate implements Predicate<String> {
-
-      private final ProfitBricksApi api;
-      private final ProvisioningState expectedState;
-
-      public DataCenterProvisioningStatePredicate(ProfitBricksApi api, ProvisioningState expectedState) {
-         this.api = checkNotNull(api, "api must not be null");
-         this.expectedState = checkNotNull(expectedState, "expectedState must not be null");
-      }
-
-      @Override
-      public boolean apply(String input) {
-         checkNotNull(input, "datacenter id");
-         return api.dataCenterApi().getDataCenterState(input) == expectedState;
-      }
-
-   }
-
-   static class ServerStatusPredicate implements Predicate<String> {
-
-      private final ProfitBricksApi api;
-      private final Server.Status expectedStatus;
-
-      public ServerStatusPredicate(ProfitBricksApi api, Server.Status expectedStatus) {
-         this.api = checkNotNull(api, "api must not be null");
-         this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus must not be null");
-      }
-
-      @Override
-      public boolean apply(String input) {
-         checkNotNull(input, "server id");
-         return api.serverApi().getServer(input).status() == expectedStatus;
-      }
-
-   }
-
-   static class SnapshotProvisioningStatePredicate implements Predicate<String> {
-
-      private final ProfitBricksApi api;
-      private final ProvisioningState expectedState;
-
-      public SnapshotProvisioningStatePredicate(ProfitBricksApi api, ProvisioningState expectedState) {
-         this.api = checkNotNull(api, "api must not be null");
-         this.expectedState = checkNotNull(expectedState, "expectedState must not be null");
-      }
-
-      @Override
-      public boolean apply(String input) {
-         checkNotNull(input, "snapshot id");
-         return api.snapshotApi().getSnapshot(input).state() == expectedState;
-      }
-
-   }
-
-   @Singleton
-   public static class ComputeConstants {
-
-      @Inject
-      @Named(TIMEOUT_DATACENTER_AVAILABLE)
-      private String pollTimeout;
-
-      @Inject
-      @Named(POLL_INITIAL_PERIOD)
-      private String pollPeriod;
-
-      @Inject
-      @Named(POLL_MAX_PERIOD)
-      private String pollMaxPeriod;
-
-      public long pollTimeout() {
-         return Long.parseLong(pollTimeout);
-      }
-
-      public long pollPeriod() {
-         return Long.parseLong(pollPeriod);
-      }
-
-      public long pollMaxPeriod() {
-         return Long.parseLong(pollMaxPeriod);
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
deleted file mode 100644
index 5b27370..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
+++ /dev/null
@@ -1,241 +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.profitbricks.compute.function;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.find;
-import static org.jclouds.location.predicates.LocationPredicates.idEquals;
-
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.jclouds.collect.Memoized;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.ImageBuilder;
-import org.jclouds.compute.domain.OperatingSystem;
-import org.jclouds.compute.domain.OsFamily;
-import org.jclouds.domain.Location;
-import org.jclouds.profitbricks.domain.OsType;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.domain.Snapshot;
-import org.jclouds.profitbricks.domain.Provisionable;
-
-import com.google.common.base.Function;
-import com.google.common.base.Strings;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableMap;
-import com.google.inject.Inject;
-
-public class ProvisionableToImage implements Function<Provisionable, Image> {
-
-   public static final String KEY_PROVISIONABLE_TYPE = "provisionableType";
-
-   private final ImageToImage fnImageToImage;
-   private final SnapshotToImage fnSnapshotToImage;
-
-   @Inject
-   ProvisionableToImage(@Memoized Supplier<Set<? extends Location>> locations) {
-      this.fnImageToImage = new ImageToImage(locations);
-      this.fnSnapshotToImage = new SnapshotToImage(locations);
-   }
-
-   @Override
-   public Image apply(Provisionable input) {
-      checkNotNull(input, "Cannot convert null input");
-
-      if (input instanceof org.jclouds.profitbricks.domain.Image)
-         return fnImageToImage.apply((org.jclouds.profitbricks.domain.Image) input);
-
-      else if (input instanceof Snapshot)
-         return fnSnapshotToImage.apply((Snapshot) input);
-
-      else
-         throw new UnsupportedOperationException("No implementation found for provisionable of concrete type '"
-                 + input.getClass().getCanonicalName() + "'");
-   }
-
-   private static OsFamily mapOsFamily(OsType osType) {
-      if (osType == null)
-         return OsFamily.UNRECOGNIZED;
-      switch (osType) {
-         case WINDOWS:
-            return OsFamily.WINDOWS;
-         case LINUX:
-            return OsFamily.LINUX;
-         case UNRECOGNIZED:
-         case OTHER:
-         default:
-            return OsFamily.UNRECOGNIZED;
-      }
-   }
-
-   private static class ImageToImage implements ImageFunction<org.jclouds.profitbricks.domain.Image> {
-
-      private static final Pattern HAS_NUMBERS = Pattern.compile(".*\\d+.*");
-
-      private final Supplier<Set<? extends Location>> locations;
-
-      ImageToImage(Supplier<Set<? extends Location>> locations) {
-         this.locations = locations;
-      }
-
-      @Override
-      public Image apply(org.jclouds.profitbricks.domain.Image from) {
-         String desc = from.name();
-         OsFamily osFamily = parseOsFamily(desc, from.osType());
-         Location location = find(locations.get(), idEquals(from.location().getId()));
-
-         OperatingSystem os = OperatingSystem.builder()
-                 .description(osFamily.value())
-                 .family(osFamily)
-                 .version(parseVersion(desc))
-                 .is64Bit(is64Bit(desc, from.type()))
-                 .build();
-
-         return addTypeMetadata(new ImageBuilder()
-                 .ids(from.id())
-                 .name(desc)
-                 .location(location)
-                 .status(Image.Status.AVAILABLE)
-                 .operatingSystem(os))
-                 .build();
-      }
-
-      private OsFamily parseOsFamily(String from, OsType fallbackValue) {
-         if (from != null)
-            try {
-               // ProfitBricks images names are usually in format:
-               // [osType]-[version]-[subversion]-..-[date-created]
-               String desc = from.toUpperCase().split("-")[0];
-               OsFamily osFamily = OsFamily.fromValue(desc);
-               checkArgument(osFamily != OsFamily.UNRECOGNIZED);
-
-               return osFamily;
-            } catch (Exception ex) {
-               // do nothing
-            }
-         return mapOsFamily(fallbackValue);
-      }
-
-      private String parseVersion(String from) {
-         if (from != null) {
-            String[] split = from.toLowerCase().split("-");
-            if (split.length >= 2) {
-               int i = 1; // usually on second token
-               String version = split[i];
-               while (!HAS_NUMBERS.matcher(version).matches())
-                  version = split[++i];
-               return version;
-            }
-         }
-         return "";
-      }
-
-      private boolean is64Bit(String from, org.jclouds.profitbricks.domain.Image.Type type) {
-         switch (type) {
-            case CDROM:
-               if (!Strings.isNullOrEmpty(from))
-                  return from.matches("x86_64|amd64");
-            case HDD: // HDD provided by ProfitBricks are always 64-bit
-            default:
-               return true;
-         }
-      }
-
-      @Override
-      public ImageBuilder addTypeMetadata(ImageBuilder builder) {
-         return builder.userMetadata(ImmutableMap.of(KEY_PROVISIONABLE_TYPE, Provisionable.Type.IMAGE.toString()));
-      }
-   }
-
-   private static class SnapshotToImage implements ImageFunction<Snapshot> {
-
-      private final Supplier<Set<? extends Location>> locations;
-
-      SnapshotToImage(Supplier<Set<? extends Location>> locations) {
-         this.locations = locations;
-      }
-
-      @Override
-      public Image apply(Snapshot from) {
-         String textToParse = from.name() + from.description();
-         OsFamily osFamily = parseOsFamily(textToParse, from.osType());
-         Location location = find(locations.get(), idEquals(from.location().getId()));
-
-         OperatingSystem os = OperatingSystem.builder()
-                 .description(osFamily.value())
-                 .family(osFamily)
-                 .is64Bit(true)
-                 .version("00.00")
-                 .build();
-
-         return addTypeMetadata(new ImageBuilder()
-                 .ids(from.id())
-                 .name(from.name())
-                 .description(from.description())
-                 .location(location)
-                 .status(mapStatus(from.state()))
-                 .operatingSystem(os))
-                 .build();
-      }
-
-      private OsFamily parseOsFamily(String text, OsType fallbackValue) {
-         if (text != null)
-            try {
-               // Attempt parsing OsFamily by scanning name and description
-               // @see ProfitBricksComputeServiceAdapter#L190
-               OsFamily[] families = OsFamily.values();
-               for (OsFamily family : families)
-                  if (text.contains(family.value()))
-                     return family;
-            } catch (Exception ex) {
-               // do nothing
-            }
-         return mapOsFamily(fallbackValue);
-      }
-
-      static Image.Status mapStatus(ProvisioningState state) {
-         if (state == null)
-            return Image.Status.UNRECOGNIZED;
-         switch (state) {
-            case AVAILABLE:
-               return Image.Status.AVAILABLE;
-            case DELETED:
-               return Image.Status.DELETED;
-            case ERROR:
-               return Image.Status.ERROR;
-            case INACTIVE:
-            case INPROCESS:
-               return Image.Status.PENDING;
-            default:
-               return Image.Status.UNRECOGNIZED;
-         }
-      }
-
-      @Override
-      public ImageBuilder addTypeMetadata(ImageBuilder builder) {
-         return builder.userMetadata(ImmutableMap.of(KEY_PROVISIONABLE_TYPE, Provisionable.Type.SNAPSHOT.toString()));
-      }
-   }
-
-   private interface ImageFunction<T extends Provisionable> extends Function<T, Image> {
-
-      ImageBuilder addTypeMetadata(ImageBuilder builder);
-
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
deleted file mode 100644
index 9831c6f..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
+++ /dev/null
@@ -1,168 +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.profitbricks.compute.function;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Predicates.not;
-import static com.google.common.collect.Iterables.find;
-import static org.jclouds.location.predicates.LocationPredicates.idEquals;
-
-import java.util.List;
-import java.util.Set;
-
-import org.jclouds.collect.Memoized;
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.HardwareBuilder;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.NodeMetadataBuilder;
-import org.jclouds.compute.domain.OperatingSystem;
-import org.jclouds.compute.domain.OsFamily;
-import org.jclouds.compute.domain.Processor;
-import org.jclouds.compute.domain.Volume;
-import org.jclouds.compute.functions.GroupNamingConvention;
-import org.jclouds.domain.Location;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.domain.Nic;
-import org.jclouds.profitbricks.domain.OsType;
-import org.jclouds.profitbricks.domain.Server;
-import org.jclouds.profitbricks.domain.Storage;
-import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
-public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
-
-   private final Function<Storage, Volume> fnVolume;
-   private final Supplier<Set<? extends Location>> locations;
-   private final Function<List<Nic>, List<String>> fnCollectIps;
-   private final ProfitBricksApi api;
-
-   private final GroupNamingConvention groupNamingConvention;
-
-   @Inject
-   ServerToNodeMetadata(Function<Storage, Volume> fnVolume,
-           @Memoized Supplier<Set<? extends Location>> locations,
-           ProfitBricksApi api,
-           GroupNamingConvention.Factory groupNamingConvention) {
-      this.fnVolume = fnVolume;
-      this.locations = locations;
-      this.api = api;
-      this.groupNamingConvention = groupNamingConvention.createWithoutPrefix();
-      this.fnCollectIps = new Function<List<Nic>, List<String>>() {
-         @Override
-         public List<String> apply(List<Nic> in) {
-            List<String> ips = Lists.newArrayListWithExpectedSize(in.size());
-            for (Nic nic : in)
-               ips.addAll(nic.ips());
-            return ips;
-         }
-      };
-   }
-
-   @Override
-   public NodeMetadata apply(final Server server) {
-      checkNotNull(server, "Null server");
-      // Location is not populated in the datacenter on a server response
-      DataCenter dataCenter = api.dataCenterApi().getDataCenter(server.dataCenter().id());
-      Location location = find(locations.get(), idEquals(dataCenter.location().getId()));
-
-      float size = 0f;
-      List<Volume> volumes = Lists.newArrayList();
-      List<Storage> storages = server.storages();
-      if (storages != null)
-         for (Storage storage : storages) {
-            size += storage.size();
-            volumes.add(fnVolume.apply(storage));
-         }
-
-      // Build hardware
-      String id = String.format("cpu=%d,ram=%d,disk=%.0f", server.cores(), server.ram(), size);
-      Hardware hardware = new HardwareBuilder()
-              .ids(id)
-              .name(id)
-              .ram(server.ram())
-              .processor(new Processor(server.cores(), 1d))
-              .hypervisor("kvm")
-              .volumes(volumes)
-              .location(location)
-              .build();
-
-      // Collect ips
-      List<String> addresses = fnCollectIps.apply(server.nics());
-
-      // Build node
-      NodeMetadataBuilder nodeBuilder = new NodeMetadataBuilder();
-      nodeBuilder.ids(server.id())
-              .group(groupNamingConvention.extractGroup(server.name()))
-              .hostname(server.hostname())
-              .name(server.name())
-              .backendStatus(server.state().toString())
-              .status(mapStatus(server.status()))
-              .hardware(hardware)
-              .operatingSystem(mapOsType(server.osType()))
-              .location(location)
-              .privateAddresses(Iterables.filter(addresses, IsPrivateIPAddress.INSTANCE))
-              .publicAddresses(Iterables.filter(addresses, not(IsPrivateIPAddress.INSTANCE)));
-
-      return nodeBuilder.build();
-   }
-
-   static NodeMetadata.Status mapStatus(Server.Status status) {
-      if (status == null)
-         return NodeMetadata.Status.UNRECOGNIZED;
-      switch (status) {
-         case SHUTDOWN:
-         case SHUTOFF:
-         case PAUSED:
-            return NodeMetadata.Status.SUSPENDED;
-         case RUNNING:
-            return NodeMetadata.Status.RUNNING;
-         case BLOCKED:
-            return NodeMetadata.Status.PENDING;
-         case CRASHED:
-            return NodeMetadata.Status.ERROR;
-         default:
-            return NodeMetadata.Status.UNRECOGNIZED;
-      }
-   }
-
-   static OperatingSystem mapOsType(OsType osType) {
-      if (osType != null)
-         switch (osType) {
-            case WINDOWS:
-               return OperatingSystem.builder()
-                       .description(OsFamily.WINDOWS.value())
-                       .family(OsFamily.WINDOWS)
-                       .build();
-            case LINUX:
-               return OperatingSystem.builder()
-                       .description(OsFamily.LINUX.value())
-                       .family(OsFamily.LINUX)
-                       .build();
-         }
-      return OperatingSystem.builder()
-              .description(OsFamily.UNRECOGNIZED.value())
-              .family(OsFamily.UNRECOGNIZED)
-              .build();
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java
deleted file mode 100644
index 5557bca..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java
+++ /dev/null
@@ -1,47 +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.profitbricks.compute.function;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.jclouds.compute.domain.Volume;
-import org.jclouds.compute.domain.VolumeBuilder;
-import org.jclouds.profitbricks.domain.Storage;
-
-import com.google.common.base.Function;
-
-public class StorageToVolume implements Function<Storage, Volume> {
-
-   @Override
-   public Volume apply(Storage storage) {
-      checkNotNull(storage, "Null storage");
-
-      String device = "";
-      if (storage.deviceNumber() != null)
-         device = storage.deviceNumber().toString();
-
-      return new VolumeBuilder()
-              .id(storage.id())
-              .size(storage.size())
-              .bootDevice(storage.bootDevice())
-              .device(device)
-              .durable(true)
-              .type(Volume.Type.LOCAL)
-              .build();
-
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java
deleted file mode 100644
index f7db219..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java
+++ /dev/null
@@ -1,110 +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.profitbricks.compute.strategy;
-
-import static com.google.common.collect.Iterables.find;
-import static org.jclouds.Constants.PROPERTY_USER_THREADS;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
-
-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.compute.config.CustomizationResponse;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.compute.functions.GroupNamingConvention;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
-import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
-import org.jclouds.compute.strategy.ListNodesStrategy;
-import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet;
-import org.jclouds.logging.Logger;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.domain.Location;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Multimap;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-
-/**
- * Attempts to find a valid datacenter in the configured location where the
- * servers will be deployed. If no datacenter is found, one will be created.
- */
-@Beta
-@Singleton
-public class AssignDataCenterToTemplate extends CreateNodesWithGroupEncodedIntoNameThenAddToSet {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final ProfitBricksApi api;
-   private final Predicate<String> waitDcUntilAvailable;
-
-   @Inject
-   protected AssignDataCenterToTemplate(
-         CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy,
-         ListNodesStrategy listNodesStrategy,
-         GroupNamingConvention.Factory namingConvention,
-         @Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
-         CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
-         ProfitBricksApi api, @Named(POLL_PREDICATE_DATACENTER) Predicate<String> waitDcUntilAvailable) {
-      super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor,
-            customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
-      this.api = api;
-      this.waitDcUntilAvailable = waitDcUntilAvailable;
-   }
-
-   @Override
-   public Map<?, ListenableFuture<Void>> execute(String group, int count, final Template template,
-         Set<NodeMetadata> goodNodes, Map<NodeMetadata, Exception> badNodes,
-         Multimap<NodeMetadata, CustomizationResponse> customizationResponses) {
-
-      logger.info(">> looking for a datacenter in %s", template.getLocation().getId());
-
-      // Try to find an existing datacenter in the selected location
-      DataCenter dataCenter = find(api.dataCenterApi().getAllDataCenters(), new Predicate<DataCenter>() {
-         @Override
-         public boolean apply(DataCenter input) {
-            // The location field is not populated when getting the list of datacenters
-            DataCenter details = api.dataCenterApi().getDataCenter(input.id());
-            return details != null && template.getLocation().getId().equals(details.location().getId());
-         }
-      }, null);
-
-      if (dataCenter == null) {
-         String name = namingConvention.create().sharedNameForGroup(group);
-         logger.info(">> no datacenter was found. Creating a new one named %s in %s...", name, template.getLocation()
-               .getId());
-         dataCenter = api.dataCenterApi().createDataCenter(
-               DataCenter.Request.creatingPayload(name, Location.fromId(template.getLocation().getId())));
-         waitDcUntilAvailable.apply(dataCenter.id());
-      }
-
-      return super.execute(group, count, new TemplateWithDataCenter(template, dataCenter), goodNodes, badNodes,
-            customizationResponses);
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java b/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java
deleted file mode 100644
index dd689d5..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java
+++ /dev/null
@@ -1,107 +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.profitbricks.compute.strategy;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.domain.Location;
-import org.jclouds.profitbricks.domain.DataCenter;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Extends the default {@link Template} object to provide the {@link DataCenter}
- * where the nodes must be created.
- */
-@Beta
-public class TemplateWithDataCenter implements Template {
-
-   private final Template delegate;
-
-   private final DataCenter dataCenter;
-
-   // For internal use only
-   TemplateWithDataCenter(Template delegate, DataCenter dataCenter) {
-      this.delegate = checkNotNull(delegate, "delegate cannot be null");
-      this.dataCenter = checkNotNull(dataCenter, "dataCenter cannot be null");
-   }
-
-   public DataCenter getDataCenter() {
-      return dataCenter;
-   }
-
-   public Template clone() {
-      return new TemplateWithDataCenter(delegate.clone(), dataCenter);
-   }
-
-   public Hardware getHardware() {
-      return delegate.getHardware();
-   }
-
-   public Image getImage() {
-      return delegate.getImage();
-   }
-
-   public Location getLocation() {
-      return delegate.getLocation();
-   }
-
-   public TemplateOptions getOptions() {
-      return delegate.getOptions();
-   }
-
-   @Override
-   public int hashCode() {
-      final int prime = 31;
-      int result = 1;
-      result = prime * result + ((dataCenter == null) ? 0 : dataCenter.hashCode());
-      result = prime * result + ((delegate == null) ? 0 : delegate.hashCode());
-      return result;
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      TemplateWithDataCenter other = (TemplateWithDataCenter) obj;
-      if (dataCenter == null) {
-         if (other.dataCenter != null)
-            return false;
-      } else if (!dataCenter.equals(other.dataCenter))
-         return false;
-      if (delegate == null) {
-         if (other.delegate != null)
-            return false;
-      } else if (!delegate.equals(other.delegate))
-         return false;
-      return true;
-   }
-
-   @Override
-   public String toString() {
-      return delegate.toString();
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java b/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
deleted file mode 100644
index eadc038..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
+++ /dev/null
@@ -1,32 +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.profitbricks.config;
-
-public class ProfitBricksComputeProperties {
-
-   public static final String POLL_PREDICATE_DATACENTER     = "jclouds.profitbricks.predicate.datacenter";
-   public static final String POLL_PREDICATE_SNAPSHOT       = "jclouds.profitbricks.predicate.snapshot";
-
-   public static final String TIMEOUT_DATACENTER_AVAILABLE  = "jclouds.profitbricks.timeout.datacenter-available";
-   public static final String POLL_INITIAL_PERIOD           = "jclouds.profitbricks.poll-status.initial-period";
-   public static final String POLL_MAX_PERIOD               = "jclouds.profitbricks.poll-status.poll.max-period";
-
-   private ProfitBricksComputeProperties() {
-      throw new AssertionError("Intentionally unimplemented");
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java b/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
deleted file mode 100644
index f95b1b3..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
+++ /dev/null
@@ -1,70 +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.profitbricks.config;
-
-import org.jclouds.http.HttpCommandExecutorService;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.handlers.ProfitBricksHttpErrorHandler;
-import org.jclouds.http.HttpErrorHandler;
-import org.jclouds.http.annotation.ClientError;
-import org.jclouds.http.annotation.Redirection;
-import org.jclouds.http.annotation.ServerError;
-import org.jclouds.http.config.ConfiguresHttpCommandExecutorService;
-import org.jclouds.http.config.SSLModule;
-import org.jclouds.http.functions.ParseSax;
-import org.jclouds.profitbricks.domain.ServiceFault;
-import org.jclouds.profitbricks.http.ResponseStatusFromPayloadHttpCommandExecutorService;
-import org.jclouds.profitbricks.http.parser.ServiceFaultResponseHandler;
-import org.jclouds.rest.ConfiguresHttpApi;
-import org.jclouds.rest.config.HttpApiModule;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Scopes;
-
-/**
- * Configures the ProfitBricks connection.
- */
-@ConfiguresHttpApi
-public class ProfitBricksHttpApiModule extends HttpApiModule<ProfitBricksApi> {
-
-   @Override
-   protected void bindErrorHandlers() {
-      bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ProfitBricksHttpErrorHandler.class);
-      bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ProfitBricksHttpErrorHandler.class);
-      bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ProfitBricksHttpErrorHandler.class);
-   }
-
-   @ConfiguresHttpCommandExecutorService
-   public static class ProfitBricksHttpCommandExecutorServiceModule extends AbstractModule {
-
-      @Override
-      protected void configure() {
-         install(new SSLModule());
-         bind(HttpCommandExecutorService.class).to(ResponseStatusFromPayloadHttpCommandExecutorService.class)
-                 .in(Scopes.SINGLETON);
-      }
-
-      @Provides
-      public ParseSax<ServiceFault> serviceFaultParser(ParseSax.Factory factory, Injector injector) {
-         return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
-      }
-
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java b/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
deleted file mode 100644
index a3c50ae..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
+++ /dev/null
@@ -1,32 +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.profitbricks.domain;
-
-import com.google.common.base.Enums;
-
-public enum AvailabilityZone {
-
-   AUTO, ZONE_1, ZONE_2, UNRECOGNIZED;
-
-   public String value() {
-      return name();
-   }
-
-   public static AvailabilityZone fromValue(String v) {
-      return Enums.getIfPresent(AvailabilityZone.class, v).or(UNRECOGNIZED);
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/93aff921/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
----------------------------------------------------------------------
diff --git a/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java b/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
deleted file mode 100644
index 9bb09ab..0000000
--- a/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
+++ /dev/null
@@ -1,121 +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.profitbricks.domain;
-
-import static org.jclouds.profitbricks.util.Preconditions.checkInvalidChars;
-
-import java.util.List;
-
-import org.jclouds.javax.annotation.Nullable;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableList;
-
-@AutoValue
-public abstract class DataCenter {
-
-   public abstract String id();
-
-   @Nullable
-   public abstract String name();
-
-   public abstract int version();
-
-   @Nullable
-   public abstract ProvisioningState state();
-
-   @Nullable
-   public abstract Location location();
-
-   @Nullable
-   public abstract List<Server> servers();
-
-   @Nullable
-   public abstract List<Storage> storages();
-
-   public static Builder builder() {
-      return new AutoValue_DataCenter.Builder()
-              .servers(ImmutableList.<Server>of())
-              .storages(ImmutableList.<Storage>of());
-   }
-
-   public abstract Builder toBuilder();
-
-   @AutoValue.Builder
-   public abstract static class Builder {
-
-      public abstract Builder id(String id);
-
-      public abstract Builder name(String name);
-
-      public abstract Builder version(int version);
-
-      public abstract Builder state(ProvisioningState state);
-
-      public abstract Builder location(Location location);
-
-      public abstract Builder servers(List<Server> servers);
-
-      public abstract Builder storages(List<Storage> storages);
-
-      abstract DataCenter autoBuild();
-      
-      public DataCenter build(){
-         DataCenter built = autoBuild();
-         return built.toBuilder()
-                 .servers(ImmutableList.copyOf(built.servers()))
-                 .storages(ImmutableList.copyOf(built.storages()))
-                 .autoBuild();
-      }
-
-   }
-
-   public static final class Request {
-
-      public static CreatePayload creatingPayload(String name, Location location) {
-         CreatePayload payload = new AutoValue_DataCenter_Request_CreatePayload(name, location);
-         checkInvalidChars(payload.name());
-
-         return payload;
-      }
-
-      public static UpdatePayload updatingPayload(String id, String name) {
-         UpdatePayload payload = new AutoValue_DataCenter_Request_UpdatePayload(id, name);
-         checkInvalidChars(payload.name());
-
-         return payload;
-      }
-
-      @AutoValue
-      public abstract static class CreatePayload {
-
-         public abstract String name();
-
-         public abstract Location location();
-
-      }
-
-      @AutoValue
-      public abstract static class UpdatePayload {
-
-         public abstract String id();
-
-         public abstract String name();
-
-      }
-   }
-}