diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index b876e9e..7418626 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -70,7 +70,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 = Harp::Resources::AvailableResource::CREATED + return pr end def destroy(resource_name, resource_def) @@ -79,11 +81,21 @@ 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? + resource.populate(persisted.attributes) + end + 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 = Harp::Resources::AvailableResource::DESTROYED + return pr end def get_output(resource, persisted) @@ -96,13 +108,22 @@ 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) + + 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) end private def persist_resource(resource_name, resource, live_resource, action) diff --git a/lib/harp-runtime/resources/available_resources.rb b/lib/harp-runtime/resources/available_resources.rb index 3f248e5..d1b3819 100644 --- a/lib/harp-runtime/resources/available_resources.rb +++ b/lib/harp-runtime/resources/available_resources.rb @@ -39,6 +39,9 @@ class << self @@logger = Logging.logger[self] @@subclasses = { } @@service = { } + + DESTROYED = "DESTROYED" + CREATED = "CREATED" def self.create type cs = @@subclasses[type] @@ -72,7 +75,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 00e3620..902af8c 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 @@ -74,14 +76,22 @@ def create(service) end def destroy(service) - destroy_attribs = self.attribs - if @id - server = service.servers.destroy(destroy_attribs) + if id + server = service.servers.destroy(id) else puts "No ID set, cannot delete." end return server end + + def get_state(service) + 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 def output_token(args={}) diff --git a/spec/compute_cloud_spec.rb b/spec/compute_cloud_spec.rb index d83332d..4e40905 100644 --- a/spec/compute_cloud_spec.rb +++ b/spec/compute_cloud_spec.rb @@ -37,8 +37,10 @@ it "creates a cloud instance" do 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::Resources::AvailableResource::CREATED) end it "creates a security group" do @@ -48,11 +50,28 @@ expect(result.description).to eq("A web security group") end - + it "creates a volume" do result = mutator.create("test_vol1", volume_resource) expect(result.class).to eq(Volume) expect(result.name).to eq("test_vol1") 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) + + expect(result.class).to eq(ComputeInstance) + expect(result.name).to eq("test_inst1") + expect(result.state).to eq(Harp::Resources::AvailableResource::DESTROYED) + end end