xp5k 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 66269fa663c38a7f293bcea2205b809e677c1332
4
- data.tar.gz: 80597c35a94b407e3a9944e3935c46931629e9c9
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjgzNjJkOTZkZDk5YzVkZGZkYjM2OTE3ZTU5ZjFkMzlmNjMxMDY5Yw==
5
+ data.tar.gz: !binary |-
6
+ MmE0NThhMjQ1MzhiOGEwYjQzYTc1Njg1MGRiNjgzYWRhY2Y4MGU2ZA==
5
7
  SHA512:
6
- metadata.gz: e28427dd47bdbdd3020dcd2718926ef42fc6ef02314b6123dfd7bf0f97cb2fc7f688c878e39d25fc68f6e6d3e3200aeab9013d1c3d3c0fb2419c1470fafefba3
7
- data.tar.gz: 91024c08522a417cc600ae5aab4d00873bedf50162b18dcdb298814fb512485dc946314cff799f0a2e1ce25c898cd77a467bcdeef10cfebdd5627d8e2bcf15b1
8
+ metadata.gz: !binary |-
9
+ ZDNkN2RiOTczNDI1NjA2NDQ0NGY2Y2E2ZmEyYWNkM2U5MWUyYjI5YWZlOTlm
10
+ Y2M4NzUzNTJlNmU3OWY5MmQyZGIwZThiZDUzMjY5NmE4ZTU5NmM2NzYzNzU0
11
+ MzIwYWVjNTIyYzNjYTI3Y2FmMDBmYWNiYzA5ZTcwYTA1ZDIyNWU=
12
+ data.tar.gz: !binary |-
13
+ ZDAzOGY0NTliZDY0NzNlZDJiYTM4NjhhYTk2ZTllNGI2ZGU3YzJjYjc1Zjkx
14
+ YTliY2M5YjkzMmNlZTJjNDVmMTFjMDg3ZThlNWRkMmM4ODc1ZGRjMzkwNDFh
15
+ YWU0NDEyMWExYWM3MmVlNGNiNDk2ZDc2MjhhZWNmMDAwMmNmOGQ=
data/README.md CHANGED
@@ -30,6 +30,7 @@ https://github.com/capistrano/capistrano/wiki
30
30
  ## Sample
31
31
 
32
32
  Here is an example of a ```Capfile``` :
33
+
33
34
  ```ruby
34
35
  require 'xp5k'
35
36
  require 'capistrano'
@@ -114,7 +115,6 @@ For instance you can launch : ```cap submit deploy date```
114
115
  ### Xp5k Roles
115
116
 
116
117
  You can define specific roles in you job submission.
117
- This all
118
118
 
119
119
  ```ruby
