d5ed03a5b1194668f2cd10544339b2164ddc9d82
[armband.git] / patches / fuel-library / 0003-Revert-Remove-cobbler-and-use-dhcpd-named-and-tftp.patch
1 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2 : Copyright (c) 2017 Enea AB and others.
3 :
4 : All rights reserved. This program and the accompanying materials
5 : are made available under the terms of the Apache License, Version 2.0
6 : which accompanies this distribution, and is available at
7 : http://www.apache.org/licenses/LICENSE-2.0
8 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
9 From: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
10 Date: Tue, 21 Mar 2017 18:01:31 +0100
11 Subject: [PATCH 2/2] Revert "Remove cobbler and use dhcpd named and tftp"
12
13 This reverts commit 0b5ab4ff80414adad996012b9152de0719888274.
14 ---
15  deployment/puppet/fuel/examples/cobbler.pp         |  79 ++++++++++++-
16  deployment/puppet/fuel/examples/deploy.sh          |   2 +-
17  deployment/puppet/fuel/examples/dhcp-ranges.pp     |  26 +++--
18  deployment/puppet/fuel/examples/hiera.pp           |   9 --
19  deployment/puppet/fuel/examples/host.pp            |   2 +-
20  deployment/puppet/fuel/examples/provision.pp       |  99 ----------------
21  .../parser/functions/create_dnsmasq_dhcp_ranges.rb |  47 ++++++++
22  .../lib/puppet/parser/functions/get_dhcp_ranges.rb |  46 --------
23  .../get_merged_network_metadata_from_yamls.rb      |  20 ----
24  deployment/puppet/fuel/manifests/cobbler.pp        | 130 +++++++++++++++++++++
25  .../puppet/fuel/manifests/dnsmasq/dhcp_range.pp    |  29 +++++
26  deployment/puppet/fuel/manifests/iptables.pp       |   3 +-
27  .../functions/create_dnsmasq_dhcp_ranges_spec.rb   |  70 +++++++++++
28  deployment/puppet/fuel/templates/dhclient.conf.erb |   2 +-
29  deployment/puppet/fuel/templates/dhcpd_ranges.erb  |  21 ----
30  .../puppet/fuel/templates/dnsmasq.dhcp-range.erb   |   7 ++
31  deployment/puppet/fuel/templates/provision.yaml    |   8 --
32  deployment/puppet/fuel/templates/resolv.conf.erb   |   4 +-
33  .../manifests/provision/build_image.pp             |  22 ++--
34  .../lib/puppet/parser/functions/tftp_files.rb      |  22 ----
35  deployment/puppet/provision/manifests/dhcpd.pp     |  54 ---------
36  deployment/puppet/provision/manifests/iptables.pp  |  28 -----
37  deployment/puppet/provision/manifests/named.pp     |  51 --------
38  deployment/puppet/provision/manifests/params.pp    |  36 ------
39  deployment/puppet/provision/manifests/tftp.pp      |  95 ---------------
40  .../puppet/provision/templates/dhcpd.conf.erb      |  69 -----------
41  .../puppet/provision/templates/named.conf.erb      |  32 -----
42  .../puppet/provision/templates/tftp.chain32.erb    |   8 --
43  .../puppet/provision/templates/tftp.default.erb    |  19 ---
44  .../puppet/provision/templates/tftp.xinetd.erb     |  13 ---
45  .../puppet/provision/templates/xinetd.conf.erb     |  17 ---
46  deployment/puppet/provision/templates/zone.erb     |  11 --
47  graphs/provision/tasks.yaml                        |  43 ++++---
48  tests/noop/spec/hosts/master/cobbler_spec.rb       |  79 +++++++++++++
49  tests/noop/spec/hosts/master/dhcp-ranges_spec.rb   |  17 +++
50  tests/noop/spec/hosts/master/host_spec.rb          |   2 +
51  36 files changed, 527 insertions(+), 695 deletions(-)
52  mode change 120000 => 100644 deployment/puppet/fuel/examples/cobbler.pp
53  delete mode 100644 deployment/puppet/fuel/examples/provision.pp
54  create mode 100644 deployment/puppet/fuel/lib/puppet/parser/functions/create_dnsmasq_dhcp_ranges.rb
55  delete mode 100644 deployment/puppet/fuel/lib/puppet/parser/functions/get_dhcp_ranges.rb
56  delete mode 100644 deployment/puppet/fuel/lib/puppet/parser/functions/get_merged_network_metadata_from_yamls.rb
57  create mode 100644 deployment/puppet/fuel/manifests/cobbler.pp
58  create mode 100644 deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp
59  create mode 100644 deployment/puppet/fuel/spec/functions/create_dnsmasq_dhcp_ranges_spec.rb
60  delete mode 100644 deployment/puppet/fuel/templates/dhcpd_ranges.erb
61  create mode 100644 deployment/puppet/fuel/templates/dnsmasq.dhcp-range.erb
62  delete mode 100644 deployment/puppet/fuel/templates/provision.yaml
63  delete mode 100644 deployment/puppet/provision/lib/puppet/parser/functions/tftp_files.rb
64  delete mode 100644 deployment/puppet/provision/manifests/dhcpd.pp
65  delete mode 100644 deployment/puppet/provision/manifests/iptables.pp
66  delete mode 100644 deployment/puppet/provision/manifests/named.pp
67  delete mode 100644 deployment/puppet/provision/manifests/params.pp
68  delete mode 100644 deployment/puppet/provision/manifests/tftp.pp
69  delete mode 100644 deployment/puppet/provision/templates/dhcpd.conf.erb
70  delete mode 100644 deployment/puppet/provision/templates/named.conf.erb
71  delete mode 100644 deployment/puppet/provision/templates/tftp.chain32.erb
72  delete mode 100644 deployment/puppet/provision/templates/tftp.default.erb
73  delete mode 100644 deployment/puppet/provision/templates/tftp.xinetd.erb
74  delete mode 100644 deployment/puppet/provision/templates/xinetd.conf.erb
75  delete mode 100644 deployment/puppet/provision/templates/zone.erb
76  create mode 100644 tests/noop/spec/hosts/master/cobbler_spec.rb
77  create mode 100644 tests/noop/spec/hosts/master/dhcp-ranges_spec.rb
78
79 diff --git a/deployment/puppet/fuel/examples/cobbler.pp b/deployment/puppet/fuel/examples/cobbler.pp
80 deleted file mode 120000
81 index c48bab0..0000000
82 --- a/deployment/puppet/fuel/examples/cobbler.pp
83 +++ /dev/null
84 @@ -1 +0,0 @@
85 -provision.pp
86 \ No newline at end of file
87 diff --git a/deployment/puppet/fuel/examples/cobbler.pp b/deployment/puppet/fuel/examples/cobbler.pp
88 new file mode 100644
89 index 0000000..d409689
90 --- /dev/null
91 +++ b/deployment/puppet/fuel/examples/cobbler.pp
92 @@ -0,0 +1,78 @@
93 +notice('MODULAR: cobbler.pp')
94 +
95 +Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
96 +
97 +$fuel_settings               = parseyaml($astute_settings_yaml)
98 +$admin_network               = $::fuel_settings['ADMIN_NETWORK']
99 +$nailgun_api_url             = "http://${::fuel_settings['ADMIN_NETWORK']['ipaddress']}:8000/api"
100 +$bootstrap_settings          = pick($::fuel_settings['BOOTSTRAP'], {})
101 +$bootstrap_path              = pick($bootstrap_settings['path'], '/var/www/nailgun/bootstraps/active_bootstrap')
102 +$bootstrap_ethdevice_timeout = pick($bootstrap_settings['ethdevice_timeout'], '120')
103 +$dhcp_gw                     = $::fuel_settings['ADMIN_NETWORK']['dhcp_gateway']
104 +$dns_domain                  = $::fuel_settings['DNS_DOMAIN']
105 +$dns_search                  = $::fuel_settings['DNS_SEARCH']
106 +$dns_upstream                = split($::fuel_settings['DNS_UPSTREAM'], ',')
107 +$cobbler_host                = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
108 +
109 +# TODO(mmalchuk): the right way with updated loadyaml function
110 +# $bootstrap_meta = loadyaml("${bootstrap_path}/metadata.yaml", {})
111 +# and remove if else block
112 +$metadata_yaml = file("${bootstrap_path}/metadata.yaml", '/dev/null')
113 +if empty($metadata_yaml) {
114 +  $bootstrap_meta = {}
115 +} else {
116 +  $bootstrap_meta = parseyaml($metadata_yaml)
117 +}
118 +
119 +if $dhcp_gw {
120 +  $dhcp_gateway = $dhcp_gw
121 +}
122 +else {
123 +  $dhcp_gateway = $cobbler_host
124 +}
125 +
126 +class { '::fuel::cobbler':
127 +  cobbler_user                => $::fuel_settings['cobbler']['user'],
128 +  cobbler_password            => $::fuel_settings['cobbler']['password'],
129 +  bootstrap_path              => $bootstrap_path,
130 +  bootstrap_meta              => $bootstrap_meta,
131 +  server                      => $::fuel_settings['ADMIN_NETWORK']['ipaddress'],
132 +  name_server                 => $::fuel_settings['ADMIN_NETWORK']['ipaddress'],
133 +  next_server                 => $::fuel_settings['ADMIN_NETWORK']['ipaddress'],
134 +  mco_user                    => $::fuel_settings['mcollective']['user'],
135 +  mco_pass                    => $::fuel_settings['mcollective']['password'],
136 +  dns_upstream                => $dns_upstream,
137 +  dns_domain                  => $dns_domain,
138 +  dns_search                  => $dns_search,
139 +  dhcp_ipaddress              => $::fuel_settings['ADMIN_NETWORK']['ipaddress'],
140 +  nailgun_api_url             => $nailgun_api_url,
141 +  bootstrap_ethdevice_timeout => $bootstrap_ethdevice_timeout,
142 +} ->
143 +
144 +file { '/etc/resolv.conf':
145 +  content => template('fuel/resolv.conf.erb'),
146 +  owner   => 'root',
147 +  group   => 'root',
148 +  mode    => '0644',
149 +}
150 +
151 +Fuel::Systemd {
152 +  start          => true,
153 +  template_path  => 'fuel/systemd/restart_template.erb',
154 +  config_name    => 'restart.conf',
155 +  service_manage => false,
156 +}
157 +
158 +fuel::systemd { ['httpd', 'cobblerd', 'xinetd'] :}
159 +
160 +fuel::systemd { 'dnsmasq': template_path => 'fuel/systemd/dnsmasq_template.erb' }
161 +
162 +fuel::dnsmasq::dhcp_range {'default':
163 +  dhcp_start_address => $admin_network['dhcp_pool_start'],
164 +  dhcp_end_address   => $admin_network['dhcp_pool_end'],
165 +  dhcp_netmask       => $admin_network['netmask'],
166 +  dhcp_gateway       => $admin_network['dhcp_gateway'],
167 +  next_server        => $admin_network['ipaddress'],
168 +  listen_address     => $admin_network['ipaddress'],
169 +  notify             => Service['dnsmasq'],
170 +}
171 diff --git a/deployment/puppet/fuel/examples/deploy.sh b/deployment/puppet/fuel/examples/deploy.sh
172 index c1b7494..afff4af 100755
173 --- a/deployment/puppet/fuel/examples/deploy.sh
174 +++ b/deployment/puppet/fuel/examples/deploy.sh
175 @@ -17,7 +17,7 @@
176  TASKS="
177  hiera
178  host
179 -provision
180 +cobbler
181  postgresql
182  rabbitmq
183  mcollective
184 diff --git a/deployment/puppet/fuel/examples/dhcp-ranges.pp b/deployment/puppet/fuel/examples/dhcp-ranges.pp
185 index 1209207..7420e1b 100644
186 --- a/deployment/puppet/fuel/examples/dhcp-ranges.pp
187 +++ b/deployment/puppet/fuel/examples/dhcp-ranges.pp
188 @@ -1,12 +1,20 @@
189  notice('MODULAR: dhcp-ranges.pp')
190
191 -$admin_network = hiera('ADMIN_NETWORK')
192 -$next_server = $admin_network['ipaddress']
193 -$domain_name = hiera('DNS_DOMAIN')
194 -$dns_address = $admin_network['ipaddress']
195 -$dhcp_ranges = get_dhcp_ranges(hiera('admin_networks', [{}]))
196 -
197 -file { $::provision::params::dhcpd_conf_extra :
198 -  ensure => present,
199 -  content => template('fuel/dhcpd_ranges.erb'),
200 +$admin_networks = hiera('admin_networks', [{}])
201 +$admin_network  = hiera('ADMIN_NETWORK')
202 +
203 +Fuel::Dnsmasq::Dhcp_range <||> {
204 +  next_server => $admin_network['ipaddress'],
205 +}
206 +
207 +# Ensure dir with purge and recurse to remove configs for
208 +# non-existing (removed) nodegroups and ip ranges
209 +file { '/etc/dnsmasq.d':
210 +  ensure  => 'directory',
211 +  recurse => true,
212 +  purge   => true,
213  }
214 +
215 +# Create admin networks dhcp-range files except for 'default' nodegroup
216 +# by creating Fuel::Dnsmasq::Dhcp_range puppet resources
217 +create_dnsmasq_dhcp_ranges($admin_networks)
218 diff --git a/deployment/puppet/fuel/examples/hiera.pp b/deployment/puppet/fuel/examples/hiera.pp
219 index 58bae50..ca228ae 100644
220 --- a/deployment/puppet/fuel/examples/hiera.pp
221 +++ b/deployment/puppet/fuel/examples/hiera.pp
222 @@ -6,15 +6,12 @@ $data                = [
223    'nodes',
224    'networks',
225    'astute',
226 -  'known_hosts',
227 -  'provision',
228    'common',
229  ]
230  $astute_data_file    = '/etc/fuel/astute.yaml'
231  $hiera_main_config   = '/etc/hiera.yaml'
232  $hiera_puppet_config = '/etc/puppet/hiera.yaml'
233  $hiera_data_file     = "${data_dir}/astute.yaml"
234 -$hiera_data_provision = "${data_dir}/provision.yaml"
235
236  File {
237    owner => 'root',
238 @@ -43,12 +40,6 @@ file { 'hiera_data_astute' :
239    target => $astute_data_file,
240  }
241
242 -file { 'hiera_data_provision' :
243 -  ensure  => present,
244 -  path    => $hiera_data_provision,
245 -  content => template('fuel/provision.yaml'),
246 -}
247 -
248  file { 'hiera_puppet_config' :
249    ensure => 'symlink',
250    path   => $hiera_puppet_config,
251 diff --git a/deployment/puppet/fuel/examples/host.pp b/deployment/puppet/fuel/examples/host.pp
252 index f94d642..f5cfac4 100644
253 --- a/deployment/puppet/fuel/examples/host.pp
254 +++ b/deployment/puppet/fuel/examples/host.pp
255 @@ -9,7 +9,7 @@ $ntp_servers = delete(delete_undef_values([$::fuel_settings['NTP1'],
256    $::fuel_settings['NTP2'], $::fuel_settings['NTP3']]), '')
257
258  # Vars for File['/etc/dhcp/dhclient.conf']
259 -$dns_address = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
260 +$cobbler_host = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
261
262  # Vars for File['/etc/fuel-utils/config']
263  $admin_ip = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
264 diff --git a/deployment/puppet/fuel/examples/provision.pp b/deployment/puppet/fuel/examples/provision.pp
265 deleted file mode 100644
266 index 9b2aa26..0000000
267 --- a/deployment/puppet/fuel/examples/provision.pp
268 +++ /dev/null
269 @@ -1,99 +0,0 @@
270 -notice('MODULAR: provision.pp')
271 -
272 -Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
273 -
274 -$fuel_settings               = parseyaml($astute_settings_yaml)
275 -
276 -$mco_user                    = $::fuel_settings['mcollective']['user']
277 -$mco_pass                    = $::fuel_settings['mcollective']['password']
278 -$dns_address                 = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
279 -$domain_name                 = $::fuel_settings['DNS_DOMAIN']
280 -$dns_search                  = $::fuel_settings['DNS_SEARCH']
281 -$forwarders                  = split($::fuel_settings['DNS_UPSTREAM'], ',')
282 -$start_address               = $::fuel_settings['ADMIN_NETWORK']['dhcp_pool_start']
283 -$end_address                 = $::fuel_settings['ADMIN_NETWORK']['dhcp_pool_end']
284 -$network_mask                = $::fuel_settings['ADMIN_NETWORK']['netmask']
285 -$network_address             = ipcalc_network_by_address_netmask($start_address, $network_mask)
286 -$dhcp_gateway                = $::fuel_settings['ADMIN_NETWORK']['dhcp_gateway']
287 -if $dhcp_gateway {
288 -  $router = $dhcp_gateway
289 -}
290 -else {
291 -  $router = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
292 -}
293 -
294 -$next_server                 = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
295 -
296 -$nailgun_api_url             = "http://${::fuel_settings['ADMIN_NETWORK']['ipaddress']}:8000/api"
297 -$ethdevice_timeout           = hiera('ethdevice_timeout', '120')
298 -
299 -$ddns_key = hiera('ddns_key', 'VyCWe0kutrawqQ2WEFKkAw=')
300 -$ddns_key_algorithm = hiera('ddns_key_algorithm', 'HMAC-MD5')
301 -$ddns_key_name = hiera('ddns_key_name', 'DHCP_UPDATE')
302 -
303 -$bootstrap_menu_label = hiera('bootstrap_menu_label', 'bootstrap')
304 -$bootstrap_kernel_path = hiera('bootstrap_kernel_path', '/images/vmlinuz')
305 -$bootstrap_initrd_path = hiera('bootstrap_initrd_path', '/images/initrd.img')
306 -
307 -$bootstrap_settings = pick($::fuel_settings['BOOTSTRAP'], {})
308 -$bootstrap_path = pick($bootstrap_settings['path'], '/var/www/nailgun/bootstraps/active_bootstrap')
309 -$metadata_yaml = file("${bootstrap_path}/metadata.yaml", '/dev/null')
310 -if empty($metadata_yaml) {
311 -  $bootstrap_meta = {}
312 -} else {
313 -  $bootstrap_meta = parseyaml($metadata_yaml)
314 -}
315 -
316 -$bootstrap_kernel_params = extend_kopts($bootstrap_meta['extend_kopts'], "console=ttyS0,9600 console=tty0 panic=60 ethdevice-timeout=${ethdevice_timeout} boot=live toram components fetch=http://${next_server}:8080/bootstraps/active_bootstrap/root.squashfs biosdevname=0 url=${nailgun_api_url} mco_user=${mco_user} mco_pass=${mco_pass} ip=frommedia")
317 -
318 -
319 -$known_hosts = get_merged_network_metadata_from_yamls()
320 -$chain32_files = tftp_files("/var/lib/tftpboot/pxelinux.cfg", $known_hosts)
321 -
322 -class { "::provision::dhcpd" :
323 -  network_address => ipcalc_network_by_address_netmask($start_address, $network_mask),
324 -  network_mask => $network_mask,
325 -  broadcast_address => $broadcast_address,
326 -  start_address => $start_address,
327 -  end_address => $end_address,
328 -  router => $router,
329 -  next_server => $next_server,
330 -  dns_address => $dns_address,
331 -  domain_name => $domain_name,
332 -  ddns_key => $ddns_key,
333 -  ddns_key_algorithm => $ddns_key_algorithm,
334 -  ddns_key_name => $ddns_key_name,
335 -  known_hosts => $known_hosts,
336 -}
337 -
338 -class { "::provision::tftp" :
339 -  bootstrap_menu_label => $bootstrap_menu_label,
340 -  bootstrap_kernel_path => $bootstrap_kernel_path,
341 -  bootstrap_initrd_path => $bootstrap_initrd_path,
342 -  bootstrap_kernel_params => $bootstrap_kernel_params,
343 -  chain32_files => $chain32_files,
344 -} ->
345 -
346 -file { "/var/lib/tftpboot${bootstrap_kernel_path}" :
347 -  source => "${bootstrap_path}/vmlinuz",
348 -} ->
349 -
350 -file { "/var/lib/tftpboot${bootstrap_initrd_path}" :
351 -  source => "${bootstrap_path}/initrd.img"
352 -}
353 -
354 -class { "::provision::named" :
355 -  domain_name => $domain_name,
356 -  dns_address => $dns_address,
357 -  forwarders => $forwarders,
358 -  ddns_key => $ddns_key,
359 -  ddns_key_algorithm => $ddns_key_algorithm,
360 -  ddns_key_name => $ddns_key_name,
361 -} ->
362 -
363 -file { '/etc/resolv.conf':
364 -  content => template('fuel/resolv.conf.erb'),
365 -  owner   => 'root',
366 -  group   => 'root',
367 -  mode    => '0644',
368 -}
369 diff --git a/deployment/puppet/fuel/lib/puppet/parser/functions/create_dnsmasq_dhcp_ranges.rb b/deployment/puppet/fuel/lib/puppet/parser/functions/create_dnsmasq_dhcp_ranges.rb
370 new file mode 100644
371 index 0000000..a43ba51
372 --- /dev/null
373 +++ b/deployment/puppet/fuel/lib/puppet/parser/functions/create_dnsmasq_dhcp_ranges.rb
374 @@ -0,0 +1,47 @@
375 +require 'ipaddr'
376 +require 'zlib'
377 +
378 +module Puppet::Parser::Functions
379 +  newfunction(:create_dnsmasq_dhcp_ranges, :doc => <<-EOS
380 +Creates fuel::dnsmasq::dhcp_range puppet resources from list of admin networks.
381 +  EOS
382 +) do |args|
383 +    admin_nets = args[0]
384 +    unless admin_nets.is_a?(Array) and admin_nets[0].is_a?(Hash)
385 +      raise(Puppet::ParseError, 'Should pass list of hashes as a parameter')
386 +    end
387 +    admin_nets.each do |net|
388 +      next unless net['ip_ranges'].is_a? Array
389 +      net['ip_ranges'].each do |ip_range|
390 +        # loop through local facts to pull which interface has an IP in the
391 +        # dhcp range so we can properly listen on the interface for dhcp
392 +        # messages
393 +        cidr = IPAddr.new(net['cidr'])
394 +        listen_address = []
395 +        interfaces = lookupvar('interfaces')
396 +        if ! interfaces.nil?
397 +          interfaces.split(',').each do |interface|
398 +            local_address = lookupvar("ipaddress_#{interface}")
399 +            listen_address.push(local_address) if cidr.include?(local_address)
400 +          end
401 +        end
402 +        netmask = IPAddr.new('255.255.255.255').mask(net['cidr'].split('/')[1]).to_s
403 +        print_range = ip_range.join('_')
404 +        resource_name = sprintf("range_%08x", Zlib::crc32("#{print_range}_#{net['cidr']}").to_i)
405 +        range_comment = "# Environment: #{net['cluster_name']}\n# Nodegroup: #{net['node_group_name']}\n# IP range: #{ip_range}"
406 +        dhcp_range_resource = {
407 +          resource_name => {
408 +            'file_header'        => "# Generated automatically by puppet\n#{range_comment}",
409 +            'listen_address'     => listen_address.join(','),
410 +            'dhcp_start_address' => ip_range[0],
411 +            'dhcp_end_address'   => ip_range[1],
412 +            'dhcp_netmask'       => netmask,
413 +            'dhcp_gateway'       => net['gateway'],
414 +          }
415 +        }
416 +        debug("Trying to create fuel::dnsmasq::dhcp_range resource: #{dhcp_range_resource.inspect}")
417 +        function_create_resources(['fuel::dnsmasq::dhcp_range', dhcp_range_resource])
418 +      end
419 +    end
420 +  end
421 +end
422 diff --git a/deployment/puppet/fuel/lib/puppet/parser/functions/get_dhcp_ranges.rb b/deployment/puppet/fuel/lib/puppet/parser/functions/get_dhcp_ranges.rb
423 deleted file mode 100644
424 index 574ae78..0000000
425 --- a/deployment/puppet/fuel/lib/puppet/parser/functions/get_dhcp_ranges.rb
426 +++ /dev/null
427 @@ -1,46 +0,0 @@
428 -require 'ipaddr'
429 -
430 -module Puppet::Parser::Functions
431 -  newfunction(:get_dhcp_ranges, :doc => <<-EOS
432 -Returns a list of dhcp ranges from a list of admin networks.
433 -  EOS
434 -) do |args|
435 -    admin_nets = args[0]
436 -    unless admin_nets.is_a?(Array) and admin_nets[0].is_a?(Hash)
437 -      raise(Puppet::ParseError, 'Should pass list of hashes as a parameter')
438 -    end
439 -    dhcp_ranges = []
440 -    admin_nets.each do |net|
441 -      next unless net['ip_ranges'].is_a? Array
442 -      net['ip_ranges'].each do |ip_range|
443 -        # loop through local facts to pull which interface has an IP in the
444 -        # dhcp range so we can properly listen on the interface for dhcp
445 -        # messages
446 -        cidr = IPAddr.new(net['cidr'])
447 -        listen_address = []
448 -        interfaces = lookupvar('interfaces')
449 -        if ! interfaces.nil?
450 -          interfaces.split(',').each do |interface|
451 -            local_address = lookupvar("ipaddress_#{interface}")
452 -            listen_address.push(local_address) if cidr.include?(local_address)
453 -          end
454 -        end
455 -        netmask = IPAddr.new('255.255.255.255').mask(net['cidr'].split('/')[1]).to_s
456 -        range_comment = "# Environment: #{net['cluster_name']}\n# Nodegroup: #{net['node_group_name']}\n# IP range: #{ip_range}"
457 -        dhcp_range = {
458 -          'comment'        => range_comment,
459 -          'listen_address' => listen_address.join(','),
460 -          'start_address'  => ip_range[0],
461 -          'end_address'    => ip_range[1],
462 -          'netaddr'        => cidr.to_s,
463 -          'netmask'        => netmask,
464 -          'broadcast'      => cidr.to_range.to_a[-1].to_s,
465 -          'gateway'        => net['gateway'],
466 -        }
467 -        debug("Appending dhcp range to the list of ranges: #{dhcp_range.inspect}")
468 -        dhcp_ranges << dhcp_range
469 -      end
470 -    end
471 -    dhcp_ranges
472 -  end
473 -end
474 diff --git a/deployment/puppet/fuel/lib/puppet/parser/functions/get_merged_network_metadata_from_yamls.rb b/deployment/puppet/fuel/lib/puppet/parser/functions/get_merged_network_metadata_from_yamls.rb
475 deleted file mode 100644
476 index 91028c6..0000000
477 --- a/deployment/puppet/fuel/lib/puppet/parser/functions/get_merged_network_metadata_from_yamls.rb
478 +++ /dev/null
479 @@ -1,20 +0,0 @@
480 -module Puppet::Parser::Functions
481 -  newfunction(:get_merged_network_metadata_from_yamls, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
482 -Load a provision data from a set of YAML files for a set of cluster
483 -located in /var/lib/fuel/configs/{CLUSTER_ID}/provision.yaml
484 -
485 -  ENDHEREDOC
486 -    require 'yaml'
487 -    merged_data = {}
488 -    Dir["/var/lib/fuel/configs/*/provision.yaml"].each do |f|
489 -      begin
490 -        data = YAML::load_file(f) || {}
491 -      rescue Exception => e
492 -        warning("Found file #{f} but could not parse it")
493 -        data = {}
494 -      end
495 -      merged_data.merge!(data['network_metadata']['nodes'])
496 -    end
497 -    merged_data
498 -  end
499 -end
500 diff --git a/deployment/puppet/fuel/manifests/cobbler.pp b/deployment/puppet/fuel/manifests/cobbler.pp
501 new file mode 100644
502 index 0000000..ea312da
503 --- /dev/null
504 +++ b/deployment/puppet/fuel/manifests/cobbler.pp
505 @@ -0,0 +1,130 @@
506 +class fuel::cobbler(
507 +  $repo_root                     = $::fuel::params::repo_root,
508 +  $cobbler_user                  = $::fuel::params::cobbler_user,
509 +  $cobbler_password              = $::fuel::params::cobbler_password,
510 +  $bootstrap_path,
511 +  $bootstrap_meta,
512 +  # network interface configuration timeout (in seconds)
513 +  $bootstrap_ethdevice_timeout   = $::fuel::params::bootstrap_ethdevice_timeout,
514 +  $bootstrap_profile             = $::fuel::params::bootstrap_profile,
515 +  $centos_repos                  = $::fuel::params::centos_repos,
516 +  $ks_system_timezone            = $::fuel::params::ks_system_timezone,
517 +  $server                        = $::fuel::params::cobbler_host,
518 +  $name_server                   = $::fuel::params::cobbler_host,
519 +  $next_server                   = $::fuel::params::cobbler_host,
520 +  $dns_upstream                  = $::fuel::params::dns_upstream,
521 +  $dns_domain                    = $::fuel::params::dns_domain,
522 +  $dns_search                    = $::fuel::params::dns_search,
523 +  $mco_user                      = $::fuel::params::mco_user,
524 +  $mco_pass                      = $::fuel::params::mco_password,
525 +  $dhcp_ipaddress                = $::fuel::params::dhcp_ipaddress,
526 +  $nailgun_api_url               = "http://${::fuel::params::nailgun_host}:${::fuel::params::nailgun_port}/api",
527 +  # default password is 'r00tme'
528 +  $ks_encrypted_root_password    = $::fuel::params::ks_encrypted_root_password,
529 +  ) inherits fuel::params {
530 +
531 +  anchor { 'nailgun-cobbler-begin': }
532 +  anchor { 'nailgun-cobbler-end': }
533 +
534 +  Anchor<| title == 'nailgun-cobbler-begin' |> ->
535 +  Class['::cobbler'] ->
536 +  Anchor<| title == 'nailgun-cobbler-end' |>
537 +
538 +  $real_server = $next_server
539 +
540 +  $fence_ssh_source = 'puppet:///modules/fuel/cobbler/fence_ssh.centos7.py'
541 +
542 +  class { '::cobbler':
543 +    server           => $server,
544 +    domain_name      => $domain_name,
545 +    dns_upstream     => $dns_upstream,
546 +    dns_domain       => $dns_domain,
547 +    dns_search       => $dns_search,
548 +    name_server      => $name_server,
549 +    next_server      => $next_server,
550 +    dhcp_ipaddress   => $dhcp_ipaddress,
551 +    cobbler_user     => $cobbler_user,
552 +    cobbler_password => $cobbler_password,
553 +    pxetimeout       => '50'
554 +  }
555 +
556 +  file { '/etc/cobbler/power/fence_ssh.template':
557 +    content => template('fuel/cobbler/fence_ssh.template.erb'),
558 +    owner   => 'root',
559 +    group   => 'root',
560 +    mode    => '0644',
561 +    require => Class['::cobbler::server'],
562 +  }
563 +
564 +  file { '/usr/sbin/fence_ssh':
565 +    source  => $fence_ssh_source,
566 +    owner   => 'root',
567 +    group   => 'root',
568 +    mode    => '0755',
569 +    require => Class['::cobbler::server'],
570 +  }
571 +
572 +  cobbler_distro { 'ubuntu_bootstrap':
573 +    kernel    => "${bootstrap_path}/vmlinuz",
574 +    initrd    => "${bootstrap_path}/initrd.img",
575 +    arch      => 'x86_64',
576 +    breed     => 'ubuntu',
577 +    osversion => 'xenial',
578 +    ksmeta    => '',
579 +    require   => Class['::cobbler::server'],
580 +  }
581 +
582 +  cobbler_profile { 'ubuntu_bootstrap':
583 +    distro    => 'ubuntu_bootstrap',
584 +    menu      => true,
585 +    kickstart => '',
586 +    kopts     => extend_kopts($bootstrap_meta['extend_kopts'], "console=ttyS0,9600 console=tty0 panic=60 ethdevice-timeout=${bootstrap_ethdevice_timeout} boot=live toram components fetch=http://${server}:8080/bootstraps/active_bootstrap/root.squashfs biosdevname=0 url=${nailgun_api_url} mco_user=${mco_user} mco_pass=${mco_pass} ip=frommedia"),
587 +    ksmeta    => '',
588 +    server    => $real_server,
589 +    require   => Cobbler_distro['ubuntu_bootstrap'],
590 +  }
591 +
592 +  exec { 'cobbler_system_add_default':
593 +    command => "cobbler system add --name=default \
594 +    --profile=${bootstrap_profile} --netboot-enabled=True",
595 +    onlyif  => 'test -z `cobbler system find --name=default`',
596 +    require => Cobbler_profile[$bootstrap_profile],
597 +  }
598 +
599 +  exec { 'cobbler_system_edit_default':
600 +    command => "cobbler system edit --name=default \
601 +    --profile=${bootstrap_profile} --netboot-enabled=True",
602 +    unless  => "cobbler system report --name default 2>/dev/null | grep -q -E '^Profile\\s*:\\s*${bootstrap_profile}'",
603 +    require => Cobbler_profile[$bootstrap_profile],
604 +  }
605 +
606 +  exec { 'nailgun_cobbler_sync':
607 +    command     => 'cobbler sync',
608 +    refreshonly => true,
609 +  }
610 +
611 +  Exec['cobbler_system_add_default'] ~> Exec['nailgun_cobbler_sync']
612 +  Exec['cobbler_system_edit_default'] ~> Exec['nailgun_cobbler_sync']
613 +  Cobbler_profile<| |> ~> Exec['nailgun_cobbler_sync']
614 +
615 +  #FIXME(mattymo): move pubkey to astute fact or download it
616 +  exec { 'cp /root/.ssh/id_rsa.pub /etc/cobbler/authorized_keys':
617 +    command => 'cp /root/.ssh/id_rsa.pub /etc/cobbler/authorized_keys',
618 +    creates => '/etc/cobbler/authorized_keys',
619 +    require => Class['::cobbler::server'],
620 +  }
621 +
622 +  file { '/etc/dnsmasq.conf':
623 +    ensure => link,
624 +    target => '/etc/cobbler.dnsmasq.conf',
625 +  }
626 +
627 +  file { ['/var/log/cobbler/anamon',
628 +          '/var/log/cobbler/kicklog',
629 +          '/var/log/cobbler/syslog',
630 +          '/var/log/cobbler/tasks'] :
631 +    ensure  => directory,
632 +    require => Class['::cobbler::server'],
633 +  }
634 +
635 +}
636 diff --git a/deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp b/deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp
637 new file mode 100644
638 index 0000000..a60bac5
639 --- /dev/null
640 +++ b/deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp
641 @@ -0,0 +1,29 @@
642 +#
643 +# fuel::dnsmasq::dhcp_range creates config files in /etc/dnsmasq.d/
644 +#
645 +# [next_server] IP address that will be used as PXE tftp server
646 +# [dhcp_start_address] First address of dhcp range
647 +# [dhcp_end_address] Last address of dhcp range
648 +# [dhcp_netmask] Netmask of the network
649 +# [dhcp_gateway] Gateway address for installed nodes
650 +# [lease_time] DHCP lease time
651 +# [file_header] File header for comments
652 +
653 +define fuel::dnsmasq::dhcp_range(
654 +  $dhcp_start_address = '10.0.0.201',
655 +  $dhcp_end_address   = '10.0.0.254',
656 +  $dhcp_netmask       = '255.255.255.0',
657 +  $dhcp_gateway       = $::ipaddress,
658 +  $listen_address     = $::ipaddress,
659 +  $file_header        = undef,
660 +  $lease_time         = '120m',
661 +  $next_server        = $::ipaddress,
662 +){
663 +  $range_name = $name
664 +  file { "/etc/dnsmasq.d/${name}.conf":
665 +    content => template('fuel/dnsmasq.dhcp-range.erb'),
666 +    owner   => 'root',
667 +    group   => 'root',
668 +    mode    => '0644',
669 +  }
670 +}
671 diff --git a/deployment/puppet/fuel/manifests/iptables.pp b/deployment/puppet/fuel/manifests/iptables.pp
672 index b3ac965..fc0afb7 100644
673 --- a/deployment/puppet/fuel/manifests/iptables.pp
674 +++ b/deployment/puppet/fuel/manifests/iptables.pp
675 @@ -23,7 +23,8 @@ class fuel::iptables (
676    $chain                 = 'INPUT',
677    ) inherits fuel::params {
678
679 -  include ::provision::iptables
680 +  #Enable cobbler's iptables rules even if Cobbler not called
681 +  include ::cobbler::iptables
682
683    firewallchain { 'INPUT:filter:IPv4':
684      ensure => present,
685 diff --git a/deployment/puppet/fuel/spec/functions/create_dnsmasq_dhcp_ranges_spec.rb b/deployment/puppet/fuel/spec/functions/create_dnsmasq_dhcp_ranges_spec.rb
686 new file mode 100644
687 index 0000000..7158984
688 --- /dev/null
689 +++ b/deployment/puppet/fuel/spec/functions/create_dnsmasq_dhcp_ranges_spec.rb
690 @@ -0,0 +1,70 @@
691 +require 'spec_helper'
692 +
693 +describe 'create_dnsmasq_dhcp_ranges' do
694 +
695 +  let(:admin_networks) do
696 +    [
697 +        {"id" => 1,
698 +         "node_group_name" => nil,
699 +         "node_group_id" => nil,
700 +         "cluster_name" => nil,
701 +         "cluster_id" => nil,
702 +         "cidr" => "10.145.0.0/24",
703 +         "gateway" => "10.145.0.2",
704 +         "ip_ranges" => [["10.145.0.3", "10.145.0.250"]],
705 +        },
706 +        {"id" => 2,
707 +         "node_group_name" => "default2",
708 +         "node_group_id" => 22,
709 +         "cluster_name" => "default2",
710 +         "cluster_id" => 2,
711 +         "cidr" => "10.144.0.0/24",
712 +         "gateway" => "10.144.0.5",
713 +         "ip_ranges" => [["10.144.0.10", "10.144.0.254"]],
714 +        },
715 +    ]
716 +  end
717 +
718 +  let(:facts) do
719 +    {
720 +      :interfaces => 'docker0,enp0s3,enp0s4,enp0s5,lo',
721 +      :ipaddress_docker0 => '172.17.0.1',
722 +      :ipaddress_enp0s3  => '10.145.0.2',
723 +      :ipaddress_enp0s4  => '10.144.0.2',
724 +    }
725 +  end
726 +  let(:catalog) do
727 +    lambda { catalogue }
728 +  end
729 +
730 +  it 'refuses String' do
731 +    is_expected.to run.with_params('foo').and_raise_error(Puppet::ParseError, /Should pass list of hashes as a parameter/)
732 +  end
733 +
734 +  it 'accepts empty data' do
735 +    is_expected.to run.with_params([{}])
736 +  end
737 +
738 +  it 'can create dnsmasq dhcp ranges' do
739 +    is_expected.to run.with_params(admin_networks)
740 +    parameters = {
741 +        :file_header=>"# Generated automatically by puppet\n# Environment: \n# Nodegroup: \n# IP range: [\"10.145.0.3\", \"10.145.0.250\"]",
742 +        :listen_address=>'10.145.0.2',
743 +        :dhcp_start_address=>"10.145.0.3",
744 +        :dhcp_end_address=>"10.145.0.250",
745 +        :dhcp_netmask=>"255.255.255.0",
746 +        :dhcp_gateway=>"10.145.0.2",
747 +    }
748 +    expect(catalog).to contain_fuel__dnsmasq__dhcp_range('range_6be3c888').with parameters
749 +    parameters = {
750 +        :file_header=>"# Generated automatically by puppet\n# Environment: default2\n# Nodegroup: default2\n# IP range: [\"10.144.0.10\", \"10.144.0.254\"]",
751 +        :listen_address=>'10.144.0.2',
752 +        :dhcp_start_address=>"10.144.0.10",
753 +        :dhcp_end_address=>"10.144.0.254",
754 +        :dhcp_netmask=>"255.255.255.0",
755 +        :dhcp_gateway=>"10.144.0.5",
756 +    }
757 +    expect(catalog).to contain_fuel__dnsmasq__dhcp_range('range_ff724fd0').with parameters
758 +  end
759 +
760 +end
761 diff --git a/deployment/puppet/fuel/templates/dhclient.conf.erb b/deployment/puppet/fuel/templates/dhclient.conf.erb
762 index 9b54550..d17616c 100644
763 --- a/deployment/puppet/fuel/templates/dhclient.conf.erb
764 +++ b/deployment/puppet/fuel/templates/dhclient.conf.erb
765 @@ -1 +1 @@
766 -prepend domain-name-servers <%= @dns_address %>;
767 +prepend domain-name-servers <%= @cobbler_host %>;
768 diff --git a/deployment/puppet/fuel/templates/dhcpd_ranges.erb b/deployment/puppet/fuel/templates/dhcpd_ranges.erb
769 deleted file mode 100644
770 index d455a95..0000000
771 --- a/deployment/puppet/fuel/templates/dhcpd_ranges.erb
772 +++ /dev/null
773 @@ -1,21 +0,0 @@
774 -<% @dhcp_ranges.each do |range| -%>
775 -
776 -# <%= range['comment'] %>
777 -subnet <%= range['netaddr'] %> netmask <%= range['netmask'] %> {
778 -  range <%= range['start_address'] %> <%= range['end_address'] %>;
779 -  option routers <%= range['gateway'] %>;
780 -  option subnet-mask <%= range['netmask'] %>;
781 -  option broadcast-address <%= range['broadcast'] %>;
782 -  option domain-name-servers <%= @dns_address %>;
783 -  option domain-name "<%= @domain_name %>";
784 -  next-server <%= @next_server %>;
785 -  default-lease-time 7200;
786 -  max-lease-time 7200;
787 -  ddns-hostname = concat("dhcp-",binary-to-ascii(10,8,"-", leased-address));
788 -  class "pxeclients" {
789 -    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
790 -      filename "pxelinux.0";
791 -  }
792 -}
793 -
794 -<% end -%>
795 \ No newline at end of file
796 diff --git a/deployment/puppet/fuel/templates/dnsmasq.dhcp-range.erb b/deployment/puppet/fuel/templates/dnsmasq.dhcp-range.erb
797 new file mode 100644
798 index 0000000..aa41d20
799 --- /dev/null
800 +++ b/deployment/puppet/fuel/templates/dnsmasq.dhcp-range.erb
801 @@ -0,0 +1,7 @@
802 +<% if @file_header %><%= @file_header %><% end %>
803 +<% if @listen_address && !@listen_address.empty? %>listen-address=<%= @listen_address %><% end %>
804 +dhcp-range=<%= @range_name %>,<%= @dhcp_start_address %>,<%= @dhcp_end_address %>,<%= @dhcp_netmask %>,<%= @lease_time %>
805 +dhcp-option=net:<%= @range_name %>,option:router,<%= @dhcp_gateway %>
806 +dhcp-boot=net:<%= @range_name %>,pxelinux.0,boothost,<%= @next_server %>
807 +dhcp-match=set:ipxe,175
808 +dhcp-option-force=tag:ipxe,210,http://<%= @next_server %>/cobbler/boot/
809 diff --git a/deployment/puppet/fuel/templates/provision.yaml b/deployment/puppet/fuel/templates/provision.yaml
810 deleted file mode 100644
811 index 3d5d3c7..0000000
812 --- a/deployment/puppet/fuel/templates/provision.yaml
813 +++ /dev/null
814 @@ -1,8 +0,0 @@
815 ----
816 -ddns_key: VyCWe0kutrawqQ2WEFKkAw==
817 -ddns_key_algorithm: HMAC-MD5
818 -ddns_key_name: DHCP_UPDATE
819 -bootstrap_menu_label: bootstrap
820 -bootstrap_kernel_path: /images/vmlinuz
821 -bootstrap_initrd_path: /images/initrd.img
822 -ethdevice_timeout: 120
823 diff --git a/deployment/puppet/fuel/templates/resolv.conf.erb b/deployment/puppet/fuel/templates/resolv.conf.erb
824 index ceb69d8..4e9541f 100644
825 --- a/deployment/puppet/fuel/templates/resolv.conf.erb
826 +++ b/deployment/puppet/fuel/templates/resolv.conf.erb
827 @@ -1,3 +1,3 @@
828  search <%= @dns_search %>
829 -domain <%= @domain_name %>
830 -nameserver <%= @dns_address %>
831 +domain <%= @dns_domain %>
832 +nameserver <%= @cobbler_host %>
833 diff --git a/deployment/puppet/osnailyfacter/manifests/provision/build_image.pp b/deployment/puppet/osnailyfacter/manifests/provision/build_image.pp
834 index 02fa0f0..3f90aec 100644
835 --- a/deployment/puppet/osnailyfacter/manifests/provision/build_image.pp
836 +++ b/deployment/puppet/osnailyfacter/manifests/provision/build_image.pp
837 @@ -1,7 +1,13 @@
838 -class osnailyfacter::provision::build_image {
839 +class osnailyfacter::provision::build_image(
840 +  $data_file = '/tmp/provision.yaml',
841 +){
842
843 -  $data_file = "/var/lib/fuel/configs/${::cluster_id}/provision.yaml"
844 -  $data = loadyaml($data_file)
845 +  if $data_file == undef {
846 +    $data = loadyaml('/tmp/provision.yaml')
847 +  } else {
848 +    $data = loadyaml($data_file)
849 +  }
850 +  $cluster_id = $data['cluster']['id']
851
852    if $data['ironic']['enabled'] == 'true' {
853      $ironic_packages = [
854 @@ -23,10 +29,10 @@ class osnailyfacter::provision::build_image {
855      ]
856
857      $package_list = join(prefix($ironic_packages, '--package '), ' ')
858 -    $ssh_auth_file = "/var/lib/fuel/keys/${::cluster_id}/ironic/ironic.pub"
859 +    $ssh_auth_file = "/var/lib/fuel/keys/${cluster_id}/ironic/ironic.pub"
860      $ssh_params = "--root-ssh-authorized-file ${ssh_auth_file}"
861
862 -    $out_dir = "/var/www/nailgun/bootstrap/ironic/${::cluster_id}/"
863 +    $out_dir = "/var/www/nailgun/bootstrap/ironic/${cluster_id}/"
864      $out_params = "--output-dir ${out_dir}"
865
866      $extra_params = "--extra-dir /usr/share/ironic-fa-bootstrap-configs/ --no-compress --no-default-extra-dirs --no-default-packages"
867 @@ -35,19 +41,19 @@ class osnailyfacter::provision::build_image {
868      exec { 'generate_image_with_ironic':
869        command => "fuel-bootstrap build ${package_list} ${ssh_params} ${out_params} ${extra_params} ${log_params}",
870        path    => ['/bin', '/usr/bin'],
871 -      unless  => "test -e /var/www/nailgun/bootstrap/ironic/${::cluster_id}/vmlinuz",
872 +      unless  => "test -e /var/www/nailgun/bootstrap/ironic/${cluster_id}/vmlinuz",
873      }
874
875    } else {
876      $build_dir = '--image_build_dir /var/lib/fuel/ibp'
877 -    $log_params = "--log-file /var/log/fuel-agent-env-${::cluster_id}.log"
878 +    $log_params = "--log-file /var/log/fuel-agent-env-${cluster_id}.log"
879      $extra_params = '--data_driver nailgun_build_image'
880
881      exec { 'generate_image_with_fuel':
882        command => "fa_build_image ${build_dir} ${log_params} ${extra_params} --input_data_file ${data_file}",
883        path    => ['/bin', '/usr/bin'],
884        timeout => 1800,
885 -      unless  => "test -e /var/www/nailgun/bootstrap/ironic/${::cluster_id}/vmlinuz",
886 +      unless  => "test -e /var/www/nailgun/bootstrap/ironic/${cluster_id}/vmlinuz",
887      }
888    }
889  }
890 diff --git a/deployment/puppet/provision/lib/puppet/parser/functions/tftp_files.rb b/deployment/puppet/provision/lib/puppet/parser/functions/tftp_files.rb
891 deleted file mode 100644
892 index e05a48b..0000000
893 --- a/deployment/puppet/provision/lib/puppet/parser/functions/tftp_files.rb
894 +++ /dev/null
895 @@ -1,22 +0,0 @@
896 -module Puppet::Parser::Functions
897 -  newfunction(:tftp_files, :type => :rvalue) do |args|
898 -    # args[0] is a path prefix, e.g. /var/lib/tftpboot/pxelinux.cfg
899 -    # args[1] is a dict of hosts
900 -    # node-1:
901 -    #   dhcp_binding_params:
902 -    #     name: node-1
903 -    #     mac:
904 -    #       - aa:bb:cc:dd:ee:ff
905 -    #       - 00:11:22:33:44:55
906 -    #     ip_address: 10.20.0.10
907 -    # result is a list of file names
908 -    # - /var/lib/tftpboot/pxelinux.cfg/01-aa-bb-cc-dd-ee-ff
909 -    # - /var/lib/tftpboot/pxelinux.cfg/01-00-11-22-33-44-55
910 -    files = []
911 -    args[1].each {|host_name, host_data|
912 -      mac = host_data["dhcp_binding_params"]["mac"]
913 -      files << (args[0] + "/01-" + mac.gsub(":", "-"))
914 -    }
915 -    files
916 -  end
917 -end
918 diff --git a/deployment/puppet/provision/manifests/dhcpd.pp b/deployment/puppet/provision/manifests/dhcpd.pp
919 deleted file mode 100644
920 index 6837532..0000000
921 --- a/deployment/puppet/provision/manifests/dhcpd.pp
922 +++ /dev/null
923 @@ -1,54 +0,0 @@
924 -class provision::dhcpd (
925 -  $network_address    = $::provision::params::network_address,
926 -  $network_mask       = $::provision::params::network_mask,
927 -  $broadcast_address  = $::provision::params::broadcast_address,
928 -  $start_address      = $::provision::params::start_address,
929 -  $end_address        = $::provision::params::end_address,
930 -  $router             = $::provision::params::router,
931 -  $next_server        = $::provision::params::next_server,
932 -  $dns_address        = $::provision::params::dns_address,
933 -  $domain_name        = $::provision::params::domain_name,
934 -  $ddns_key           = $::provision::params::ddns_key,
935 -  $ddns_key_algorithm = $::provision::params::ddns_key_algorithm,
936 -  $ddns_key_name      = $::provision::params::ddns_key_name,
937 -  $known_hosts        = [],
938 -) inherits provision::params {
939 -
940 -  package { "dhcpd" :
941 -    name => $::provision::params::dhcpd_package,
942 -  }
943 -
944 -  file { $::provision::params::dhcpd_conf :
945 -    ensure  => present,
946 -    content => template('provision/dhcpd.conf.erb'),
947 -    owner   => 'dhcpd',
948 -    group   => 'dhcpd',
949 -    mode    => '0640',
950 -    require => Package["dhcpd"],
951 -    notify  => Service["dhcpd"],
952 -  }
953 -
954 -  file { $::provision::params::dhcpd_conf_d :
955 -    ensure => directory,
956 -    owner  => 'root',
957 -    group  => 'root',
958 -    mode   => '0755',
959 -    require => Package["dhcpd"],
960 -  }
961 -
962 -  # It is just a file that could be modified by other modules
963 -  file { $::provision::params::dhcpd_conf_extra :
964 -    ensure => present,
965 -    require => File[$::provision::params::dhcpd_conf_d],
966 -  }
967 -
968 -  service { "dhcpd" :
969 -    name => $::provision::params::dhcpd_service,
970 -    ensure  => running,
971 -    enable  => true,
972 -    hasrestart => false,
973 -    hasstatus => false,
974 -    require => Package["dhcpd"],
975 -  }
976 -
977 -}
978 diff --git a/deployment/puppet/provision/manifests/iptables.pp b/deployment/puppet/provision/manifests/iptables.pp
979 deleted file mode 100644
980 index f5aec5b..0000000
981 --- a/deployment/puppet/provision/manifests/iptables.pp
982 +++ /dev/null
983 @@ -1,28 +0,0 @@
984 -class provision::iptables {
985 -
986 -  firewall { '101 dns_tcp':
987 -    chain  => INPUT,
988 -    dport  => '53',
989 -    proto  => 'tcp',
990 -    action => 'accept',
991 -  }
992 -  firewall { '102 dns_udp':
993 -    chain  => INPUT,
994 -    dport  => '53',
995 -    proto  => 'udp',
996 -    action => 'accept',
997 -  }
998 -  firewall { '103 dhcp':
999 -    chain  => INPUT,
1000 -    dport  => ['67','68'],
1001 -    proto  => 'udp',
1002 -    action => 'accept',
1003 -  }
1004 -  firewall { '104 tftp':
1005 -    chain  => INPUT,
1006 -    dport  => '69',
1007 -    proto  => 'udp',
1008 -    action => 'accept',
1009 -  }
1010 -
1011 -}
1012 diff --git a/deployment/puppet/provision/manifests/named.pp b/deployment/puppet/provision/manifests/named.pp
1013 deleted file mode 100644
1014 index ee940c9..0000000
1015 --- a/deployment/puppet/provision/manifests/named.pp
1016 +++ /dev/null
1017 @@ -1,51 +0,0 @@
1018 -class provision::named (
1019 -  $domain_name        = $::provision::params::domain_name,
1020 -  $dns_address        = $::provision::params::dns_address,
1021 -  $forwarders         = $::provision::params::forwarders,
1022 -  $ddns_key           = $::provision::params::ddns_key,
1023 -  $ddns_key_algorithm = $::provision::params::ddns_key_algorithm,
1024 -  $ddns_key_name      = $::provision::params::ddns_key_name,
1025 -) inherits provision::params {
1026 -
1027 -  package { "named" :
1028 -    name => $::provision::params::named_package,
1029 -  }
1030 -
1031 -  file { "/var/named" :
1032 -    ensure => directory,
1033 -    owner => 'named',
1034 -    group => 'named',
1035 -    mode => '0750',
1036 -    require => Package["named"],
1037 -  }
1038 -
1039 -  file { $::provision::params::named_conf :
1040 -    ensure  => present,
1041 -    content => template('provision/named.conf.erb'),
1042 -    owner   => 'named',
1043 -    group   => 'named',
1044 -    mode    => '0640',
1045 -    require => Package["named"],
1046 -    notify  => Service["named"],
1047 -  }
1048 -
1049 -  file { "/var/named/${domain_name}" :
1050 -    ensure  => present,
1051 -    content => template('provision/zone.erb'),
1052 -    owner   => 'named',
1053 -    group   => 'named',
1054 -    mode    => '0644',
1055 -    require => Package["named"],
1056 -    notify  => Service["named"],
1057 -  }
1058 -
1059 -  service { "named" :
1060 -    name    => $::provision::params::named_service,
1061 -    ensure  => running,
1062 -    enable  => true,
1063 -    hasrestart => false,
1064 -    hasstatus => false,
1065 -    require => Package["named"],
1066 -  }
1067 -
1068 -}
1069 diff --git a/deployment/puppet/provision/manifests/params.pp b/deployment/puppet/provision/manifests/params.pp
1070 deleted file mode 100644
1071 index 2bcae12..0000000
1072 --- a/deployment/puppet/provision/manifests/params.pp
1073 +++ /dev/null
1074 @@ -1,36 +0,0 @@
1075 -class provision::params {
1076 -  case $::osfamily {
1077 -    'RedHat': {
1078 -      $dhcpd_package    = "dhcp"
1079 -      $dhcpd_service    = "dhcpd"
1080 -      $dhcpd_conf       = "/etc/dhcp/dhcpd.conf"
1081 -      $dhcpd_conf_d     = "/etc/dhcp/dhcpd.d"
1082 -      $dhcpd_conf_extra = "/etc/dhcp/dhcpd.d/extra.conf"
1083 -      $named_package    = "bind"
1084 -      $named_service    = "named"
1085 -      $named_conf       = "/etc/named.conf"
1086 -    }
1087 -    default: {
1088 -      fail("Unsupported osfamily ${::osfamily}")
1089 -    }
1090 -  }
1091 -  $network_address = "10.20.0.0"
1092 -  $network_mask = "255.255.255.0"
1093 -  $broadcast_address = "10.20.0.255"
1094 -  $start_address = "10.20.0.3"
1095 -  $end_address = "10.20.0.254"
1096 -  $router = "10.20.0.1"
1097 -  $next_server = "10.20.0.2"
1098 -  $dns_address = "10.20.0.2"
1099 -  $forwarders = ["8.8.8.8", "8.8.4.4"]
1100 -  $domain_name = "domain.tld"
1101 -  $ddns_key = "VyCWe0kutrawqQ2WEFKkAw=="
1102 -  $ddns_key_algorithm = "HMAC-MD5"
1103 -  $ddns_key_name = "DHCP_UPDATE"
1104 -
1105 -  $bootstrap_kernel_path = "/images/ubuntu_bootstrap/vmlinuz"
1106 -  $bootstrap_initrd_path = "/images/ubuntu_bootstrap/initrd.img"
1107 -  $bootstrap_kernel_params = "ksdevice=bootif lang= console=ttyS0,9600 console=tty0 toram locale=en_US text boot=live biosdevname=0 components ip=frommedia ethdevice-timeout=120 net.ifnames=1 panic=60"
1108 -  $bootstrap_menu_label = "ubuntu_bootstrap"
1109 -
1110 -}
1111 diff --git a/deployment/puppet/provision/manifests/tftp.pp b/deployment/puppet/provision/manifests/tftp.pp
1112 deleted file mode 100644
1113 index f05bd16..0000000
1114 --- a/deployment/puppet/provision/manifests/tftp.pp
1115 +++ /dev/null
1116 @@ -1,95 +0,0 @@
1117 -class provision::tftp (
1118 -  $bootstrap_kernel_params = $::provision::params::bootstrap_kernel_params,
1119 -  $bootstrap_kernel_path = $::provision::params::bootstrap_kernel_path,
1120 -  $bootstrap_initrd_path = $::provision::params::bootstrap_initrd_path,
1121 -  $bootstrap_menu_label = $::provision::params::bootstrap_menu_label,
1122 -  $chain32_files = [],
1123 -) inherits provision::params {
1124 -
1125 -  Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
1126 -
1127 -  case $::osfamily {
1128 -    'RedHat': {
1129 -      $tftp_packages = ['xinetd', 'tftp-server', 'syslinux']
1130 -
1131 -      service { 'xinetd':
1132 -        ensure     => running,
1133 -        enable     => true,
1134 -        hasrestart => true,
1135 -        require    => Package[$tftp_packages],
1136 -      }
1137 -
1138 -      file { '/etc/xinetd.conf':
1139 -        content => template('provision/xinetd.conf.erb'),
1140 -        owner   => 'root',
1141 -        group   => 'root',
1142 -        mode    => '0600',
1143 -        require => Package[$tftp_packages],
1144 -        notify  => Service['xinetd'],
1145 -      }
1146 -
1147 -      file { '/etc/xinetd.d/tftp' :
1148 -        content => template('provision/tftp.xinetd.erb'),
1149 -        owner   => 'root',
1150 -        group   => 'root',
1151 -        mode    => '0644',
1152 -        require => Package[$tftp_packages],
1153 -        notify  => Service['xinetd'],
1154 -      }
1155 -
1156 -    }
1157 -    default : {
1158 -      fail("Unsupported osfamily ${::osfamily}")
1159 -    }
1160 -  }
1161 -
1162 -  ensure_packages($tftp_packages)
1163 -
1164 -  file { ["/var/lib/tftpboot/images", "/var/lib/tftpboot/pxelinux.cfg"] :
1165 -    ensure => directory,
1166 -    owner => 'root',
1167 -    group => 'root',
1168 -    mode => '0755',
1169 -    require => Package[$tftp_packages],
1170 -  }
1171 -
1172 -  file { "/var/lib/tftpboot/pxelinux.cfg/default" :
1173 -    ensure => present,
1174 -    content => template("provision/tftp.default.erb"),
1175 -    owner => 'root',
1176 -    group => 'root',
1177 -    mode => '0644',
1178 -    require => File["/var/lib/tftpboot/pxelinux.cfg"],
1179 -  }
1180 -
1181 -  file { '/var/lib/tftpboot/chain.c32':
1182 -    source => '/usr/share/syslinux/chain.c32',
1183 -    require => Package[$tftp_packages],
1184 -  }
1185 -
1186 -  file { '/var/lib/tftpboot/pxelinux.0':
1187 -    source => '/usr/share/syslinux/pxelinux.0',
1188 -    require => Package[$tftp_packages],
1189 -  }
1190 -
1191 -  file { '/var/lib/tftpboot/menu.c32':
1192 -    source => '/usr/share/syslinux/menu.c32',
1193 -    require => Package[$tftp_packages],
1194 -  }
1195 -
1196 -  # TODO Create custom type that will remove all 01-* files that
1197 -  # are not in the $chain32_files list
1198 -  exec { 'remove /var/lib/tftpboot/pxelinux.cfg/01-* files' :
1199 -    command => "find /var/lib/tftpboot/pxelinux.cfg -type f -name '01-*' -delete",
1200 -    require => File["/var/lib/tftpboot/pxelinux.cfg"],
1201 -  } ->
1202 -
1203 -  file { $chain32_files :
1204 -    ensure => present,
1205 -    content => template("provision/tftp.chain32.erb"),
1206 -    owner => 'root',
1207 -    group => 'root',
1208 -    mode => '0644',
1209 -    require => File["/var/lib/tftpboot/pxelinux.cfg"],
1210 -  }
1211 -}
1212 diff --git a/deployment/puppet/provision/templates/dhcpd.conf.erb b/deployment/puppet/provision/templates/dhcpd.conf.erb
1213 deleted file mode 100644
1214 index 8120dc1..0000000
1215 --- a/deployment/puppet/provision/templates/dhcpd.conf.erb
1216 +++ /dev/null
1217 @@ -1,69 +0,0 @@
1218 -ddns-updates on;
1219 -update-static-leases on;
1220 -ddns-domainname "<%= @domain_name %>";
1221 -ddns-update-style interim;
1222 -ignore client-updates;
1223 -update-static-leases true;
1224 -
1225 -key <%= @ddns_key_name %> {
1226 -  algorithm <%= @ddns_key_algorithm %>;
1227 -  secret <%= @ddns_key %>;
1228 -}
1229 -
1230 -local-address <%= @dns_address %>;
1231 -zone <%= @domain_name %>. {
1232 -  primary <%= @dns_address %>;
1233 -  key <%= @ddns_key_name %>;
1234 -}
1235 -
1236 -allow booting;
1237 -allow bootp;
1238 -set vendorclass = option vendor-class-identifier;
1239 -option pxe-system-type code 93 = unsigned integer 16;
1240 -default-lease-time 3600;
1241 -max-lease-time 3600;
1242 -log-facility local7;
1243 -
1244 -subnet <%= @network_address %> netmask <%= @network_mask %> {
1245 -  range <%= @start_address %> <%= @end_address %>;
1246 -  option domain-name-servers <%= @dns_address %>;
1247 -  option domain-name "<%= @domain_name %>";
1248 -  option subnet-mask <%= @network_mask %>;
1249 -  option routers <%= @router %>;
1250 -  option broadcast-address <%= @broadcast_address %>;
1251 -  next-server <%= @next_server %>;
1252 -  ddns-hostname = pick(option fqdn.hostname,option host-name, concat("dhcp-",binary-to-ascii(10,8,"-", leased-address)));
1253 -  class "pxeclients" {
1254 -    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
1255 -      filename "pxelinux.0";
1256 -  }
1257 -}
1258 -
1259 -<% if @known_hosts -%>
1260 -group {
1261 -
1262 -  option domain-name-servers <%= @dns_address %>;
1263 -  option domain-name "<%= @domain_name %>";
1264 -  option subnet-mask <%= @network_mask %>;
1265 -  option routers <%= @router %>;
1266 -  option broadcast-address <%= @broadcast_address %>;
1267 -  next-server <%= @next_server %>;
1268 -  class "pxeclients" {
1269 -    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
1270 -      filename "pxelinux.0";
1271 -  }
1272 -
1273 -  <% @known_hosts.each do |host_name, host_data| -%>
1274 -  host <%= host_data['dhcp_binding_params']['name'] %> {
1275 -    hardware ethernet <%= host_data['dhcp_binding_params']['mac'] %>;
1276 -    fixed-address <%= host_data['dhcp_binding_params']['ip_address'] %>;
1277 -    ddns-hostname "<%= host_data['dhcp_binding_params']['name'].split('.')[0] %>";
1278 -    ddns-domainname "<%= @domain_name%>";
1279 -    option host-name "<%= host_data['dhcp_binding_params']['name'].split('.')[0] %>";
1280 -    option domain-name "<%= @domain_name %>";
1281 -  }
1282 -  <% end -%>
1283 -}
1284 -<% end -%>
1285 -
1286 -include "<%= scope.lookupvar('::provision::params::dhcpd_conf_extra') %>";
1287 diff --git a/deployment/puppet/provision/templates/named.conf.erb b/deployment/puppet/provision/templates/named.conf.erb
1288 deleted file mode 100644
1289 index f612204..0000000
1290 --- a/deployment/puppet/provision/templates/named.conf.erb
1291 +++ /dev/null
1292 @@ -1,32 +0,0 @@
1293 -options {
1294 -  listen-on port 53 { <%= @dns_address %>; };
1295 -  directory       "/var/named";
1296 -  dump-file       "/var/named/data/cache_dump.db";
1297 -  statistics-file "/var/named/data/named_stats.txt";
1298 -  memstatistics-file "/var/named/data/named_mem_stats.txt";
1299 -  recursion yes;
1300 -  forward only;
1301 -  forwarders {
1302 -    <% @forwarders.each do |forwarder| -%>
1303 -    <%= forwarder %>;
1304 -    <% end -%>
1305 -  };
1306 -};
1307 -
1308 -key <%= @ddns_key_name %> {
1309 -  algorithm <%= @ddns_key_algorithm %>;
1310 -  secret <%= @ddns_key %>;
1311 -};
1312 -
1313 -logging {
1314 -  channel default_debug {
1315 -    file "data/named.run";
1316 -    severity dynamic;
1317 -  };
1318 -};
1319 -
1320 -zone "<%= @domain_name %>." {
1321 -  type master;
1322 -  file "<%= @domain_name %>";
1323 -  allow-update { key <%= @ddns_key_name %>; };
1324 -};
1325 diff --git a/deployment/puppet/provision/templates/tftp.chain32.erb b/deployment/puppet/provision/templates/tftp.chain32.erb
1326 deleted file mode 100644
1327 index fae5e43..0000000
1328 --- a/deployment/puppet/provision/templates/tftp.chain32.erb
1329 +++ /dev/null
1330 @@ -1,8 +0,0 @@
1331 -DEFAULT local
1332 -PROMPT 0
1333 -TIMEOUT 0
1334 -TOTALTIMEOUT 0
1335 -ONTIMEOUT local
1336 -
1337 -LABEL local
1338 -    COM32 chain.c32
1339 diff --git a/deployment/puppet/provision/templates/tftp.default.erb b/deployment/puppet/provision/templates/tftp.default.erb
1340 deleted file mode 100644
1341 index e1cee87..0000000
1342 --- a/deployment/puppet/provision/templates/tftp.default.erb
1343 +++ /dev/null
1344 @@ -1,19 +0,0 @@
1345 -DEFAULT menu
1346 -PROMPT 0
1347 -MENU TITLE Boot menu
1348 -TIMEOUT 50
1349 -TOTALTIMEOUT 0
1350 -ONTIMEOUT <%= @bootstrap_menu_label %>
1351 -
1352 -LABEL local
1353 -        MENU LABEL (local)
1354 -        MENU DEFAULT
1355 -        LOCALBOOT -1
1356 -
1357 -LABEL <%= @bootstrap_menu_label %>
1358 -        kernel <%= @bootstrap_kernel_path %>
1359 -        MENU LABEL <%= @bootstrap_menu_label %>
1360 -        append initrd=<%= @bootstrap_initrd_path %> <%= @bootstrap_kernel_params %>
1361 -        ipappend 2
1362 -
1363 -MENU end
1364 diff --git a/deployment/puppet/provision/templates/tftp.xinetd.erb b/deployment/puppet/provision/templates/tftp.xinetd.erb
1365 deleted file mode 100644
1366 index bde8373..0000000
1367 --- a/deployment/puppet/provision/templates/tftp.xinetd.erb
1368 +++ /dev/null
1369 @@ -1,13 +0,0 @@
1370 -service tftp
1371 -{
1372 -        disable                 = no
1373 -        socket_type             = dgram
1374 -        protocol                = udp
1375 -        wait                    = yes
1376 -        user                    = root
1377 -        server                  = /usr/sbin/in.tftpd
1378 -        server_args             = -B 1380 -v -s /var/lib/tftpboot
1379 -        per_source              = 11
1380 -        cps                     = 100 2
1381 -        flags                   = IPv4
1382 -}
1383 diff --git a/deployment/puppet/provision/templates/xinetd.conf.erb b/deployment/puppet/provision/templates/xinetd.conf.erb
1384 deleted file mode 100644
1385 index 0a90f33..0000000
1386 --- a/deployment/puppet/provision/templates/xinetd.conf.erb
1387 +++ /dev/null
1388 @@ -1,17 +0,0 @@
1389 -defaults
1390 -{
1391 -    log_type = SYSLOG daemon info
1392 -    log_on_failure = HOST
1393 -    log_on_success = PID HOST DURATION EXIT
1394 -
1395 -    cps        = 50 10
1396 -    instances = 50
1397 -    per_source = 10
1398 -
1399 -    v6only = no
1400 -
1401 -    groups = yes
1402 -    umask  = 002
1403 -}
1404 -
1405 -includedir /etc/xinetd.d
1406 diff --git a/deployment/puppet/provision/templates/zone.erb b/deployment/puppet/provision/templates/zone.erb
1407 deleted file mode 100644
1408 index ea1b87a..0000000
1409 --- a/deployment/puppet/provision/templates/zone.erb
1410 +++ /dev/null
1411 @@ -1,11 +0,0 @@
1412 -$TTL 300
1413 -@                       IN      SOA     ns.<%= @domain_name %>. nobody.<%= @domain_name %>. (
1414 -                                        2017021302   ; Serial
1415 -                                        600         ; Refresh
1416 -                                        1800         ; Retry
1417 -                                        604800       ; Expire
1418 -                                        300          ; TTL
1419 -                                        )
1420 -
1421 -                        IN      NS      ns.<%= @domain_name %>.
1422 -ns                      IN      A       <%= @dns_address %>
1423 diff --git a/graphs/provision/tasks.yaml b/graphs/provision/tasks.yaml
1424 index 3a21c87..68716ce 100644
1425 --- a/graphs/provision/tasks.yaml
1426 +++ b/graphs/provision/tasks.yaml
1427 @@ -14,7 +14,7 @@
1428    requires: [provision_start]
1429    required_for: [build_deploy_image]
1430    parameters:
1431 -    path: /var/lib/fuel/configs/{CLUSTER_ID}/provision.yaml
1432 +    path: /tmp/provision.yaml
1433      timeout: 180
1434      data:
1435        #TODO: Replace dict($.items) to $ when LP1666913 is fixed
1436 @@ -40,27 +40,31 @@
1437    requires: [upload_provision_info_master, generate_ironic_bootstrap_keys]
1438    required_for: [provision_end]
1439    parameters:
1440 -    command_prefix: FACTER_cluster_id={CLUSTER_ID}
1441      puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/provision/build_image.pp
1442      puppet_modules: /etc/puppet/modules
1443      timeout: 3600
1444
1445 -- id: provision_master
1446 -  type: puppet
1447 +- id: move_to_bootstrap
1448 +  type: move_to_bootstrap
1449    version: 2.1.0
1450 -  role: ['master']
1451 -  requires: [upload_provision_info_master]
1452 -  required_for: [build_deploy_image]
1453 +  role: ['/.*/']
1454 +  requires: [provision_start, build_deploy_image]
1455 +  required_for: [upload_provision_info]
1456 +  cross-depends:
1457 +    - name: build_deploy_image
1458 +      role: master
1459    parameters:
1460 -    puppet_manifest: /etc/puppet/modules/fuel/examples/provision.pp
1461 -    puppet_modules: /etc/puppet/modules
1462 -    timeout: 3600
1463 +    slave_name:
1464 +      yaql_exp: '$.network_metadata.nodes.values().where($.uid = new($.uid)).name.first()'
1465 +    provisioning_info:
1466 +      yaql_exp: '$.provision'
1467 +    timeout: 180
1468
1469  - id: upload_provision_info
1470    type: upload_file
1471    version: 2.1.0
1472    role: ['/.*/']
1473 -  requires: [provision_master]
1474 +  requires: [move_to_bootstrap]
1475    required_for: [system_provision]
1476    parameters:
1477      path: /tmp/provision.json
1478 @@ -72,8 +76,8 @@
1479    type: shell
1480    version: 2.1.0
1481    role: ['/.*/']
1482 -  requires: [provision_master, upload_provision_info]
1483 -  required_for: [node_reboot]
1484 +  requires: [move_to_bootstrap, upload_provision_info]
1485 +  required_for: [cobbler_disable_netboot]
1486    cross-depends:
1487      - name: build_deploy_image
1488        role: master
1489 @@ -81,6 +85,19 @@
1490      cmd: /usr/bin/provision
1491      timeout: 3600
1492
1493 +- id: cobbler_disable_netboot
1494 +  type: master_shell
1495 +  version: 2.1.0
1496 +  role: ['/.*/']
1497 +  requires: [system_provision]
1498 +  required_for: [node_reboot]
1499 +  parameters:
1500 +    strategy:
1501 +      type: one_by_one
1502 +    cmd:
1503 +      yaql_exp: 'concat("sh /etc/puppet/modules/osnailyfacter/modular/provision/netboot disable ", $.provision.name)'
1504 +    timeout: 180
1505 +
1506  - id: node_reboot
1507    type: reboot
1508    version: 2.1.0
1509 diff --git a/tests/noop/spec/hosts/master/cobbler_spec.rb b/tests/noop/spec/hosts/master/cobbler_spec.rb
1510 new file mode 100644
1511 index 0000000..f7c36fb
1512 --- /dev/null
1513 +++ b/tests/noop/spec/hosts/master/cobbler_spec.rb
1514 @@ -0,0 +1,79 @@
1515 +require 'spec_helper'
1516 +require 'shared-examples'
1517 +require 'yaml'
1518 +manifest = 'master/cobbler.pp'
1519 +
1520 +# HIERA: master
1521 +# FACTS: master_centos7
1522 +
1523 +describe manifest do
1524 +  shared_examples 'catalog' do
1525 +    let(:fuel_settings) do
1526 +      YAML.load facts[:astute_settings_yaml]
1527 +    end
1528 +
1529 +    let(:bootstrap_settings) do
1530 +      fuel_settings.fetch 'BOOTSTRAP', {}
1531 +    end
1532 +
1533 +    it 'should contain class "fuel::cobbler" with correct parameters' do
1534 +      parameters = {
1535 +          :cobbler_user                => fuel_settings['cobbler']['user'],
1536 +          :cobbler_password            => fuel_settings['cobbler']['password'],
1537 +          :bootstrap_path              => bootstrap_settings.fetch('path', '/var/www/nailgun/bootstraps/active_bootstrap'),
1538 +          # :bootstrap_meta              => nil,
1539 +          :server                      => fuel_settings['ADMIN_NETWORK']['ipaddress'],
1540 +          :name_server                 => fuel_settings['ADMIN_NETWORK']['ipaddress'],
1541 +          :next_server                 => fuel_settings['ADMIN_NETWORK']['ipaddress'],
1542 +          :mco_user                    => fuel_settings['mcollective']['user'],
1543 +          :mco_pass                    => fuel_settings['mcollective']['password'],
1544 +          :dns_upstream                => [fuel_settings['DNS_UPSTREAM']],
1545 +          :dns_domain                  => fuel_settings['DNS_DOMAIN'],
1546 +          :dns_search                  => fuel_settings['DNS_SEARCH'],
1547 +          :dhcp_ipaddress              => fuel_settings['ADMIN_NETWORK']['ipaddress'],
1548 +          :nailgun_api_url             => "http://#{fuel_settings['ADMIN_NETWORK']['ipaddress']}:8000/api",
1549 +          :bootstrap_ethdevice_timeout => bootstrap_settings.fetch('ethdevice_timeout', '120'),
1550 +      }
1551 +      is_expected.to contain_class('fuel::cobbler').with parameters
1552 +    end
1553 +
1554 +    it { is_expected.to contain_file '/etc/resolv.conf' }
1555 +
1556 +    %w(httpd cobblerd xinetd).each do |service|
1557 +      it "should containt '#{service}' fuel::systemd service with correct parameters" do
1558 +        parameters = {
1559 +            :start => true,
1560 +            :template_path => 'fuel/systemd/restart_template.erb',
1561 +            :config_name => 'restart.conf',
1562 +        }
1563 +        is_expected.to contain_fuel__systemd(service).with parameters
1564 +      end
1565 +    end
1566 +
1567 +    it "should containt dnsmasq fuel::systemd service with correct parameters" do
1568 +        parameters = {
1569 +            :start => true,
1570 +            :template_path => 'fuel/systemd/dnsmasq_template.erb',
1571 +            :config_name => 'restart.conf',
1572 +        }
1573 +        is_expected.to contain_fuel__systemd('dnsmasq').with parameters
1574 +    end
1575 +
1576 +    it 'should declare the "fuel::dnsmasq::dhcp_range" with "default" title and correct parameters' do
1577 +      parameters = {
1578 +       :dhcp_start_address => fuel_settings['ADMIN_NETWORK']['dhcp_pool_start'],
1579 +       :dhcp_end_address   => fuel_settings['ADMIN_NETWORK']['dhcp_pool_end'],
1580 +       :dhcp_netmask       => fuel_settings['ADMIN_NETWORK']['netmask'],
1581 +       :dhcp_gateway       => fuel_settings['ADMIN_NETWORK']['dhcp_gateway'],
1582 +       :next_server        => fuel_settings['ADMIN_NETWORK']['ipaddress'],
1583 +       :listen_address     => fuel_settings['ADMIN_NETWORK']['ipaddress'],
1584 +      }
1585 +      is_expected.to contain_fuel__dnsmasq__dhcp_range('default').with parameters
1586 +      is_expected.to contain_fuel__dnsmasq__dhcp_range('default').that_notifies 'Service[dnsmasq]'
1587 +    end
1588 +
1589 +    it { is_expected.to contain_cobbler_profile('ubuntu_bootstrap').with_kopts(/\bip=frommedia\b/) }
1590 +
1591 +  end
1592 +  run_test manifest
1593 +end
1594 diff --git a/tests/noop/spec/hosts/master/dhcp-ranges_spec.rb b/tests/noop/spec/hosts/master/dhcp-ranges_spec.rb
1595 new file mode 100644
1596 index 0000000..b34675b
1597 --- /dev/null
1598 +++ b/tests/noop/spec/hosts/master/dhcp-ranges_spec.rb
1599 @@ -0,0 +1,17 @@
1600 +require 'spec_helper'
1601 +require 'shared-examples'
1602 +manifest = 'master/dhcp-ranges.pp'
1603 +
1604 +# HIERA: master
1605 +# FACTS: master_centos7
1606 +
1607 +describe manifest do
1608 +  shared_examples 'catalog' do
1609 +    context 'with empty admin_networks' do
1610 +      it 'should not create any dhcp ranges' do
1611 +        is_expected.to have_nailgun__dnsmasq__dhcp_range_resource_count 0
1612 +      end
1613 +    end
1614 +  end
1615 +  run_test manifest
1616 +end
1617 diff --git a/tests/noop/spec/hosts/master/host_spec.rb b/tests/noop/spec/hosts/master/host_spec.rb
1618 index 9937ff3..66c3b4b 100644
1619 --- a/tests/noop/spec/hosts/master/host_spec.rb
1620 +++ b/tests/noop/spec/hosts/master/host_spec.rb
1621 @@ -263,6 +263,8 @@ describe manifest do
1622        should contain_firewall('102 dns_udp')
1623        should contain_firewall('103 dhcp')
1624        should contain_firewall('104 tftp')
1625 +      should contain_firewall('105 squidproxy')
1626 +      should contain_firewall('106 cobbler_web')
1627      end
1628
1629      it 'should declare "openstack::clocksync" class with parameters' do