xp5k 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/xp5k/version.rb +1 -1
- data/lib/xp5k/xp.rb +92 -25
- data/xp5k.gemspec +1 -1
- metadata +6 -6
data/lib/xp5k/version.rb
CHANGED
data/lib/xp5k/xp.rb
CHANGED
@@ -8,17 +8,20 @@ module XP5K
|
|
8
8
|
|
9
9
|
include Term::ANSIColor
|
10
10
|
|
11
|
-
attr_accessor :jobs, :jobs2submit, :deployments, :todeploy, :connection, :roles
|
12
|
-
attr_reader :starttime
|
11
|
+
attr_accessor :jobs, :jobs2submit, :deployments, :todeploy, :connection, :roles, :deployed_nodes
|
12
|
+
attr_reader :starttime, :links_deployments
|
13
13
|
|
14
14
|
def initialize(options = {})
|
15
|
-
@jobs
|
16
|
-
@jobs2submit
|
17
|
-
@deployments
|
18
|
-
@todeploy
|
19
|
-
@roles
|
20
|
-
@
|
21
|
-
@
|
15
|
+
@jobs = []
|
16
|
+
@jobs2submit = []
|
17
|
+
@deployments = []
|
18
|
+
@todeploy = []
|
19
|
+
@roles = []
|
20
|
+
@links_deployments = {"jobs" => {}, "roles" => {}}
|
21
|
+
@deployed_nodes = {"jobs" => {}, "roles" => {}}
|
22
|
+
@starttime = Time.now
|
23
|
+
@logger = options[:logger] || Logger.new(STDOUT)
|
24
|
+
|
22
25
|
XP5K::Config.load unless XP5K::Config.loaded?
|
23
26
|
|
24
27
|
@connection = Restfully::Session.new(
|
@@ -52,24 +55,34 @@ module XP5K
|
|
52
55
|
x[:roles].each do |rolename|
|
53
56
|
x[:nodes] += role_with_name(rolename).servers
|
54
57
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
site = x[:site]
|
59
|
+
x.delete(:site)
|
60
|
+
x.delete(:roles)
|
61
|
+
x.delete(:jobs)
|
62
|
+
deployment = @connection.root.sites[site.to_sym].deployments.submit(x)
|
63
|
+
self.deployments << deployment
|
64
|
+
# update links_deployments
|
65
|
+
update_links_deployments(deployment["uid"], x)
|
66
|
+
end
|
67
|
+
logger.info "Waiting for all the deployments to be terminated..."
|
68
|
+
finished = self.deployments.reduce(true){ |acc, d| acc && d["status"]!='processing'}
|
69
|
+
while (!finished)
|
70
|
+
sleep 10
|
71
|
+
print "."
|
72
|
+
self.deployments.each do |deployment|
|
73
|
+
deployment.reload
|
62
74
|
end
|
63
|
-
|
64
|
-
#update_cache
|
75
|
+
finished = self.deployments.reduce(true){ |acc, d| acc && d["status"]!='processing'}
|
65
76
|
end
|
77
|
+
update_deployed_nodes()
|
78
|
+
update_cache()
|
79
|
+
print(" [#{green("OK")}]\n")
|
66
80
|
end
|
67
81
|
|
68
82
|
def define_job(job_hash)
|
69
83
|
self.jobs2submit << job_hash
|
70
84
|
|
71
85
|
if File.exists?(".xp_cache")
|
72
|
-
# Reload job
|
73
86
|
datas = JSON.parse(File.read(".xp_cache"))
|
74
87
|
uid = datas["jobs"].select { |x| x["name"] == job_hash[:name] }.first["uid"]
|
75
88
|
unless uid.nil?
|
@@ -80,7 +93,10 @@ module XP5K
|
|
80
93
|
create_roles(j, job_hash) unless job_hash[:roles].nil?
|
81
94
|
end
|
82
95
|
end
|
96
|
+
# reload last deployed nodes
|
97
|
+
self.deployed_nodes = datas["deployed_nodes"]
|
83
98
|
end
|
99
|
+
|
84
100
|
end
|
85
101
|
|
86
102
|
def submit
|
@@ -88,19 +104,21 @@ module XP5K
|
|
88
104
|
job = self.job_with_name(job2submit[:name])
|
89
105
|
if job.nil?
|
90
106
|
job = @connection.root.sites[job2submit[:site].to_sym].jobs.submit(job2submit)
|
91
|
-
self.jobs << { :uid => job.properties['uid'], :name => job.properties['name'] }
|
107
|
+
#self.jobs << { :uid => job.properties['uid'], :name => job.properties['name'] }
|
92
108
|
update_cache
|
93
109
|
logger.info "Waiting for the job #{job["name"]} ##{job['uid']} to be running at #{job2submit[:site]}..."
|
94
110
|
while job.reload["state"] != "running"
|
95
111
|
print(".")
|
96
112
|
sleep 3
|
97
113
|
end
|
114
|
+
self.jobs << job
|
98
115
|
create_roles(job, job2submit) unless job2submit[:roles].nil?
|
99
116
|
print(" [#{green("OK")}]\n")
|
100
117
|
else
|
101
118
|
logger.info "Job #{job["name"]} already submitted ##{job["uid"]}"
|
102
119
|
end
|
103
120
|
end
|
121
|
+
update_cache()
|
104
122
|
end
|
105
123
|
|
106
124
|
def create_roles(job, job_definition)
|
@@ -127,11 +145,16 @@ module XP5K
|
|
127
145
|
self.roles.select { |x| x.name == name}.first
|
128
146
|
end
|
129
147
|
|
130
|
-
def
|
131
|
-
|
132
|
-
|
148
|
+
def get_deployed_nodes(job_or_role_name)
|
149
|
+
if deployed_nodes["jobs"].has_key?(job_or_role_name)
|
150
|
+
deployed_nodes["jobs"][job_or_role_name]
|
151
|
+
end
|
152
|
+
if deployed_nodes["roles"].has_key?(job_or_role_name)
|
153
|
+
deployed_nodes["roles"][job_or_role_name]
|
154
|
+
end
|
155
|
+
end
|
133
156
|
|
134
|
-
|
157
|
+
def status
|
135
158
|
self.jobs.each do |job|
|
136
159
|
logger.info "Job #{job["name"]} ##{job["uid"]} status : #{job["state"]}"
|
137
160
|
end
|
@@ -152,9 +175,53 @@ module XP5K
|
|
152
175
|
def logger
|
153
176
|
@logger
|
154
177
|
end
|
178
|
+
|
179
|
+
def update_links_deployments (duid, todeploy)
|
180
|
+
unless todeploy[:jobs].nil?
|
181
|
+
todeploy[:jobs].each do |job|
|
182
|
+
@links_deployments["jobs"][job] = duid
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
unless todeploy[:roles].nil?
|
187
|
+
todeploy[:roles].each do |role|
|
188
|
+
@links_deployments["roles"][role] = duid
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def update_deployed_nodes
|
194
|
+
self.deployments.each do |deployment|
|
195
|
+
duid = deployment["uid"]
|
196
|
+
self.links_deployments["jobs"].select{|k,v| v == duid }.keys.each do |job_name|
|
197
|
+
job = job_with_name(job_name)
|
198
|
+
deployed_nodes["jobs"][job["name"]] = intersect_nodes_job(job, deployment)
|
199
|
+
end
|
200
|
+
self.links_deployments["roles"].select{|k,v| v == duid }.keys.each do |role_name|
|
201
|
+
role = role_with_name(role_name)
|
202
|
+
deployed_nodes["roles"][role.name] = intersect_nodes_role(role, deployment)
|
203
|
+
end
|
155
204
|
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def intersect_nodes_job (job, deployment)
|
209
|
+
nodes_deployed = deployment["result"].select{ |k,v| v["state"]=='OK'}.keys
|
210
|
+
job["assigned_nodes"] & nodes_deployed
|
211
|
+
end
|
212
|
+
|
213
|
+
def intersect_nodes_role (role, deployment)
|
214
|
+
nodes_deployed = deployment["result"].select{ |k,v| v["state"]=='OK'}.keys
|
215
|
+
role.servers & nodes_deployed
|
216
|
+
end
|
217
|
+
|
156
218
|
def update_cache
|
157
|
-
cache = {
|
219
|
+
cache = {
|
220
|
+
:jobs => self.jobs.collect { |x| x.properties },
|
221
|
+
:roles => self.roles.map{ |x| { :name => x.name, :size => x.size, :servers => x.servers }},
|
222
|
+
:deployed_nodes => self.deployed_nodes,
|
223
|
+
:links_deployments => self.links_deployments
|
224
|
+
}
|
158
225
|
open(".xp_cache", "w") do |f|
|
159
226
|
f.puts cache.to_json
|
160
227
|
end
|
data/xp5k.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xp5k
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: restfully
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>'
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ! '>'
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 1.0.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: term-ansicolor
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|