xp5k 0.0.7 → 0.0.8

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.
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