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