1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/rackspace/models/auto_scale/policy.rb
Matt Darby 72e52e70be Revert "Moving Rackspace logic to fog-rackspace"
This reverts commit d6ecb19d24.

Conflicts:
	fog.gemspec
2014-12-10 11:30:34 -05:00

220 lines
7.8 KiB
Ruby

require 'fog/core/model'
require 'fog/rackspace/models/auto_scale/webhooks'
module Fog
module Rackspace
class AutoScale
class Policy < Fog::Model
# @!attribute [r] id
# @return [String] The policy id
identity :id
# @!attribute [r] group
# @return [Group] The autoscale group
attribute :group
# @!attribute [r] links
# @return [Array] Policy links
attribute :links
# @!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 :change_percent, :aliases => 'changePercent'
# @!attribute [r] cooldown
# @return [Fixnum] The policy's cooldown
attribute :cooldown
# @!attribute [r] type
# @note Can only be "webhook", "schedule" or "cloud_monitoring"
# @return [String] The policy's type
attribute :type
# @!attribute [r] args
# @example See below:
# - "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);"
# }
#
# @return [String] Arguments used for the policy
attribute :args
# @!attribute [r] desiredCapacity
# @return [Fixnum] The desired capacity of the group
attribute :desired_capacity, :aliases => 'desiredCapacity'
# Basic sanity check to make sure attributes are valid
#
# @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 ArgumentError, "This #{self.name} resource requires the #{type} argument" if type.nil?
if type == 'schedule'
raise ArgumentError, "This #{self.name} resource requires the args[cron] OR args[at] argument" if args['cron'].nil? && args['at'].nil?
end
true
end
def group=(group)
attributes[:group] = group.is_a?(Group) ? group : service.groups.new(:id => group)
end
# 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.rackspace.com/cas/api/v1.0/autoscale-devguide/content/POST_createPolicies_v1.0__tenantId__groups__groupId__policies_Policies.html
def create
requires :name, :type, :cooldown
check_attributes
options = {}
options['name'] = name unless name.nil?
options['change'] = change unless change.nil?
options['changePercent'] = change_percent unless change_percent.nil?
options['cooldown'] = cooldown unless cooldown.nil?
options['type'] = type unless type.nil?
options['desiredCapacity'] = desired_capacity unless desired_capacity.nil?
if type == 'schedule'
options['args'] = args
end
data = service.create_policy(group.id, options)
merge_attributes(data.body['policies'][0])
true
end
# 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.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
options = {}
options['name'] = name unless name.nil?
options['change'] = change unless change.nil?
options['changePercent'] = change_percent unless change_percent.nil?
options['cooldown'] = cooldown unless cooldown.nil?
options['type'] = type unless type.nil?
options['desiredCapacity'] = desired_capacity unless desired_capacity.nil?
if type == 'schedule'
options['args'] = args
end
data = service.update_policy(group.id, identity, options)
merge_attributes(data.body)
true
end
# Saves the policy
# Creates policy if it is new, otherwise it will update it
# @return [Boolean] true if policy has saved
def save
if persisted?
update
else
create
end
true
end
# 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.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
# 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.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
requires :identity
@webhooks ||= Fog::Rackspace::AutoScale::Webhooks.new({
:service => service,
:policy => self,
:group => group
})
end
end
end
end
end