120
120
  @myxp.define_job({
@@ -157,6 +157,46 @@ role :server do
157
157
  @myxp.role_with_name('clients').servers
158
158
  end
159
159
  ```
160
+
161
+ #### Nested roles
162
+
163
+ You can also define nested roles (only 1 level) :
164
+
165
+ ```ruby
166
+ @myxp.define_job({
167
+ :resources => "nodes=4,walltime=1",
168
+ :site => XP5K::Config[:site] || 'rennes',
169
+ :types => ["deploy"],
170
+ :name => "ceph_cluster",
171
+ :roles => [
172
+ XP5K::Role.new({ :name => 'ceph_nodes', :size => 4 }),
173
+ XP5K::Role.new({ :name => 'ceph_monitor', :size => 1, :inner => 'ceph_nodes' }),
174
+ ],
175
+ :command => "sleep 86400"
176
+ })
177
+
178
+ ```
179
+
180
+ #### Pattern
181
+
182
+ You can select nodes matching a pattern (`String` or `Regexp`) :
183
+
184
+ ```Ruby
185
+ roles = []
186
+ scenario['clusters'].each do |cluster|
187
+ roles << XP5K::Role.new({
188
+ :name => "ceph_nodes_#{cluster['name']}",
189
+ :size => cluster['ceph_nodes_count'],
190
+ :pattern => cluster['name']
191
+ })
192
+ roles << XP5K::Role.new({
193
+ :name => "ceph_monitor_#{cluster['name']}",
194
+ :size => 1,
195
+ :inner => "ceph_nodes_#{cluster['name']}"
196
+ })
197
+ end
198
+ ```
199
+
160
200
  ### Get the deployed nodes
161
201
 
162
202
  Some time nodes fail to be deployed. You can get the exact set
data/lib/xp5k/role.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  class XP5K::Role
2
2
 
3
- attr_accessor :name, :size, :desc, :servers, :jobid, :inner
3
+ attr_accessor :name, :size, :desc, :servers, :jobid, :inner, :pattern
4
4
 
5
5
  @@roles = []
6
6
 
@@ -20,7 +20,7 @@ class XP5K::Role
20
20
  end
21
21
 
22
22
  # Optional parameters
23
- %w{ desc servers inner }.each do |param|
23
+ %w{ desc servers inner pattern }.each do |param|
24
24
  instance_variable_set("@#{param}", options[param.to_sym]) if options[param.to_sym]
25
25
  end
26
26
  end
@@ -47,6 +47,13 @@ class XP5K::Role
47
47
  a <=> b
48
48
  end
49
49
 
50
+ # Sort roles to manage roles with pattern first
51
+ defined_roles = defined_roles.sort do |x,y|
52
+ a = x.pattern ? 0 : 1
53
+ b = y.pattern ? 0 : 1
54
+ a <=> b
55
+ end
56
+
50
57
  # Attributes nodes to roles
51
58
  defined_roles.each do |role|
52
59
  next if self.exists?(role.name)
@@ -55,7 +62,12 @@ class XP5K::Role
55
62
  role.servers = available_nodes[role.inner][0..(role.size - 1)]
56
63
  available_nodes[role.inner] -= role.servers
57
64
  else
58
- role.servers = available_nodes['job'][0..(role.size - 1)]
65
+ if not role.pattern
66
+ role.servers = available_nodes['job'][0..(role.size - 1)]
67
+ else
68
+ filtered_nodes = available_nodes['job'].select { |x| x.match role.pattern }
69
+ role.servers = filtered_nodes[0..(role.size - 1)]
70
+ end
59
71
  available_nodes['job'] -= role.servers
60
72
  end
61
73
  role.jobid = job['uid']
data/lib/xp5k/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module XP5K
2
- VERSION='0.0.7'
2
+ VERSION='0.0.8'
3
3
  end
data/lib/xp5k/xp.rb CHANGED
@@ -98,10 +98,10 @@ module XP5K
98
98
  if job.nil?
99
99
  job = @connection.root.sites[job2submit[:site].to_sym].jobs.submit(job2submit)
100
100
  update_cache
101
- logger.info "Job \"#{job['name']}\" submitted with id ##{job['uid']} at #{job2submit[:site]}"
101
+ logger.info "Job \"#{job['name']}\" submitted with id #{job['uid']}@#{job2submit[:site]}"
102
102
  self.jobs << job
103
103
  else
104
- logger.info "Job \"#{job["name"]}\" already submitted ##{job["uid"]}"
104
+ logger.info "Job \"#{job["name"]}\" already submitted #{job["uid"]}@#{job2submit[:site]}"
105
105
  end
106
106
  end
107
107
  update_cache()
@@ -121,11 +121,11 @@ module XP5K
121
121
  case jobs_status[id]
122
122
  when "running"
123
123
  self.roles += Role.create_roles(job, jobs2submit[id]) unless jobs2submit[id][:roles].nil?
124
- logger.info "Job #{job['uid']} is running"
124
+ logger.info "Job #{job['uid']}@#{jobs2submit[id][:site]} is running"
125
125
  when /terminated|error/
126
- logger.info "Job #{job['uid']} is terminated"
126
+ logger.info "Job #{job['uid']}@#{jobs2submit[id][:site]} is terminated"
127
127
  else
128
- logger.info "Job #{job['uid']} will be scheduled at #{Time.at(job['scheduled_at'].to_i).to_datetime}"
128
+ logger.info "Job #{job['uid']}@#{jobs2submit[id][:site]} will be scheduled at #{Time.at(job['scheduled_at'].to_i).to_datetime}"
129
129
  end
130
130
  end
131
131
  ready = true if jobs_status.uniq == ["running"]
@@ -157,8 +157,10 @@ module XP5K
157
157
  end
158
158
 
159
159
  def status
160
- self.jobs.each do |job|
161
- logger.info "Job \"#{job["name"]}\" ##{job["uid"]} status : #{job["state"]}"
160
+ self.jobs.each.with_index do |job, id|
161
+ log = "Job \"#{job["name"]}\" #{job["uid"]}@#{jobs2submit[id][:site]} status : #{job["state"]}"
162
+ log += " (#{Time.at(job['scheduled_at'].to_i).to_datetime})" if job['state'] == 'waiting'
163
+ logger.info log
162
164
  end
163
165
  end
164
166
 
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xp5k
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pascal Morillon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-30 00:00:00.000000000 Z
11
+ date: 2014-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: restfully
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>'
17
+ - - ! '>'
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>'
24
+ - - ! '>'
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: term-ansicolor
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.0.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.0.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: json
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.5.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.5.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.0.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ! '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.0.0
69
69
  description: A small Grid'5000 helper to submit jobs and deploy environments via REST
@@ -96,17 +96,17 @@ require_paths:
96
96
  - lib
97
97
  required_ruby_version: !ruby/object:Gem::Requirement
98
98
  requirements:
99
- - - '>='
99
+ - - ! '>='
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
102
  required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - '>='
104
+ - - ! '>='
105
105
  - !ruby/object:Gem::Version
106
106
  version: 1.3.6
107
107
  requirements: []
108
108
  rubyforge_project:
109
- rubygems_version: 2.1.10
109
+ rubygems_version: 2.2.2
110
110
  signing_key:
111
111
  specification_version: 4
112
112
  summary: A small Grid'5000 helper to submit jobs and deploy environments via REST