gogetit 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eece96e8731a88531e7acb63f44b960d4a674cd9
4
- data.tar.gz: 69eda3942e9e7ed98edb508fe2c42894aa206b07
3
+ metadata.gz: 148adb0a4d5bf1227bba264f035bf222b6a3c5bf
4
+ data.tar.gz: f8d3d1a7f5762574f08acdc470f663c7d103ae9f
5
5
  SHA512:
6
- metadata.gz: a24f807fd2271e9c7336cfbb187d5cb7a30d00b3fa3091a2bf43f8988844b575a34a20e1b30d785974253bbab747259cd26ed6357c21f389183bc231f654084b
7
- data.tar.gz: 724ba1bceefcf866b18d18665eab1e39997920ffd8fd79a6e1d416376432e8a8def9b082f91734689652581c4051966ce63a069681bab4f5eceffbe3738f07f9
6
+ metadata.gz: ab49648f3d9db3e552b523716ab85f1271952249fc392a970f812212d3511812256d246e2f2e2d9336b15a550d11ecccc7ed12d089e31def95fbc46ce2662b4e
7
+ data.tar.gz: 547011a4d9d806019e802eb6e890080354f521b2ca048c170288e36442b270d268c9f68a7852c03a5c2227c895986060e92e1c229d03bc799013a13f6960fee0
data/README.md CHANGED
@@ -56,6 +56,10 @@ gogetit create lxd01 -p lxd -i 192.168.10.10 10.0.0.2
56
56
  gogetit create kvm01 -p libvirt
57
57
  gogetit create kvm01 -p libvirt -i 192.168.10.10 10.0.0.2
58
58
 
59
+ # to create a LXD container without MAAS awareness
60
+ gogetit create lxd01 --no-maas -f lxd_without_maas.yml
61
+ gogetit create lxd01 --no-maas -f lxd_without_maas_vlans.yml
62
+
59
63
  # to provision with a bare metal machine
60
64
  # gogetit create kvm01 -p bare
61
65
 
data/lib/gogetit/cli.rb CHANGED
@@ -21,16 +21,25 @@ module Gogetit
21
21
  :default => 'lxd', :desc => 'A provider such as lxd and libvirt'
22
22
  method_option :chef, :aliases => '-c', :type => :boolean, \
23
23
  :default => false, :desc => 'Chef awareness'
24
-
25
24
  method_option :vlans, :aliases => '-v', :type => :array, \
26
25
  :desc => 'A list of VLAN IDs to connect to'
27
26
  method_option :ipaddresses, :aliases => '-i', :type => :array, \
28
27
  :desc => 'A list of static IPs to assign'
28
+ method_option :"no-maas", :type => :boolean, \
29
+ :desc => 'Without MAAS awareness'
30
+ method_option :"file", :aliases => '-f', :type => :string, \
31
+ :desc => 'File location'
29
32
  def create(name)
30
- abort("vlans and ipaddresses can not be used at the same time.") \
33
+ abort("'vlans' and 'ipaddresses' can not be set together.") \
31
34
  if options['vlans'] and options['ipaddresses']
32
35
 
33
- case options[:provider]
36
+ abort("when 'no-maas', the network configuration have to be set by 'file'.") \
37
+ if options['no-maas'] and (options['vlans'] or options['ipaddresses'])
38
+
39
+ abort("'no-maas' and 'file' have to be set together.") \
40
+ if options['no-maas'] ^ !!options['file']
41
+
42
+ case options['provider']
34
43
  when 'lxd'
35
44
  Gogetit.lxd.create(name, options.to_hash)
36
45
  when 'libvirt'
@@ -40,12 +49,10 @@ module Gogetit
40
49
  end
41
50
 
42
51
  # post-tasks
43
- if options[:chef]
52
+ if options['chef']
44
53
  knife_bootstrap(name, options[:provider], Gogetit.config, Gogetit.logger)
45
54
  update_databags(Gogetit.config, Gogetit.logger)
46
55
  end
47
- Gogetit.config[:default][:user] ||= ENV['USER']
48
- puts "ssh #{Gogetit.config[:default][:user]}@#{name}"
49
56
  end
50
57
 
51
58
  desc 'destroy NAME', 'Destroy either a container or KVM domain.'
