From bf0dac91b047151b0a1f7de8354c35664c3f94b3 Mon Sep 17 00:00:00 2001
From: Kyle Rames <kyle.rames@rackspace.com>
Date: Tue, 6 Aug 2013 16:32:04 -0500
Subject: [PATCH 01/10] [rackspace|autoscale] starting on rackspace auto scale
 implementation

---
 lib/fog/bin/rackspace.rb                      |   4 +
 lib/fog/rackspace.rb                          |   1 +
 lib/fog/rackspace/auto_scale.rb               | 103 ++++++++++++++++++
 .../requests/auto_scale/create_group.rb       |  88 +++++++++++++++
 .../requests/auto_scale/delete_group.rb       |  22 ++++
 .../requests/auto_scale/get_config.rb         |  24 ++++
 .../requests/auto_scale/get_group.rb          |  24 ++++
 .../requests/auto_scale/get_group_state.rb    |  24 ++++
 .../requests/auto_scale/list_groups.rb        |  35 ++++++
 .../requests/auto_scale/update_config.rb      |  37 +++++++
 lib/fog/rackspace/service.rb                  |   5 +
 tests/rackspace/auto_scale_tests.rb           |  84 ++++++++++++++
 12 files changed, 451 insertions(+)
 create mode 100644 lib/fog/rackspace/auto_scale.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/create_group.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/delete_group.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_config.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_group.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_group_state.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/list_groups.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/update_config.rb
 create mode 100644 tests/rackspace/auto_scale_tests.rb

diff --git a/lib/fog/bin/rackspace.rb b/lib/fog/bin/rackspace.rb
index 68f85ddce..1ba1771fd 100644
--- a/lib/fog/bin/rackspace.rb
+++ b/lib/fog/bin/rackspace.rb
@@ -3,6 +3,8 @@ class Rackspace < Fog::Bin
 
     def class_for(key)
       case key
+      when :auto_scale
+        Fog::Rackspace::AutoScale
       when :block_storage
         Fog::Rackspace::BlockStorage 
       when :cdn
@@ -29,6 +31,8 @@ class Rackspace < Fog::Bin
     def [](service)
       @@connections ||= Hash.new do |hash, key|
         hash[key] = case key
+        when :auto_scale
+          Fog::Rackspace::AutoScale.new
         when :cdn
           Fog::Logger.warning("Rackspace[:cdn] is not recommended, use CDN[:rackspace] for portability")
           Fog::CDN.new(:provider => 'Rackspace')
diff --git a/lib/fog/rackspace.rb b/lib/fog/rackspace.rb
index 5ecd5dafe..63d5f2d5e 100644
--- a/lib/fog/rackspace.rb
+++ b/lib/fog/rackspace.rb
@@ -72,6 +72,7 @@ module Fog
       end
     end
 
+    service(:auto_scale,       'rackspace/auto_scale',        'AutoScale')
     service(:block_storage,    'rackspace/block_storage',     'BlockStorage')
     service(:cdn,              'rackspace/cdn',               'CDN')
     service(:compute,          'rackspace/compute',           'Compute')
diff --git a/lib/fog/rackspace/auto_scale.rb b/lib/fog/rackspace/auto_scale.rb
new file mode 100644
index 000000000..0cc913856
--- /dev/null
+++ b/lib/fog/rackspace/auto_scale.rb
@@ -0,0 +1,103 @@
+require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rackspace'))
+
+module Fog
+  module Rackspace
+    class AutoScale < Fog::Service
+      include Fog::Rackspace::Errors
+
+      class ServiceError < Fog::Rackspace::Errors::ServiceError; end
+      class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end
+
+      class BadRequest <  Fog::Rackspace::Errors::BadRequest
+        attr_reader :validation_errors
+
+        def self.slurp(error)
+          if error && error.response
+            status_code = error.response.status
+            if error.response.body
+              body = Fog::JSON.decode(error.response.body)
+              message = "#{body['type']} - #{body['message']}"
+              details = error.response.body['details']
+            end
+          end
+
+          new_error = new(message)
+          new_error.set_backtrace(error.backtrace)
+          new_error.instance_variable_set(:@validation_errors, details)
+          new_error.instance_variable_set(:@status_code, status_code)
+
+          new_error
+        end
+      end
+
+        requires :rackspace_username, :rackspace_api_key
+        recognizes :rackspace_auth_url
+        recognizes :rackspace_region
+        recognizes :rackspace_auto_scale_url
+
+        model_path 'fog/rackspace/models/auto_scale'
+
+        request_path 'fog/rackspace/requests/auto_scale'
+        request :list_groups
+        request :get_group
+        request :create_group
+        request :delete_group
+        request :get_group_state
+
+        request :update_config
+        request :get_config
+
+        class Mock < Fog::Rackspace::Service
+          def initialize(options)
+            @rackspace_api_key = options[:rackspace_api_key]
+          end
+
+          def request(params)
+            Fog::Mock.not_implemented
+          end
+        end
+
+
+        class Real < Fog::Rackspace::Service
+
+          def initialize(options = {})
+            @options = options
+            @options[:connection_options] ||= {}
+            @options[:persistent] ||= false
+
+            authenticate
+
+            @connection = Fog::Connection.new(endpoint_uri.to_s, @options[:persistent], @options[:connection_options])
+          end
+
+          def request(params, parse_json = true, &block)
+            super(params, parse_json, &block)
+          rescue Excon::Errors::NotFound => error
+            raise NotFound.slurp(error, region)
+          rescue Excon::Errors::BadRequest => error
+            raise BadRequest.slurp error
+          rescue Excon::Errors::InternalServerError => error
+            raise InternalServerError.slurp error
+          rescue Excon::Errors::HTTPStatusError => error
+            raise ServiceError.slurp error
+          end
+
+          def endpoint_uri(service_endpoint_url=nil)
+            @uri = super(@options[:rackspace_auto_scale_url], :rackspace_auto_scale_url)
+          end
+
+          def authenticate(options={})
+            super(select_options([:rackspace_username, :rackspace_api_key, :rackspace_auth_url, :connection_options]))
+          end
+
+          def service_name
+            :autoscale
+          end
+
+          def region
+            @options[:rackspace_region]
+          end
+        end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/create_group.rb b/lib/fog/rackspace/requests/auto_scale/create_group.rb
new file mode 100644
index 000000000..aad0c1017
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/create_group.rb
@@ -0,0 +1,88 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def create_group
+          request(
+            :expects => [201],
+            :method => 'POST',
+            :path => 'groups',
+            :body => <<-JSON
+             {
+                  \"groupConfiguration\": {
+                      \"name\": \"workers2\",
+                      \"cooldown\": 60,
+                      \"minEntities\": 5,
+                      \"maxEntities\": 25,
+                      \"metadata\": {
+                          \"firstkey\": \"this is a string\",
+                          \"secondkey\": \"1\"
+                      }
+                  },
+                  \"launchConfiguration\": {
+                      \"type\": \"launch_server\",
+                      \"args\": {
+                          \"server\": {
+                              \"flavorRef\": 3,
+                              \"name\": \"webhead\",
+                              \"imageRef\": \"0d589460-f177-4b0f-81c1-8ab8903ac7d8\",
+                              \"OS-DCF:diskConfig\": \"AUTO\",
+                              \"metadata\": {
+                                  \"mykey\": \"myvalue\"
+                              },
+                              \"personality\": [
+                                  {
+                                      \"path\": \"/root/.ssh/authorized_keys\",
+                                      \"contents\": \"ssh-rsa AAAAB3Nza...LiPk== user@example.net\"
+                                  }
+                              ],
+                              \"networks\": [
+                                  {
+                                      \"uuid\": \"11111111-1111-1111-1111-111111111111\"
+                                  }
+                              ]
+                          },
+                          \"loadBalancers\": [
+                              {
+                                  \"loadBalancerId\": 2200,
+                                  \"port\": 8081
+                              }
+                          ]
+                      }
+                  },
+                  \"scalingPolicies\": [
+                      {
+                          \"name\": \"scale up by 10\",
+                          \"change\": 10,
+                          \"cooldown\": 5,
+                          \"type\": \"webhook\"
+                      },
+                      {
+                          \"name\": \"scale down by 5.5 percent\",
+                          \"changePercent\": -5.5,
+                          \"cooldown\": 6,
+                          \"type\": \"webhook\"
+                      },
+                      {
+                          \"name\": \"set number of servers to 10\",
+                          \"desiredCapacity\": 10,
+                          \"cooldown\": 3,
+                          \"type\": \"webhook\"
+                      }
+                  ]
+              }
+            JSON
+          )
+        end
+      end
+
+      class Mock
+        def create_group
+          Fog::Mock.not_implemented
+
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/delete_group.rb b/lib/fog/rackspace/requests/auto_scale/delete_group.rb
new file mode 100644
index 000000000..698f815f7
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/delete_group.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def delete_group(group_id)
+          request(
+          :expects => [204],
+          :method => 'DELETE',
+          :path => "groups/#{group_id}"
+          )
+        end
+      end
+
+      class Mock
+        def delete_group(group_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/get_config.rb b/lib/fog/rackspace/requests/auto_scale/get_config.rb
new file mode 100644
index 000000000..ca9be79bc
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_config.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_config(group_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/config",
+            )
+        end
+      end
+
+      class Mock
+        def get_config(group_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group.rb b/lib/fog/rackspace/requests/auto_scale/get_group.rb
new file mode 100644
index 000000000..7faae3f90
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_group.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_group(group_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}",
+            )
+        end
+      end
+
+      class Mock
+        def get_group(group_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
new file mode 100644
index 000000000..66ca58b8b
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_group_state(group_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/state",
+            )
+        end
+      end
+
+      class Mock
+        def get_group_state(group_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/list_groups.rb b/lib/fog/rackspace/requests/auto_scale/list_groups.rb
new file mode 100644
index 000000000..806a4ef72
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/list_groups.rb
@@ -0,0 +1,35 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        # Retrieves a list of images
+        # @return [Excon::Response] response:
+        #   * body [Hash]:
+        #     * images [Array]:
+        #       * [Hash]:
+        #         * id [String] - flavor id
+        #         * links [Array] - image links
+        #         * name [String] - image name
+        # @raise [Fog::Compute::RackspaceV2::NotFound] - HTTP 404
+        # @raise [Fog::Compute::RackspaceV2::BadRequest] - HTTP 400
+        # @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500
+        # @raise [Fog::Compute::RackspaceV2::ServiceError]
+        # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/List_Flavors-d1e4188.html
+        def list_groups
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => 'groups'
+          )
+        end
+      end
+
+      class Mock
+        def list_groups
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/update_config.rb b/lib/fog/rackspace/requests/auto_scale/update_config.rb
new file mode 100644
index 000000000..6cdf577bd
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/update_config.rb
@@ -0,0 +1,37 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def update_config(group_id)
+
+          h = {
+             "name" => "workers",
+             "cooldown" => 60,
+             "minEntities" => 0,
+             "maxEntities" => 0,
+             "metadata" => {
+                  "firstkey" => "this is a string",
+                  "secondkey" => "1"
+              }
+          }
+
+          request(
+            :expects => [204],
+            :method => 'PUT',
+            :path => "groups/#{group_id}/config",
+            :body => Fog::JSON.encode(h)
+            )
+        end
+      end
+
+      class Mock
+        def update_config(group_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/service.rb b/lib/fog/rackspace/service.rb
index 8649cf273..a60d7dfaa 100644
--- a/lib/fog/rackspace/service.rb
+++ b/lib/fog/rackspace/service.rb
@@ -116,6 +116,11 @@ module Fog
         @auth_token || @identity_service.auth_token
       end
 
+      def select_options(keys)
+        return nil unless @options && keys
+        @options.select {|k,v| keys.include?(k)}
+      end
+
     end
   end
 end
diff --git a/tests/rackspace/auto_scale_tests.rb b/tests/rackspace/auto_scale_tests.rb
new file mode 100644
index 000000000..6b41614a7
--- /dev/null
+++ b/tests/rackspace/auto_scale_tests.rb
@@ -0,0 +1,84 @@
+Shindo.tests('Fog::Rackspace::AutoScale', ['rackspace']) do
+
+  def assert_method(url, method)
+    @service.instance_variable_set "@rackspace_auth_url", url
+    returns(method) { @service.send :authentication_method }
+  end
+
+  tests('#authentication_method') do
+    @service = Fog::Rackspace::AutoScale.new :rackspace_region => :dfw
+
+    assert_method nil, :authenticate_v2
+
+    assert_method 'auth.api.rackspacecloud.com', :authenticate_v1 # chef's default auth endpoint
+
+    assert_method 'https://identity.api.rackspacecloud.com', :authenticate_v1
+    assert_method 'https://identity.api.rackspacecloud.com/v1', :authenticate_v1
+    assert_method 'https://identity.api.rackspacecloud.com/v1.1', :authenticate_v1
+    assert_method 'https://identity.api.rackspacecloud.com/v2.0', :authenticate_v2
+
+    assert_method 'https://lon.identity.api.rackspacecloud.com', :authenticate_v1
+    assert_method 'https://lon.identity.api.rackspacecloud.com/v1', :authenticate_v1
+    assert_method 'https://lon.identity.api.rackspacecloud.com/v1.1', :authenticate_v1
+    assert_method 'https://lon.identity.api.rackspacecloud.com/v2.0', :authenticate_v2
+  end
+
+
+  tests('current authentation') do
+    pending if Fog.mocking?
+
+    tests('variables populated').succeeds do
+      @service = Fog::Rackspace::AutoScale.new :rackspace_auth_url => 'https://identity.api.rackspacecloud.com/v2.0', :connection_options => {:ssl_verify_peer => true}, :rackspace_region => :dfw
+      returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+      returns(false, "path populated") { @service.instance_variable_get("@uri").host.nil? }
+      identity_service = @service.instance_variable_get("@identity_service")
+      returns(false, "identity service was used") { identity_service.nil? }
+      returns(true, "connection_options are passed") { identity_service.instance_variable_get("@connection_options").has_key?(:ssl_verify_peer) }
+      @service.list_groups
+    end
+    tests('dfw region').succeeds do
+      @service = Fog::Rackspace::AutoScale.new :rackspace_auth_url => 'https://identity.api.rackspacecloud.com/v2.0', :rackspace_region => :dfw
+      returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+      returns(true) { (@service.instance_variable_get("@uri").host =~ /dfw/) != nil }
+      @service.list_groups
+    end
+    tests('ord region').succeeds do
+      @service = Fog::Rackspace::AutoScale.new :rackspace_auth_url => 'https://identity.api.rackspacecloud.com/v2.0', :rackspace_region => :ord
+      returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+      returns(true) { (@service.instance_variable_get("@uri").host =~ /ord/) != nil }
+      @service.list_groups
+    end
+    tests('custom endpoint') do
+      @service = Fog::Rackspace::AutoScale.new :rackspace_auth_url => 'https://identity.api.rackspacecloud.com/v2.0',
+        :rackspace_auto_scale_url => 'https://my-custom-endpoint.com'
+        returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+        returns(true, "uses custom endpoint") { (@service.instance_variable_get("@uri").host =~ /my-custom-endpoint\.com/) != nil }
+    end
+  end
+
+  tests('default auth') do
+    pending if Fog.mocking?
+
+    tests('specify region').succeeds do
+      @service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+      returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+      returns(true) { (@service.instance_variable_get("@uri").host =~ /ord/ ) != nil }
+      @service.list_groups
+    end
+    tests('custom endpoint') do
+      @service = Fog::Rackspace::AutoScale.new :rackspace_auto_scale_url => 'https://my-custom-endpoint.com'
+      returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+      returns(true, "uses custom endpoint") { (@service.instance_variable_get("@uri").host =~ /my-custom-endpoint\.com/) != nil }
+    end
+  end
+
+  tests('reauthentication') do
+    pending if Fog.mocking?
+
+    @service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+    returns(true, "auth token populated") { !@service.send(:auth_token).nil? }
+    @service.instance_variable_set("@auth_token", "bad_token")
+    returns(true) { [200, 203].include? @service.list_groups.status }
+  end
+
+end
\ No newline at end of file

From 6bebc8e15be61aa6157842e2884623e49eb75f37 Mon Sep 17 00:00:00 2001
From: jamiehannaford <jamie@limetree.org>
Date: Tue, 20 Aug 2013 15:29:03 +0200
Subject: [PATCH 02/10] Adding models, collections and making a start on
 request classes

---
 lib/fog/rackspace/auto_scale.rb               | 46 ++++++++-
 lib/fog/rackspace/models/auto_scale/config.rb | 17 ++++
 lib/fog/rackspace/models/auto_scale/group.rb  | 73 ++++++++++++++
 .../models/auto_scale/group_config.rb         | 34 +++++++
 lib/fog/rackspace/models/auto_scale/groups.rb | 25 +++++
 .../models/auto_scale/launch_config.rb        | 28 ++++++
 .../rackspace/models/auto_scale/policies.rb   | 25 +++++
 lib/fog/rackspace/models/auto_scale/policy.rb | 98 +++++++++++++++++++
 .../rackspace/models/auto_scale/webhook.rb    | 34 +++++++
 .../requests/auto_scale/create_group.rb       | 84 ++++------------
 10 files changed, 395 insertions(+), 69 deletions(-)
 create mode 100644 lib/fog/rackspace/models/auto_scale/config.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/group.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/group_config.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/groups.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/launch_config.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/policies.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/policy.rb
 create mode 100644 lib/fog/rackspace/models/auto_scale/webhook.rb

diff --git a/lib/fog/rackspace/auto_scale.rb b/lib/fog/rackspace/auto_scale.rb
index 0cc913856..7efd83c2d 100644
--- a/lib/fog/rackspace/auto_scale.rb
+++ b/lib/fog/rackspace/auto_scale.rb
@@ -8,6 +8,22 @@ module Fog
       class ServiceError < Fog::Rackspace::Errors::ServiceError; end
       class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end
 
+      class MissingArgumentException < InvalidStateException
+        def initialize(resource, argument)
+          @resource = resource
+          @argument = argument
+        end
+        def to_s
+          "This #{resource} resource requires the #{argument} argument"
+        end
+      end
+
+      class InvalidImageStateException < InvalidStateException
+         def to_s
+           "Image should have transitioned to '#{desired_state}' not '#{current_state}'"
+         end
+      end
+
       class BadRequest <  Fog::Rackspace::Errors::BadRequest
         attr_reader :validation_errors
 
@@ -36,16 +52,40 @@ module Fog
         recognizes :rackspace_auto_scale_url
 
         model_path 'fog/rackspace/models/auto_scale'
+        model :group
+        collection :groups
+        model :policy
+        collection :policies
+        model :group_config
+        model :launch_config
+        model :webhook
 
         request_path 'fog/rackspace/requests/auto_scale'
         request :list_groups
-        request :get_group
         request :create_group
+        request :get_group
         request :delete_group
         request :get_group_state
+        request :pause_group_state
+        request :resume_group_state
 
-        request :update_config
-        request :get_config
+        request :get_group_config
+        request :update_group_config
+        request :get_launch_config
+        request :replace_launch_config
+
+        request :get_policies
+        request :create_policy
+        request :get_policy
+        request :update_policy
+        request :delete_policy
+        request :execute_policy
+
+        request :execute_anonymous_webhook
+
+        request :get_webhook
+        request :update_webhook
+        request :delete_webhook
 
         class Mock < Fog::Rackspace::Service
           def initialize(options)
diff --git a/lib/fog/rackspace/models/auto_scale/config.rb b/lib/fog/rackspace/models/auto_scale/config.rb
new file mode 100644
index 000000000..fc6f5f15b
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/config.rb
@@ -0,0 +1,17 @@
+require 'fog/core/model'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Config < Fog::Model
+
+        def pause
+        end
+
+        def resume
+        end
+
+      end
+  	end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/models/auto_scale/group.rb b/lib/fog/rackspace/models/auto_scale/group.rb
new file mode 100644
index 000000000..4f987da1d
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/group.rb
@@ -0,0 +1,73 @@
+require 'fog/core/model'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Group < Fog::Model
+         
+        identity :id
+
+        attribute :links
+
+        attribute :group_config
+
+        attribute :launch_config
+
+        attribute :policies
+
+        def initialize(attributes={})
+          @service = attributes[:service]
+          super
+        end
+
+        def create(options)
+          requires :launch_config, :group_config, :policies
+
+          data = service.create_group(launch_config, group_config, policies)
+          merge_attributes(data.body['group'])
+          true
+        end
+
+        def destroy
+          requires :identity
+          service.delete_server(identity)
+          true
+        end
+
+        def group_config
+          @group_config ||= begin
+            Fog::Rackspace::AutoScale::GroupConfig.new({
+              :service => service,
+              :group => self
+            })
+          end
+        end
+
+        def launch_config
+          @launch_config ||= begin
+            Fog::Rackspace::AutoScale::LaunchConfig.new({
+              :service => service,
+              :group => self
+            })
+          end
+        end
+
+        def policies
+          @policies ||= begin
+            Fog::Rackspace::Autoscale::Policies.new({
+              :service => service,
+              :group => self
+            })
+          end
+        end
+
+        def state
+          requires :identity
+          data = service.get_group_state(identity)
+          merge_attributes(data.body['group'])
+        end
+
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/models/auto_scale/group_config.rb b/lib/fog/rackspace/models/auto_scale/group_config.rb
new file mode 100644
index 000000000..12a194f5d
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/group_config.rb
@@ -0,0 +1,34 @@
+require 'fog/core/model'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class GroupConfig < Fog::AutoScale::Rackspace::Config
+
+      	identity :id
+
+      	attribute :name
+      	attribute :cooldown
+      	attribute :min_entities
+      	attribute :max_entities
+      	attribute :metadata
+
+      	def update
+          requires :identity
+          options = {
+            'name' => name,
+            'cooldown' => cooldown,
+            'min_entities' => min_entities,
+            'max_entities' => max_entities,
+            'metadata' => metadata
+          }
+
+          data = service.update_group_config(identity, options)
+          merge_attributes(data.body)
+          true
+        end
+
+      end
+  	end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/models/auto_scale/groups.rb b/lib/fog/rackspace/models/auto_scale/groups.rb
new file mode 100644
index 000000000..a7ea34a29
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/groups.rb
@@ -0,0 +1,25 @@
+require 'fog/core/collection'
+require 'fog/rackspace/models/auto_scale/group'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Groups < Fog::Collection
+
+        model Fog::Rackspace::AutoScale::Group
+
+        def all
+          data = service.list_groups.body['groups']
+          load(data)
+        end
+
+        def get(group_id)          
+          data = service.get_group(group_id).body['group']
+          new(data)
+        rescue Fog::Rackspace::AutoScale::NotFound
+          nil
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/models/auto_scale/launch_config.rb b/lib/fog/rackspace/models/auto_scale/launch_config.rb
new file mode 100644
index 000000000..55bcb00c9
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/launch_config.rb
@@ -0,0 +1,28 @@
+require 'fog/core/model'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class LaunchConfig < Fog::AutoScale::Rackspace::Config
+
+      	identity :id
+
+      	attribute :type
+      	attribute :args
+
+      	def update
+          requires :identity
+          options = {
+            'type' => type,
+            'args' => args
+          }
+
+          data = service.update_launch_config(identity, options)
+          merge_attributes(data.body['launchConfiguration'])
+          true
+        end
+
+      end
+  	end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/models/auto_scale/policies.rb b/lib/fog/rackspace/models/auto_scale/policies.rb
new file mode 100644
index 000000000..ddea70e64
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/policies.rb
@@ -0,0 +1,25 @@
+require 'fog/core/collection'
+require 'fog/rackspace/models/auto_scale/policy'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Policies < Fog::Collection
+
+        model Fog::Rackspace::AutoScale::Policy
+
+        def all
+          data = service.list_policies.body['policies']
+          load(data)
+        end
+
+        def get(policy_id)          
+          data = service.get_policy(policy_id).body['policy']
+          new(data)
+        rescue Fog::Rackspace::AutoScale::NotFound
+          nil
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/models/auto_scale/policy.rb b/lib/fog/rackspace/models/auto_scale/policy.rb
new file mode 100644
index 000000000..dd45bb0e1
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/policy.rb
@@ -0,0 +1,98 @@
+require 'fog/core/model'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Policy < Fog::Model
+
+      	identity :id
+
+      	attribute :group_id
+
+      	attribute :links
+      	attribute :name
+      	
+      	# integer
+      	attribute :change
+      	attribute :changePercent
+
+      	# integer
+      	attribute :cooldown
+
+      	# webhook|schedule|cloud_monitoring
+      	attribute :type
+
+      	# hash depending on the type chosen
+   		#	- "cron": "23 * * * *"
+   		#	- "at": "2013-06-05T03:12Z"
+   		#	- "check": {
+		# 	      "label": "Website check 1",
+		# 	      "type": "remote.http",
+		# 	      "details": {
+		# 	          "url": "http://www.example.com",
+		# 	          "method": "GET"
+		# 	      },
+		# 	      "monitoring_zones_poll": [
+		# 	          "mzA"
+		# 	      ],
+		# 	      "timeout": 30,
+		# 	      "period": 100,
+		# 	      "target_alias": "default"
+		# 	  },
+		# 	  "alarm_criteria": {
+		# 	       "criteria": "if (metric[\"duration\"] >= 2) { return new AlarmStatus(OK); } return new AlarmStatus(CRITICAL);"
+		# 	  }
+      	attribute :args
+
+      	attribute :desiredCapacity
+
+		def check_options(options)
+        	if options[:type] == 'schedule'
+        		args = options['args']
+        		raise MissingArgumentException(self.name, "cron OR at") if args['cron'].nil? && args['at'].nil?
+        	end
+        	true
+        end
+
+      	def create(options)
+          requires :name, :type, :cooldown
+
+          check_options
+
+          data = service.create_policy(group_id, options)
+          merge_attributes(data.body['group'])
+          true
+        end
+
+      	def update
+      		requires :identity
+
+      		options = {
+      			'name' => name,
+      			'change' => change,
+      			'changePercent' => changePercent,
+      			'cooldown' => cooldown,
+      			'type' => type,
+      			'args' => args,
+      			'desiredCapacity' => desiredCapacity
+      		}
+
+      		data = service.update_policy(identity, options)
+      		merge_attributes(data.body)
+      		true
+      	end
+
+      	def destroy
+      		requires :identity
+      		service.delete_policy(identity)
+      	end
+
+      	def execute
+      		requires :identity
+      		service.execute_policy(identity)
+      	end
+
+      end
+  	end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/models/auto_scale/webhook.rb b/lib/fog/rackspace/models/auto_scale/webhook.rb
new file mode 100644
index 000000000..5b91892df
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/webhook.rb
@@ -0,0 +1,34 @@
+require 'fog/core/model'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Webhook < Fog::Model
+
+      	identity :id
+
+      	attribute :name
+      	attribute :metadata
+      	attribute :links
+
+      	def update
+      		required :identity
+
+      		options = {
+      			'name' => name,
+      			'metadata' => metadata
+      		}
+
+      		data = service.update_webhook(identity, options)
+      		merge_attribute(data.body)
+      	end
+
+      	def destroy
+      		required :identity
+      		service.delete_webhook(identity)
+      	end
+
+      end
+  	end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/create_group.rb b/lib/fog/rackspace/requests/auto_scale/create_group.rb
index aad0c1017..54fb1a9dd 100644
--- a/lib/fog/rackspace/requests/auto_scale/create_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/create_group.rb
@@ -3,76 +3,28 @@ module Fog
     class AutoScale
       class Real
 
-        def create_group
+        def create_group(launch_config, group_config, policies)
+
+          body['launchConfiguration'] = {
+            'args' => launch_config.args,
+            'type' => launch_config.type
+          }
+
+          body['groupConfiguration'] = {
+            'name' => group_config.name,
+            'cooldown' => group_config.cooldown, 
+            'maxEntities' => group_config.max_entities,
+            'minEntities' => group_config.min_entities,
+            'metadata' => group_config.metadata
+          }
+
+          body['scalingPolicies'] = policies.collect { |p| p.to_a }
+
           request(
             :expects => [201],
             :method => 'POST',
             :path => 'groups',
-            :body => <<-JSON
-             {
-                  \"groupConfiguration\": {
-                      \"name\": \"workers2\",
-                      \"cooldown\": 60,
-                      \"minEntities\": 5,
-                      \"maxEntities\": 25,
-                      \"metadata\": {
-                          \"firstkey\": \"this is a string\",
-                          \"secondkey\": \"1\"
-                      }
-                  },
-                  \"launchConfiguration\": {
-                      \"type\": \"launch_server\",
-                      \"args\": {
-                          \"server\": {
-                              \"flavorRef\": 3,
-                              \"name\": \"webhead\",
-                              \"imageRef\": \"0d589460-f177-4b0f-81c1-8ab8903ac7d8\",
-                              \"OS-DCF:diskConfig\": \"AUTO\",
-                              \"metadata\": {
-                                  \"mykey\": \"myvalue\"
-                              },
-                              \"personality\": [
-                                  {
-                                      \"path\": \"/root/.ssh/authorized_keys\",
-                                      \"contents\": \"ssh-rsa AAAAB3Nza...LiPk== user@example.net\"
-                                  }
-                              ],
-                              \"networks\": [
-                                  {
-                                      \"uuid\": \"11111111-1111-1111-1111-111111111111\"
-                                  }
-                              ]
-                          },
-                          \"loadBalancers\": [
-                              {
-                                  \"loadBalancerId\": 2200,
-                                  \"port\": 8081
-                              }
-                          ]
-                      }
-                  },
-                  \"scalingPolicies\": [
-                      {
-                          \"name\": \"scale up by 10\",
-                          \"change\": 10,
-                          \"cooldown\": 5,
-                          \"type\": \"webhook\"
-                      },
-                      {
-                          \"name\": \"scale down by 5.5 percent\",
-                          \"changePercent\": -5.5,
-                          \"cooldown\": 6,
-                          \"type\": \"webhook\"
-                      },
-                      {
-                          \"name\": \"set number of servers to 10\",
-                          \"desiredCapacity\": 10,
-                          \"cooldown\": 3,
-                          \"type\": \"webhook\"
-                      }
-                  ]
-              }
-            JSON
+            :body => Fog::JSON.encode(body)
           )
         end
       end

