You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@provisionr.apache.org by as...@apache.org on 2013/04/01 10:52:26 UTC

[03/21] PROVISIONR-20. Change groupId from com.axemblr.provisionr to org.apache.provisionr

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/CommandSupport.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/CommandSupport.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/CommandSupport.java
new file mode 100644
index 0000000..5663372
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/CommandSupport.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.commands;
+
+import org.apache.provisionr.api.provider.Provider;
+import org.apache.provisionr.cloudstack.DefaultProviderConfig;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.io.Closeables;
+import java.io.PrintStream;
+import java.util.Properties;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.jclouds.Constants;
+import org.jclouds.ContextBuilder;
+import org.jclouds.cloudstack.CloudStackApiMetadata;
+import org.jclouds.cloudstack.CloudStackAsyncClient;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+import org.jclouds.rest.RestContext;
+
+
+/**
+ * Base class for CloudStack  Karaf Shell commands. It takes care of creating and cleaning a
+ * {@link org.jclouds.cloudstack.CloudStackContext} for each command.
+ */
+public abstract class CommandSupport extends OsgiCommandSupport {
+
+    private RestContext<CloudStackClient, CloudStackAsyncClient> context = null;
+    public static final String CLOUDSTACK_SCOPE = "cloudstack";
+
+    private final Provider provider;
+
+    protected CommandSupport(DefaultProviderConfig providerConfig) {
+        this.provider = providerConfig.createProvider().get();
+    }
+
+    public abstract Object doExecuteWithContext(CloudStackClient client, PrintStream out) throws Exception;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        try {
+            context = newCloudStackContext(provider);
+            return doExecuteWithContext(context.getApi(), System.out);
+        } finally {
+            Closeables.closeQuietly(context);
+        }
+    }
+
+    protected RestContext<CloudStackClient, CloudStackAsyncClient> newCloudStackContext(Provider provider) {
+        Properties overrides = new Properties();
+        overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
+        return ContextBuilder.newBuilder(new CloudStackApiMetadata())
+            .endpoint(provider.getEndpoint().get())
+            .modules(ImmutableSet.of(new SLF4JLoggingModule()))
+            .credentials(provider.getAccessKey(), provider.getSecretKey())
+            .overrides(overrides)
+            .build(CloudStackApiMetadata.CONTEXT_TOKEN);
+    }
+
+    public Provider getProvider() {
+        return provider;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/OfferingsCommand.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/OfferingsCommand.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/OfferingsCommand.java
new file mode 100644
index 0000000..de2063e
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/OfferingsCommand.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.commands;
+
+import org.apache.provisionr.cloudstack.DefaultProviderConfig;
+import java.io.PrintStream;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.DiskOffering;
+import org.jclouds.cloudstack.domain.NetworkOffering;
+import org.jclouds.cloudstack.domain.ServiceOffering;
+
+@Command(scope = CommandSupport.CLOUDSTACK_SCOPE, name = OfferingsCommand.NAME,
+    description = "Commands to list CloudStack Service Offerings")
+public class OfferingsCommand extends CommandSupport {
+
+    public static final String NAME = "offerings";
+
+    @Option(name = "-s", aliases = "--service", description = "List service offerings")
+    private boolean serviceOffering;
+
+    @Option(name = "-n", aliases = "--network", description = "List network offerings")
+    private boolean networkOffering;
+
+    @Option(name = "-d", aliases = "--disk", description = "List disk offerings")
+    private boolean diskOffering;
+
+    public OfferingsCommand(DefaultProviderConfig providerConfig) {
+        super(providerConfig);
+    }
+
+    @Override
+    public Object doExecuteWithContext(CloudStackClient client, PrintStream out) throws Exception {
+        if (isDiskOfferingListed() || isServiceOfferingListed() || isNetworkOfferingListed()) {
+            out.printf("CloudStack Offerings for provider %s\n", getProvider().getId());
+            listServiceOfferingsIfSpecified(client, out);
+            listNetworkOfferingsIfSpecified(client, out);
+            listDiskOfferingsIfSpecified(client, out);
+        } else {
+            out.printf("No option specified. See --help for details.");
+        }
+        return null;
+    }
+
+    private void listDiskOfferingsIfSpecified(CloudStackClient client, PrintStream out) {
+        if (isDiskOfferingListed()) {
+            for (DiskOffering offering : client.getOfferingClient().listDiskOfferings()) {
+                out.printf("---\n%s\n", offering.toString());
+            }
+        }
+    }
+
+    private void listNetworkOfferingsIfSpecified(CloudStackClient client, PrintStream out) {
+        if (isNetworkOfferingListed()) {
+            for (NetworkOffering offering : client.getOfferingClient().listNetworkOfferings()) {
+                out.printf("---\n%s\n", offering.toString());
+            }
+        }
+    }
+
+    private void listServiceOfferingsIfSpecified(CloudStackClient client, PrintStream out) {
+        if (isServiceOfferingListed()) {
+            for (ServiceOffering offering : client.getOfferingClient().listServiceOfferings()) {
+                out.printf("---\n%s\n", offering.toString());
+            }
+        }
+    }
+
+    public boolean isDiskOfferingListed() {
+        return diskOffering;
+    }
+
+    public void setDiskOffering(boolean diskOffering) {
+        this.diskOffering = diskOffering;
+    }
+
+    public boolean isNetworkOfferingListed() {
+        return networkOffering;
+    }
+
+    public void setNetworkOffering(boolean networkOffering) {
+        this.networkOffering = networkOffering;
+    }
+
+    public boolean isServiceOfferingListed() {
+        return serviceOffering;
+    }
+
+    public void setServiceOffering(boolean serviceOffering) {
+        this.serviceOffering = serviceOffering;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/TemplatesCommand.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/TemplatesCommand.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/TemplatesCommand.java
new file mode 100644
index 0000000..54f3d7b
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/TemplatesCommand.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.commands;
+
+import org.apache.provisionr.cloudstack.DefaultProviderConfig;
+import java.io.PrintStream;
+import org.apache.felix.gogo.commands.Command;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.Template;
+
+@Command(scope = CommandSupport.CLOUDSTACK_SCOPE, name = TemplatesCommand.NAME,
+    description = "Commands to list CloudStack templates")
+public class TemplatesCommand extends CommandSupport {
+
+    public static final String NAME = "templates";
+
+    public TemplatesCommand(DefaultProviderConfig providerConfig) {
+        super(providerConfig);
+    }
+
+    @Override
+    public Object doExecuteWithContext(CloudStackClient client, PrintStream out) throws Exception {
+        out.printf("CloudStack templates for provider %s\n", getProvider().getId());
+
+        for (Template template : client.getTemplateClient().listTemplates()) {
+            out.printf("---\n%s\n", template.toString());
+        }
+        out.println();
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/ZonesCommand.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/ZonesCommand.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/ZonesCommand.java
new file mode 100644
index 0000000..4ca5429
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/commands/ZonesCommand.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.commands;
+
+import org.apache.provisionr.cloudstack.DefaultProviderConfig;
+import java.io.PrintStream;
+import org.apache.felix.gogo.commands.Command;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.Zone;
+
+@Command(scope = CommandSupport.CLOUDSTACK_SCOPE, name = ZonesCommand.NAME,
+    description = "Commands to list CloudStack Zones")
+public class ZonesCommand extends CommandSupport {
+
+    public static final String NAME = "zones";
+
+    public ZonesCommand(DefaultProviderConfig defaultProviderConfig) {
+        super(defaultProviderConfig);
+    }
+
+    @Override
+    public Object doExecuteWithContext(CloudStackClient client, PrintStream out) throws Exception {
+        out.printf("CloudStack zones for provider %s\n", getProvider().getId());
+        for (Zone zone : client.getZoneClient().listZones()) {
+            out.printf("---\n%s\n", zone.toString());
+        }
+        out.println();
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/ConvertIngressRuleToRule.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/ConvertIngressRuleToRule.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/ConvertIngressRuleToRule.java
new file mode 100644
index 0000000..3fb5d6b
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/ConvertIngressRuleToRule.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.core;
+
+import org.apache.provisionr.api.network.Protocol;
+import org.apache.provisionr.api.network.Rule;
+import com.google.common.base.Function;
+import org.jclouds.cloudstack.domain.IngressRule;
+
+public enum ConvertIngressRuleToRule implements Function<IngressRule, Rule> {
+    FUNCTION;
+
+    @Override
+    public Rule apply(IngressRule input) {
+        Rule rule;
+        if (input.getProtocol().equalsIgnoreCase("icmp")) {
+            rule = Rule.builder()
+                .anySource()
+                .protocol(Protocol.valueOf(input.getProtocol().toUpperCase()))
+                .cidr(input.getCIDR())
+                .createRule();
+        } else {
+            rule = Rule.builder()
+                .anySource()
+                .protocol(Protocol.valueOf(input.getProtocol().toUpperCase()))
+                .ports(input.getStartPort(), input.getEndPort())
+                .cidr(input.getCIDR())
+                .createRule();
+        }
+        return rule;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/KeyPairs.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/KeyPairs.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/KeyPairs.java
new file mode 100644
index 0000000..d50edac
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/KeyPairs.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.core;
+
+public class KeyPairs {
+
+    private KeyPairs() {
+        // singleton
+    }
+
+    public static String formatNameFromBusinessKey(String businessKey) {
+        return String.format("key-%s", businessKey);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Networks.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Networks.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Networks.java
new file mode 100644
index 0000000..1da1012
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Networks.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2013 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.core;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.Network;
+
+public class Networks {
+
+    private Networks() {
+    }
+
+    public static String formatNameFromBusinessKey(String processBusinessKey) {
+        return String.format("networks-%s", processBusinessKey);
+    }
+
+    /**
+     * Returns the first network with the given name.
+     *
+     * @throws NoSuchElementException   if no network is found
+     * @throws IllegalArgumentException if more networks with the same name are found
+     */
+    public static Network getByName(CloudStackClient client, final String networkName) {
+        Set<Network> networks = Sets.filter(client.getNetworkClient().listNetworks(), new Predicate<Network>() {
+            @Override
+            public boolean apply(Network input) {
+                return input.getName().equals(networkName);
+            }
+        });
+        return Iterables.getOnlyElement(networks);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/SecurityGroups.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/SecurityGroups.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/SecurityGroups.java
new file mode 100644
index 0000000..4fcbec4
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/SecurityGroups.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.core;
+
+import org.apache.provisionr.api.network.Network;
+import org.apache.provisionr.api.network.Protocol;
+import org.apache.provisionr.api.network.Rule;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.IngressRule;
+import org.jclouds.cloudstack.domain.SecurityGroup;
+import org.jclouds.cloudstack.features.SecurityGroupClient;
+import static org.jclouds.cloudstack.options.ListSecurityGroupsOptions.Builder.named;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SecurityGroups {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SecurityGroup.class);
+    public static final int DEFAULT_ICMP_CODE = 0;
+    public static final int DEFAULT_ICMP_TYPE = 8;
+
+    private SecurityGroups() {
+    }
+
+    public static String formatNameFromBusinessKey(String processBusinessKey) {
+        return String.format("network-%s", processBusinessKey);
+    }
+
+    /**
+     * Get a SecurityGroup by name.
+     *
+     * @throws NoSuchElementException if securityGroup does not exist.
+     */
+    public static SecurityGroup getByName(CloudStackClient cloudStackClient, String securityGroup) {
+        return Iterables.getOnlyElement(cloudStackClient
+            .getSecurityGroupClient()
+            .listSecurityGroups(named(securityGroup)));
+    }
+
+    public static Set<SecurityGroup> getAll(CloudStackClient cloudStackClient) {
+        return cloudStackClient.getSecurityGroupClient().listSecurityGroups();
+    }
+
+    public static void deleteByName(CloudStackClient cloudStackClient, String securityGroupName) {
+        try {
+            SecurityGroup securityGroup = getByName(cloudStackClient, securityGroupName);
+            LOG.info("Deleting SecurityGroup {}", securityGroup.getName());
+            cloudStackClient.getSecurityGroupClient().deleteSecurityGroup(securityGroup.getId());
+        } catch (NoSuchElementException e) {
+            LOG.warn("Exception retrieving SecurityGroup (most likely it does not yet exist){}: {}", securityGroupName, e);
+        }
+    }
+
+    public static SecurityGroup createSecurityGroup(CloudStackClient cloudStackClient, String securityGroupName) {
+        SecurityGroupClient securityGroupClient = cloudStackClient.getSecurityGroupClient();
+        return securityGroupClient.createSecurityGroup(securityGroupName);
+    }
+
+    public static void deleteNetworkRules(CloudStackClient cloudStackClient, SecurityGroup securityGroup) {
+        for (IngressRule rule : securityGroup.getIngressRules()) {
+            cloudStackClient.getSecurityGroupClient().revokeIngressRule(rule.getId());
+        }
+    }
+
+    public static void applyNetworkRules(CloudStackClient cloudStackClient, SecurityGroup securityGroup, Network network) {
+        SecurityGroupClient securityGroupClient = cloudStackClient.getSecurityGroupClient();
+        for (Rule rule : network.getIngress()) {
+            if (rule.getProtocol() == Protocol.ICMP) {
+                securityGroupClient.authorizeIngressICMPToCIDRs(securityGroup.getId(), DEFAULT_ICMP_CODE,
+                    DEFAULT_ICMP_TYPE, ImmutableList.of(rule.getCidr()));
+            } else {
+                securityGroupClient.authorizeIngressPortsToCIDRs(securityGroup.getId(),
+                    rule.getProtocol().name(),
+                    rule.getPorts().lowerEndpoint(),
+                    rule.getPorts().upperEndpoint(),
+                    Lists.newArrayList(rule.getCidr()));
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/VirtualMachines.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/VirtualMachines.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/VirtualMachines.java
new file mode 100644
index 0000000..aab0cbd
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/VirtualMachines.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.core;
+
+import com.google.common.base.Predicate;
+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.collect.Sets;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.VirtualMachine;
+import static org.jclouds.cloudstack.domain.VirtualMachine.State.STARTING;
+import org.jclouds.cloudstack.options.ListVirtualMachinesOptions;
+import static org.jclouds.util.Preconditions2.checkNotEmpty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VirtualMachines {
+
+    private static final Logger LOG = LoggerFactory.getLogger(VirtualMachines.class);
+    public static int WAIT_TIME_OUT_IN_SECONDS = 180;
+    public static final int BETWEEN_REQUESTS_SLEEP_TIME = WAIT_TIME_OUT_IN_SECONDS / 10;
+
+    private VirtualMachines() {
+    }
+
+    public static List<String> destroyAllVirtualMachineByName(final CloudStackClient client, final String vmName) {
+        checkNotEmpty(vmName);
+
+        Set<VirtualMachine> vms = Sets.filter(client.getVirtualMachineClient()
+            .listVirtualMachines(ListVirtualMachinesOptions.Builder.name(vmName)), new Predicate<VirtualMachine>() {
+            @Override
+            public boolean apply(VirtualMachine input) {
+                return vmName.equals(input.getDisplayName());
+            }
+        });
+
+        List<String> jobIds = Lists.newArrayList();
+        LOG.info("Deleting a total of {} virtual machine instances", vms.size());
+        for (VirtualMachine vm : vms) {
+            LOG.info("Deleting instance with id {}", vm.getId());
+            jobIds.add(client.getVirtualMachineClient().destroyVirtualMachine(vm.getId()));
+        }
+        return ImmutableList.copyOf(jobIds);
+    }
+
+    public static void waitForVMtoStart(final CloudStackClient client, final String vmName) {
+        checkNotEmpty(vmName);
+        VirtualMachine machine = getVirtualMachineByName(client, vmName);
+        String id = machine.getId();
+        long startTime = System.currentTimeMillis();
+        while (machine.getState() == STARTING) {
+            try {
+                LOG.info("Waiting for VM {} - id {} to start", machine.getName(), machine.getId());
+                TimeUnit.SECONDS.sleep(BETWEEN_REQUESTS_SLEEP_TIME);
+                machine = client.getVirtualMachineClient().getVirtualMachine(id);
+            } catch (InterruptedException e) {
+                LOG.info("Interrupted while waiting for VM's to start");
+                Throwables.propagateIfPossible(e);
+            }
+            if (timeOutExceeded(startTime)) {
+                break;
+            }
+        }
+
+        switch (machine.getState()) {
+            case RUNNING:
+                LOG.info("VM {} is running, as expected", vmName);
+                break;
+            default:
+                throw new IllegalStateException("VM " + machine + "is not in RUNNING state");
+        }
+    }
+
+    private static boolean timeOutExceeded(long startTime) {
+        return System.currentTimeMillis() - startTime > (WAIT_TIME_OUT_IN_SECONDS * 1000);
+    }
+
+    private static VirtualMachine getVirtualMachineByName(CloudStackClient client, final String vmName) {
+        Set<VirtualMachine> machines = Sets.filter(client.getVirtualMachineClient()
+            .listVirtualMachines(ListVirtualMachinesOptions.Builder.name(vmName)), new Predicate<VirtualMachine>() {
+            @Override
+            public boolean apply(VirtualMachine input) {
+                return vmName.equals(input.getDisplayName());
+            }
+        });
+        return Iterables.getOnlyElement(machines);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Zones.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Zones.java b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Zones.java
new file mode 100644
index 0000000..566b5cb
--- /dev/null
+++ b/providers/cloudstack/src/main/java/org/apache/provisionr/cloudstack/core/Zones.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
+ *
+ * Licensed 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.apache.provisionr.cloudstack.core;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import java.util.Set;
+import org.jclouds.cloudstack.CloudStackClient;
+import org.jclouds.cloudstack.domain.Zone;
+
+public class Zones {
+
+    private Zones() {
+    }
+
+    public static boolean hasSecurityGroupEnabled(final CloudStackClient cloudStackClient, final String zoneName) {
+        Set<Zone> ourZone = Sets.filter(cloudStackClient.getZoneClient().listZones(), new Predicate<Zone>() {
+            @Override
+            public boolean apply(Zone input) {
+                return input.getName().equals(zoneName);
+            }
+        });
+        return Iterables.getOnlyElement(ourZone).isSecurityGroupsEnabled();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/resources/OSGI-INF/blueprint/context.xml
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/resources/OSGI-INF/blueprint/context.xml b/providers/cloudstack/src/main/resources/OSGI-INF/blueprint/context.xml
index 95e63ab..099d1a2 100644
--- a/providers/cloudstack/src/main/resources/OSGI-INF/blueprint/context.xml
+++ b/providers/cloudstack/src/main/resources/OSGI-INF/blueprint/context.xml
@@ -19,7 +19,7 @@
            xmlns:shell="http://karaf.apache.org/xmlns/shell/v1.0.0"
            xmlns:cfg="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0">
 
-    <cfg:property-placeholder persistent-id="com.axemblr.provisionr.cloudstack"
+    <cfg:property-placeholder persistent-id="org.apache.provisionr.cloudstack"
                               placeholder-prefix="$(" placeholder-suffix=")" update-strategy="reload">
         <cfg:default-properties>
             <cfg:property name="endpoint" value=""/>
@@ -34,7 +34,7 @@
     <!-- Configure a DefaultProviderConfiguration via ConfigAdmin
         WARNING: Order of arguments is important.
     -->
-    <bean id="defaultProviderConfig" class="com.axemblr.provisionr.cloudstack.DefaultProviderConfig">
+    <bean id="defaultProviderConfig" class="org.apache.provisionr.cloudstack.DefaultProviderConfig">
         <argument value="$(endpoint)"/>
         <argument value="$(accessKey)"/>
         <argument value="$(secretKey)"/>
@@ -45,46 +45,46 @@
 
     <reference id="processEngine" interface="org.activiti.engine.ProcessEngine"/>
 
-    <bean id="cloudstackService" class="com.axemblr.provisionr.cloudstack.CloudStackProvisionr">
+    <bean id="cloudstackService" class="org.apache.provisionr.cloudstack.CloudStackProvisionr">
         <argument ref="processEngine"/>
         <argument ref="defaultProviderConfig"/>
     </bean>
 
-    <service ref="cloudstackService" interface="com.axemblr.provisionr.api.Provisionr"/>
+    <service ref="cloudstackService" interface="org.apache.provisionr.api.Provisionr"/>
 
     <bean id="cloudstack_ensureSecurityGroupExists"
-          class="com.axemblr.provisionr.cloudstack.activities.EnsureSecurityGroupExists"/>
+          class="org.apache.provisionr.cloudstack.activities.EnsureSecurityGroupExists"/>
     <service ref="cloudstack_ensureSecurityGroupExists"
              auto-export="interfaces"/>
 
     <bean id="cloudstack_deleteSecurityGroup"
-          class="com.axemblr.provisionr.cloudstack.activities.DeleteSecurityGroup"/>
+          class="org.apache.provisionr.cloudstack.activities.DeleteSecurityGroup"/>
     <service ref="cloudstack_deleteSecurityGroup" auto-export="interfaces">
     </service>
     <bean id="cloudstack_ensureKeyPairExists"
-          class="com.axemblr.provisionr.cloudstack.activities.EnsureKeyPairExists"/>
+          class="org.apache.provisionr.cloudstack.activities.EnsureKeyPairExists"/>
     <service ref="cloudstack_ensureKeyPairExists" auto-export="interfaces">
     </service>
 
     <bean id="cloudstack_deleteKeyPair"
-          class="com.axemblr.provisionr.cloudstack.activities.DeleteKeyPair"/>
+          class="org.apache.provisionr.cloudstack.activities.DeleteKeyPair"/>
     <service ref="cloudstack_deleteKeyPair" auto-export="interfaces">
     </service>
 
     <!-- CloudStack Karaf shell commands for discovery -->
     <shell:command-bundle>
         <shell:command name="cloudstack/zones">
-            <shell:action class="com.axemblr.provisionr.cloudstack.commands.ZonesCommand">
+            <shell:action class="org.apache.provisionr.cloudstack.commands.ZonesCommand">
                 <shell:argument ref="defaultProviderConfig"/>
             </shell:action>
         </shell:command>
         <shell:command name="cloudstack/templates">
-            <shell:action class="com.axemblr.provisionr.cloudstack.commands.TemplatesCommand">
+            <shell:action class="org.apache.provisionr.cloudstack.commands.TemplatesCommand">
                 <shell:argument ref="defaultProviderConfig"/>
             </shell:action>
         </shell:command>
         <shell:command name="cloudstack/offerings">
-            <shell:action class="com.axemblr.provisionr.cloudstack.commands.OfferingsCommand">
+            <shell:action class="org.apache.provisionr.cloudstack.commands.OfferingsCommand">
                 <shell:argument ref="defaultProviderConfig"/>
             </shell:action>
         </shell:command>

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/resources/com.axemblr.provisionr.cloudstack.cfg
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/resources/com.axemblr.provisionr.cloudstack.cfg b/providers/cloudstack/src/main/resources/com.axemblr.provisionr.cloudstack.cfg
deleted file mode 100644
index f826bb0..0000000
--- a/providers/cloudstack/src/main/resources/com.axemblr.provisionr.cloudstack.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-# CloudStack provisioning service configuration
-
-endpoint = http://example.com/api
-accessKey = access
-secretKey = secret
-
-zoneId = 1
-templateId = 1
-serviceOffering = 1

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/resources/features.xml
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/resources/features.xml b/providers/cloudstack/src/main/resources/features.xml
index 6da9285..a45e561 100644
--- a/providers/cloudstack/src/main/resources/features.xml
+++ b/providers/cloudstack/src/main/resources/features.xml
@@ -16,23 +16,23 @@
   ~ limitations under the License.
   -->
 
-<features name="axemblr-provisionr-cloudstack-features-${project.version}"
+<features name="provisionr-cloudstack-features-${project.version}"
           xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
 
     <repository>
-        mvn:com.axemblr.provisionr/provisionr-core/${project.version}/xml/features
+        mvn:org.apache.provisionr/provisionr-core/${project.version}/xml/features
     </repository>
     <repository>
         mvn:org.jclouds.karaf/jclouds-karaf/${jclouds.karaf.version}/xml/features
     </repository>
 
-    <feature name="axemblr-provisionr-cloudstack" version="${project.version}">
+    <feature name="provisionr-cloudstack" version="${project.version}">
         <feature version="${jclouds.karaf.version}">jclouds-api-cloudstack</feature>
-        <feature version="${project.version}">axemblr-provisionr-core</feature>
-        <bundle start="true">mvn:com.axemblr.provisionr/provisionr-cloudstack/${project.version}</bundle>
+        <feature version="${project.version}">provisionr-core</feature>
+        <bundle start="true">mvn:org.apache.provisionr/provisionr-cloudstack/${project.version}</bundle>
 
-        <configfile finalname="/etc/com.axemblr.provisionr.cloudstack.cfg">
-            mvn:com.axemblr.provisionr/provisionr-cloudstack/${project.version}/cfg/defaults
+        <configfile finalname="/etc/org.apache.provisionr.cloudstack.cfg">
+            mvn:org.apache.provisionr/provisionr-cloudstack/${project.version}/cfg/defaults
         </configfile>
     </feature>
 

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/main/resources/org.apache.provisionr.cloudstack.cfg
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/main/resources/org.apache.provisionr.cloudstack.cfg b/providers/cloudstack/src/main/resources/org.apache.provisionr.cloudstack.cfg
new file mode 100644
index 0000000..f826bb0
--- /dev/null
+++ b/providers/cloudstack/src/main/resources/org.apache.provisionr.cloudstack.cfg
@@ -0,0 +1,10 @@
+
+# CloudStack provisioning service configuration
+
+endpoint = http://example.com/api
+accessKey = access
+secretKey = secret
+
+zoneId = 1
+templateId = 1
+serviceOffering = 1

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/CloudStackActivityLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/CloudStackActivityLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/CloudStackActivityLiveTest.java
deleted file mode 100644
index dd3062b..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/CloudStackActivityLiveTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.provider.Provider;
-import com.axemblr.provisionr.cloudstack.CloudStackProvisionr;
-import com.axemblr.provisionr.cloudstack.ProviderOptions;
-import com.axemblr.provisionr.cloudstack.core.SecurityGroups;
-import com.axemblr.provisionr.test.Generics;
-import com.axemblr.provisionr.test.ProvisionrLiveTestSupport;
-import com.google.common.base.Throwables;
-import java.util.Set;
-import java.util.UUID;
-import org.jclouds.cloudstack.CloudStackAsyncClient;
-import org.jclouds.cloudstack.CloudStackClient;
-import org.jclouds.cloudstack.domain.Network;
-import org.jclouds.cloudstack.domain.SecurityGroup;
-import org.jclouds.cloudstack.domain.SshKeyPair;
-import org.jclouds.cloudstack.domain.VirtualMachine;
-import org.jclouds.rest.RestContext;
-import org.junit.After;
-import org.junit.Before;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Helper base class for CloudStack Live tests.
- */
-public class CloudStackActivityLiveTest<T extends CloudStackActivity> extends ProvisionrLiveTestSupport {
-
-    public CloudStackActivityLiveTest() {
-        super(CloudStackProvisionr.ID);
-    }
-
-    private static final Logger LOG = LoggerFactory.getLogger(CloudStackActivityLiveTest.class);
-
-    protected final String BUSINESS_KEY = "j-" + UUID.randomUUID().toString();
-    /**
-     * Cloud provider credentials collected from system properties.
-     */
-    protected Provider provider;
-    /**
-     * Instance of CloudStackActivity being tested. Automatically created from the
-     * generic type class argument.
-     */
-    protected CloudStackActivity activity;
-
-    protected RestContext<CloudStackClient, CloudStackAsyncClient> context;
-
-    public CloudStackActivityLiveTest(String provisionrId) {
-        super(provisionrId);
-    }
-
-    protected T createCloudStackActivitiInstance() {
-        try {
-            return getCloudStackActivityClass().newInstance();
-        } catch (Exception e) {
-            throw Throwables.propagate(e);
-        }
-    }
-
-    protected Class<T> getCloudStackActivityClass() {
-        return Generics.getTypeParameter(getClass(), CloudStackActivity.class);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        provider = collectProviderCredentialsFromSystemProperties()
-            .option(ProviderOptions.ZONE_ID, getProviderProperty(ProviderOptions.ZONE_ID))
-            .option(ProviderOptions.NETWORK_OFFERING_ID, getProviderProperty(ProviderOptions.NETWORK_OFFERING_ID))
-            .createProvider();
-        LOG.info("Using provider {}", provider);
-
-        activity = createCloudStackActivitiInstance();
-        context = activity.newCloudStackClient(provider);
-    }
-
-
-    @After
-    public void tearDown() throws Exception {
-        context.close();
-    }
-
-    protected void logSecurityGroupDetails() {
-        Set<SecurityGroup> securityGroups = SecurityGroups.getAll(context.getApi());
-        LOG.info("Security Group count is {}", securityGroups.size());
-        for (SecurityGroup securityGroup : securityGroups) {
-            LOG.info("\tSecurity Group {}", securityGroup.getName());
-        }
-    }
-
-    protected void logKeyPairs() {
-        Set<SshKeyPair> keys = context.getApi().getSSHKeyPairClient().listSSHKeyPairs();
-        LOG.info("Access Key count is {}", keys.size());
-        for (SshKeyPair keyPair : keys) {
-            LOG.info("\tKey {}", keyPair.getName());
-        }
-    }
-
-    protected void logVirtualMachines() {
-        Set<VirtualMachine> vms = context.getApi().getVirtualMachineClient().listVirtualMachines();
-        LOG.info("Virtual machines count is {}", vms.size());
-        for (VirtualMachine vm : vms) {
-            LOG.info("\tVirtual machine {}", vm.toString());
-        }
-    }
-
-    protected void logNetworks() {
-        Set<Network> networks = context.getApi().getNetworkClient().listNetworks();
-        LOG.info("Networks count is {}", networks.size());
-        for (Network network : networks) {
-            LOG.info("{}\n", network.toString());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteKeyPairLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteKeyPairLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteKeyPairLiveTest.java
deleted file mode 100644
index ee91f5c..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteKeyPairLiveTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.access.AdminAccess;
-import com.axemblr.provisionr.api.pool.Pool;
-import com.axemblr.provisionr.cloudstack.core.KeyPairs;
-import com.axemblr.provisionr.core.CoreProcessVariables;
-import org.activiti.engine.delegate.DelegateExecution;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class DeleteKeyPairLiveTest extends CloudStackActivityLiveTest<DeleteKeyPair> {
-
-    private final String KEYPAIR_NAME = KeyPairs.formatNameFromBusinessKey(BUSINESS_KEY);
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        logKeyPairs();
-        context.getApi().getSSHKeyPairClient().registerSSHKeyPair(KEYPAIR_NAME, getResourceAsString("keys/test.pub"));
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        context.getApi().getSSHKeyPairClient().deleteSSHKeyPair(KEYPAIR_NAME);
-        logKeyPairs();
-        super.tearDown();
-    }
-
-    @Test
-    public void testDeleteKeyPair() throws Exception {
-        final AdminAccess adminAccess = AdminAccess.builder()
-            .username("admin")
-            .publicKey(getResourceAsString("keys/test.pub"))
-            .privateKey(getResourceAsString("keys/test"))
-            .createAdminAccess();
-
-        DelegateExecution execution = mock(DelegateExecution.class);
-        Pool pool = mock(Pool.class);
-
-        when(pool.getAdminAccess()).thenReturn(adminAccess);
-        when(pool.getProvider()).thenReturn(provider);
-
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-
-        activity.execute(execution);
-        assertKeyNotFound(KEYPAIR_NAME);
-        /* the second call should just do nothing */
-        activity.execute(execution);
-    }
-
-    private void assertKeyNotFound(String keyName) {
-        assertThat(context.getApi().getSSHKeyPairClient().getSSHKeyPair(keyName)).isNull();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteSecurityGroupLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteSecurityGroupLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteSecurityGroupLiveTest.java
deleted file mode 100644
index 9299da7..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/DeleteSecurityGroupLiveTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.network.Network;
-import com.axemblr.provisionr.api.pool.Pool;
-import com.axemblr.provisionr.cloudstack.ProcessVariables;
-import com.axemblr.provisionr.cloudstack.core.SecurityGroups;
-import com.axemblr.provisionr.core.CoreProcessVariables;
-import java.util.NoSuchElementException;
-import org.activiti.engine.delegate.DelegateExecution;
-import org.junit.After;
-import static org.junit.Assert.fail;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DeleteSecurityGroupLiveTest extends CloudStackActivityLiveTest<DeleteSecurityGroup> {
-
-    private final Logger LOG = LoggerFactory.getLogger(DeleteSecurityGroupLiveTest.class);
-    private final String SECURITY_GROUP_NAME = SecurityGroups.formatNameFromBusinessKey(BUSINESS_KEY);
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        logSecurityGroupDetails();
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        logSecurityGroupDetails();
-        super.tearDown();
-    }
-
-    @Test
-    public void testDeleteSecurityGroup() throws Exception {
-        DelegateExecution execution = mock(DelegateExecution.class);
-        final Network network = Network.builder().createNetwork();
-
-        Pool pool = mock(Pool.class);
-
-        when(pool.getProvider()).thenReturn(provider);
-        when(pool.getNetwork()).thenReturn(network);
-
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-
-        SecurityGroups.createSecurityGroup(context.getApi(), SECURITY_GROUP_NAME);
-
-        activity.execute(execution);
-
-        try {
-            SecurityGroups.getByName(context.getApi(), SECURITY_GROUP_NAME);
-            fail("Does not throw Exception as it should have");
-        } catch (NoSuchElementException e) {
-            LOG.info("Exception thrown. Test passed.");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureKeyPairExistsLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureKeyPairExistsLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureKeyPairExistsLiveTest.java
deleted file mode 100644
index faee9d4..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureKeyPairExistsLiveTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.access.AdminAccess;
-import com.axemblr.provisionr.api.pool.Pool;
-import com.axemblr.provisionr.cloudstack.core.KeyPairs;
-import com.axemblr.provisionr.cloudstack.ProcessVariables;
-import com.axemblr.provisionr.core.CoreProcessVariables;
-import java.io.IOException;
-import org.activiti.engine.delegate.DelegateExecution;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.domain.SshKeyPair;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class EnsureKeyPairExistsLiveTest extends CloudStackActivityLiveTest<EnsureKeyPairExists> {
-
-    public static final String TEST_KEY_FINGERPRINT = "15:0b:a4:43:dd:58:19:9e:84:ca:db:31:a8:6b:b6:c3";
-    private final String KEYPAIR_NAME = KeyPairs.formatNameFromBusinessKey(BUSINESS_KEY);
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        logKeyPairs();
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        context.getApi().getSSHKeyPairClient().deleteSSHKeyPair(KEYPAIR_NAME);
-        logKeyPairs();
-        super.tearDown();
-    }
-
-    @Test
-    public void testEnsureKeyPairExists() throws Exception {
-        final AdminAccess adminAccess = AdminAccess.builder()
-            .username("admin")
-            .publicKey(getResourceAsString("keys/test.pub"))
-            .privateKey(getResourceAsString("keys/test"))
-            .createAdminAccess();
-
-        DelegateExecution execution = mock(DelegateExecution.class);
-        Pool pool = mock(Pool.class);
-
-        when(pool.getProvider()).thenReturn(provider);
-        when(pool.getAdminAccess()).thenReturn(adminAccess);
-
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-
-        activity.execute(execution);
-        assertKeyPairWasImportedAsExpected();
-
-        /* the second call should just re-import the key */
-        activity.execute(execution);
-        assertKeyPairWasImportedAsExpected();
-    }
-
-    private void assertKeyPairWasImportedAsExpected() throws IOException {
-        SshKeyPair pair = context.getApi().getSSHKeyPairClient().getSSHKeyPair(KEYPAIR_NAME);
-        assertThat(pair.getFingerprint()).isEqualTo(TEST_KEY_FINGERPRINT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureNetworkExistsLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureNetworkExistsLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureNetworkExistsLiveTest.java
deleted file mode 100644
index b9a23bd..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureNetworkExistsLiveTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2013 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.pool.Pool;
-import com.axemblr.provisionr.cloudstack.NetworkOptions;
-import com.axemblr.provisionr.cloudstack.ProcessVariables;
-import com.axemblr.provisionr.cloudstack.core.Networks;
-import com.axemblr.provisionr.core.CoreProcessVariables;
-import com.axemblr.provisionr.test.ProcessVariablesCollector;
-import java.util.NoSuchElementException;
-import org.activiti.engine.delegate.DelegateExecution;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.CloudStackClient;
-import org.jclouds.cloudstack.domain.Network;
-import org.jclouds.cloudstack.features.NetworkClient;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EnsureNetworkExistsLiveTest extends CloudStackActivityLiveTest<EnsureNetworkExists> {
-
-    private final static Logger LOG = LoggerFactory.getLogger(EnsureNetworkExistsLiveTest.class);
-    private final String networkName = Networks.formatNameFromBusinessKey(BUSINESS_KEY);
-    private DelegateExecution execution;
-    private Pool pool;
-    private ProcessVariablesCollector collector;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        logNetworks();
-        initMocks();
-    }
-
-    private void initMocks() {
-        execution = mock(DelegateExecution.class);
-        pool = mock(Pool.class);
-
-        when(pool.getProvider()).thenReturn(provider);
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-        when(pool.getNetwork()).thenReturn(com.axemblr.provisionr.api.network.Network.builder()
-            .type("provided")
-            .createNetwork());
-        collector = new ProcessVariablesCollector();
-        collector.install(execution);
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        deleteNetworkIfExists();
-        logNetworks();
-        super.tearDown();
-    }
-
-    private void deleteNetworkIfExists() {
-        try {
-            Network network = Networks.getByName(context.getApi(), networkName);
-            // this will not wait for the network to be deleted. operation will fail if network is used.
-            context.getApi().getNetworkClient().deleteNetwork(network.getId());
-        } catch (NoSuchElementException e) {
-            LOG.info("Network {} does not exist", networkName);
-        }
-    }
-
-    @Test
-    public void testEnsureNetworkExistsByCreatingTheNetwork() throws Exception {
-        activity.execute(execution);
-
-        assertThat(collector.getVariable(ProcessVariables.NETWORK_ID)).isNotNull();
-
-        Network network = Networks.getByName(context.getApi(), networkName);
-        assertThat(network.getName()).isEqualToIgnoringCase(networkName);
-        String networkId = network.getId();
-        // second run should not create a new network
-        activity.execute(execution);
-
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-        network = Networks.getByName(context.getApi(), networkName);
-        assertThat(network.getId()).isEqualTo(networkId);
-    }
-
-    @Test
-    public void testEnsureNetworkExistsWithProvidedExistingNetwork() throws Exception {
-        final String networkId = "network-id-0123";
-        final CloudStackClient mockClient = mock(CloudStackClient.class);
-        final NetworkClient mockNetworkClient = mock(NetworkClient.class);
-        final Network mockNetwork = mock(Network.class);
-        final com.axemblr.provisionr.api.network.Network network = com.axemblr.provisionr.api.network.Network.builder()
-            .option(NetworkOptions.EXISTING_NETWORK_ID, networkId).createNetwork();
-
-        execution.setVariable(ProcessVariables.NETWORK_ID, networkId);
-
-        when(pool.getNetwork()).thenReturn(network);
-        when(mockClient.getNetworkClient()).thenReturn(mockNetworkClient);
-        when(mockNetworkClient.getNetwork(networkId)).thenReturn(mockNetwork);
-        when(mockNetwork.getId()).thenReturn(networkId);
-
-        activity.execute(mockClient, pool, execution);
-        assertThat(collector.getVariable(ProcessVariables.NETWORK_ID)).isEqualTo(networkId);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureSecurityGroupExistsLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureSecurityGroupExistsLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureSecurityGroupExistsLiveTest.java
deleted file mode 100644
index 6abcc16..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/EnsureSecurityGroupExistsLiveTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.network.Network;
-import com.axemblr.provisionr.api.network.Rule;
-import com.axemblr.provisionr.api.pool.Pool;
-import com.axemblr.provisionr.cloudstack.core.ConvertIngressRuleToRule;
-import com.axemblr.provisionr.cloudstack.core.SecurityGroups;
-import com.axemblr.provisionr.core.CoreProcessVariables;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import java.util.NoSuchElementException;
-import org.activiti.engine.delegate.DelegateExecution;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.domain.SecurityGroup;
-import static org.jclouds.cloudstack.options.ListSecurityGroupsOptions.Builder.named;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EnsureSecurityGroupExistsLiveTest extends CloudStackActivityLiveTest<EnsureSecurityGroupExists> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(EnsureSecurityGroupExistsLiveTest.class);
-
-    private final String SECURITY_GROUP_NAME = "network-" + BUSINESS_KEY;
-
-    private final ImmutableSet<Rule> ingressRules = ImmutableSet.of(
-        Rule.builder().anySource().icmp().createRule(),
-        Rule.builder().anySource().tcp().port(22).createRule(),
-        Rule.builder().anySource().udp().port(53).createRule());
-
-    private final Network network = Network.builder().ingress(ingressRules).createNetwork();
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        logSecurityGroupDetails();
-        deleteSecurityGroupIfExists();
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        deleteSecurityGroupIfExists();
-        logSecurityGroupDetails();
-        super.tearDown();
-    }
-
-    private void deleteSecurityGroupIfExists() {
-        try {
-            SecurityGroup securityGroup = Iterables.getOnlyElement(context.getApi()
-                .getSecurityGroupClient()
-                .listSecurityGroups(named(SECURITY_GROUP_NAME)));
-
-            context.getApi().getSecurityGroupClient().deleteSecurityGroup(securityGroup.getId());
-        } catch (NoSuchElementException e) {
-            LOG.info("Security group {} was not found", SECURITY_GROUP_NAME);
-        } catch (Exception e2) {
-            LOG.error("Exception deleting security group {}", e2);
-        }
-    }
-
-    @Test
-    public void testCreateSecurityGroup() throws Exception {
-        DelegateExecution execution = mock(DelegateExecution.class);
-        Pool pool = mock(Pool.class);
-
-        when(pool.getProvider()).thenReturn(provider);
-        when(pool.getNetwork()).thenReturn(network);
-
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-
-        activity.execute(execution);
-        assertSecurityGroupExistsWithRules(SecurityGroups.getByName(
-            context.getApi(), SECURITY_GROUP_NAME), ingressRules);
-    }
-
-    @Test
-    public void testCreateSecurityGroupWithExistingSecurityGroup() throws Exception {
-        DelegateExecution execution = mock(DelegateExecution.class);
-        Pool pool = mock(Pool.class);
-
-        when(pool.getProvider()).thenReturn(provider);
-
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-
-        // create the SecurityGroup with an extra Network Rule, then call the activity
-        when(pool.getNetwork()).thenReturn(network.toBuilder().addRules(
-            Rule.builder().anySource().tcp().port(80).createRule()).createNetwork());
-
-        activity.execute(execution);
-        // call the process again with the old network rules and check the rules
-        when(pool.getNetwork()).thenReturn(network);
-
-        activity.execute(execution);
-
-        assertSecurityGroupExistsWithRules(SecurityGroups.getByName(context.getApi(),
-            SECURITY_GROUP_NAME), ingressRules);
-    }
-
-    private void assertSecurityGroupExistsWithRules(SecurityGroup securityGroup, ImmutableSet<Rule> ingressRules) {
-        assertThat(ingressRules).containsAll(Iterables.transform(securityGroup.getIngressRules(),
-            ConvertIngressRuleToRule.FUNCTION));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/RunInstancesLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/RunInstancesLiveTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/RunInstancesLiveTest.java
deleted file mode 100644
index 02e7806..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/activities/RunInstancesLiveTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.activities;
-
-import com.axemblr.provisionr.api.access.AdminAccess;
-import com.axemblr.provisionr.api.hardware.Hardware;
-import com.axemblr.provisionr.api.network.Network;
-import com.axemblr.provisionr.api.network.Rule;
-import com.axemblr.provisionr.api.pool.Pool;
-import com.axemblr.provisionr.api.software.Software;
-import com.axemblr.provisionr.cloudstack.ProviderOptions;
-import com.axemblr.provisionr.cloudstack.core.VirtualMachines;
-import com.axemblr.provisionr.core.CoreProcessVariables;
-import com.google.common.collect.ImmutableMap;
-import java.util.Map;
-import org.activiti.engine.delegate.DelegateExecution;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RunInstancesLiveTest extends CloudStackActivityLiveTest<RunInstances> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(RunInstancesLiveTest.class);
-
-    private DelegateExecution execution;
-    private Pool pool;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        logSecurityGroupDetails();
-        logKeyPairs();
-        logVirtualMachines();
-        execution = mock(DelegateExecution.class);
-        pool = mock(Pool.class);
-
-        final AdminAccess adminAccess = AdminAccess.builder()
-            .username("admin")
-            .publicKey(getResourceAsString("keys/test.pub"))
-            .privateKey(getResourceAsString("keys/test"))
-            .createAdminAccess();
-
-        final Network network = Network.builder().addRules(
-            Rule.builder().anySource().tcp().port(22).createRule()).createNetwork();
-
-        final Hardware hardware = Hardware.builder().type(getProviderProperty("serviceOffering")).createHardware();
-        final Software software = Software.builder()
-            .imageId(getProviderProperty("templateId"))
-            .createSoftware();
-
-        Map<String, String> options = ImmutableMap.of(ProviderOptions.ZONE_ID,
-            getProviderProperty("zoneId"));
-
-        when(pool.getProvider()).thenReturn(provider);
-        when(pool.getAdminAccess()).thenReturn(adminAccess);
-        when(pool.getNetwork()).thenReturn(network);
-        when(pool.getHardware()).thenReturn(hardware);
-        when(pool.getSoftware()).thenReturn(software);
-        when(pool.getOptions()).thenReturn(options);
-
-        when(execution.getProcessBusinessKey()).thenReturn(BUSINESS_KEY);
-        when(execution.getVariable(CoreProcessVariables.POOL)).thenReturn(pool);
-
-        new EnsureSecurityGroupExists().execute(execution);
-        new EnsureKeyPairExists().execute(execution);
-    }
-
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        new DeleteKeyPair().execute(execution);
-        new DeleteSecurityGroup().execute(execution);
-
-        logSecurityGroupDetails();
-        logKeyPairs();
-        logVirtualMachines();
-        VirtualMachines.destroyAllVirtualMachineByName(context.getApi(), BUSINESS_KEY);
-        logVirtualMachines();
-        super.tearDown();
-    }
-
-    @Test
-    @Ignore
-    public void test() throws Exception {
-        activity.execute(execution);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/CommandTestSupport.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/CommandTestSupport.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/CommandTestSupport.java
deleted file mode 100644
index 696d808..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/CommandTestSupport.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.commands;
-
-import com.axemblr.provisionr.api.provider.Provider;
-import com.axemblr.provisionr.cloudstack.DefaultProviderConfig;
-import com.google.common.base.Optional;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import org.jclouds.cloudstack.CloudStackClient;
-import org.junit.Before;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-/**
- * Support class for CloudStack Karaf Command tests.
- */
-public class CommandTestSupport {
-
-    protected DefaultProviderConfig defaultProviderConfig;
-    protected ByteArrayOutputStream byteArrayOutputStream;
-    protected PrintStream out;
-    protected CloudStackClient client;
-
-    @Before
-    public void setUp() throws Exception {
-        defaultProviderConfig = mock(DefaultProviderConfig.class);
-        byteArrayOutputStream = new ByteArrayOutputStream();
-        out = new PrintStream(byteArrayOutputStream);
-        client = mock(CloudStackClient.class);
-        when(defaultProviderConfig.createProvider()).thenReturn(Optional.of(mock(Provider.class)));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/OfferingsCommandTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/OfferingsCommandTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/OfferingsCommandTest.java
deleted file mode 100644
index 4f00937..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/OfferingsCommandTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.commands;
-
-import com.google.common.collect.Sets;
-import java.util.Set;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.domain.DiskOffering;
-import org.jclouds.cloudstack.domain.NetworkOffering;
-import org.jclouds.cloudstack.domain.ServiceOffering;
-import org.jclouds.cloudstack.features.OfferingClient;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class OfferingsCommandTest extends CommandTestSupport {
-
-    final Set<ServiceOffering> serviceOfferings = Sets.newHashSet(ServiceOffering.builder()
-        .id("service-1")
-        .name("service-one")
-        .build());
-
-    final Set<DiskOffering> diskOfferings = Sets.newHashSet(DiskOffering.builder()
-        .id("disk-1")
-        .name("disk-one")
-        .build());
-
-    final Set<NetworkOffering> networkOfferings = Sets.newHashSet(NetworkOffering.builder()
-        .id("network-1")
-        .name("network-one")
-        .build());
-
-    @Test
-    public void testOfferingCommandWithNoOptionSpecified() throws Exception {
-        final OfferingsCommand offeringsCommand = new OfferingsCommand(defaultProviderConfig);
-        offeringsCommand.doExecuteWithContext(client, out);
-        out.close();
-        assertThat(byteArrayOutputStream.toString()).contains("No option specified");
-    }
-
-    @Test
-    public void testOfferingCommandsPrintsServiceOfferings() throws Exception {
-        final OfferingClient offeringClient = mock(OfferingClient.class);
-        when(client.getOfferingClient()).thenReturn(offeringClient);
-        when(offeringClient.listServiceOfferings()).thenReturn(serviceOfferings);
-
-        final OfferingsCommand offeringsCommand = new OfferingsCommand(defaultProviderConfig);
-        offeringsCommand.setServiceOffering(true);
-        offeringsCommand.doExecuteWithContext(client, out);
-        out.close();
-
-        assertThat(byteArrayOutputStream.toString())
-            .contains("service-1")
-            .contains("service-one")
-            .doesNotContain("No option");
-    }
-
-    @Test
-    public void testOfferingsCommandWithAllOptions() throws Exception {
-        final OfferingClient offeringClient = mock(OfferingClient.class);
-
-        when(client.getOfferingClient()).thenReturn(offeringClient);
-        when(offeringClient.listServiceOfferings()).thenReturn(serviceOfferings);
-        when(offeringClient.listDiskOfferings()).thenReturn(diskOfferings);
-        when(offeringClient.listNetworkOfferings()).thenReturn(networkOfferings);
-
-        final OfferingsCommand offeringsCommand = new OfferingsCommand(defaultProviderConfig);
-
-        offeringsCommand.setServiceOffering(true);
-        offeringsCommand.setDiskOffering(true);
-        offeringsCommand.setNetworkOffering(true);
-
-        offeringsCommand.doExecuteWithContext(client, out);
-
-        out.close();
-
-        assertThat(byteArrayOutputStream.toString())
-            .contains("service-1")
-            .contains("service-one")
-            .contains("disk-1")
-            .contains("network-1")
-            .doesNotContain("No option");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/TemplatesCommandTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/TemplatesCommandTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/TemplatesCommandTest.java
deleted file mode 100644
index 4b1e8ad..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/TemplatesCommandTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.commands;
-
-import com.google.common.collect.Sets;
-import java.util.Set;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.domain.Template;
-import org.jclouds.cloudstack.features.TemplateClient;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class TemplatesCommandTest extends CommandTestSupport {
-
-    final Set<Template> templates = Sets.newHashSet(Template.builder()
-        .id("template-1")
-        .name("template-one")
-        .build());
-
-    @Test
-    public void testTemplatesCommandPrintsTheTemplates() throws Exception {
-        final TemplatesCommand templatesCommand = new TemplatesCommand(defaultProviderConfig);
-        final TemplateClient templateClient = mock(TemplateClient.class);
-
-        when(client.getTemplateClient()).thenReturn(templateClient);
-        when(templateClient.listTemplates()).thenReturn(templates);
-
-        templatesCommand.doExecuteWithContext(client, out);
-        out.close();
-        assertThat(byteArrayOutputStream.toString()).contains("template-1").contains("template-one");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/ZonesCommandTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/ZonesCommandTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/ZonesCommandTest.java
deleted file mode 100644
index 472d156..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/commands/ZonesCommandTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.commands;
-
-import com.google.common.collect.Sets;
-import java.util.Set;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.domain.Zone;
-import org.jclouds.cloudstack.features.ZoneClient;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class ZonesCommandTest extends CommandTestSupport {
-
-    private final Set<Zone> zones = Sets.newHashSet(Zone.builder()
-        .id("zone-1")
-        .name("zone-one")
-        .securityGroupsEnabled(false)
-        .build());
-
-    @Test
-    public void testZonesCommandPrintsZones() throws Exception {
-        final ZonesCommand zonesCommand = new ZonesCommand(defaultProviderConfig);
-        final ZoneClient zoneClient = mock(ZoneClient.class);
-        when(client.getZoneClient()).thenReturn(zoneClient);
-        when(zoneClient.listZones()).thenReturn(zones);
-
-        zonesCommand.doExecuteWithContext(client, out);
-        out.close();
-
-        final String result = byteArrayOutputStream.toString();
-
-        assertThat(result)
-            .contains("zone-1")
-            .contains("zone-one")
-            .contains("false");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/ConversionsTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/ConversionsTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/ConversionsTest.java
deleted file mode 100644
index d0b87e8..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/ConversionsTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.core;
-
-import com.axemblr.provisionr.api.network.Protocol;
-import com.axemblr.provisionr.api.network.Rule;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.jclouds.cloudstack.domain.IngressRule;
-import org.junit.Test;
-
-public class ConversionsTest {
-
-    @Test
-    public void testConvertIngressRuleToRuleICMP() throws Exception {
-        final IngressRule ingressRule = IngressRule.builder()
-            .id("rule1")
-            .protocol("icmp")
-            .ICMPCode(SecurityGroups.DEFAULT_ICMP_CODE)
-            .ICMPType(SecurityGroups.DEFAULT_ICMP_TYPE)
-            .CIDR("10.0.0.0/24")
-            .build();
-
-        Rule rule = ConvertIngressRuleToRule.FUNCTION.apply(ingressRule);
-        assertThat(rule.getProtocol()).isEqualTo(Protocol.ICMP);
-        assertThat(rule.getCidr()).isEqualTo(ingressRule.getCIDR());
-    }
-
-    @Test
-    public void testConvertSinglePortRangeIngressRuleToRule() throws Exception {
-        final IngressRule ingressRule = IngressRule.builder()
-            .id("rule1")
-            .protocol("tcp")
-            .startPort(22)
-            .endPort(22)
-            .CIDR("0.0.0.1/24")
-            .build();
-
-        Rule rule = ConvertIngressRuleToRule.FUNCTION.apply(ingressRule);
-        assertThat(rule.getProtocol()).isEqualTo(Protocol.TCP);
-        assertThat(rule.getCidr()).isEqualTo(ingressRule.getCIDR());
-        assertThat(rule.getPorts().lowerEndpoint()).isEqualTo(ingressRule.getStartPort());
-        assertThat(rule.getPorts().upperEndpoint()).isEqualTo(ingressRule.getEndPort());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-provisionr/blob/6ba40c4b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/SecurityGroupsTest.java
----------------------------------------------------------------------
diff --git a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/SecurityGroupsTest.java b/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/SecurityGroupsTest.java
deleted file mode 100644
index 5c5b889..0000000
--- a/providers/cloudstack/src/test/java/com/axemblr/provisionr/cloudstack/core/SecurityGroupsTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L
- *
- * Licensed 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 com.axemblr.provisionr.cloudstack.core;
-
-import com.axemblr.provisionr.cloudstack.core.SecurityGroups;
-import static org.fest.assertions.api.Assertions.assertThat;
-import org.junit.Test;
-
-public class SecurityGroupsTest {
-
-    @Test
-    public void testSecurityNameFromBusinessProcessKey() throws Exception {
-        assertThat(SecurityGroups.formatNameFromBusinessKey("test")).isEqualTo("network-test");
-    }
-}