Skip to content
This repository has been archived by the owner on Mar 25, 2018. It is now read-only.

Commit

Permalink
fix issue #1263 stop before deleting joyent servers
Browse files Browse the repository at this point in the history
  • Loading branch information
Adrian Cole committed Jan 31, 2013
1 parent c7f394a commit 678454c
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,37 @@
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;
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;
import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.PackageInDatacenter;
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;
Expand All @@ -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
Expand Down Expand Up @@ -107,12 +115,9 @@ public Iterable<PackageInDatacenter> listHardwareProfiles() {
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();
Expand All @@ -124,12 +129,9 @@ public Iterable<DatasetInDatacenter> listImages() {
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();
Expand All @@ -141,12 +143,9 @@ public Iterable<MachineInDatacenter> listNodes() {
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();
Expand Down Expand Up @@ -176,8 +175,25 @@ public DatasetInDatacenter getImage(String id) {

@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
Expand All @@ -189,15 +205,12 @@ public void rebootNode(String id) {
@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());
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down

0 comments on commit 678454c

Please sign in to comment.