From f4a3474aac1eba6096d4bfd4b1b367ff9ad37bc6 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Wed, 15 Jan 2014 17:10:45 -0600 Subject: [PATCH 01/14] implemented puppet assembly --- app/harp_user_api.rb | 4 ++ lib/harp-runtime/models/user_data.rb | 6 +++ .../resources/assembly/assembly.rb | 1 + .../resources/assembly/assembly_puppet.rb | 43 +++++++++++++++-- .../assembly/chef_bootstrap/bootstrap.rb | 20 -------- .../assembly/chef_bootstrap/knife.rb | 10 ---- .../assembly/puppet-bootstrap/ubuntu.sh | 21 +++++++++ sample/puppet_assembly.harp | 47 +++++++++++++++++++ spec/assembly_cloud_spec.rb | 13 +++-- 9 files changed, 125 insertions(+), 40 deletions(-) delete mode 100644 lib/harp-runtime/resources/assembly/chef_bootstrap/bootstrap.rb delete mode 100644 lib/harp-runtime/resources/assembly/chef_bootstrap/knife.rb create mode 100755 lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh create mode 100644 sample/puppet_assembly.harp diff --git a/app/harp_user_api.rb b/app/harp_user_api.rb index 4c66705..90d3ce0 100644 --- a/app/harp_user_api.rb +++ b/app/harp_user_api.rb @@ -11,5 +11,9 @@ class HarpUserApiApp < Sinatra::Base get '/key/:key_name' do Key.get_by_name(params[:key_name]).to_json end + + get '/puppet-emc/:master_ip' do + PuppetENC.find(params[:master_ip]).first.attributes[:yaml] + end end diff --git a/lib/harp-runtime/models/user_data.rb b/lib/harp-runtime/models/user_data.rb index ea8677d..1461359 100644 --- a/lib/harp-runtime/models/user_data.rb +++ b/lib/harp-runtime/models/user_data.rb @@ -29,3 +29,9 @@ def self.get_by_name(key_name) Key.all(:name => key_name).first end end + +class PuppetENC + include DataMapper::Resource + property :master_ip, String, :key => true + property :yaml, Text +end diff --git a/lib/harp-runtime/resources/assembly/assembly.rb b/lib/harp-runtime/resources/assembly/assembly.rb index e59911e..b44f771 100644 --- a/lib/harp-runtime/resources/assembly/assembly.rb +++ b/lib/harp-runtime/resources/assembly/assembly.rb @@ -40,6 +40,7 @@ def self.persistent_type() end def create(service) + @service = service provisioner = init_provisioner atts = self.attribs[:attributes] assembly = service.servers.create(atts[:server_options].symbolize_keys) diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index cf21eed..2b49b7c 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -16,14 +16,15 @@ class AssemblyPuppet < Assembly attribute :live_resource attribute :state attribute :type - + attribute :name attribute :cloud attribute :configurations attribute :tool attribute :cloud_credential attribute :image - + + attribute :config attribute :packages attribute :server_options @@ -35,13 +36,45 @@ class AssemblyPuppet < Assembly def self.persistent_type() ::AssemblyPuppet end - - def provision_server(server_ip) + + def init_provisioner + bootstrap_file = File.open(File.expand_path("../puppet-bootstrap/ubuntu.sh", __FILE__)).read + user_data = "" + line_num=0 + bootstrap_file.each_line do |line| + if line_num == 0 + user_data << line + line_num += 1 + user_data << "puppet_master_ip=" + config["server_url"] + line_num += 1 + else + user_data << line + line_num += 1 + end + end + server_options["user_data"] = user_data + end + + def provision_server(server_ip,provisioner) + PuppetENC.first_or_create(:master_ip=>config["server_url"]).update(:master_ip=>config["server_url"],:yaml=>parse_packages) + end + + def bootstrap_server(provisioner,server_ip,parse_packages) end - + def destroy_provisioner(private_dns_name) end + def parse_packages + classes_list = {} + packages.each { |p| classes_list[p['name']] = nil} + yaml_hash = {"classes"=>classes_list} + yaml_hash.to_yaml + end + + def get_provisioner_output(service, persisted) + end + end end end diff --git a/lib/harp-runtime/resources/assembly/chef_bootstrap/bootstrap.rb b/lib/harp-runtime/resources/assembly/chef_bootstrap/bootstrap.rb deleted file mode 100644 index e174474..0000000 --- a/lib/harp-runtime/resources/assembly/chef_bootstrap/bootstrap.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rubygems' -require "chef" -require "chef/knife/core/bootstrap_context" -require 'chef/knife' -require 'chef/knife/ssh' -require 'net/ssh' -require 'net/ssh/multi' -require 'chef/knife/bootstrap' - -Chef::Config.from_file(File.expand_path('')) -kb = Chef::Knife::Bootstrap.new -kb.name_args = "" -kb.config[:identity_file] = "" -kb.config[:ssh_user] = "" -kb.config[:ssh_password] = "" -kb.config[:run_list] = ["recipe[apt]","recipe[]"] -kb.config[:use_sudo] = true -kb.config[:use_sudo_password] = true -kb.config[:distro] = "chef-full" -kb.run \ No newline at end of file diff --git a/lib/harp-runtime/resources/assembly/chef_bootstrap/knife.rb b/lib/harp-runtime/resources/assembly/chef_bootstrap/knife.rb deleted file mode 100644 index f219257..0000000 --- a/lib/harp-runtime/resources/assembly/chef_bootstrap/knife.rb +++ /dev/null @@ -1,10 +0,0 @@ -log_level :info -log_location STDOUT -node_name '' -client_key '' -validation_client_name '' -validation_key '' -chef_server_url '' -cache_type 'BasicFile' -cache_options( :path => 'checksums' ) -cookbook_path [ 'cookbooks' ] \ No newline at end of file diff --git a/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh b/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh new file mode 100755 index 0000000..fe2f876 --- /dev/null +++ b/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -e -x + +# Needed so that the aptitude/apt-get operations will not be interactive +export DEBIAN_FRONTEND=noninteractive + +apt-get update && apt-get -y upgrade + +# Find the current IP of the puppet master and make "puppet" point to it +#puppet_master_ip=$(host my_puppet_master.company.com | grep "has address" | head -1 | awk '{print $NF}') +echo $puppet_master_ip puppet >> /etc/hosts + +aptitude -y install puppet + +# Enable the puppet client +sed -i /etc/default/puppet -e 's/START=no/START=yes/' + +sed -i -e '/\[main\]/{:a;n;/^$/!ba;i\pluginsync=true' -e '}' /etc/puppet/puppet.conf + +service puppet restart \ No newline at end of file diff --git a/sample/puppet_assembly.harp b/sample/puppet_assembly.harp new file mode 100644 index 0000000..93c9ebd --- /dev/null +++ b/sample/puppet_assembly.harp @@ -0,0 +1,47 @@ +# Create some instances on AWS + +template = < "Std::AssemblyChef", "server_options" => server_options, - + "name" => "ChefAssembly", "image" => "ami-d0f89fb9", "packages" => [ @@ -38,19 +38,22 @@ assembly_puppet_resource = { "type" => "Std::AssemblyPuppet", "server_options" => server_options, - + "name" => "PuppetAssembly", "image" => "ami-d0f89fb9", "packages" => [ {"name" => "transcend_nexus","type" => "class"}, {"name" => "transcend_sonar","type" => "class"} - ] + ], + "config" => { + "server_url" => "54.205.121.185" + } } assembly_salt_resource = { "type" => "Std::AssemblySalt", "server_options" => server_options, - + "name" => "SaltAssembly", "image" => "ami-d0f89fb9", "packages" => [ @@ -93,4 +96,4 @@ assembly_salt verify_created(@new_assembly_salt, "SaltAssembly", AssemblySalt) end -end \ No newline at end of file +end From 32b5062e4683ebbf1cb48e44abbff7f780b04e39 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 16 Jan 2014 13:23:43 -0600 Subject: [PATCH 02/14] private dns name for node name --- lib/harp-runtime/resources/assembly/assembly_puppet.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index 2b49b7c..52e302f 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -56,7 +56,8 @@ def init_provisioner end def provision_server(server_ip,provisioner) - PuppetENC.first_or_create(:master_ip=>config["server_url"]).update(:master_ip=>config["server_url"],:yaml=>parse_packages) + internal_dns = @service.servers.get(id).private_dns_name + PuppetENC.first_or_create(:master_ip=>internal_dns).update(:master_ip=>internal_dns,:yaml=>parse_packages) end def bootstrap_server(provisioner,server_ip,parse_packages) From f48942a9cb380d85cefff67d916c024f8bee6f94 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 16 Jan 2014 22:43:59 +0000 Subject: [PATCH 03/14] changed packages to be an array on enc yaml --- Gemfile.lock | 36 +++++++++---------- lib/harp-runtime/cloud/cloud_mutator.rb | 11 +++--- .../resources/assembly/assembly_puppet.rb | 4 +-- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0e6272e..faf33c0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,7 +31,7 @@ GEM gyoku (>= 0.4.0) nokogiri (>= 1.4.0) awesome_print (1.2.0) - backports (3.3.5) + backports (3.4.0) bcrypt-ruby (3.1.2) buff-config (0.4.0) buff-extensions (~> 0.3) @@ -69,12 +69,12 @@ GEM dm-transactions (~> 1.2.0) dm-types (~> 1.2.0) dm-validations (~> 1.2.0) - debugger (1.6.3) + debugger (1.6.5) columnize (>= 0.3.1) debugger-linecache (~> 1.2.0) - debugger-ruby_core_source (~> 1.2.4) + debugger-ruby_core_source (~> 1.3.1) debugger-linecache (1.2.0) - debugger-ruby_core_source (1.2.4) + debugger-ruby_core_source (1.3.1) delayed_job (2.1.4) activesupport (~> 3.0) daemons @@ -127,17 +127,17 @@ GEM data_objects (= 0.10.13) do_sqlite3 (0.10.13) data_objects (= 0.10.13) - docile (1.1.1) + docile (1.1.2) erubis (2.7.0) evalhook (0.5.7) partialruby (~> 0.3) sexp_processor (~> 4.0) - excon (0.28.0) + excon (0.31.0) extlib (0.9.16) factory_girl (4.3.0) activesupport (>= 3.0.0) faraday (0.8.8) - multipart-post (~> 1.2.0) + multipart-post (>= 1.2, < 3) fastercsv (1.5.5) ffi (1.9.3) flay (2.4.0) @@ -146,9 +146,9 @@ GEM flog (4.2.0) ruby_parser (~> 3.1, > 3.1.0) sexp_processor (~> 4.4) - fog (1.18.0) + fog (1.19.0) builder - excon (~> 0.28.0) + excon (~> 0.31.0) formatador (~> 0.2.0) mime-types multi_json (~> 1.0) @@ -160,7 +160,7 @@ GEM getsource (0.2.1) gssapi (1.0.3) ffi (>= 1.0.1) - gyoku (1.1.0) + gyoku (1.1.1) builder (>= 2.1.2) hashie (2.0.5) httpclient (2.3.4.1) @@ -183,13 +183,13 @@ GEM mixlib-authentication (1.3.0) mixlib-log mixlib-log (1.6.0) - multi_json (1.8.2) - multipart-post (1.2.0) + multi_json (1.8.4) + multipart-post (2.0.0) net-http-persistent (2.9) net-scp (1.1.2) net-ssh (>= 2.6.5) net-ssh (2.7.0) - nio4r (0.5.0) + nio4r (1.0.0) nokogiri (1.6.1) mini_portile (~> 0.5.0) nori (1.1.5) @@ -206,17 +206,17 @@ GEM puma (2.7.1) rack (>= 1.1, < 2.0) rack (1.5.2) - rack-protection (1.5.1) + rack-protection (1.5.2) rack rack-test (0.6.2) rack (>= 1.0) racksh (1.0.0) rack (>= 1.0) rack-test (>= 0.5) - rake (10.1.0) + rake (10.1.1) rest-client (1.6.7) mime-types (>= 1.16) - retryable (1.3.3) + retryable (1.3.4) rgl (0.4.0) rake stream (>= 0.5) @@ -255,7 +255,7 @@ GEM ruby2ruby (2.0.7) ruby_parser (~> 3.1) sexp_processor (~> 4.0) - ruby_parser (3.2.2) + ruby_parser (3.3.0) sexp_processor (~> 4.1) rubyntlm (0.1.1) savon (0.9.5) @@ -306,7 +306,7 @@ GEM json (>= 1.4.6) launchy (>= 2.0.0) uuidtools (2.1.4) - varia_model (0.2.0) + varia_model (0.3.2) buff-extensions (~> 0.2) hashie (>= 2.0.2) wasabi (1.0.0) diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index 5f9fab7..ba0b975 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -106,14 +106,13 @@ def get_harp_resource(resource_name) end def get_output(resource, persisted) - res = Harp::Resources::AvailableResource.from_name resource['type'] - if res.nil? - @@logger.error "No resource type #{resource['type']}" + resource = Harp::Resources::AvailableResource.from_name resource['type'] + if resource.nil? + @@logger.error "No resource type #{resource_def['type']}" return end - res.populate(resource) - service = establish_connect(res) - output = res.get_output(service, persisted) + service = establish_connect(resource) + output = resource.get_output(service, persisted) end def add_all(resources) diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index 52e302f..1162ca4 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -67,8 +67,8 @@ def destroy_provisioner(private_dns_name) end def parse_packages - classes_list = {} - packages.each { |p| classes_list[p['name']] = nil} + classes_list = [] + packages.each { |p| classes_list << p['name']} yaml_hash = {"classes"=>classes_list} yaml_hash.to_yaml end From 6e6689d612976c5a550dffb49a554a396a3a6d81 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 16 Jan 2014 22:44:37 +0000 Subject: [PATCH 04/14] changed packages to be an array on enc yaml --- .../resources/assembly/puppet-bootstrap/puppet_node_classifier | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier diff --git a/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier b/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier new file mode 100644 index 0000000..371c81b --- /dev/null +++ b/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier @@ -0,0 +1,2 @@ +#!/bin/bash +curl http://harp-dev-69587.use1.nitrousbox.com:9393/api/v1/user/puppet-emc/$1 \ No newline at end of file From c7d0f8a26f121f426dab17339248d7e0c81bbd56 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 16 Jan 2014 17:00:54 -0600 Subject: [PATCH 05/14] fixed get_output merge conflict --- lib/harp-runtime/cloud/cloud_mutator.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/harp-runtime/cloud/cloud_mutator.rb b/lib/harp-runtime/cloud/cloud_mutator.rb index ba0b975..5f9fab7 100644 --- a/lib/harp-runtime/cloud/cloud_mutator.rb +++ b/lib/harp-runtime/cloud/cloud_mutator.rb @@ -106,13 +106,14 @@ def get_harp_resource(resource_name) end def get_output(resource, persisted) - resource = Harp::Resources::AvailableResource.from_name resource['type'] - if resource.nil? - @@logger.error "No resource type #{resource_def['type']}" + res = Harp::Resources::AvailableResource.from_name resource['type'] + if res.nil? + @@logger.error "No resource type #{resource['type']}" return end - service = establish_connect(resource) - output = resource.get_output(service, persisted) + res.populate(resource) + service = establish_connect(res) + output = res.get_output(service, persisted) end def add_all(resources) From 8fd638c87e79982088bfb0b98553c16044737608 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Mon, 20 Jan 2014 18:57:05 -0600 Subject: [PATCH 06/14] encapsulating assembly spec tests --- .../resources/assembly/assembly.rb | 2 +- .../resources/assembly/assembly_puppet.rb | 8 ++++++ sample/puppet_assembly.harp | 2 +- spec/assembly_cloud_spec.rb | 27 ++++++++++++++++--- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/harp-runtime/resources/assembly/assembly.rb b/lib/harp-runtime/resources/assembly/assembly.rb index b44f771..955e4e6 100644 --- a/lib/harp-runtime/resources/assembly/assembly.rb +++ b/lib/harp-runtime/resources/assembly/assembly.rb @@ -71,7 +71,7 @@ def get_output(service, persisted) response = service.get_console_output(persisted.id) if response.status == 200 output += "\nstdout:\n" - output += output + response.body['output'] + output += response.body['output'] if !response.body['output'].nil? # escape special characters to ensure valid JSON. output = output.gsub('"', '\\"') output = output.gsub("\r", '') diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index 1162ca4..42b9855 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -74,6 +74,14 @@ def parse_packages end def get_provisioner_output(service, persisted) + server = service.servers.get(persisted.id) + server.username = config["ssh"]["user"] + @ssh_key = Key.get_by_name(config['ssh']['keys'][0]).temp_file + server.private_key_path = @ssh_key.path + output = "puppet: \n" + output += server.ssh(['sudo cat /var/log/syslog'])[0].stdout + @ssh_key.unlink + output end end diff --git a/sample/puppet_assembly.harp b/sample/puppet_assembly.harp index 93c9ebd..24c952a 100644 --- a/sample/puppet_assembly.harp +++ b/sample/puppet_assembly.harp @@ -23,7 +23,7 @@ template = < "PuppetAssembly", "image" => "ami-d0f89fb9", "packages" => [ - {"name" => "transcend_nexus","type" => "class"}, - {"name" => "transcend_sonar","type" => "class"} + {"name" => "apache","type" => "class"}, + {"name" => "ntp","type" => "class"} ], "config" => { - "server_url" => "54.205.121.185" + "server_url" => "54.205.121.185", + "ssh" => { + "user" => "ubuntu", + "keys" => ["dev-client-ec2"] + } } } @@ -64,12 +68,27 @@ } shared_context 'when have an assembly' do + let(:mutator_assembly) { + cnf = YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), '../config/settings.yaml')) + Key.first_or_create(:name=>'dev-client-ec2').update(:value=>cnf['default_creds']['dev-client-ec2']) + Key.first_or_create(:name=>'harp-client').update(:value=>cnf['default_creds']['harp-client']) + Key.first_or_create(:name=>'momentumsidev-validator').update(:value=>cnf['default_creds']['momentumsidev-validator']) + PuppetENC.first_or_create(:master_ip=>"www.momentumsi.com").update(:yaml=>nil) + interpreter_context = {} + interpreter_context[:cloud_type] = :aws # for the moment, assume AWS cloud + interpreter_context[:debug] = true + interpreter_context[:access] = cnf['default_creds']['access'] + interpreter_context[:secret] = cnf['default_creds']['secret'] + interpreter_context[:harp_script] = FactoryGirl.create(:harp_script) + interpreter_context + Harp::Cloud::CloudMutator.new(interpreter_context) + } let(:assembly_chef) do @new_assembly_chef = mutator.create("ChefAssembly", assembly_chef_resource) @new_assembly_chef.instance_variable_get(:@id) end let(:assembly_puppet) do - @new_assembly_puppet = mutator.create("PuppetAssembly", assembly_puppet_resource) + @new_assembly_puppet = mutator_assembly.create("PuppetAssembly", assembly_puppet_resource) @new_assembly_puppet.instance_variable_get(:@id) end let(:assembly_salt) do From 1859d03dda8d37299092993681c87f5df49524d0 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Tue, 21 Jan 2014 16:24:19 -0600 Subject: [PATCH 07/14] implemented Chef Assembly integration test create -> destroy --- Gemfile.lock | 12 +++++++++--- harp-runtime.gemspec | 2 ++ lib/harp-runtime/models/assembly.rb | 2 ++ lib/harp-runtime/resources/assembly/assembly.rb | 2 +- .../resources/assembly/assembly_chef.rb | 5 ++++- spec/assembly_cloud_spec.rb | 13 ++++++++----- spec/factories/harp_factories.rb | 5 +++++ spec/spec_helper.rb | 3 ++- 8 files changed, 33 insertions(+), 11 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index faf33c0..c6560c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,7 +8,9 @@ PATH dm-mysql-adapter dm-sqlite-adapter extlib + faraday (= 0.8.9) fog + httparty json logging net-ssh @@ -136,8 +138,8 @@ GEM extlib (0.9.16) factory_girl (4.3.0) activesupport (>= 3.0.0) - faraday (0.8.8) - multipart-post (>= 1.2, < 3) + faraday (0.8.9) + multipart-post (~> 1.2.0) fastercsv (1.5.5) ffi (1.9.3) flay (2.4.0) @@ -163,6 +165,9 @@ GEM gyoku (1.1.1) builder (>= 2.1.2) hashie (2.0.5) + httparty (0.12.0) + json (~> 1.8) + multi_xml (>= 0.5.2) httpclient (2.3.4.1) httpi (0.9.7) rack @@ -184,7 +189,8 @@ GEM mixlib-log mixlib-log (1.6.0) multi_json (1.8.4) - multipart-post (2.0.0) + multi_xml (0.5.5) + multipart-post (1.2.0) net-http-persistent (2.9) net-scp (1.1.2) net-ssh (>= 2.6.5) diff --git a/harp-runtime.gemspec b/harp-runtime.gemspec index a194bf7..1f848a1 100644 --- a/harp-runtime.gemspec +++ b/harp-runtime.gemspec @@ -34,8 +34,10 @@ Gem::Specification.new do |gem| gem.add_runtime_dependency "puma" gem.add_runtime_dependency "delayed_job" gem.add_runtime_dependency "delayed_job_data_mapper" + gem.add_runtime_dependency "faraday",["= 0.8.9"] gem.add_runtime_dependency "ridley" gem.add_runtime_dependency "ridley-connectors" + gem.add_runtime_dependency "httparty" gem.add_development_dependency "rspec" gem.add_development_dependency "shotgun" diff --git a/lib/harp-runtime/models/assembly.rb b/lib/harp-runtime/models/assembly.rb index a1a1abf..a9a1afb 100644 --- a/lib/harp-runtime/models/assembly.rb +++ b/lib/harp-runtime/models/assembly.rb @@ -6,6 +6,8 @@ class Assembly < HarpResource end class AssemblyChef < HarpResource + property :public_ip_address, String + property :private_ip_address, String end class AssemblyPuppet < HarpResource diff --git a/lib/harp-runtime/resources/assembly/assembly.rb b/lib/harp-runtime/resources/assembly/assembly.rb index 955e4e6..5878603 100644 --- a/lib/harp-runtime/resources/assembly/assembly.rb +++ b/lib/harp-runtime/resources/assembly/assembly.rb @@ -47,7 +47,7 @@ def create(service) assembly.wait_for { ready? } self.id = assembly.id provision_server(assembly.public_ip_address,provisioner) - return self + return assembly end def destroy(service) diff --git a/lib/harp-runtime/resources/assembly/assembly_chef.rb b/lib/harp-runtime/resources/assembly/assembly_chef.rb index 519be93..66b7bc6 100644 --- a/lib/harp-runtime/resources/assembly/assembly_chef.rb +++ b/lib/harp-runtime/resources/assembly/assembly_chef.rb @@ -30,11 +30,14 @@ class AssemblyChef < Assembly attribute :config attribute :packages attribute :server_options + + attribute :private_ip_address, :aliases => 'privateIpAddress' + attribute :public_ip_address, :aliases => 'ipAddress' register_resource :assembly_chef, RESOURCES_ASSEMBLY # Only keeping a few properties, simplest define keeps. - @keeps = /^id$/ + @keeps = /^id$|^.*_ip_address/ def self.persistent_type() ::AssemblyChef diff --git a/spec/assembly_cloud_spec.rb b/spec/assembly_cloud_spec.rb index 320f322..5b00b16 100644 --- a/spec/assembly_cloud_spec.rb +++ b/spec/assembly_cloud_spec.rb @@ -2,6 +2,7 @@ require "rubygems" require "harp_runtime" require "harp-runtime/cloud/cloud_mutator" +require "httparty" server_options = { "image_id" => "ami-d0f89fb9", @@ -70,9 +71,9 @@ shared_context 'when have an assembly' do let(:mutator_assembly) { cnf = YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), '../config/settings.yaml')) - Key.first_or_create(:name=>'dev-client-ec2').update(:value=>cnf['default_creds']['dev-client-ec2']) - Key.first_or_create(:name=>'harp-client').update(:value=>cnf['default_creds']['harp-client']) - Key.first_or_create(:name=>'momentumsidev-validator').update(:value=>cnf['default_creds']['momentumsidev-validator']) + FactoryGirl.create(:key, name: "dev-client-ec2", value: cnf['default_creds']['dev-client-ec2']) + FactoryGirl.create(:key, name: "harp-client", value: cnf['default_creds']['harp-client']) + FactoryGirl.create(:key, name: "momentumsidev-validator", value: cnf['default_creds']['momentumsidev-validator']) PuppetENC.first_or_create(:master_ip=>"www.momentumsi.com").update(:yaml=>nil) interpreter_context = {} interpreter_context[:cloud_type] = :aws # for the moment, assume AWS cloud @@ -84,7 +85,7 @@ Harp::Cloud::CloudMutator.new(interpreter_context) } let(:assembly_chef) do - @new_assembly_chef = mutator.create("ChefAssembly", assembly_chef_resource) + @new_assembly_chef = mutator_assembly.create("ChefAssembly", assembly_chef_resource) @new_assembly_chef.instance_variable_get(:@id) end let(:assembly_puppet) do @@ -92,7 +93,7 @@ @new_assembly_puppet.instance_variable_get(:@id) end let(:assembly_salt) do - @new_assembly_salt = mutator.create("SaltAssembly", assembly_salt_resource) + @new_assembly_salt = mutator_assembly.create("SaltAssembly", assembly_salt_resource) @new_assembly_salt.instance_variable_get(:@id) end end @@ -104,6 +105,8 @@ pending "pending due to need of live instance" assembly_chef verify_created(@new_assembly_chef, "ChefAssembly", AssemblyChef) + expect(HTTParty.get("http://#{@new_assembly_chef.public_ip_address}").code).to eq(200) + mutator_assembly.destroy("ChefAssembly", assembly_chef_resource) end it "creates an assembly_puppet" do pending "pending due to need of live instance" diff --git a/spec/factories/harp_factories.rb b/spec/factories/harp_factories.rb index 61429f5..545b64b 100644 --- a/spec/factories/harp_factories.rb +++ b/spec/factories/harp_factories.rb @@ -14,4 +14,9 @@ state "starting" harp_script end + + factory :key do + name "key_resource" + value "valid_key" + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8887d3e..dc1d744 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -22,7 +22,8 @@ require 'data_mapper' -DataMapper.setup(:default, "sqlite::memory:") +#DataMapper.setup(:default, "sqlite::memory:") +DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/devspec.db") require 'harp-runtime/models/autoscale' require 'harp-runtime/models/base' From c4ae0bff2b1fe913509e0a0fae6fd3cfd45cd561 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Wed, 22 Jan 2014 15:02:42 -0600 Subject: [PATCH 08/14] converted puppet assembly to use ssh on the master to configure external resource classifier, not requiring harp to be run where it's ip is publicly visible --- lib/harp-runtime/resources/assembly/assembly_puppet.rb | 10 ++++++++-- .../assembly/puppet-bootstrap/puppet_node_classifier | 2 +- spec/assembly_cloud_spec.rb | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) mode change 100644 => 100755 lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index 42b9855..f4a647a 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -56,8 +56,14 @@ def init_provisioner end def provision_server(server_ip,provisioner) - internal_dns = @service.servers.get(id).private_dns_name - PuppetENC.first_or_create(:master_ip=>internal_dns).update(:master_ip=>internal_dns,:yaml=>parse_packages) + # internal_dns = @service.servers.get(id).private_dns_name +# PuppetENC.first_or_create(:master_ip=>internal_dns).update(:master_ip=>internal_dns,:yaml=>parse_packages) + server = @service.servers.find{|i| i.public_ip_address == config['server_url'] || i.dns_name == config['server_url']} + server.username = config["ssh"]["user"] + @ssh_key = Key.get_by_name(config['ssh']['keys'][0]).temp_file + server.private_key_path = @ssh_key.path + server.ssh(['echo "'+parse_packages+'" > /usr/local/bin/puppet_node_classifiers/'+@service.servers.get(id).private_dns_name.downcase])[0].stdout + @ssh_key.unlink end def bootstrap_server(provisioner,server_ip,parse_packages) diff --git a/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier b/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier old mode 100644 new mode 100755 index 371c81b..87a5fc1 --- a/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier +++ b/lib/harp-runtime/resources/assembly/puppet-bootstrap/puppet_node_classifier @@ -1,2 +1,2 @@ #!/bin/bash -curl http://harp-dev-69587.use1.nitrousbox.com:9393/api/v1/user/puppet-emc/$1 \ No newline at end of file +cat /usr/local/bin/puppet_node_classifiers/$1 \ No newline at end of file diff --git a/spec/assembly_cloud_spec.rb b/spec/assembly_cloud_spec.rb index 5b00b16..c053388 100644 --- a/spec/assembly_cloud_spec.rb +++ b/spec/assembly_cloud_spec.rb @@ -109,9 +109,10 @@ mutator_assembly.destroy("ChefAssembly", assembly_chef_resource) end it "creates an assembly_puppet" do - pending "pending due to need of live instance" + #pending "pending due to need of live instance" assembly_puppet verify_created(@new_assembly_puppet, "PuppetAssembly", AssemblyPuppet) + #mutator_assembly.destroy("PuppetAssembly", assembly_puppet_resource) end it "creates an assembly_salt" do pending "pending due to need of live instance" From 3de965b32eb9486dd928cc92c592ba7e964cd865 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Wed, 22 Jan 2014 16:26:09 -0600 Subject: [PATCH 09/14] converted puppet bootstrap to take place via ssh as opposed to user_data script, allowing for knowledge of when finished --- .../resources/assembly/assembly_puppet.rb | 22 ++++++++++++++++++- .../assembly/puppet-bootstrap/ubuntu.sh | 14 ++++++------ spec/assembly_cloud_spec.rb | 4 ++-- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index f4a647a..ad166e2 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -64,9 +64,29 @@ def provision_server(server_ip,provisioner) server.private_key_path = @ssh_key.path server.ssh(['echo "'+parse_packages+'" > /usr/local/bin/puppet_node_classifiers/'+@service.servers.get(id).private_dns_name.downcase])[0].stdout @ssh_key.unlink + bootstrap_server end - def bootstrap_server(provisioner,server_ip,parse_packages) + def bootstrap_server + server = @service.servers.get(id) + server.username = config["ssh"]["user"] + @ssh_key = Key.get_by_name(config['ssh']['keys'][0]).temp_file + server.private_key_path = @ssh_key.path + begin + bootstrap(server) + rescue + sleep(20) + bootstrap(server) + end + @ssh_key.unlink + end + + def bootstrap(server) + server.ssh(["sudo apt-get update && apt-get -y upgrade"])[0].stdout + server.ssh(["sudo aptitude -y install puppet"])[0].stdout + server.ssh(["sudo sed -i /etc/default/puppet -e 's/START=no/START=yes/'"])[0].stdout + server.ssh(["sudo sed -i -e '/\[main\]/{:a;n;/^$/!ba;i\pluginsync=true' -e '}' /etc/puppet/puppet.conf"])[0].stdout + server.ssh(["sudo service puppet restart"])[0].stdout end def destroy_provisioner(private_dns_name) diff --git a/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh b/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh index fe2f876..c351c45 100755 --- a/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh +++ b/lib/harp-runtime/resources/assembly/puppet-bootstrap/ubuntu.sh @@ -1,21 +1,21 @@ #!/bin/bash -set -e -x +#set -e -x # Needed so that the aptitude/apt-get operations will not be interactive -export DEBIAN_FRONTEND=noninteractive +#export DEBIAN_FRONTEND=noninteractive -apt-get update && apt-get -y upgrade +#apt-get update && apt-get -y upgrade # Find the current IP of the puppet master and make "puppet" point to it #puppet_master_ip=$(host my_puppet_master.company.com | grep "has address" | head -1 | awk '{print $NF}') echo $puppet_master_ip puppet >> /etc/hosts -aptitude -y install puppet +#aptitude -y install puppet # Enable the puppet client -sed -i /etc/default/puppet -e 's/START=no/START=yes/' +#sed -i /etc/default/puppet -e 's/START=no/START=yes/' -sed -i -e '/\[main\]/{:a;n;/^$/!ba;i\pluginsync=true' -e '}' /etc/puppet/puppet.conf +#sed -i -e '/\[main\]/{:a;n;/^$/!ba;i\pluginsync=true' -e '}' /etc/puppet/puppet.conf -service puppet restart \ No newline at end of file +#service puppet restart \ No newline at end of file diff --git a/spec/assembly_cloud_spec.rb b/spec/assembly_cloud_spec.rb index c053388..879d396 100644 --- a/spec/assembly_cloud_spec.rb +++ b/spec/assembly_cloud_spec.rb @@ -109,10 +109,10 @@ mutator_assembly.destroy("ChefAssembly", assembly_chef_resource) end it "creates an assembly_puppet" do - #pending "pending due to need of live instance" + pending "pending due to need of live instance" assembly_puppet verify_created(@new_assembly_puppet, "PuppetAssembly", AssemblyPuppet) - #mutator_assembly.destroy("PuppetAssembly", assembly_puppet_resource) + mutator_assembly.destroy("PuppetAssembly", assembly_puppet_resource) end it "creates an assembly_salt" do pending "pending due to need of live instance" From c7be4240ee16e1da44073b06b16c6ed77929ee46 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Wed, 22 Jan 2014 17:49:28 -0600 Subject: [PATCH 10/14] wrote integration test for PuppetAssembly validating configuration of packages --- lib/harp-runtime/models/assembly.rb | 2 ++ .../resources/assembly/assembly_puppet.rb | 32 ++++++++++++------- spec/assembly_cloud_spec.rb | 7 ++++ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/harp-runtime/models/assembly.rb b/lib/harp-runtime/models/assembly.rb index a9a1afb..3ddd17f 100644 --- a/lib/harp-runtime/models/assembly.rb +++ b/lib/harp-runtime/models/assembly.rb @@ -11,6 +11,8 @@ class AssemblyChef < HarpResource end class AssemblyPuppet < HarpResource + property :public_ip_address, String + property :private_ip_address, String end class AssemblySalt < HarpResource diff --git a/lib/harp-runtime/resources/assembly/assembly_puppet.rb b/lib/harp-runtime/resources/assembly/assembly_puppet.rb index ad166e2..a5b5ef5 100644 --- a/lib/harp-runtime/resources/assembly/assembly_puppet.rb +++ b/lib/harp-runtime/resources/assembly/assembly_puppet.rb @@ -27,11 +27,14 @@ class AssemblyPuppet < Assembly attribute :config attribute :packages attribute :server_options + + attribute :private_ip_address, :aliases => 'privateIpAddress' + attribute :public_ip_address, :aliases => 'ipAddress' register_resource :assembly_puppet, RESOURCES_ASSEMBLY # Only keeping a few properties, simplest define keeps. - @keeps = /^id$/ + @keeps = /^id$|^.*_ip_address/ def self.persistent_type() ::AssemblyPuppet @@ -72,21 +75,26 @@ def bootstrap_server server.username = config["ssh"]["user"] @ssh_key = Key.get_by_name(config['ssh']['keys'][0]).temp_file server.private_key_path = @ssh_key.path - begin - bootstrap(server) - rescue - sleep(20) - bootstrap(server) - end + @boot_counter = 0 + bootstrap(server) @ssh_key.unlink end def bootstrap(server) - server.ssh(["sudo apt-get update && apt-get -y upgrade"])[0].stdout - server.ssh(["sudo aptitude -y install puppet"])[0].stdout - server.ssh(["sudo sed -i /etc/default/puppet -e 's/START=no/START=yes/'"])[0].stdout - server.ssh(["sudo sed -i -e '/\[main\]/{:a;n;/^$/!ba;i\pluginsync=true' -e '}' /etc/puppet/puppet.conf"])[0].stdout - server.ssh(["sudo service puppet restart"])[0].stdout + @boot_counter += 1 + begin + puts "waiting 30 seconds for bootstrap..." + sleep(30) + puts server.ssh(["sudo apt-get update && apt-get -y upgrade"])[0].stdout + puts server.ssh(["sudo aptitude -y install puppet"])[0].stdout + puts server.ssh(["sudo sed -i /etc/default/puppet -e 's/START=no/START=yes/'"])[0].stdout + puts server.ssh(["sudo sed -i -e '/\[main\]/{:a;n;/^$/!ba;i\pluginsync=true' -e '}' /etc/puppet/puppet.conf"])[0].stdout + puts server.ssh(["sudo service puppet restart"])[0].stdout + rescue + raise 'Bootstrap timeout error' if @boot_counter > 15 + puts "retrying bootstrap: " + bootstrap(server) + end end def destroy_provisioner(private_dns_name) diff --git a/spec/assembly_cloud_spec.rb b/spec/assembly_cloud_spec.rb index 879d396..9136352 100644 --- a/spec/assembly_cloud_spec.rb +++ b/spec/assembly_cloud_spec.rb @@ -112,6 +112,13 @@ pending "pending due to need of live instance" assembly_puppet verify_created(@new_assembly_puppet, "PuppetAssembly", AssemblyPuppet) + begin + sleep(60) + expect(HTTParty.get("http://#{@new_assembly_puppet.public_ip_address}").code).to eq(200) + rescue + sleep(60) + expect(HTTParty.get("http://#{@new_assembly_puppet.public_ip_address}").code).to eq(200) + end mutator_assembly.destroy("PuppetAssembly", assembly_puppet_resource) end it "creates an assembly_salt" do From cb49228c347c2c9c0a774a668a56cd9a4571b529 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 23 Jan 2014 11:08:11 -0600 Subject: [PATCH 11/14] increased complexity threshold --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index d587ab4..3be5dc8 100755 --- a/Rakefile +++ b/Rakefile @@ -45,7 +45,7 @@ begin require 'flog_cli' desc "Analyze total code complexity with flog" task :total do - threshold = 10 + threshold = 20 flog = FlogCLI.new flog.flog %w(app lib spec) average = flog.average.round(1) From 3b08a732bef967c07c9c624406f57e35d20b7c35 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 23 Jan 2014 18:09:21 -0600 Subject: [PATCH 12/14] implemented Salt Assembly --- .../resources/assembly/assembly_salt.rb | 49 ++++++++++++++++++- .../assembly/salt-bootstrap/salt_bootstrap.sh | 15 ++++++ spec/assembly_cloud_spec.rb | 20 ++++++-- 3 files changed, 79 insertions(+), 5 deletions(-) create mode 100755 lib/harp-runtime/resources/assembly/salt-bootstrap/salt_bootstrap.sh diff --git a/lib/harp-runtime/resources/assembly/assembly_salt.rb b/lib/harp-runtime/resources/assembly/assembly_salt.rb index 878d061..5e72d73 100644 --- a/lib/harp-runtime/resources/assembly/assembly_salt.rb +++ b/lib/harp-runtime/resources/assembly/assembly_salt.rb @@ -36,7 +36,54 @@ def self.persistent_type() ::AssemblySalt end - def provision_server(server_ip) + def init_provisioner + bootstrap_file = File.open(File.expand_path("../salt-bootstrap/salt_bootstrap.sh", __FILE__)).read + user_data = "" + line_num=0 + bootstrap_file.each_line do |line| + if line_num == 0 + user_data << line + line_num += 1 + user_data << 'packages_yaml="' + parse_packages + '"' + line_num += 1 + else + user_data << line + line_num += 1 + end + end + server_options["user_data"] = user_data + end + + def parse_packages + yaml_hash = {} + packages.each do |p| + yaml_hash[p['name']] = {'pkg'=>['installed']} + end + yaml_hash.to_yaml + end + + def provision_server(server_ip,provisioner) + server = @service.servers.get(id) + server.username = config["ssh"]["user"] + @ssh_key = Key.get_by_name(config['ssh']['keys'][0]).temp_file + server.private_key_path = @ssh_key.path + @boot_counter = 0 + bootstrap(server) + @ssh_key.unlink + end + + def bootstrap(server) + @boot_counter += 1 + begin + puts "waiting 30 seconds for bootstrap..." + sleep(30) + puts server.ssh(["wget -O - http://bootstrap.saltstack.org | sudo sh"])[0].stdout + puts server.ssh(["sudo salt-call --local state.highstate -l debug"])[0].stdout + rescue + raise 'Bootstrap timeout error' if @boot_counter > 15 + puts "retrying bootstrap: " + bootstrap(server) + end end def destroy_provisioner(private_dns_name) diff --git a/lib/harp-runtime/resources/assembly/salt-bootstrap/salt_bootstrap.sh b/lib/harp-runtime/resources/assembly/salt-bootstrap/salt_bootstrap.sh new file mode 100755 index 0000000..796c792 --- /dev/null +++ b/lib/harp-runtime/resources/assembly/salt-bootstrap/salt_bootstrap.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +mkdir /srv/salt + +touch /srv/salt/top.sls + +touch /srv/salt/webserver.sls + +cat > /srv/salt/top.sls << EOF +base: + '*': + - webserver +EOF + +echo -e "$packages_yaml" >> /srv/salt/webserver.sls \ No newline at end of file diff --git a/spec/assembly_cloud_spec.rb b/spec/assembly_cloud_spec.rb index 9136352..cc6daae 100644 --- a/spec/assembly_cloud_spec.rb +++ b/spec/assembly_cloud_spec.rb @@ -62,10 +62,14 @@ "name" => "SaltAssembly", "image" => "ami-d0f89fb9", "packages" => [ - {"name" => "activemq","type" => "recipe","version" => "1.0.0"}, - {"name" => "apparmor","type" => "recipe","version" => "0.9.0"}, - {"name" => "apt", "type" => "recipe","version" => "1.1.2"} - ] + {"name" => "apache2"} + ], + "config" => { + "ssh" => { + "user" => "ubuntu", + "keys" => ["dev-client-ec2"] + } + } } shared_context 'when have an assembly' do @@ -125,5 +129,13 @@ pending "pending due to need of live instance" assembly_salt verify_created(@new_assembly_salt, "SaltAssembly", AssemblySalt) + # begin +# sleep(60) +# expect(HTTParty.get("http://#{@new_assembly_salt.public_ip_address}").code).to eq(200) +# rescue +# sleep(60) +# expect(HTTParty.get("http://#{@new_assembly_salt.public_ip_address}").code).to eq(200) +# end +# mutator_assembly.destroy("SaltAssembly", assembly_salt_resource) end end From 8934cabbb1b3cd4b6df668122a40a792e5cb80bf Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Thu, 23 Jan 2014 18:17:38 -0600 Subject: [PATCH 13/14] implemented Salt Assembly integration test --- lib/harp-runtime/models/assembly.rb | 2 ++ .../resources/assembly/assembly_salt.rb | 5 ++++- spec/assembly_cloud_spec.rb | 16 ++++++++-------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/harp-runtime/models/assembly.rb b/lib/harp-runtime/models/assembly.rb index 3ddd17f..1cf75e2 100644 --- a/lib/harp-runtime/models/assembly.rb +++ b/lib/harp-runtime/models/assembly.rb @@ -16,4 +16,6 @@ class AssemblyPuppet < HarpResource end class AssemblySalt < HarpResource + property :public_ip_address, String + property :private_ip_address, String end \ No newline at end of file diff --git a/lib/harp-runtime/resources/assembly/assembly_salt.rb b/lib/harp-runtime/resources/assembly/assembly_salt.rb index 5e72d73..b2d044a 100644 --- a/lib/harp-runtime/resources/assembly/assembly_salt.rb +++ b/lib/harp-runtime/resources/assembly/assembly_salt.rb @@ -26,11 +26,14 @@ class AssemblySalt < Assembly attribute :packages attribute :server_options + + attribute :private_ip_address, :aliases => 'privateIpAddress' + attribute :public_ip_address, :aliases => 'ipAddress' register_resource :assembly_salt, RESOURCES_ASSEMBLY # Only keeping a few properties, simplest define keeps. - @keeps = /^id$/ + @keeps = /^id$|^.*_ip_address/ def self.persistent_type() ::AssemblySalt diff --git a/spec/assembly_cloud_spec.rb b/spec/assembly_cloud_spec.rb index cc6daae..2b32a0f 100644 --- a/spec/assembly_cloud_spec.rb +++ b/spec/assembly_cloud_spec.rb @@ -129,13 +129,13 @@ pending "pending due to need of live instance" assembly_salt verify_created(@new_assembly_salt, "SaltAssembly", AssemblySalt) - # begin -# sleep(60) -# expect(HTTParty.get("http://#{@new_assembly_salt.public_ip_address}").code).to eq(200) -# rescue -# sleep(60) -# expect(HTTParty.get("http://#{@new_assembly_salt.public_ip_address}").code).to eq(200) -# end -# mutator_assembly.destroy("SaltAssembly", assembly_salt_resource) + begin + sleep(60) + expect(HTTParty.get("http://#{@new_assembly_salt.public_ip_address}").code).to eq(200) + rescue + sleep(60) + expect(HTTParty.get("http://#{@new_assembly_salt.public_ip_address}").code).to eq(200) + end + mutator_assembly.destroy("SaltAssembly", assembly_salt_resource) end end From bf59003c5e93f888272e8da17b43865b30ee8264 Mon Sep 17 00:00:00 2001 From: Dev Mohanty Date: Fri, 24 Jan 2014 15:41:43 -0600 Subject: [PATCH 14/14] added assemblies .harp script --- Gemfile.lock | 4 +-- sample/assemblies.harp | 70 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 sample/assemblies.harp diff --git a/Gemfile.lock b/Gemfile.lock index c6560c2..d49bcd8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,7 +131,7 @@ GEM data_objects (= 0.10.13) docile (1.1.2) erubis (2.7.0) - evalhook (0.5.7) + evalhook (0.5.8) partialruby (~> 0.3) sexp_processor (~> 4.0) excon (0.31.0) @@ -191,7 +191,7 @@ GEM multi_json (1.8.4) multi_xml (0.5.5) multipart-post (1.2.0) - net-http-persistent (2.9) + net-http-persistent (2.9.1) net-scp (1.1.2) net-ssh (>= 2.6.5) net-ssh (2.7.0) diff --git a/sample/assemblies.harp b/sample/assemblies.harp new file mode 100644 index 0000000..60de10e --- /dev/null +++ b/sample/assemblies.harp @@ -0,0 +1,70 @@ +# Create some instances on AWS + +template = <