xp5k 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|