fix issue #1263 stop before deleting joyent servers

This commit is contained in:
Adrian Cole 2013-01-31 11:56:06 -08:00 committed by adriancole
parent c7f394a598
commit 678454c8ad
2 changed files with 54 additions and 23 deletions

View File

@ -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<MachineInDatacenter, PackageInDatacenter, DatasetInDatacenter, Location> {
@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<Set<String>> datacenterIds;
private final JoyentCloudApi cloudApiApi;
private final Supplier<Set<String>> datacenterIds;
private final Timeouts timeouts;
@Inject
public JoyentCloudComputeServiceAdapter(JoyentCloudApi cloudApiApi, @Zone Supplier<Set<String>> datacenterIds) {
public JoyentCloudComputeServiceAdapter(JoyentCloudApi cloudApiApi, @Zone Supplier<Set<String>> 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<org.jclouds.joyent.cloudapi.v6_5.domain.Package, PackageInDatacenter>() {
@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<Dataset, DatasetInDatacenter>() {
@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<Machine, MachineInDatacenter>() {
@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<MachineInDatacenter> machine = new AtomicReference<MachineInDatacenter>(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<String>(new Predicate<String>() {
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());
}
}

View File

@ -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;