gadabout 0.5.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a61995683057c5d17cf6fa25c95ae6281c2b5a46
4
+ data.tar.gz: da865c43635aff5d6df83e75f6304650b9f243db
5
+ SHA512:
6
+ metadata.gz: 29edbbc64f9ea3e7e8420bdd111611d668b1f7c2ec99400c10e8e37bb107d56d8f6356389b612d09bacb075dc2f2aed0a98e77347e27f902f734881b76ece535
7
+ data.tar.gz: cace848fa7a00644f4f5e484b5c676ad30b0b32c30d6e3b2a0d59ca7db227b8cc2e8361dc36ccc4121a48666503a1349ef676d87849fb048a6f87770c245b8b9
data/lib/gadabout.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'gadabout/client'
2
+ require 'gadabout/dsl'
@@ -0,0 +1,23 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Artifact < Base
4
+ def initialize
5
+ @getter_source = nil
6
+ @relative_dest = nil
7
+ @getter_options = {}
8
+ end
9
+
10
+ def source(source)
11
+ @getter_source = source
12
+ end
13
+
14
+ def relative_dest(relative_dest)
15
+ @relative_dest = relative_dest
16
+ end
17
+
18
+ def option(key, value)
19
+ @getter_options[key] = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Base
4
+ def initialize
5
+ end
6
+
7
+ def to_h
8
+ map = {}
9
+
10
+ self.instance_variables.each do |var|
11
+ val = instance_variable_get(var)
12
+
13
+ next if val.nil?
14
+ if val.instance_of? Array
15
+ next if val.empty?
16
+ end
17
+
18
+ unless [String, Fixnum, Hash, Array, TrueClass, FalseClass].include? val.class
19
+ val = val.to_h
20
+ else
21
+ # Check within Arrays and Hashes for other incomprehensibles
22
+ if val.instance_of? Array
23
+ val.map! do |i|
24
+ unless [String, Fixnum, Hash, Array, TrueClass, FalseClass].include? i.class
25
+ i.to_h
26
+ else
27
+ i
28
+ end
29
+ end
30
+ elsif val.instance_of? Hash
31
+ val.each_pair do |k,v|
32
+ unless [String, Fixnum, Hash, Array, TrueClass, FalseClass].include? v.class
33
+ val[k] = v.to_h
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ # Convert keys from ruby instance_var to Hashicorp JSON-syntax key
40
+ hashivar = var[1..-1].to_s.split('_').map{ |w| w.capitalize }.join('')
41
+ map[hashivar] = val
42
+ end
43
+
44
+ return map
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,23 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Constraint < Base
4
+ def initialize
5
+ @l_target = nil
6
+ @r_target = nil
7
+ @operator = nil
8
+ end
9
+
10
+ def l_target(l_target)
11
+ @l_target = l_target
12
+ end
13
+
14
+ def r_target(r_target)
15
+ @r_target = r_target
16
+ end
17
+
18
+ def operator(operator)
19
+ @operator = operator
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,79 @@
1
+ require 'json'
2
+
3
+ module Gadabout
4
+ module DSL
5
+ class Job < Base
6
+ def initialize(&block)
7
+ @name = nil
8
+ @task_groups = []
9
+ @constraints = []
10
+ @all_at_once = false
11
+ @meta = {}
12
+ @periodic = nil
13
+ @priority = 50
14
+ @region = "global"
15
+ @type = "service"
16
+ @update = nil
17
+ @datacenters = []
18
+
19
+ instance_eval &block if block_given?
20
+
21
+ spec = { Job: self.to_h }
22
+
23
+ puts JSON.pretty_generate(spec)
24
+ end
25
+
26
+ def task_group(&block)
27
+ tg = TaskGroup.new
28
+
29
+ tg.instance_eval &block
30
+
31
+ @task_groups << tg
32
+ end
33
+
34
+ def constraint(&block)
35
+ c = Constraint.new
36
+
37
+ c.instance_eval &block
38
+
39
+ @constraints << c
40
+ end
41
+
42
+ def periodic
43
+ p = Periodic.new
44
+
45
+ p.instance_eval &block
46
+
47
+ @periodic = p
48
+ end
49
+
50
+ def meta(key, value)
51
+ @meta[key] = value
52
+ end
53
+
54
+ def name(name)
55
+ @name = name
56
+ end
57
+
58
+ def region(region)
59
+ @region = region
60
+ end
61
+
62
+ def type(type)
63
+ @type = type
64
+ end
65
+
66
+ def priority(priority)
67
+ @priority = priority
68
+ end
69
+
70
+ def all_at_once(all_at_once)
71
+ @all_at_once = all_at_once
72
+ end
73
+
74
+ def datacenters(*datacenters)
75
+ @datacenters = datacenters
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,18 @@
1
+ module Gadabout
2
+ module DSL
3
+ class LogConfig < Base
4
+ def initialize
5
+ @max_files = nil
6
+ @max_file_size_m_b = nil
7
+ end
8
+
9
+ def max_files(max_files)
10
+ @max_files = max_files
11
+ end
12
+
13
+ def max_file_size(max_file_size)
14
+ @max_file_size_m_b = max_file_size
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Network < Base
4
+ def initialize
5
+ @reserved_ports = []
6
+ @dynamic_ports = []
7
+ @m_bits = nil
8
+ end
9
+
10
+ def reserved_port(label, port)
11
+ @reserved_ports << {label: label, value: port}
12
+ end
13
+
14
+ def dynamic_port(label)
15
+ @dynamic_ports << {label: label}
16
+ end
17
+
18
+ def mbits(m_bits)
19
+ @m_bits = m_bits
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Periodic < Base
4
+ def initialize
5
+ @enabled = nil
6
+ @spec = nil
7
+ @spec_type = nil
8
+ @prohibit_overlap = nil
9
+ end
10
+
11
+ def enabled(enabled)
12
+ @enabled = enabled
13
+ end
14
+
15
+ def prohibit_overlap(prohibit_overlap)
16
+ @prohibit_overlap = prohibit_overlap
17
+ end
18
+
19
+ def spec_type(spec_type)
20
+ @spec_type = spec_type
21
+ end
22
+
23
+ def spec(spec)
24
+ @spec = spec
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,37 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Resources < Base
4
+ def initialize
5
+ @cpu = nil
6
+ @disk_m_b = nil
7
+ @iops = nil
8
+ @memory_m_b = nil
9
+ @networks = []
10
+ end
11
+
12
+ def network(&block)
13
+ n = Network.new
14
+
15
+ n.instance_eval &block
16
+
17
+ @networks << n
18
+ end
19
+
20
+ def cpu(cpu)
21
+ @cpu = cpu
22
+ end
23
+
24
+ def memory(memory)
25
+ @memory_m_b = memory
26
+ end
27
+
28
+ def iops(iops)
29
+ @iops = iops
30
+ end
31
+
32
+ def disk(disk)
33
+ @disk_m_b = disk
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ module Gadabout
2
+ module DSL
3
+ class RestartPolicy < Base
4
+ def initialize
5
+ @attempts = nil
6
+ @interval = nil
7
+ @delay = nil
8
+ @mode = nil
9
+ end
10
+
11
+ def attempts(attempts)
12
+ @attempts = attempts
13
+ end
14
+
15
+ def interval(interval)
16
+ @interval = interval
17
+ end
18
+
19
+ def delay(delay)
20
+ @delay = delay
21
+ end
22
+
23
+ def mode(mode)
24
+ @mode = mode
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,83 @@
1
+ module Gadabout
2
+ module DSL
3
+ class Task < Base
4
+ def initialize
5
+ @artifacts = []
6
+ @config = {}
7
+ @name = nil
8
+ @constraints = []
9
+ @driver = nil
10
+ @env = {}
11
+ @meta = {}
12
+ @resources = nil
13
+ @kill_timeout = nil
14
+ @log_config = nil
15
+ @user = nil
16
+ end
17
+
18
+ def constraint(&block)
19
+ c = Constraint.new
20
+
21
+ c.instance_eval &block
22
+
23
+ @constraints << c
24
+ end
25
+
26
+ def artifact(&block)
27
+ a = Artifact.new
28
+
29
+ a.instance_eval &block
30
+
31
+ @artifacts << a
32
+ end
33
+
34
+ def log_config(&block)
35
+ lc = LogConfig.new
36
+
37
+ lc.instance_eval &block
38
+
39
+ @log_config = lc
40
+ end
41
+
42
+ def resources(&block)
43
+ r = Resources.new
44
+
45
+ r.instance_eval &block
46
+
47
+ @resources = r
48
+ end
49
+
50
+ def meta(key, value)
51
+ @meta[key] = value
52
+ end
53
+
54
+ def env(key, value)
55
+ @env[key] = value
56
+ end
57
+
58
+ def name(name)
59
+ @name = name
60
+ end
61
+
62
+ def config(key, value)
63
+ @config[key] = value
64
+ end
65
+
66
+ def name(name)
67
+ @name = name
68
+ end
69
+
70
+ def user(user)
71
+ @user = user
72
+ end
73
+
74
+ def driver(driver)
75
+ @driver = driver
76
+ end
77
+
78
+ def kill_timeout(kill_timeout)
79
+ @kill_timeout = kill_timeout
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,50 @@
1
+ module Gadabout
2
+ module DSL
3
+ class TaskGroup < Base
4
+ def initialize
5
+ @constraints = []
6
+ @count = 0
7
+ @meta = {}
8
+ @name = nil
9
+ @restart_policy = nil
10
+ @tasks = []
11
+ end
12
+
13
+ def task(&block)
14
+ t = Task.new
15
+
16
+ t.instance_eval &block
17
+
18
+ @tasks << t
19
+ end
20
+
21
+ def constraint(&block)
22
+ c = Constraint.new
23
+
24
+ c.instance_eval &block
25
+
26
+ @constraints << c
27
+ end
28
+
29
+ def restart_policy(&block)
30
+ rp = RestartPolicy.new
31
+
32
+ rp.instance_eval &block
33
+
34
+ @restart_policy = rp
35
+ end
36
+
37
+ def meta(key, value)
38
+ @meta[key] = value
39
+ end
40
+
41
+ def name(name)
42
+ @name = name
43
+ end
44
+
45
+ def count(count)
46
+ @count = count
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,222 @@
1
+ require 'uri'
2
+ require 'rest-client'
3
+ require 'json'
4
+
5
+ module Gadabout
6
+
7
+ API_VERSION = "/v1"
8
+
9
+ class Client
10
+
11
+ def initialize(host="localhost", port=4646)
12
+ @rest = RestClient::Resource.new(URI::HTTP.build({:host => host, :port => port, :path => API_VERSION}))
13
+ end
14
+
15
+ #GET /v1/jobs
16
+ def jobs(opts={})
17
+ valid_opts?(opts,["prefix"])
18
+ path = "/jobs"
19
+ return get(path, opts)
20
+ end
21
+
22
+ #GET /v1/job
23
+ def job(id)
24
+ path = File.join("/job", id)
25
+ return get(path)
26
+ end
27
+
28
+ #GET /v1/job/<ID>/evaluations
29
+ def job_evaluatons(id)
30
+ path = File.join("/job", id, "/evaluations")
31
+ return get(path)
32
+ end
33
+
34
+ #GET /v1/job/<ID>/allocations
35
+ def job_allocations(id)
36
+ path = File.join("/job", id, "/allocations")
37
+ return get(path)
38
+ end
39
+
40
+ #PUT/POST /v1/job
41
+ def force_job_evaluation(id)
42
+ path = File.join("/job", id, "/evaluate")
43
+ return put(path)
44
+ end
45
+
46
+ #PUT/POST /v1/job
47
+ def force_periodic_job(id)
48
+ path = File.join("/job", id, "/periodic/force")
49
+ return put(path)
50
+ end
51
+
52
+ #PUT/POST /v1/job
53
+ def register_job(spec)
54
+ path = "/job"
55
+ return put(path, nil, spec)
56
+ end
57
+
58
+ #PUT/POST /v1/job
59
+ def update_job(id, spec)
60
+ path = File.join("/job", id)
61
+ return put(path, nil, spec)
62
+ end
63
+
64
+ #DELETE /v1/job
65
+ def delete_job(id)
66
+ path = File.join("/job", id)
67
+ return delete(path)
68
+ end
69
+
70
+ #GET /v1/nodes
71
+ def nodes(opts={})
72
+ valid_opts?(opts,["prefix"])
73
+ path = "/nodes"
74
+ return get(path, opts)
75
+ end
76
+
77
+ #GET /v1/node/<ID>
78
+ def node(id)
79
+ path = File.join("/node", id)
80
+ return get(path)
81
+ end
82
+
83
+ #GET /v1/node/<ID>/allocations
84
+ def node_allocations(id)
85
+ path = File.join("job", id, "allocations")
86
+ return get(path)
87
+ end
88
+
89
+ #PUT/POST /v1/node/<ID>/evaluate
90
+ def create_evaluation(id)
91
+ path = File.join("/node", id, "/evaluate")
92
+ return put(path)
93
+ end
94
+
95
+ def drain(id, enable)
96
+ path = File.join("/node", id, "/drain")
97
+ return put(path, {:enable => enable})
98
+ end
99
+
100
+ #GET /v1/allocations
101
+ def allocations(opts = {})
102
+ valid_opts?(opts, ['prefix'])
103
+ path = "/allocations"
104
+ return get(path, opts)
105
+ end
106
+
107
+ #GET /v1/allocation/<ID>
108
+ def allocation(id)
109
+ path = File.join("/allocation", id)
110
+ return get(path)
111
+ end
112
+
113
+ #GET /v1/evaluations
114
+ def evaluations(opts = {})
115
+ valid_opts?(opts, ['prefix'])
116
+ path = "/evaluations"
117
+ return get(path, opts)
118
+ end
119
+
120
+ #GET /v1/evaluation/<ID>
121
+ def evaluation(id)
122
+ path = File.join("/evaluation", id)
123
+ return get(path)
124
+ end
125
+
126
+ #GET /v1/evaluation/<ID>/allocations
127
+ def evaluation_allocations(id)
128
+ path = File.join("/evaluation", id, 'allocations')
129
+ return get(path)
130
+ end
131
+
132
+ #GET /v1/agent/self
133
+ def agent_info
134
+ path = "/agent/self"
135
+ return get(path)
136
+ end
137
+
138
+ #PUT/POST /v1/agent/join
139
+ def agent_join(addresses)
140
+ path = "/agent/join"
141
+ return put(path, {:address => addresses})
142
+ end
143
+
144
+ #GET /v1/agent/members
145
+ def members
146
+ path = "/agent/members"
147
+ return get(path)
148
+ end
149
+
150
+ #PUT/POST /v1/agent/force-leave
151
+ def force_leave(node)
152
+ path = "/agent/force-leave"
153
+ return put(path, {:node => node})
154
+ end
155
+
156
+ #GET /v1/agent/servers
157
+ def servers
158
+ path = "/agent/servers"
159
+ return get(path)
160
+ end
161
+
162
+ #PUT/POST /v1/agent/servers
163
+ def update_servers(addresses)
164
+ path = "/agent/servers"
165
+ return put(path, {:address => addresses})
166
+ end
167
+
168
+ #GET /v1/client/fs/ls
169
+ def client_ls(allocation, path)
170
+ path = File.join("/client/fs/ls", allocation)
171
+ return get(path, {:path => path})
172
+ end
173
+
174
+ #GET /v1/client/fs/cat
175
+ def client_cat(allocation, path)
176
+ path = File.join("/client/fs/cat", allocation)
177
+ return get(path, {:path => path})
178
+ end
179
+
180
+ #GET /v1/client/fs/stat
181
+ def client_stat(allocation, path)
182
+ path = File.join("/client/fs/cat", allocation)
183
+ return get(path, {:path => path})
184
+ end
185
+
186
+ private
187
+
188
+ def get(path, params = {})
189
+ begin
190
+ resp = @rest[path].get(:params => params)
191
+ rescue StandardError => e
192
+ raise "Error whilst making HTTP GET request to the Nomad Agent at #{path}: #{e.response}"
193
+ end
194
+
195
+ return JSON.parse(resp)
196
+ end
197
+
198
+ def put(path, params = {}, body = '')
199
+ begin
200
+ resp = @rest[path].put(body, :params => params)
201
+ rescue StandardError => e
202
+ raise "Error whilst making HTTP PUT request to the Nomad Agent at #{path}: #{e.response}"
203
+ end
204
+
205
+ return JSON.parse(resp)
206
+ end
207
+
208
+ def delete(path, params = {})
209
+ begin
210
+ resp = @rest[path].delete(:params => params)
211
+ rescue StandardError => e
212
+ raise "Error whilst making HTTP DELETE request to the Nomad Agent at #{path}: #{e.response}"
213
+ end
214
+
215
+ return JSON.parse(resp)
216
+ end
217
+
218
+ def valid_opts?(opts, valid)
219
+ raise "Invalid options. Supported: #{valid}" unless opts.keys.reject{ |k| valid.include? k }.empty?
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,21 @@
1
+ require 'gadabout/dsl/base'
2
+ require 'gadabout/dsl/job'
3
+ require 'gadabout/dsl/constraint'
4
+ require 'gadabout/dsl/task_group'
5
+ require 'gadabout/dsl/task'
6
+ require 'gadabout/dsl/log_config'
7
+ require 'gadabout/dsl/restart_policy'
8
+ require 'gadabout/dsl/resources'
9
+ require 'gadabout/dsl/artifact'
10
+ require 'gadabout/dsl/network'
11
+ require 'gadabout/dsl/periodic'
12
+
13
+ module Gadabout
14
+ module DSL
15
+ def job(&block)
16
+ Gadabout::DSL::Job.new &block
17
+ end
18
+ end
19
+ end
20
+
21
+ include Gadabout::DSL
File without changes
@@ -0,0 +1,3 @@
1
+ module Gadabout
2
+ VERSION = "0.5.0"
3
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gadabout
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Josh McGhee
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.19'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.19'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ description: A swiss army knife gem for the Hashicorp Nomad job scheduler
42
+ email:
43
+ - joshpmcghee@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/gadabout.rb
49
+ - lib/gadabout/DSL/artifact.rb
50
+ - lib/gadabout/DSL/base.rb
51
+ - lib/gadabout/DSL/constraint.rb
52
+ - lib/gadabout/DSL/job.rb
53
+ - lib/gadabout/DSL/log_config.rb
54
+ - lib/gadabout/DSL/network.rb
55
+ - lib/gadabout/DSL/periodic.rb
56
+ - lib/gadabout/DSL/resources.rb
57
+ - lib/gadabout/DSL/restart_policy.rb
58
+ - lib/gadabout/DSL/task.rb
59
+ - lib/gadabout/DSL/task_group.rb
60
+ - lib/gadabout/client.rb
61
+ - lib/gadabout/dsl.rb
62
+ - lib/gadabout/node.rb
63
+ - lib/gadabout/version.rb
64
+ homepage: https://github.com//gadabout
65
+ licenses: []
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.5.1
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: A swiss army knife gem for the Hashicorp Nomad job scheduler
87
+ test_files: []