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])