@@ -64,7 +71,7 @@ module Gogetit
64
71
  end
65
72
  end
66
73
  # post-tasks
67
- if options[:chef]
74
+ if options['chef']
68
75
  knife_remove(name, Gogetit.logger) if options[:chef]
69
76
  update_databags(Gogetit.config, Gogetit.logger)
70
77
  end
data/lib/gogetit/util.rb CHANGED
@@ -141,32 +141,32 @@ module Gogetit
141
141
  end
142
142
  end
143
143
 
144
- def wait_until_available(fqdn, logger)
144
+ def wait_until_available(ip_or_fqdn, logger)
145
145
  logger.info("Calling <#{__method__.to_s}>")
146
- until ping_available?(fqdn, logger)
146
+ until ping_available?(ip_or_fqdn, logger)
147
147
  logger.info("Calling <#{__method__.to_s}> for ping to be ready..")
148
148
  sleep 3
149
149
  end
150
- logger.info("#{fqdn} is now available to ping..")
150
+ logger.info("#{ip_or_fqdn} is now available to ping..")
151
151
 
152
- until ssh_available?(fqdn, 'ubuntu', logger)
152
+ until ssh_available?(ip_or_fqdn, 'ubuntu', logger)
153
153
  logger.info("Calling <#{__method__.to_s}> for ssh to be ready..")
154
154
  sleep 3
155
155
  end
156
- logger.info("#{fqdn} is now available to ssh..")
156
+ logger.info("#{ip_or_fqdn} is now available to ssh..")
157
157
  end
158
158
 
159
159
  def ping_available?(host, logger)
160
- # host can be both IP and FQDN.
160
+ # host can be both IP and ip_or_fqdn.
161
161
  logger.info("Calling <#{__method__.to_s}> for #{host}")
162
162
  `ping -c 1 -W 1 #{host}`
163
163
  $?.exitstatus == 0
164
164
  end
165
165
 
166
- def ssh_available?(fqdn, user, logger)
166
+ def ssh_available?(ip_or_fqdn, user, logger)
167
167
  logger.info("Calling <#{__method__.to_s}>")
168
168
  begin
169
- Net::SSH.start(fqdn, user).class
169
+ Net::SSH.start(ip_or_fqdn, user).class
170
170
  rescue Exception => e
171
171
  puts e
172
172
  end
@@ -1,3 +1,3 @@
1
1
  module Gogetit
2
- VERSION = "0.5.2"
2
+ VERSION = "0.5.3"
3
3
  end
@@ -59,13 +59,13 @@ module Gogetit
59
59
  if index == 0
60
60
  if iface['vlan']['name'] == 'untagged'
61
61
  nic = {
62
- network: config[:default][:native_bridge],
63
- portgroup: config[:default][:native_bridge]
62
+ network: config[:default][:root_bridge],
63
+ portgroup: config[:default][:root_bridge]
64
64
  }
65
65
  elsif iface['vlan']['name'] != 'untagged'
66
66
  nic = {
67
- network: config[:default][:native_bridge],
68
- portgroup: config[:default][:native_bridge] + '-' + iface['vlan']['vid'].to_s
67
+ network: config[:default][:root_bridge],
68
+ portgroup: config[:default][:root_bridge] + '-' + iface['vlan']['vid'].to_s
69
69
  }
70
70
  end
71
71
  domain[:nic].push(nic)
@@ -75,8 +75,8 @@ module Gogetit
75
75
  # This will not be hit as of now and might be deprecated.
76
76
  if ifaces[0]['vlan']['name'] != 'untagged'
77
77
  nic = {
78
- network: config[:default][:native_bridge],
79
- portgroup: config[:default][:native_bridge] + '-' + iface['vlan']['vid'].to_s
78
+ network: config[:default][:root_bridge],
79
+ portgroup: config[:default][:root_bridge] + '-' + iface['vlan']['vid'].to_s
80
80
  }
81
81
  domain[:nic].push(nic)
82
82
  end
@@ -100,8 +100,8 @@ module Gogetit
100
100
  else
101
101
  domain[:nic] = [
102
102
  {
103
- network: config[:default][:native_bridge],
104
- portgroup: config[:default][:native_bridge]
103
+ network: config[:default][:root_bridge],
104
+ portgroup: config[:default][:root_bridge]
105
105
  }
106
106
  ]