From f4955dc207cdb7981c18de5b81d2f92223ad70c4 Mon Sep 17 00:00:00 2001
From: jamiehannaford <jamie@limetree.org>
Date: Wed, 28 Aug 2013 13:49:03 +0200
Subject: [PATCH 03/10] Initial commit for Rackspace's new Autoscale features.
 Most functionality is incorporated, including: - Scaling groups -
 Configuration (group configuration and launch configuration) - Scaling
 policies - Webhooks

Work remaining includes:
- Mock request classes
- Unit test coverage
---
 lib/fog/rackspace/auto_scale.rb               |  23 ++--
 lib/fog/rackspace/models/auto_scale/group.rb  | 109 ++++++++++++------
 .../models/auto_scale/group_config.rb         |  27 +++--
 .../models/auto_scale/launch_config.rb        |  16 ++-
 .../rackspace/models/auto_scale/policies.rb   |  13 ++-
 lib/fog/rackspace/models/auto_scale/policy.rb | 106 +++++++++++------
 .../rackspace/models/auto_scale/webhook.rb    |  31 ++++-
 .../rackspace/models/auto_scale/webhooks.rb   |  37 ++++++
 .../requests/auto_scale/create_group.rb       |  26 ++---
 .../requests/auto_scale/create_policy.rb      |  27 +++++
 .../requests/auto_scale/create_webhook.rb     |  25 ++++
 .../requests/auto_scale/delete_policy.rb      |  22 ++++
 .../requests/auto_scale/delete_webhook.rb     |  22 ++++
 .../auto_scale/execute_anonymous_webhook.rb   |  22 ++++
 .../requests/auto_scale/execute_policy.rb     |  22 ++++
 .../requests/auto_scale/get_group_config.rb   |  24 ++++
 .../requests/auto_scale/get_group_state.rb    |   2 +-
 .../requests/auto_scale/get_launch_config.rb  |  24 ++++
 .../requests/auto_scale/get_policy.rb         |  24 ++++
 .../requests/auto_scale/get_webhook.rb        |  24 ++++
 .../requests/auto_scale/list_policies.rb      |  22 ++++
 .../requests/auto_scale/list_webhooks.rb      |  22 ++++
 .../requests/auto_scale/pause_group_state.rb  |  23 ++++
 .../requests/auto_scale/resume_group_state.rb |  23 ++++
 .../auto_scale/update_group_config.rb         |  26 +++++
 .../auto_scale/update_launch_config.rb        |  26 +++++
 .../requests/auto_scale/update_policy.rb      |  24 ++++
 .../requests/auto_scale/update_webhook.rb     |  26 +++++
 28 files changed, 689 insertions(+), 129 deletions(-)
 create mode 100644 lib/fog/rackspace/models/auto_scale/webhooks.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/create_policy.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/create_webhook.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/delete_policy.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/delete_webhook.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/execute_policy.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_group_config.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_policy.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/get_webhook.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/list_policies.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/list_webhooks.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/pause_group_state.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/resume_group_state.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/update_group_config.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/update_launch_config.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/update_policy.rb
 create mode 100644 lib/fog/rackspace/requests/auto_scale/update_webhook.rb

diff --git a/lib/fog/rackspace/auto_scale.rb b/lib/fog/rackspace/auto_scale.rb
index 7efd83c2d..e94f396c3 100644
--- a/lib/fog/rackspace/auto_scale.rb
+++ b/lib/fog/rackspace/auto_scale.rb
@@ -8,7 +8,7 @@ module Fog
       class ServiceError < Fog::Rackspace::Errors::ServiceError; end
       class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end
 
-      class MissingArgumentException < InvalidStateException
+      class MissingArgumentException
         def initialize(resource, argument)
           @resource = resource
           @argument = argument
@@ -18,12 +18,6 @@ module Fog
         end
       end
 
-      class InvalidImageStateException < InvalidStateException
-         def to_s
-           "Image should have transitioned to '#{desired_state}' not '#{current_state}'"
-         end
-      end
-
       class BadRequest <  Fog::Rackspace::Errors::BadRequest
         attr_reader :validation_errors
 
@@ -54,11 +48,14 @@ module Fog
         model_path 'fog/rackspace/models/auto_scale'
         model :group
         collection :groups
-        model :policy
-        collection :policies
         model :group_config
         model :launch_config
+
+        model :policy
+        collection :policies
+
         model :webhook
+        collection :webhooks
 
         request_path 'fog/rackspace/requests/auto_scale'
         request :list_groups
@@ -72,9 +69,9 @@ module Fog
         request :get_group_config
         request :update_group_config
         request :get_launch_config
-        request :replace_launch_config
+        request :update_launch_config
 
-        request :get_policies
+        request :list_policies
         request :create_policy
         request :get_policy
         request :update_policy
@@ -84,6 +81,8 @@ module Fog
         request :execute_anonymous_webhook
 
         request :get_webhook
+        request :list_webhooks
+        request :create_webhook
         request :update_webhook
         request :delete_webhook
 
@@ -140,4 +139,4 @@ module Fog
         end
     end
   end
-end
\ No newline at end of file
+end
diff --git a/lib/fog/rackspace/models/auto_scale/group.rb b/lib/fog/rackspace/models/auto_scale/group.rb
index 4f987da1d..68a6cf32e 100644
--- a/lib/fog/rackspace/models/auto_scale/group.rb
+++ b/lib/fog/rackspace/models/auto_scale/group.rb
@@ -1,4 +1,7 @@
 require 'fog/core/model'
+require 'fog/rackspace/models/auto_scale/group_config'
+require 'fog/rackspace/models/auto_scale/launch_config'
+require 'fog/rackspace/models/auto_scale/policies'
 
 module Fog
   module Rackspace
@@ -9,18 +12,69 @@ module Fog
 
         attribute :links
 
-        attribute :group_config
-
-        attribute :launch_config
-
-        attribute :policies
-
         def initialize(attributes={})
           @service = attributes[:service]
           super
         end
 
-        def create(options)
+        def group_config
+          data = service.get_group_config(identity)
+          attributes[:group_config] = begin 
+            Fog::Rackspace::AutoScale::GroupConfig.new({
+              :service => @service,
+              :group   => self
+            }).merge_attributes(data.body['groupConfiguration']) 
+          end
+          attributes[:group_config]
+        end
+
+        def group_config=(object={})
+          if object.is_a?(Hash)
+            attributes[:group_config] = begin 
+              Fog::Rackspace::AutoScale::GroupConfig.new({
+                :service => @service,
+                :group   => self
+              }).merge_attributes(object) 
+            end
+          else
+            attributes[:group_config] = object
+          end
+        end
+
+        def launch_config
+          data = service.get_launch_config(identity)
+          attributes[:launch_config] = begin 
+            Fog::Rackspace::AutoScale::LaunchConfig.new({
+              :service => @service,
+              :group   => self
+            }).merge_attributes(data.body['launchConfiguration']) 
+          end
+          attributes[:launch_config]
+        end
+
+        def launch_config=(object={})
+          if object.is_a?(Hash)
+            attributes[:launch_config] = begin 
+              Fog::Rackspace::AutoScale::LaunchConfig.new({
+                :service => @service,
+                :group   => self
+              }).merge_attributes(object) 
+            end
+          else
+            attributes[:launch_config] = object
+          end
+        end
+
+        def policies
+          @policies ||= begin
+            Fog::Rackspace::AutoScale::Policies.new({
+              :service => service,
+              :group => self
+            })
+          end
+        end
+
+        def save
           requires :launch_config, :group_config, :policies
 
           data = service.create_group(launch_config, group_config, policies)
@@ -34,37 +88,22 @@ module Fog
           true
         end
 
-        def group_config
-          @group_config ||= begin
-            Fog::Rackspace::AutoScale::GroupConfig.new({
-              :service => service,
-              :group => self
-            })
-          end
-        end
-
-        def launch_config
-          @launch_config ||= begin
-            Fog::Rackspace::AutoScale::LaunchConfig.new({
-              :service => service,
-              :group => self
-            })
-          end
-        end
-
-        def policies
-          @policies ||= begin
-            Fog::Rackspace::Autoscale::Policies.new({
-              :service => service,
-              :group => self
-            })
-          end
-        end
-
         def state
           requires :identity
           data = service.get_group_state(identity)
-          merge_attributes(data.body['group'])
+          data.body['group']
+        end
+
+        def pause
+          requires :identity
+          data = service.pause_group_state(identity)
+          true
+        end
+
+        def resume
+          requires :identity
+          data = service.resume_group_state(identity)
+          true
         end
 
       end
diff --git a/lib/fog/rackspace/models/auto_scale/group_config.rb b/lib/fog/rackspace/models/auto_scale/group_config.rb
index 12a194f5d..cfaa2f049 100644
--- a/lib/fog/rackspace/models/auto_scale/group_config.rb
+++ b/lib/fog/rackspace/models/auto_scale/group_config.rb
@@ -3,27 +3,26 @@ require 'fog/core/model'
 module Fog
   module Rackspace
     class AutoScale
-      class GroupConfig < Fog::AutoScale::Rackspace::Config
-
-      	identity :id
+      class GroupConfig < Fog::Model
 
+        attribute :group
       	attribute :name
       	attribute :cooldown
