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
4 changes: 3 additions & 1 deletion lib/harp-runtime/interpreter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,9 @@ def create(resource_name)
if ! advance() then return self end
@@logger.debug "Launching resource: #{resource_name}."
resource = @resourcer.get resource_name
created = @mutator.create(resource_name, resource)
deps = @resourcer.get_dep(resource_name)
deps.each {|ref| create(ref)}
created = @mutator.create(resource_name, resource)
created.harp_script = @harp_script
result = {:create => resource_name}
args = {:action => :create}
Expand Down
41 changes: 38 additions & 3 deletions lib/harp-runtime/resourcer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,17 @@
module Harp

require "json"

require "rgl/adjacency"
require "rgl/topsort"

# Resourcer keeps track of defined resources and provides lookup over them.
class Resourcer

@@logger = Logging.logger[self]

def initialize(harp_id)
@dep_graph = RGL::DirectedAdjacencyGraph[]
@dependencies = Hash.new []
@harp_id = harp_id
@resources = nil
@config = nil
Expand All @@ -37,14 +41,45 @@ def get_existing(resource_name)
@resources[resource_name]
end

# Retrieve a resource dependency list from the set
def get_dep(resource_name)
@@logger.debug "Looking for : #{resource_name}'s dependencies"
@dependencies[resource_name]
end

private

def digest(content)
json = JSON.parse(content)
@config = json.has_key?("Config") ? json["Config"] : nil
@resources = json.has_key?("Resources") ? json["Resources"] : nil
# TODO: parse into graph and determine dependencies.
parse_into_graph
end
end


def parse_into_graph
@resources.each do |name, content|
match_deps(name, content, "ref")
end
unless @dep_graph.acyclic?
raise "Found circular dependency"
end
end

#Iterate over values to check for specified item
def match_deps(name, content, item)
content.each do |key, value|
if value.is_a?(Hash)
dep = value[item]
unless dep.nil?
content[key] = @resources.has_key?(dep) ? @resources[dep]["id"] : nil
@dependencies[name] += [dep]
@dep_graph.add_edge(dep, name)
end
end
end

end

end
end
2 changes: 1 addition & 1 deletion spec/lang_addon_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ def copy()
results = interpreter.play("copy", interpreter_context)
expect(results).not_to be_empty
end
end
end
50 changes: 50 additions & 0 deletions spec/reference_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
require File.dirname(__FILE__) + '/spec_helper'
require "rubygems"
require "harp_runtime"
require "evalhook"

ADDON_SCRIPT = <<OUTER
template = <<END
{
"Config": {
},
"Resources": {
"lc1": {
"type": "Std::LaunchConfiguration",
"image_id": "ami-d0f89fb9",
"instance_type": "t1.micro",
"id": "langSpecLc"
},
"asg1": {
"type": "Std::AutoScalingGroup",
"id": "langSpecASG",
"launch_configuration_name": {"ref": "lc1"},
"availability_zones": "us-east-1",
"max_size": "1",
"min_size": "1"
}

}
}
END

engine.consume(template)

def create()
engine.create("asg1")
end

OUTER

describe Harp::HarpInterpreter, "#play" do
let(:interpreter_context) do
c = create_interpreter_context()
c[:harp_contents] = ADDON_SCRIPT
c
end
let(:interpreter) { Harp::HarpInterpreter.new(interpreter_context()) }
it "handles refs" do
results = interpreter.play("create", interpreter_context)
expect(results).not_to be_empty
end
end