107
107
  end
data/lib/providers/lxd.rb CHANGED
@@ -42,44 +42,77 @@ module Gogetit
42
42
  end
43
43
  end
44
44
 
45
- def generate_args(args, options)
45
+ # to generate 'user.user-data'
46
+ def generate_user_data(args, options)
46
47
  logger.info("Calling <#{__method__.to_s}>")
47
- args[:devices] = {}
48
48
 
49
- ifaces = check_ip_available(options['ipaddresses'], maas, logger)
50
- abort("There is no dns server specified for the gateway network.") \
51
- unless ifaces[0]['dns_servers'][0]
52
- abort("There is no gateway specified for the gateway network.") \
53
- unless ifaces[0]['gateway_ip']
54
- args[:ifaces] = ifaces
55
- args[:config][:'user.network-config'] = {
56
- 'version' => 1,
57
- 'config' => [
58
- {
59
- 'type' => 'nameserver',
60
- 'address' => ifaces[0]['dns_servers'][0]
61
- }
62
- ]
63
- }
49
+ args = {}
50
+ args[:config] = {}
64
51
 
65
- ifaces.each_with_index do |iface,index|
66
- if index == 0
67
- iface_conf = {
68
- 'type' => 'physical',
69
- 'name' => "eth#{index}",
70
- 'subnets' => [
71
- {
72
- 'type' => 'static',
73
- 'ipv4' => true,
74
- 'address' => iface['ip'] + '/' + iface['cidr'].split('/')[1],
75
- 'gateway' => iface['gateway_ip'],
76
- 'mtu' => iface['vlan']['mtu'],
77
- 'control' => 'auto'
78
- }
79
- ]
80
- }
81
- elsif index > 0
82
- if ifaces[0]['vlan']['name'] != 'untagged'
52
+ if options['no-maas']
53
+ args[:config][:'user.user-data'] = \
54
+ YAML.load_file(options['file'])[:config]['user.user-data']
55
+ else
56
+ sshkeys = maas.get_sshkeys
57
+ pkg_repos = maas.get_package_repos
58
+
59
+ args[:config][:'user.user-data'] = { 'ssh_authorized_keys' => [] }
60
+
61
+ sshkeys.each do |key|
62
+ args[:config][:'user.user-data']['ssh_authorized_keys'].push(key['key'])
63
+ end
64
+
65
+ pkg_repos.each do |repo|
66
+ if repo['name'] == 'main_archive'
67
+ args[:config][:'user.user-data']['apt_mirror'] = repo['url']
68
+ end
69
+ end
70
+
71
+ args[:config][:"user.user-data"]['maas'] = true
72
+ end
73
+
74
+ # To disable to update apt database on first boot
75
+ # so chef client can keep doing its job.
76
+ args[:config][:'user.user-data']['package_update'] = false
77
+
78
+ args[:config][:"user.user-data"] = \
79
+ "#cloud-config\n" + YAML.dump(args[:config][:"user.user-data"])[4..-1]
80
+
81
+ return args
82
+ end
83
+
84
+ def generate_network_config(args, options)
85
+ logger.info("Calling <#{__method__.to_s}>")
86
+ if options['no-maas']
87
+ args[:config][:'user.network-config'] = \
88
+ YAML.load_file(options['file'])[:config][:'user.network-config']
89
+
90
+ options['ip_to_access'] = \
91
+ args[:config][:"user.network-config"]['config'][1]['subnets'][0]['address']
92
+ .split('/')[0]
93
+ args[:config][:"user.network-config"] = \
94
+ YAML.dump(args[:config][:"user.network-config"])[4..-1]
95
+
96
+ elsif options['ipaddresses']
97
+ options[:ifaces] = check_ip_available(options['ipaddresses'], maas, logger)
98
+ abort("There is no dns server specified for the gateway network.") \
99
+ unless options[:ifaces][0]['dns_servers'][0]
100
+ abort("There is no gateway specified for the gateway network.") \
101
+ unless options[:ifaces][0]['gateway_ip']
102
+
103
+ args[:config][:'user.network-config'] = {
104
+ 'version' => 1,
105
+ 'config' => [
106
+ {
107
+ 'type' => 'nameserver',
108
+ 'address' => options[:ifaces][0]['dns_servers'][0]
109
+ }
110
+ ]
111
+ }
112
+
113
+ # to generate configuration for [:config][:'user.network-config']['config']
114
+ options[:ifaces].each_with_index do |iface,index|
115
+ if index == 0
83
116
  iface_conf = {
84
117
  'type' => 'physical',
85
118
  'name' => "eth#{index}",
@@ -88,120 +121,102 @@ module Gogetit
88
121
  'type' => 'static',
89
122
  'ipv4' => true,
90
123
  'address' => iface['ip'] + '/' + iface['cidr'].split('/')[1],
124
+ 'gateway' => iface['gateway_ip'],
91
125
  'mtu' => iface['vlan']['mtu'],
92
126
  'control' => 'auto'
93
127
  }
