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.
@@ -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,17 @@
1
+ vcpu: 4
2
+ memory: 8
3
+ disk:
4
+ root:
5
+ pool: ssd
6
+ capacity: 4
7
+ data:
8
+ -
9
+ pool: hdd
10
+ capacity: 8
11
+ -
12
+ pool: hdd
13
+ capacity: 8
14
+ nic:
15
+ -
16
+ network: br-one
17
+ portgroup: all
@@ -0,0 +1,10 @@
1
+ vcpu: 1
2
+ memory: 1
3
+ disk:
4
+ root:
5
+ pool: ssd
6
+ capacity: 4
7
+ nic:
8
+ -
9
+ network: br-one
10
+ portgroup: all
@@ -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,5 @@
1
+ <disk type='file' device='disk'>
2
+ <driver name='qemu' type='qcow2'/>
3
+ <source file='file.qcow2'/>
4
+ <target dev='sda' bus='scsi'/>
5
+ </disk>
@@ -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,4 @@
1
+ <interface type='network'>
2
+ <source network='network_name' portgroup='group_name'/>
3
+ <model type='virtio'/>
4
+ </interface>
@@ -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>
@@ -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: []