http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateVMGroupOptions.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateVMGroupOptions.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateVMGroupOptions.java
new file mode 100644
index 0000000..77097ac
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateVMGroupOptions.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.options;
+
+import org.jclouds.http.options.BaseHttpRequestOptions;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Options used to control updates to VMGroups
+ *
+ * @see <a
+ *      
href="http://download.cloud.com/releases/2.2.0/api/user/updateInstanceGroup.html";
+ *      />
+ */
+public class UpdateVMGroupOptions extends BaseHttpRequestOptions {
+
+   public static final UpdateVMGroupOptions NONE = new UpdateVMGroupOptions();
+
+   /**
+    * @param name new name of the VMGroup
+    */
+   public UpdateVMGroupOptions name(String name) {
+      this.queryParameters.replaceValues("name", ImmutableSet.of(name));
+      return this;
+   }
+
+   public static class Builder {
+      /**
+       * @see org.jclouds.cloudstack.options.UpdateVMGroupOptions#name
+       */
+      public static UpdateVMGroupOptions name(String name) {
+         UpdateVMGroupOptions options = new UpdateVMGroupOptions();
+         return options.name(name);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateZoneOptions.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateZoneOptions.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateZoneOptions.java
new file mode 100644
index 0000000..ab22e96
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/options/UpdateZoneOptions.java
@@ -0,0 +1,258 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.options;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.util.List;
+
+import org.jclouds.cloudstack.domain.AllocationState;
+import org.jclouds.http.options.BaseHttpRequestOptions;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Options used to control how a zone is updated
+ * 
+ * @see <a href=
+ *      
"http://download.cloud.com/releases/2.2.0/api_2.2.12/global_admin/updateZone.html";
+ *      />
+ */
+public class UpdateZoneOptions extends BaseHttpRequestOptions {
+
+   public static final UpdateZoneOptions NONE = new UpdateZoneOptions();
+
+   /**
+    * @param allocationState
+    *    allocation state of this Zone for allocation of new resources
+    */
+   public UpdateZoneOptions allocationState(AllocationState allocationState) {
+      this.queryParameters.replaceValues("allocationstate", 
ImmutableSet.of(allocationState.toString()));
+      return this;
+   }
+
+   /**
+    * @param details
+    *    the details for the Zone
+    */
+   public UpdateZoneOptions details(String details) {
+      this.queryParameters.replaceValues("details", ImmutableSet.of(details));
+      return this;
+   }
+
+   /**
+    * @param dhcpProvider
+    *    the dhcp Provider for the Zone
+    */
+   public UpdateZoneOptions dhcpProvider(String dhcpProvider) {
+      this.queryParameters.replaceValues("dhcpprovider", 
ImmutableSet.of(dhcpProvider));
+      return this;
+   }
+
+   /**
+    * @param externalDnsServers
+    *    the list of external DNS servers
+    */
+   public UpdateZoneOptions externalDns(List<String> externalDnsServers) {
+      checkArgument(externalDnsServers.size() == 1 || 
externalDnsServers.size() == 2,
+         "The list of DNS servers should have 1 or 2 elements");
+      this.queryParameters.replaceValues("dns1",
+         ImmutableSet.of(externalDnsServers.get(0)));
+      if (externalDnsServers.size() == 2) {
+         this.queryParameters.replaceValues("dns2",
+            ImmutableSet.of(externalDnsServers.get(1)));
+      }
+      return this;
+   }
+
+   /**
+    * @param internalDnsServers
+    *    the list of internal DNS for the Zone
+    */
+   public UpdateZoneOptions internalDns(List<String> internalDnsServers) {
+      checkArgument(internalDnsServers.size() == 1 || 
internalDnsServers.size() == 2,
+         "The list of internal DNS servers should have 1 or 2 elements");
+      this.queryParameters.replaceValues("internaldns1",
+         ImmutableSet.of(internalDnsServers.get(0)));
+      if (internalDnsServers.size() == 2) {
+         this.queryParameters.replaceValues("internaldns2",
+            ImmutableSet.of(internalDnsServers.get(1)));
+      }
+      return this;
+   }
+
+   /**
+    * @param dnsSearchOrder
+    *    the dns search order list
+    */
+   public UpdateZoneOptions dnsSearchOrder(String dnsSearchOrder) {
+      this.queryParameters.replaceValues("dnssearchorder", 
ImmutableSet.of(dnsSearchOrder));
+      return this;
+   }
+
+   /**
+    * @param domainName
+    *    network domain name for the networks in zone
+    */
+   public UpdateZoneOptions domainName(String domainName) {
+      this.queryParameters.replaceValues("domain", 
ImmutableSet.of(domainName));
+      return this;
+   }
+
+   /**
+    * @param guestCIDRAddress
+    *    the guest CIDR address for the Zone
+    */
+   public UpdateZoneOptions guestCIDRAddress(String guestCIDRAddress) {
+      this.queryParameters.replaceValues("guestcidraddress", 
ImmutableSet.of(guestCIDRAddress));
+      return this;
+   }
+
+   /**
+    * @param securityGroupEnabled
+    *    true if network is security group enabled, false otherwise
+    */
+   public UpdateZoneOptions securityGroupEnabled(boolean securityGroupEnabled) 
{
+      this.queryParameters.replaceValues("securitygroupenabled", 
ImmutableSet.of(securityGroupEnabled + ""));
+      return this;
+   }
+
+   /**
+    * You can only make a private Zone public, not the other way around
+    */
+   public UpdateZoneOptions makePublic() {
+      this.queryParameters.replaceValues("ispublic", ImmutableSet.of("true"));
+      return this;
+   }
+
+   /**
+    * @param name
+    *    the name of the Zone
+    */
+   public UpdateZoneOptions name(String name) {
+      this.queryParameters.replaceValues("name", ImmutableSet.of(name));
+      return this;
+   }
+
+   /**
+    * @param vlan
+    *    the VLAN for the Zone
+    */
+   public UpdateZoneOptions vlan(String vlan) {
+      this.queryParameters.replaceValues("vlan", ImmutableSet.of(vlan));
+      return this;
+   }
+
+   public static class Builder {
+
+      /**
+       * @see UpdateZoneOptions#allocationState
+       */
+      public static UpdateZoneOptions allocationState(AllocationState 
allocationState) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.allocationState(allocationState);
+      }
+
+      /**
+       * @see UpdateZoneOptions#details
+       */
+      public static UpdateZoneOptions details(String details) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.details(details);
+      }
+
+      /**
+       * @see UpdateZoneOptions#dhcpProvider
+       */
+      public static UpdateZoneOptions dhcpProvider(String dhcpProvider) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.dhcpProvider(dhcpProvider);
+      }
+
+      /**
+       * @see UpdateZoneOptions#externalDns
+       */
+      public static UpdateZoneOptions externalDns(List<String> 
externalDnsServers) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.externalDns(externalDnsServers);
+      }
+
+      /**
+       * @see UpdateZoneOptions#internalDns
+       */
+      public static UpdateZoneOptions internalDns(List<String> 
internalDnsServers) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.internalDns(internalDnsServers);
+      }
+
+      /**
+       * @see UpdateZoneOptions#dnsSearchOrder
+       */
+      public static UpdateZoneOptions dnsSearchOrder(String dnsSearchOrder) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.dnsSearchOrder(dnsSearchOrder);
+      }
+
+      /**
+       * @see UpdateZoneOptions#domainName
+       */
+      public static UpdateZoneOptions domainName(String domainName) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.domainName(domainName);
+      }
+
+      /**
+       * @see UpdateZoneOptions#guestCIDRAddress
+       */
+      public static UpdateZoneOptions guestCIDRAddress(String 
guestCIDRAddress) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.guestCIDRAddress(guestCIDRAddress);
+      }
+
+      /**
+       * @see UpdateZoneOptions#securityGroupEnabled
+       */
+      public static UpdateZoneOptions securityGroupEnabled(boolean 
securityGroupEnabled) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.securityGroupEnabled(securityGroupEnabled);
+      }
+
+      /**
+       * @see UpdateZoneOptions#makePublic
+       */
+      public static UpdateZoneOptions makePublic() {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.makePublic();
+      }
+
+      /**
+       * @see UpdateZoneOptions#name
+       */
+      public static UpdateZoneOptions name(String name) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.name(name);
+      }
+
+      /**
+       * @see UpdateZoneOptions#vlan
+       */
+      public static UpdateZoneOptions vlan(String vlan) {
+         UpdateZoneOptions options = new UpdateZoneOptions();
+         return options.vlan(vlan);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/CorrectHypervisorForZone.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/CorrectHypervisorForZone.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/CorrectHypervisorForZone.java
new file mode 100644
index 0000000..e518763
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/CorrectHypervisorForZone.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.Template;
+import org.jclouds.cloudstack.domain.Zone;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+
+/**
+ * Templates can be present in a zone, and available, but not valid for launch
+ * as their hypervisor isn't installed.
+ */
+@Singleton
+public class CorrectHypervisorForZone implements Function<String, 
Predicate<Template>> {
+   private final Supplier<Map<String, Set<String>>> hypervisorsSupplier;
+
+   @Inject
+   public CorrectHypervisorForZone(CloudStackApi client) {
+      this(Suppliers.ofInstance(new 
CloudStackApiToZoneToHypervisors().apply(checkNotNull(client, "client"))));
+   }
+
+   public CorrectHypervisorForZone(Supplier<Map<String, Set<String>>> 
hypervisorsSupplier) {
+      this.hypervisorsSupplier = checkNotNull(hypervisorsSupplier, 
"hypervisorsSupplier");
+   }
+
+   private static class CloudStackApiToZoneToHypervisors implements
+         Function<CloudStackApi, Map<String, Set<String>>> {
+
+      @Override
+      public Map<String, Set<String>> apply(CloudStackApi client) {
+         checkNotNull(client, "client");
+         Builder<String, Set<String>> builder = ImmutableMap.builder();
+         for (Zone zone : client.getZoneApi().listZones()) {
+            builder.put(zone.getId(), 
client.getHypervisorApi().listHypervisorsInZone(zone.getId()));
+         }
+         return builder.build();
+      }
+   }
+
+   @Override
+   public Predicate<Template> apply(final String zoneId) {
+
+      final Set<String> acceptableHypervisorsInZone;
+      try {
+         acceptableHypervisorsInZone = 
this.hypervisorsSupplier.get().get(zoneId);
+      } catch (NullPointerException e) {
+         throw new IllegalArgumentException("unknown zone: " + zoneId);
+      }
+      if (acceptableHypervisorsInZone.isEmpty())
+         return Predicates.alwaysFalse();
+      return new Predicate<Template>() {
+
+         @Override
+         public boolean apply(Template input) {
+            return 
Predicates.in(acceptableHypervisorsInZone).apply(input.getHypervisor());
+         }
+
+         @Override
+         public String toString() {
+            return "hypervisorsInZone(" + zoneId + ", " + 
acceptableHypervisorsInZone + ")";
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/JobComplete.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/JobComplete.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/JobComplete.java
new file mode 100644
index 0000000..3e45521
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/JobComplete.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.AsyncJobException;
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.AsyncJob;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * Tests to see if a job is in progress.
+ */
+@Singleton
+public class JobComplete implements Predicate<String> {
+
+   private final CloudStackApi client;
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public JobComplete(CloudStackApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(String jobId) {
+      logger.trace(">> looking for status on job %s", checkNotNull(jobId, 
"jobId"));
+      AsyncJob<?> job = refresh(jobId);
+      if (job == null) {
+         return false;
+      }
+      logger.trace("%s: looking for job status %s: currently: %s", 
job.getId(), 1, job.getStatus());
+      if (job.hasFailed()) {
+
+         throw new AsyncJobException(String.format("job %s failed with 
exception %s",
+            job.toString(), job.getError().toString()));
+      }
+      return job.hasSucceed();
+   }
+
+   private AsyncJob<?> refresh(String jobId) {
+      return client.getAsyncJobApi().getAsyncJob(jobId);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/LoadBalancerRuleActive.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/LoadBalancerRuleActive.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/LoadBalancerRuleActive.java
new file mode 100644
index 0000000..7d7abc9
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/LoadBalancerRuleActive.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.LoadBalancerRule;
+import org.jclouds.cloudstack.domain.LoadBalancerRule.State;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+
+/**
+ * 
+ * Tests to see if a LoadBalancerRule is active
+ */
+@Singleton
+public class LoadBalancerRuleActive implements Predicate<LoadBalancerRule> {
+
+   private final CloudStackApi client;
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public LoadBalancerRuleActive(CloudStackApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(LoadBalancerRule rule) {
+      logger.trace("looking for state on rule %s", checkNotNull(rule, "rule"));
+      rule = refresh(rule);
+      if (rule == null)
+         return false;
+      logger.trace("%s: looking for rule state %s: currently: %s", 
rule.getId(), State.ACTIVE, rule.getState());
+      return rule.getState() == State.ACTIVE;
+   }
+
+   private LoadBalancerRule refresh(LoadBalancerRule rule) {
+      return client.getLoadBalancerApi().getLoadBalancerRule(rule.getId());
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkOfferingPredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkOfferingPredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkOfferingPredicates.java
new file mode 100644
index 0000000..680afbd
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkOfferingPredicates.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Predicates.alwaysTrue;
+
+import org.jclouds.cloudstack.domain.GuestIPType;
+import org.jclouds.cloudstack.domain.NetworkOffering;
+import org.jclouds.cloudstack.domain.TrafficType;
+
+import com.google.common.base.Predicate;
+
+public class NetworkOfferingPredicates {
+
+   /**
+    * 
+    * @return true, if the offering supports creation of GuestVirtual Networks
+    */
+   public static Predicate<NetworkOffering> supportsGuestVirtualNetworks() {
+      return new Predicate<NetworkOffering>() {
+
+         @Override
+         public boolean apply(NetworkOffering arg0) {
+            return arg0.getTrafficType() == TrafficType.GUEST && 
arg0.getGuestIPType() == GuestIPType.VIRTUAL;
+         }
+
+         @Override
+         public String toString() {
+            return "supportsGuestVirtualNetworks()";
+         }
+      };
+   }
+
+   /**
+    * 
+    * @return always returns true.
+    */
+   public static Predicate<NetworkOffering> any() {
+      return alwaysTrue();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkPredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkPredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkPredicates.java
new file mode 100644
index 0000000..0b89bc4
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/NetworkPredicates.java
@@ -0,0 +1,265 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.cloudstack.domain.GuestIPType;
+import org.jclouds.cloudstack.domain.Network;
+import org.jclouds.cloudstack.domain.NetworkService;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
+
+public class NetworkPredicates {
+
+   public static enum HasFirewallServiceWhichSupportsStaticNAT implements 
Predicate<Network> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Network arg0) {
+         return Iterables.any(checkNotNull(arg0, "network").getServices(), 
supportsStaticNAT);
+      }
+
+      @Override
+      public String toString() {
+         return supportsStaticNAT.toString();
+      }
+   }
+
+   public static enum HasFirewallServiceWhichSupportsPortForwarding implements 
Predicate<Network> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Network arg0) {
+         return Iterables.any(checkNotNull(arg0, "network").getServices(), 
supportsPortForwarding);
+      }
+
+      @Override
+      public String toString() {
+         return supportsPortForwarding.toString();
+      }
+   }
+
+   public static enum HasLoadBalancerService implements Predicate<Network> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Network arg0) {
+         return Iterables.any(checkNotNull(arg0, "network").getServices(), 
isLoadBalancerService);
+      }
+
+      @Override
+      public String toString() {
+         return isLoadBalancerService.toString();
+      }
+   }
+
+   public static enum IsVirtualNetwork implements Predicate<Network> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Network arg0) {
+         boolean network = isVirtualNetwork.apply(checkNotNull(arg0, 
"network").getGuestIPType());
+         return network;
+      }
+
+      @Override
+      public String toString() {
+         return isVirtualNetwork.toString();
+      }
+   }
+    
+   public static enum IsSharedNetwork implements Predicate<Network> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Network arg0) {
+         boolean network = isSharedNetwork.apply(checkNotNull(arg0, 
"network").getGuestIPType());
+         return network;
+      }
+
+      @Override
+      public String toString() {
+         return isSharedNetwork.toString();
+      }
+   }
+
+   public static enum IsIsolatedNetwork implements Predicate<Network> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Network arg0) {
+         boolean network = isIsolatedNetwork.apply(checkNotNull(arg0, 
"network").getGuestIPType());
+         return network;
+      }
+
+      @Override
+      public String toString() {
+         return isIsolatedNetwork.toString();
+      }
+   }
+
+    
+   private static class DefaultNetworkInZone implements Predicate<Network> {
+      private final String zoneId;
+
+      public DefaultNetworkInZone(String zoneId) {
+         this.zoneId = zoneId;
+      }
+
+      @Override
+      public boolean apply(Network network) {
+         return network.getZoneId().equals(zoneId) && network.isDefault();
+      }
+   }
+
+   public static class NetworkServiceNamed implements 
Predicate<NetworkService> {
+      private final String name;
+
+      public NetworkServiceNamed(String name) {
+         this.name = checkNotNull(name, "name");
+      }
+
+      @Override
+      public boolean apply(NetworkService input) {
+         return name.equals(checkNotNull(input, "networkService").getName());
+      }
+
+      @Override
+      public String toString() {
+         return "networkServiceNamed(" + name + ")";
+      }
+   }
+
+   public static class GuestIPTypeIs implements Predicate<GuestIPType> {
+      private final GuestIPType guestIPType;
+
+      public GuestIPTypeIs(GuestIPType guestIPType) {
+         this.guestIPType = guestIPType;
+      }
+
+      @Override
+      public boolean apply(GuestIPType guestIPType) {
+         return guestIPType == this.guestIPType;
+      }
+
+      @Override
+      public String toString() {
+         return "guestIPTypeIs(" + guestIPType + ')';
+      }
+   }
+   
+   public static class CapabilitiesInclude implements 
Predicate<NetworkService> {
+      private final String capability;
+
+      public CapabilitiesInclude(String capability) {
+         this.capability = checkNotNull(capability, "capability");
+      }
+
+      @Override
+      public boolean apply(NetworkService input) {
+         return "true".equals(input.getCapabilities().get(capability));
+      }
+
+      @Override
+      public String toString() {
+         return "capabilitiesInclude(" + capability + ")";
+      }
+   }
+
+   public static final Predicate<NetworkService> supportsStaticNAT = 
Predicates.and(new NetworkServiceNamed("Firewall"),
+         new CapabilitiesInclude("StaticNat"));
+
+   public static final Predicate<NetworkService> supportsPortForwarding = 
Predicates.and(new NetworkServiceNamed("Firewall"),
+         new CapabilitiesInclude("PortForwarding"));
+
+   public static final Predicate<NetworkService> isLoadBalancerService = new 
NetworkServiceNamed("Lb");
+
+   public static final Predicate<GuestIPType> isVirtualNetwork = new 
GuestIPTypeIs(GuestIPType.VIRTUAL);
+
+   public static final Predicate<GuestIPType> isIsolatedNetwork = new 
GuestIPTypeIs(GuestIPType.ISOLATED);
+
+   public static final Predicate<GuestIPType> isSharedNetwork = new 
GuestIPTypeIs(GuestIPType.SHARED);
+
+   /**
+    * 
+    * @return true, if the network supports static NAT.
+    */
+   public static Predicate<Network> supportsStaticNAT() {
+      return HasFirewallServiceWhichSupportsStaticNAT.INSTANCE;
+   }
+
+   /**
+    * 
+    * @return true, if the network supports port forwarding.
+    */
+   public static Predicate<Network> supportsPortForwarding() {
+      return HasFirewallServiceWhichSupportsPortForwarding.INSTANCE;
+   }
+
+   /**
+    *
+    * @return true, if the network supports load balancing.
+    */
+   public static Predicate<Network> hasLoadBalancerService() {
+      return HasLoadBalancerService.INSTANCE;
+   }
+
+   /**
+    *
+    * @return true, if the network is a virtual network.
+    */
+   public static Predicate<Network> isVirtualNetwork() {
+      return IsVirtualNetwork.INSTANCE;
+   }
+
+   /**
+    *
+    * @return true, if the network is an isolated network.
+    */
+   public static Predicate<Network> isIsolatedNetwork() {
+      return IsIsolatedNetwork.INSTANCE;
+   }
+
+   /**
+    *
+    * @return true, if the network is a shared network.
+    */
+   public static Predicate<Network> isSharedNetwork() {
+      return IsSharedNetwork.INSTANCE;
+   }
+
+   /**
+    * Filters for default networks in a specific zone.
+    *
+    * @param zoneId the ID of the required zone.
+    * @return networks in the zone that have the default flag set.
+    */
+   public static Predicate<Network> defaultNetworkInZone(final String zoneId) {
+      return new DefaultNetworkInZone(zoneId);
+   }
+
+   /**
+    * 
+    * @return always returns true.
+    */
+   public static Predicate<Network> any() {
+      return Predicates.alwaysTrue();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/OSCategoryIn.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/OSCategoryIn.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/OSCategoryIn.java
new file mode 100644
index 0000000..48397d8
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/OSCategoryIn.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.OSType;
+import org.jclouds.cloudstack.domain.Template;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.Maps;
+
+@Singleton
+public class OSCategoryIn implements Function<Set<String>, 
Predicate<Template>> {
+   private final Supplier<Map<String, String>> categoriesSupplier;
+   private final Supplier<Set<OSType>> osTypesSupplier;
+
+   @Inject
+   public OSCategoryIn(CloudStackApi client) {
+      this(Suppliers.ofInstance(checkNotNull(client, 
"client").getGuestOSApi().listOSCategories()), Suppliers
+            .ofInstance(client.getGuestOSApi().listOSTypes()));
+   }
+
+   public OSCategoryIn(Supplier<Map<String, String>> categoriesSupplier, 
Supplier<Set<OSType>> osTypesSupplier) {
+      this.categoriesSupplier = checkNotNull(categoriesSupplier, 
"categoriesSupplier");
+      this.osTypesSupplier = checkNotNull(osTypesSupplier, "osTypesSupplier");
+   }
+
+   @Override
+   public Predicate<Template> apply(final Set<String> acceptableCategories) {
+      final Map<String, String> categories = categoriesSupplier.get();
+      final Set<String> acceptableOSTypeIds = Maps.filterValues(
+            Maps.transformValues(Maps.uniqueIndex(osTypesSupplier.get(), new 
Function<OSType, String>() {
+
+               @Override
+               public String apply(OSType input) {
+                  return input.getId();
+               }
+
+            }), new Function<OSType, String>() {
+
+               @Override
+               public String apply(OSType input) {
+                  return categories.get(input.getOSCategoryId());
+               }
+
+            }), Predicates.in(acceptableCategories)).keySet();
+      return new Predicate<Template>() {
+
+         @Override
+         public boolean apply(Template input) {
+            return 
Predicates.in(acceptableOSTypeIds).apply(input.getOSTypeId());
+         }
+
+         @Override
+         public String toString() {
+            return "OSCategoryIn(" + acceptableCategories + ")";
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/PublicIPAddressPredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/PublicIPAddressPredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/PublicIPAddressPredicates.java
new file mode 100644
index 0000000..a58ba47
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/PublicIPAddressPredicates.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.cloudstack.domain.PublicIPAddress;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+
+public class PublicIPAddressPredicates {
+
+   public static final class AssociatedWithNetwork implements 
Predicate<PublicIPAddress> {
+      private final String networkId;
+
+      public AssociatedWithNetwork(String networkId) {
+         this.networkId = checkNotNull(networkId, "networkId");
+      }
+
+      @Override
+      public boolean apply(PublicIPAddress input) {
+         return networkId.equals(checkNotNull(input, 
"ipaddress").getAssociatedNetworkId());
+      }
+
+      @Override
+      public String toString() {
+         return "associatedWithNetwork(" + networkId + ")";
+      }
+   }
+
+   public static enum Available implements Predicate<PublicIPAddress> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(PublicIPAddress arg0) {
+         return !checkNotNull(arg0, "ipaddress").isSourceNAT() && 
!arg0.isStaticNAT()
+               && arg0.getVirtualMachineId() == null && arg0.getState() == 
PublicIPAddress.State.ALLOCATED;
+      }
+
+      @Override
+      public String toString() {
+         return "available()";
+      }
+   }
+
+   /**
+    * 
+    * @return true, if the public ip address is not assigned to a VM or NAT 
rule
+    */
+   public static Predicate<PublicIPAddress> available() {
+      return Available.INSTANCE;
+   }
+
+   /**
+    * 
+    * @return true, if the public ip address is associated with the specified
+    *         network
+    */
+   public static Predicate<PublicIPAddress> associatedWithNetwork(final String 
networkId) {
+      return new AssociatedWithNetwork(networkId);
+   }
+
+   /**
+    * 
+    * @return always returns true.
+    */
+   public static Predicate<PublicIPAddress> any() {
+      return Predicates.alwaysTrue();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SecurityGroupPredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SecurityGroupPredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SecurityGroupPredicates.java
new file mode 100644
index 0000000..4796d01
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SecurityGroupPredicates.java
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Predicates.alwaysTrue;
+
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.IngressRule;
+import org.jclouds.cloudstack.domain.SecurityGroup;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Multimap;
+
+public class SecurityGroupPredicates {
+   /**
+    * 
+    * @return true, if the security group contains an ingress rule with the 
given port in the port range
+    */
+   public static Predicate<SecurityGroup> portInRange(final int port) {
+      return new Predicate<SecurityGroup>() {
+
+         @Override
+         public boolean apply(SecurityGroup group) {
+            return Iterables.any(group.getIngressRules(), new 
Predicate<IngressRule>() {
+                  @Override
+                  public boolean apply(IngressRule rule) {
+                     return rule.getStartPort() <= port && rule.getEndPort() 
>= port;
+                  }
+               });
+         }
+
+         @Override
+         public String toString() {
+            return "portInRange(" + port + ")";
+         }
+      };
+   }
+
+   /**
+    * 
+    * @return true, if the security group contains an ingress rule with the 
given cidr
+    */
+   public static Predicate<SecurityGroup> hasCidr(final String cidr) {
+      return new Predicate<SecurityGroup>() {
+
+         @Override
+         public boolean apply(SecurityGroup group) {
+            return Iterables.any(group.getIngressRules(), new 
Predicate<IngressRule>() {
+                  @Override
+                  public boolean apply(IngressRule rule) {
+                     return rule.getCIDR() != null
+                        && rule.getCIDR().equals(cidr);
+                  }
+               });
+         }
+
+         @Override
+         public String toString() {
+            return "hasCidr(" + cidr + ")";
+         }
+      };
+   }
+
+   /**
+    * 
+    * @return true, if the security group contains an ingress rule with the 
given cidr and the given port in range
+    */
+   public static Predicate<SecurityGroup> portInRangeForCidr(final int port, 
final String cidr) {
+      return new Predicate<SecurityGroup>() {
+
+         @Override
+         public boolean apply(SecurityGroup group) {
+            return Iterables.any(group.getIngressRules(), new 
Predicate<IngressRule>() {
+                  @Override
+                  public boolean apply(IngressRule rule) {
+                     return rule.getCIDR() != null
+                        && rule.getCIDR().equals(cidr)
+                        && rule.getStartPort() <= port
+                        && rule.getEndPort() >= port;
+                  }
+               });
+         }
+
+         @Override
+         public String toString() {
+            return "portInRangeForCidr(" + port + ", " + cidr + ")";
+         }
+      };
+   }
+
+   /**
+    * 
+    * @return always returns true.
+    */
+   public static Predicate<SecurityGroup> any() {
+      return alwaysTrue();
+   }
+
+   /**
+    * matches name of the given security group
+    * 
+    * @param name
+    * @return predicate that matches name
+    */
+   public static Predicate<SecurityGroup> nameEquals(final String name) {
+      checkNotNull(name, "name must be defined");
+
+      return new Predicate<SecurityGroup>() {
+         @Override
+         public boolean apply(SecurityGroup ext) {
+            return name.equals(ext.getName());
+         }
+
+         @Override
+         public String toString() {
+            return "nameEquals(" + name + ")";
+         }
+      };
+   }
+
+
+   /**
+    * matches name of the given security group
+    * 
+    * @param name
+    * @return predicate that matches name
+    */
+   public static Predicate<SecurityGroup> nameMatches(final Predicate<String> 
name) {
+      checkNotNull(name, "name must be defined");
+
+      return new Predicate<SecurityGroup>() {
+         @Override
+         public boolean apply(SecurityGroup ext) {
+            return name.apply(ext.getName());
+         }
+
+         @Override
+         public String toString() {
+            return "nameMatches(" + name + ")";
+         }
+      };
+   }
+
+   /**
+    * matches IngressRules with the given protocol, start and end port, and
+    * any of the given CIDRs.
+    *
+    * @param protocol
+    * @param startPort
+    * @param endPort
+    * @param cidrs
+    *
+    * @return predicate that matches as described
+    */
+   public static Predicate<IngressRule> ruleCidrMatches(final String protocol,
+                                                        final int startPort,
+                                                        final int endPort,
+                                                        final Set<String> 
cidrs) {
+      checkNotNull(protocol, "protocol");
+      checkNotNull(cidrs, "cidrs");
+
+      return new Predicate<IngressRule>() {
+         @Override
+         public boolean apply(IngressRule rule) {
+            return protocol.equals(rule.getProtocol())
+                    && startPort == rule.getStartPort()
+                    && endPort == rule.getEndPort()
+                    && cidrs.contains(rule.getCIDR());
+         }
+
+         @Override
+         public String toString() {
+            return "ruleCidrMatches(protocol:" + protocol
+                    + ",startPort:" + startPort
+                    + ",endPort:" + endPort
+                    + ",cidrs:[" + cidrs
+                    + "])";
+         }
+      };
+   }
+
+   /**
+    * matches IngressRules with the given protocol, start and end port, and
+    * any of the given account/security group name pairs.
+    *
+    * @param protocol
+    * @param startPort
+    * @param endPort
+    * @param accountGroupNames
+    *
+    * @return predicate that matches as described
+    */
+   public static Predicate<IngressRule> ruleGroupMatches(final String protocol,
+                                                         final int startPort,
+                                                         final int endPort,
+                                                         final 
Multimap<String, String> accountGroupNames) {
+      checkNotNull(protocol, "protocol");
+      checkNotNull(accountGroupNames, "accountGroupNames");
+
+      return new Predicate<IngressRule>() {
+         @Override
+         public boolean apply(IngressRule rule) {
+            return protocol.equals(rule.getProtocol())
+                    && startPort == rule.getStartPort()
+                    && endPort == rule.getEndPort()
+                    && accountGroupNames.containsEntry(rule.getAccount(), 
rule.getSecurityGroupName());
+         }
+
+         @Override
+         public String toString() {
+            return "ruleGroupMatches(protocol:" + protocol
+                    + ",startPort:" + startPort
+                    + ",endPort:" + endPort
+                    + ",accountGroupNames:[" + accountGroupNames
+                    + "])";
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SshKeyPairPredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SshKeyPairPredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SshKeyPairPredicates.java
new file mode 100644
index 0000000..72f34b0
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/SshKeyPairPredicates.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.cloudstack.domain.SshKeyPair;
+
+import com.google.common.base.Predicate;
+
+/**
+ * Predicates handy when working with SshKeyPairs
+ */
+
+public class SshKeyPairPredicates {
+
+
+   /**
+    * matches name of the given key pair
+    * 
+    * @param name
+    * @return predicate that matches name
+    */
+   public static Predicate<SshKeyPair> nameMatches(final Predicate<String> 
name) {
+      checkNotNull(name, "name must be defined");
+
+      return new Predicate<SshKeyPair>() {
+         @Override
+         public boolean apply(SshKeyPair ext) {
+            return name.apply(ext.getName());
+         }
+
+         @Override
+         public String toString() {
+            return "nameMatches(" + name + ")";
+         }
+      };
+   }
+   
+   /**
+    * matches name of the given keypair starts with the specified prefix
+    *
+    * @param name the prefix you are looking for
+    * @return the predicate
+    */
+   public static Predicate<SshKeyPair> nameEquals(final String name) {
+      checkNotNull(name, "name must be defined");
+
+      return new Predicate<SshKeyPair>() {
+         @Override
+         public boolean apply(SshKeyPair ext) {
+            return ext.getName() != null && ext.getName().equals(name);
+         }
+
+         @Override
+         public String toString() {
+            return "nameEquals(" + name + ")";
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/TemplatePredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/TemplatePredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/TemplatePredicates.java
new file mode 100644
index 0000000..341356c
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/TemplatePredicates.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.domain.Template;
+
+import com.google.common.base.Predicate;
+
+@Singleton
+public class TemplatePredicates {
+   public static Predicate<Template> isReady() {
+      return Ready.INSTANCE;
+   }
+
+   public enum Ready implements Predicate<Template> {
+      INSTANCE;
+      @Override
+      public boolean apply(Template arg0) {
+         return arg0.isReady();
+      }
+
+      @Override
+      public String toString() {
+         return "isReady()";
+      }
+   }
+
+   public static enum PasswordEnabled implements Predicate<Template> {
+      INSTANCE;
+
+      @Override
+      public boolean apply(Template arg0) {
+         return arg0.isPasswordEnabled();
+      }
+
+      @Override
+      public String toString() {
+         return "isPasswordEnabled()";
+      }
+   }
+
+   public static Predicate<Template> isPasswordEnabled() {
+      return PasswordEnabled.INSTANCE;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/UserPredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/UserPredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/UserPredicates.java
new file mode 100644
index 0000000..b278cde
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/UserPredicates.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.cloudstack.domain.Account;
+import org.jclouds.cloudstack.domain.User;
+import org.jclouds.cloudstack.domain.Account.Type;
+
+import com.google.common.base.Predicate;
+
+public class UserPredicates {
+
+   public static class ApiKeyEquals implements Predicate<User> {
+      private final String apiKey;
+
+      public ApiKeyEquals(String apiKey) {
+         this.apiKey = checkNotNull(apiKey, "apiKey");
+      }
+
+      @Override
+      public boolean apply(User input) {
+         return apiKey.equals(checkNotNull(input, "user").getApiKey());
+      }
+
+      @Override
+      public String toString() {
+         return "apiKeyEquals(" + apiKey + ")";
+      }
+   }
+
+   /**
+    * 
+    * @return true, if the user's apiKey is the following
+    */
+   public static Predicate<User> apiKeyEquals(String apiKey) {
+      return new ApiKeyEquals(apiKey);
+   }
+
+   /**
+    * 
+    * @return true, if the user's account type is the following
+    */
+   public static Predicate<User> accountTypeEquals(Account.Type type) {
+      return new AccountTypeEquals(type);
+   }
+
+   public static class AccountTypeEquals implements Predicate<User> {
+      public AccountTypeEquals(Type type) {
+         this.type = checkNotNull(type, "type");
+      }
+
+      private final Account.Type type;
+
+      @Override
+      public boolean apply(User input) {
+         return checkNotNull(input, "user").getAccountType() == type;
+      }
+
+      @Override
+      public String toString() {
+         return "accountTypeEquals(" + type + ")";
+      }
+   }
+
+   /**
+    *
+    * @return true, if the account has user privileges
+    */
+   public static Predicate<User> isUserAccount() {
+      return accountTypeEquals(Account.Type.USER);
+   }
+
+   /**
+    * @return true, is the user is a domain admin
+    */
+   public static Predicate<User> isDomainAdminAccount() {
+      return accountTypeEquals(Type.DOMAIN_ADMIN);
+   }
+
+   /**
+    * 
+    * @return true, if the user is a global admin
+    */
+   public static Predicate<User> isAdminAccount() {
+      return accountTypeEquals(Account.Type.ADMIN);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineDestroyed.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineDestroyed.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineDestroyed.java
new file mode 100644
index 0000000..7548e15
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineDestroyed.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.VirtualMachine;
+import org.jclouds.cloudstack.domain.VirtualMachine.State;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * Tests to see if a virtualMachine is running
+ */
+@Singleton
+public class VirtualMachineDestroyed implements Predicate<VirtualMachine> {
+
+   private final CloudStackApi client;
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public VirtualMachineDestroyed(CloudStackApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(VirtualMachine virtualMachine) {
+      logger.trace("looking for state on virtualMachine %s", 
checkNotNull(virtualMachine, "virtualMachine"));
+      virtualMachine = refresh(virtualMachine);
+      if (virtualMachine == null)
+         return true;
+      logger.trace("%s: looking for virtualMachine state %s: currently: %s", 
virtualMachine.getId(), State.DESTROYED,
+            virtualMachine.getState());
+      return virtualMachine.getState() == State.DESTROYED;
+   }
+
+   private VirtualMachine refresh(VirtualMachine virtualMachine) {
+      return 
client.getVirtualMachineApi().getVirtualMachine(virtualMachine.getId());
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineExpunged.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineExpunged.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineExpunged.java
new file mode 100644
index 0000000..daf3943
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineExpunged.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.VirtualMachine;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * Tests to see if a virtualMachine is expunged from the system
+ */
+@Singleton
+public class VirtualMachineExpunged implements Predicate<VirtualMachine> {
+
+   private final CloudStackApi client;
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public VirtualMachineExpunged(CloudStackApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(VirtualMachine virtualMachine) {
+      logger.trace("looking for state on virtualMachine %s", 
checkNotNull(virtualMachine, "virtualMachine"));
+      return refresh(virtualMachine) == null;
+   }
+
+   private VirtualMachine refresh(VirtualMachine virtualMachine) {
+      return 
client.getVirtualMachineApi().getVirtualMachine(virtualMachine.getId());
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineRunning.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineRunning.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineRunning.java
new file mode 100644
index 0000000..fe2c37e
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/VirtualMachineRunning.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.VirtualMachine;
+import org.jclouds.cloudstack.domain.VirtualMachine.State;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * Tests to see if a virtualMachine is running
+ */
+@Singleton
+public class VirtualMachineRunning implements Predicate<VirtualMachine> {
+
+   private final CloudStackApi client;
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Inject
+   public VirtualMachineRunning(CloudStackApi client) {
+      this.client = client;
+   }
+
+   public boolean apply(VirtualMachine virtualMachine) {
+      logger.trace("looking for state on virtualMachine %s", 
checkNotNull(virtualMachine, "virtualMachine"));
+      virtualMachine = refresh(virtualMachine);
+      if (virtualMachine == null)
+         return false;
+      logger.trace("%s: looking for virtualMachine state %s: currently: %s", 
virtualMachine.getId(), State.RUNNING,
+            virtualMachine.getState());
+      if (virtualMachine.getState() == State.ERROR)
+         throw new IllegalStateException("virtualMachine in error state: " + 
virtualMachine);
+      return virtualMachine.getState() == State.RUNNING;
+   }
+
+   private VirtualMachine refresh(VirtualMachine virtualMachine) {
+      return 
client.getVirtualMachineApi().getVirtualMachine(virtualMachine.getId());
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/ZonePredicates.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/ZonePredicates.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/ZonePredicates.java
new file mode 100644
index 0000000..ee44f69
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/predicates/ZonePredicates.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Predicates.alwaysTrue;
+
+import org.jclouds.cloudstack.domain.NetworkType;
+import org.jclouds.cloudstack.domain.Zone;
+
+import com.google.common.base.Predicate;
+
+public class ZonePredicates {
+   /**
+    * 
+    * @return true, if the zone supports {@link NetworkType.ADVANCED}
+    */
+   public static Predicate<Zone> supportsAdvancedNetworks() {
+      return new Predicate<Zone>() {
+
+         @Override
+         public boolean apply(Zone zone) {
+            return NetworkType.ADVANCED.equals(checkNotNull(zone, 
"zone").getNetworkType());
+         }
+
+         @Override
+         public String toString() {
+            return "supportsAdvancedNetworks()";
+         }
+      };
+   }
+
+   /**
+    * 
+    * @return true, if the zone supports security groups
+    */
+   public static Predicate<Zone> supportsSecurityGroups() {
+      return new Predicate<Zone>() {
+
+         @Override
+         public boolean apply(Zone input) {
+            return input.isSecurityGroupsEnabled();
+         }
+
+         @Override
+         public String toString() {
+            return "supportsSecurityGroups()";
+         }
+      };
+   }
+
+   /**
+    * 
+    * @return always returns true.
+    */
+   public static Predicate<Zone> any() {
+      return alwaysTrue();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/strategy/BlockUntilJobCompletesAndReturnResult.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/strategy/BlockUntilJobCompletesAndReturnResult.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/strategy/BlockUntilJobCompletesAndReturnResult.java
new file mode 100644
index 0000000..83008b8
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/strategy/BlockUntilJobCompletesAndReturnResult.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.strategy;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.AsyncCreateResponse;
+import org.jclouds.cloudstack.domain.AsyncJob;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+
+@Singleton
+public class BlockUntilJobCompletesAndReturnResult {
+   @Resource
+   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
+   protected Logger logger = Logger.NULL;
+   
+   private final CloudStackApi client;
+   private final Predicate<String> jobComplete;
+
+   @Inject
+   public BlockUntilJobCompletesAndReturnResult(CloudStackApi client, 
Predicate<String> jobComplete) {
+      this.client = checkNotNull(client, "client");
+      this.jobComplete = checkNotNull(jobComplete, "jobComplete");
+   }
+
+   /**
+    * 
+    * @param job
+    * @return result of the job's execution
+    * @throws ExecutionException
+    *            if the job contained an error
+    */
+   public <T> T apply(AsyncCreateResponse job) {
+      boolean completed = jobComplete.apply(job.getJobId());
+      logger.trace("<< job(%s) complete(%s)", job, completed);
+      AsyncJob<T> jobWithResult = client.getAsyncJobApi().<T> 
getAsyncJob(job.getJobId());
+      checkState(completed, "job %s failed to complete in time %s", 
job.getJobId(), jobWithResult);
+      if (jobWithResult.getError() != null)
+         throw new UncheckedExecutionException(String.format("job %s failed 
with exception %s", job.getJobId(),
+               jobWithResult.getError().toString())) {
+         };
+      return jobWithResult.getResult();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/GetCurrentUser.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/GetCurrentUser.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/GetCurrentUser.java
new file mode 100644
index 0000000..8f65ab1
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/GetCurrentUser.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.suppliers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.NoSuchElementException;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.User;
+import org.jclouds.cloudstack.predicates.UserPredicates;
+import org.jclouds.domain.Credentials;
+import org.jclouds.location.Provider;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Iterables;
+
+public class GetCurrentUser implements Supplier<User> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   private final CloudStackApi client;
+   private final Supplier<Credentials> creds;
+
+   @Inject
+   public GetCurrentUser(CloudStackApi client, @Provider Supplier<Credentials> 
creds) {
+      this.client = checkNotNull(client, "client");
+      this.creds = checkNotNull(creds, "creds");
+   }
+
+   @Override
+   public User get() {
+      Iterable<User> users = 
Iterables.concat(client.getAccountApi().listAccounts());
+      Predicate<User> apiKeyMatches = 
UserPredicates.apiKeyEquals(creds.get().identity);
+      User currentUser = null;
+      try {
+         currentUser = Iterables.find(users, apiKeyMatches);
+      } catch (NoSuchElementException e) {
+         throw new NoSuchElementException(String.format("none of the following 
users match %s: %s", apiKeyMatches,
+               users));
+      }
+
+      return currentUser;
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/NetworksForCurrentUser.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/NetworksForCurrentUser.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/NetworksForCurrentUser.java
new file mode 100644
index 0000000..8ed3d50
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/NetworksForCurrentUser.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.suppliers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static 
org.jclouds.cloudstack.options.ListNetworksOptions.Builder.accountInDomain;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.Network;
+import org.jclouds.cloudstack.domain.User;
+import org.jclouds.cloudstack.features.NetworkApi;
+import org.jclouds.collect.Memoized;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Maps;
+
+public class NetworksForCurrentUser implements Supplier<Map<String, Network>> {
+   private final CloudStackApi client;
+   private final Supplier<User> currentUserSupplier;
+
+   @Inject
+   public NetworksForCurrentUser(CloudStackApi client, @Memoized 
Supplier<User> currentUserSupplier) {
+      this.client = checkNotNull(client, "client");
+      this.currentUserSupplier = checkNotNull(currentUserSupplier, 
"currentUserSupplier");
+   }
+
+   @Override
+   public Map<String, Network> get() {
+      User currentUser = currentUserSupplier.get();
+      NetworkApi networkClient = client.getNetworkApi();
+      return Maps.uniqueIndex(
+            
networkClient.listNetworks(accountInDomain(currentUser.getAccount(), 
currentUser.getDomainId())),
+            new Function<Network, String>() {
+
+               @Override
+               public String apply(Network arg0) {
+                  return arg0.getId();
+               }
+            });
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ProjectsForCurrentUser.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ProjectsForCurrentUser.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ProjectsForCurrentUser.java
new file mode 100644
index 0000000..ecfebf3
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ProjectsForCurrentUser.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.suppliers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static 
org.jclouds.cloudstack.options.ListProjectsOptions.Builder.accountInDomain;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.Project;
+import org.jclouds.cloudstack.domain.User;
+import org.jclouds.cloudstack.features.ProjectApi;
+import org.jclouds.collect.Memoized;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Maps;
+
+public class ProjectsForCurrentUser implements Supplier<Map<String, Project>> {
+   private final CloudStackApi api;
+   private final Supplier<User> currentUserSupplier;
+
+   @Inject
+   public ProjectsForCurrentUser(CloudStackApi api, @Memoized Supplier<User> 
currentUserSupplier) {
+      this.api = checkNotNull(api, "api");
+      this.currentUserSupplier = checkNotNull(currentUserSupplier, 
"currentUserSupplier");
+   }
+
+   @Override
+   public Map<String, Project> get() {
+      User currentUser = currentUserSupplier.get();
+      ProjectApi projectApi = api.getProjectApi();
+      return Maps.uniqueIndex(
+            projectApi.listProjects(accountInDomain(currentUser.getAccount(), 
currentUser.getDomainId())),
+            new Function<Project, String>() {
+
+               @Override
+               public String apply(Project arg0) {
+                  return arg0.getId();
+               }
+            });
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ZoneIdToZoneSupplier.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ZoneIdToZoneSupplier.java
 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ZoneIdToZoneSupplier.java
new file mode 100644
index 0000000..4485d01
--- /dev/null
+++ 
b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/main/java/org/jclouds/cloudstack/suppliers/ZoneIdToZoneSupplier.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.cloudstack.suppliers;
+
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Named;
+
+import org.jclouds.cloudstack.domain.Zone;
+
+import com.google.common.base.Supplier;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.inject.Inject;
+
+/**
+ * Supplies a cache that maps from zone IDs to zones.
+ */
+public class ZoneIdToZoneSupplier implements Supplier<LoadingCache<String, 
Zone>> {
+   private final LoadingCache<String, Zone> cache;
+
+   @Inject
+   public ZoneIdToZoneSupplier(CacheLoader<String, Zone> zoneIdToZone, 
@Named(PROPERTY_SESSION_INTERVAL) long expirationSecs) {
+      cache = CacheBuilder.newBuilder().expireAfterWrite(expirationSecs, 
TimeUnit.SECONDS).build(zoneIdToZone);
+   }
+
+   @Override
+   public LoadingCache<String, Zone> get() {
+      return cache;
+   }
+}

Reply via email to