94
128
  ]
95
129
  }
96
- elsif ifaces[0]['vlan']['name'] == 'untagged'
97
- iface_conf = {
98
- 'type' => 'vlan',
99
- 'name' => "eth0.#{iface['vlan']['vid'].to_s}",
100
- 'vlan_id' => iface['vlan']['vid'].to_s,
101
- 'vlan_link' => 'eth0',
102
- 'subnets' => [
103
- {
104
- 'type' => 'static',
105
- 'ipv4' => true,
106
- 'address' => iface['ip'] + '/' + iface['cidr'].split('/')[1],
107
- 'mtu' => iface['vlan']['mtu'],
108
- 'control' => 'auto'
109
- }
110
- ]
111
- }
130
+ elsif index > 0
131
+ if options[:ifaces][0]['vlan']['name'] != 'untagged'
132
+ iface_conf = {
133
+ 'type' => 'physical',
134
+ 'name' => "eth#{index}",
135
+ 'subnets' => [
136
+ {
137
+ 'type' => 'static',
138
+ 'ipv4' => true,
139
+ 'address' => iface['ip'] + '/' + iface['cidr'].split('/')[1],
140
+ 'mtu' => iface['vlan']['mtu'],
141
+ 'control' => 'auto'
142
+ }
143
+ ]
144
+ }
145
+ elsif options[:ifaces][0]['vlan']['name'] == 'untagged'
146
+ iface_conf = {
147
+ 'type' => 'vlan',
148
+ 'name' => "eth0.#{iface['vlan']['vid'].to_s}",
149
+ 'vlan_id' => iface['vlan']['vid'].to_s,
150
+ 'vlan_link' => 'eth0',
151
+ 'subnets' => [
152
+ {
153
+ 'type' => 'static',
154
+ 'ipv4' => true,
155
+ 'address' => iface['ip'] + '/' + iface['cidr'].split('/')[1],
156
+ 'mtu' => iface['vlan']['mtu'],
157
+ 'control' => 'auto'
158
+ }
159
+ ]
160
+ }
161
+ end
112
162
  end
163
+
164
+ args[:config][:'user.network-config']['config'].push(iface_conf)
113
165
  end
114
166
 
115
- args[:config][:'user.network-config']['config'].push(iface_conf)
167
+ args[:config][:"user.network-config"] = \
168
+ YAML.dump(args[:config][:"user.network-config"])[4..-1]
116
169
  end
117
170
 
118
- args[:config][:"user.network-config"] = \
119
- YAML.dump(args[:config][:"user.network-config"])[4..-1]
171
+ return args
172
+ end
120
173
 
