From f3b7a08c0f0cb80b3d12dc8d85400922eb452699 Mon Sep 17 00:00:00 2001 From: Nestor Date: Wed, 27 Nov 2013 17:46:28 -0600 Subject: [PATCH 1/2] Added implementation for launch_configuration --- lib/harp-runtime/cloud/cloud_mutator.rb | 17 +++++- lib/harp-runtime/models/autoscale.rb | 8 +++ .../autoscaling/launch_configuration.rb | 60 +++++++++++++++++++ .../resources/autoscaling/types.rb | 10 ++++ .../resources/available_resources.rb | 1 + .../resources/compute/instance.rb | 1 + 6 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 lib/harp-runtime/models/autoscale.rb create mode 100644 lib/harp-runtime/resources/autoscaling/launch_configuration.rb create mode 100644 lib/harp-runtime/resources/autoscaling/types.rb diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index 1d9a076..910e6f1 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -17,21 +17,32 @@ def initialize(options) @secret = options[:secret] @cloud_type = options[:cloud_type] @compute = nil + @autoscale = nil @mock = (options.include? :mock) ? true : false end def establish_connect(resource_type) + if @mock + Fog.mock! + end + if Harp::Resources::RESOURCES_COMPUTE.include? resource_type.class if ! @compute.nil? return @compute end - if @mock - Fog.mock! - end @compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => @access, :aws_secret_access_key => @secret) return @compute end + + if Harp::Resources::RESOURCES_AUTOSCALE.include? resource_type.class + if ! @autoscale.nil? + return @autoscale + end + @autoscale = Fog::AWS::AutoScaling.new( + :aws_access_key_id => @access, :aws_secret_access_key => @secret) + return @autoscale + end end def create(resource_name, resource_def) diff --git a/lib/harp-runtime/models/autoscale.rb b/lib/harp-runtime/models/autoscale.rb new file mode 100644 index 0000000..d9bd90f --- /dev/null +++ b/lib/harp-runtime/models/autoscale.rb @@ -0,0 +1,8 @@ +require 'data_mapper' +require 'harp-runtime/models/base' + +class AutoScalingGroup < HarpResource +end + +class LaunchConfiguration < HarpResource +end \ No newline at end of file diff --git a/lib/harp-runtime/resources/autoscaling/launch_configuration.rb b/lib/harp-runtime/resources/autoscaling/launch_configuration.rb new file mode 100644 index 0000000..7e8655d --- /dev/null +++ b/lib/harp-runtime/resources/autoscaling/launch_configuration.rb @@ -0,0 +1,60 @@ +require 'set' +require 'fog/core/model' +require 'harp-runtime/models/autoscale' +require 'json' + +module Harp + module Resources + + class LaunchConfiguration < AvailableResource + + include Harp::Resources + + attribute :id, :aliases => 'LaunchConfigurationName' + attribute :arn, :aliases => 'LaunchConfigurationARN' + attribute :associate_public_ip, :aliases => 'AssociatePublicIpAddress' + attribute :block_device_mappings, :aliases => 'BlockDeviceMappings' + attribute :created_at, :aliases => 'CreatedTime' + attribute :iam_instance_profile, :aliases => 'IamInstanceProfile' + attribute :image_id, :aliases => 'ImageId' + #attribute :instance_monitoring, :aliases => 'InstanceMonitoring' + attribute :instance_monitoring, :aliases => 'InstanceMonitoring', :squash => 'Enabled' + attribute :instance_type, :aliases => 'InstanceType' + attribute :kernel_id, :aliases => 'KernelId' + attribute :key_name, :aliases => 'KeyName' + attribute :ramdisk_id, :aliases => 'RamdiskId' + attribute :security_groups, :aliases => 'SecurityGroups' + attribute :user_data, :aliases => 'UserData' + attribute :spot_price, :aliases => 'SpotPrice' + + + register_resource :launch_configuration, RESOURCES_AUTOSCALE + + # Only keeping a few properties, simplest define keeps. + @keeps = /^id$/ + + + def self.persistent_type() + ::LaunchConfiguration + end + + def create(service) + create_attribs = self.attribs[:attributes] + configuration = service.configurations.create(create_attribs) + return configuration + end + + def destroy(service) + destroy_attribs = self.attribs + if @id + configuration = service.configurations.destroy(destroy_attribs) + else + puts "No ID set, cannot delete." + end + return configuration + end + + end + end +end + diff --git a/lib/harp-runtime/resources/autoscaling/types.rb b/lib/harp-runtime/resources/autoscaling/types.rb new file mode 100644 index 0000000..42eee76 --- /dev/null +++ b/lib/harp-runtime/resources/autoscaling/types.rb @@ -0,0 +1,10 @@ +require 'set' + +require 'harp-runtime/resources/autoscaling/launch_configuration' +require 'harp-runtime/resources/autoscaling/autoscaling_group' + +module Harp + module Resources + extend self + end +end \ No newline at end of file diff --git a/lib/harp-runtime/resources/available_resources.rb b/lib/harp-runtime/resources/available_resources.rb index 37f9755..6298665 100644 --- a/lib/harp-runtime/resources/available_resources.rb +++ b/lib/harp-runtime/resources/available_resources.rb @@ -123,6 +123,7 @@ def output_token(args={}) end require "harp-runtime/resources/compute/types" +require "harp-runtime/resources/autoscaling/types" class String def underscore diff --git a/lib/harp-runtime/resources/compute/instance.rb b/lib/harp-runtime/resources/compute/instance.rb index 93a4730..8a33f2d 100644 --- a/lib/harp-runtime/resources/compute/instance.rb +++ b/lib/harp-runtime/resources/compute/instance.rb @@ -68,6 +68,7 @@ def create(service) create_attribs = self.attribs tags = {"Name" => @name} create_attribs[:tags] = tags + binding.pry server = service.servers.create(create_attribs) @id = server.id return server From 320b553c68c863618a9c38300e9832f8f103e552 Mon Sep 17 00:00:00 2001 From: Nestor Date: Mon, 2 Dec 2013 11:07:56 -0600 Subject: [PATCH 2/2] Added tests, AS group files --- .../autoscaling/autoscaling_group.rb | 63 +++++++++++++++++++ .../resources/compute/instance.rb | 1 - spec/autoscaling_cloud_spec.rb | 50 +++++++++++++++ spec/spec_helper.rb | 1 + 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 lib/harp-runtime/resources/autoscaling/autoscaling_group.rb create mode 100644 spec/autoscaling_cloud_spec.rb diff --git a/lib/harp-runtime/resources/autoscaling/autoscaling_group.rb b/lib/harp-runtime/resources/autoscaling/autoscaling_group.rb new file mode 100644 index 0000000..a133bb1 --- /dev/null +++ b/lib/harp-runtime/resources/autoscaling/autoscaling_group.rb @@ -0,0 +1,63 @@ +require 'set' +require 'fog/core/model' +require 'harp-runtime/models/autoscale' +require 'json' + +module Harp + module Resources + + class AutoScalingGroup < AvailableResource + + include Harp::Resources + + attribute :id, :aliases => 'AutoScalingGroupName' + attribute :arn, :aliases => 'AutoScalingGroupARN' + attribute :availability_zones, :aliases => 'AvailabilityZones' + attribute :created_at, :aliases => 'CreatedTime' + attribute :default_cooldown, :aliases => 'DefaultCooldown' + attribute :desired_capacity, :aliases => 'DesiredCapacity' + attribute :enabled_metrics, :aliases => 'EnabledMetrics' + attribute :health_check_grace_period, :aliases => 'HealthCheckGracePeriod' + attribute :health_check_type, :aliases => 'HealthCheckType' + attribute :instances, :aliases => 'Instances' + attribute :launch_configuration_name, :aliases => 'LaunchConfigurationName' + attribute :load_balancer_names, :aliases => 'LoadBalancerNames' + attribute :max_size, :aliases => 'MaxSize' + attribute :min_size, :aliases => 'MinSize' + attribute :placement_group, :aliases => 'PlacementGroup' + attribute :suspended_processes, :aliases => 'SuspendedProcesses' + attribute :tags, :aliases => 'Tags' + attribute :termination_policies, :aliases => 'TerminationPolicies' + attribute :vpc_zone_identifier, :aliases => 'VPCZoneIdentifier' + + + register_resource :auto_scaling_group, RESOURCES_AUTOSCALE + + # Only keeping a few properties, simplest define keeps. + @keeps = /^id$/ + + + def self.persistent_type() + ::AutoScalingGroup + end + + def create(service) + create_attribs=self.attribs[:attributes] + group = service.groups.create(create_attribs) + return group + end + + def destroy(service) + destroy_attribs = self.attribs + if @id + group = service.groups.destroy(destroy_attribs) + else + puts "No ID set, cannot delete." + end + return group + end + + end + end +end + diff --git a/lib/harp-runtime/resources/compute/instance.rb b/lib/harp-runtime/resources/compute/instance.rb index 8a33f2d..93a4730 100644 --- a/lib/harp-runtime/resources/compute/instance.rb +++ b/lib/harp-runtime/resources/compute/instance.rb @@ -68,7 +68,6 @@ def create(service) create_attribs = self.attribs tags = {"Name" => @name} create_attribs[:tags] = tags - binding.pry server = service.servers.create(create_attribs) @id = server.id return server diff --git a/spec/autoscaling_cloud_spec.rb b/spec/autoscaling_cloud_spec.rb new file mode 100644 index 0000000..3554a6d --- /dev/null +++ b/spec/autoscaling_cloud_spec.rb @@ -0,0 +1,50 @@ +require File.dirname(__FILE__) + '/spec_helper' +require "rubygems" +require "harp_runtime" +require "harp-runtime/cloud/cloud_mutator" + +launch_config_resource = { + "type" => "Std::LaunchConfiguration", + "image_id" => "ami-d0f89fb9", + "instance_type" => "t1.micro", + "id" => "testLC" +} + +autoscaling_group_resource = { + "type" => "Std::AutoScalingGroup", + "id" => "testASG", + "launch_configuration_name" => "testLC", + "availability_zones" => "us-east-1", + "max_size" => "1", + "min_size" => "1" +} + +describe Harp::Cloud::CloudMutator, "#create" do + it "creates a launch configuration" do + context = {} + context[:cloud_type] = :aws # for the moment, ainstancessume AWS cloud + context[:mock] = true + context[:debug] = true + context[:access] = "test" + context[:secret] = "test" + mutator = Harp::Cloud::CloudMutator.new(context) + + result = mutator.create("test_lc1", launch_config_resource) + expect(result.class).to eq(LaunchConfiguration) + expect(result.name).to eq("test_lc1") + end + + it "creates AS group" do + context = {} + context[:cloud_type] = :aws # for the moment, ainstancessume AWS cloud + context[:mock] = true + context[:debug] = true + context[:access] = "test" + context[:secret] = "test" + mutator = Harp::Cloud::CloudMutator.new(context) + + result = mutator.create("test_as_group1", autoscaling_group_resource) + expect(result.class).to eq(AutoScalingGroup) + expect(result.name).to eq("test_as_group1") + end +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index a45f4da..700f8df 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -19,6 +19,7 @@ DataMapper.setup(:default, "sqlite::memory:") +require 'harp-runtime/models/autoscale' require 'harp-runtime/models/base' require 'harp-runtime/models/compute' require 'harp-runtime/models/rds'