panoramix 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/panoramix/aws.rb +13 -0
- data/lib/panoramix/connections/base_connection.rb +49 -0
- data/lib/panoramix/connections/docker_connection.rb +85 -0
- data/lib/panoramix/connections/local_connection.rb +15 -0
- data/lib/panoramix/connections.rb +28 -0
- data/lib/panoramix/dsl.rb +11 -0
- data/lib/panoramix/external.rb +39 -0
- data/lib/panoramix/hosts.rb +58 -0
- data/lib/panoramix/instances/aws.rb +74 -0
- data/lib/panoramix/instances/base.rb +13 -0
- data/lib/panoramix/instances/local.rb +24 -0
- data/lib/panoramix/instances/metal.rb +26 -0
- data/lib/panoramix/locale.rb +4 -0
- data/lib/panoramix/metal.rb +13 -0
- data/lib/panoramix/mpi.rb +97 -0
- data/lib/panoramix/panoramix_core.rb +109 -0
- data/lib/panoramix/plugin/base.rb +47 -0
- data/lib/panoramix/plugin/docker_build.rb +83 -0
- data/lib/panoramix/plugin/docker_image.rb +67 -0
- data/lib/panoramix/plugin/docker_image_base.rb +61 -0
- data/lib/panoramix/plugin/docker_up.rb +178 -0
- data/lib/panoramix/plugin/git.rb +109 -0
- data/lib/panoramix/plugin/provision.rb +95 -0
- data/lib/panoramix/plugin/s3.rb +81 -0
- data/lib/panoramix/plugin/wget.rb +78 -0
- data/lib/panoramix/tasks/actions.rb +26 -0
- data/lib/panoramix/tasks/common_host_tasks.rb +44 -0
- data/lib/panoramix/tasks/task_mpi.rb +56 -0
- data/lib/panoramix.rb +49 -0
- data/locales/en.yml +55 -0
- metadata +139 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module Panoramix
|
4
|
+
class BaseConnection
|
5
|
+
|
6
|
+
def shell(cmd, silent, env)
|
7
|
+
|
8
|
+
env.select{|k,v| v.nil?}.each{ |k, v| env[k]=Panoramix.ip_host(Panoramix::Link[k]) }
|
9
|
+
puts "Running #{cmd}".magenta if ENV["VERBOSE"]
|
10
|
+
|
11
|
+
@err = ""
|
12
|
+
@out = ""
|
13
|
+
Open3.popen3(env, cmd) do |stdin, stdout, stderr, wait_thr|
|
14
|
+
stdin.close
|
15
|
+
stdout.each_line do |line|
|
16
|
+
puts line unless silent
|
17
|
+
@out << "#{line}"
|
18
|
+
end
|
19
|
+
stderr.each_line do |line|
|
20
|
+
puts line.red unless silent
|
21
|
+
@err << "#{line}"
|
22
|
+
end
|
23
|
+
@exit_status = wait_thr.value
|
24
|
+
end
|
25
|
+
|
26
|
+
if ENV["VERBOSE"] && !@out.empty?
|
27
|
+
puts "\tout => \n\t\t#{@out.gsub("\n","\n\t\t")}".green
|
28
|
+
end
|
29
|
+
if ENV["VERBOSE"] && !@err.empty?
|
30
|
+
if @exit_status.success?
|
31
|
+
puts "\terr => \n\t\t#{@err.gsub("\n","\n\t\t")}".brown
|
32
|
+
else
|
33
|
+
puts "\terr => \n\t\t#{@err.gsub("\n","\n\t\t")}".red
|
34
|
+
end
|
35
|
+
end
|
36
|
+
puts "\texit_status => #{@exit_status}\n".blue if ENV["VERBOSE"]
|
37
|
+
|
38
|
+
return {
|
39
|
+
:out => @out,
|
40
|
+
:err => @err,
|
41
|
+
:exit_status => @exit_status
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def close_connection
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'net/ssh/gateway'
|
3
|
+
require 'panoramix/connections/base_connection'
|
4
|
+
|
5
|
+
|
6
|
+
module Panoramix
|
7
|
+
class DockerConnection < BaseConnection
|
8
|
+
|
9
|
+
def initialize(host, user)
|
10
|
+
@host = host
|
11
|
+
@user = user
|
12
|
+
@connected = false
|
13
|
+
end
|
14
|
+
|
15
|
+
def connected?
|
16
|
+
@connected
|
17
|
+
end
|
18
|
+
|
19
|
+
def connect
|
20
|
+
return if @connected
|
21
|
+
return unless @host && @user
|
22
|
+
ready?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns true if connection is enabled
|
26
|
+
def ready?
|
27
|
+
return false unless @host && @user
|
28
|
+
! open_tunnel.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
def shell(cmd, silent=false, env=Hash.new)
|
32
|
+
raise "No host unless" unless @host && @user
|
33
|
+
#open_tunnel unless @gateway
|
34
|
+
# Run passing tunneled port
|
35
|
+
env['DOCKER_HOST'] = "tcp://127.0.0.1:#{@port}"
|
36
|
+
super(cmd, silent, env)
|
37
|
+
end
|
38
|
+
|
39
|
+
def close_connection
|
40
|
+
if @connected
|
41
|
+
@gateway.close(@port)
|
42
|
+
@connected = false
|
43
|
+
@gateway = nil
|
44
|
+
@port = nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def open_tunnel
|
51
|
+
unless @gateway
|
52
|
+
# Open a new ssh tunnel
|
53
|
+
print "Connecting remote host..."
|
54
|
+
# Wait until docker starts
|
55
|
+
Timeout::timeout(600) do
|
56
|
+
begin
|
57
|
+
@gateway = Net::SSH::Gateway.new(@host, @user)
|
58
|
+
3.times do
|
59
|
+
begin
|
60
|
+
@port = @gateway.open('127.0.0.1', 666, rand(63000)+2000)
|
61
|
+
break
|
62
|
+
rescue
|
63
|
+
puts "Port already in use"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
#Check this connection
|
67
|
+
Timeout::timeout(10) do
|
68
|
+
res = shell("docker ps", true)
|
69
|
+
raise "Servide docker not available" unless res[:exit_status].success?
|
70
|
+
end
|
71
|
+
rescue Exception => err
|
72
|
+
sleep(10)
|
73
|
+
print "."
|
74
|
+
@gateway.close(@port) if @gateway
|
75
|
+
retry
|
76
|
+
end
|
77
|
+
end
|
78
|
+
@connected = true
|
79
|
+
puts " done."
|
80
|
+
end
|
81
|
+
@gateway
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'panoramix/connections/local_connection'
|
2
|
+
require 'panoramix/connections/docker_connection'
|
3
|
+
|
4
|
+
module Panoramix
|
5
|
+
|
6
|
+
class Connections
|
7
|
+
class << self
|
8
|
+
attr_reader :connections
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@connections=Hash.new
|
12
|
+
@connections["local"] = LocalConnection.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def register(host, config)
|
16
|
+
@connections[host] = DockerConnection.new(config[:host], config[:user])
|
17
|
+
end
|
18
|
+
|
19
|
+
def connect key
|
20
|
+
@connections[key].connect unless @connections[key].connected?
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](key)
|
24
|
+
@connections[key]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "panoramix/plugin/wget"
|
2
|
+
require "panoramix/plugin/s3"
|
3
|
+
require "panoramix/plugin/git"
|
4
|
+
require "panoramix/plugin/docker_image"
|
5
|
+
require "panoramix/mpi"
|
6
|
+
|
7
|
+
def external(dep, &block)
|
8
|
+
# Provided value can be either array or hash, so we need to make sure the final value is an array
|
9
|
+
value = [dep.values[0]].flatten
|
10
|
+
|
11
|
+
# Select the hash with params
|
12
|
+
params = value.select { |d| d.is_a? Hash }.first
|
13
|
+
|
14
|
+
# Handle with MPI
|
15
|
+
handled_dep = Panoramix::MPI.handle_external(dep.keys[0], params)
|
16
|
+
|
17
|
+
raise "Only a single external depdency supported (received: #{dep.keys})" if handled_dep.length != 1
|
18
|
+
|
19
|
+
# Select provided dependencies
|
20
|
+
prerequisites = value.select { |d| ! d.is_a? Hash }
|
21
|
+
|
22
|
+
case handled_dep.values[0].keys[0]
|
23
|
+
when :s3
|
24
|
+
s3(handled_dep, prerequisites, block)
|
25
|
+
when :wget
|
26
|
+
wget(handled_dep, prerequisites, block)
|
27
|
+
when :git
|
28
|
+
git(handled_dep, prerequisites, block)
|
29
|
+
when :dockerimage
|
30
|
+
external_docker_image(handled_dep, block)
|
31
|
+
when :docker
|
32
|
+
puts "Warning using obsolete external dependency key
|
33
|
+
\t => external <image_name> {#{"docker".bold}: <docker_image_name> }.\n\tchange to:
|
34
|
+
\t => external <image_name> {#{"dockerimage".bold}: <docker_image_name> }.".red
|
35
|
+
external_docker_image(handled_dep, block)
|
36
|
+
else
|
37
|
+
raise "Unknown external protocol '#{dep.values[0].keys[0]}'"
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "panoramix/instances/local"
|
2
|
+
|
3
|
+
module Panoramix
|
4
|
+
class Hosts
|
5
|
+
class << self
|
6
|
+
|
7
|
+
attr_reader :hosts
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@hosts=Hash.new
|
11
|
+
register("local", LocalInstance.new)
|
12
|
+
end
|
13
|
+
|
14
|
+
def register(name, instance)
|
15
|
+
if instance.class.ancestors.include? BaseInstance
|
16
|
+
instance.host(name)
|
17
|
+
@hosts[name] = {instance: instance, tasks: {}}
|
18
|
+
define_tasks(name)
|
19
|
+
else
|
20
|
+
puts "Warning using obsolete instance on host key
|
21
|
+
\t => host <host_name>, #{"<environment_class>".bold} \n\tchange to:
|
22
|
+
\t => host <host_name>, #{"Panoramix::<Cloud>.config(<environment_class>)".bold}
|
23
|
+
\t where Cloud must be AWS or Metal".red
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def define_tasks(name)
|
29
|
+
Panoramix::Tasks::Actions.each do |act|
|
30
|
+
block_act = custom_host_action(act.action_name, act.order_class, name)
|
31
|
+
descriptions =(name != 'local') ? I18n.t('host') : Hash.new
|
32
|
+
Panoramix.define_task("#{name}:#{act.action_name}", [], descriptions[act.action_name.to_sym], block_act)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def custom_host_action(action, class_order, host_name)
|
37
|
+
Proc.new do |t|
|
38
|
+
tasks = Panoramix::Hosts[host_name][:tasks]
|
39
|
+
class_order.each do |p|
|
40
|
+
tasks[p].each do |task_name|
|
41
|
+
host_name2 =(host_name != 'local') ? "#{host_name}:" : ""
|
42
|
+
Rake::Task["#{host_name2}#{task_name}:#{action}"].invoke
|
43
|
+
end if tasks[p]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def [](key)
|
49
|
+
@hosts[key]
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
@hosts.pretty_inspect
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "raws"
|
2
|
+
require "panoramix/instances/base"
|
3
|
+
|
4
|
+
module Panoramix
|
5
|
+
|
6
|
+
class AwsInstance < BaseInstance
|
7
|
+
|
8
|
+
attr_reader :machine
|
9
|
+
|
10
|
+
def initialize(config)
|
11
|
+
@tunnel=nil
|
12
|
+
@machine = Raws::EC2::Machine.new(config[:name], config[:region])
|
13
|
+
@machine.config = config
|
14
|
+
@record = Raws::Route53::Record.new(config[:subdomain_id], config[:region])
|
15
|
+
end
|
16
|
+
|
17
|
+
def host(host)
|
18
|
+
@id=host
|
19
|
+
@machine.config[:name] = host
|
20
|
+
@record.name = host
|
21
|
+
end
|
22
|
+
|
23
|
+
def status
|
24
|
+
puts @machine.status
|
25
|
+
end
|
26
|
+
|
27
|
+
def deployed?
|
28
|
+
@machine.deployed?
|
29
|
+
end
|
30
|
+
|
31
|
+
def timestamp
|
32
|
+
@machine.timestamp
|
33
|
+
end
|
34
|
+
|
35
|
+
def run_instance args = {}
|
36
|
+
@machine.config.merge!(args)
|
37
|
+
if (@machine.config[:create_dns_record])
|
38
|
+
@record.ips.push(@machine.public_ip) #TODO: Wrong if private dns in aws => change for ip
|
39
|
+
@record.save
|
40
|
+
end
|
41
|
+
@machine.save
|
42
|
+
clear_known_hosts_by_hostid
|
43
|
+
end
|
44
|
+
|
45
|
+
def terminate_instance args=nil
|
46
|
+
@machine.terminate_instance
|
47
|
+
@record.delete if (@machine.config[:create_dns_record])
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.deployable?
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
54
|
+
def connection_params
|
55
|
+
{:user => "ubuntu", :host => ip}
|
56
|
+
end
|
57
|
+
|
58
|
+
def ip
|
59
|
+
if @machine.config[:use_public_ip]
|
60
|
+
@ip = @machine.public_ip unless @ip
|
61
|
+
else
|
62
|
+
@ip = @machine.private_ip unless @ip
|
63
|
+
end
|
64
|
+
@ip
|
65
|
+
end
|
66
|
+
private
|
67
|
+
|
68
|
+
def clear_known_hosts_by_hostid
|
69
|
+
result = `ssh-keygen -R #{ip} 2>&1`
|
70
|
+
raie ("Failed to update known_host file. \n#{result}") if !result.include? "updated"
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "panoramix/instances/base"
|
2
|
+
|
3
|
+
module Panoramix
|
4
|
+
|
5
|
+
class LocalInstance < BaseInstance
|
6
|
+
def deployed?
|
7
|
+
true
|
8
|
+
end
|
9
|
+
|
10
|
+
def status
|
11
|
+
""
|
12
|
+
end
|
13
|
+
|
14
|
+
def ip
|
15
|
+
"127.0.0.1"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.deployable?
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "panoramix/instances/base"
|
2
|
+
|
3
|
+
module Panoramix
|
4
|
+
|
5
|
+
class MetalInstance < BaseInstance
|
6
|
+
def initialize(user)
|
7
|
+
@tunnel = nil
|
8
|
+
@user = user
|
9
|
+
end
|
10
|
+
|
11
|
+
def connection_params
|
12
|
+
{:user => @user, :host => @host}
|
13
|
+
end
|
14
|
+
|
15
|
+
def deployed?
|
16
|
+
`ping -c 1 #{@host}`
|
17
|
+
$?.exitstatus == 0
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.deployable?
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require "json"
|
2
|
+
require 'pry'
|
3
|
+
|
4
|
+
module Panoramix
|
5
|
+
|
6
|
+
class MPI
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@mpi_path = "MPI.rb"
|
12
|
+
@mpi_file = {}
|
13
|
+
@project_mpi = {}
|
14
|
+
@final_mpi = {}
|
15
|
+
|
16
|
+
# Read MPI.rb if exists
|
17
|
+
if File.exists?(@mpi_path)
|
18
|
+
load @mpi_path
|
19
|
+
@mpi_file = Panoramix::MPI::Deps
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def handle_external(key, value)
|
24
|
+
# Get current scope
|
25
|
+
scope = Panoramix::current_host_name
|
26
|
+
|
27
|
+
# Save dependency into @project_mpi
|
28
|
+
@project_mpi[scope] = {} if @project_mpi[scope].nil?
|
29
|
+
@project_mpi[scope].merge!({key => value})
|
30
|
+
|
31
|
+
@final_mpi[scope] = {} if @final_mpi[scope].nil?
|
32
|
+
@final_mpi[scope].merge!({key => value})
|
33
|
+
|
34
|
+
# Check whether dependencies can be overriden by an MPI file
|
35
|
+
if (@mpi_file && @mpi_file[scope] && @mpi_file[scope][key])
|
36
|
+
|
37
|
+
# Generate the new value from MPI
|
38
|
+
mpi_value = @mpi_file[scope][key]
|
39
|
+
|
40
|
+
# Save overriden value to @final_mpi
|
41
|
+
@final_mpi[scope] = {} if @final_mpi[scope].nil?
|
42
|
+
@final_mpi[scope].merge!({key => mpi_value})
|
43
|
+
|
44
|
+
return {key => mpi_value}
|
45
|
+
end
|
46
|
+
|
47
|
+
{key => value}
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_final_mpi
|
51
|
+
puts @final_mpi.pretty_inspect
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_mpi
|
55
|
+
puts @project_mpi.pretty_inspect
|
56
|
+
end
|
57
|
+
|
58
|
+
def diff_sh
|
59
|
+
system("bash -c \"diff <(echo '#{@final_mpi.pretty_inspect}') <(echo '#{@project_mpi.pretty_inspect}')| colordiff\"")
|
60
|
+
end
|
61
|
+
|
62
|
+
def generate
|
63
|
+
# Check whether the file already exists
|
64
|
+
if File.exists? @mpi_path
|
65
|
+
puts "Error: mpi.rb already exists in this project. Please, remove it before in order to create a newest version.".red
|
66
|
+
exit 0
|
67
|
+
end
|
68
|
+
|
69
|
+
# Get directory containing MPI.rb
|
70
|
+
dir = Rake.application.original_dir
|
71
|
+
|
72
|
+
# Replace each key path with the variable current_dir
|
73
|
+
new_file = {}
|
74
|
+
@project_mpi.each do |host ,deps|
|
75
|
+
new_hash = {}
|
76
|
+
deps.each do |k, v|
|
77
|
+
key = k.gsub(dir, '#{current_dir}')
|
78
|
+
new_hash[key] = v
|
79
|
+
end
|
80
|
+
new_file[host] = new_hash
|
81
|
+
end
|
82
|
+
|
83
|
+
header =
|
84
|
+
%¤t_dir = File.expand_path(File.dirname(__FILE__))
|
85
|
+
|
86
|
+
Panoramix::MPI::Deps =&
|
87
|
+
|
88
|
+
File.open(@mpi_path,"w") do |f|
|
89
|
+
f.write(header)
|
90
|
+
f.write(new_file.pretty_inspect.gsub('\#','#'))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "time"
|
2
|
+
|
3
|
+
module Panoramix
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def global_timestamps(prerequisites, scope)
|
7
|
+
timestamps = prerequisites.map do |p|
|
8
|
+
any_task = Rake::Task.tasks.any? { |t| t.name == p }
|
9
|
+
if( any_task && (Rake::Task[p].class == Rake::FileTask))
|
10
|
+
Rake::Task[p].timestamp
|
11
|
+
else
|
12
|
+
Panoramix::TIMESTAMP["#{scope}:#{p}"]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Remove nil values (fe: Directory tasks)
|
17
|
+
timestamps.compact
|
18
|
+
end
|
19
|
+
|
20
|
+
def run_task(task, instance, block=nil)
|
21
|
+
if instance.needed? global_timestamps(task.prerequisites, task.scope.first)
|
22
|
+
begin
|
23
|
+
block.call(instance) if block
|
24
|
+
instance.run_default unless block
|
25
|
+
rescue Panoramix::Plugin::DockerUpExceptionError => e
|
26
|
+
puts "Error: #{e.message}".red
|
27
|
+
puts "Exiting program...".red
|
28
|
+
exit(0)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
puts "task #{task} not needed"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def run_custom_task(instance, name)
|
36
|
+
method = instance.method(name.to_sym)
|
37
|
+
begin
|
38
|
+
method.call
|
39
|
+
rescue Panoramix::Plugin::ValidationError => e
|
40
|
+
puts "Validation error: #{e.message}".red
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def define_action_task(name, desctiption, instance, operation)
|
45
|
+
if instance.respond_to? operation
|
46
|
+
Rake.application.last_description = desctiption
|
47
|
+
Rake::Task.define_task "#{name}:#{operation.to_s}" do |t|
|
48
|
+
run_custom_task(instance, operation)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def define_task(name, prerequisites, description, block=nil)
|
54
|
+
Rake.application.last_description = description
|
55
|
+
Rake::Task.define_task({name => prerequisites}, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def define_tasks(name, descriptions, instance, prerequisites, block=nil)
|
59
|
+
fill_current_host_tasks(name, instance.class)
|
60
|
+
action = Proc.new do |t|
|
61
|
+
run_task(t, instance, block) if block
|
62
|
+
run_task(t, instance) unless block
|
63
|
+
Panoramix::TIMESTAMP["#{t.scope.first}:#{name}"] = instance.timestamp
|
64
|
+
end
|
65
|
+
|
66
|
+
define_task(name, prerequisites, descriptions[:main], action)
|
67
|
+
Panoramix::Tasks::Actions.each do |act|
|
68
|
+
define_action_task(name, descriptions[act.action_name.to_sym], instance, act.action_name)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def resolve_host_dependencies
|
73
|
+
current_host.class.deployable? ? :host : nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def connection host_name
|
77
|
+
unless Panoramix::Connections[host_name]
|
78
|
+
host = Panoramix::Hosts[host_name][:instance]
|
79
|
+
Panoramix::Connections.register(host_name, host.connection_params)
|
80
|
+
Panoramix::Connections.connect host_name
|
81
|
+
end
|
82
|
+
Panoramix::Connections[host_name]
|
83
|
+
end
|
84
|
+
|
85
|
+
def current_host
|
86
|
+
Panoramix::Hosts[current_host_name][:instance]
|
87
|
+
end
|
88
|
+
|
89
|
+
def fill_current_host_tasks(name, type)
|
90
|
+
unless Panoramix::Hosts[current_host_name][:tasks][type]
|
91
|
+
Panoramix::Hosts[current_host_name][:tasks][type] = []
|
92
|
+
end
|
93
|
+
Panoramix::Hosts[current_host_name][:tasks][type].push(name)
|
94
|
+
end
|
95
|
+
|
96
|
+
def current_host_name
|
97
|
+
Rake.application.current_scope.first || "local"
|
98
|
+
end
|
99
|
+
|
100
|
+
def validation_error(instance, error)
|
101
|
+
puts "#{instance.class.name.split("::").last} validation error \n\t#{error.gsub("\n", "\n\t").red}"
|
102
|
+
end
|
103
|
+
|
104
|
+
def ip_host host_name
|
105
|
+
host = Panoramix::Hosts[host_name]
|
106
|
+
return !host.nil? ? host[:instance].ip : nil
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|