121
- # To configure devices
122
- ifaces.each_with_index do |iface,index|
123
- if index == 0
124
- if iface['vlan']['name'] == 'untagged' # or vid == 0
125
- args[:devices][:"eth#{index}"] = {
126
- mtu: iface['vlan']['mtu'].to_s, #This must be string
127
- name: "eth#{index}",
128
- nictype: 'bridged',
129
- parent: config[:default][:native_bridge],
130
- type: 'nic'
131
- }
132
- elsif iface['vlan']['name'] != 'untagged' # or vid != 0
174
+ # To configure devices
175
+ def generate_devices(args, options)
176
+ args[:devices] = {}
177
+
178
+ if options['no-maas']
179
+ args[:devices] = \
180
+ YAML.load_file(options['file'])[:devices]
181
+
182
+ elsif options['ipaddresses']
183
+ options[:ifaces].each_with_index do |iface,index|
184
+ if index == 0
185
+ if iface['vlan']['name'] == 'untagged' # or vid == 0
186
+ args[:devices][:"eth#{index}"] = {
187
+ mtu: iface['vlan']['mtu'].to_s, #This must be string
188
+ name: "eth#{index}",
189
+ nictype: 'bridged',
190
+ parent: config[:default][:root_bridge],
191
+ type: 'nic'
192
+ }
193
+ elsif iface['vlan']['name'] != 'untagged' # or vid != 0
194
+ args[:devices][:"eth#{index}"] = {
195
+ mtu: iface['vlan']['mtu'].to_s, #This must be string
196
+ name: "eth#{index}",
197
+ nictype: 'bridged',
198
+ parent: config[:default][:root_bridge] + "-" + iface['vlan']['vid'].to_s,
199
+ type: 'nic'
200
+ }
201
+ end
202
+ # When options[:ifaces][0]['vlan']['name'] == 'untagged' and index > 0,
203
+ # it does not need to generate more devices
204
+ # since it will configure the IPs with tagged VLANs.
205
+ elsif options[:ifaces][0]['vlan']['name'] != 'untagged'
133
206
  args[:devices][:"eth#{index}"] = {
134
207
  mtu: iface['vlan']['mtu'].to_s, #This must be string
135
208
  name: "eth#{index}",
136
209
  nictype: 'bridged',
137
- parent: config[:default][:native_bridge] + "-" + iface['vlan']['vid'].to_s,
210
+ parent: config[:default][:root_bridge] + "-" + iface['vlan']['vid'].to_s,
138
211
  type: 'nic'
139
212
  }
140
213
  end
141
- # When ifaces[0]['vlan']['name'] == 'untagged' and index > 0,
142
- # it does not need to generate more devices
143
- # since it will configure the IPs with tagged VLANs.
144
- elsif ifaces[0]['vlan']['name'] != 'untagged'
145
- args[:devices][:"eth#{index}"] = {
146
- mtu: iface['vlan']['mtu'].to_s, #This must be string
147
- name: "eth#{index}",
148
- nictype: 'bridged',
149
- parent: config[:default][:native_bridge] + "-" + iface['vlan']['vid'].to_s,
150
- type: 'nic'
151
- }
152
214
  end
153
- end
154
-
155
- return args
156
- end
157
-
158
- def generate_common_args
159
- logger.info("Calling <#{__method__.to_s}>")
160
- args = {}
161
- sshkeys = maas.get_sshkeys
162
- pkg_repos = maas.get_package_repos
163
-
164
- args[:config] = {
165
- 'user.user-data': { 'ssh_authorized_keys' => [] }
166
- }
167
-
168
- sshkeys.each do |key|
169
- args[:config][:'user.user-data']['ssh_authorized_keys'].push(key['key'])
170
- end
171
-
172
- # To disable to update apt database on first boot
173
- # so chef client can keep doing its job.
174
- args[:config][:'user.user-data']['package_update'] = false
175
-
176
- pkg_repos.each do |repo|
177
- if repo['name'] == 'main_archive'
178
- args[:config][:'user.user-data']['apt_mirror'] = repo['url']
179
- end
180
- end
181
-
182
- args[:config][:"user.user-data"] = \
183
- YAML.dump(args[:config][:"user.user-data"])[4..-1]
184
-
185
- args[:config][:"user.user-data"] = "#cloud-config\n" + args[:config][:"user.user-data"]
186
- return args
187
- end
188
-
189
- def create(name, options = {})
190
- logger.info("Calling <#{__method__.to_s}>")
191
- abort("Container or Hostname #{name} already exists!") \
192
- if container_exists?(name) or maas.domain_name_exists?(name)
193
-
194
- args = generate_common_args
195
-
196
- if options['ipaddresses']
197
- args = generate_args(args, options)
198
- elsif options[:vlans]
199
- #check_vlan_available(options[:vlans])
200
215
  else
201
- abort("native_bridge #{config[:default][:native_bridge]} does not exist.") \
202
- unless conn.networks.include? config[:default][:native_bridge]
216
+ abort("root_bridge #{config[:default][:root_bridge]} does not exist.") \
217
+ unless conn.networks.include? config[:default][:root_bridge]
203
218
 
