diff --git a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/VirtualBoxContextBuilder.java b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/VirtualBoxContextBuilder.java index 657788f1f5..d5668ec389 100644 --- a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/VirtualBoxContextBuilder.java +++ b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/VirtualBoxContextBuilder.java @@ -19,13 +19,20 @@ package org.jclouds.virtualbox; +import java.net.URI; import java.util.List; import java.util.Properties; +import org.jclouds.byon.Node; +import org.jclouds.byon.config.CacheNodeStoreModule; import org.jclouds.compute.StandaloneComputeServiceContextBuilder; +import org.jclouds.compute.domain.OsFamily; import org.jclouds.virtualbox.config.VirtualBoxComputeServiceContextModule; +import com.google.common.base.Predicate; import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.inject.Module; /** @@ -37,12 +44,31 @@ import com.google.inject.Module; public class VirtualBoxContextBuilder extends StandaloneComputeServiceContextBuilder { public VirtualBoxContextBuilder(Properties properties) { - super(Supplier.class, properties); + super(Supplier.class, new VirtualBoxPropertiesBuilder(properties).defaultProperties()); } @Override protected void addContextModule(List modules) { modules.add(new VirtualBoxComputeServiceContextModule()); + addHostModuleIfNotPresent(modules); + } + + protected void addHostModuleIfNotPresent(List modules) { + if (!Iterables.any(modules, new Predicate() { + public boolean apply(Module input) { + return input instanceof CacheNodeStoreModule; + } + })) { + CacheNodeStoreModule hostModule = new CacheNodeStoreModule(ImmutableMap.of( + "host", + Node.builder().id("host").name("host installing virtualbox").hostname("localhost") + .osFamily(OsFamily.LINUX.toString()).osDescription(System.getProperty("os.name")) + .osVersion(System.getProperty("os.version")).group("ssh") + .username(System.getProperty("user.name")) + .credentialUrl(URI.create("file://" + System.getProperty("user.home") + "/.ssh/id_rsa")) + .build())); + modules.add(hostModule); + } } } diff --git a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/compute/VirtualBoxComputeServiceAdapter.java b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/compute/VirtualBoxComputeServiceAdapter.java index dcf9f3f4d0..771ce60b61 100644 --- a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/compute/VirtualBoxComputeServiceAdapter.java +++ b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/compute/VirtualBoxComputeServiceAdapter.java @@ -41,12 +41,13 @@ import org.jclouds.logging.Logger; import org.jclouds.virtualbox.domain.Master; import org.jclouds.virtualbox.domain.NodeSpec; import org.jclouds.virtualbox.domain.YamlImage; -import org.virtualbox_4_1.CleanupMode; +import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExistsAndForceDeleteItsMedia; import org.virtualbox_4_1.IMachine; import org.virtualbox_4_1.IProgress; import org.virtualbox_4_1.ISession; import org.virtualbox_4_1.MachineState; import org.virtualbox_4_1.SessionState; +import org.virtualbox_4_1.VBoxException; import org.virtualbox_4_1.VirtualBoxManager; import com.google.common.base.Function; @@ -138,14 +139,21 @@ public class VirtualBoxComputeServiceAdapter implements ComputeServiceAdapter of(new SLF4JLoggingModule(), new SshjSshClientModule(), hostModule)); + ImmutableSet. of(new SLF4JLoggingModule(), new SshjSshClientModule())); } @Provides diff --git a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java new file mode 100644 index 0000000000..b4d2e7c92c --- /dev/null +++ b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java @@ -0,0 +1,117 @@ +/** + * 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. + */ +/* + U * 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.virtualbox.functions.admin; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.transform; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.virtualbox.domain.ErrorCode; +import org.virtualbox_4_1.CleanupMode; +import org.virtualbox_4_1.DeviceType; +import org.virtualbox_4_1.IMachine; +import org.virtualbox_4_1.IMedium; +import org.virtualbox_4_1.IProgress; +import org.virtualbox_4_1.VBoxException; + +import com.google.common.base.Function; +import com.google.common.base.Throwables; +import com.google.common.collect.Lists; + +@Singleton +public class UnregisterMachineIfExistsAndForceDeleteItsMedia implements Function { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + @Override + public Void apply(IMachine machine) { + List mediaToBeDeleted = Collections.emptyList(); + try { + mediaToBeDeleted = machine.unregister(CleanupMode.Full); + } catch (VBoxException e) { + ErrorCode errorCode = ErrorCode.valueOf(e); + switch (errorCode) { + case VBOX_E_OBJECT_NOT_FOUND: + logger.debug("Machine %s does not exists, cannot unregister", machine.getName()); + break; + default: + throw e; + } + } + + List filteredMediaToBeDeleted = Lists.newArrayList(transform(mediaToBeDeleted, + new DeleteChildrenOfMedium())); + if (!filteredMediaToBeDeleted.isEmpty()) { + try { + IProgress deletion = machine.delete(filteredMediaToBeDeleted); + deletion.waitForCompletion(-1); + } catch (Exception e) { + logger.error(e, "Problem in deleting the media attached to %s", machine.getName()); + Throwables.propagate(e); + } + } + + return null; + } + + private class DeleteChildrenOfMedium implements Function { + @Override + public IMedium apply(IMedium medium) { + checkNotNull(medium.getChildren()); + if (medium.getDeviceType().equals(DeviceType.HardDisk)) { + for (IMedium child : medium.getChildren()) { + IProgress deletion = child.deleteStorage(); + deletion.waitForCompletion(-1); + } + } + return medium; + } + + }; + +} diff --git a/labs/virtualbox/src/test/java/org/jclouds/virtualbox/BaseVirtualBoxClientLiveTest.java b/labs/virtualbox/src/test/java/org/jclouds/virtualbox/BaseVirtualBoxClientLiveTest.java index 2cff238e72..57d60b05a9 100644 --- a/labs/virtualbox/src/test/java/org/jclouds/virtualbox/BaseVirtualBoxClientLiveTest.java +++ b/labs/virtualbox/src/test/java/org/jclouds/virtualbox/BaseVirtualBoxClientLiveTest.java @@ -135,17 +135,8 @@ public class BaseVirtualBoxClientLiveTest extends BaseVersionedServiceLiveTest { setupCredentials(); Properties overrides = new VirtualBoxPropertiesBuilder(setupProperties()).build(); - CacheNodeStoreModule hostModule = new CacheNodeStoreModule(ImmutableMap.of( - "host", - Node.builder().id("host").name("host installing virtualbox").hostname("localhost") - .osFamily(OsFamily.LINUX.toString()).osDescription(System.getProperty("os.name")) - .osVersion(System.getProperty("os.version")).group("ssh") - .username(System.getProperty("user.name")) - .credentialUrl(URI.create("file://" + System.getProperty("user.home") + "/.ssh/id_rsa")) - .build())); - context = new ComputeServiceContextFactory().createContext(provider, identity, credential, ImmutableSet - . of(new SLF4JLoggingModule(), new SshjSshClientModule(), hostModule, new ExecutorServiceModule( + . of(new SLF4JLoggingModule(), new SshjSshClientModule(), new ExecutorServiceModule( singleThreadExec, singleThreadExec)), overrides); context.utils().injector().injectMembers(this); diff --git a/labs/virtualbox/src/test/java/org/jclouds/virtualbox/statements/SetIpAddressTest.java b/labs/virtualbox/src/test/java/org/jclouds/virtualbox/statements/SetIpAddressTest.java index f72ea3d1fe..a8096ed437 100644 --- a/labs/virtualbox/src/test/java/org/jclouds/virtualbox/statements/SetIpAddressTest.java +++ b/labs/virtualbox/src/test/java/org/jclouds/virtualbox/statements/SetIpAddressTest.java @@ -61,7 +61,7 @@ public class SetIpAddressTest { .addNetworkAdapter( NetworkAdapter.builder().staticIp("localhost").networkAttachmentType(NetworkAttachmentType.NAT) .build()).build(); - SetIpAddress setIpAddressStmtm = new SetIpAddress(networkInterfaceCard); + new SetIpAddress(networkInterfaceCard); } }