xp5k 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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