-      	attribute :min_entities
-      	attribute :max_entities
+      	attribute :min_entities, :aliases => 'minEntities'
+      	attribute :max_entities, :aliases => 'maxEntities'
       	attribute :metadata
 
       	def update
-          requires :identity
-          options = {
-            'name' => name,
-            'cooldown' => cooldown,
-            'min_entities' => min_entities,
-            'max_entities' => max_entities,
-            'metadata' => metadata
-          }
+          
+          options = {}
 
-          data = service.update_group_config(identity, options)
+          options['name'] = name unless name.nil?
+          options['cooldown'] = cooldown unless cooldown.nil?
+          options['minEntities'] = min_entities
+          options['maxEntities'] = max_entities
+          options['metadata'] = metadata unless metadata.nil?
+
+          data = service.update_group_config(group.id, options)
           merge_attributes(data.body)
           true
         end
diff --git a/lib/fog/rackspace/models/auto_scale/launch_config.rb b/lib/fog/rackspace/models/auto_scale/launch_config.rb
index 55bcb00c9..e485c12c1 100644
--- a/lib/fog/rackspace/models/auto_scale/launch_config.rb
+++ b/lib/fog/rackspace/models/auto_scale/launch_config.rb
@@ -3,21 +3,19 @@ require 'fog/core/model'
 module Fog
   module Rackspace
     class AutoScale
-      class LaunchConfig < Fog::AutoScale::Rackspace::Config
-
-      	identity :id
+      class LaunchConfig < Fog::Model
 
+        attribute :group
       	attribute :type
       	attribute :args
 
       	def update
-          requires :identity
-          options = {
-            'type' => type,
-            'args' => args
-          }
+          
+          options = {}
+          options['type'] = type unless type.nil?
+          options['args'] = args unless args.nil?
 
-          data = service.update_launch_config(identity, options)
+          data = service.update_launch_config(group.id, options)
           merge_attributes(data.body['launchConfiguration'])
           true
         end
diff --git a/lib/fog/rackspace/models/auto_scale/policies.rb b/lib/fog/rackspace/models/auto_scale/policies.rb
index ddea70e64..8db3e1c8f 100644
--- a/lib/fog/rackspace/models/auto_scale/policies.rb
+++ b/lib/fog/rackspace/models/auto_scale/policies.rb
@@ -8,17 +8,26 @@ module Fog
 
         model Fog::Rackspace::AutoScale::Policy
 
+        attr_accessor :group
+
         def all
-          data = service.list_policies.body['policies']
+          data = service.list_policies(group.id).body['policies']
           load(data)
         end
 
         def get(policy_id)          
-          data = service.get_policy(policy_id).body['policy']
+          data = service.get_policy(group.id, policy_id).body['policy']
+          data['group_id'] = group.id
           new(data)
         rescue Fog::Rackspace::AutoScale::NotFound
           nil
         end
+
+        def create(attributes = {})
+          attributes['group_id'] = group.id
+          super(attributes)
+        end
+
       end
     end
   end
diff --git a/lib/fog/rackspace/models/auto_scale/policy.rb b/lib/fog/rackspace/models/auto_scale/policy.rb
index dd45bb0e1..a96f8491a 100644
--- a/lib/fog/rackspace/models/auto_scale/policy.rb
+++ b/lib/fog/rackspace/models/auto_scale/policy.rb
@@ -1,4 +1,5 @@
 require 'fog/core/model'
+require 'fog/rackspace/models/auto_scale/webhooks'
 
 module Fog
   module Rackspace
@@ -23,75 +24,104 @@ module Fog
       	attribute :type
 
       	# hash depending on the type chosen
-   		#	- "cron": "23 * * * *"
-   		#	- "at": "2013-06-05T03:12Z"
-   		#	- "check": {
-		# 	      "label": "Website check 1",
-		# 	      "type": "remote.http",
-		# 	      "details": {
-		# 	          "url": "http://www.example.com",
-		# 	          "method": "GET"
-		# 	      },
-		# 	      "monitoring_zones_poll": [
-		# 	          "mzA"
-		# 	      ],
-		# 	      "timeout": 30,
-		# 	      "period": 100,
-		# 	      "target_alias": "default"
-		# 	  },
-		# 	  "alarm_criteria": {
-		# 	       "criteria": "if (metric[\"duration\"] >= 2) { return new AlarmStatus(OK); } return new AlarmStatus(CRITICAL);"
-		# 	  }
+     		#	- "cron": "23 * * * *"
+     		#	- "at": "2013-06-05T03:12Z"
+     		#	- "check": {
+    		# 	      "label": "Website check 1",
+    		# 	      "type": "remote.http",
+    		# 	      "details": {
+    		# 	          "url": "http://www.example.com",
+    		# 	          "method": "GET"
+    		# 	      },
+    		# 	      "monitoring_zones_poll": [
+    		# 	          "mzA"
+    		# 	      ],
+    		# 	      "timeout": 30,
+    		# 	      "period": 100,
+    		# 	      "target_alias": "default"
+    		# 	  },
+    		# 	  "alarm_criteria": {
+    		# 	       "criteria": "if (metric[\"duration\"] >= 2) { return new AlarmStatus(OK); } return new AlarmStatus(CRITICAL);"
+    		# 	  }
       	attribute :args
 
       	attribute :desiredCapacity
 
-		def check_options(options)
-        	if options[:type] == 'schedule'
-        		args = options['args']
-        		raise MissingArgumentException(self.name, "cron OR at") if args['cron'].nil? && args['at'].nil?
+		    def check_attributes
+          raise MissingArgumentException(self.name, type) if type.nil?
+
+        	if type == 'schedule'
+        		raise MissingArgumentException(self.name, "args[cron] OR args[at]") if args['cron'].nil? && args['at'].nil?
         	end
+
         	true
         end
 
-      	def create(options)
+      	def save
           requires :name, :type, :cooldown
 
-          check_options
+          check_attributes
+
+          options = {}
+          options['name'] = name unless name.nil?
+          options['change'] = change unless change.nil?
+          options['changePercent'] = changePercent unless changePercent.nil?
+          options['cooldown'] = cooldown unless cooldown.nil?
+          options['type'] = type unless type.nil?
+          options['desiredCapacity'] = desiredCapacity unless desiredCapacity.nil?
+
+          if type == 'schedule'
+            options['args'] = args
+          end
 
           data = service.create_policy(group_id, options)
-          merge_attributes(data.body['group'])
           true
         end
 
       	def update
       		requires :identity
 
-      		options = {
-      			'name' => name,
-      			'change' => change,
-      			'changePercent' => changePercent,
-      			'cooldown' => cooldown,
-      			'type' => type,
-      			'args' => args,
-      			'desiredCapacity' => desiredCapacity
-      		}
+          check_attributes
 
-      		data = service.update_policy(identity, options)
+      		options = {}
+          options['name'] = name unless name.nil?
+          options['change'] = change unless change.nil?
+          options['changePercent'] = changePercent unless changePercent.nil?
+          options['cooldown'] = cooldown unless cooldown.nil?
+          options['type'] = type unless type.nil?
+          options['desiredCapacity'] = desiredCapacity unless desiredCapacity.nil?
+
+          if type == 'schedule'
+            options['args'] = args
+          end
+
+      		data = service.update_policy(group_id, identity, options)
       		merge_attributes(data.body)
       		true
       	end
 
       	def destroy
       		requires :identity
-      		service.delete_policy(identity)
+      		service.delete_policy(group_id, identity)
+          true
       	end
 
       	def execute
       		requires :identity
-      		service.execute_policy(identity)
+      		service.execute_policy(group_id, identity)
+          true
       	end
 
+        def webhooks
+          data = service.list_webhooks(group_id, self.id)
+
+          Fog::Rackspace::AutoScale::Webhooks.new({
+            :service   => service,
+            :policy_id => self.id,
+            :group_id  => group_id
+          }).merge_attributes(data.body)
+        end
+
       end
   	end
   end
diff --git a/lib/fog/rackspace/models/auto_scale/webhook.rb b/lib/fog/rackspace/models/auto_scale/webhook.rb
index 5b91892df..6d5931782 100644
--- a/lib/fog/rackspace/models/auto_scale/webhook.rb
+++ b/lib/fog/rackspace/models/auto_scale/webhook.rb
@@ -7,27 +7,48 @@ module Fog
 
       	identity :id
 
+        attribute :group_id
+        attribute :policy_id
+
       	attribute :name
       	attribute :metadata
       	attribute :links
 
+        def save
+          requires :name
+
+          options = {}
+          options['name'] = name unless name.nil?
+          options['metadata'] = metadata unless metadata.nil?
+
+          data = service.create_webhook(group_id, policy_id, options)
+          true
+        end
+
       	def update
-      		required :identity
+      		requires :identity
 
       		options = {
       			'name' => name,
       			'metadata' => metadata
       		}
 
-      		data = service.update_webhook(identity, options)
-      		merge_attribute(data.body)
+      		data = service.update_webhook(group_id, policy_id, identity, options)
+      		merge_attributes(data.body)
       	end
 
       	def destroy
-      		required :identity
-      		service.delete_webhook(identity)
+      		requires :identity 
+      		service.delete_webhook(group_id, policy_id, identity)
+          true
       	end
 
+        def execution_url
+          requires :links
+          link = links.select { |l| l['rel'] == 'capability' } 
+          link[0]['href']
+        end
+
       end
   	end
   end
diff --git a/lib/fog/rackspace/models/auto_scale/webhooks.rb b/lib/fog/rackspace/models/auto_scale/webhooks.rb
new file mode 100644
index 000000000..7d6a805ad
--- /dev/null
+++ b/lib/fog/rackspace/models/auto_scale/webhooks.rb
@@ -0,0 +1,37 @@
+require 'fog/core/collection'
+require 'fog/rackspace/models/auto_scale/webhook'
+
+module Fog
+  module Rackspace
+    class AutoScale
+      class Webhooks < Fog::Collection
+
+        model Fog::Rackspace::AutoScale::Webhook
+
+        attr_accessor :group_id
+        attr_accessor :policy_id
+
+        def all
+          data = service.list_webhooks(group_id, policy_id).body['webhooks']
+          load(data)
+        end
+
+        def get(webhook_id)          
+          data = service.get_webhook(group_id, policy_id, webhook_id).body['webhook']
+          data['group_id'] = group_id
+          data['policy_id'] = policy_id
+          new(data)
+        rescue Fog::Rackspace::AutoScale::NotFound
+          nil
+        end
+
+        def create(attributes = {})
+          attributes['group_id'] = group_id
+          attributes['policy_id'] = policy_id
+          super(attributes)
+        end
+
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/create_group.rb b/lib/fog/rackspace/requests/auto_scale/create_group.rb
index 54fb1a9dd..75a13f8a6 100644
--- a/lib/fog/rackspace/requests/auto_scale/create_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/create_group.rb
@@ -5,20 +5,21 @@ module Fog
 
         def create_group(launch_config, group_config, policies)
 