204
- native_bridge_mtu = nil
219
+ root_bridge_mtu = nil
205
220
  # It assumes you only use one fabric as of now,
206
221
  # since there might be more fabrics with each untagged vlans on them,
207
222
  # which might make finding exact mtu fail as following process.
@@ -209,21 +224,72 @@ module Gogetit
209
224
 
210
225
  maas.get_subnets.each do |subnet|
211
226
  if subnet['vlan']['name'] == 'untagged' and subnet['vlan']['fabric'] == default_fabric
212
- native_bridge_mtu = subnet['vlan']['mtu']
227
+ root_bridge_mtu = subnet['vlan']['mtu']
213
228
  break
214
229
  end
215
230
  end
216
231
 
217
232
  args[:devices] = {}
218
233
  args[:devices][:"eth0"] = {
219
- mtu: native_bridge_mtu.to_s, #This must be string
234
+ mtu: root_bridge_mtu.to_s, #This must be string
220
235
  name: 'eth0',
221
236
  nictype: 'bridged',
222
- parent: config[:default][:native_bridge],
237
+ parent: config[:default][:root_bridge],
223
238
  type: 'nic'
224
239
  }
225
240
  end
226
241
 
242
+ return args
243
+ end
244
+
245
+ def reserve_ips(name, options, container)
246
+ # Generate params to reserve IPs
247
+ options[:ifaces].each_with_index do |iface,index|
248
+ if index == 0
249
+ params = {
250
+ 'subnet' => iface['cidr'],
251
+ 'ip' => iface['ip'],
252
+ 'hostname' => name,
253
+ 'mac' => container[:expanded_config][:"volatile.eth#{index}.hwaddr"]
254
+ }
255
+ elsif index > 0
256
+ # if dot, '.', is used as a conjunction instead of '-',
257
+ # it fails ocuring '404 not found'.
258
+ # if under score, '_', is used as a conjunction instead of '-',
259
+ # it breaks MAAS DNS somehow..
260
+ if options[:ifaces][0]['vlan']['name'] == 'untagged'
261
+ params = {
262
+ 'subnet' => iface['cidr'],
263
+ 'ip' => iface['ip'],
264
+ 'hostname' => 'eth0' + '-' + iface['vlan']['vid'].to_s + '-' + name,
265
+ 'mac' => container[:expanded_config][:"volatile.eth0.hwaddr"]
266
+ }
267
+ elsif options[:ifaces][0]['vlan']['name'] != 'untagged'
268
+ params = {
269
+ 'subnet' => iface['cidr'],
270
+ 'ip' => iface['ip'],
271
+ 'hostname' => "eth#{index}" + '-' + name,
272
+ 'mac' => container[:expanded_config][:"volatile.eth#{index}.hwaddr"]
273
+ }
274
+ end
275
+ end
276
+ maas.ipaddresses('reserve', params)
277
+ end
278
+ end
279
+
280
+ def create(name, options = {})
281
+ logger.info("Calling <#{__method__.to_s}>")
282
+
283
+ abort("Container #{name} already exists!") \
284
+ if container_exists?(name)
285
+
286
+ abort("Domain #{name}.#{maas.get_domain} already exists!") \
287
+ if maas.domain_name_exists?(name) unless options['no-maas']
288
+
289
+ args = generate_user_data(args, options)
290
+ args = generate_network_config(args, options)
291
+ args = generate_devices(args, options)
292
+
227
293
  args[:alias] ||= config[:lxd][:default_alias]
228
294
  args[:sync] ||= true
229
295
 
@@ -235,46 +301,28 @@ module Gogetit
235
301
  # Fetch container object again
236
302
  container = conn.container(name)
237
303
 
