JCLOUDS-215 Add autoscale examples
diff --git a/rackspace/pom.xml b/rackspace/pom.xml
index 705bec6..a23d96a 100644
--- a/rackspace/pom.xml
+++ b/rackspace/pom.xml
@@ -106,6 +106,18 @@
     	<version>${jclouds.version}</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.jclouds.labs</groupId>
+      <artifactId>rackspace-autoscale</artifactId>
+      <!-- <version>${jclouds.version}</version>  -->
+      <version>1.7.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jclouds.labs</groupId>
+      <artifactId>rackspace-autoscale-us</artifactId>
+      <!-- <version>${jclouds.version}</version>  -->
+      <version>1.7.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
     	<groupId>mysql</groupId>
     	<artifactId>mysql-connector-java</artifactId>
     	<version>5.1.25</version>
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
index d78741e..e711831 100644
--- a/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
@@ -26,6 +26,7 @@
 import org.jclouds.examples.rackspace.cloudloadbalancers.*;
 import org.jclouds.examples.rackspace.cloudservers.*;
 import org.jclouds.examples.rackspace.clouddatabases.*;
+import org.jclouds.examples.rackspace.autoscale.*;
 
 /**
  * This example smoke tests all of the other examples in these packages.
@@ -104,5 +105,11 @@
       DeleteDatabase.main(args);
       DeleteUser.main(args);
       DeleteInstance.main(args);
+
+      CreatePolicy.main(args);
+      UpdatePolicy.main(args);
+      CreateWebhook.main(args);
+      ExecuteWebhook.main(args);
+      AutoscaleCleanup.main(args);
    }
 }
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/AutoscaleCleanup.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/AutoscaleCleanup.java
new file mode 100644
index 0000000..7e069cd
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/AutoscaleCleanup.java
@@ -0,0 +1,133 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+import static org.jclouds.examples.rackspace.autoscale.Constants.NAME;
+import static org.jclouds.examples.rackspace.autoscale.Constants.PROVIDER;
+import static org.jclouds.examples.rackspace.autoscale.Constants.ZONE;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.rackspace.autoscale.v1.AutoscaleApi;
+import org.jclouds.rackspace.autoscale.v1.domain.GroupState;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy.ScalingPolicyTargetType;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy.ScalingPolicyType;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicyResponse;
+import org.jclouds.rackspace.autoscale.v1.features.GroupApi;
+import org.jclouds.rackspace.autoscale.v1.features.PolicyApi;
+
+import com.google.common.io.Closeables;
+import com.google.common.util.concurrent.Uninterruptibles;
+
+/**
+ * This code cleans up the autoscale examples and can be used as an example for cleanup and delete.
+ * Note that you need to cleanup the group before you can delete it.
+ *
+ * @author Zack Shoylev
+ */
+public class AutoscaleCleanup implements Closeable {
+   private final AutoscaleApi autoscaleApi;
+   private final GroupApi groupApi;
+
+   /**
+    * To get a username and API key see
+    * http://www.jclouds.org/documentation/quickstart/rackspace/
+    *
+    * The first argument (args[0]) must be your username
+    * The second argument (args[1]) must be your API key
+    */
+   public static void main(String[] args) throws IOException {
+      AutoscaleCleanup autoscaleCleanup = new AutoscaleCleanup(args[0], args[1]);
+
+      try {
+         autoscaleCleanup.autoscaleCleanup();
+      }
+      catch (Exception e) {
+         e.printStackTrace();
+      }
+      finally {
+         autoscaleCleanup.close();
+      }
+   }
+
+   public AutoscaleCleanup(String username, String apiKey) {
+      autoscaleApi = ContextBuilder.newBuilder(PROVIDER)
+            .credentials(username, apiKey)
+            .buildApi(AutoscaleApi.class);
+
+      groupApi = autoscaleApi.getGroupApiForZone(ZONE);
+   }
+
+   private void autoscaleCleanup() {
+      System.out.format("Cleanup autoscale %n");
+
+      // Remove ALL policies and groups with that name
+      for (GroupState g : groupApi.listGroupStates()) {
+         PolicyApi pa = autoscaleApi.getPolicyApiForZoneAndGroup(ZONE, g.getId());
+         for(ScalingPolicyResponse p : pa.list()) {
+            if(p.getName().equals(NAME)) {
+               System.out.format("Found matching policy: %s with cooldown %s%n", p.getId(), p.getCooldown());
+               String policyId = p.getId();
+
+               if (!(p.getTarget().equals("0") && p.getTargetType().equals(ScalingPolicyTargetType.DESIRED_CAPACITY))) {
+                  System.out.format("Removing servers %n");
+                  
+                  // Update policy to 0 servers
+                  ScalingPolicy scalingPolicy = ScalingPolicy.builder()
+                        .cooldown(3)
+                        .type(ScalingPolicyType.WEBHOOK)
+                        .name(NAME)
+                        .targetType(ScalingPolicyTargetType.DESIRED_CAPACITY)
+                        .target("0")
+                        .build();
+   
+                  pa.update(policyId, scalingPolicy);
+                  Uninterruptibles.sleepUninterruptibly(5, TimeUnit.SECONDS);
+   
+                  try {
+                     pa.execute(policyId);
+                  } catch (Exception e) {
+                     // This will fail to execute when the number of servers is already zero (no change).
+                  }
+               }
+               Uninterruptibles.sleepUninterruptibly(5, TimeUnit.SECONDS);
+               pa.delete(policyId);
+               groupApi.delete(g.getId());
+            } else {
+               System.out.format("Found another policy: %s - %s with cooldown %s%n", p.getName(), p.getId(), p.getCooldown());
+            }
+         }
+      }
+      
+   }
+
+   /**
+    * Always close your service when you're done with it.
+    *
+    * Note that closing quietly like this is not necessary in Java 7.
+    * You would use try-with-resources in the main method instead.
+    */
+   public void close() throws IOException {
+      Closeables.close(autoscaleApi, true);
+   }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/Constants.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/Constants.java
new file mode 100644
index 0000000..8d6413f
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/Constants.java
@@ -0,0 +1,34 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+/**
+ * Constants used by the Rackspace Examples.
+ * 
+ * @author Zack Shoylev
+ */
+public interface Constants {
+   // The provider configures jclouds to use the Rackspace Cloud (US).
+   // To use the Rackspace Cloud (UK) set the system property or default value to "rackspace-autoscale-uk".
+   // Note that autoscale is not yet supported for the UK.
+   public static final String PROVIDER = System.getProperty("provider.autoscale", "rackspace-autoscale-us");
+   public static final String ZONE = System.getProperty("zone", "DFW");
+
+   public static final String NAME = "jclouds-example";
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/CreatePolicy.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/CreatePolicy.java
new file mode 100644
index 0000000..c277e40
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/CreatePolicy.java
@@ -0,0 +1,137 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+import static org.jclouds.examples.rackspace.autoscale.Constants.NAME;
+import static org.jclouds.examples.rackspace.autoscale.Constants.PROVIDER;
+import static org.jclouds.examples.rackspace.autoscale.Constants.ZONE;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.List;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.rackspace.autoscale.v1.AutoscaleApi;
+import org.jclouds.rackspace.autoscale.v1.domain.Group;
+import org.jclouds.rackspace.autoscale.v1.domain.GroupConfiguration;
+import org.jclouds.rackspace.autoscale.v1.domain.LaunchConfiguration;
+import org.jclouds.rackspace.autoscale.v1.domain.LaunchConfiguration.LaunchConfigurationType;
+import org.jclouds.rackspace.autoscale.v1.domain.LoadBalancer;
+import org.jclouds.rackspace.autoscale.v1.domain.Personality;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy.ScalingPolicyTargetType;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy.ScalingPolicyType;
+import org.jclouds.rackspace.autoscale.v1.features.GroupApi;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.io.Closeables;
+
+/**
+ * This example creates a Scaling Policy in a Scaling Group.
+ *
+ * The scaling group contains a set of scaling policies.
+ * Each scaling policy can have webhooks associated to it.
+ * Webhooks can be used to execute scaling policies.
+ *
+ * @author Zack Shoylev
+ */
+public class CreatePolicy implements Closeable {
+   private final AutoscaleApi autoscaleApi;
+   private final GroupApi groupApi;
+
+   /**
+    * To get a username and API key see
+    * http://www.jclouds.org/documentation/quickstart/rackspace/
+    *
+    * The first argument (args[0]) must be your username
+    * The second argument (args[1]) must be your API key
+    */
+   public static void main(String[] args) throws IOException {
+      CreatePolicy createPolicy = new CreatePolicy(args[0], args[1]);
+
+      try {
+         createPolicy.createPolicy();
+      }
+      catch (Exception e) {
+         e.printStackTrace();
+      }
+      finally {
+         createPolicy.close();
+      }
+   }
+
+   public CreatePolicy(String username, String apiKey) {
+      autoscaleApi = ContextBuilder.newBuilder(PROVIDER)
+            .credentials(username, apiKey)
+            .buildApi(AutoscaleApi.class);
+
+      groupApi = autoscaleApi.getGroupApiForZone(ZONE);
+   }   
+
+   private void createPolicy() {
+      System.out.format("Create Autoscale Group%n");
+
+      GroupConfiguration groupConfiguration = GroupConfiguration.builder()
+            .maxEntities(5)
+            .cooldown(2)
+            .name(NAME)
+            .minEntities(0)
+            .metadata(ImmutableMap.of("notes","This is an autoscale group for examples"))
+            .build();
+
+      LaunchConfiguration launchConfiguration = LaunchConfiguration.builder()
+            .loadBalancers(ImmutableList.of(LoadBalancer.builder().port(8080).id(9099).build()))
+            .serverName(NAME)
+            .serverImageRef("0d589460-f177-4b0f-81c1-8ab8903ac7d8")
+            .serverFlavorRef("2")
+            .serverDiskConfig("AUTO")
+            .serverMetadata(ImmutableMap.of("notes","Server examples notes"))
+            .networks(ImmutableList.<String>of("internal", "public"))
+            .personalities(ImmutableList.of(Personality.builder().path("filepath").contents("VGhpcyBpcyBhIHRlc3QgZmlsZS4=").build()))
+            .type(LaunchConfigurationType.LAUNCH_SERVER)
+            .build();
+
+      List<ScalingPolicy> scalingPolicies = Lists.newArrayList();
+
+      ScalingPolicy scalingPolicy = ScalingPolicy.builder()
+            .cooldown(0)
+            .type(ScalingPolicyType.WEBHOOK)
+            .name(NAME)
+            .targetType(ScalingPolicyTargetType.PERCENT_CHANGE)
+            .target("1")
+            .build();
+      scalingPolicies.add(scalingPolicy);
+
+      Group g = groupApi.create(groupConfiguration, launchConfiguration, scalingPolicies);
+
+      System.out.format("  %s%n", g.toString());
+   }
+
+   /**
+    * Always close your service when you're done with it.
+    *
+    * Note that closing quietly like this is not necessary in Java 7.
+    * You would use try-with-resources in the main method instead.
+    */
+   public void close() throws IOException {
+      Closeables.close(autoscaleApi, true);
+   }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/CreateWebhook.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/CreateWebhook.java
new file mode 100644
index 0000000..4a19def
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/CreateWebhook.java
@@ -0,0 +1,100 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+import static org.jclouds.examples.rackspace.autoscale.Constants.NAME;
+import static org.jclouds.examples.rackspace.autoscale.Constants.PROVIDER;
+import static org.jclouds.examples.rackspace.autoscale.Constants.ZONE;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.rackspace.autoscale.v1.AutoscaleApi;
+import org.jclouds.rackspace.autoscale.v1.domain.WebhookResponse;
+import org.jclouds.rackspace.autoscale.v1.features.GroupApi;
+import org.jclouds.rackspace.autoscale.v1.features.PolicyApi;
+import org.jclouds.rackspace.autoscale.v1.features.WebhookApi;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.io.Closeables;
+
+/**
+ * This example creates a webhook for the Scaling Policy.
+ *
+ * @author Zack Shoylev
+ */
+public class CreateWebhook implements Closeable {
+   private final AutoscaleApi autoscaleApi;
+   private final GroupApi groupApi;
+   private final PolicyApi policyApi;
+   private final WebhookApi webhookApi;
+
+   /**
+    * To get a username and API key see
+    * http://www.jclouds.org/documentation/quickstart/rackspace/
+    *
+    * The first argument (args[0]) must be your username
+    * The second argument (args[1]) must be your API key
+    */
+   public static void main(String[] args) throws IOException {
+      CreateWebhook createWebhook = new CreateWebhook(args[0], args[1]);
+
+      try {
+         createWebhook.createWebhook();
+      }
+      catch (Exception e) {
+         e.printStackTrace();
+      }
+      finally {
+         createWebhook.close();
+      }
+   }
+
+   public CreateWebhook(String username, String apiKey) {
+      autoscaleApi = ContextBuilder.newBuilder(PROVIDER)
+            .credentials(username, apiKey)
+            .buildApi(AutoscaleApi.class);
+
+      groupApi = autoscaleApi.getGroupApiForZone(ZONE);
+      String groupId = Utils.getGroupId(groupApi);
+      policyApi = autoscaleApi.getPolicyApiForZoneAndGroup(groupId, ZONE);
+      String policyId = Utils.getPolicyId(policyApi);
+      webhookApi = autoscaleApi.getWebhookApiForZoneAndGroupAndPolicy(ZONE, groupId, policyId);
+   }
+
+   private void createWebhook() {
+      System.out.format("Create Webhook%n");
+
+      FluentIterable<WebhookResponse> result = webhookApi.create(NAME, ImmutableMap.<String, Object>of());
+
+      System.out.format("  %s%n", result.first().get());
+   }
+
+   /**
+    * Always close your service when you're done with it.
+    *
+    * Note that closing quietly like this is not necessary in Java 7.
+    * You would use try-with-resources in the main method instead.
+    */
+   public void close() throws IOException {
+      Closeables.close(autoscaleApi, true);
+   }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/ExecuteWebhook.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/ExecuteWebhook.java
new file mode 100644
index 0000000..8f68398
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/ExecuteWebhook.java
@@ -0,0 +1,116 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+import static org.jclouds.examples.rackspace.autoscale.Constants.PROVIDER;
+import static org.jclouds.examples.rackspace.autoscale.Constants.ZONE;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.rackspace.autoscale.v1.AutoscaleApi;
+import org.jclouds.rackspace.autoscale.v1.domain.WebhookResponse;
+import org.jclouds.rackspace.autoscale.v1.features.GroupApi;
+import org.jclouds.rackspace.autoscale.v1.features.PolicyApi;
+import org.jclouds.rackspace.autoscale.v1.features.WebhookApi;
+import org.jclouds.rackspace.autoscale.v1.utils.AutoscaleUtils;
+
+import com.google.common.io.Closeables;
+import com.google.common.util.concurrent.Uninterruptibles;
+
+/**
+ * This example executes a scaling policy in two ways: 
+ * - Authenticated API call using jclouds.
+ * - Anonymously using just the webhook URL.
+ *
+ * @author Zack Shoylev
+ */
+public class ExecuteWebhook implements Closeable {
+   private final AutoscaleApi autoscaleApi;
+   private final GroupApi groupApi;
+   private final PolicyApi policyApi;
+   private final WebhookApi webhookApi;
+
+   /**
+    * To get a username and API key see
+    * http://www.jclouds.org/documentation/quickstart/rackspace/
+    *
+    * The first argument (args[0]) must be your username
+    * The second argument (args[1]) must be your API key
+    */
+   public static void main(String[] args) throws IOException {
+      ExecuteWebhook executeWebhook = new ExecuteWebhook(args[0], args[1]);
+
+      try {
+         executeWebhook.executeWebhook();
+      }
+      catch (Exception e) {
+         e.printStackTrace();
+      }
+      finally {
+         executeWebhook.close();
+      }
+   }
+
+   public ExecuteWebhook(String username, String apiKey) {
+      autoscaleApi = ContextBuilder.newBuilder(PROVIDER)
+            .credentials(username, apiKey)
+            .buildApi(AutoscaleApi.class);
+
+      groupApi = autoscaleApi.getGroupApiForZone(ZONE);
+      String groupId = Utils.getGroupId(groupApi);
+      policyApi = autoscaleApi.getPolicyApiForZoneAndGroup(ZONE, groupId);
+      String policyId = Utils.getPolicyId(policyApi);
+      webhookApi = autoscaleApi.getWebhookApiForZoneAndGroupAndPolicy(ZONE, groupId, policyId);
+   }
+
+   private void executeWebhook() {
+      System.out.format("Execute Webhook%n");
+
+      String policyId = Utils.getPolicyId(policyApi);
+
+      Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS);
+      boolean result = policyApi.execute(policyId);
+
+      System.out.format("  %s%n", result);
+
+      System.out.format("Execute Webhook - again, anonymously%n");
+
+      WebhookResponse webhook = webhookApi.list().first().get();
+      try {
+         result = AutoscaleUtils.execute(webhook.getAnonymousExecutionURI().get());
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+
+      System.out.format("  %s%n", result);
+   }
+
+   /**
+    * Always close your service when you're done with it.
+    *
+    * Note that closing quietly like this is not necessary in Java 7.
+    * You would use try-with-resources in the main method instead.
+    */
+   public void close() throws IOException {
+      Closeables.close(autoscaleApi, true);
+   }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/UpdatePolicy.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/UpdatePolicy.java
new file mode 100644
index 0000000..0d94097
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/UpdatePolicy.java
@@ -0,0 +1,106 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+import static org.jclouds.examples.rackspace.autoscale.Constants.NAME;
+import static org.jclouds.examples.rackspace.autoscale.Constants.PROVIDER;
+import static org.jclouds.examples.rackspace.autoscale.Constants.ZONE;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.rackspace.autoscale.v1.AutoscaleApi;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy.ScalingPolicyTargetType;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy.ScalingPolicyType;
+import org.jclouds.rackspace.autoscale.v1.features.GroupApi;
+import org.jclouds.rackspace.autoscale.v1.features.PolicyApi;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example updates a Scaling Policy in a Scaling Group.
+ *
+ * @author Zack Shoylev
+ */
+public class UpdatePolicy implements Closeable {
+   private final AutoscaleApi autoscaleApi;
+   private final GroupApi groupApi;
+   private final PolicyApi policyApi;
+
+   /**
+    * To get a username and API key see
+    * http://www.jclouds.org/documentation/quickstart/rackspace/
+    *
+    * The first argument (args[0]) must be your username
+    * The second argument (args[1]) must be your API key
+    */
+   public static void main(String[] args) throws IOException {
+      UpdatePolicy updatePolicy = new UpdatePolicy(args[0], args[1]);
+
+      try {
+         updatePolicy.updatePolicy();
+      }
+      catch (Exception e) {
+         e.printStackTrace();
+      }
+      finally {
+         updatePolicy.close();
+      }
+   }
+
+   public UpdatePolicy(String username, String apiKey) {
+      autoscaleApi = ContextBuilder.newBuilder(PROVIDER)
+            .credentials(username, apiKey)
+            .buildApi(AutoscaleApi.class);
+
+      groupApi = autoscaleApi.getGroupApiForZone(ZONE);
+      String groupId = Utils.getGroupId(groupApi);
+      policyApi = autoscaleApi.getPolicyApiForZoneAndGroup(ZONE, groupId);
+   }
+
+   private void updatePolicy() {
+      System.out.format("Update autoscale policy%n");
+
+      String policyId = policyApi.list().first().get().getId();
+
+      ScalingPolicy scalingPolicy = ScalingPolicy.builder()
+            .cooldown(3)
+            .type(ScalingPolicyType.WEBHOOK)
+            .name(NAME)
+            .targetType(ScalingPolicyTargetType.INCREMENTAL)
+            .target("1")
+            .build();
+
+      boolean result = policyApi.update(policyId, scalingPolicy);
+
+      System.out.format("  %s%n", result);
+   }
+
+   /**
+    * Always close your service when you're done with it.
+    *
+    * Note that closing quietly like this is not necessary in Java 7.
+    * You would use try-with-resources in the main method instead.
+    */
+   public void close() throws IOException {
+      Closeables.close(autoscaleApi, true);
+   }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/Utils.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/Utils.java
new file mode 100644
index 0000000..3e6e8af
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/autoscale/Utils.java
@@ -0,0 +1,53 @@
+/*
+ * 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.examples.rackspace.autoscale;
+
+import static org.jclouds.examples.rackspace.autoscale.Constants.NAME;
+
+import org.jclouds.rackspace.autoscale.v1.domain.Group;
+import org.jclouds.rackspace.autoscale.v1.domain.GroupState;
+import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicyResponse;
+import org.jclouds.rackspace.autoscale.v1.features.GroupApi;
+import org.jclouds.rackspace.autoscale.v1.features.PolicyApi;
+
+/**
+ * Helper methods for autoscale examples
+ * 
+ * @author Zack Shoylev
+ */
+public class Utils {
+   public static String getGroupId(GroupApi groupApi) {
+      for ( GroupState state : groupApi.listGroupStates() ) {
+         Group g = groupApi.get(state.getId());
+         for ( ScalingPolicyResponse policy : g.getScalingPolicies() ) {
+            if (policy.getName().equals(NAME)) return g.getId();
+         }
+      }
+
+      throw new IllegalArgumentException("Group not found");
+   }
+
+   public static String getPolicyId(PolicyApi policyApi) {
+      for ( ScalingPolicyResponse policy : policyApi.list() ) {
+         if (policy.getName().equals(NAME)) return policy.getId();
+      }
+
+      throw new IllegalArgumentException("Policy not found");
+   }
+}