Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions lib/harp-runtime/cloud/cloud_mutator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down
5 changes: 4 additions & 1 deletion lib/harp-runtime/resources/available_resources.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ class << self
@@logger = Logging.logger[self]
@@subclasses = { }
@@service = { }

DESTROYED = "DESTROYED"
CREATED = "CREATED"

def self.create type
cs = @@subclasses[type]
Expand Down Expand Up @@ -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}"
Expand Down
16 changes: 13 additions & 3 deletions lib/harp-runtime/resources/compute/instance.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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={})
Expand Down
21 changes: 20 additions & 1 deletion spec/compute_cloud_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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