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.
Files changed (4) hide show
  1. data/lib/xp5k/version.rb +1 -1
  2. data/lib/xp5k/xp.rb +92 -25
  3. data/xp5k.gemspec +1 -1
  4. metadata +6 -6
data/lib/xp5k/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module XP5K
2
- VERSION='0.0.4'
2
+ VERSION='0.0.5'
3
3
  end
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
- @starttime = Time.now
21
- @logger = options[:logger] || Logger.new(STDOUT)
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
- deployment = @connection.root.sites[x[:site].to_sym].deployments.submit(x)
56
- self.deployments << { :uid => deployment["uid"], :site => deployment["site_uid"] }
57
- #update_cache
58
- puts "Waiting for the deployment ##{deployment['uid']} to be terminated..."
59
- while deployment.reload['status'] == 'processing'
60
- print(".")
61
- sleep 10
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
- print(" [#{green("OK")}]\n")
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 status
131
- # self.jobs2submit.each do |job2submit|
132
- # job = self.job_with_name(job2submit[:name])
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
- # end
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 = { :jobs => self.jobs.map { |x| { :uid => x[:uid], :name => x[:name] } } }
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
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
 
16
16
  s.required_rubygems_version = '>= 1.3.6'
17
17
 
18
- s.add_dependency 'restfully', '~>0.6'
18
+ s.add_dependency 'restfully', '>1.0.0'
19
19
  s.add_dependency 'term-ansicolor', '>= 1.0.7'
20
20
  s.add_dependency 'json', '>= 1.5.1'
21
21
 
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
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-08-29 00:00:00.000000000 Z
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: '0.6'
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: '0.6'
29
+ version: 1.0.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: term-ansicolor
32
32
  requirement: !ruby/object:Gem::Requirement