-          body['launchConfiguration'] = {
-            'args' => launch_config.args,
-            'type' => launch_config.type
+          body = {
+            'launchConfiguration' => {
+              'args' => launch_config.args,
+              'type' => launch_config.type
+            },
+            'groupConfiguration' => {
+              'name' => group_config.name,
+              'cooldown' => group_config.cooldown, 
+              'maxEntities' => group_config.max_entities,
+              'minEntities' => group_config.min_entities
+            },
+            'scalingPolicies' => policies
           }
 
-          body['groupConfiguration'] = {
-            'name' => group_config.name,
-            'cooldown' => group_config.cooldown, 
-            'maxEntities' => group_config.max_entities,
-            'minEntities' => group_config.min_entities,
-            'metadata' => group_config.metadata
-          }
-
-          body['scalingPolicies'] = policies.collect { |p| p.to_a }
+          body['groupConfiguration']['metadata'] = group_config.metadata unless group_config.metadata.nil?
 
           request(
             :expects => [201],
@@ -32,7 +33,6 @@ module Fog
       class Mock
         def create_group
           Fog::Mock.not_implemented
-
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/create_policy.rb b/lib/fog/rackspace/requests/auto_scale/create_policy.rb
new file mode 100644
index 000000000..a55033ce2
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/create_policy.rb
@@ -0,0 +1,27 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+        def create_policy(group_id, options)
+          
+          data = [
+            options
+          ]
+
+          request(
+            :method => 'POST',
+            :body => Fog::JSON.encode(data),
+            :path => "groups/#{group_id}/policies",
+            :expects => 201
+          )
+        end
+      end
+
+      class Mock
+        def create_policy(group_id, options)
+          Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/create_webhook.rb b/lib/fog/rackspace/requests/auto_scale/create_webhook.rb
new file mode 100644
index 000000000..f31813ae2
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/create_webhook.rb
@@ -0,0 +1,25 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+        def create_webhook(group_id, policy_id, options)
+
+          body = [options]
+
+          request(
+            :method => 'POST',
+            :body => Fog::JSON.encode(body),
+            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks",
+            :expects => 201
+          )
+        end
+      end
+
+      class Mock
+        def create_webhook(group_id, policy_id, options)
+          Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/delete_policy.rb b/lib/fog/rackspace/requests/auto_scale/delete_policy.rb
new file mode 100644
index 000000000..28ac1365f
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/delete_policy.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def delete_policy(group_id, policy_id)
+          request(
+            :expects => [204],
+            :method => 'DELETE',
+            :path => "groups/#{group_id}/policies/#{policy_id}"
+          )
+        end
+      end
+
+      class Mock
+        def delete_group(group_id, policy_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb b/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb
new file mode 100644
index 000000000..d5fc82e35
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def delete_webhook(group_id, policy_id, webhook_id)
+          request(
+            :expects => [204],
+            :method => 'DELETE',
+            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks/#{webhook_id}"
+          )
+        end
+      end
+
+      class Mock
+        def delete_webhook(group_id, policy_id, webhook_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb b/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb
new file mode 100644
index 000000000..cdcaa636b
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def execute_anonymous_webhook(capability_version, capability_hash)
+          request(
+            :expects => [202],
+            :method => 'POST',
+            :path => "execute/#{capability_version}/#{capability_hash}"
+          )
+        end
+      end
+
+      class Mock
+        def execute_anonymous_webhook(capability_version, capability_hash)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/execute_policy.rb b/lib/fog/rackspace/requests/auto_scale/execute_policy.rb
new file mode 100644
index 000000000..01af48c51
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/execute_policy.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def execute_policy(group_id, policy_id)
+          request(
+            :expects => [202],
+            :method => 'POST',
+            :path => "groups/#{group_id}/policies/#{policy_id}/execute"
+          )
+        end
+      end
+
+      class Mock
+        def execute_policy(group_id, policy_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_config.rb b/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
new file mode 100644
index 000000000..592321c26
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_group_config(group_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/config",
+          )
+        end
+      end
+
+      class Mock
+        def get_group_config(group_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
index 66ca58b8b..4710e9a2a 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
@@ -9,7 +9,7 @@ module Fog
             :expects => [200],
             :method => 'GET',
             :path => "groups/#{group_id}/state",
-            )
+          )
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb b/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
new file mode 100644
index 000000000..a2e6f3963
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_launch_config(group_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/launch",
+          )
+        end
+      end
+
+      class Mock
+        def get_launch_config(group_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_policy.rb b/lib/fog/rackspace/requests/auto_scale/get_policy.rb
new file mode 100644
index 000000000..d8bda1e38
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_policy.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_policy(group_id, policy_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/policies/#{policy_id}",
+          )
+        end
+      end
+
+      class Mock
+        def get_policy(group_id, policy_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_webhook.rb b/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
new file mode 100644
index 000000000..25bb35b5d
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+
+      class Real
+
+        def get_webhook(group_id, policy_id, webhook_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks/#{webhook_id}",
+          )
+        end
+      end
+
+      class Mock
+        def get_webhook(group_id, policy_id, webhook_id)
+          Fog::Mock.not_implemented
+        end
+      end
+
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/list_policies.rb b/lib/fog/rackspace/requests/auto_scale/list_policies.rb
new file mode 100644
index 000000000..ac16c5bcf
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/list_policies.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def list_policies(group_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/policies"
+          )
+        end
+      end
+
+      class Mock
+        def list_groups(group_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb b/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb
new file mode 100644
index 000000000..eb83f61c2
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb
@@ -0,0 +1,22 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def list_webhooks(group_id, policy_id)
+          request(
+            :expects => [200],
+            :method => 'GET',
+            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks"
+          )
+        end
+      end
+
+      class Mock
+        def list_webhooks(group_id, policy_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
diff --git a/lib/fog/rackspace/requests/auto_scale/pause_group_state.rb b/lib/fog/rackspace/requests/auto_scale/pause_group_state.rb
new file mode 100644
index 000000000..1d4332eb5
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/pause_group_state.rb
@@ -0,0 +1,23 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def pause_group_state(group_id)
+          Fog::Real.not_implemented
+          # request(
+          #   :expects => [204],
+          #   :method => 'POST',
+          #   :path => 'groups/#{group_id}/pause'
+          # )
+        end
+      end
+
+      class Mock
+        def pause_group_state(group_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/resume_group_state.rb b/lib/fog/rackspace/requests/auto_scale/resume_group_state.rb
new file mode 100644
index 000000000..c2628cec7
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/resume_group_state.rb
@@ -0,0 +1,23 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def resume_group_state(group_id)
+          Fog::Real.not_implemented
+          # request(
+          #   :expects => [204],
+          #   :method => 'POST',
+          #   :path => 'groups/#{group_id}/resume'
+          # )
+        end
+      end
+
+      class Mock
+        def resume_group_state(group_id)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/update_group_config.rb b/lib/fog/rackspace/requests/auto_scale/update_group_config.rb
new file mode 100644
index 000000000..faab81702
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/update_group_config.rb
@@ -0,0 +1,26 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def update_group_config(group_id, options)
+          
+          body = options
+
+          request(
+            :expects => [204],
+            :method => 'PUT',
+            :path => "groups/#{group_id}/config",
+            :body => Fog::JSON.encode(body)
+          )
+        end
+      end
+
+      class Mock
+        def update_group_config(group_id, options)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb b/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb
new file mode 100644
index 000000000..35e3f4d18
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb
@@ -0,0 +1,26 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def update_launch_config(group_id, options)
+          
+          body = options
+
+          request(
+            :expects => [204],
+            :method => 'PUT',
+            :path => "groups/#{group_id}/launch",
+            :body => Fog::JSON.encode(body)
+          )
+        end
+      end
+
+      class Mock
+        def update_launch_config(group_id, options)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/update_policy.rb b/lib/fog/rackspace/requests/auto_scale/update_policy.rb
new file mode 100644
index 000000000..3351cdab1
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/update_policy.rb
@@ -0,0 +1,24 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def update_policy(group_id, policy_id, options)
+          
+          request(
+            :expects => [204],
+            :method => 'PUT',
+            :path => "groups/#{group_id}/policies/#{policy_id}",
+            :body => Fog::JSON.encode(options)
+          )
+        end
+      end
+
+      class Mock
+        def update_policy(group_id, policy_id, options)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/update_webhook.rb b/lib/fog/rackspace/requests/auto_scale/update_webhook.rb
new file mode 100644
index 000000000..6c76ab2f4
--- /dev/null
+++ b/lib/fog/rackspace/requests/auto_scale/update_webhook.rb
@@ -0,0 +1,26 @@
+module Fog
+  module Rackspace
+    class AutoScale
+      class Real
+
+        def update_webhook(group_id, policy_id, webhook_id, options)
+          
+          body = options
+
+          request(
+            :expects => [204],
+            :method => 'PUT',
+            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks/#{webhook_id}",
+            :body => Fog::JSON.encode(body)
+          )
+        end
+      end
+
+      class Mock
+        def update_webhook(group_id, policy_id, webhook_id, options)
+           Fog::Mock.not_implemented
+        end
+      end
+    end
+  end
+end
\ No newline at end of file

From ef04d46841a2b73886a288c85ce656cfa65ded1c Mon Sep 17 00:00:00 2001
From: jamiehannaford <jamie@limetree.org>
Date: Wed, 28 Aug 2013 14:23:21 +0200
Subject: [PATCH 04/10] Removing two superfluous files

---
 lib/fog/rackspace/models/auto_scale/config.rb | 17 -------------
 .../requests/auto_scale/get_config.rb         | 24 -------------------
 2 files changed, 41 deletions(-)
 delete mode 100644 lib/fog/rackspace/models/auto_scale/config.rb
 delete mode 100644 lib/fog/rackspace/requests/auto_scale/get_config.rb

diff --git a/lib/fog/rackspace/models/auto_scale/config.rb b/lib/fog/rackspace/models/auto_scale/config.rb
deleted file mode 100644
index fc6f5f15b..000000000
--- a/lib/fog/rackspace/models/auto_scale/config.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-require 'fog/core/model'
-
-module Fog
-  module Rackspace
-    class AutoScale
-      class Config < Fog::Model
-
-        def pause
-        end
-
-        def resume
-        end
-
-      end
-  	end
-  end
-end
\ No newline at end of file
diff --git a/lib/fog/rackspace/requests/auto_scale/get_config.rb b/lib/fog/rackspace/requests/auto_scale/get_config.rb
deleted file mode 100644
index ca9be79bc..000000000
--- a/lib/fog/rackspace/requests/auto_scale/get_config.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-module Fog
-  module Rackspace
-    class AutoScale
-
-      class Real
-
-        def get_config(group_id)
-          request(
-            :expects => [200],
-            :method => 'GET',
-            :path => "groups/#{group_id}/config",
-            )
-        end
-      end
-
-      class Mock
-        def get_config(group_id)
-          Fog::Mock.not_implemented
-        end
-      end
-
-    end
-  end
-end
\ No newline at end of file

From 06dcd549db132505f879697f1cf52ea1ad3259a1 Mon Sep 17 00:00:00 2001
From: jamiehannaford <jamie@limetree.org>
Date: Thu, 5 Sep 2013 14:10:13 +0200
Subject: [PATCH 05/10] Shindo tests are completed; finished adding Mock data

---
 lib/fog/rackspace/mock_data.rb                |  64 +++++++
 lib/fog/rackspace/models/auto_scale/group.rb  | 129 +++++++++++--
 .../models/auto_scale/group_config.rb         |  29 ++-
 lib/fog/rackspace/models/auto_scale/groups.rb |  21 ++
 .../models/auto_scale/launch_config.rb        |  24 ++-
 .../rackspace/models/auto_scale/policies.rb   |  31 +++
 lib/fog/rackspace/models/auto_scale/policy.rb | 109 +++++++++--
 .../rackspace/models/auto_scale/webhook.rb    |  62 +++++-
 .../rackspace/models/auto_scale/webhooks.rb   |  27 +++
 .../requests/auto_scale/create_group.rb       |  45 ++++-
 .../requests/auto_scale/create_policy.rb      |  26 ++-
 .../requests/auto_scale/create_webhook.rb     |  34 +++-
 .../requests/auto_scale/delete_group.rb       |   3 +-
 .../requests/auto_scale/delete_policy.rb      |  11 +-
 .../requests/auto_scale/delete_webhook.rb     |  14 +-
 .../auto_scale/execute_anonymous_webhook.rb   |   2 +-
 .../requests/auto_scale/execute_policy.rb     |   2 +-
 .../requests/auto_scale/get_group.rb          |   7 +-
 .../requests/auto_scale/get_group_config.rb   |   8 +-
 .../requests/auto_scale/get_group_state.rb    |  40 +++-
 .../requests/auto_scale/get_launch_config.rb  |   8 +-
 .../requests/auto_scale/get_policy.rb         |  13 +-
 .../requests/auto_scale/get_webhook.rb        |  17 +-
 .../requests/auto_scale/list_groups.rb        |   2 +-
 .../requests/auto_scale/list_policies.rb      |   5 +-
 .../requests/auto_scale/list_webhooks.rb      |  13 +-
 .../auto_scale/update_group_config.rb         |  15 +-
 .../auto_scale/update_launch_config.rb        |  12 +-
 .../requests/auto_scale/update_policy.rb      |  11 +-
 .../requests/auto_scale/update_webhook.rb     |  20 +-
 tests/rackspace/models/auto_scale/group.rb    |  20 ++
 tests/rackspace/models/auto_scale/groups.rb   |  20 ++
 tests/rackspace/models/auto_scale/policies.rb |  21 ++
 tests/rackspace/models/auto_scale/policy.rb   |  27 +++
 tests/rackspace/models/auto_scale/webhook.rb  |  30 +++
 tests/rackspace/models/auto_scale/webhooks.rb |  26 +++
 .../requests/auto_scale/config_tests.rb       |  61 ++++++
 .../requests/auto_scale/group_tests.rb        |  49 +++++
 tests/rackspace/requests/auto_scale/helper.rb | 181 ++++++++++++++++++
 .../requests/auto_scale/policy_tests.rb       |  75 ++++++++
 .../requests/auto_scale/webhook_tests.rb      |  64 +++++++
 .../requests/compute_v2/address_tests.rb      |   2 +-
 42 files changed, 1312 insertions(+), 68 deletions(-)
 create mode 100644 tests/rackspace/models/auto_scale/group.rb
 create mode 100644 tests/rackspace/models/auto_scale/groups.rb
 create mode 100644 tests/rackspace/models/auto_scale/policies.rb
 create mode 100644 tests/rackspace/models/auto_scale/policy.rb
 create mode 100644 tests/rackspace/models/auto_scale/webhook.rb
 create mode 100644 tests/rackspace/models/auto_scale/webhooks.rb
 create mode 100644 tests/rackspace/requests/auto_scale/config_tests.rb
 create mode 100644 tests/rackspace/requests/auto_scale/group_tests.rb
 create mode 100644 tests/rackspace/requests/auto_scale/helper.rb
 create mode 100644 tests/rackspace/requests/auto_scale/policy_tests.rb
 create mode 100644 tests/rackspace/requests/auto_scale/webhook_tests.rb

diff --git a/lib/fog/rackspace/mock_data.rb b/lib/fog/rackspace/mock_data.rb
index 07aa4921c..2cac0d63a 100644
--- a/lib/fog/rackspace/mock_data.rb
+++ b/lib/fog/rackspace/mock_data.rb
@@ -113,6 +113,67 @@ module Fog
               "extra_specs" => {},
             }
 
+            #AutoScale
+            launch_config = {
+              "args" => {
+                  "loadBalancers" => [
+                    {
+                      "port" => 8080,
+                      "loadBalancerId" => 9099
+                    }
+                  ],
+                  "server" => {
+                    "name" => "autoscale_server",
+                    "imageRef" => "0d589460-f177-4b0f-81c1-8ab8903ac7d8",
+                    "flavorRef" => "2",
+                    "OS-DCF =>diskConfig" => "AUTO",
+                    "metadata" => {
+                      "build_config" => "core",
+                      "meta_key_1" => "meta_value_1",
+                      "meta_key_2" => "meta_value_2"
+                    },
+                    "networks" => [
+                      {
+                        "uuid" => "11111111-1111-1111-1111-111111111111"
+                      },
+                      {
+                        "uuid" => "00000000-0000-0000-0000-000000000000"
+                      }
+                    ],
+                    "personality" => [
+                      {
+                        "path" => "/root/.csivh",
+                        "contents" => "VGhpcyBpcyBhIHRlc3QgZmlsZS4="
+                      }
+                    ]
+                  }
+                },
+                "type" => "launch_server"
+            }
+
+            group_config = {
+              "max_entities" => 10,
+              "cooldown" => 360,
+              "name" => "testscalinggroup198547",
+              "min_entities" => 0,
+              "metadata" => {
+                "gc_meta_key_2" => "gc_meta_value_2",
+                "gc_meta_key_1" => "gc_meta_value_1"
+              }
+            }
+
+            policy = {
+              "cooldown" => 0,
+              "type" => "webhook",
+              "name" => "scale up by 1",
+              "change" => 1
+            }
+
+            webhook = {
+              "name" => "webhook name",
+              "metadata" => {'foo' => 'bar'}
+            }
+
             mock_data = {
               #Compute V2
               :flavors  => Hash.new { |h,k| h[k] = flavor  unless k == NOT_FOUND_ID },
@@ -128,6 +189,9 @@ module Fog
               :snapshots          => {},
               :volume_attachments => [],
               :volume_types       => {volume_type1_id => volume_type1, volume_type2_id => volume_type2},
+
+              #Autoscale
+              :autoscale_groups => {}
             }
             
             # seed with initial data
diff --git a/lib/fog/rackspace/models/auto_scale/group.rb b/lib/fog/rackspace/models/auto_scale/group.rb
index 68a6cf32e..1e1c5ad22 100644
--- a/lib/fog/rackspace/models/auto_scale/group.rb
+++ b/lib/fog/rackspace/models/auto_scale/group.rb
@@ -7,9 +7,13 @@ module Fog
   module Rackspace
     class AutoScale
       class Group < Fog::Model
-         
+        
+        # @!attribute [r] id
+        # @return [String] The autoscale group's id   
         identity :id
 
+        # @!attribute [r] links
+        # @return [Array] group links.
         attribute :links
 
         def initialize(attributes={})
@@ -17,18 +21,35 @@ module Fog
           super
         end
 
+        # Gets the group configuration for this autoscale group. The configuration describes the 
+        # minimum number of entities in the group, the maximum number of entities in the group, 
+        # the global cooldown time for the group, and other metadata.
+        #
+        # @return [Fog::Rackspace::AutoScale::GroupConfiguration] group_config if found
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupConfig_v1.0__tenantId__groups__groupId__config_Configurations.html
         def group_config
-          data = service.get_group_config(identity)
-          attributes[:group_config] = begin 
-            Fog::Rackspace::AutoScale::GroupConfig.new({
-              :service => @service,
-              :group   => self
-            }).merge_attributes(data.body['groupConfiguration']) 
+          if attributes[:group_config].nil?
+            data = service.get_group_config(identity)
+            attributes[:group_config] = begin 
+              Fog::Rackspace::AutoScale::GroupConfig.new({
+                :service => @service,
+                :group   => self
+              }).merge_attributes(data.body['groupConfiguration']) 
+            end
           end
           attributes[:group_config]
         end
 
-        def group_config=(object={})
+        # Sets the configuration when this object is populated.
+        #
+        # @param object [Hash<String, String>] Object which will stock the object
+        def group_config=(object = {})
           if object.is_a?(Hash)
             attributes[:group_config] = begin 
               Fog::Rackspace::AutoScale::GroupConfig.new({
@@ -41,17 +62,34 @@ module Fog
           end
         end
 
+        # Gets the launch configuration for this autoscale group. The launch configuration describes 
+        # the details of how to create a server, from what image to create a server, which load balancers 
+        # to join the server to, which networks to add the server to, and other metadata.
+        #
+        # @return [Fog::Rackspace::AutoScale::LaunchConfiguration] group_config if found
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getLaunchConfig_v1.0__tenantId__groups__groupId__launch_Configurations.html
         def launch_config
-          data = service.get_launch_config(identity)
-          attributes[:launch_config] = begin 
-            Fog::Rackspace::AutoScale::LaunchConfig.new({
-              :service => @service,
-              :group   => self
-            }).merge_attributes(data.body['launchConfiguration']) 
+          if attributes[:launch_config].nil?
+            data = service.get_launch_config(identity)
+            attributes[:launch_config] = begin 
+              Fog::Rackspace::AutoScale::LaunchConfig.new({
+                :service => @service,
+                :group   => self
+              }).merge_attributes(data.body['launchConfiguration']) 
+            end
           end
           attributes[:launch_config]
         end
 
+        # Sets the configuration when this object is populated.
+        #
+        # @param object [Hash<String, String>] Object which will stock the object
         def launch_config=(object={})
           if object.is_a?(Hash)
             attributes[:launch_config] = begin 
@@ -65,6 +103,13 @@ module Fog
           end
         end
 
+        # For the specified autoscaling group, this operation returns a list of the scaling policies 
+        # that are available to the group. Each policy is described in terms of an ID, name, type, 
+        # adjustment, cooldown time, and links.
+        #
+        # @return [Fog::Rackspace::AutoScale::Policies] policies
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def policies
           @policies ||= begin
             Fog::Rackspace::AutoScale::Policies.new({
@@ -74,6 +119,18 @@ module Fog
           end
         end
 
+        # Creates group
+        # * requires attributes: :launch_config, :group_config, :policies
+        # 
+        # @return [Boolean] returns true if group is being created
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see Groups#create
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createGroup_v1.0__tenantId__groups_Groups.html   
         def save
           requires :launch_config, :group_config, :policies
 
@@ -82,24 +139,66 @@ module Fog
           true
         end
 
+        # Destroy the group
+        #
+        # @return [Boolean] returns true if group has started deleting
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deleteGroup_v1.0__tenantId__groups__groupId__Groups.html
         def destroy
           requires :identity
-          service.delete_server(identity)
+          service.delete_group(identity)
           true
         end
 
+        # Get the current state of the autoscale group
+        #
+        # @return [String] the state of the group
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupState_v1.0__tenantId__groups__groupId__state_Groups.html
         def state
           requires :identity
           data = service.get_group_state(identity)
           data.body['group']
         end
 
+        # This operation pauses all execution of autoscaling policies.
+        # 
+        # @note NOT IMPLEMENTED YET
+        # @return [Boolean] returns true if paused
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_pauseGroup_v1.0__tenantId__groups__groupId__pause_Groups.html
         def pause
           requires :identity
           data = service.pause_group_state(identity)
           true
         end
 
+        # This operation resumes all execution of autoscaling policies.
+        # 
+        # @note NOT IMPLEMENTED YET
+        # @return [Boolean] returns true if resumed
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_resumeGroup_v1.0__tenantId__groups__groupId__resume_Groups.html
         def resume
           requires :identity
           data = service.resume_group_state(identity)
diff --git a/lib/fog/rackspace/models/auto_scale/group_config.rb b/lib/fog/rackspace/models/auto_scale/group_config.rb
index cfaa2f049..58ffd625f 100644
--- a/lib/fog/rackspace/models/auto_scale/group_config.rb
+++ b/lib/fog/rackspace/models/auto_scale/group_config.rb
@@ -5,14 +5,41 @@ module Fog
     class AutoScale
       class GroupConfig < Fog::Model
 
+        # @!attribute [r] group
+        # @return [Fog::Rackspace::AutoScale::Group] The parent group
         attribute :group
+
+        # @!attribute [r] name
+        # @return [String] The name of the group 
       	attribute :name
+
+        # @!attribute [r] cooldown
+        # @return [String] The group's cooldown
       	attribute :cooldown
+
+        # @!attribute [r] min_entities
+        # @return [Fixnum] The minimum amount of units which should exist in the group
       	attribute :min_entities, :aliases => 'minEntities'
+
+        # @!attribute [r] max_entities
+        # @return [Fixnum] The maximum amount of units which should exist in the group
       	attribute :max_entities, :aliases => 'maxEntities'
+
+        # @!attribute [r] metadata
+        # @return [Array] The group's metadata
       	attribute :metadata
 
-      	def update
+        # Update this group's configuration
+        #
+        # @return [Boolean] returns true if group config has been updated
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putGroupConfig_v1.0__tenantId__groups__groupId__config_Configurations.html
+        def update
           
           options = {}
 
diff --git a/lib/fog/rackspace/models/auto_scale/groups.rb b/lib/fog/rackspace/models/auto_scale/groups.rb
index a7ea34a29..a031d4e1d 100644
--- a/lib/fog/rackspace/models/auto_scale/groups.rb
+++ b/lib/fog/rackspace/models/auto_scale/groups.rb
@@ -8,11 +8,32 @@ module Fog
 
         model Fog::Rackspace::AutoScale::Group
 
+        # Returns list of autoscale grouos
+        #
+        # @return [Fog::Rackspace::AutoScale::Groups] Retrieves a list images.
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        # 
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroups_v1.0__tenantId__groups_Groups.html
         def all
           data = service.list_groups.body['groups']
           load(data)
         end
 
+        # Returns an individual autoscale group
+        #
+        # @return [Fog::Rackspace::AutoScale::Group] Retrieves a list images.
+        # @return nil if not found
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        # 
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupManifest_v1.0__tenantId__groups__groupId__Groups.html
         def get(group_id)          
           data = service.get_group(group_id).body['group']
           new(data)
diff --git a/lib/fog/rackspace/models/auto_scale/launch_config.rb b/lib/fog/rackspace/models/auto_scale/launch_config.rb
index e485c12c1..2778bdd2d 100644
--- a/lib/fog/rackspace/models/auto_scale/launch_config.rb
+++ b/lib/fog/rackspace/models/auto_scale/launch_config.rb
@@ -5,11 +5,29 @@ module Fog
     class AutoScale
       class LaunchConfig < Fog::Model
 
+        # @!attribute [r] group
+        # @return [Fog::Rackspace::AutoScale::Group] The parent group
         attribute :group
-      	attribute :type
-      	attribute :args
+      	
+        # @!attribute [r] type
+        # @return [Fog::Rackspace::AutoScale::Group] The type of operation (usually "launch_server")
+        attribute :type
+      	
+        # @!attribute [r] args
+        # @return [Fog::Rackspace::AutoScale::Group] The arguments for the operation
+        attribute :args
 
-      	def update
+        # Update this group's launch configuration
+        #
+        # @return [Boolean] returns true if launch config has been updated
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putLaunchConfig_v1.0__tenantId__groups__groupId__launch_Configurations.html
+        def update
           
           options = {}
           options['type'] = type unless type.nil?
diff --git a/lib/fog/rackspace/models/auto_scale/policies.rb b/lib/fog/rackspace/models/auto_scale/policies.rb
index 8db3e1c8f..6f8222225 100644
--- a/lib/fog/rackspace/models/auto_scale/policies.rb
+++ b/lib/fog/rackspace/models/auto_scale/policies.rb
@@ -10,11 +10,32 @@ module Fog
 
         attr_accessor :group
 
+        # Returns list of autoscale policies
+        #
+        # @return [Fog::Rackspace::AutoScale::Policies] Retrieves policies
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        # 
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def all
           data = service.list_policies(group.id).body['policies']
           load(data)
         end
 
+        # Returns an individual autoscale policy
+        #
+        # @return [Fog::Rackspace::AutoScale::Group] Retrieves a policy
+        # @return nil if not found
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        # 
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
         def get(policy_id)          
           data = service.get_policy(group.id, policy_id).body['policy']
           data['group_id'] = group.id
@@ -23,6 +44,16 @@ module Fog
           nil
         end
 
+        # Create an autoscale policy
+        #
+        # @return [Fog::Rackspace::AutoScale::Policy] Returns the new policy
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        # 
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def create(attributes = {})
           attributes['group_id'] = group.id
           super(attributes)
diff --git a/lib/fog/rackspace/models/auto_scale/policy.rb b/lib/fog/rackspace/models/auto_scale/policy.rb
index a96f8491a..94030a6fd 100644
--- a/lib/fog/rackspace/models/auto_scale/policy.rb
+++ b/lib/fog/rackspace/models/auto_scale/policy.rb
@@ -6,24 +6,42 @@ module Fog
     class AutoScale
       class Policy < Fog::Model
 
+        # @!attribute [r] id
+        # @return [String] The policy id   
       	identity :id
 
+        # @!attribute [r] group_id
+        # @return [String] The autoscale group's id
       	attribute :group_id
 
-      	attribute :links
-      	attribute :name
+      	# @!attribute [r] links
+        # @return [Array] Policy links
+        attribute :links
       	
-      	# integer
-      	attribute :change
-      	attribute :changePercent
+        # @!attribute [r] name
+        # @return [String] The policy's name
+        attribute :name
+      	
+      	# @!attribute [r] change
+        # @return [Fixnum] The fixed change to the autoscale group's number of units
+        attribute :change
+      	
+        # @!attribute [r] changePercent
+        # @return [Fixnum] The percentage change to the autoscale group's number of units
+        attribute :changePercent
 
-      	# integer
-      	attribute :cooldown
+      	# @!attribute [r] cooldown
+        # @return [Fixnum] The policy's cooldown
+        attribute :cooldown
 
-      	# webhook|schedule|cloud_monitoring
-      	attribute :type
+      	# @!attribute [r] type
+        # @note Can only be "webhook", "schedule" or "cloud_monitoring"
+        # @return [String] The policy's type
+        attribute :type
 
-      	# hash depending on the type chosen
+      	# @!attribute [r] args
+        # @note An example might be:
+        #
      		#	- "cron": "23 * * * *"
      		#	- "at": "2013-06-05T03:12Z"
      		#	- "check": {
@@ -43,11 +61,21 @@ module Fog
     		# 	  "alarm_criteria": {
     		# 	       "criteria": "if (metric[\"duration\"] >= 2) { return new AlarmStatus(OK); } return new AlarmStatus(CRITICAL);"
     		# 	  }
+        #
+        # @return [String] Arguments used for the policy
       	attribute :args
 
+        # @!attribute [r] desiredCapacity
+        # @return [Fixnum] The desired capacity of the group
       	attribute :desiredCapacity
 
-		    def check_attributes
+        # Basic sanity check to make sure attributes are valid
+        #
+        # @raise MissingArgumentException If no type is set
+        # @raise MissingArgumentException If args attribute is missing required keys (if type == 'schedule')
+		    
+        # @return [Boolean] Returns true if the check passes
+        def check_attributes
           raise MissingArgumentException(self.name, type) if type.nil?
 
         	if type == 'schedule'
@@ -57,7 +85,19 @@ module Fog
         	true
         end
 
-      	def save
+      	# Creates policy
+        # * requires attributes: :name, :type, :cooldown
+        # 
+        # @return [Boolean] returns true if policy is being created
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see Policies#create
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
+        def save
           requires :name, :type, :cooldown
 
           check_attributes
@@ -75,10 +115,21 @@ module Fog
           end
 
           data = service.create_policy(group_id, options)
+          merge_attributes(data.body['policies'][0])
           true
         end
 
-      	def update
+      	# Updates the policy
+        #
+        # @return [Boolean] returns true if policy has started updating
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putPolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
+        def update
       		requires :identity
 
           check_attributes
@@ -100,18 +151,46 @@ module Fog
       		true
       	end
 
-      	def destroy
+      	# Destroy the policy
+        #
+        # @return [Boolean] returns true if policy has started deleting
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deletePolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
+        def destroy
       		requires :identity
       		service.delete_policy(group_id, identity)
           true
       	end
 
-      	def execute
+      	# Executes the scaling policy
+        #
+        # @return [Boolean] returns true if policy has been executed
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_executePolicy_v1.0__tenantId__groups__groupId__policies__policyId__execute_Policies.html
+        def execute
       		requires :identity
       		service.execute_policy(group_id, identity)
           true
       	end
 
+        # Gets the associated webhooks for this policy
+        #
+        # @return [Fog::Rackspace::AutoScale::Webhooks] returns Webhooks
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         def webhooks
           data = service.list_webhooks(group_id, self.id)
 
diff --git a/lib/fog/rackspace/models/auto_scale/webhook.rb b/lib/fog/rackspace/models/auto_scale/webhook.rb
index 6d5931782..56fcf2f67 100644
--- a/lib/fog/rackspace/models/auto_scale/webhook.rb
+++ b/lib/fog/rackspace/models/auto_scale/webhook.rb
@@ -5,15 +5,42 @@ module Fog
     class AutoScale
       class Webhook < Fog::Model
 
-      	identity :id
+      	# @!attribute [r] id
+        # @return [String] The webhook id   
+        identity :id
 
+        # @!attribute [r] id
+        # @return [String] The group id (i.e. grand-parent)
         attribute :group_id
+        
+        # @!attribute [r] id
+        # @return [String] The policy id (i.e. parent)
         attribute :policy_id
 
-      	attribute :name
-      	attribute :metadata
-      	attribute :links
+      	# @!attribute [r] name
+        # @return [String] The webhook name
+        attribute :name
+      	
+        # @!attribute [r] metadata
+        # @return [Array] The metadata
+        attribute :metadata
+      	
+        # @!attribute [r] links
+        # @return [Array] The webhook links
+        attribute :links
 
+        # Creates webhook
+        # * requires attribute: :name
+        # 
+        # @return [Boolean] returns true if webhook is being created
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see Webhooks#create
+        # @see 
         def save
           requires :name
 
@@ -22,10 +49,21 @@ module Fog
           options['metadata'] = metadata unless metadata.nil?
 
           data = service.create_webhook(group_id, policy_id, options)
+          merge_attributes(data.body['webhooks'][0])
           true
         end
 
-      	def update
+      	# Updates the webhook
+        #
+        # @return [Boolean] returns true if webhook has started updating
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
+        def update
       		requires :identity
 
       		options = {
@@ -37,12 +75,24 @@ module Fog
       		merge_attributes(data.body)
       	end
 
-      	def destroy
+      	# Destroy the webhook
+        #
+        # @return [Boolean] returns true if webhook has started deleting
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        #
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deleteWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
+        def destroy
       		requires :identity 
       		service.delete_webhook(group_id, policy_id, identity)
           true
       	end
 
+        # Retrieves the URL for anonymously executing the policy webhook
+        # @return [String] the URL
         def execution_url
           requires :links
           link = links.select { |l| l['rel'] == 'capability' } 
diff --git a/lib/fog/rackspace/models/auto_scale/webhooks.rb b/lib/fog/rackspace/models/auto_scale/webhooks.rb
index 7d6a805ad..43be4f82f 100644
--- a/lib/fog/rackspace/models/auto_scale/webhooks.rb
+++ b/lib/fog/rackspace/models/auto_scale/webhooks.rb
@@ -11,11 +11,30 @@ module Fog
         attr_accessor :group_id
         attr_accessor :policy_id
 
+        # Returns list of autoscale webhooks
+        #
+        # @return [Fog::Rackspace::AutoScale::Policies] Retrieves webhooks
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         def all
           data = service.list_webhooks(group_id, policy_id).body['webhooks']
           load(data)
         end
 
+        # Returns an individual webhook
+        #
+        # @return [Fog::Rackspace::AutoScale::Webhook] Retrieves a webhook
+        # @return nil if not found
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
+        # 
+        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
         def get(webhook_id)          
           data = service.get_webhook(group_id, policy_id, webhook_id).body['webhook']
           data['group_id'] = group_id
@@ -25,6 +44,14 @@ module Fog
           nil
         end
 
+        # Create a webhook
+        #
+        # @return [Fog::Rackspace::AutoScale::Webhook] Returns the new webhook
+        #
+        # @raise [Fog::Rackspace::AutoScale:::NotFound] - HTTP 404
+        # @raise [Fog::Rackspace::AutoScale:::BadRequest] - HTTP 400
+        # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
+        # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         def create(attributes = {})
           attributes['group_id'] = group_id
           attributes['policy_id'] = policy_id
diff --git a/lib/fog/rackspace/requests/auto_scale/create_group.rb b/lib/fog/rackspace/requests/auto_scale/create_group.rb
index 75a13f8a6..d73fde882 100644
--- a/lib/fog/rackspace/requests/auto_scale/create_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/create_group.rb
@@ -5,6 +5,14 @@ module Fog
 
         def create_group(launch_config, group_config, policies)
 
+          if !launch_config.is_a?(LaunchConfig)
+            raise ArgumentError, 'launch_config needs to be an instance of Fog::Rackspace::AutoScale::LaunchConfig'
+          end
+
+          if !group_config.is_a?(GroupConfig)
+            raise ArgumentError, 'group_config needs to be an instance of Fog::Rackspace::AutoScale::GroupConfig'
+          end
+
           body = {
             'launchConfiguration' => {
               'args' => launch_config.args,
@@ -20,7 +28,7 @@ module Fog
           }
 
           body['groupConfiguration']['metadata'] = group_config.metadata unless group_config.metadata.nil?
-
+          
           request(
             :expects => [201],
             :method => 'POST',
@@ -31,8 +39,39 @@ module Fog
       end
 
       class Mock
-        def create_group
-          Fog::Mock.not_implemented
+        def create_group(launch_config, group_config, policies)
+          
+          group_id = Fog::Rackspace::MockData.uuid
+
+          # Construct group structure
+          group = {
+            'launchConfiguration' => launch_config,
+            'groupConfiguration' => group_config,
+            'scalingPolicies' => policies,
+            'id' => group_id
+          } 
+
+          # Add links for HTTP response
+          group['scalingPolicies'][0]['links'] = [
+            {
+              "href" => "https://ord.autoscale.api.rackspacecloud.com/v1.0/829409/groups/6791761b-821a-4d07-820d-0b2afc7dd7f6/policies/dceb14ac-b2b3-4f06-aac9-a5b6cd5d40e1/",
+              "rel" => "self"
+            }
+          ]
+
+          group['links'] = [
+            {
+              "href" => "https://ord.autoscale.api.rackspacecloud.com/v1.0/829409/groups/6791761b-821a-4d07-820d-0b2afc7dd7f6/",
+              "rel" => "self"
+            }
+          ]
+
+          # Save for future use
+          self.data[:autoscale_groups][group_id] = group
+
+          # Response
+          body = {'group' => group}
+          response(:body => body)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/create_policy.rb b/lib/fog/rackspace/requests/auto_scale/create_policy.rb
index a55033ce2..7523a5b19 100644
--- a/lib/fog/rackspace/requests/auto_scale/create_policy.rb
+++ b/lib/fog/rackspace/requests/auto_scale/create_policy.rb
@@ -4,9 +4,7 @@ module Fog
       class Real
         def create_policy(group_id, options)
           
-          data = [
-            options
-          ]
+          data = [options]
 
           request(
             :method => 'POST',
@@ -19,7 +17,27 @@ module Fog
 
       class Mock
         def create_policy(group_id, options)
-          Fog::Mock.not_implemented
+          
+          group = self.data[:autoscale_groups][group_id]
+
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+          
+          policy = {
+            "id" => Fog::Rackspace::MockData.uuid,
+            "name" => "set group to 5 servers",
+            "desiredCapacity" => 5,
+            "cooldown" => 1800,
+            "type" => "webhook"
+          }
+
+          group['scalingPolicies'] << policy
+          
+          body = [policy]
+
+          response(:body => body)
+
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/create_webhook.rb b/lib/fog/rackspace/requests/auto_scale/create_webhook.rb
index f31813ae2..753320a7e 100644
--- a/lib/fog/rackspace/requests/auto_scale/create_webhook.rb
+++ b/lib/fog/rackspace/requests/auto_scale/create_webhook.rb
@@ -17,7 +17,39 @@ module Fog
 
       class Mock
         def create_webhook(group_id, policy_id, options)
-          Fog::Mock.not_implemented
+          
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['scalingPolicies'].detect { |p| p["id"] == policy_id }
+          if policy.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          webhook_id = Fog::Rackspace::MockData.uuid
+
+          webhook = {}
+          webhook['id'] = webhook_id
+          webhook['name'] = options['name'] || 'new webhook'
+          webhook['metadata'] = options['name'] || {}
+          webhook["links"] = [
+            {
+              "href" => "https://ord.autoscale.api.rackspacecloud.com/v1.0/829409/groups/#{group_id}/policies/#{policy_id}/webhooks/#{webhook_id}/",
+              "rel" => "self"
+            },
+            {
+              "href" => "https://ord.autoscale.api.rackspacecloud.com/v1.0/829409/execute/1/sadfadsfasdfvcjsdfsjvreaigae5",
+              "rel" => "capability"
+            }
+          ]
+
+          policy['webhooks'] << webhook
+
+          body = {'webhook' => webhook}
+          response(:body => body)
+
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/delete_group.rb b/lib/fog/rackspace/requests/auto_scale/delete_group.rb
index 698f815f7..f5f073d09 100644
--- a/lib/fog/rackspace/requests/auto_scale/delete_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/delete_group.rb
@@ -14,7 +14,8 @@ module Fog
 
       class Mock
         def delete_group(group_id)
-           Fog::Mock.not_implemented
+           self.data[:autoscale_groups].delete(group_id)
+           response(:status => 204)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/delete_policy.rb b/lib/fog/rackspace/requests/auto_scale/delete_policy.rb
index 28ac1365f..4ea370b5a 100644
--- a/lib/fog/rackspace/requests/auto_scale/delete_policy.rb
+++ b/lib/fog/rackspace/requests/auto_scale/delete_policy.rb
@@ -14,7 +14,16 @@ module Fog
 
       class Mock
         def delete_group(group_id, policy_id)
-           Fog::Mock.not_implemented
+           group = self.data[:autoscale_groups][group_id]
+
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          group['policies'].delete_if { |p| p['id'] == policy_id }
+
+          response(:status => 204)
+
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb b/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb
index d5fc82e35..03c54d3af 100644
--- a/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb
+++ b/lib/fog/rackspace/requests/auto_scale/delete_webhook.rb
@@ -14,7 +14,19 @@ module Fog
 
       class Mock
         def delete_webhook(group_id, policy_id, webhook_id)
-           Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['policies'].detect { |p| p["id"] == policy_id }
+          if policy.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy['webhooks'].delete_if { |w| w['id'] == webhook_id }
+
+          response(:status => 204)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb b/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb
index cdcaa636b..767fbe391 100644
--- a/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb
+++ b/lib/fog/rackspace/requests/auto_scale/execute_anonymous_webhook.rb
@@ -14,7 +14,7 @@ module Fog
 
       class Mock
         def execute_anonymous_webhook(capability_version, capability_hash)
-           Fog::Mock.not_implemented
+           response(:status => 202)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/execute_policy.rb b/lib/fog/rackspace/requests/auto_scale/execute_policy.rb
index 01af48c51..a3a46fd80 100644
--- a/lib/fog/rackspace/requests/auto_scale/execute_policy.rb
+++ b/lib/fog/rackspace/requests/auto_scale/execute_policy.rb
@@ -14,7 +14,7 @@ module Fog
 
       class Mock
         def execute_policy(group_id, policy_id)
-           Fog::Mock.not_implemented
+           response(:status => 202)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group.rb b/lib/fog/rackspace/requests/auto_scale/get_group.rb
index 7faae3f90..131794fb6 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group.rb
@@ -15,7 +15,12 @@ module Fog
 
       class Mock
         def get_group(group_id)
-          Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if server.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          else
+            response(:body => {"group" => group})
+          end
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_config.rb b/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
index 592321c26..da39a5762 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
@@ -15,7 +15,13 @@ module Fog
 
       class Mock
         def get_group_config(group_id)
-          Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          response(:body => {"groupConfiguration" => group['groupConfiguration']})
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
index 4710e9a2a..ff087f2f7 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
@@ -15,7 +15,45 @@ module Fog
 
       class Mock
         def get_group_state(group_id)
-          Fog::Mock.not_implemented
+          
+          instance_id_1 = Fog::Rackspace::AutoScale::MockData.uuid
+          instance_id_2 = Fog::Rackspace::AutoScale::MockData.uuid 
+
+          state = {
+            "id" => group_id,
+            "links" => [
+              {
+                "href" => "https://dfw.autoscale.api.rackspacecloud.com/v1.0/010101/groups/#{group_id}",
+                "rel" => "self"
+              }
+            ],
+            "active" => [
+              {
+                "id" => "#{instance_id_1}",
+                "links" => [
+                  {
+                    "href" => "https://dfw.servers.api.rackspacecloud.com/v2/010101/servers/#{instance_id_1}",
+                    "rel" => "self"
+                  }
+                ]
+              },
+              {
+                "id" => "#{instance_id_2}",
+                "links" => [
+                  {
+                    "href" => "https://dfw.servers.api.rackspacecloud.com/v2/010101/servers/#{instance_id_2}",
+                    "rel" => "self"
+                  }
+                ]
+              }
+            ],
+            "activeCapacity" => 2,
+            "pendingCapacity" => 2,
+            "desiredCapacity" => 4,
+            "paused" => false
+          }
+
+          response(:body => {'group' => state})
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb b/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
index a2e6f3963..fd48137b7 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
@@ -15,7 +15,13 @@ module Fog
 
       class Mock
         def get_launch_config(group_id)
-          Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          response(:body => {"launchConfiguration" => group['launchConfiguration']})
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/get_policy.rb b/lib/fog/rackspace/requests/auto_scale/get_policy.rb
index d8bda1e38..89ffd31c4 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_policy.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_policy.rb
@@ -15,7 +15,18 @@ module Fog
 
       class Mock
         def get_policy(group_id, policy_id)
-          Fog::Mock.not_implemented
+
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['scalingPolicies'].detect { |p| p["id"] == policy_id }
+          if policy.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          response(:body => {'policy' => policy})
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/get_webhook.rb b/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
index 25bb35b5d..a76e99df9 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
@@ -15,7 +15,22 @@ module Fog
 
       class Mock
         def get_webhook(group_id, policy_id, webhook_id)
-          Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['scalingPolicies'].detect { |p| p["id"] == policy_id }
+          if policy.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          webhook = policy['webhooks'].detect { |w| w['id'] == webhook_id }
+          if webhook.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          response(:body => {'webhook' => webhook})
         end
       end
 
diff --git a/lib/fog/rackspace/requests/auto_scale/list_groups.rb b/lib/fog/rackspace/requests/auto_scale/list_groups.rb
index 806a4ef72..e9c6e0763 100644
--- a/lib/fog/rackspace/requests/auto_scale/list_groups.rb
+++ b/lib/fog/rackspace/requests/auto_scale/list_groups.rb
@@ -27,7 +27,7 @@ module Fog
 
       class Mock
         def list_groups
-           Fog::Mock.not_implemented
+          response(:body => {"groups" => self.data[:autoscale_groups]})
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/list_policies.rb b/lib/fog/rackspace/requests/auto_scale/list_policies.rb
index ac16c5bcf..76eeee47b 100644
--- a/lib/fog/rackspace/requests/auto_scale/list_policies.rb
+++ b/lib/fog/rackspace/requests/auto_scale/list_policies.rb
@@ -13,8 +13,9 @@ module Fog
       end
 
       class Mock
-        def list_groups(group_id)
-           Fog::Mock.not_implemented
+        def list_policies(group_id)
+          group = self.data[:autoscale_groups][group_id]
+          response(:body => {'policies' => group['scalingPolicies']})
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb b/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb
index eb83f61c2..3fda626f3 100644
--- a/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb
+++ b/lib/fog/rackspace/requests/auto_scale/list_webhooks.rb
@@ -14,7 +14,18 @@ module Fog
 
       class Mock
         def list_webhooks(group_id, policy_id)
-           Fog::Mock.not_implemented
+          
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['scalingPolicies'].detect { |p| p["id"] == policy_id }
+          if policy.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          response(:body => {'webhooks' => policy['webhooks']})
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/update_group_config.rb b/lib/fog/rackspace/requests/auto_scale/update_group_config.rb
index faab81702..8472ef2c4 100644
--- a/lib/fog/rackspace/requests/auto_scale/update_group_config.rb
+++ b/lib/fog/rackspace/requests/auto_scale/update_group_config.rb
@@ -18,7 +18,20 @@ module Fog
 
       class Mock
         def update_group_config(group_id, options)
-           Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          config = group['groupConfiguration']
+          
+          config['name'] = options['name'] if options['name']
+          config['cooldown'] = options['cooldown'] if options['cooldown']
+          config['minEntities'] = options['minEntities'] if options['minEntities']
+          config['maxEntities'] = options['maxEntities'] if options['maxEntities']
+          config['metadata'] = options['metadata'] if options['metadata']
+
+          request(:body => config)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb b/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb
index 35e3f4d18..cd082544c 100644
--- a/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb
+++ b/lib/fog/rackspace/requests/auto_scale/update_launch_config.rb
@@ -18,7 +18,17 @@ module Fog
 
       class Mock
         def update_launch_config(group_id, options)
-           Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          config = group['launchConfiguration']
+          
+          config['args'] = options['args'] if options['args']
+          config['type'] = options['type'] if options['type']
+
+          request(:body => config)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/update_policy.rb b/lib/fog/rackspace/requests/auto_scale/update_policy.rb
index 3351cdab1..9ee16ea08 100644
--- a/lib/fog/rackspace/requests/auto_scale/update_policy.rb
+++ b/lib/fog/rackspace/requests/auto_scale/update_policy.rb
@@ -16,7 +16,16 @@ module Fog
 
       class Mock
         def update_policy(group_id, policy_id, options)
-           Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['scalingPolicies'].detect { |p| p["id"] == policy_id }
+
+          policy.merge(options)
+
+          request(:body => policy)
         end
       end
     end
diff --git a/lib/fog/rackspace/requests/auto_scale/update_webhook.rb b/lib/fog/rackspace/requests/auto_scale/update_webhook.rb
index 6c76ab2f4..e5d1bff86 100644
--- a/lib/fog/rackspace/requests/auto_scale/update_webhook.rb
+++ b/lib/fog/rackspace/requests/auto_scale/update_webhook.rb
@@ -18,7 +18,25 @@ module Fog
 
       class Mock
         def update_webhook(group_id, policy_id, webhook_id, options)
-           Fog::Mock.not_implemented
+          group = self.data[:autoscale_groups][group_id]
+          if group.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          policy = group['scalingPolicies'].detect { |p| p["id"] == policy_id }
+          if policy.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          webhook = policy['webhooks'].detect { |w| w['id'] == webhook_id }
+          if webhook.nil?
+            raise Fog::Rackspace::AutoScale::NotFound
+          end
+
+          webhook.merge(options)
+
+          response(:body => webhook)
+
         end
       end
     end
diff --git a/tests/rackspace/models/auto_scale/group.rb b/tests/rackspace/models/auto_scale/group.rb
new file mode 100644
index 000000000..d04a6d2cf
--- /dev/null
+++ b/tests/rackspace/models/auto_scale/group.rb
@@ -0,0 +1,20 @@
+Shindo.tests('Fog::Rackspace::AutoScale | group', ['rackspace', 'rackspace_autoscale']) do
+	
+	service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+	options = {
+		:name => "fog_#{Time.now.to_i.to_s}", 
+		:policies => POLICIES_OPTIONS, 
+		:launch_config => LAUNCH_CONFIG_OPTIONS, 
+		:group_config => GROUP_CONFIG_OPTIONS
+	}
+
+	model_tests(service.groups, options, false) do
+
+		tests('#policies').succeeds do
+			@instance.policies
+		end
+
+	end
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/groups.rb b/tests/rackspace/models/auto_scale/groups.rb
new file mode 100644
index 000000000..52317a4b5
--- /dev/null
+++ b/tests/rackspace/models/auto_scale/groups.rb
@@ -0,0 +1,20 @@
+Shindo.tests('Fog::Rackspace::AutoScale | groups', ['rackspace', 'rackspace_autoscale']) do 
+  pending if Fog.mocking?
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  tests("success") do
+    tests("#all").succeeds do
+      groups = service.groups.all
+      @group_id = groups.first.id
+    end
+
+    tests("#get").succeeds do
+      service.groups.get(@group_id)
+    end
+  end
+
+  tests("failure").returns(nil) do
+    service.groups.get(123)
+  end
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/policies.rb b/tests/rackspace/models/auto_scale/policies.rb
new file mode 100644
index 000000000..d13c7e144
--- /dev/null
+++ b/tests/rackspace/models/auto_scale/policies.rb
@@ -0,0 +1,21 @@
+Shindo.tests('Fog::Rackspace::AutoScale | policies', ['rackspace', 'rackspace_autoscale']) do 
+  pending if Fog.mocking?
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  group = service.groups.create({
+    :policies => POLICIES_OPTIONS,
+    :group_config => GROUP_CONFIG_OPTIONS,
+    :launch_config => LAUNCH_CONFIG_OPTIONS
+  })
+
+  options = {
+    :name => "policy 2",
+    :change => 5,
+    :cooldown => 100,
+    :type => 'webhook'
+  }
+
+  collection_tests(group.policies, options, false)
+
+  group.destroy
+end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/policy.rb b/tests/rackspace/models/auto_scale/policy.rb
new file mode 100644
index 000000000..c0d3105a0
--- /dev/null
+++ b/tests/rackspace/models/auto_scale/policy.rb
@@ -0,0 +1,27 @@
+Shindo.tests('Fog::Rackspace::AutoScale | policy', ['rackspace', 'rackspace_autoscale']) do
+  
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  group = service.groups.create({
+    :policies => POLICIES_OPTIONS,
+    :group_config => GROUP_CONFIG_OPTIONS,
+    :launch_config => LAUNCH_CONFIG_OPTIONS
+  })
+
+  options = {
+    :name => "policy 2",
+    :change => 5,
+    :cooldown => 100,
+    :type => 'webhook',
+    :group_id => group.id
+  }
+
+  model_tests(group.policies, options, false) do
+
+    tests('#webhooks').succeeds do
+      @instance.webhooks
+    end
+
+  end
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/webhook.rb b/tests/rackspace/models/auto_scale/webhook.rb
new file mode 100644
index 000000000..0f7fa5ba7
--- /dev/null
+++ b/tests/rackspace/models/auto_scale/webhook.rb
@@ -0,0 +1,30 @@
+Shindo.tests('Fog::Rackspace::AutoScale | webhook', ['rackspace', 'rackspace_autoscale']) do
+  
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  group = service.groups.create({
+    :policies => POLICIES_OPTIONS,
+    :group_config => GROUP_CONFIG_OPTIONS,
+    :launch_config => LAUNCH_CONFIG_OPTIONS
+  })
+
+  policy = group.policies.create({
+    :name => "set group to 5 servers",
+    :desiredCapacity => 5,
+    :cooldown => 1800,
+    :type => "webhook",
+    :group_id => group.id
+  })
+
+  options = {
+    :name => 'webhook name',
+    :metadata => {
+      'owner' => 'me'
+    },
+    :group_id => group.id,
+    :policy_id => policy.id
+  }
+
+  model_tests(policy.webhooks, options, false) 
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/webhooks.rb b/tests/rackspace/models/auto_scale/webhooks.rb
new file mode 100644
index 000000000..7ebfa5358
--- /dev/null
+++ b/tests/rackspace/models/auto_scale/webhooks.rb
@@ -0,0 +1,26 @@
+Shindo.tests('Fog::Rackspace::AutoScale | webhooks', ['rackspace', 'rackspace_autoscale']) do 
+  pending if Fog.mocking?
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  group = service.groups.create({
+    :policies => POLICIES_OPTIONS,
+    :group_config => GROUP_CONFIG_OPTIONS,
+    :launch_config => LAUNCH_CONFIG_OPTIONS
+  })
+
+  policy = group.policies.create({
+    :name => "policy 2",
+    :change => 5,
+    :cooldown => 100,
+    :type => 'webhook',
+    :group_id => group.id
+  })
+
+  options = {:name => 'New webhook', :group_id => group.id, :policy_id => policy.id}
+
+  collection_tests(policy.webhooks, options, false)
+
+  policy.destroy
+  group.destroy
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/config_tests.rb b/tests/rackspace/requests/auto_scale/config_tests.rb
new file mode 100644
index 000000000..cdf0219a2
--- /dev/null
+++ b/tests/rackspace/requests/auto_scale/config_tests.rb
@@ -0,0 +1,61 @@
+Shindo.tests('Fog::Rackspace::AutoScale | config_tests', ['rackspace', 'rackspace_autoscale']) do
+  
+  pending if Fog.mocking?
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  @launch_config = begin 
+    Fog::Rackspace::AutoScale::LaunchConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
+  end
+
+  @group_config = begin 
+    Fog::Rackspace::AutoScale::GroupConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
+  end
+
+  @group_id = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body['group']['id']
+
+  tests('success') do
+    tests('#get group config').formats({"groupConfiguration" => GROUP_CONFIG_FORMAT}) do
+      service.get_group_config(@group_id).body
+    end
+    tests('#update group config').formats(204) do
+      data = service.update_group_config(@group_id, {
+        'maxEntities' => 7, 
+        'minEntities' => 1, 
+        'metadata' => {}, 
+        'name' => 'foo', 
+        'cooldown' => 20}).data
+      data[:status]
+    end
+  end
+
+  tests('failure') do
+    tests('#update group config').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.update_group_config(@group_id, {})
+    end
+    tests('#delete group config').raises(NoMethodError) do
+      service.delete_group_config(123)
+    end
+    tests('#create group config').raises(NoMethodError) do
+      service.create_group_config({})
+    end
+    tests('#update launch config').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.update_launch_config(@group_id, {})
+    end
+    tests('#delete launch config').raises(NoMethodError) do
+      service.delete_launch_config(123)
+    end
+    tests('#create launch config').raises(NoMethodError) do
+      service.create_launch_config({})
+    end
+  end
+
+  # If you execute a DELETE, it returns a 403 and says there are "entities" attached to the group. What?
+  #service.delete_group(@group_id)
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/group_tests.rb b/tests/rackspace/requests/auto_scale/group_tests.rb
new file mode 100644
index 000000000..b72b305d9
--- /dev/null
+++ b/tests/rackspace/requests/auto_scale/group_tests.rb
@@ -0,0 +1,49 @@
+Shindo.tests('Fog::Rackspace::AutoScale | group_tests', ['rackspace', 'rackspace_autoscale']) do
+	
+	pending if Fog.mocking? 
+	service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+  
+  @launch_config = begin 
+    Fog::Rackspace::AutoScale::LaunchConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
+  end
+
+  @group_config = begin 
+    Fog::Rackspace::AutoScale::GroupConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
+  end
+
+	tests('success') do
+		tests('#create new group').formats(GROUP_FORMAT) do
+			response = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body
+      @group_id = response['group']['id']
+			response
+		end
+    tests('#get group').formats(GET_GROUP_HEADERS_FORMAT) do
+      service.get_group(@group_id).data[:headers]
+    end
+    tests('#delete group').formats(GROUP_DELETE_DATA_FORMAT) do
+      service.delete_group(@group_id).data
+    end
+	end
+
+	tests('failure') do
+    tests('#fail to create group(-1)').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.create_group(@launch_config, @group_config, {})
+    end
+    tests('#fail to get group(-1)').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.get_group(-1)
+    end
+    tests('#update group').raises(NoMethodError) do
+      service.update_group
+    end
+    tests('#fail to delete group(-1)').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.delete_group(-1)
+    end
+	end
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/helper.rb b/tests/rackspace/requests/auto_scale/helper.rb
new file mode 100644
index 000000000..a09b23aaf
--- /dev/null
+++ b/tests/rackspace/requests/auto_scale/helper.rb
@@ -0,0 +1,181 @@
+### FORMATS
+
+GET_GROUP_HEADERS_FORMAT = {
+  "Content-Type"=>String, 
+  "Via"=>String, 
+  "x-response-id"=>String, 
+  "Date"=>String, 
+  "Transfer-Encoding"=>String, 
+  "Server"=>String
+}
+
+GROUP_DELETE_DATA_FORMAT = {
+  :body=>nil, 
+  :headers=> {
+    "Content-Type"=>String, 
+    "Via"=>String, 
+    "x-response-id"=>String, 
+    "Date"=>String, 
+    "Server"=>String
+  }, 
+  :status=>Integer, 
+  :remote_ip=>String
+}
+
+LAUNCH_CONFIG_FORMAT = {
+  "args" => {
+      "loadBalancers" => [
+        {
+          "port" => Integer,
+          "loadBalancerId" => Integer
+        }
+      ],
+      "server" => {
+        "name" => String,
+        "imageRef" => String,
+        "flavorRef" => String,
+        "OS-DCF =>diskConfig" => String,
+        "metadata" => {
+          "build_config" => String,
+          "meta_key_1" => String,
+          "meta_key_2" => String
+        },
+        "networks" => [
+          {
+            "uuid" => String
+          },
+          {
+            "uuid" => String
+          }
+        ],
+        "personality" => [
+          {
+            "path" => String,
+            "contents" => String
+          }
+        ]
+      }
+    },
+    "type" => String
+}
+
+GROUP_CONFIG_FORMAT = {
+  "maxEntities" => Integer,
+  "cooldown" => Integer,
+  "name" => String,
+  "minEntities" => Integer,
+  "metadata" => {
+    "gc_meta_key_2" => String,
+    "gc_meta_key_1" => String
+  }
+}
+
+POLICY_FORMAT = {
+    "name"=> String, 
+    "links"=> Array, 
+    "cooldown"=>Integer, 
+    "type"=>String, 
+    "id"=>String, 
+    "change"=>Integer
+  }
+
+POLICIES_FORMAT = [POLICY_FORMAT]
+
+GROUP_FORMAT = {
+  "group" => {
+    "launchConfiguration" => LAUNCH_CONFIG_FORMAT,
+    "groupConfiguration" => GROUP_CONFIG_FORMAT,
+    "scalingPolicies" => POLICIES_FORMAT,
+    "links" => [
+      {
+        "href" => String,
+        "rel" => String
+      }
+    ],
+    "id" => String
+  }
+}
+
+WEBHOOK_FORMAT = {
+    "id" => String,
+    "name" => String,
+    "metadata" => Hash,
+    "links" => Array
+}
+
+### OPTIONS
+
+LAUNCH_CONFIG_OPTIONS = {
+	"args" => {
+      "loadBalancers" => [
+        {
+          "port" => 8080,
+          "loadBalancerId" => 9099
+        }
+      ],
+      "server" => {
+        "name" => "autoscale_server",
+        "imageRef" => "0d589460-f177-4b0f-81c1-8ab8903ac7d8",
+        "flavorRef" => "2",
+        "OS-DCF =>diskConfig" => "AUTO",
+        "metadata" => {
+          "build_config" => "core",
+          "meta_key_1" => "meta_value_1",
+          "meta_key_2" => "meta_value_2"
+        },
+        "networks" => [
+          {
+            "uuid" => "11111111-1111-1111-1111-111111111111"
+          },
+          {
+            "uuid" => "00000000-0000-0000-0000-000000000000"
+          }
+        ],
+        "personality" => [
+          {
+            "path" => "/root/.csivh",
+            "contents" => "VGhpcyBpcyBhIHRlc3QgZmlsZS4="
+          }
+        ]
+      }
+    },
+    "type" => "launch_server"
+}
+
+GROUP_CONFIG_OPTIONS = {
+	"max_entities" => 10,
+	"cooldown" => 360,
+	"name" => "testscalinggroup198547",
+	"min_entities" => 0,
+	"metadata" => {
+	  "gc_meta_key_2" => "gc_meta_value_2",
+	  "gc_meta_key_1" => "gc_meta_value_1"
+	}
+}
+
+POLICIES_OPTIONS = [
+    {
+      "cooldown" => 0,
+      "type" => "webhook",
+      "name" => "scale up by 1",
+      "change" => 1
+    }
+  ]
+
+POLICY_OPTIONS = {
+  "cooldown" => 0,
+  "type" => "webhook",
+  "name" => "FOOBAR",
+  "change" => 1
+}
+
+GROUP_OPTIONS = {
+    "launchConfiguration" => LAUNCH_CONFIG_OPTIONS,
+    "groupConfiguration" => GROUP_CONFIG_OPTIONS,
+    "scalingPolicies" => POLICIES_OPTIONS
+}
+
+WEBHOOK_OPTIONS = {
+    "name" => "webhook name",
+    "metadata" => {'foo' => 'bar'}
+}
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/policy_tests.rb b/tests/rackspace/requests/auto_scale/policy_tests.rb
new file mode 100644
index 000000000..22b983873
--- /dev/null
+++ b/tests/rackspace/requests/auto_scale/policy_tests.rb
@@ -0,0 +1,75 @@
+Shindo.tests('Fog::Rackspace::AutoScale | policy_tests', ['rackspace', 'rackspace_autoscale']) do 
+
+  pending if Fog.mocking?
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  @launch_config = begin 
+    Fog::Rackspace::AutoScale::LaunchConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
+  end
+
+  @group_config = begin 
+    Fog::Rackspace::AutoScale::GroupConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
+  end
+
+  @group_id = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body['group']['id']
+
+  tests('success') do
+    tests('#list policies').formats(POLICIES_FORMAT) do
+      service.list_policies(@group_id).body['policies']
+    end
+    tests('#create policy').formats(201) do
+      response = service.create_policy(@group_id, POLICY_OPTIONS)
+      @policy_id = response.body['policies'][0]['id']
+      response.data[:status]
+    end
+
+    tests('#get policy').formats(POLICY_FORMAT) do
+      response = service.get_policy(@group_id, @policy_id)
+      response.body['policy']
+    end
+
+    tests('#update policy').formats(204) do
+      response = service.update_policy(@group_id, @policy_id, {
+        'name' => 'foo', 
+        'changePercent' => 1, 
+        'type' => 'webhook', 
+        'cooldown' => 100
+      })
+      response.data[:status]
+    end
+    
+    tests('#delete policy').formats(204) do
+      response = service.delete_policy(@group_id, @policy_id)
+      response.data[:status]
+    end
+  end
+
+  tests('failure') do
+    tests('#create policy').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.create_policy(@group_id, {})
+    end
+
+    tests('#get policy').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.get_policy(@group_id, 123)
+    end
+
+    tests('#update policy').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.update_policy(@group_id, 123, {})
+    end
+    
+    tests('#execute policy').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.execute_policy(@group_id, 123)
+    end
+    
+    tests('#delete policy').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.delete_policy(@group_id, 123)
+    end
+  end
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/webhook_tests.rb b/tests/rackspace/requests/auto_scale/webhook_tests.rb
new file mode 100644
index 000000000..2b30e3c2e
--- /dev/null
+++ b/tests/rackspace/requests/auto_scale/webhook_tests.rb
@@ -0,0 +1,64 @@
+Shindo.tests('Fog::Rackspace::AutoScale | webhook_tests', ['rackspace', 'rackspace_autoscale']) do
+  pending if Fog.mocking?
+  service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
+
+  @launch_config = begin 
+    Fog::Rackspace::AutoScale::LaunchConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
+  end
+
+  @group_config = begin 
+    Fog::Rackspace::AutoScale::GroupConfig.new({
+      :service => @service,
+      :group   => self
+    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
+  end
+
+  @group_id = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body['group']['id']
+  
+  @policy_id = service.create_policy(@group_id, POLICY_OPTIONS).body['policies'][0]['id']
+
+  tests('success') do
+    tests('#create webhook').formats(201) do
+      response = service.create_webhook(@group_id, @policy_id, WEBHOOK_OPTIONS)
+      @webhook_id = response.body['webhooks'][0]['id']
+      response.data[:status]
+    end
+
+    tests('#view webhook').formats(WEBHOOK_FORMAT) do
+      response = service.get_webhook(@group_id, @policy_id, @webhook_id)
+      response.body['webhook']
+    end
+
+    tests('#update webhook').formats(204) do
+      response = service.update_webhook(@group_id, @policy_id, @webhook_id, {'name' => 'new', 'metadata' => {}} )
+      response.data[:status]
+    end
+
+    tests('#delete webhook').formats(204) do
+      response = service.delete_webhook(@group_id, @policy_id, @webhook_id)
+      response.data[:status]
+    end
+  end
+
+  tests('failure') do
+    tests('#create webhook').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.create_webhook(@group_id, @policy_id, {})
+    end
+
+    tests('#view webhook').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.get_webhook(@group_id, @policy_id, 123)
+    end
+
+    tests('#update webhook').raises(Fog::Rackspace::AutoScale::BadRequest) do
+      service.update_webhook(@group_id, @policy_id, @webhook_id, {})
+    end
+
+    tests('#delete webhook').raises(Fog::Rackspace::AutoScale::NotFound) do
+      service.delete_webhook(@group_id, @policy_id, 123)
+    end
+  end
+
+end
\ No newline at end of file
diff --git a/tests/rackspace/requests/compute_v2/address_tests.rb b/tests/rackspace/requests/compute_v2/address_tests.rb
index ff46b3c97..153ddd867 100644
--- a/tests/rackspace/requests/compute_v2/address_tests.rb
+++ b/tests/rackspace/requests/compute_v2/address_tests.rb
@@ -14,7 +14,7 @@ Shindo.tests('Fog::Compute::RackspaceV2 | address requests', ['rackspace']) do
     address_format =  { "addresses"=> { 
       "private" => [{"addr" => String, "version" => Integer}], 
       "public" => [{"addr" => String, "version" => Integer }, {"addr"=> String, "version" => Integer}]}
-      }
+    }
 
     begin 
       tests("#list_addresses(#{@server_id})").formats(address_format) do

From 373b440c6a2d6b3f16bd2a5568d4d7ea6b383aeb Mon Sep 17 00:00:00 2001
From: Jamie H <jamie@limetree.org>
Date: Mon, 16 Sep 2013 11:34:07 +0200
Subject: [PATCH 06/10] Adding a few more ensure blocks for resource deletion

---
 lib/fog/rackspace/auto_scale.rb               | 22 ++---
 lib/fog/rackspace/models/auto_scale/group.rb  | 84 +++++++++----------
 .../models/auto_scale/group_config.rb         |  4 +-
 lib/fog/rackspace/models/auto_scale/groups.rb |  4 +-
 .../models/auto_scale/launch_config.rb        |  2 +-
 .../rackspace/models/auto_scale/policies.rb   |  6 +-
 lib/fog/rackspace/models/auto_scale/policy.rb | 30 +++----
 .../rackspace/models/auto_scale/webhook.rb    | 10 +--
 .../rackspace/models/auto_scale/webhooks.rb   |  2 +-
 .../requests/auto_scale/create_group.rb       | 22 +----
 tests/rackspace/models/auto_scale/group.rb    |  3 +-
 tests/rackspace/models/auto_scale/groups.rb   | 19 ++---
 tests/rackspace/models/auto_scale/policies.rb |  8 +-
 tests/rackspace/models/auto_scale/policy.rb   | 12 +--
 tests/rackspace/models/auto_scale/webhook.rb  |  9 +-
 tests/rackspace/models/auto_scale/webhooks.rb | 10 ++-
 .../requests/auto_scale/config_tests.rb       | 24 ++----
 .../requests/auto_scale/group_tests.rb        | 19 +----
 tests/rackspace/requests/auto_scale/helper.rb |  6 +-
 .../requests/auto_scale/policy_tests.rb       | 16 +---
 .../requests/auto_scale/webhook_tests.rb      | 17 +---
 21 files changed, 125 insertions(+), 204 deletions(-)

diff --git a/lib/fog/rackspace/auto_scale.rb b/lib/fog/rackspace/auto_scale.rb
index e94f396c3..749dbe383 100644
--- a/lib/fog/rackspace/auto_scale.rb
+++ b/lib/fog/rackspace/auto_scale.rb
@@ -8,20 +8,10 @@ module Fog
       class ServiceError < Fog::Rackspace::Errors::ServiceError; end
       class InternalServerError < Fog::Rackspace::Errors::InternalServerError; end
 
-      class MissingArgumentException
-        def initialize(resource, argument)
-          @resource = resource
-          @argument = argument
-        end
-        def to_s
-          "This #{resource} resource requires the #{argument} argument"
-        end
-      end
-
       class BadRequest <  Fog::Rackspace::Errors::BadRequest
         attr_reader :validation_errors
 
-        def self.slurp(error)
+        def self.slurp(error, service=nil)
           if error && error.response
             status_code = error.response.status
             if error.response.body
@@ -35,7 +25,7 @@ module Fog
           new_error.set_backtrace(error.backtrace)
           new_error.instance_variable_set(:@validation_errors, details)
           new_error.instance_variable_set(:@status_code, status_code)
-
+          new_error.set_transaction_id(error, service)
           new_error
         end
       end
@@ -112,13 +102,13 @@ module Fog
           def request(params, parse_json = true, &block)
             super(params, parse_json, &block)
           rescue Excon::Errors::NotFound => error
-            raise NotFound.slurp(error, region)
+            raise NotFound.slurp(error, self)
           rescue Excon::Errors::BadRequest => error
-            raise BadRequest.slurp error
+            raise BadRequest.slurp(error, self)
           rescue Excon::Errors::InternalServerError => error
-            raise InternalServerError.slurp error
+            raise InternalServerError.slurp(error, self)
           rescue Excon::Errors::HTTPStatusError => error
-            raise ServiceError.slurp error
+            raise ServiceError.slurp(error, self)
           end
 
           def endpoint_uri(service_endpoint_url=nil)
diff --git a/lib/fog/rackspace/models/auto_scale/group.rb b/lib/fog/rackspace/models/auto_scale/group.rb
index 1e1c5ad22..00dd087a0 100644
--- a/lib/fog/rackspace/models/auto_scale/group.rb
+++ b/lib/fog/rackspace/models/auto_scale/group.rb
@@ -16,11 +16,6 @@ module Fog
         # @return [Array] group links.
         attribute :links
 
-        def initialize(attributes={})
-          @service = attributes[:service]
-          super
-        end
-
         # Gets the group configuration for this autoscale group. The configuration describes the 
         # minimum number of entities in the group, the maximum number of entities in the group, 
         # the global cooldown time for the group, and other metadata.
@@ -32,16 +27,11 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupConfig_v1.0__tenantId__groups__groupId__config_Configurations.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupConfig_v1.0__tenantId__groups__groupId__config_Configurations.html
         def group_config
           if attributes[:group_config].nil?
             data = service.get_group_config(identity)
-            attributes[:group_config] = begin 
-              Fog::Rackspace::AutoScale::GroupConfig.new({
-                :service => @service,
-                :group   => self
-              }).merge_attributes(data.body['groupConfiguration']) 
-            end
+            attributes[:group_config] = load_model('GroupConfig', data.body['groupConfiguration'])
           end
           attributes[:group_config]
         end
@@ -51,12 +41,7 @@ module Fog
         # @param object [Hash<String, String>] Object which will stock the object
         def group_config=(object = {})
           if object.is_a?(Hash)
-            attributes[:group_config] = begin 
-              Fog::Rackspace::AutoScale::GroupConfig.new({
-                :service => @service,
-                :group   => self
-              }).merge_attributes(object) 
-            end
+            attributes[:group_config] = load_model('GroupConfig', object)
           else
             attributes[:group_config] = object
           end
@@ -73,16 +58,11 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getLaunchConfig_v1.0__tenantId__groups__groupId__launch_Configurations.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getLaunchConfig_v1.0__tenantId__groups__groupId__launch_Configurations.html
         def launch_config
           if attributes[:launch_config].nil?
             data = service.get_launch_config(identity)
-            attributes[:launch_config] = begin 
-              Fog::Rackspace::AutoScale::LaunchConfig.new({
-                :service => @service,
-                :group   => self
-              }).merge_attributes(data.body['launchConfiguration']) 
-            end
+            attributes[:launch_config] = load_model('LaunchConfig', data.body['launchConfiguration'])
           end
           attributes[:launch_config]
         end
@@ -92,12 +72,7 @@ module Fog
         # @param object [Hash<String, String>] Object which will stock the object
         def launch_config=(object={})
           if object.is_a?(Hash)
-            attributes[:launch_config] = begin 
-              Fog::Rackspace::AutoScale::LaunchConfig.new({
-                :service => @service,
-                :group   => self
-              }).merge_attributes(object) 
-            end
+            attributes[:launch_config] = load_model('LaunchConfig', object)
           else
             attributes[:launch_config] = object
           end
@@ -109,14 +84,9 @@ module Fog
         #
         # @return [Fog::Rackspace::AutoScale::Policies] policies
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def policies
-          @policies ||= begin
-            Fog::Rackspace::AutoScale::Policies.new({
-              :service => service,
-              :group => self
-            })
-          end
+          @policies ||= load_model('Policies')
         end
 
         # Creates group
@@ -130,11 +100,23 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
         # @see Groups#create
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createGroup_v1.0__tenantId__groups_Groups.html   
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createGroup_v1.0__tenantId__groups_Groups.html   
         def save
           requires :launch_config, :group_config, :policies
 
-          data = service.create_group(launch_config, group_config, policies)
+          launch_config_hash = {
+            'args' => launch_config.args,
+            'type' => launch_config.type
+          }
+          group_config_hash = {
+            'name' => group_config.name,
+            'cooldown' => group_config.cooldown, 
+            'maxEntities' => group_config.max_entities,
+            'minEntities' => group_config.min_entities
+          }
+          group_config_hash['metadata'] = group_config.metadata if group_config.metadata
+
+          data = service.create_group(launch_config_hash, group_config_hash, policies)
           merge_attributes(data.body['group'])
           true
         end
@@ -148,7 +130,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deleteGroup_v1.0__tenantId__groups__groupId__Groups.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deleteGroup_v1.0__tenantId__groups__groupId__Groups.html
         def destroy
           requires :identity
           service.delete_group(identity)
@@ -164,7 +146,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupState_v1.0__tenantId__groups__groupId__state_Groups.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupState_v1.0__tenantId__groups__groupId__state_Groups.html
         def state
           requires :identity
           data = service.get_group_state(identity)
@@ -181,7 +163,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_pauseGroup_v1.0__tenantId__groups__groupId__pause_Groups.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_pauseGroup_v1.0__tenantId__groups__groupId__pause_Groups.html
         def pause
           requires :identity
           data = service.pause_group_state(identity)
@@ -198,13 +180,27 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_resumeGroup_v1.0__tenantId__groups__groupId__resume_Groups.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_resumeGroup_v1.0__tenantId__groups__groupId__resume_Groups.html
         def resume
           requires :identity
           data = service.resume_group_state(identity)
           true
         end
 
+        private
+
+        def load_model(class_name, attrs = nil)
+          # Can use either Kernel.const_get or do an eval() - first is quicker
+          model = Kernel.const_get("Fog::Rackspace::AutoScale::#{class_name}").new({
+            :service => @service,
+            :group   => self
+          })
+          if service && attrs
+            model.merge_attributes(attrs)
+          end
+          model
+        end
+
       end
     end
   end
diff --git a/lib/fog/rackspace/models/auto_scale/group_config.rb b/lib/fog/rackspace/models/auto_scale/group_config.rb
index 58ffd625f..fd8e2993c 100644
--- a/lib/fog/rackspace/models/auto_scale/group_config.rb
+++ b/lib/fog/rackspace/models/auto_scale/group_config.rb
@@ -26,7 +26,7 @@ module Fog
       	attribute :max_entities, :aliases => 'maxEntities'
 
         # @!attribute [r] metadata
-        # @return [Array] The group's metadata
+        # @return [Hash] The group's metadata
       	attribute :metadata
 
         # Update this group's configuration
@@ -38,7 +38,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putGroupConfig_v1.0__tenantId__groups__groupId__config_Configurations.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putGroupConfig_v1.0__tenantId__groups__groupId__config_Configurations.html
         def update
           
           options = {}
diff --git a/lib/fog/rackspace/models/auto_scale/groups.rb b/lib/fog/rackspace/models/auto_scale/groups.rb
index a031d4e1d..6bb21a348 100644
--- a/lib/fog/rackspace/models/auto_scale/groups.rb
+++ b/lib/fog/rackspace/models/auto_scale/groups.rb
@@ -17,7 +17,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         # 
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroups_v1.0__tenantId__groups_Groups.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroups_v1.0__tenantId__groups_Groups.html
         def all
           data = service.list_groups.body['groups']
           load(data)
@@ -33,7 +33,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         # 
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupManifest_v1.0__tenantId__groups__groupId__Groups.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getGroupManifest_v1.0__tenantId__groups__groupId__Groups.html
         def get(group_id)          
           data = service.get_group(group_id).body['group']
           new(data)
diff --git a/lib/fog/rackspace/models/auto_scale/launch_config.rb b/lib/fog/rackspace/models/auto_scale/launch_config.rb
index 2778bdd2d..222d3b7b9 100644
--- a/lib/fog/rackspace/models/auto_scale/launch_config.rb
+++ b/lib/fog/rackspace/models/auto_scale/launch_config.rb
@@ -26,7 +26,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putLaunchConfig_v1.0__tenantId__groups__groupId__launch_Configurations.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putLaunchConfig_v1.0__tenantId__groups__groupId__launch_Configurations.html
         def update
           
           options = {}
diff --git a/lib/fog/rackspace/models/auto_scale/policies.rb b/lib/fog/rackspace/models/auto_scale/policies.rb
index 6f8222225..11f7e4016 100644
--- a/lib/fog/rackspace/models/auto_scale/policies.rb
+++ b/lib/fog/rackspace/models/auto_scale/policies.rb
@@ -19,7 +19,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         # 
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def all
           data = service.list_policies(group.id).body['policies']
           load(data)
@@ -35,7 +35,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         # 
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getPolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
         def get(policy_id)          
           data = service.get_policy(group.id, policy_id).body['policy']
           data['group_id'] = group.id
@@ -53,7 +53,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         # 
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def create(attributes = {})
           attributes['group_id'] = group.id
           super(attributes)
diff --git a/lib/fog/rackspace/models/auto_scale/policy.rb b/lib/fog/rackspace/models/auto_scale/policy.rb
index 94030a6fd..903f34f9e 100644
--- a/lib/fog/rackspace/models/auto_scale/policy.rb
+++ b/lib/fog/rackspace/models/auto_scale/policy.rb
@@ -28,7 +28,7 @@ module Fog
       	
         # @!attribute [r] changePercent
         # @return [Fixnum] The percentage change to the autoscale group's number of units
-        attribute :changePercent
+        attribute :change_percent, :aliases => 'changePercent'
 
       	# @!attribute [r] cooldown
         # @return [Fixnum] The policy's cooldown
@@ -41,7 +41,7 @@ module Fog
 
       	# @!attribute [r] args
         # @note An example might be:
-        #
+        # @example See below:
      		#	- "cron": "23 * * * *"
      		#	- "at": "2013-06-05T03:12Z"
      		#	- "check": {
@@ -67,19 +67,19 @@ module Fog
 
         # @!attribute [r] desiredCapacity
         # @return [Fixnum] The desired capacity of the group
-      	attribute :desiredCapacity
+      	attribute :desired_capacity, :aliases => 'desiredCapacity'
 
         # Basic sanity check to make sure attributes are valid
         #
-        # @raise MissingArgumentException If no type is set
-        # @raise MissingArgumentException If args attribute is missing required keys (if type == 'schedule')
+        # @raise ArgumentError If no type is set
+        # @raise ArgumentError If args attribute is missing required keys (if type == 'schedule')
 		    
         # @return [Boolean] Returns true if the check passes
         def check_attributes
-          raise MissingArgumentException(self.name, type) if type.nil?
+          raise ArgumentError, "This #{self.name} resource requires the #{type} argument" if type.nil?
 
         	if type == 'schedule'
-        		raise MissingArgumentException(self.name, "args[cron] OR args[at]") if args['cron'].nil? && args['at'].nil?
+        		raise ArgumentError, "This #{self.name} resource requires the args[cron] OR args[at] argument" if args['cron'].nil? && args['at'].nil?
         	end
 
         	true
@@ -96,7 +96,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
         # @see Policies#create
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
         def save
           requires :name, :type, :cooldown
 
@@ -105,10 +105,10 @@ module Fog
           options = {}
           options['name'] = name unless name.nil?
           options['change'] = change unless change.nil?
-          options['changePercent'] = changePercent unless changePercent.nil?
+          options['changePercent'] = change_percent unless change_percent.nil?
           options['cooldown'] = cooldown unless cooldown.nil?
           options['type'] = type unless type.nil?
-          options['desiredCapacity'] = desiredCapacity unless desiredCapacity.nil?
+          options['desiredCapacity'] = desired_capacity unless desired_capacity.nil?
 
           if type == 'schedule'
             options['args'] = args
@@ -128,7 +128,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putPolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putPolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
         def update
       		requires :identity
 
@@ -137,10 +137,10 @@ module Fog
       		options = {}
           options['name'] = name unless name.nil?
           options['change'] = change unless change.nil?
-          options['changePercent'] = changePercent unless changePercent.nil?
+          options['changePercent'] = change_percent unless change_percent.nil?
           options['cooldown'] = cooldown unless cooldown.nil?
           options['type'] = type unless type.nil?
-          options['desiredCapacity'] = desiredCapacity unless desiredCapacity.nil?
+          options['desiredCapacity'] = desired_capacity unless desired_capacity.nil?
 
           if type == 'schedule'
             options['args'] = args
@@ -160,7 +160,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deletePolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deletePolicy_v1.0__tenantId__groups__groupId__policies__policyId__Policies.html
         def destroy
       		requires :identity
       		service.delete_policy(group_id, identity)
@@ -176,7 +176,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_executePolicy_v1.0__tenantId__groups__groupId__policies__policyId__execute_Policies.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_executePolicy_v1.0__tenantId__groups__groupId__policies__policyId__execute_Policies.html
         def execute
       		requires :identity
       		service.execute_policy(group_id, identity)
diff --git a/lib/fog/rackspace/models/auto_scale/webhook.rb b/lib/fog/rackspace/models/auto_scale/webhook.rb
index 56fcf2f67..763bfaf70 100644
--- a/lib/fog/rackspace/models/auto_scale/webhook.rb
+++ b/lib/fog/rackspace/models/auto_scale/webhook.rb
@@ -22,7 +22,7 @@ module Fog
         attribute :name
       	
         # @!attribute [r] metadata
-        # @return [Array] The metadata
+        # @return [Hash] The metadata
         attribute :metadata
       	
         # @!attribute [r] links
@@ -62,7 +62,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
         def update
       		requires :identity
 
@@ -84,7 +84,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         #
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deleteWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/DELETE_deleteWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
         def destroy
       		requires :identity 
       		service.delete_webhook(group_id, policy_id, identity)
@@ -95,8 +95,8 @@ module Fog
         # @return [String] the URL
         def execution_url
           requires :links
-          link = links.select { |l| l['rel'] == 'capability' } 
-          link[0]['href']
+          link = links.find { |l| l['rel'] == 'capability' } 
+          link['href'] rescue nil
         end
 
       end
diff --git a/lib/fog/rackspace/models/auto_scale/webhooks.rb b/lib/fog/rackspace/models/auto_scale/webhooks.rb
index 43be4f82f..6ccb5dc41 100644
--- a/lib/fog/rackspace/models/auto_scale/webhooks.rb
+++ b/lib/fog/rackspace/models/auto_scale/webhooks.rb
@@ -34,7 +34,7 @@ module Fog
         # @raise [Fog::Rackspace::AutoScale:::InternalServerError] - HTTP 500
         # @raise [Fog::Rackspace::AutoScale:::ServiceError]
         # 
-        # @see http://docs-internal.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
+        # @see http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/GET_getWebhook_v1.0__tenantId__groups__groupId__policies__policyId__webhooks__webhookId__Webhooks.html
         def get(webhook_id)          
           data = service.get_webhook(group_id, policy_id, webhook_id).body['webhook']
           data['group_id'] = group_id
diff --git a/lib/fog/rackspace/requests/auto_scale/create_group.rb b/lib/fog/rackspace/requests/auto_scale/create_group.rb
index d73fde882..415b490a4 100644
--- a/lib/fog/rackspace/requests/auto_scale/create_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/create_group.rb
@@ -5,30 +5,12 @@ module Fog
 
         def create_group(launch_config, group_config, policies)
 
-          if !launch_config.is_a?(LaunchConfig)
-            raise ArgumentError, 'launch_config needs to be an instance of Fog::Rackspace::AutoScale::LaunchConfig'
-          end
-
-          if !group_config.is_a?(GroupConfig)
-            raise ArgumentError, 'group_config needs to be an instance of Fog::Rackspace::AutoScale::GroupConfig'
-          end
-
           body = {
-            'launchConfiguration' => {
-              'args' => launch_config.args,
-              'type' => launch_config.type
-            },
-            'groupConfiguration' => {
-              'name' => group_config.name,
-              'cooldown' => group_config.cooldown, 
-              'maxEntities' => group_config.max_entities,
-              'minEntities' => group_config.min_entities
-            },
+            'launchConfiguration' => launch_config,
+            'groupConfiguration' => group_config,
             'scalingPolicies' => policies
           }
 
-          body['groupConfiguration']['metadata'] = group_config.metadata unless group_config.metadata.nil?
-          
           request(
             :expects => [201],
             :method => 'POST',
diff --git a/tests/rackspace/models/auto_scale/group.rb b/tests/rackspace/models/auto_scale/group.rb
index d04a6d2cf..b7abb981e 100644
--- a/tests/rackspace/models/auto_scale/group.rb
+++ b/tests/rackspace/models/auto_scale/group.rb
@@ -9,12 +9,11 @@ Shindo.tests('Fog::Rackspace::AutoScale | group', ['rackspace', 'rackspace_autos
 		:group_config => GROUP_CONFIG_OPTIONS
 	}
 
-	model_tests(service.groups, options, false) do
 
+	model_tests(service.groups, options, false) do
 		tests('#policies').succeeds do
 			@instance.policies
 		end
-
 	end
 
 end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/groups.rb b/tests/rackspace/models/auto_scale/groups.rb
index 52317a4b5..ee0f04d6e 100644
--- a/tests/rackspace/models/auto_scale/groups.rb
+++ b/tests/rackspace/models/auto_scale/groups.rb
@@ -2,19 +2,12 @@ Shindo.tests('Fog::Rackspace::AutoScale | groups', ['rackspace', 'rackspace_auto
   pending if Fog.mocking?
   service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
 
-  tests("success") do
-    tests("#all").succeeds do
-      groups = service.groups.all
-      @group_id = groups.first.id
-    end
+  options = {
+    :policies => POLICIES_OPTIONS,
+    :group_config => GROUP_CONFIG_OPTIONS,
+    :launch_config => LAUNCH_CONFIG_OPTIONS
+  }
 
-    tests("#get").succeeds do
-      service.groups.get(@group_id)
-    end
-  end
-
-  tests("failure").returns(nil) do
-    service.groups.get(123)
-  end
+  collection_tests(service.groups, options, false)
 
 end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/policies.rb b/tests/rackspace/models/auto_scale/policies.rb
index d13c7e144..5c9ecb5ea 100644
--- a/tests/rackspace/models/auto_scale/policies.rb
+++ b/tests/rackspace/models/auto_scale/policies.rb
@@ -15,7 +15,9 @@ Shindo.tests('Fog::Rackspace::AutoScale | policies', ['rackspace', 'rackspace_au
     :type => 'webhook'
   }
 
-  collection_tests(group.policies, options, false)
-
-  group.destroy
+  begin
+    collection_tests(group.policies, options, false)
+  ensure
+    group.destroy
+  end
 end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/policy.rb b/tests/rackspace/models/auto_scale/policy.rb
index c0d3105a0..64c8a877f 100644
--- a/tests/rackspace/models/auto_scale/policy.rb
+++ b/tests/rackspace/models/auto_scale/policy.rb
@@ -16,12 +16,14 @@ Shindo.tests('Fog::Rackspace::AutoScale | policy', ['rackspace', 'rackspace_auto
     :group_id => group.id
   }
 
-  model_tests(group.policies, options, false) do
-
-    tests('#webhooks').succeeds do
-      @instance.webhooks
+  begin
+    model_tests(group.policies, options, false) do
+      tests('#webhooks').succeeds do
+        @instance.webhooks
+      end
     end
-
+  ensure
+    group.destroy
   end
 
 end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/webhook.rb b/tests/rackspace/models/auto_scale/webhook.rb
index 0f7fa5ba7..9b8700dcf 100644
--- a/tests/rackspace/models/auto_scale/webhook.rb
+++ b/tests/rackspace/models/auto_scale/webhook.rb
@@ -10,7 +10,7 @@ Shindo.tests('Fog::Rackspace::AutoScale | webhook', ['rackspace', 'rackspace_aut
 
   policy = group.policies.create({
     :name => "set group to 5 servers",
-    :desiredCapacity => 5,
+    :desired_capacity => 5,
     :cooldown => 1800,
     :type => "webhook",
     :group_id => group.id
@@ -25,6 +25,11 @@ Shindo.tests('Fog::Rackspace::AutoScale | webhook', ['rackspace', 'rackspace_aut
     :policy_id => policy.id
   }
 
-  model_tests(policy.webhooks, options, false) 
+  begin
+    model_tests(policy.webhooks, options, false) 
+  ensure
+    policy.destroy
+    group.destroy
+  end
 
 end
\ No newline at end of file
diff --git a/tests/rackspace/models/auto_scale/webhooks.rb b/tests/rackspace/models/auto_scale/webhooks.rb
index 7ebfa5358..6c3de9c51 100644
--- a/tests/rackspace/models/auto_scale/webhooks.rb
+++ b/tests/rackspace/models/auto_scale/webhooks.rb
@@ -18,9 +18,11 @@ Shindo.tests('Fog::Rackspace::AutoScale | webhooks', ['rackspace', 'rackspace_au
 
   options = {:name => 'New webhook', :group_id => group.id, :policy_id => policy.id}
 
-  collection_tests(policy.webhooks, options, false)
-
-  policy.destroy
-  group.destroy
+  begin
+    collection_tests(policy.webhooks, options, false)
+  ensure
+    policy.destroy
+    group.destroy
+  end
 
 end
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/config_tests.rb b/tests/rackspace/requests/auto_scale/config_tests.rb
index cdf0219a2..96b2c0af0 100644
--- a/tests/rackspace/requests/auto_scale/config_tests.rb
+++ b/tests/rackspace/requests/auto_scale/config_tests.rb
@@ -3,21 +3,8 @@ Shindo.tests('Fog::Rackspace::AutoScale | config_tests', ['rackspace', 'rackspac
   pending if Fog.mocking?
   service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
 
-  @launch_config = begin 
-    Fog::Rackspace::AutoScale::LaunchConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
-  end
-
-  @group_config = begin 
-    Fog::Rackspace::AutoScale::GroupConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
-  end
-
-  @group_id = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body['group']['id']
+  @group = service.create_group(LAUNCH_CONFIG_OPTIONS, GROUP_CONFIG_OPTIONS, POLICIES_OPTIONS).body['group']
+  @group_id = @group['id']
 
   tests('success') do
     tests('#get group config').formats({"groupConfiguration" => GROUP_CONFIG_FORMAT}) do
@@ -55,7 +42,10 @@ Shindo.tests('Fog::Rackspace::AutoScale | config_tests', ['rackspace', 'rackspac
     end
   end
 
-  # If you execute a DELETE, it returns a 403 and says there are "entities" attached to the group. What?
-  #service.delete_group(@group_id)
+  # @group['scalingPolicies'].each do |p|
+  #   service.delete_policy(@group_id, p['id'])
+  # end
+
+  # service.delete_group(@group_id)
 
 end
\ No newline at end of file
diff --git a/tests/rackspace/requests/auto_scale/group_tests.rb b/tests/rackspace/requests/auto_scale/group_tests.rb
index b72b305d9..234bd97a2 100644
--- a/tests/rackspace/requests/auto_scale/group_tests.rb
+++ b/tests/rackspace/requests/auto_scale/group_tests.rb
@@ -3,29 +3,18 @@ Shindo.tests('Fog::Rackspace::AutoScale | group_tests', ['rackspace', 'rackspace
 	pending if Fog.mocking? 
 	service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
   
-  @launch_config = begin 
-    Fog::Rackspace::AutoScale::LaunchConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
-  end
-
-  @group_config = begin 
-    Fog::Rackspace::AutoScale::GroupConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
-  end
-
 	tests('success') do
 		tests('#create new group').formats(GROUP_FORMAT) do
-			response = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body
+			response = service.create_group(LAUNCH_CONFIG_OPTIONS, GROUP_CONFIG_OPTIONS, POLICIES_OPTIONS).body
       @group_id = response['group']['id']
 			response
 		end
     tests('#get group').formats(GET_GROUP_HEADERS_FORMAT) do
       service.get_group(@group_id).data[:headers]
     end
+    tests('#get group - body').formats(GROUP_FORMAT) do
+      service.get_group(@group_id).body
+    end
     tests('#delete group').formats(GROUP_DELETE_DATA_FORMAT) do
       service.delete_group(@group_id).data
     end
diff --git a/tests/rackspace/requests/auto_scale/helper.rb b/tests/rackspace/requests/auto_scale/helper.rb
index a09b23aaf..513885591 100644
--- a/tests/rackspace/requests/auto_scale/helper.rb
+++ b/tests/rackspace/requests/auto_scale/helper.rb
@@ -10,7 +10,7 @@ GET_GROUP_HEADERS_FORMAT = {
 }
 
 GROUP_DELETE_DATA_FORMAT = {
-  :body=>nil, 
+  :body=>Hash, 
   :headers=> {
     "Content-Type"=>String, 
     "Via"=>String, 
@@ -143,10 +143,10 @@ LAUNCH_CONFIG_OPTIONS = {
 }
 
 GROUP_CONFIG_OPTIONS = {
-	"max_entities" => 10,
+	"maxEntities" => 10,
 	"cooldown" => 360,
 	"name" => "testscalinggroup198547",
-	"min_entities" => 0,
+	"minEntities" => 0,
 	"metadata" => {
 	  "gc_meta_key_2" => "gc_meta_value_2",
 	  "gc_meta_key_1" => "gc_meta_value_1"
diff --git a/tests/rackspace/requests/auto_scale/policy_tests.rb b/tests/rackspace/requests/auto_scale/policy_tests.rb
index 22b983873..b4177af75 100644
--- a/tests/rackspace/requests/auto_scale/policy_tests.rb
+++ b/tests/rackspace/requests/auto_scale/policy_tests.rb
@@ -3,21 +3,7 @@ Shindo.tests('Fog::Rackspace::AutoScale | policy_tests', ['rackspace', 'rackspac
   pending if Fog.mocking?
   service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
 
-  @launch_config = begin 
-    Fog::Rackspace::AutoScale::LaunchConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
-  end
-
-  @group_config = begin 
-    Fog::Rackspace::AutoScale::GroupConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
-  end
-
-  @group_id = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body['group']['id']
+  @group_id = service.create_group(LAUNCH_CONFIG_OPTIONS, GROUP_CONFIG_OPTIONS, POLICIES_OPTIONS).body['group']['id']
 
   tests('success') do
     tests('#list policies').formats(POLICIES_FORMAT) do
diff --git a/tests/rackspace/requests/auto_scale/webhook_tests.rb b/tests/rackspace/requests/auto_scale/webhook_tests.rb
index 2b30e3c2e..0a41d109f 100644
--- a/tests/rackspace/requests/auto_scale/webhook_tests.rb
+++ b/tests/rackspace/requests/auto_scale/webhook_tests.rb
@@ -2,22 +2,7 @@ Shindo.tests('Fog::Rackspace::AutoScale | webhook_tests', ['rackspace', 'rackspa
   pending if Fog.mocking?
   service = Fog::Rackspace::AutoScale.new :rackspace_region => :ord
 
-  @launch_config = begin 
-    Fog::Rackspace::AutoScale::LaunchConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(LAUNCH_CONFIG_OPTIONS) 
-  end
-
-  @group_config = begin 
-    Fog::Rackspace::AutoScale::GroupConfig.new({
-      :service => @service,
-      :group   => self
-    }).merge_attributes(GROUP_CONFIG_OPTIONS) 
-  end
-
-  @group_id = service.create_group(@launch_config, @group_config, POLICIES_OPTIONS).body['group']['id']
-  
+  @group_id = service.create_group(LAUNCH_CONFIG_OPTIONS, GROUP_CONFIG_OPTIONS, POLICIES_OPTIONS).body['group']['id']
   @policy_id = service.create_policy(@group_id, POLICY_OPTIONS).body['policies'][0]['id']
 
   tests('success') do

From 3022a275e87e8580922c91a2edce9bdcc76277c2 Mon Sep 17 00:00:00 2001
From: Jamie H <jamie@limetree.org>
Date: Tue, 17 Sep 2013 09:33:50 +0200
Subject: [PATCH 07/10] Modifying array for 1.8.7 Gemfile to pass

---
 lib/fog/rackspace/requests/auto_scale/get_group.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/fog/rackspace/requests/auto_scale/get_group.rb b/lib/fog/rackspace/requests/auto_scale/get_group.rb
index 131794fb6..93a17c114 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group.rb
@@ -8,8 +8,8 @@ module Fog
           request(
             :expects => [200],
             :method => 'GET',
-            :path => "groups/#{group_id}",
-            )
+            :path => "groups/#{group_id}"
+          )
         end
       end
 

From 37eda0617ef204e20277b6188a53fbc2099ac65f Mon Sep 17 00:00:00 2001
From: Jamie H <jamie@limetree.org>
Date: Tue, 17 Sep 2013 10:05:11 +0200
Subject: [PATCH 08/10] Removing trailing slashes from method calls for 1.8.7

---
 lib/fog/rackspace/requests/auto_scale/get_group_config.rb  | 2 +-
 lib/fog/rackspace/requests/auto_scale/get_group_state.rb   | 2 +-
 lib/fog/rackspace/requests/auto_scale/get_launch_config.rb | 2 +-
 lib/fog/rackspace/requests/auto_scale/get_policy.rb        | 2 +-
 lib/fog/rackspace/requests/auto_scale/get_webhook.rb       | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_config.rb b/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
index da39a5762..53729f363 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_config.rb
@@ -8,7 +8,7 @@ module Fog
           request(
             :expects => [200],
             :method => 'GET',
-            :path => "groups/#{group_id}/config",
+            :path => "groups/#{group_id}/config"
           )
         end
       end
diff --git a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
index ff087f2f7..f2681c7c1 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_group_state.rb
@@ -8,7 +8,7 @@ module Fog
           request(
             :expects => [200],
             :method => 'GET',
-            :path => "groups/#{group_id}/state",
+            :path => "groups/#{group_id}/state"
           )
         end
       end
diff --git a/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb b/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
index fd48137b7..5636c4e6a 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_launch_config.rb
@@ -8,7 +8,7 @@ module Fog
           request(
             :expects => [200],
             :method => 'GET',
-            :path => "groups/#{group_id}/launch",
+            :path => "groups/#{group_id}/launch"
           )
         end
       end
diff --git a/lib/fog/rackspace/requests/auto_scale/get_policy.rb b/lib/fog/rackspace/requests/auto_scale/get_policy.rb
index 89ffd31c4..fd5768310 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_policy.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_policy.rb
@@ -8,7 +8,7 @@ module Fog
           request(
             :expects => [200],
             :method => 'GET',
-            :path => "groups/#{group_id}/policies/#{policy_id}",
+            :path => "groups/#{group_id}/policies/#{policy_id}"
           )
         end
       end
diff --git a/lib/fog/rackspace/requests/auto_scale/get_webhook.rb b/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
index a76e99df9..e5bba815c 100644
--- a/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
+++ b/lib/fog/rackspace/requests/auto_scale/get_webhook.rb
@@ -8,7 +8,7 @@ module Fog
           request(
             :expects => [200],
             :method => 'GET',
-            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks/#{webhook_id}",
+            :path => "groups/#{group_id}/policies/#{policy_id}/webhooks/#{webhook_id}"
           )
         end
       end

From 19d3b40c0f990e213c943552e71fb9f30c1d1925 Mon Sep 17 00:00:00 2001
From: Jamie H <jamie@limetree.org>
Date: Thu, 26 Sep 2013 10:47:53 +0200
Subject: [PATCH 09/10] Fixing minor issues with doc annotations, removing
 unused file, adding Shindo tests

---
 .../requests/auto_scale/update_config.rb      | 37 -------------------
 1 file changed, 37 deletions(-)
 delete mode 100644 lib/fog/rackspace/requests/auto_scale/update_config.rb

diff --git a/lib/fog/rackspace/requests/auto_scale/update_config.rb b/lib/fog/rackspace/requests/auto_scale/update_config.rb
deleted file mode 100644
index 6cdf577bd..000000000
--- a/lib/fog/rackspace/requests/auto_scale/update_config.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-module Fog
-  module Rackspace
-    class AutoScale
-
-      class Real
-
-        def update_config(group_id)
-
-          h = {
-             "name" => "workers",
-             "cooldown" => 60,
-             "minEntities" => 0,
-             "maxEntities" => 0,
-             "metadata" => {
-                  "firstkey" => "this is a string",
-                  "secondkey" => "1"
-              }
-          }
-
-          request(
-            :expects => [204],
-            :method => 'PUT',
-            :path => "groups/#{group_id}/config",
-            :body => Fog::JSON.encode(h)
-            )
-        end
-      end
-
-      class Mock
-        def update_config(group_id)
-          Fog::Mock.not_implemented
-        end
-      end
-
-    end
-  end
-end
\ No newline at end of file

From 54c0362c2e20b4d7b2844b418a02b68013a6c1ee Mon Sep 17 00:00:00 2001
From: Jamie H <jamie@limetree.org>
Date: Thu, 26 Sep 2013 15:54:43 +0200
Subject: [PATCH 10/10] Adding the red herrings

---
 lib/fog/rackspace/models/auto_scale/policy.rb  | 1 -
 lib/fog/rackspace/models/auto_scale/webhook.rb | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/lib/fog/rackspace/models/auto_scale/policy.rb b/lib/fog/rackspace/models/auto_scale/policy.rb
index 903f34f9e..0e253a0d9 100644
--- a/lib/fog/rackspace/models/auto_scale/policy.rb
+++ b/lib/fog/rackspace/models/auto_scale/policy.rb
@@ -40,7 +40,6 @@ module Fog
         attribute :type
 
       	# @!attribute [r] args
-        # @note An example might be:
         # @example See below:
      		#	- "cron": "23 * * * *"
      		#	- "at": "2013-06-05T03:12Z"
diff --git a/lib/fog/rackspace/models/auto_scale/webhook.rb b/lib/fog/rackspace/models/auto_scale/webhook.rb
index 763bfaf70..d43a98c68 100644
--- a/lib/fog/rackspace/models/auto_scale/webhook.rb
+++ b/lib/fog/rackspace/models/auto_scale/webhook.rb
@@ -45,8 +45,8 @@ module Fog
           requires :name
 
           options = {}
-          options['name'] = name unless name.nil?
-          options['metadata'] = metadata unless metadata.nil?
+          options['name'] = name if name
+          options['metadata'] = metadata if metadata
 
           data = service.create_webhook(group_id, policy_id, options)
           merge_attributes(data.body['webhooks'][0])