238
- if options['vlans'] or options['ipaddresses']
239
- # Generate params to reserve IPs
240
- args[:ifaces].each_with_index do |iface,index|
241
- if index == 0
242
- params = {
243
- 'subnet' => iface['cidr'],
244
- 'ip' => iface['ip'],
245
- 'hostname' => name,
246
- 'mac' => container[:expanded_config][:"volatile.eth#{index}.hwaddr"]
247
- }
248
- elsif index > 0
249
- # if dot, '.', is used as a conjunction instead of '-',
250
- # it fails ocuring '404 not found'.
251
- # if under score, '_', is used as a conjunction instead of '-',
252
- # it breaks MAAS DNS somehow..
253
- if args[:ifaces][0]['vlan']['name'] == 'untagged'
254
- params = {
255
- 'subnet' => iface['cidr'],
256
- 'ip' => iface['ip'],
257
- 'hostname' => 'eth0' + '-' + iface['vlan']['vid'].to_s + '-' + name,
258
- 'mac' => container[:expanded_config][:"volatile.eth0.hwaddr"]
259
- }
260
- elsif args[:ifaces][0]['vlan']['name'] != 'untagged'
261
- params = {
262
- 'subnet' => iface['cidr'],
263
- 'ip' => iface['ip'],
264
- 'hostname' => "eth#{index}" + '-' + name,
265
- 'mac' => container[:expanded_config][:"volatile.eth#{index}.hwaddr"]
266
- }
267
- end
268
- end
269
- maas.ipaddresses('reserve', params)
270
- end
271
- end
304
+ reserve_ips(name, options, container) \
305
+ if options['vlans'] or options['ipaddresses'] \
306
+ unless options['no-maas']
272
307
 
273
308
  conn.start_container(name, :sync=>"true")
274
309
 
275
- fqdn = name + '.' + maas.get_domain
276
- wait_until_available(fqdn, logger)
310
+ if options['no-maas']
311
+ ip_or_fqdn = options['ip_to_access']
312
+ else
313
+ ip_or_fqdn = name + '.' + maas.get_domain
314
+ end
315
+
316
+ wait_until_available(ip_or_fqdn, logger)
277
317
  logger.info("#{name} has been created.")
318
+
319
+ config[:default][:user] ||= ENV['USER']
320
+ if options['no-maas']
321
+ puts "ssh #{config[:default][:user]}@#{options['ip_to_access']}"
322
+ else
323
+ puts "ssh #{config[:default][:user]}@#{name}"
324
+ end
325
+
278
326
  true
279
327
  end
280
328
 
@@ -289,31 +337,36 @@ module Gogetit
289
337
  end
290
338
 
291
339
  wait_until_state(name, 'Stopped')
292
- conn.delete_container(name, args)
293
340
 
294
- if container[:config][:"user.network-config"]
295
- net_conf = YAML.load(
296
- container[:config][:"user.network-config"]
297
- )['config']
298
- # To remove DNS configuration
299
- net_conf.shift
300
-
301
- net_conf.each do |nic|
302
- if nic['subnets'][0]['type'] == 'static'
303
- # It assumes we only assign a single subnet on a VLAN.
304
- # Subnets in a VLAN, VLANs in a Fabric
305
- ip = nic['subnets'][0]['address'].split('/')[0]
306
-
307
- if maas.ipaddresses_reserved?(ip)
308
- maas.ipaddresses('release', { 'ip' => ip })
341
+ if YAML.load(container[:config][:"user.user-data"])['maas']
342
+ logger.info("This is a MAAS enabled container.")
343
+ if container[:config][:"user.network-config"]
344
+ net_conf = YAML.load(
345
+ container[:config][:"user.network-config"]
346
+ )['config']
347
+ # To remove DNS configuration
348
+ net_conf.shift
349
+
350
+ net_conf.each do |nic|
351
+ if nic['subnets'][0]['type'] == 'static'
352
+ # It assumes we only assign a single subnet on a VLAN.
353
+ # Subnets in a VLAN, VLANs in a Fabric
354
+ ip = nic['subnets'][0]['address'].split('/')[0]
355
+
356
+ if maas.ipaddresses_reserved?(ip)
357
+ maas.ipaddresses('release', { 'ip' => ip })
358
+ end
309
359
  end
310
360
  end
311
361
  end
362
+
363
+ maas.delete_dns_record(name)
312
364
  end
313
365
 
366
+ conn.delete_container(name, args)
367
+
314
368
  # When multiple static IPs were reserved, it will not delete anything
315
369
  # since they are deleted when releasing the IPs above.
316
- maas.delete_dns_record(name)
317
370
  logger.info("#{name} has been destroyed.")
