gogetit 0.9.0 → 0.10.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 +4 -4
- data/README.md +3 -7
- data/lib/gogetit/cli.rb +50 -14
- data/lib/gogetit/util.rb +4 -2
- data/lib/gogetit/version.rb +1 -1
- data/lib/providers/libvirt.rb +35 -13
- data/lib/providers/lxd.rb +13 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90850298a6e02e953b7f0ebb6ed8e7cd7a4d47bd
|
4
|
+
data.tar.gz: 2f5fca754895bcf3f5342b952c08b81a7819d64f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee71a4680053f4b696bdebeceb9e366a97484f0ba1a2f2ea1a64aa3d121e24e9364a2536fb6c9848990ab5c097d29af5edb451b9677391669b57221dcd01ec14
|
7
|
+
data.tar.gz: 83b2a138facc3e1b9616a737f7277baf204a6b763ff329a91f9aa23f7372657f1fcddd3923250968e49cce66cec8f3a13a59cbdecc50d4d4f13d0f55b8f6ded4
|
data/README.md
CHANGED
@@ -97,13 +97,6 @@ gogetit release node01
|
|
97
97
|
```ruby
|
98
98
|
require 'gogetit'
|
99
99
|
```
|
100
|
-
## To make Gogetit recognize data bag that needs to be encrypted by Vault
|
101
|
-
- Fill this out!
|
102
|
-
|
103
|
-
## To develop
|
104
|
-
- Deploying bare metal machine from machine pool
|
105
|
-
- Static IP auto-assignment with VLAN info
|
106
|
-
- Working with Multiple LXD and Libvirt hosts
|
107
100
|
|
108
101
|
## To document
|
109
102
|
- How to make Gogetit recognize vault data bag items
|
@@ -117,6 +110,9 @@ Clone and then execute followings:
|
|
117
110
|
|
118
111
|
Questions, pull requests, advices and suggestions are always welcome!
|
119
112
|
|
113
|
+
## rubygems
|
114
|
+
[https://rubygems.org/gems/gogetit](https://rubygems.org/gems/gogetit)
|
115
|
+
|
120
116
|
## License
|
121
117
|
|
122
118
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/lib/gogetit/cli.rb
CHANGED
@@ -3,10 +3,28 @@ require 'gogetit'
|
|
3
3
|
require 'gogetit/util'
|
4
4
|
|
5
5
|
module Gogetit
|
6
|
+
|
7
|
+
@@result = nil
|
8
|
+
|
9
|
+
def self.set_result(x)
|
10
|
+
@@result = x
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.get_result
|
14
|
+
@@result
|
15
|
+
end
|
16
|
+
|
6
17
|
class CLI < Thor
|
7
18
|
include Gogetit::Util
|
8
19
|
package_name 'Gogetit'
|
9
20
|
|
21
|
+
# attr_accessor :result
|
22
|
+
|
23
|
+
# def initialize(*args)
|
24
|
+
# super
|
25
|
+
# @result = nil
|
26
|
+
# end
|
27
|
+
|
10
28
|
desc 'list', 'List containers and instances, running currently.'
|
11
29
|
def list
|
12
30
|
puts "Listing LXD containers on #{Gogetit.config[:lxd][:nodes][0][:url]}.."
|
@@ -51,9 +69,11 @@ module Gogetit
|
|
51
69
|
|
52
70
|
case options['provider']
|
53
71
|
when 'lxd'
|
54
|
-
Gogetit.lxd.create(name, options.to_hash)
|
72
|
+
result = Gogetit.lxd.create(name, options.to_hash)
|
73
|
+
Gogetit.set_result(result)
|
55
74
|
when 'libvirt'
|
56
|
-
Gogetit.libvirt.create(name, options.to_hash)
|
75
|
+
result = Gogetit.libvirt.create(name, options.to_hash)
|
76
|
+
Gogetit.set_result(result)
|
57
77
|
else
|
58
78
|
abort('Invalid argument entered.')
|
59
79
|
end
|
@@ -73,9 +93,11 @@ module Gogetit
|
|
73
93
|
if provider
|
74
94
|
case provider
|
75
95
|
when 'lxd'
|
76
|
-
Gogetit.lxd.destroy(name)
|
96
|
+
result = Gogetit.lxd.destroy(name)
|
97
|
+
Gogetit.set_result(result)
|
77
98
|
when 'libvirt'
|
78
|
-
Gogetit.libvirt.destroy(name)
|
99
|
+
result = Gogetit.libvirt.destroy(name)
|
100
|
+
Gogetit.set_result(result)
|
79
101
|
else
|
80
102
|
abort('Invalid argument entered.')
|
81
103
|
end
|
@@ -93,7 +115,7 @@ module Gogetit
|
|
93
115
|
method_option :chef, :aliases => '-c', :type => :boolean, \
|
94
116
|
:default => false, :desc => 'Chef awareness'
|
95
117
|
def deploy(name)
|
96
|
-
Gogetit.libvirt.deploy(name, options.to_hash)
|
118
|
+
Gogetit.set_result(Gogetit.libvirt.deploy(name, options.to_hash))
|
97
119
|
|
98
120
|
# post-tasks
|
99
121
|
if options['chef']
|
@@ -105,14 +127,35 @@ module Gogetit
|
|
105
127
|
desc 'release NAME', 'Release a node in MAAS'
|
106
128
|
method_option :chef, :type => :boolean, :desc => "Enable chef awareness."
|
107
129
|
def release(name)
|
130
|
+
result = Gogetit.libvirt.release(name)
|
131
|
+
Gogetit.set_result(result)
|
132
|
+
|
133
|
+
# post-tasks
|
134
|
+
if options['chef']
|
135
|
+
knife_remove(name, Gogetit.logger) if options[:chef]
|
136
|
+
update_databags(Gogetit.config, Gogetit.logger)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
desc 'rebuild NAME', 'Destroy(or release) and create(or deploy)'\
|
141
|
+
' either a container or a node(machine) in MAAS again.'
|
142
|
+
method_option :chef, :aliases => '-c', :type => :boolean, \
|
143
|
+
:default => false, :desc => 'Chef awareness'
|
144
|
+
def rebuild(name)
|
108
145
|
# Let Gogetit recognize the provider.
|
109
146
|
provider = Gogetit.get_provider_of(name)
|
110
147
|
if provider
|
111
148
|
case provider
|
112
149
|
when 'lxd'
|
113
|
-
|
150
|
+
invoke :destroy, [name]
|
151
|
+
alias_name = YAML.load(
|
152
|
+
Gogetit.get_result[:info][:config][:"user.user-data"]
|
153
|
+
)['source_image_alias']
|
154
|
+
invoke :create, [name], :alias => alias_name
|
114
155
|
when 'libvirt'
|
115
|
-
|
156
|
+
invoke :release, [name]
|
157
|
+
distro_name = Gogetit.get_result[:info][:machine]['distro_series']
|
158
|
+
invoke :deploy, [name], :distro => distro_name
|
116
159
|
else
|
117
160
|
abort('Invalid argument entered.')
|
118
161
|
end
|
@@ -123,12 +166,5 @@ module Gogetit
|
|
123
166
|
update_databags(Gogetit.config, Gogetit.logger)
|
124
167
|
end
|
125
168
|
end
|
126
|
-
|
127
|
-
# This feature is broken and might be deprecated in the future.
|
128
|
-
# desc 'rebuild NAME', 'Destroy and create either a container or KVM domain again.'
|
129
|
-
# def rebuild(type=nil, name)
|
130
|
-
# invoke :destroy, [name]
|
131
|
-
# invoke :create, [type, name]
|
132
|
-
# end
|
133
169
|
end
|
134
170
|
end
|
data/lib/gogetit/util.rb
CHANGED
@@ -72,12 +72,14 @@ module Gogetit
|
|
72
72
|
if JSON.parse(File.read(item_file))['vault']
|
73
73
|
if items_as_is.include? item
|
74
74
|
run_command(
|
75
|
-
"knife vault update #{bag} #{item} --json #{item_file}
|
75
|
+
"knife vault update #{bag} #{item} --json #{item_file}"\
|
76
|
+
" --search '*:*' -M client",
|
76
77
|
logger
|
77
78
|
)
|
78
79
|
else
|
79
80
|
run_command(
|
80
|
-
"knife vault create #{bag} #{item} --json #{item_file}
|
81
|
+
"knife vault create #{bag} #{item} --json #{item_file}"\
|
82
|
+
" --search '*:*' -M client",
|
81
83
|
logger
|
82
84
|
)
|
83
85
|
end
|
data/lib/gogetit/version.rb
CHANGED
data/lib/providers/libvirt.rb
CHANGED
@@ -54,7 +54,8 @@ module Gogetit
|
|
54
54
|
unless ifaces[0]['gateway_ip']
|
55
55
|
|
56
56
|
# It seems the first IP has to belong to the untagged VLAN in the Fabric.
|
57
|
-
abort("The first IP you entered does not belong to the untagged
|
57
|
+
abort("The first IP you entered does not belong to the untagged"\
|
58
|
+
" VLAN in the Fabric.") \
|
58
59
|
unless ifaces[0]['vlan']['name'] == 'untagged'
|
59
60
|
|
60
61
|
domain[:ifaces] = ifaces
|
@@ -70,7 +71,8 @@ module Gogetit
|
|
70
71
|
elsif iface['vlan']['name'] != 'untagged'
|
71
72
|
nic = {
|
72
73
|
network: config[:default][:root_bridge],
|
73
|
-
portgroup: config[:default][:root_bridge] + '-' +
|
74
|
+
portgroup: config[:default][:root_bridge] + '-' + \
|
75
|
+
iface['vlan']['vid'].to_s
|
74
76
|
}
|
75
77
|
end
|
76
78
|
domain[:nic].push(nic)
|
@@ -81,7 +83,8 @@ module Gogetit
|
|
81
83
|
if ifaces[0]['vlan']['name'] != 'untagged'
|
82
84
|
nic = {
|
83
85
|
network: config[:default][:root_bridge],
|
84
|
-
portgroup: config[:default][:root_bridge] + '-' +
|
86
|
+
portgroup: config[:default][:root_bridge] + '-' + \
|
87
|
+
iface['vlan']['vid'].to_s
|
85
88
|
}
|
86
89
|
domain[:nic].push(nic)
|
87
90
|
end
|
@@ -142,7 +145,8 @@ module Gogetit
|
|
142
145
|
|
143
146
|
def create(name, options = nil)
|
144
147
|
logger.info("Calling <#{__method__.to_s}>")
|
145
|
-
abort("Domain #{name} already exists!
|
148
|
+
abort("Domain #{name} already exists!"\
|
149
|
+
" Please check both on MAAS and libvirt.") \
|
146
150
|
if maas.domain_name_exists?(name) or domain_exists?(name)
|
147
151
|
|
148
152
|
domain = config[:libvirt][:specs][:default]
|
@@ -206,12 +210,19 @@ module Gogetit
|
|
206
210
|
|
207
211
|
logger.info("#{domain[:name]} has been created.")
|
208
212
|
puts "ssh #{distro_name}@#{name}"
|
209
|
-
|
213
|
+
|
214
|
+
{ result: true, info: domain }
|
210
215
|
end
|
211
216
|
|
212
217
|
def destroy(name)
|
213
218
|
logger.info("Calling <#{__method__.to_s}>")
|
219
|
+
|
214
220
|
system_id = maas.get_system_id(name)
|
221
|
+
|
222
|
+
info = {}
|
223
|
+
info[:machine] = \
|
224
|
+
maas.conn.request(:get, ['machines', system_id])
|
225
|
+
|
215
226
|
if maas.machine_exists?(name)
|
216
227
|
if maas.get_machine_state(system_id) == 'Deployed'
|
217
228
|
logger.info("Calling to release...")
|
@@ -227,11 +238,14 @@ module Gogetit
|
|
227
238
|
end
|
228
239
|
|
229
240
|
dom = conn.lookup_domain_by_name(name)
|
241
|
+
info[:domain_xml] = dom.xml_desc
|
242
|
+
|
230
243
|
dom.destroy if dom.active?
|
231
244
|
Oga.parse_xml(dom.xml_desc).xpath('domain/devices/disk/source').each do |d|
|
232
245
|
pool_path = d.attribute('file').value.split('/')[0..2].join('/')
|
233
246
|
pools.each do |p|
|
234
|
-
if Oga.parse_xml(p.xml_desc).at_xpath('pool/target/path')
|
247
|
+
if Oga.parse_xml(p.xml_desc).at_xpath('pool/target/path')\
|
248
|
+
.inner_text == pool_path
|
235
249
|
logger.info("Deleting volume in #{p.name} pool.")
|
236
250
|
p.lookup_volume_by_name(d.attribute('file').value.split('/')[3]).delete
|
237
251
|
end
|
@@ -239,9 +253,9 @@ module Gogetit
|
|
239
253
|
end
|
240
254
|
dom.undefine
|
241
255
|
|
242
|
-
maas.refresh_pods
|
243
256
|
logger.info("#{name} has been destroyed.")
|
244
|
-
|
257
|
+
|
258
|
+
{ result: true, info: info }
|
245
259
|
end
|
246
260
|
|
247
261
|
def deploy(name, options = nil)
|
@@ -280,12 +294,18 @@ module Gogetit
|
|
280
294
|
|
281
295
|
logger.info("#{name} has been created.")
|
282
296
|
puts "ssh #{distro_name}@#{name}"
|
283
|
-
true
|
297
|
+
{ result: true, info: distro }
|
284
298
|
end
|
285
299
|
|
286
300
|
def release(name)
|
287
301
|
logger.info("Calling <#{__method__.to_s}>")
|
302
|
+
|
288
303
|
system_id = maas.get_system_id(name)
|
304
|
+
|
305
|
+
info = {}
|
306
|
+
info[:machine] = \
|
307
|
+
maas.conn.request(:get, ['machines', system_id])
|
308
|
+
|
289
309
|
if maas.machine_exists?(name)
|
290
310
|
if maas.get_machine_state(system_id) == 'Deployed'
|
291
311
|
logger.info("Calling to release...")
|
@@ -294,9 +314,9 @@ module Gogetit
|
|
294
314
|
end
|
295
315
|
end
|
296
316
|
|
297
|
-
maas.refresh_pods
|
298
317
|
logger.info("#{name} has been released.")
|
299
|
-
|
318
|
+
|
319
|
+
{ result: true, info: info }
|
300
320
|
end
|
301
321
|
|
302
322
|
def define_domain(domain)
|
@@ -368,9 +388,11 @@ module Gogetit
|
|
368
388
|
|
369
389
|
volume_doc.at_xpath('volume/name').inner_text = volume_name
|
370
390
|
volume_doc.at_xpath('volume/target/path').inner_text = volume_file
|
371
|
-
volume_doc.at_xpath('volume/capacity').inner_text =
|
391
|
+
volume_doc.at_xpath('volume/capacity').inner_text = \
|
392
|
+
domain[:disk][:root][:capacity].to_s
|
372
393
|
|
373
|
-
create_volume(domain[:disk][:root][:pool],
|
394
|
+
create_volume(domain[:disk][:root][:pool], \
|
395
|
+
Oga::XML::Generator.new(volume_doc).to_xml)
|
374
396
|
defined_volumes << volume_doc
|
375
397
|
|
376
398
|
# For data(secondary) volumes
|
data/lib/providers/lxd.rb
CHANGED
@@ -46,7 +46,6 @@ module Gogetit
|
|
46
46
|
def generate_user_data(args, options)
|
47
47
|
logger.info("Calling <#{__method__.to_s}>")
|
48
48
|
|
49
|
-
args = {}
|
50
49
|
args[:config] = {}
|
51
50
|
|
52
51
|
if options['no-maas']
|
@@ -69,6 +68,7 @@ module Gogetit
|
|
69
68
|
end
|
70
69
|
|
71
70
|
args[:config][:"user.user-data"]['maas'] = true
|
71
|
+
args[:config][:"user.user-data"]['source_image_alias'] = args[:alias]
|
72
72
|
end
|
73
73
|
|
74
74
|
# To disable to update apt database on first boot
|
@@ -223,7 +223,8 @@ module Gogetit
|
|
223
223
|
default_fabric = 'fabric-0'
|
224
224
|
|
225
225
|
maas.get_subnets.each do |subnet|
|
226
|
-
if subnet['vlan']['name'] == 'untagged' and
|
226
|
+
if subnet['vlan']['name'] == 'untagged' and \
|
227
|
+
subnet['vlan']['fabric'] == default_fabric
|
227
228
|
root_bridge_mtu = subnet['vlan']['mtu']
|
228
229
|
break
|
229
230
|
end
|
@@ -286,9 +287,7 @@ module Gogetit
|
|
286
287
|
abort("Domain #{name}.#{maas.get_domain} already exists!") \
|
287
288
|
if maas.domain_name_exists?(name) unless options['no-maas']
|
288
289
|
|
289
|
-
args =
|
290
|
-
args = generate_network_config(args, options)
|
291
|
-
args = generate_devices(args, options)
|
290
|
+
args = {}
|
292
291
|
|
293
292
|
if options['alias'].nil? or options['alias'].empty?
|
294
293
|
args[:alias] = config[:lxd][:default_alias]
|
@@ -296,6 +295,10 @@ module Gogetit
|
|
296
295
|
args[:alias] = options['alias']
|
297
296
|
end
|
298
297
|
|
298
|
+
args = generate_user_data(args, options)
|
299
|
+
args = generate_network_config(args, options)
|
300
|
+
args = generate_devices(args, options)
|
301
|
+
|
299
302
|
args[:sync] ||= true
|
300
303
|
|
301
304
|
conn.create_container(name, args)
|
@@ -335,7 +338,7 @@ module Gogetit
|
|
335
338
|
puts "ssh #{default_user}@#{name}"
|
336
339
|
end
|
337
340
|
|
338
|
-
true
|
341
|
+
{ result: true, info: args }
|
339
342
|
end
|
340
343
|
|
341
344
|
def destroy(name, args = {})
|
@@ -344,6 +347,8 @@ module Gogetit
|
|
344
347
|
container = conn.container(name)
|
345
348
|
args[:sync] ||= true
|
346
349
|
|
350
|
+
info = container.to_hash
|
351
|
+
|
347
352
|
if get_state(name) == 'Running'
|
348
353
|
conn.stop_container(name, args)
|
349
354
|
end
|
@@ -380,7 +385,8 @@ module Gogetit
|
|
380
385
|
# When multiple static IPs were reserved, it will not delete anything
|
381
386
|
# since they are deleted when releasing the IPs above.
|
382
387
|
logger.info("#{name} has been destroyed.")
|
383
|
-
|
388
|
+
|
389
|
+
{ result: true, info: info }
|
384
390
|
end
|
385
391
|
end
|
386
392
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gogetit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Don Draper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|