gogetit 0.1.16
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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +52 -0
- data/Rakefile +6 -0
- data/bin/console +6 -0
- data/bin/gogetit +10 -0
- data/bin/setup +8 -0
- data/gogetit.gemspec +43 -0
- data/lib/etcd.rb +37 -0
- data/lib/executionhooks.rb +50 -0
- data/lib/gogetit.rb +103 -0
- data/lib/gogetit/cli.rb +44 -0
- data/lib/gogetit/version.rb +3 -0
- data/lib/maas.rb +119 -0
- data/lib/multilogger.rb +56 -0
- data/lib/providers/libvirt.rb +260 -0
- data/lib/providers/lxd.rb +89 -0
- data/lib/sample_conf/ceph.yml +17 -0
- data/lib/sample_conf/default.yml +10 -0
- data/lib/sample_conf/gogetit.yml +24 -0
- data/lib/template/disk.xml +5 -0
- data/lib/template/domain.xml +49 -0
- data/lib/template/nic.xml +4 -0
- data/lib/template/volume.xml +11 -0
- data/lib/util.rb +56 -0
- metadata +247 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'hyperkit'
|
2
|
+
require 'util'
|
3
|
+
|
4
|
+
module Gogetit
|
5
|
+
class GogetLXD
|
6
|
+
include Gogetit::Util
|
7
|
+
|
8
|
+
attr_reader :config, :conn, :maas, :logger
|
9
|
+
|
10
|
+
def initialize(conf, maas, logger)
|
11
|
+
@config = conf
|
12
|
+
@conn = Hyperkit::Client.new(
|
13
|
+
api_endpoint: config[:lxd][:url],
|
14
|
+
verify_ssl: false
|
15
|
+
)
|
16
|
+
@maas = maas
|
17
|
+
@logger = logger
|
18
|
+
end
|
19
|
+
|
20
|
+
def list
|
21
|
+
logger.info("Calling <#{__method__.to_s}>")
|
22
|
+
conn.containers
|
23
|
+
end
|
24
|
+
|
25
|
+
def container_exists?(name)
|
26
|
+
logger.info("Calling <#{__method__.to_s}>")
|
27
|
+
list.each do |c|
|
28
|
+
return true if c == name
|
29
|
+
end
|
30
|
+
false
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_state(name)
|
34
|
+
conn.container(name)[:status]
|
35
|
+
end
|
36
|
+
|
37
|
+
def wait_until_state(name, state)
|
38
|
+
logger.info("Calling <#{__method__.to_s}> for being #{state}..")
|
39
|
+
until get_state(name) == state
|
40
|
+
sleep 3
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def wait_until_available(fqdn)
|
45
|
+
until ping_available?(fqdn)
|
46
|
+
logger.info("Calling <#{__method__.to_s}> for ping to be ready..")
|
47
|
+
sleep 3
|
48
|
+
end
|
49
|
+
logger.info("#{fqdn} is now available to ping..")
|
50
|
+
until ssh_available?(fqdn, 'ubuntu')
|
51
|
+
logger.info("Calling <#{__method__.to_s}> for ssh to be ready..")
|
52
|
+
sleep 3
|
53
|
+
end
|
54
|
+
logger.info("#{fqdn} is now available to ssh..")
|
55
|
+
end
|
56
|
+
|
57
|
+
def create(name, args = {})
|
58
|
+
logger.info("Calling <#{__method__.to_s}>")
|
59
|
+
if container_exists?(name) or maas.domain_name_exists?(name)
|
60
|
+
puts "Container #{name} already exists!"
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
|
64
|
+
args[:alias] ||= config[:lxd][:default_alias]
|
65
|
+
args[:profiles] ||= config[:lxd][:profiles]
|
66
|
+
args[:sync] ||= true
|
67
|
+
conn.create_container(name, args)
|
68
|
+
conn.start_container(name, :sync=>"true")
|
69
|
+
|
70
|
+
fqdn = name + '.' + maas.get_domain
|
71
|
+
wait_until_available(fqdn)
|
72
|
+
logger.info("#{name} has been created.")
|
73
|
+
true
|
74
|
+
end
|
75
|
+
|
76
|
+
def destroy(name, args = {})
|
77
|
+
logger.info("Calling <#{__method__.to_s}>")
|
78
|
+
args[:sync] ||= true
|
79
|
+
if get_state(name) == 'Running'
|
80
|
+
conn.stop_container(name, args)
|
81
|
+
end
|
82
|
+
wait_until_state(name, 'Stopped')
|
83
|
+
conn.delete_container(name, args)
|
84
|
+
maas.delete_dns_record(name)
|
85
|
+
logger.info("#{name} has been destroyed.")
|
86
|
+
true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
default:
|
2
|
+
user: ubuntu
|
3
|
+
etcd:
|
4
|
+
url: http://etcd.example.com:2379
|
5
|
+
maas:
|
6
|
+
key: K:E:Y
|
7
|
+
url: http://maas.example.com/MAAS/api/2.0
|
8
|
+
lxd:
|
9
|
+
url: https://lxd.example.com:8443
|
10
|
+
name: REMOTE_NAME
|
11
|
+
default_alias: ubuntu-16.04
|
12
|
+
profiles:
|
13
|
+
- my_favorite_bridge
|
14
|
+
libvirt:
|
15
|
+
url: qemu+ssh://WHOAMI@kvm.example.com/system
|
16
|
+
|
17
|
+
# To configure LXD remote
|
18
|
+
# lxc remote add host_name host_fqdn --accept-certificate
|
19
|
+
# i.e) lxc remote add lxd lxd.example.com --accept-certificate
|
20
|
+
#
|
21
|
+
# To make sure libvirt connection via ssh available
|
22
|
+
# ssh-keygen -t rsa
|
23
|
+
# ssh-copy-id WHOAMI@kvm.example.com
|
24
|
+
# i.e) ssh-copy-id ubuntu@kvm.example.com
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<domain type='kvm'>
|
2
|
+
<name>sample</name>
|
3
|
+
<uuid>uuid</uuid>
|
4
|
+
<memory unit='GiB'>kib</memory>
|
5
|
+
<currentMemory unit='GiB'>kib</currentMemory>
|
6
|
+
<vcpu placement='static'>number</vcpu>
|
7
|
+
<os>
|
8
|
+
<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
|
9
|
+
<boot dev='network'/>
|
10
|
+
<boot dev='hd'/>
|
11
|
+
<bootmenu enable='yes'/>
|
12
|
+
</os>
|
13
|
+
<features>
|
14
|
+
<acpi/>
|
15
|
+
<apic/>
|
16
|
+
</features>
|
17
|
+
<cpu mode='host-model'>
|
18
|
+
<model fallback='allow'/>
|
19
|
+
</cpu>
|
20
|
+
<clock offset='utc'>
|
21
|
+
<timer name='rtc' tickpolicy='catchup'/>
|
22
|
+
<timer name='pit' tickpolicy='delay'/>
|
23
|
+
<timer name='hpet' present='no'/>
|
24
|
+
</clock>
|
25
|
+
<on_poweroff>destroy</on_poweroff>
|
26
|
+
<on_reboot>restart</on_reboot>
|
27
|
+
<on_crash>restart</on_crash>
|
28
|
+
<pm>
|
29
|
+
<suspend-to-mem enabled='no'/>
|
30
|
+
<suspend-to-disk enabled='no'/>
|
31
|
+
</pm>
|
32
|
+
<devices>
|
33
|
+
<emulator>/usr/bin/kvm-spice</emulator>
|
34
|
+
<controller type='scsi' index='0' model='virtio-scsi'/>
|
35
|
+
<serial type='pty'>
|
36
|
+
<target port='0'/>
|
37
|
+
</serial>
|
38
|
+
<console type='pty'>
|
39
|
+
<target type='serial' port='0'/>
|
40
|
+
</console>
|
41
|
+
<input type='keyboard' bus='ps2'/>
|
42
|
+
<graphics type='vnc' port='-1' autoport='yes'/>
|
43
|
+
<video>
|
44
|
+
<model type='cirrus' vram='16384' heads='1'/>
|
45
|
+
</video>
|
46
|
+
<memballoon model='virtio'/>
|
47
|
+
</devices>
|
48
|
+
</domain>
|
49
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<volume type='file'>
|
2
|
+
<name>volume_name.qcow2</name>
|
3
|
+
<source>
|
4
|
+
</source>
|
5
|
+
<capacity unit='GiB'>capacity</capacity>
|
6
|
+
<allocation unit='GiB'>0</allocation>
|
7
|
+
<target>
|
8
|
+
<path>/path/to/volume_name.qcow2</path>
|
9
|
+
<format type='qcow2'/>
|
10
|
+
</target>
|
11
|
+
</volume>
|
data/lib/util.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'net/ssh'
|
2
|
+
require 'active_support/core_ext/hash'
|
3
|
+
|
4
|
+
module Gogetit
|
5
|
+
module Util
|
6
|
+
def recognize_env
|
7
|
+
thedir = 'lib/env'
|
8
|
+
gateway = get_gateway(4)
|
9
|
+
Dir.foreach(thedir) do |item|
|
10
|
+
if item.match(/\.json$/)
|
11
|
+
env_data = JSON.parse(File.read(thedir+'/'+item))
|
12
|
+
if gateway =~ Regexp.new(env_data['regexp_pattern'])
|
13
|
+
return env_data['name']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_gateway(version)
|
20
|
+
IO.popen("ip -#{version.to_s} route").read.each_line do |route|
|
21
|
+
if route.include? 'default'
|
22
|
+
route.split[2]
|
23
|
+
else
|
24
|
+
'There is no get_gateway!'
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# taken from https://gist.github.com/andrewpcone/11359798
|
31
|
+
def symbolize_keys(thing)
|
32
|
+
case thing
|
33
|
+
when Array
|
34
|
+
thing.map{|v| symbolize_keys(v)}
|
35
|
+
when Hash
|
36
|
+
inj = thing.inject({}) {|h, (k,v)| h[k] = symbolize_keys(v); h}
|
37
|
+
inj.symbolize_keys
|
38
|
+
else
|
39
|
+
thing
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def ping_available?(fqdn)
|
44
|
+
`ping -c 1 -W 1 #{fqdn}`
|
45
|
+
$?.exitstatus == 0
|
46
|
+
end
|
47
|
+
|
48
|
+
def ssh_available?(fqdn, user)
|
49
|
+
begin
|
50
|
+
Net::SSH.start(fqdn, user).class
|
51
|
+
rescue Exception => e
|
52
|
+
puts e
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gogetit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.16
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Don Draper
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-07-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.10.4
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.10.4
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.14.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.14.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: json
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.1.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.1.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: hyperkit
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.1.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.1.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: maas-client
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.1.23
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.1.23
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: ruby-libvirt
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.7.0
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.7.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: oga
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '2.10'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '2.10'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: net-ssh
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 4.1.0
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 4.1.0
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: thor
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.19.0
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.19.0
|
181
|
+
description: |2
|
182
|
+
This provides the ways that deal with mutiple virtualized and containerized solutions such as Libvirt(KVM) and LXD.
|
183
|
+
This uses MAAS for bare-metal provision(KVM machine using Libvirt), DHCP and DNS.
|
184
|
+
This will also provide the ways to deal with muchltiple development environment such as development, stage and production.
|
185
|
+
email:
|
186
|
+
- donoldfashioned@gmail.com
|
187
|
+
executables:
|
188
|
+
- gogetit
|
189
|
+
extensions: []
|
190
|
+
extra_rdoc_files: []
|
191
|
+
files:
|
192
|
+
- ".gitignore"
|
193
|
+
- ".rspec"
|
194
|
+
- ".ruby-gemset"
|
195
|
+
- ".ruby-version"
|
196
|
+
- ".travis.yml"
|
197
|
+
- CODE_OF_CONDUCT.md
|
198
|
+
- Gemfile
|
199
|
+
- LICENSE.txt
|
200
|
+
- README.md
|
201
|
+
- Rakefile
|
202
|
+
- bin/console
|
203
|
+
- bin/gogetit
|
204
|
+
- bin/setup
|
205
|
+
- gogetit.gemspec
|
206
|
+
- lib/etcd.rb
|
207
|
+
- lib/executionhooks.rb
|
208
|
+
- lib/gogetit.rb
|
209
|
+
- lib/gogetit/cli.rb
|
210
|
+
- lib/gogetit/version.rb
|
211
|
+
- lib/maas.rb
|
212
|
+
- lib/multilogger.rb
|
213
|
+
- lib/providers/libvirt.rb
|
214
|
+
- lib/providers/lxd.rb
|
215
|
+
- lib/sample_conf/ceph.yml
|
216
|
+
- lib/sample_conf/default.yml
|
217
|
+
- lib/sample_conf/gogetit.yml
|
218
|
+
- lib/template/disk.xml
|
219
|
+
- lib/template/domain.xml
|
220
|
+
- lib/template/nic.xml
|
221
|
+
- lib/template/volume.xml
|
222
|
+
- lib/util.rb
|
223
|
+
homepage: https://github.com/itisnotdone/gogetit.git
|
224
|
+
licenses:
|
225
|
+
- MIT
|
226
|
+
metadata: {}
|
227
|
+
post_install_message:
|
228
|
+
rdoc_options: []
|
229
|
+
require_paths:
|
230
|
+
- lib
|
231
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - ">="
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '0'
|
236
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
|
+
requirements:
|
238
|
+
- - ">="
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '0'
|
241
|
+
requirements: []
|
242
|
+
rubyforge_project:
|
243
|
+
rubygems_version: 2.6.12
|
244
|
+
signing_key:
|
245
|
+
specification_version: 4
|
246
|
+
summary: Libraries with a CLI tool for dealing with things like MAAS, LXD and Libvirt.
|
247
|
+
test_files: []
|