318
371
  true
319
372
  end
@@ -1,6 +1,6 @@
1
1
  default:
2
2
  user: ubuntu
3
- native_bridge: my_favorite_bridge
3
+ root_bridge: $root_bridge
4
4
  # etcd:
5
5
  # url: http://etcd.example.com:2379
6
6
  # about MAAS
@@ -0,0 +1,56 @@
1
+ ---
2
+ :config:
3
+ :user.network-config:
4
+ version: 1
5
+ config:
6
+ - type: nameserver
7
+ address: $maas_ip
8
+ - type: physical
9
+ name: eth0
10
+ subnets:
11
+ - type: static
12
+ ipv4: true
13
+ address: 192.168.112.10/24
14
+ gateway: 192.168.112.1
15
+ mtu: 8954
16
+ control: auto
17
+ - type: physical
18
+ name: eth1
19
+ subnets:
20
+ - type: static
21
+ ipv4: true
22
+ address: 192.168.113.10/24
23
+ mtu: 8954
24
+ control: auto
25
+ - type: physical
26
+ name: eth2
27
+ subnets:
28
+ - type: static
29
+ ipv4: true
30
+ address: 192.168.114.10/24
31
+ mtu: 8954
32
+ control: auto
33
+ user.user-data:
34
+ ssh_authorized_keys:
35
+ - ssh-rsa blahblah someone1@somewhere1
36
+ - ssh-rsa blahblah someone2@somewhere2
37
+ apt_mirror: http://kr.archive.ubuntu.com/ubuntu
38
+ :devices:
39
+ eth0:
40
+ mtu: "8954"
41
+ name: eth0
42
+ nictype: bridged
43
+ parent: $root_bridge-112
44
+ type: nic
45
+ eth1:
46
+ mtu: "8954"
47
+ name: eth1
48
+ nictype: bridged
49
+ parent: $root_bridge-113
50
+ type: nic
51
+ eth2:
52
+ mtu: "8954"
53
+ name: eth2
54
+ nictype: bridged
55
+ parent: $root_bridge-114
56
+ type: nic
@@ -0,0 +1,48 @@
1
+ ---
2
+ :config:
3
+ :user.network-config:
4
+ version: 1
5
+ config:
6
+ - type: nameserver
7
+ address: $maas_ip
8
+ - type: physical
9
+ name: eth0
10
+ subnets:
11
+ - type: static
12
+ ipv4: true
13
+ address: 192.168.111.10/24
14
+ gateway: 192.168.111.1
15
+ mtu: 8954
16
+ control: auto
17
+ - type: vlan
18
+ name: eth0.112
19
+ vlan_id: '112'
20
+ vlan_link: eth0
21
+ subnets:
22
+ - type: static
23
+ ipv4: true
24
+ address: 192.168.112.10/24
25
+ mtu: 8954
26
+ control: auto
27
+ - type: vlan
28
+ name: eth0.113
29
+ vlan_id: '113'
30
+ vlan_link: eth0
31
+ subnets:
32
+ - type: static
33
+ ipv4: true
34
+ address: 192.168.113.10/24
35
+ mtu: 8954
36
+ control: auto
37
+ user.user-data:
38
+ ssh_authorized_keys:
39
+ - ssh-rsa blahblahblah someone1@somewhere1
40
+ - ssh-rsa blahblahblah someone2@somewhere2
41
+ apt_mirror: http://kr.archive.ubuntu.com/ubuntu
42
+ :devices:
43
+ :eth0:
44
+ :mtu: '8954'
45
+ :name: eth0
46
+ :nictype: bridged
47
+ :parent: $root_bridge
48
+ :type: nic
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.5.2
4
+ version: 0.5.3
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-10-11 00:00:00.000000000 Z
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -217,6 +217,8 @@ files:
217
217
  - lib/providers/lxd.rb
218
218
  - lib/sample_conf/gogetit.yml
219
219
  - lib/sample_conf/lxd_profile.yml
220
+ - lib/sample_conf/lxd_without_maas.yml
221
+ - lib/sample_conf/lxd_without_maas_vlans.yml
220
222
  - lib/template/disk.xml
221
223
  - lib/template/domain.xml
222
224
  - lib/template/nic.xml