diff --git a/labs/joyent-cloudapi/src/main/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceAdapter.java b/labs/joyent-cloudapi/src/main/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceAdapter.java index 658f8dd597..a42504538e 100644 --- a/labs/joyent-cloudapi/src/main/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceAdapter.java +++ b/labs/joyent-cloudapi/src/main/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceAdapter.java @@ -19,10 +19,13 @@ package org.jclouds.joyent.cloudapi.v6_5.compute; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.transform; +import static org.jclouds.compute.reference.ComputeServiceConstants.COMPUTE_LOGGER; import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Resource; import javax.inject.Inject; @@ -30,12 +33,13 @@ import javax.inject.Named; import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.domain.Location; import org.jclouds.domain.LoginCredentials; import org.jclouds.joyent.cloudapi.v6_5.JoyentCloudApi; import org.jclouds.joyent.cloudapi.v6_5.domain.Dataset; import org.jclouds.joyent.cloudapi.v6_5.domain.Machine; +import org.jclouds.joyent.cloudapi.v6_5.domain.Machine.State; import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.DatacenterAndId; import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.DatasetInDatacenter; import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.MachineInDatacenter; @@ -43,8 +47,9 @@ import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.PackageInDatacen import org.jclouds.joyent.cloudapi.v6_5.options.CreateMachineOptions; import org.jclouds.location.Zone; import org.jclouds.logging.Logger; - +import org.jclouds.predicates.RetryablePredicate; import com.google.common.base.Function; +import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet.Builder; @@ -59,16 +64,19 @@ public class JoyentCloudComputeServiceAdapter implements ComputeServiceAdapter { @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; + @Named(COMPUTE_LOGGER) + private Logger logger = Logger.NULL; - protected final JoyentCloudApi cloudApiApi; - protected final Supplier> datacenterIds; + private final JoyentCloudApi cloudApiApi; + private final Supplier> datacenterIds; + private final Timeouts timeouts; @Inject - public JoyentCloudComputeServiceAdapter(JoyentCloudApi cloudApiApi, @Zone Supplier> datacenterIds) { + public JoyentCloudComputeServiceAdapter(JoyentCloudApi cloudApiApi, @Zone Supplier> datacenterIds, + Timeouts timeouts) { this.cloudApiApi = checkNotNull(cloudApiApi, "cloudApiApi"); this.datacenterIds = checkNotNull(datacenterIds, "datacenterIds"); + this.timeouts = checkNotNull(timeouts, "timeouts"); } @Override @@ -107,12 +115,9 @@ public class JoyentCloudComputeServiceAdapter implements for (final String datacenterId : datacenterIds.get()) { builder.addAll(transform(cloudApiApi.getPackageApiForDatacenter(datacenterId).list(), new Function() { - - @Override public PackageInDatacenter apply(org.jclouds.joyent.cloudapi.v6_5.domain.Package arg0) { return new PackageInDatacenter(arg0, datacenterId); } - })); } return builder.build(); @@ -124,12 +129,9 @@ public class JoyentCloudComputeServiceAdapter implements for (final String datacenterId : datacenterIds.get()) { builder.addAll(transform(cloudApiApi.getDatasetApiForDatacenter(datacenterId).list(), new Function() { - - @Override public DatasetInDatacenter apply(Dataset arg0) { return new DatasetInDatacenter(arg0, datacenterId); } - })); } return builder.build(); @@ -141,12 +143,9 @@ public class JoyentCloudComputeServiceAdapter implements for (final String datacenterId : datacenterIds.get()) { builder.addAll(transform(cloudApiApi.getMachineApiForDatacenter(datacenterId).list(), new Function() { - - @Override public MachineInDatacenter apply(Machine arg0) { return new MachineInDatacenter(arg0, datacenterId); } - })); } return builder.build(); @@ -176,8 +175,25 @@ public class JoyentCloudComputeServiceAdapter implements @Override public void destroyNode(String id) { - DatacenterAndId datacenterAndId = DatacenterAndId.fromSlashEncoded(id); - cloudApiApi.getMachineApiForDatacenter(datacenterAndId.getDatacenter()).delete(datacenterAndId.getId()); + final AtomicReference machine = new AtomicReference(getNode(id)); + if (machine.get() == null) + return; + if (machine.get().get().getState() == State.RUNNING) { + logger.debug(">> stopping machine(%s) current state(%s)", machine.get().getId(), machine.get().get() + .getState()); + cloudApiApi.getMachineApiForDatacenter(machine.get().getDatacenter()).stop(machine.get().getId()); + } + + checkState(new RetryablePredicate(new Predicate() { + public boolean apply(String id) { + machine.set(getNode(id)); + return machine == null || machine.get().get().getState() != State.RUNNING; + } + }, timeouts.nodeSuspended).apply(id), "<< unable to stop machine(%s) current state(%s)", machine.get().getId(), + machine.get().get().getState()); + + logger.debug(">> deleting machine(%s) current state(%s)", machine.get().getId(), machine.get().get().getState()); + cloudApiApi.getMachineApiForDatacenter(machine.get().getDatacenter()).delete(machine.get().getId()); } @Override @@ -189,15 +205,12 @@ public class JoyentCloudComputeServiceAdapter implements @Override public void resumeNode(String id) { DatacenterAndId datacenterAndId = DatacenterAndId.fromSlashEncoded(id); - cloudApiApi.getMachineApiForDatacenter(datacenterAndId.getDatacenter()).stop(datacenterAndId.getId()); - + cloudApiApi.getMachineApiForDatacenter(datacenterAndId.getDatacenter()).start(datacenterAndId.getId()); } @Override public void suspendNode(String id) { DatacenterAndId datacenterAndId = DatacenterAndId.fromSlashEncoded(id); - cloudApiApi.getMachineApiForDatacenter(datacenterAndId.getDatacenter()).start(datacenterAndId.getId()); - + cloudApiApi.getMachineApiForDatacenter(datacenterAndId.getDatacenter()).stop(datacenterAndId.getId()); } - } diff --git a/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceLiveTest.java b/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceLiveTest.java index e866e50d0c..b271e1f824 100644 --- a/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceLiveTest.java +++ b/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/JoyentCloudComputeServiceLiveTest.java @@ -1,3 +1,21 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.joyent.cloudapi.v6_5.compute; import org.jclouds.compute.internal.BaseComputeServiceLiveTest;