1 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2 : Copyright (c) 2017 Enea AB and others.
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"
13 This reverts commit 0b5ab4ff80414adad996012b9152de0719888274.
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
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
86 \ No newline at end of file
87 diff --git a/deployment/puppet/fuel/examples/cobbler.pp b/deployment/puppet/fuel/examples/cobbler.pp
89 index 0000000..d409689
91 +++ b/deployment/puppet/fuel/examples/cobbler.pp
93 +notice('MODULAR: cobbler.pp')
95 +Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
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']
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 = {}
116 + $bootstrap_meta = parseyaml($metadata_yaml)
120 + $dhcp_gateway = $dhcp_gw
123 + $dhcp_gateway = $cobbler_host
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,
144 +file { '/etc/resolv.conf':
145 + content => template('fuel/resolv.conf.erb'),
153 + template_path => 'fuel/systemd/restart_template.erb',
154 + config_name => 'restart.conf',
155 + service_manage => false,
158 +fuel::systemd { ['httpd', 'cobblerd', 'xinetd'] :}
160 +fuel::systemd { 'dnsmasq': template_path => 'fuel/systemd/dnsmasq_template.erb' }
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'],
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
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
189 notice('MODULAR: dhcp-ranges.pp')
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', [{}]))
197 -file { $::provision::params::dhcpd_conf_extra :
199 - content => template('fuel/dhcpd_ranges.erb'),
200 +$admin_networks = hiera('admin_networks', [{}])
201 +$admin_network = hiera('ADMIN_NETWORK')
203 +Fuel::Dnsmasq::Dhcp_range <||> {
204 + next_server => $admin_network['ipaddress'],
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',
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 = [
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"
238 @@ -43,12 +40,6 @@ file { 'hiera_data_astute' :
239 target => $astute_data_file,
242 -file { 'hiera_data_provision' :
244 - path => $hiera_data_provision,
245 - content => template('fuel/provision.yaml'),
248 file { 'hiera_puppet_config' :
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']]), '')
258 # Vars for File['/etc/dhcp/dhclient.conf']
259 -$dns_address = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
260 +$cobbler_host = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
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
270 -notice('MODULAR: provision.pp')
272 -Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
274 -$fuel_settings = parseyaml($astute_settings_yaml)
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']
288 - $router = $dhcp_gateway
291 - $router = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
294 -$next_server = $::fuel_settings['ADMIN_NETWORK']['ipaddress']
296 -$nailgun_api_url = "http://${::fuel_settings['ADMIN_NETWORK']['ipaddress']}:8000/api"
297 -$ethdevice_timeout = hiera('ethdevice_timeout', '120')
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')
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')
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 = {}
313 - $bootstrap_meta = parseyaml($metadata_yaml)
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")
319 -$known_hosts = get_merged_network_metadata_from_yamls()
320 -$chain32_files = tftp_files("/var/lib/tftpboot/pxelinux.cfg", $known_hosts)
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,
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,
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,
346 -file { "/var/lib/tftpboot${bootstrap_kernel_path}" :
347 - source => "${bootstrap_path}/vmlinuz",
350 -file { "/var/lib/tftpboot${bootstrap_initrd_path}" :
351 - source => "${bootstrap_path}/initrd.img"
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,
363 -file { '/etc/resolv.conf':
364 - content => template('fuel/resolv.conf.erb'),
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
371 index 0000000..a43ba51
373 +++ b/deployment/puppet/fuel/lib/puppet/parser/functions/create_dnsmasq_dhcp_ranges.rb
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.
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')
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
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)
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 = {
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'],
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])
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
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.
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')
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
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)
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}"
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'],
467 - debug("Appending dhcp range to the list of ranges: #{dhcp_range.inspect}")
468 - dhcp_ranges << dhcp_range
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
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
488 - Dir["/var/lib/fuel/configs/*/provision.yaml"].each do |f|
490 - data = YAML::load_file(f) || {}
491 - rescue Exception => e
492 - warning("Found file #{f} but could not parse it")
495 - merged_data.merge!(data['network_metadata']['nodes'])
500 diff --git a/deployment/puppet/fuel/manifests/cobbler.pp b/deployment/puppet/fuel/manifests/cobbler.pp
502 index 0000000..ea312da
504 +++ b/deployment/puppet/fuel/manifests/cobbler.pp
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,
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 {
531 + anchor { 'nailgun-cobbler-begin': }
532 + anchor { 'nailgun-cobbler-end': }
534 + Anchor<| title == 'nailgun-cobbler-begin' |> ->
535 + Class['::cobbler'] ->
536 + Anchor<| title == 'nailgun-cobbler-end' |>
538 + $real_server = $next_server
540 + $fence_ssh_source = 'puppet:///modules/fuel/cobbler/fence_ssh.centos7.py'
542 + class { '::cobbler':
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,
556 + file { '/etc/cobbler/power/fence_ssh.template':
557 + content => template('fuel/cobbler/fence_ssh.template.erb'),
561 + require => Class['::cobbler::server'],
564 + file { '/usr/sbin/fence_ssh':
565 + source => $fence_ssh_source,
569 + require => Class['::cobbler::server'],
572 + cobbler_distro { 'ubuntu_bootstrap':
573 + kernel => "${bootstrap_path}/vmlinuz",
574 + initrd => "${bootstrap_path}/initrd.img",
577 + osversion => 'xenial',
579 + require => Class['::cobbler::server'],
582 + cobbler_profile { 'ubuntu_bootstrap':
583 + distro => 'ubuntu_bootstrap',
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"),
588 + server => $real_server,
589 + require => Cobbler_distro['ubuntu_bootstrap'],
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],
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],
606 + exec { 'nailgun_cobbler_sync':
607 + command => 'cobbler sync',
608 + refreshonly => true,
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']
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'],
622 + file { '/etc/dnsmasq.conf':
624 + target => '/etc/cobbler.dnsmasq.conf',
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'],
636 diff --git a/deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp b/deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp
638 index 0000000..a60bac5
640 +++ b/deployment/puppet/fuel/manifests/dnsmasq/dhcp_range.pp
643 +# fuel::dnsmasq::dhcp_range creates config files in /etc/dnsmasq.d/
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
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,
663 + $range_name = $name
664 + file { "/etc/dnsmasq.d/${name}.conf":
665 + content => template('fuel/dnsmasq.dhcp-range.erb'),
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 (
677 ) inherits fuel::params {
679 - include ::provision::iptables
680 + #Enable cobbler's iptables rules even if Cobbler not called
681 + include ::cobbler::iptables
683 firewallchain { 'INPUT:filter:IPv4':
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
687 index 0000000..7158984
689 +++ b/deployment/puppet/fuel/spec/functions/create_dnsmasq_dhcp_ranges_spec.rb
691 +require 'spec_helper'
693 +describe 'create_dnsmasq_dhcp_ranges' do
695 + let(:admin_networks) do
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"]],
707 + "node_group_name" => "default2",
708 + "node_group_id" => 22,
709 + "cluster_name" => "default2",
711 + "cidr" => "10.144.0.0/24",
712 + "gateway" => "10.144.0.5",
713 + "ip_ranges" => [["10.144.0.10", "10.144.0.254"]],
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',
727 + lambda { catalogue }
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/)
734 + it 'accepts empty data' do
735 + is_expected.to run.with_params([{}])
738 + it 'can create dnsmasq dhcp ranges' do
739 + is_expected.to run.with_params(admin_networks)
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",
748 + expect(catalog).to contain_fuel__dnsmasq__dhcp_range('range_6be3c888').with 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",
757 + expect(catalog).to contain_fuel__dnsmasq__dhcp_range('range_ff724fd0').with parameters
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
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
774 -<% @dhcp_ranges.each do |range| -%>
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";
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
798 index 0000000..aa41d20
800 +++ b/deployment/puppet/fuel/templates/dnsmasq.dhcp-range.erb
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
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
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
838 -class osnailyfacter::provision::build_image {
839 +class osnailyfacter::provision::build_image(
840 + $data_file = '/tmp/provision.yaml',
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')
848 + $data = loadyaml($data_file)
850 + $cluster_id = $data['cluster']['id']
852 if $data['ironic']['enabled'] == 'true' {
854 @@ -23,10 +29,10 @@ class osnailyfacter::provision::build_image {
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}"
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}"
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",
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'
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'],
885 - unless => "test -e /var/www/nailgun/bootstrap/ironic/${::cluster_id}/vmlinuz",
886 + unless => "test -e /var/www/nailgun/bootstrap/ironic/${cluster_id}/vmlinuz",
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
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
901 - # dhcp_binding_params:
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
911 - args[1].each {|host_name, host_data|
912 - mac = host_data["dhcp_binding_params"]["mac"]
913 - files << (args[0] + "/01-" + mac.gsub(":", "-"))
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
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,
938 -) inherits provision::params {
940 - package { "dhcpd" :
941 - name => $::provision::params::dhcpd_package,
944 - file { $::provision::params::dhcpd_conf :
946 - content => template('provision/dhcpd.conf.erb'),
950 - require => Package["dhcpd"],
951 - notify => Service["dhcpd"],
954 - file { $::provision::params::dhcpd_conf_d :
955 - ensure => directory,
959 - require => Package["dhcpd"],
962 - # It is just a file that could be modified by other modules
963 - file { $::provision::params::dhcpd_conf_extra :
965 - require => File[$::provision::params::dhcpd_conf_d],
968 - service { "dhcpd" :
969 - name => $::provision::params::dhcpd_service,
972 - hasrestart => false,
973 - hasstatus => false,
974 - require => Package["dhcpd"],
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
984 -class provision::iptables {
986 - firewall { '101 dns_tcp':
990 - action => 'accept',
992 - firewall { '102 dns_udp':
996 - action => 'accept',
998 - firewall { '103 dhcp':
1000 - dport => ['67','68'],
1002 - action => 'accept',
1004 - firewall { '104 tftp':
1008 - action => 'accept',
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
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 {
1027 - package { "named" :
1028 - name => $::provision::params::named_package,
1031 - file { "/var/named" :
1032 - ensure => directory,
1036 - require => Package["named"],
1039 - file { $::provision::params::named_conf :
1040 - ensure => present,
1041 - content => template('provision/named.conf.erb'),
1045 - require => Package["named"],
1046 - notify => Service["named"],
1049 - file { "/var/named/${domain_name}" :
1050 - ensure => present,
1051 - content => template('provision/zone.erb'),
1055 - require => Package["named"],
1056 - notify => Service["named"],
1059 - service { "named" :
1060 - name => $::provision::params::named_service,
1061 - ensure => running,
1063 - hasrestart => false,
1064 - hasstatus => false,
1065 - require => Package["named"],
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
1075 -class provision::params {
1076 - case $::osfamily {
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"
1088 - fail("Unsupported osfamily ${::osfamily}")
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"
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"
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
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 {
1125 - Exec {path => '/usr/bin:/bin:/usr/sbin:/sbin'}
1127 - case $::osfamily {
1129 - $tftp_packages = ['xinetd', 'tftp-server', 'syslinux']
1131 - service { 'xinetd':
1132 - ensure => running,
1134 - hasrestart => true,
1135 - require => Package[$tftp_packages],
1138 - file { '/etc/xinetd.conf':
1139 - content => template('provision/xinetd.conf.erb'),
1143 - require => Package[$tftp_packages],
1144 - notify => Service['xinetd'],
1147 - file { '/etc/xinetd.d/tftp' :
1148 - content => template('provision/tftp.xinetd.erb'),
1152 - require => Package[$tftp_packages],
1153 - notify => Service['xinetd'],
1158 - fail("Unsupported osfamily ${::osfamily}")
1162 - ensure_packages($tftp_packages)
1164 - file { ["/var/lib/tftpboot/images", "/var/lib/tftpboot/pxelinux.cfg"] :
1165 - ensure => directory,
1169 - require => Package[$tftp_packages],
1172 - file { "/var/lib/tftpboot/pxelinux.cfg/default" :
1173 - ensure => present,
1174 - content => template("provision/tftp.default.erb"),
1178 - require => File["/var/lib/tftpboot/pxelinux.cfg"],
1181 - file { '/var/lib/tftpboot/chain.c32':
1182 - source => '/usr/share/syslinux/chain.c32',
1183 - require => Package[$tftp_packages],
1186 - file { '/var/lib/tftpboot/pxelinux.0':
1187 - source => '/usr/share/syslinux/pxelinux.0',
1188 - require => Package[$tftp_packages],
1191 - file { '/var/lib/tftpboot/menu.c32':
1192 - source => '/usr/share/syslinux/menu.c32',
1193 - require => Package[$tftp_packages],
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"],
1203 - file { $chain32_files :
1204 - ensure => present,
1205 - content => template("provision/tftp.chain32.erb"),
1209 - require => File["/var/lib/tftpboot/pxelinux.cfg"],
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
1219 -update-static-leases on;
1220 -ddns-domainname "<%= @domain_name %>";
1221 -ddns-update-style interim;
1222 -ignore client-updates;
1223 -update-static-leases true;
1225 -key <%= @ddns_key_name %> {
1226 - algorithm <%= @ddns_key_algorithm %>;
1227 - secret <%= @ddns_key %>;
1230 -local-address <%= @dns_address %>;
1231 -zone <%= @domain_name %>. {
1232 - primary <%= @dns_address %>;
1233 - key <%= @ddns_key_name %>;
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;
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";
1259 -<% if @known_hosts -%>
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";
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 %>";
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
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";
1302 - <% @forwarders.each do |forwarder| -%>
1308 -key <%= @ddns_key_name %> {
1309 - algorithm <%= @ddns_key_algorithm %>;
1310 - secret <%= @ddns_key %>;
1314 - channel default_debug {
1315 - file "data/named.run";
1320 -zone "<%= @domain_name %>." {
1322 - file "<%= @domain_name %>";
1323 - allow-update { key <%= @ddns_key_name %>; };
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
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
1347 -MENU TITLE Boot menu
1350 -ONTIMEOUT <%= @bootstrap_menu_label %>
1353 - MENU LABEL (local)
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 %>
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
1373 - socket_type = dgram
1377 - server = /usr/sbin/in.tftpd
1378 - server_args = -B 1380 -v -s /var/lib/tftpboot
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
1391 - log_type = SYSLOG daemon info
1392 - log_on_failure = HOST
1393 - log_on_success = PID HOST DURATION EXIT
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
1413 -@ IN SOA ns.<%= @domain_name %>. nobody.<%= @domain_name %>. (
1414 - 2017021302 ; Serial
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
1428 requires: [provision_start]
1429 required_for: [build_deploy_image]
1431 - path: /var/lib/fuel/configs/{CLUSTER_ID}/provision.yaml
1432 + path: /tmp/provision.yaml
1435 #TODO: Replace dict($.items) to $ when LP1666913 is fixed
1437 requires: [upload_provision_info_master, generate_ironic_bootstrap_keys]
1438 required_for: [provision_end]
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
1445 -- id: provision_master
1447 +- id: move_to_bootstrap
1448 + type: move_to_bootstrap
1451 - requires: [upload_provision_info_master]
1452 - required_for: [build_deploy_image]
1454 + requires: [provision_start, build_deploy_image]
1455 + required_for: [upload_provision_info]
1457 + - name: build_deploy_image
1460 - puppet_manifest: /etc/puppet/modules/fuel/examples/provision.pp
1461 - puppet_modules: /etc/puppet/modules
1464 + yaql_exp: '$.network_metadata.nodes.values().where($.uid = new($.uid)).name.first()'
1465 + provisioning_info:
1466 + yaql_exp: '$.provision'
1469 - id: upload_provision_info
1473 - requires: [provision_master]
1474 + requires: [move_to_bootstrap]
1475 required_for: [system_provision]
1477 path: /tmp/provision.json
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]
1487 - name: build_deploy_image
1490 cmd: /usr/bin/provision
1493 +- id: cobbler_disable_netboot
1494 + type: master_shell
1497 + requires: [system_provision]
1498 + required_for: [node_reboot]
1503 + yaql_exp: 'concat("sh /etc/puppet/modules/osnailyfacter/modular/provision/netboot disable ", $.provision.name)'
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
1513 +++ b/tests/noop/spec/hosts/master/cobbler_spec.rb
1515 +require 'spec_helper'
1516 +require 'shared-examples'
1518 +manifest = 'master/cobbler.pp'
1521 +# FACTS: master_centos7
1523 +describe manifest do
1524 + shared_examples 'catalog' do
1525 + let(:fuel_settings) do
1526 + YAML.load facts[:astute_settings_yaml]
1529 + let(:bootstrap_settings) do
1530 + fuel_settings.fetch 'BOOTSTRAP', {}
1533 + it 'should contain class "fuel::cobbler" with correct parameters' do
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'),
1551 + is_expected.to contain_class('fuel::cobbler').with parameters
1554 + it { is_expected.to contain_file '/etc/resolv.conf' }
1556 + %w(httpd cobblerd xinetd).each do |service|
1557 + it "should containt '#{service}' fuel::systemd service with correct parameters" do
1560 + :template_path => 'fuel/systemd/restart_template.erb',
1561 + :config_name => 'restart.conf',
1563 + is_expected.to contain_fuel__systemd(service).with parameters
1567 + it "should containt dnsmasq fuel::systemd service with correct parameters" do
1570 + :template_path => 'fuel/systemd/dnsmasq_template.erb',
1571 + :config_name => 'restart.conf',
1573 + is_expected.to contain_fuel__systemd('dnsmasq').with parameters
1576 + it 'should declare the "fuel::dnsmasq::dhcp_range" with "default" title and correct parameters' do
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'],
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]'
1589 + it { is_expected.to contain_cobbler_profile('ubuntu_bootstrap').with_kopts(/\bip=frommedia\b/) }
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
1598 +++ b/tests/noop/spec/hosts/master/dhcp-ranges_spec.rb
1600 +require 'spec_helper'
1601 +require 'shared-examples'
1602 +manifest = 'master/dhcp-ranges.pp'
1605 +# FACTS: master_centos7
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
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')
1629 it 'should declare "openstack::clocksync" class with parameters' do