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");
+ }
+}