Skip to content
Merged
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
44 changes: 25 additions & 19 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ PATH
dm-mysql-adapter
dm-sqlite-adapter
extlib
faraday (= 0.8.9)
fog
httparty
json
logging
net-ssh
Expand All @@ -31,7 +33,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)
Expand Down Expand Up @@ -69,12 +71,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
Expand Down Expand Up @@ -127,16 +129,16 @@ 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)
evalhook (0.5.8)
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)
faraday (0.8.9)
multipart-post (~> 1.2.0)
fastercsv (1.5.5)
ffi (1.9.3)
Expand All @@ -146,9 +148,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)
Expand All @@ -160,9 +162,12 @@ 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)
httparty (0.12.0)
json (~> 1.8)
multi_xml (>= 0.5.2)
httpclient (2.3.4.1)
httpi (0.9.7)
rack
Expand All @@ -183,13 +188,14 @@ GEM
mixlib-authentication (1.3.0)
mixlib-log
mixlib-log (1.6.0)
multi_json (1.8.2)
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)
nio4r (0.5.0)
nio4r (1.0.0)
nokogiri (1.6.1)
mini_portile (~> 0.5.0)
nori (1.1.5)
Expand All @@ -206,17 +212,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)
Expand Down Expand Up @@ -255,7 +261,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)
Expand Down Expand Up @@ -306,7 +312,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)
Expand Down
2 changes: 1 addition & 1 deletion Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions app/harp_user_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions harp-runtime.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
6 changes: 6 additions & 0 deletions lib/harp-runtime/models/assembly.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ class Assembly < HarpResource
end

class AssemblyChef < HarpResource
property :public_ip_address, String
property :private_ip_address, String
end

class AssemblyPuppet < HarpResource
property :public_ip_address, String
property :private_ip_address, String
end

class AssemblySalt < HarpResource
property :public_ip_address, String
property :private_ip_address, String
end
6 changes: 6 additions & 0 deletions lib/harp-runtime/models/user_data.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 3 additions & 2 deletions lib/harp-runtime/resources/assembly/assembly.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,14 @@ 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)
assembly.wait_for { ready? }
self.id = assembly.id
provision_server(assembly.public_ip_address,provisioner)
return self
return assembly
end

def destroy(service)
Expand All @@ -70,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", '')
Expand Down
5 changes: 4 additions & 1 deletion lib/harp-runtime/resources/assembly/assembly_chef.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
86 changes: 81 additions & 5 deletions lib/harp-runtime/resources/assembly/assembly_puppet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,32 +16,108 @@ 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

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
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)
# 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
bootstrap_server
end

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
@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(["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)
end

def parse_packages
classes_list = []
packages.each { |p| classes_list << p['name']}
yaml_hash = {"classes"=>classes_list}
yaml_hash.to_yaml
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
end
end
Loading