From f740a88ba437789ec05d30fb5bb2a941e7b81f8a Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Mon, 2 Dec 2013 17:53:59 -0600 Subject: [PATCH 1/3] added destroy functionality and State --- lib/harp-runtime/cloud/cloud_mutator.rb | 17 ++++++++++++---- .../resources/compute/instance.rb | 13 ++++++++++-- spec/compute_cloud_spec.rb | 20 +++++++++++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index cc25157..a9d2a64 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -11,6 +11,8 @@ module Cloud class CloudMutator @@logger = Logging.logger[self] + DESTROYED = "DESTROYED" + CREATED = "CREATED" def initialize(options) @access = options[:access] @@ -64,7 +66,9 @@ def create(resource_name, resource_def) resource.name = resource_name service = establish_connect(resource) created = resource.create(service) - persist_resource(resource_name, resource, created, "create") + pr = persist_resource(resource_name, resource, created, "create") + pr.state = CREATED + return pr end def destroy(resource_name, resource_def) @@ -77,7 +81,9 @@ def destroy(resource_name, resource_def) resource.name = resource_name service = establish_connect(resource) destroyed = resource.destroy(service) - persist_resource(resource_name, resource, resource, "destroy") + pr = persist_resource(resource_name, resource, resource, "destroy") + pr.state = DESTROYED + return pr end def get_output(resource, persisted) @@ -90,13 +96,16 @@ def get_output(resource, persisted) output = resource.get_output(service, persisted) end - def get_state(resource_name) + def get_state(resource_name,resource_def) resource = Harp::Resources::AvailableResource.from_name resource_def['type'] if resource.nil? @@logger.error "No resource type #{resource_def['type']}" return end - # TODO: fetch state of resource. + resource.populate(resource_def) + resource.name = resource_name + service = establish_connect(resource) + return resource.get_state(service) end private def persist_resource(resource_name, resource, live_resource, action) diff --git a/lib/harp-runtime/resources/compute/instance.rb b/lib/harp-runtime/resources/compute/instance.rb index 93a4730..1d3472c 100644 --- a/lib/harp-runtime/resources/compute/instance.rb +++ b/lib/harp-runtime/resources/compute/instance.rb @@ -74,14 +74,23 @@ def create(service) end def destroy(service) - destroy_attribs = self.attribs + @id = get_id(service) if @id - server = service.servers.destroy(destroy_attribs) + server = service.servers.destroy(@id) else puts "No ID set, cannot delete." end return server end + + def get_id(service) + tag_set = service.describe_tags('key'=>'Name','value'=>@name).body['tagSet'] + tag_set.count > 0 ? tag_set[0]['resourceId'] : nil + end + + def get_state(service) + service.servers.get(get_id(service)).state + end # Return a token to signify output from the current action def output_token(args={}) diff --git a/spec/compute_cloud_spec.rb b/spec/compute_cloud_spec.rb index a1d1840..b45f8dc 100644 --- a/spec/compute_cloud_spec.rb +++ b/spec/compute_cloud_spec.rb @@ -26,8 +26,10 @@ mutator = Harp::Cloud::CloudMutator.new(context) result = mutator.create("test_inst1", instance_resource) + expect(result.class).to eq(ComputeInstance) expect(result.name).to eq("test_inst1") + expect(result.state).to eq(Harp::Cloud::CloudMutator::CREATED) end it "creates a security group" do @@ -45,4 +47,22 @@ expect(result.description).to eq("A web security group") end +end + +describe Harp::Cloud::CloudMutator, "#destroy" do + it "destroys a cloud instance" do + context = {} + context[:cloud_type] = :aws # for the moment, assume AWS cloud + context[:mock] = true + context[:debug] = true + context[:access] = "test" + context[:secret] = "test" + mutator = Harp::Cloud::CloudMutator.new(context) + + result = mutator.destroy("test_inst1", instance_resource) + get_state = mutator.get_state("test_inst1", instance_resource) + + expect(result.state).to eq(Harp::Cloud::CloudMutator::DESTROYED) + expect(get_state).to eq("shutting-down") + end end \ No newline at end of file From fe66b29803fce52da59e2edbaf75e6428916d625 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Tue, 3 Dec 2013 19:27:02 -0600 Subject: [PATCH 2/3] querying persisted data --- lib/harp-runtime/cloud/cloud_mutator.rb | 20 ++++++++++++++++--- .../resources/compute/instance.rb | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index a9d2a64..855d3b7 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -77,13 +77,27 @@ def destroy(resource_name, resource_def) @@logger.error "No resource type #{resource_def['type']}" return end + resource.populate(resource_def) + persisted = HarpResource.entries.select{|res| res.name == resource_name}.first + + if ! persisted.nil? + require 'pry' + binding.pry + puts resource.populate(persisted.attributes) + end + resource.name = resource_name service = establish_connect(resource) + destroyed = resource.destroy(service) - pr = persist_resource(resource_name, resource, resource, "destroy") - pr.state = DESTROYED - return pr + if !destroyed.nil? + pr = persist_resource(resource_name, resource, resource, "destroy") + pr.state = DESTROYED + return pr + else + return nil + end end def get_output(resource, persisted) diff --git a/lib/harp-runtime/resources/compute/instance.rb b/lib/harp-runtime/resources/compute/instance.rb index 1d3472c..7012bdc 100644 --- a/lib/harp-runtime/resources/compute/instance.rb +++ b/lib/harp-runtime/resources/compute/instance.rb @@ -52,6 +52,8 @@ class ComputeInstance < AvailableResource attribute :user_data attribute :virtualization_type, :aliases => 'virtualizationType' attribute :vpc_id, :aliases => 'vpcId' + attribute :description + attribute :type register_resource :compute_instance, RESOURCES_COMPUTE From 61149f7fafdb3905592e9a74c5f5c3c73d349380 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Wed, 4 Dec 2013 12:05:27 -0600 Subject: [PATCH 3/3] implemented persistence / state --- lib/harp-runtime/cloud/cloud_mutator.rb | 24 +++++++++---------- .../resources/available_resources.rb | 5 +++- .../resources/compute/instance.rb | 17 +++++++------ spec/compute_cloud_spec.rb | 8 +++---- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index 855d3b7..dddeca0 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -11,8 +11,6 @@ module Cloud class CloudMutator @@logger = Logging.logger[self] - DESTROYED = "DESTROYED" - CREATED = "CREATED" def initialize(options) @access = options[:access] @@ -67,7 +65,7 @@ def create(resource_name, resource_def) service = establish_connect(resource) created = resource.create(service) pr = persist_resource(resource_name, resource, created, "create") - pr.state = CREATED + pr.state = Harp::Resources::AvailableResource::CREATED return pr end @@ -82,22 +80,16 @@ def destroy(resource_name, resource_def) persisted = HarpResource.entries.select{|res| res.name == resource_name}.first if ! persisted.nil? - require 'pry' - binding.pry - puts resource.populate(persisted.attributes) + resource.populate(persisted.attributes) end resource.name = resource_name service = establish_connect(resource) destroyed = resource.destroy(service) - if !destroyed.nil? - pr = persist_resource(resource_name, resource, resource, "destroy") - pr.state = DESTROYED - return pr - else - return nil - end + pr = persist_resource(resource_name, resource, resource, "destroy") + pr.state = Harp::Resources::AvailableResource::DESTROYED + return pr end def get_output(resource, persisted) @@ -117,6 +109,12 @@ def get_state(resource_name,resource_def) return end resource.populate(resource_def) + + persisted = HarpResource.entries.select{|res| res.name == resource_name}.first + if ! persisted.nil? + resource.populate(persisted.attributes) + end + resource.name = resource_name service = establish_connect(resource) return resource.get_state(service) diff --git a/lib/harp-runtime/resources/available_resources.rb b/lib/harp-runtime/resources/available_resources.rb index f94930d..9bc0652 100644 --- a/lib/harp-runtime/resources/available_resources.rb +++ b/lib/harp-runtime/resources/available_resources.rb @@ -36,6 +36,9 @@ class << self @@logger = Logging.logger[self] @@subclasses = { } @@service = { } + + DESTROYED = "DESTROYED" + CREATED = "CREATED" def self.create type cs = @@subclasses[type] @@ -68,7 +71,7 @@ def self.from_name name # Flesh out this resource's instance variables from supplied JSON. def populate resource resource.each { |name,value| - if ! ["type"].include?(name) + if ! ["type",:output_token,:value,:harp_script_id].include?(name) if self.class.aliases.include?(name) aliased = self.class.aliases[name] @@logger.debug "Setting var: #{aliased} to #{value}" diff --git a/lib/harp-runtime/resources/compute/instance.rb b/lib/harp-runtime/resources/compute/instance.rb index 7012bdc..40889f6 100644 --- a/lib/harp-runtime/resources/compute/instance.rb +++ b/lib/harp-runtime/resources/compute/instance.rb @@ -76,22 +76,21 @@ def create(service) end def destroy(service) - @id = get_id(service) - if @id - server = service.servers.destroy(@id) + if id + server = service.servers.destroy(id) else puts "No ID set, cannot delete." end return server end - def get_id(service) - tag_set = service.describe_tags('key'=>'Name','value'=>@name).body['tagSet'] - tag_set.count > 0 ? tag_set[0]['resourceId'] : nil - end - def get_state(service) - service.servers.get(get_id(service)).state + if id + state = service.servers.get(id).state + else + puts "No ID set, cannot get state." + end + return state end # Return a token to signify output from the current action diff --git a/spec/compute_cloud_spec.rb b/spec/compute_cloud_spec.rb index b45f8dc..072b8f7 100644 --- a/spec/compute_cloud_spec.rb +++ b/spec/compute_cloud_spec.rb @@ -29,7 +29,7 @@ expect(result.class).to eq(ComputeInstance) expect(result.name).to eq("test_inst1") - expect(result.state).to eq(Harp::Cloud::CloudMutator::CREATED) + expect(result.state).to eq(Harp::Resources::AvailableResource::CREATED) end it "creates a security group" do @@ -60,9 +60,9 @@ mutator = Harp::Cloud::CloudMutator.new(context) result = mutator.destroy("test_inst1", instance_resource) - get_state = mutator.get_state("test_inst1", instance_resource) - expect(result.state).to eq(Harp::Cloud::CloudMutator::DESTROYED) - expect(get_state).to eq("shutting-down") + expect(result.class).to eq(ComputeInstance) + expect(result.name).to eq("test_inst1") + expect(result.state).to eq(Harp::Resources::AvailableResource::DESTROYED) end end \ No newline at end of file