From: Jackie Huang Date: Tue, 8 Jun 2021 02:32:10 +0000 (+0800) Subject: puppet-network: update for stx 5.0 X-Git-Tag: f-release~101 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=9659f8682ce79b799846fe88515ffe139e8605eb;p=pti%2Frtp.git puppet-network: update for stx 5.0 * inherit stx-metadata to help apply patches from stx 'integ' repo * remove the local copy of stx patches Issue-ID: INF-215 Signed-off-by: Jackie Huang Change-Id: Id893dde79f56fd6efbf6f0e018ab80beb8f47bc4 --- diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch deleted file mode 100644 index efc5446..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 49e103bbeb4d6efe1ca75f581d41ee6a8ed7caf5 Mon Sep 17 00:00:00 2001 -From: Romanos Skiadas -Date: Wed, 2 Nov 2016 14:51:47 -0400 -Subject: [PATCH] Don't write absent to redhat route files and test for this - -Signed-off-by: Allain Legacy ---- - .../network/lib/puppet/provider/network_route/redhat.rb | 9 +++++++-- - .../spec/unit/provider/network_route/redhat_spec.rb | 17 ++++++++++++++++- - 2 files changed, 23 insertions(+), 3 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index f45eab5..9841c8e 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -84,10 +84,15 @@ Puppet::Type.type(:network_route).provide(:redhat) do - raise Puppet::Error, "#{provider.name} does not have a #{prop}." if provider.send(prop).nil? - end - if provider.network == "default" -- contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface} #{provider.options}\n" -+ contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}\n" - else -- contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface} #{provider.options}\n" -+ contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}\n" - end -+ contents << if provider.options == :absent -+ "\n" -+ else -+ " #{provider.options}\n" -+ end - end - contents.join - end -diff --git a/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb b/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb -index dfc9d6b..1ad2128 100644 ---- a/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb -+++ b/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb -@@ -91,7 +91,18 @@ describe Puppet::Type.type(:network_route).provider(:redhat) do - ) - end - -- let(:content) { described_class.format_file('', [route1_provider, route2_provider, defaultroute_provider]) } -+ let(:nooptions_provider) do -+ stub('nooptions_provider', -+ name: 'default', -+ network: 'default', -+ netmask: '', -+ gateway: '10.0.0.1', -+ interface: 'eth2', -+ options: :absent -+ ) -+ end -+ -+ let(:content) { described_class.format_file('', [route1_provider, route2_provider, defaultroute_provider, nooptions_provider]) } - - describe "writing the route line" do - describe "For standard (non-default) routes" do -@@ -122,6 +133,10 @@ describe Puppet::Type.type(:network_route).provider(:redhat) do - it "should have the correct fields appended" do - content.scan(/^default .*$/).first.should be_include("default via 10.0.0.1 dev eth1") - end -+ -+ it 'should not contain the word absent when no options are defined' do -+ expect(content).to_not match(/absent/) -+ end - end - end - end --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/fix-absent-options.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/fix-absent-options.patch deleted file mode 100644 index 23c738f..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/fix-absent-options.patch +++ /dev/null @@ -1,113 +0,0 @@ -From f22d4c9d24939afb8f29323adffe3eb570f14804 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=3D=3FUTF-8=3Fq=3FIgor=3D20Gali=3DC4=3D87=3F=3D?= - -Date: Wed, 2 Nov 2016 14:54:28 -0400 -Subject: [PATCH] fix "absent" options - -analogous to redhat, we check if options are absent, before appending -them to the file. This fixes #160 - -Signed-off-by: Allain Legacy ---- - .../lib/puppet/provider/network_route/redhat.rb | 10 ++--- - .../lib/puppet/provider/network_route/routes.rb | 3 +- - .../unit/provider/network_route/routes_spec.rb | 48 ++++++++++++++++++++++ - 3 files changed, 53 insertions(+), 8 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index 9841c8e..7123d44 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -84,15 +84,11 @@ Puppet::Type.type(:network_route).provide(:redhat) do - raise Puppet::Error, "#{provider.name} does not have a #{prop}." if provider.send(prop).nil? - end - if provider.network == "default" -- contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}\n" -+ contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}" - else -- contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}\n" -+ contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}" - end -- contents << if provider.options == :absent -- "\n" -- else -- " #{provider.options}\n" -- end -+ contents << (provider.options == :absent ? "\n" : " #{provider.options}\n") - end - contents.join - end -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb -index 2dd579f..ca7066d 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb -@@ -93,7 +93,8 @@ Puppet::Type.type(:network_route).provide(:routes) do - raise Puppet::Error, "#{provider.name} is missing the required parameter 'gateway'." if provider.gateway.nil? - raise Puppet::Error, "#{provider.name} is missing the required parameter 'interface'." if provider.interface.nil? - -- contents << "#{provider.network} #{provider.netmask} #{provider.gateway} #{provider.interface} #{provider.options}\n" -+ contents << "#{provider.network} #{provider.netmask} #{provider.gateway} #{provider.interface}" -+ contents << (provider.options == :absent ? "\n" : " #{provider.options}\n") - end - - contents.join -diff --git a/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb b/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb -index 2e55eba..9376739 100644 ---- a/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb -+++ b/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb -@@ -93,4 +93,52 @@ describe Puppet::Type.type(:network_route).provider(:routes) do - end - end - end -+ describe 'when formatting simple files' do -+ let(:route1_provider) do -+ stub('route1_provider', -+ name: '172.17.67.0', -+ network: '172.17.67.0', -+ netmask: '255.255.255.0', -+ gateway: '172.18.6.2', -+ interface: 'vlan200', -+ options: :absent, -+ ) -+ end -+ -+ let(:route2_provider) do -+ stub('lo_provider', -+ name: '172.28.45.0', -+ network: '172.28.45.0', -+ netmask: '255.255.255.0', -+ gateway: '172.18.6.2', -+ interface: 'eth0', -+ options: :absent, -+ ) -+ end -+ -+ let(:content) { described_class.format_file('', [route1_provider, route2_provider]) } -+ -+ describe 'writing the route line' do -+ it 'should write only fields' do -+ expect(content.scan(/^172.17.67.0 .*$/).length).to eq(1) -+ expect(content.scan(/^172.17.67.0 .*$/).first.split(/\s/, 5).length).to eq(4) -+ end -+ -+ it 'should have the correct fields appended' do -+ expect(content.scan(/^172.17.67.0 .*$/).first).to include('172.17.67.0 255.255.255.0 172.18.6.2 vlan200') -+ end -+ -+ it 'should fail if the netmask property is not defined' do -+ route2_provider.unstub(:netmask) -+ route2_provider.stubs(:netmask).returns nil -+ expect { content }.to raise_exception -+ end -+ -+ it 'should fail if the gateway property is not defined' do -+ route2_provider.unstub(:gateway) -+ route2_provider.stubs(:gateway).returns nil -+ expect { content }.to raise_exception -+ end -+ end -+ end - end --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/ipv6-static-route-support.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/ipv6-static-route-support.patch deleted file mode 100644 index 10456b1..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/ipv6-static-route-support.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 49820add1d1e5f63343615ead9b551b8679f466d Mon Sep 17 00:00:00 2001 -From: Kevin Smith -Date: Mon, 16 Oct 2017 15:06:37 -0500 -Subject: [PATCH 1/1] ipv6 static route support - ---- - .../lib/puppet/provider/network_route/redhat.rb | 3 ++- - .../network/lib/puppet/type/network_route.rb | 26 ++++++++++++++-------- - .../network/spec/unit/type/network_route_spec.rb | 5 +++++ - 3 files changed, 24 insertions(+), 10 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index 5073519..c289f5f 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -93,7 +93,8 @@ Puppet::Type.type(:network_route).provide(:redhat) do - if provider.network == "default" - contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}" - else -- contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}" -+ # provider.name will have cidr notation -+ contents << "#{provider.name} via #{provider.gateway} dev #{provider.interface}" - end - contents << (provider.options == :absent ? "\n" : " #{provider.options}\n") - end -diff --git a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -index 7ab67dd..fd52c58 100644 ---- a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -+++ b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -@@ -5,8 +5,6 @@ Puppet::Type.newtype(:network_route) do - - ensurable - -- IPV4_ADDRESS_REGEX = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/ -- - newparam(:name) do - isnamevar - desc "The name of the network route" -@@ -18,7 +16,7 @@ Puppet::Type.newtype(:network_route) do - validate do |value| - begin - t = IPAddr.new(value) unless value == "default" -- rescue ArgumentError -+ rescue - fail("Invalid value for network: #{value}") - end - end -@@ -29,17 +27,27 @@ Puppet::Type.newtype(:network_route) do - desc "The subnet mask to apply to the route" - - validate do |value| -- unless (value.length <= 2 or value =~ IPV4_ADDRESS_REGEX) -+ unless value.length <= 3 || (IPAddr.new(value) rescue false) - fail("Invalid value for argument netmask: #{value}") - end - end - - munge do |value| -- case value -- when IPV4_ADDRESS_REGEX -- value -- when /^\d+$/ -- IPAddr.new('255.255.255.255').mask(value.strip.to_i).to_s -+ # '255.255.255.255'.to_i will return 255, so we try to convert it back: -+ if value.to_i.to_s == value -+ if value.to_i <= 32 -+ IPAddr.new('255.255.255.255').mask(value.strip.to_i).to_s -+ else -+ IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(value.strip.to_i).to_s -+ end -+ else -+ if (IPAddr.new(value).ipv6? rescue false) -+ IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(value).to_s -+ elsif (IPAddr.new(value).ipv4? rescue false) -+ IPAddr.new('255.255.255.255').mask(value).to_s -+ else -+ raise("Invalid value for argument netmask: #{value}") -+ end - end - end - end -diff --git a/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb b/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb -index 24e9da3..6e6f3e4 100644 ---- a/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb -+++ b/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb -@@ -55,6 +55,11 @@ describe Puppet::Type.type(:network_route) do - r[:netmask].should == '255.255.255.0' - end - -+ it 'should convert IPv6 netmasks of the CIDR form' do -+ r = Puppet::Type.type(:network_route).new(name: 'lxd bridge', network: 'fd58:281b:6eef:eb3d::', netmask: '64', gateway: 'fd58:281b:6eef:eb3d::1', interface: 'lxdbr0') -+ expect(r[:netmask]).to eq('ffff:ffff:ffff:ffff::') -+ end -+ - it "should convert netmasks of the expanded netmask form" do - r = described_class.new(:name => '192.168.1.0/24', :network => '192.168.1.0', :netmask => '255.255.128.0', :gateway => '23.23.23.42', :interface => 'eth0') - r[:netmask].should == '255.255.128.0' --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/permit-inservice-update-of-static-routes.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/permit-inservice-update-of-static-routes.patch deleted file mode 100644 index 66e7623..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/permit-inservice-update-of-static-routes.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 46ec08e58419bb73bf49b44cf32fa3d304236615 Mon Sep 17 00:00:00 2001 -From: Kevin Smith -Date: Thu, 5 Oct 2017 13:33:12 -0500 -Subject: [PATCH 1/1] permit inservice update of static routes - ---- - .../network/lib/puppet/provider/network_route/redhat.rb | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index 7123d44..5073519 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -18,12 +18,18 @@ Puppet::Type.type(:network_route).provide(:redhat) do - - has_feature :provider_options - -+ # WRS: Generate temporary copies. It will get compared to files under -+ # /etc/sysconfig/network-scripts afterward. Only config that have changed -+ # will get replaced. Don't let puppet directly manage them, else it will -+ # trigger un-wanted networking actions (like up/down). -+ RSCRIPT_DIRECTORY = "/var/run/network-scripts.puppet" -+ - def select_file -- "/etc/sysconfig/network-scripts/route-#{@resource[:interface]}" -+ "#{RSCRIPT_DIRECTORY}/route-#{@resource[:interface]}" - end - - def self.target_files -- Dir["/etc/sysconfig/network-scripts/route-*"] -+ Dir["#{RSCRIPT_DIRECTORY}/route-*"] - end - - def self.parse_file(filename, contents) -@@ -76,6 +82,7 @@ Puppet::Type.type(:network_route).provide(:redhat) do - - # Generate an array of sections - def self.format_file(filename, providers) -+ Dir.mkdir(RSCRIPT_DIRECTORY) unless File.exists?(RSCRIPT_DIRECTORY) - contents = [] - contents << header - # Build routes -@@ -103,4 +110,9 @@ Puppet::Type.type(:network_route).provide(:redhat) do - HEADER - str - end -+ -+ def self.post_flush_hook(filename) -+ File.chmod(0644, filename) -+ end -+ - end --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/puppet-network-Kilo-quilt-changes.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/puppet-network-Kilo-quilt-changes.patch deleted file mode 100644 index 841198f..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/puppet-network-Kilo-quilt-changes.patch +++ /dev/null @@ -1,658 +0,0 @@ -From 8e14e2e258a8f2f7189ed37c6337c41fbff0362a Mon Sep 17 00:00:00 2001 -From: Al Bailey -Date: Mon, 6 Jun 2016 17:13:09 -0400 -Subject: [PATCH] puppet-network Kilo quilt changes - ---- - .../lib/puppet/provider/network_config/redhat.rb | 39 ++- - .../lib/puppet/provider/network_config/wrlinux.rb | 296 +++++++++++++++++++++ - .../lib/puppet/provider/network_route/wrlinux.rb | 109 ++++++++ - .../network/lib/puppet/type/network_config.rb | 4 + - packstack/puppet/modules/network/manifests/bond.pp | 22 ++ - .../puppet/modules/network/manifests/bond/setup.pp | 2 + - .../modules/network/manifests/bond/wrlinux.pp | 56 ++++ - 7 files changed, 521 insertions(+), 7 deletions(-) - create mode 100644 packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb - create mode 100644 packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb - create mode 100644 packstack/puppet/modules/network/manifests/bond/wrlinux.pp - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -index 4b6de7e..758f387 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -@@ -19,7 +19,12 @@ Puppet::Type.type(:network_config).provide(:redhat) do - has_feature :provider_options - - # @return [String] The path to network-script directory on redhat systems -- SCRIPT_DIRECTORY = "/etc/sysconfig/network-scripts" -+ # SCRIPT_DIRECTORY = "/etc/sysconfig/network-scripts" -+ # WRS: Generate temporary copies. It will get compared to files under -+ # /etc/sysconfig/network-scripts afterward. Only config that have changed -+ # will get replaced. Don't let puppet directly manage them, else it will -+ # trigger un-wanted networking actions (like up/down). -+ SCRIPT_DIRECTORY = "/var/run/network-scripts.puppet" - - # The valid vlan ID range is 0-4095; 4096 is out of range - VLAN_RANGE_REGEX = %r[\d{1,3}|40[0-9][0-5]] -@@ -35,6 +40,7 @@ Puppet::Type.type(:network_config).provide(:redhat) do - :name => 'DEVICE', - :hotplug => 'HOTPLUG', - :mtu => 'MTU', -+ :gateway => 'GATEWAY', - } - - # Map provider instances to files based on their name -@@ -60,8 +66,14 @@ Puppet::Type.type(:network_config).provide(:redhat) do - # RedhatProvider.target_files - # # => ['/etc/sysconfig/network-scripts/ifcfg-eth0', '/etc/sysconfig/network-scripts/ifcfg-eth1'] - def self.target_files(script_dir = SCRIPT_DIRECTORY) -- entries = Dir.entries(script_dir).select {|entry| entry.match SCRIPT_REGEX} -- entries.map {|entry| File.join(SCRIPT_DIRECTORY, entry)} -+ entries = [] -+ if Dir.exists?(SCRIPT_DIRECTORY) -+ Dir.foreach(SCRIPT_DIRECTORY) do |item| -+ next if not item.match SCRIPT_REGEX -+ entries << item -+ end -+ end -+ entries - end - - # Convert a redhat network script into a hash -@@ -184,6 +196,8 @@ Puppet::Type.type(:network_config).provide(:redhat) do - end - - def self.format_file(filename, providers) -+ Dir.mkdir(SCRIPT_DIRECTORY) unless File.exists?(SCRIPT_DIRECTORY) -+ - if providers.length == 0 - return "" - elsif providers.length > 1 -@@ -193,11 +207,11 @@ Puppet::Type.type(:network_config).provide(:redhat) do - provider = providers[0] - props = {} - -- # Map everything to a flat hash -- props = (provider.options || {}) -+ props = provider.options if provider.options && provider.options != :absent - -+ # Map everything to a flat hash - NAME_MAPPINGS.keys.each do |type_name| -- if (val = provider.send(type_name)) -+ if (val = provider.send(type_name)) && val != :absent - props[type_name] = val - end - end -@@ -214,11 +228,11 @@ Puppet::Type.type(:network_config).provide(:redhat) do - str << %{#{key}=#{val}\n} - end - -+ content.prepend(header) - content - end - - def self.unmunge(props) -- - pairs = {} - - [:onboot, :hotplug].each do |bool_property| -@@ -245,6 +259,17 @@ Puppet::Type.type(:network_config).provide(:redhat) do - pairs - end - -+ def self.header -+ str = <<-HEADER -+# HEADER: This file is is being managed by puppet. Changes to -+# HEADER: interfaces that are not being managed by puppet will persist; -+# HEADER: however changes to interfaces that are being managed by puppet will -+# HEADER: be overwritten. In addition, file order is NOT guaranteed. -+# HEADER: Last generated at: #{Time.now} -+HEADER -+ str -+ end -+ - def self.post_flush_hook(filename) - File.chmod(0644, filename) - end -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb -new file mode 100644 -index 0000000..44c645a ---- /dev/null -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb -@@ -0,0 +1,296 @@ -+require 'puppetx/filemapper' -+ -+Puppet::Type.type(:network_config).provide(:wrlinux) do -+ # Wind River Linux network_config interfaces provider. -+ # -+ # This provider uses the filemapper mixin to map the interfaces file to a -+ # collection of network_config providers, and back. -+ # -+ include PuppetX::FileMapper -+ -+ desc "Wind River interfaces style provider" -+ -+ confine :osfamily => :wrlinux -+ defaultfor :osfamily => :wrlinux -+ -+ has_feature :provider_options -+ has_feature :hotpluggable -+ -+ def select_file -+ '/var/run/interfaces.puppet' -+ end -+ -+ def self.target_files -+ ['/var/run/interfaces.puppet'] -+ end -+ -+ class MalformedInterfacesError < Puppet::Error -+ def initialize(msg = nil) -+ msg = 'Malformed wrlinux interfaces file; cannot instantiate network_config resources' if msg.nil? -+ super -+ end -+ end -+ -+ def self.raise_malformed -+ @failed = true -+ raise MalformedInterfacesError -+ end -+ -+ class Instance -+ -+ attr_reader :name -+ -+ # Booleans -+ attr_accessor :onboot, :hotplug -+ -+ -+ # These fields are going to get rearranged to resolve issue 16 -+ # https://github.com/adrienthebo/puppet-network/issues/16 -+ attr_accessor :ipaddress, :netmask, :family, :method, :mtu -+ -+ # Options hash -+ attr_reader :options -+ -+ def initialize(name) -+ @name = name -+ -+ @options = Hash.new {|hash, key| hash[key] = []} -+ end -+ -+ def to_hash -+ h = { -+ :name => @name, -+ :onboot => @onboot, -+ :hotplug => @hotplug, -+ :ipaddress => @ipaddress, -+ :netmask => @netmask, -+ :family => @family, -+ :method => @method, -+ :mtu => @mtu, -+ :options => squeeze_options -+ } -+ -+ h.inject({}) do |hash, (key, val)| -+ hash[key] = val unless val.nil? -+ hash -+ end -+ end -+ -+ def squeeze_options -+ @options.inject({}) do |hash, (key, value)| -+ if value.size <= 1 -+ hash[key] = value.pop -+ else -+ hash[key] = value -+ end -+ -+ hash -+ end -+ end -+ -+ class << self -+ -+ def reset! -+ @interfaces = {} -+ end -+ -+ # @return [Array] All class instances -+ def all_instances -+ @interfaces ||= {} -+ @interfaces -+ end -+ -+ def [](name) -+ if all_instances[name] -+ obj = all_instances[name] -+ else -+ obj = self.new(name) -+ all_instances[name] = obj -+ end -+ -+ obj -+ end -+ end -+ end -+ -+ def self.parse_file(filename, contents) -+ # Debian has a very irregular format for the interfaces file. The -+ # parse_file method is somewhat derived from the ifup executable -+ # supplied in the debian ifupdown package. The source can be found at -+ # http://packages.debian.org/squeeze/ifupdown -+ -+ -+ # The debian interfaces implementation requires global state while parsing -+ # the file; namely, the stanza being parsed as well as the interface being -+ # parsed. -+ status = :none -+ current_interface = nil -+ -+ lines = contents.split("\n") -+ # TODO Join lines that end with a backslash -+ -+ # Iterate over all lines and determine what attributes they create -+ lines.each do |line| -+ -+ # Strip off any trailing comments -+ line.sub!(/#.*$/, '') -+ -+ case line -+ when /^\s*#|^\s*$/ -+ # Ignore comments and blank lines -+ next -+ -+ when /^auto|^allow-auto/ -+ # Parse out any auto sections -+ interfaces = line.split(' ') -+ interfaces.delete_at(0) -+ -+ interfaces.each do |name| -+ Instance[name].onboot = true -+ end -+ -+ # Reset the current parse state -+ current_interface = nil -+ -+ when /^allow-hotplug/ -+ # parse out allow-hotplug lines -+ -+ interfaces = line.split(' ') -+ interfaces.delete_at(0) -+ -+ interfaces.each do |name| -+ Instance[name].hotplug = true -+ end -+ -+ # Don't reset Reset the current parse state -+ when /^iface/ -+ -+ # Format of the iface line: -+ # -+ # iface -+ # zero or more options for -+ -+ if match = line.match(/^iface\s+(\S+)\s+(\S+)\s+(\S+)/) -+ name = match[1] -+ family = match[2] -+ method = match[3] -+ -+ # If an iface block for this interface has been seen, the file is -+ # malformed. -+ raise_malformed if Instance[name] and Instance[name].family -+ -+ status = :iface -+ current_interface = name -+ -+ # This is done automatically -+ #Instance[name].name = name -+ Instance[name].family = family -+ Instance[name].method = method -+ -+ else -+ # If we match on a string with a leading iface, but it isn't in the -+ # expected format, malformed blar blar -+ raise_malformed -+ end -+ -+ when /^mapping/ -+ -+ # XXX dox -+ raise Puppet::DevError, "Debian interfaces mapping parsing not implemented." -+ status = :mapping -+ -+ else -+ # We're currently examining a line that is within a mapping or iface -+ # stanza, so we need to validate the line and add the options it -+ # specifies to the known state of the interface. -+ -+ case status -+ when :iface -+ if match = line.match(/(\S+)\s+(\S.*)/) -+ # If we're parsing an iface stanza, then we should receive a set of -+ # lines that contain two or more space delimited strings. Append -+ # them as options to the iface in an array. -+ -+ key = match[1] -+ val = match[2] -+ -+ name = current_interface -+ -+ case key -+ when 'address'; Instance[name].ipaddress = val -+ when 'netmask'; Instance[name].netmask = val -+ when 'mtu'; Instance[name].mtu = val -+ else Instance[name].options[key] << val -+ end -+ else -+ raise_malformed -+ end -+ when :mapping -+ raise Puppet::DevError, "Debian interfaces mapping parsing not implemented." -+ when :none -+ raise_malformed -+ end -+ end -+ end -+ -+ Instance.all_instances.map {|name, instance| instance.to_hash } -+ end -+ -+ # Generate an array of sections -+ def self.format_file(filename, providers) -+ contents = [] -+ contents << header -+ -+ # Add onboot interfaces -+ if (auto_interfaces = providers.select {|provider| provider.onboot == true }) -+ stanza = [] -+ stanza << "auto " + auto_interfaces.map(&:name).sort.join(" ") -+ contents << stanza.join("\n") -+ end -+ -+ # Build iface stanzas -+ providers.sort_by(&:name).each do |provider| -+ # TODO add validation method -+ raise Puppet::Error, "#{provider.name} does not have a method." if provider.method.nil? -+ raise Puppet::Error, "#{provider.name} does not have a family." if provider.family.nil? -+ -+ stanza = [] -+ stanza << %{iface #{provider.name} #{provider.family} #{provider.method}} -+ -+ [ -+ [:ipaddress, 'address'], -+ [:netmask, 'netmask'], -+ [:mtu, 'mtu'], -+ ].each do |(property, section)| -+ stanza << " #{section} #{provider.send property}" if provider.send(property) and provider.send(property) != :absent -+ end -+ -+ if provider.options and provider.options != :absent -+ provider.options.each_pair do |key, val| -+ if val.is_a? String -+ stanza << " #{key} #{val}" -+ elsif val.is_a? Array -+ val.each { |entry| stanza << " #{key} #{entry}" } -+ else -+ raise Puppet::Error, "#{self} options key #{key} expects a String or Array, got #{val.class}" -+ end -+ end -+ end -+ -+ contents << stanza.join("\n") -+ end -+ -+ contents.map {|line| line + "\n\n"}.join -+ end -+ -+ def self.header -+ str = <<-HEADER -+# HEADER: This file is is being managed by puppet. Changes to -+# HEADER: interfaces that are not being managed by puppet will persist; -+# HEADER: however changes to interfaces that are being managed by puppet will -+# HEADER: be overwritten. In addition, file order is NOT guaranteed. -+# HEADER: Last generated at: #{Time.now} -+HEADER -+ str -+ end -+end -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb -new file mode 100644 -index 0000000..d3fa7b5 ---- /dev/null -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb -@@ -0,0 +1,109 @@ -+require 'ipaddr' -+require 'puppetx/filemapper' -+ -+Puppet::Type.type(:network_route).provide(:wrlinux) do -+ # Wind River Linux network_route routes provider. -+ # -+ # This provider uses the filemapper mixin to map the routes file to a -+ # collection of network_route providers, and back. -+ # -+ include PuppetX::FileMapper -+ -+ desc "Wind River routes style provider" -+ -+ confine :osfamily => :wrlinux -+ -+ # $ dpkg -S /etc/network/if-up.d/20static-routes -+ # ifupdown-extra: /etc/network/if-up.d/20static-routes -+ confine :exists => '/etc/network/if-up.d/20static-routes' -+ -+ defaultfor :osfamily => :wrlinux -+ -+ has_feature :provider_options -+ -+ def select_file -+ '/etc/network/routes' -+ end -+ -+ def self.target_files -+ ['/etc/network/routes'] -+ end -+ -+ class MalformedRoutesError < Puppet::Error -+ def initialize(msg = nil) -+ msg = 'Malformed wrlinux routes file; cannot instantiate network_route resources' if msg.nil? -+ super -+ end -+ end -+ -+ def self.raise_malformed -+ @failed = true -+ raise MalformedRoutesError -+ end -+ -+ def self.parse_file(filename, contents) -+ # Build out an empty hash for new routes for storing their configs. -+ route_hash = Hash.new do |hash, key| -+ hash[key] = {} -+ hash[key][:name] = key -+ hash[key] -+ end -+ -+ lines = contents.split("\n") -+ lines.each do |line| -+ # Strip off any trailing comments -+ line.sub!(/#.*$/, '') -+ -+ if line =~ /^\s*#|^\s*$/ -+ # Ignore comments and blank lines -+ next -+ end -+ -+ route = line.split(' ', 5) -+ -+ if route.length < 4 -+ raise_malformed -+ end -+ -+ # use the CIDR version of the target as :name -+ cidr_target = "#{route[0]}/#{IPAddr.new(route[1]).to_i.to_s(2).count('1')}" -+ -+ route_hash[cidr_target][:network] = route[0] -+ route_hash[cidr_target][:netmask] = route[1] -+ route_hash[cidr_target][:gateway] = route[2] -+ route_hash[cidr_target][:interface] = route[3] -+ route_hash[cidr_target][:options] = route[4] if route[4] -+ end -+ -+ route_hash.values -+ end -+ -+ # Generate an array of sections -+ def self.format_file(filename, providers) -+ contents = [] -+ contents << header -+ -+ # Build routes -+ providers.sort_by(&:name).each do |provider| -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'network'." if provider.network.nil? -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'netmask'." if provider.netmask.nil? -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'gateway'." if provider.gateway.nil? -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'interface'." if provider.interface.nil? -+ -+ contents << "#{provider.network} #{provider.netmask} #{provider.gateway} #{provider.interface} #{provider.options}\n" -+ end -+ -+ contents.join -+ end -+ -+ def self.header -+ str = <<-HEADER -+# HEADER: This file is is being managed by puppet. Changes to -+# HEADER: routes that are not being managed by puppet will persist; -+# HEADER: however changes to routes that are being managed by puppet will -+# HEADER: be overwritten. In addition, file order is NOT guaranteed. -+# HEADER: Last generated at: #{Time.now} -+HEADER -+ str -+ end -+end -diff --git a/packstack/puppet/modules/network/lib/puppet/type/network_config.rb b/packstack/puppet/modules/network/lib/puppet/type/network_config.rb -index a50a0df..1297ad7 100644 ---- a/packstack/puppet/modules/network/lib/puppet/type/network_config.rb -+++ b/packstack/puppet/modules/network/lib/puppet/type/network_config.rb -@@ -95,6 +95,10 @@ Puppet::Type.newtype(:network_config) do - defaultto :raw - end - -+ newproperty(:gateway) do -+ desc 'The IP address of the network router or gateway device (if any)' -+ end -+ - # `:options` provides an arbitrary passthrough for provider properties, so - # that provider specific behavior doesn't clutter up the main type but still - # allows for more powerful actions to be taken. -diff --git a/packstack/puppet/modules/network/manifests/bond.pp b/packstack/puppet/modules/network/manifests/bond.pp -index d6d98ce..26ca104 100644 ---- a/packstack/puppet/modules/network/manifests/bond.pp -+++ b/packstack/puppet/modules/network/manifests/bond.pp -@@ -188,6 +188,28 @@ define network::bond( - require => Kmod::Alias[$name], - } - } -+ WRLinux: { -+ network::bond::wrlinux { $name: -+ slaves => $slaves, -+ ensure => $ensure, -+ ipaddress => $ipaddress, -+ netmask => $netmask, -+ method => $method, -+ family => $family, -+ onboot => $onboot, -+ -+ mode => $mode, -+ miimon => $miimon, -+ downdelay => $downdelay, -+ updelay => $updelay, -+ lacp_rate => $lacp_rate, -+ primary => $primary, -+ primary_reselect => $primary_reselect, -+ xmit_hash_policy => $xmit_hash_policy, -+ -+ require => Kmod::Alias[$name], -+ } -+ } - RedHat: { - network::bond::redhat { $name: - ensure => $ensure, -diff --git a/packstack/puppet/modules/network/manifests/bond/setup.pp b/packstack/puppet/modules/network/manifests/bond/setup.pp -index abe1252..0a30767 100644 ---- a/packstack/puppet/modules/network/manifests/bond/setup.pp -+++ b/packstack/puppet/modules/network/manifests/bond/setup.pp -@@ -10,5 +10,7 @@ class network::bond::setup { - ensure => present, - } - } -+ WRLinux: { -+ } - } - } -diff --git a/packstack/puppet/modules/network/manifests/bond/wrlinux.pp b/packstack/puppet/modules/network/manifests/bond/wrlinux.pp -new file mode 100644 -index 0000000..e240341 ---- /dev/null -+++ b/packstack/puppet/modules/network/manifests/bond/wrlinux.pp -@@ -0,0 +1,56 @@ -+# = Define: network::bond::wrlinux -+# -+# Instantiate bonded interfaces on Debian based systems. -+# -+# == See also -+# -+# * Debian Network Bonding http://wiki.wrlinux.org/Bonding -+define network::bond::wrlinux( -+ $slaves, -+ $ensure = present, -+ $ipaddress = undef, -+ $netmask = undef, -+ $method = undef, -+ $family = undef, -+ $onboot = undef, -+ -+ $mode = undef, -+ $miimon = undef, -+ $downdelay = undef, -+ $updelay = undef, -+ $lacp_rate = undef, -+ $primary = undef, -+ $primary_reselect = undef, -+ $xmit_hash_policy = undef, -+) { -+ -+ $raw = { -+ 'bond-slaves' => join($slaves, ' '), -+ 'bond-mode' => $mode, -+ 'bond-miimon' => $miimon, -+ 'bond-downdelay' => $downdelay, -+ 'bond-updelay' => $updelay, -+ 'bond-lacp-rate' => $lacp_rate, -+ 'bond-primary' => $primary, -+ 'bond-primary-reselect' => $primary_reselect, -+ 'bond-xmit-hash-policy' => $xmit_hash_policy, -+ } -+ -+ $opts = compact_hash($raw) -+ -+ network_config { $name: -+ ensure => $ensure, -+ ipaddress => $ipaddress, -+ netmask => $netmask, -+ family => $family, -+ method => $method, -+ onboot => $onboot, -+ options => $opts, -+ } -+ -+ network_config { $slaves: -+ ensure => absent, -+ reconfigure => true, -+ before => Network_config[$name], -+ } -+} --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/puppet-network-support-ipv6.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/puppet-network-support-ipv6.patch deleted file mode 100644 index b6d2f3c..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/puppet-network-support-ipv6.patch +++ /dev/null @@ -1,46 +0,0 @@ -Index: packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -@@ -224,6 +224,11 @@ - - pairs = self.unmunge props - -+ ip_version = provider.send(:family) -+ if (ip_version.to_s == "inet6") -+ pairs = self.ipv6_fixup pairs -+ end -+ - content = pairs.inject('') do |str, (key, val)| - str << %{#{key}=#{val}\n} - end -@@ -259,6 +264,30 @@ - pairs - end - -+ def self.ipv6_fixup(pairs) -+ pairs['IPV6INIT'] = 'yes' -+ -+ if (pairs.include? 'NETMASK' and pairs.include? 'IPADDR') -+ pairs['IPV6ADDR'] = pairs['IPADDR'].to_s + "/" + pairs['NETMASK'].to_s -+ pairs.delete('NETMASK') -+ pairs.delete('IPADDR') -+ elsif (pairs.include? 'IPADDR') -+ pairs['IPV6ADDR'] = pairs['IPADDR'].to_s -+ pairs.delete('IPADDR') -+ end -+ -+ if (pairs.include? 'GATEWAY') -+ pairs['IPV6_DEFAULTGW'] = pairs['GATEWAY'] -+ pairs.delete('GATEWAY') -+ end -+ -+ if (pairs['BOOTPROTO'].to_s == 'dhcp') -+ pairs['DHCPV6C'] = 'yes' -+ pairs['DHCLIENTARGS'] = '-1' -+ end -+ pairs -+ end -+ - def self.header - str = <<-HEADER - # HEADER: This file is is being managed by puppet. Changes to diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/route-options-support.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/route-options-support.patch deleted file mode 100644 index 37bf138..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/network/route-options-support.patch +++ /dev/null @@ -1,28 +0,0 @@ -From c26a70ab9d5839f90148c578edc5d15133355194 Mon Sep 17 00:00:00 2001 -From: Kevin Smith -Date: Wed, 25 Oct 2017 07:37:52 -0500 -Subject: [PATCH 1/1] route options support - ---- - packstack/puppet/modules/network/lib/puppet/type/network_route.rb | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -index fd52c58..13ca06a 100644 ---- a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -+++ b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -@@ -3,6 +3,11 @@ require 'ipaddr' - Puppet::Type.newtype(:network_route) do - @doc = "Manage non-volatile route configuration information" - -+ feature :provider_options, <<-EOD -+ The provider can accept an arbitrary options string. The semantics of -+ these options will depend on the provider. -+ EOD -+ - ensurable - - newparam(:name) do --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch deleted file mode 100644 index efc5446..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 49e103bbeb4d6efe1ca75f581d41ee6a8ed7caf5 Mon Sep 17 00:00:00 2001 -From: Romanos Skiadas -Date: Wed, 2 Nov 2016 14:51:47 -0400 -Subject: [PATCH] Don't write absent to redhat route files and test for this - -Signed-off-by: Allain Legacy ---- - .../network/lib/puppet/provider/network_route/redhat.rb | 9 +++++++-- - .../spec/unit/provider/network_route/redhat_spec.rb | 17 ++++++++++++++++- - 2 files changed, 23 insertions(+), 3 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index f45eab5..9841c8e 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -84,10 +84,15 @@ Puppet::Type.type(:network_route).provide(:redhat) do - raise Puppet::Error, "#{provider.name} does not have a #{prop}." if provider.send(prop).nil? - end - if provider.network == "default" -- contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface} #{provider.options}\n" -+ contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}\n" - else -- contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface} #{provider.options}\n" -+ contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}\n" - end -+ contents << if provider.options == :absent -+ "\n" -+ else -+ " #{provider.options}\n" -+ end - end - contents.join - end -diff --git a/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb b/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb -index dfc9d6b..1ad2128 100644 ---- a/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb -+++ b/packstack/puppet/modules/network/spec/unit/provider/network_route/redhat_spec.rb -@@ -91,7 +91,18 @@ describe Puppet::Type.type(:network_route).provider(:redhat) do - ) - end - -- let(:content) { described_class.format_file('', [route1_provider, route2_provider, defaultroute_provider]) } -+ let(:nooptions_provider) do -+ stub('nooptions_provider', -+ name: 'default', -+ network: 'default', -+ netmask: '', -+ gateway: '10.0.0.1', -+ interface: 'eth2', -+ options: :absent -+ ) -+ end -+ -+ let(:content) { described_class.format_file('', [route1_provider, route2_provider, defaultroute_provider, nooptions_provider]) } - - describe "writing the route line" do - describe "For standard (non-default) routes" do -@@ -122,6 +133,10 @@ describe Puppet::Type.type(:network_route).provider(:redhat) do - it "should have the correct fields appended" do - content.scan(/^default .*$/).first.should be_include("default via 10.0.0.1 dev eth1") - end -+ -+ it 'should not contain the word absent when no options are defined' do -+ expect(content).to_not match(/absent/) -+ end - end - end - end --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/fix-absent-options.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/fix-absent-options.patch deleted file mode 100644 index 23c738f..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/fix-absent-options.patch +++ /dev/null @@ -1,113 +0,0 @@ -From f22d4c9d24939afb8f29323adffe3eb570f14804 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=3D=3FUTF-8=3Fq=3FIgor=3D20Gali=3DC4=3D87=3F=3D?= - -Date: Wed, 2 Nov 2016 14:54:28 -0400 -Subject: [PATCH] fix "absent" options - -analogous to redhat, we check if options are absent, before appending -them to the file. This fixes #160 - -Signed-off-by: Allain Legacy ---- - .../lib/puppet/provider/network_route/redhat.rb | 10 ++--- - .../lib/puppet/provider/network_route/routes.rb | 3 +- - .../unit/provider/network_route/routes_spec.rb | 48 ++++++++++++++++++++++ - 3 files changed, 53 insertions(+), 8 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index 9841c8e..7123d44 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -84,15 +84,11 @@ Puppet::Type.type(:network_route).provide(:redhat) do - raise Puppet::Error, "#{provider.name} does not have a #{prop}." if provider.send(prop).nil? - end - if provider.network == "default" -- contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}\n" -+ contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}" - else -- contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}\n" -+ contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}" - end -- contents << if provider.options == :absent -- "\n" -- else -- " #{provider.options}\n" -- end -+ contents << (provider.options == :absent ? "\n" : " #{provider.options}\n") - end - contents.join - end -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb -index 2dd579f..ca7066d 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/routes.rb -@@ -93,7 +93,8 @@ Puppet::Type.type(:network_route).provide(:routes) do - raise Puppet::Error, "#{provider.name} is missing the required parameter 'gateway'." if provider.gateway.nil? - raise Puppet::Error, "#{provider.name} is missing the required parameter 'interface'." if provider.interface.nil? - -- contents << "#{provider.network} #{provider.netmask} #{provider.gateway} #{provider.interface} #{provider.options}\n" -+ contents << "#{provider.network} #{provider.netmask} #{provider.gateway} #{provider.interface}" -+ contents << (provider.options == :absent ? "\n" : " #{provider.options}\n") - end - - contents.join -diff --git a/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb b/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb -index 2e55eba..9376739 100644 ---- a/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb -+++ b/packstack/puppet/modules/network/spec/unit/provider/network_route/routes_spec.rb -@@ -93,4 +93,52 @@ describe Puppet::Type.type(:network_route).provider(:routes) do - end - end - end -+ describe 'when formatting simple files' do -+ let(:route1_provider) do -+ stub('route1_provider', -+ name: '172.17.67.0', -+ network: '172.17.67.0', -+ netmask: '255.255.255.0', -+ gateway: '172.18.6.2', -+ interface: 'vlan200', -+ options: :absent, -+ ) -+ end -+ -+ let(:route2_provider) do -+ stub('lo_provider', -+ name: '172.28.45.0', -+ network: '172.28.45.0', -+ netmask: '255.255.255.0', -+ gateway: '172.18.6.2', -+ interface: 'eth0', -+ options: :absent, -+ ) -+ end -+ -+ let(:content) { described_class.format_file('', [route1_provider, route2_provider]) } -+ -+ describe 'writing the route line' do -+ it 'should write only fields' do -+ expect(content.scan(/^172.17.67.0 .*$/).length).to eq(1) -+ expect(content.scan(/^172.17.67.0 .*$/).first.split(/\s/, 5).length).to eq(4) -+ end -+ -+ it 'should have the correct fields appended' do -+ expect(content.scan(/^172.17.67.0 .*$/).first).to include('172.17.67.0 255.255.255.0 172.18.6.2 vlan200') -+ end -+ -+ it 'should fail if the netmask property is not defined' do -+ route2_provider.unstub(:netmask) -+ route2_provider.stubs(:netmask).returns nil -+ expect { content }.to raise_exception -+ end -+ -+ it 'should fail if the gateway property is not defined' do -+ route2_provider.unstub(:gateway) -+ route2_provider.stubs(:gateway).returns nil -+ expect { content }.to raise_exception -+ end -+ end -+ end - end --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/ipv6-static-route-support.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/ipv6-static-route-support.patch deleted file mode 100644 index 10456b1..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/ipv6-static-route-support.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 49820add1d1e5f63343615ead9b551b8679f466d Mon Sep 17 00:00:00 2001 -From: Kevin Smith -Date: Mon, 16 Oct 2017 15:06:37 -0500 -Subject: [PATCH 1/1] ipv6 static route support - ---- - .../lib/puppet/provider/network_route/redhat.rb | 3 ++- - .../network/lib/puppet/type/network_route.rb | 26 ++++++++++++++-------- - .../network/spec/unit/type/network_route_spec.rb | 5 +++++ - 3 files changed, 24 insertions(+), 10 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index 5073519..c289f5f 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -93,7 +93,8 @@ Puppet::Type.type(:network_route).provide(:redhat) do - if provider.network == "default" - contents << "#{provider.network} via #{provider.gateway} dev #{provider.interface}" - else -- contents << "#{provider.network}/#{provider.netmask} via #{provider.gateway} dev #{provider.interface}" -+ # provider.name will have cidr notation -+ contents << "#{provider.name} via #{provider.gateway} dev #{provider.interface}" - end - contents << (provider.options == :absent ? "\n" : " #{provider.options}\n") - end -diff --git a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -index 7ab67dd..fd52c58 100644 ---- a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -+++ b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -@@ -5,8 +5,6 @@ Puppet::Type.newtype(:network_route) do - - ensurable - -- IPV4_ADDRESS_REGEX = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/ -- - newparam(:name) do - isnamevar - desc "The name of the network route" -@@ -18,7 +16,7 @@ Puppet::Type.newtype(:network_route) do - validate do |value| - begin - t = IPAddr.new(value) unless value == "default" -- rescue ArgumentError -+ rescue - fail("Invalid value for network: #{value}") - end - end -@@ -29,17 +27,27 @@ Puppet::Type.newtype(:network_route) do - desc "The subnet mask to apply to the route" - - validate do |value| -- unless (value.length <= 2 or value =~ IPV4_ADDRESS_REGEX) -+ unless value.length <= 3 || (IPAddr.new(value) rescue false) - fail("Invalid value for argument netmask: #{value}") - end - end - - munge do |value| -- case value -- when IPV4_ADDRESS_REGEX -- value -- when /^\d+$/ -- IPAddr.new('255.255.255.255').mask(value.strip.to_i).to_s -+ # '255.255.255.255'.to_i will return 255, so we try to convert it back: -+ if value.to_i.to_s == value -+ if value.to_i <= 32 -+ IPAddr.new('255.255.255.255').mask(value.strip.to_i).to_s -+ else -+ IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(value.strip.to_i).to_s -+ end -+ else -+ if (IPAddr.new(value).ipv6? rescue false) -+ IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(value).to_s -+ elsif (IPAddr.new(value).ipv4? rescue false) -+ IPAddr.new('255.255.255.255').mask(value).to_s -+ else -+ raise("Invalid value for argument netmask: #{value}") -+ end - end - end - end -diff --git a/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb b/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb -index 24e9da3..6e6f3e4 100644 ---- a/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb -+++ b/packstack/puppet/modules/network/spec/unit/type/network_route_spec.rb -@@ -55,6 +55,11 @@ describe Puppet::Type.type(:network_route) do - r[:netmask].should == '255.255.255.0' - end - -+ it 'should convert IPv6 netmasks of the CIDR form' do -+ r = Puppet::Type.type(:network_route).new(name: 'lxd bridge', network: 'fd58:281b:6eef:eb3d::', netmask: '64', gateway: 'fd58:281b:6eef:eb3d::1', interface: 'lxdbr0') -+ expect(r[:netmask]).to eq('ffff:ffff:ffff:ffff::') -+ end -+ - it "should convert netmasks of the expanded netmask form" do - r = described_class.new(:name => '192.168.1.0/24', :network => '192.168.1.0', :netmask => '255.255.128.0', :gateway => '23.23.23.42', :interface => 'eth0') - r[:netmask].should == '255.255.128.0' --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/permit-inservice-update-of-static-routes.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/permit-inservice-update-of-static-routes.patch deleted file mode 100644 index 66e7623..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/permit-inservice-update-of-static-routes.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 46ec08e58419bb73bf49b44cf32fa3d304236615 Mon Sep 17 00:00:00 2001 -From: Kevin Smith -Date: Thu, 5 Oct 2017 13:33:12 -0500 -Subject: [PATCH 1/1] permit inservice update of static routes - ---- - .../network/lib/puppet/provider/network_route/redhat.rb | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -index 7123d44..5073519 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/redhat.rb -@@ -18,12 +18,18 @@ Puppet::Type.type(:network_route).provide(:redhat) do - - has_feature :provider_options - -+ # WRS: Generate temporary copies. It will get compared to files under -+ # /etc/sysconfig/network-scripts afterward. Only config that have changed -+ # will get replaced. Don't let puppet directly manage them, else it will -+ # trigger un-wanted networking actions (like up/down). -+ RSCRIPT_DIRECTORY = "/var/run/network-scripts.puppet" -+ - def select_file -- "/etc/sysconfig/network-scripts/route-#{@resource[:interface]}" -+ "#{RSCRIPT_DIRECTORY}/route-#{@resource[:interface]}" - end - - def self.target_files -- Dir["/etc/sysconfig/network-scripts/route-*"] -+ Dir["#{RSCRIPT_DIRECTORY}/route-*"] - end - - def self.parse_file(filename, contents) -@@ -76,6 +82,7 @@ Puppet::Type.type(:network_route).provide(:redhat) do - - # Generate an array of sections - def self.format_file(filename, providers) -+ Dir.mkdir(RSCRIPT_DIRECTORY) unless File.exists?(RSCRIPT_DIRECTORY) - contents = [] - contents << header - # Build routes -@@ -103,4 +110,9 @@ Puppet::Type.type(:network_route).provide(:redhat) do - HEADER - str - end -+ -+ def self.post_flush_hook(filename) -+ File.chmod(0644, filename) -+ end -+ - end --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/puppet-network-Kilo-quilt-changes.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/puppet-network-Kilo-quilt-changes.patch deleted file mode 100644 index 841198f..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/puppet-network-Kilo-quilt-changes.patch +++ /dev/null @@ -1,658 +0,0 @@ -From 8e14e2e258a8f2f7189ed37c6337c41fbff0362a Mon Sep 17 00:00:00 2001 -From: Al Bailey -Date: Mon, 6 Jun 2016 17:13:09 -0400 -Subject: [PATCH] puppet-network Kilo quilt changes - ---- - .../lib/puppet/provider/network_config/redhat.rb | 39 ++- - .../lib/puppet/provider/network_config/wrlinux.rb | 296 +++++++++++++++++++++ - .../lib/puppet/provider/network_route/wrlinux.rb | 109 ++++++++ - .../network/lib/puppet/type/network_config.rb | 4 + - packstack/puppet/modules/network/manifests/bond.pp | 22 ++ - .../puppet/modules/network/manifests/bond/setup.pp | 2 + - .../modules/network/manifests/bond/wrlinux.pp | 56 ++++ - 7 files changed, 521 insertions(+), 7 deletions(-) - create mode 100644 packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb - create mode 100644 packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb - create mode 100644 packstack/puppet/modules/network/manifests/bond/wrlinux.pp - -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -index 4b6de7e..758f387 100644 ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -@@ -19,7 +19,12 @@ Puppet::Type.type(:network_config).provide(:redhat) do - has_feature :provider_options - - # @return [String] The path to network-script directory on redhat systems -- SCRIPT_DIRECTORY = "/etc/sysconfig/network-scripts" -+ # SCRIPT_DIRECTORY = "/etc/sysconfig/network-scripts" -+ # WRS: Generate temporary copies. It will get compared to files under -+ # /etc/sysconfig/network-scripts afterward. Only config that have changed -+ # will get replaced. Don't let puppet directly manage them, else it will -+ # trigger un-wanted networking actions (like up/down). -+ SCRIPT_DIRECTORY = "/var/run/network-scripts.puppet" - - # The valid vlan ID range is 0-4095; 4096 is out of range - VLAN_RANGE_REGEX = %r[\d{1,3}|40[0-9][0-5]] -@@ -35,6 +40,7 @@ Puppet::Type.type(:network_config).provide(:redhat) do - :name => 'DEVICE', - :hotplug => 'HOTPLUG', - :mtu => 'MTU', -+ :gateway => 'GATEWAY', - } - - # Map provider instances to files based on their name -@@ -60,8 +66,14 @@ Puppet::Type.type(:network_config).provide(:redhat) do - # RedhatProvider.target_files - # # => ['/etc/sysconfig/network-scripts/ifcfg-eth0', '/etc/sysconfig/network-scripts/ifcfg-eth1'] - def self.target_files(script_dir = SCRIPT_DIRECTORY) -- entries = Dir.entries(script_dir).select {|entry| entry.match SCRIPT_REGEX} -- entries.map {|entry| File.join(SCRIPT_DIRECTORY, entry)} -+ entries = [] -+ if Dir.exists?(SCRIPT_DIRECTORY) -+ Dir.foreach(SCRIPT_DIRECTORY) do |item| -+ next if not item.match SCRIPT_REGEX -+ entries << item -+ end -+ end -+ entries - end - - # Convert a redhat network script into a hash -@@ -184,6 +196,8 @@ Puppet::Type.type(:network_config).provide(:redhat) do - end - - def self.format_file(filename, providers) -+ Dir.mkdir(SCRIPT_DIRECTORY) unless File.exists?(SCRIPT_DIRECTORY) -+ - if providers.length == 0 - return "" - elsif providers.length > 1 -@@ -193,11 +207,11 @@ Puppet::Type.type(:network_config).provide(:redhat) do - provider = providers[0] - props = {} - -- # Map everything to a flat hash -- props = (provider.options || {}) -+ props = provider.options if provider.options && provider.options != :absent - -+ # Map everything to a flat hash - NAME_MAPPINGS.keys.each do |type_name| -- if (val = provider.send(type_name)) -+ if (val = provider.send(type_name)) && val != :absent - props[type_name] = val - end - end -@@ -214,11 +228,11 @@ Puppet::Type.type(:network_config).provide(:redhat) do - str << %{#{key}=#{val}\n} - end - -+ content.prepend(header) - content - end - - def self.unmunge(props) -- - pairs = {} - - [:onboot, :hotplug].each do |bool_property| -@@ -245,6 +259,17 @@ Puppet::Type.type(:network_config).provide(:redhat) do - pairs - end - -+ def self.header -+ str = <<-HEADER -+# HEADER: This file is is being managed by puppet. Changes to -+# HEADER: interfaces that are not being managed by puppet will persist; -+# HEADER: however changes to interfaces that are being managed by puppet will -+# HEADER: be overwritten. In addition, file order is NOT guaranteed. -+# HEADER: Last generated at: #{Time.now} -+HEADER -+ str -+ end -+ - def self.post_flush_hook(filename) - File.chmod(0644, filename) - end -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb -new file mode 100644 -index 0000000..44c645a ---- /dev/null -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_config/wrlinux.rb -@@ -0,0 +1,296 @@ -+require 'puppetx/filemapper' -+ -+Puppet::Type.type(:network_config).provide(:wrlinux) do -+ # Wind River Linux network_config interfaces provider. -+ # -+ # This provider uses the filemapper mixin to map the interfaces file to a -+ # collection of network_config providers, and back. -+ # -+ include PuppetX::FileMapper -+ -+ desc "Wind River interfaces style provider" -+ -+ confine :osfamily => :wrlinux -+ defaultfor :osfamily => :wrlinux -+ -+ has_feature :provider_options -+ has_feature :hotpluggable -+ -+ def select_file -+ '/var/run/interfaces.puppet' -+ end -+ -+ def self.target_files -+ ['/var/run/interfaces.puppet'] -+ end -+ -+ class MalformedInterfacesError < Puppet::Error -+ def initialize(msg = nil) -+ msg = 'Malformed wrlinux interfaces file; cannot instantiate network_config resources' if msg.nil? -+ super -+ end -+ end -+ -+ def self.raise_malformed -+ @failed = true -+ raise MalformedInterfacesError -+ end -+ -+ class Instance -+ -+ attr_reader :name -+ -+ # Booleans -+ attr_accessor :onboot, :hotplug -+ -+ -+ # These fields are going to get rearranged to resolve issue 16 -+ # https://github.com/adrienthebo/puppet-network/issues/16 -+ attr_accessor :ipaddress, :netmask, :family, :method, :mtu -+ -+ # Options hash -+ attr_reader :options -+ -+ def initialize(name) -+ @name = name -+ -+ @options = Hash.new {|hash, key| hash[key] = []} -+ end -+ -+ def to_hash -+ h = { -+ :name => @name, -+ :onboot => @onboot, -+ :hotplug => @hotplug, -+ :ipaddress => @ipaddress, -+ :netmask => @netmask, -+ :family => @family, -+ :method => @method, -+ :mtu => @mtu, -+ :options => squeeze_options -+ } -+ -+ h.inject({}) do |hash, (key, val)| -+ hash[key] = val unless val.nil? -+ hash -+ end -+ end -+ -+ def squeeze_options -+ @options.inject({}) do |hash, (key, value)| -+ if value.size <= 1 -+ hash[key] = value.pop -+ else -+ hash[key] = value -+ end -+ -+ hash -+ end -+ end -+ -+ class << self -+ -+ def reset! -+ @interfaces = {} -+ end -+ -+ # @return [Array] All class instances -+ def all_instances -+ @interfaces ||= {} -+ @interfaces -+ end -+ -+ def [](name) -+ if all_instances[name] -+ obj = all_instances[name] -+ else -+ obj = self.new(name) -+ all_instances[name] = obj -+ end -+ -+ obj -+ end -+ end -+ end -+ -+ def self.parse_file(filename, contents) -+ # Debian has a very irregular format for the interfaces file. The -+ # parse_file method is somewhat derived from the ifup executable -+ # supplied in the debian ifupdown package. The source can be found at -+ # http://packages.debian.org/squeeze/ifupdown -+ -+ -+ # The debian interfaces implementation requires global state while parsing -+ # the file; namely, the stanza being parsed as well as the interface being -+ # parsed. -+ status = :none -+ current_interface = nil -+ -+ lines = contents.split("\n") -+ # TODO Join lines that end with a backslash -+ -+ # Iterate over all lines and determine what attributes they create -+ lines.each do |line| -+ -+ # Strip off any trailing comments -+ line.sub!(/#.*$/, '') -+ -+ case line -+ when /^\s*#|^\s*$/ -+ # Ignore comments and blank lines -+ next -+ -+ when /^auto|^allow-auto/ -+ # Parse out any auto sections -+ interfaces = line.split(' ') -+ interfaces.delete_at(0) -+ -+ interfaces.each do |name| -+ Instance[name].onboot = true -+ end -+ -+ # Reset the current parse state -+ current_interface = nil -+ -+ when /^allow-hotplug/ -+ # parse out allow-hotplug lines -+ -+ interfaces = line.split(' ') -+ interfaces.delete_at(0) -+ -+ interfaces.each do |name| -+ Instance[name].hotplug = true -+ end -+ -+ # Don't reset Reset the current parse state -+ when /^iface/ -+ -+ # Format of the iface line: -+ # -+ # iface -+ # zero or more options for -+ -+ if match = line.match(/^iface\s+(\S+)\s+(\S+)\s+(\S+)/) -+ name = match[1] -+ family = match[2] -+ method = match[3] -+ -+ # If an iface block for this interface has been seen, the file is -+ # malformed. -+ raise_malformed if Instance[name] and Instance[name].family -+ -+ status = :iface -+ current_interface = name -+ -+ # This is done automatically -+ #Instance[name].name = name -+ Instance[name].family = family -+ Instance[name].method = method -+ -+ else -+ # If we match on a string with a leading iface, but it isn't in the -+ # expected format, malformed blar blar -+ raise_malformed -+ end -+ -+ when /^mapping/ -+ -+ # XXX dox -+ raise Puppet::DevError, "Debian interfaces mapping parsing not implemented." -+ status = :mapping -+ -+ else -+ # We're currently examining a line that is within a mapping or iface -+ # stanza, so we need to validate the line and add the options it -+ # specifies to the known state of the interface. -+ -+ case status -+ when :iface -+ if match = line.match(/(\S+)\s+(\S.*)/) -+ # If we're parsing an iface stanza, then we should receive a set of -+ # lines that contain two or more space delimited strings. Append -+ # them as options to the iface in an array. -+ -+ key = match[1] -+ val = match[2] -+ -+ name = current_interface -+ -+ case key -+ when 'address'; Instance[name].ipaddress = val -+ when 'netmask'; Instance[name].netmask = val -+ when 'mtu'; Instance[name].mtu = val -+ else Instance[name].options[key] << val -+ end -+ else -+ raise_malformed -+ end -+ when :mapping -+ raise Puppet::DevError, "Debian interfaces mapping parsing not implemented." -+ when :none -+ raise_malformed -+ end -+ end -+ end -+ -+ Instance.all_instances.map {|name, instance| instance.to_hash } -+ end -+ -+ # Generate an array of sections -+ def self.format_file(filename, providers) -+ contents = [] -+ contents << header -+ -+ # Add onboot interfaces -+ if (auto_interfaces = providers.select {|provider| provider.onboot == true }) -+ stanza = [] -+ stanza << "auto " + auto_interfaces.map(&:name).sort.join(" ") -+ contents << stanza.join("\n") -+ end -+ -+ # Build iface stanzas -+ providers.sort_by(&:name).each do |provider| -+ # TODO add validation method -+ raise Puppet::Error, "#{provider.name} does not have a method." if provider.method.nil? -+ raise Puppet::Error, "#{provider.name} does not have a family." if provider.family.nil? -+ -+ stanza = [] -+ stanza << %{iface #{provider.name} #{provider.family} #{provider.method}} -+ -+ [ -+ [:ipaddress, 'address'], -+ [:netmask, 'netmask'], -+ [:mtu, 'mtu'], -+ ].each do |(property, section)| -+ stanza << " #{section} #{provider.send property}" if provider.send(property) and provider.send(property) != :absent -+ end -+ -+ if provider.options and provider.options != :absent -+ provider.options.each_pair do |key, val| -+ if val.is_a? String -+ stanza << " #{key} #{val}" -+ elsif val.is_a? Array -+ val.each { |entry| stanza << " #{key} #{entry}" } -+ else -+ raise Puppet::Error, "#{self} options key #{key} expects a String or Array, got #{val.class}" -+ end -+ end -+ end -+ -+ contents << stanza.join("\n") -+ end -+ -+ contents.map {|line| line + "\n\n"}.join -+ end -+ -+ def self.header -+ str = <<-HEADER -+# HEADER: This file is is being managed by puppet. Changes to -+# HEADER: interfaces that are not being managed by puppet will persist; -+# HEADER: however changes to interfaces that are being managed by puppet will -+# HEADER: be overwritten. In addition, file order is NOT guaranteed. -+# HEADER: Last generated at: #{Time.now} -+HEADER -+ str -+ end -+end -diff --git a/packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb b/packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb -new file mode 100644 -index 0000000..d3fa7b5 ---- /dev/null -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_route/wrlinux.rb -@@ -0,0 +1,109 @@ -+require 'ipaddr' -+require 'puppetx/filemapper' -+ -+Puppet::Type.type(:network_route).provide(:wrlinux) do -+ # Wind River Linux network_route routes provider. -+ # -+ # This provider uses the filemapper mixin to map the routes file to a -+ # collection of network_route providers, and back. -+ # -+ include PuppetX::FileMapper -+ -+ desc "Wind River routes style provider" -+ -+ confine :osfamily => :wrlinux -+ -+ # $ dpkg -S /etc/network/if-up.d/20static-routes -+ # ifupdown-extra: /etc/network/if-up.d/20static-routes -+ confine :exists => '/etc/network/if-up.d/20static-routes' -+ -+ defaultfor :osfamily => :wrlinux -+ -+ has_feature :provider_options -+ -+ def select_file -+ '/etc/network/routes' -+ end -+ -+ def self.target_files -+ ['/etc/network/routes'] -+ end -+ -+ class MalformedRoutesError < Puppet::Error -+ def initialize(msg = nil) -+ msg = 'Malformed wrlinux routes file; cannot instantiate network_route resources' if msg.nil? -+ super -+ end -+ end -+ -+ def self.raise_malformed -+ @failed = true -+ raise MalformedRoutesError -+ end -+ -+ def self.parse_file(filename, contents) -+ # Build out an empty hash for new routes for storing their configs. -+ route_hash = Hash.new do |hash, key| -+ hash[key] = {} -+ hash[key][:name] = key -+ hash[key] -+ end -+ -+ lines = contents.split("\n") -+ lines.each do |line| -+ # Strip off any trailing comments -+ line.sub!(/#.*$/, '') -+ -+ if line =~ /^\s*#|^\s*$/ -+ # Ignore comments and blank lines -+ next -+ end -+ -+ route = line.split(' ', 5) -+ -+ if route.length < 4 -+ raise_malformed -+ end -+ -+ # use the CIDR version of the target as :name -+ cidr_target = "#{route[0]}/#{IPAddr.new(route[1]).to_i.to_s(2).count('1')}" -+ -+ route_hash[cidr_target][:network] = route[0] -+ route_hash[cidr_target][:netmask] = route[1] -+ route_hash[cidr_target][:gateway] = route[2] -+ route_hash[cidr_target][:interface] = route[3] -+ route_hash[cidr_target][:options] = route[4] if route[4] -+ end -+ -+ route_hash.values -+ end -+ -+ # Generate an array of sections -+ def self.format_file(filename, providers) -+ contents = [] -+ contents << header -+ -+ # Build routes -+ providers.sort_by(&:name).each do |provider| -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'network'." if provider.network.nil? -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'netmask'." if provider.netmask.nil? -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'gateway'." if provider.gateway.nil? -+ raise Puppet::Error, "#{provider.name} is missing the required parameter 'interface'." if provider.interface.nil? -+ -+ contents << "#{provider.network} #{provider.netmask} #{provider.gateway} #{provider.interface} #{provider.options}\n" -+ end -+ -+ contents.join -+ end -+ -+ def self.header -+ str = <<-HEADER -+# HEADER: This file is is being managed by puppet. Changes to -+# HEADER: routes that are not being managed by puppet will persist; -+# HEADER: however changes to routes that are being managed by puppet will -+# HEADER: be overwritten. In addition, file order is NOT guaranteed. -+# HEADER: Last generated at: #{Time.now} -+HEADER -+ str -+ end -+end -diff --git a/packstack/puppet/modules/network/lib/puppet/type/network_config.rb b/packstack/puppet/modules/network/lib/puppet/type/network_config.rb -index a50a0df..1297ad7 100644 ---- a/packstack/puppet/modules/network/lib/puppet/type/network_config.rb -+++ b/packstack/puppet/modules/network/lib/puppet/type/network_config.rb -@@ -95,6 +95,10 @@ Puppet::Type.newtype(:network_config) do - defaultto :raw - end - -+ newproperty(:gateway) do -+ desc 'The IP address of the network router or gateway device (if any)' -+ end -+ - # `:options` provides an arbitrary passthrough for provider properties, so - # that provider specific behavior doesn't clutter up the main type but still - # allows for more powerful actions to be taken. -diff --git a/packstack/puppet/modules/network/manifests/bond.pp b/packstack/puppet/modules/network/manifests/bond.pp -index d6d98ce..26ca104 100644 ---- a/packstack/puppet/modules/network/manifests/bond.pp -+++ b/packstack/puppet/modules/network/manifests/bond.pp -@@ -188,6 +188,28 @@ define network::bond( - require => Kmod::Alias[$name], - } - } -+ WRLinux: { -+ network::bond::wrlinux { $name: -+ slaves => $slaves, -+ ensure => $ensure, -+ ipaddress => $ipaddress, -+ netmask => $netmask, -+ method => $method, -+ family => $family, -+ onboot => $onboot, -+ -+ mode => $mode, -+ miimon => $miimon, -+ downdelay => $downdelay, -+ updelay => $updelay, -+ lacp_rate => $lacp_rate, -+ primary => $primary, -+ primary_reselect => $primary_reselect, -+ xmit_hash_policy => $xmit_hash_policy, -+ -+ require => Kmod::Alias[$name], -+ } -+ } - RedHat: { - network::bond::redhat { $name: - ensure => $ensure, -diff --git a/packstack/puppet/modules/network/manifests/bond/setup.pp b/packstack/puppet/modules/network/manifests/bond/setup.pp -index abe1252..0a30767 100644 ---- a/packstack/puppet/modules/network/manifests/bond/setup.pp -+++ b/packstack/puppet/modules/network/manifests/bond/setup.pp -@@ -10,5 +10,7 @@ class network::bond::setup { - ensure => present, - } - } -+ WRLinux: { -+ } - } - } -diff --git a/packstack/puppet/modules/network/manifests/bond/wrlinux.pp b/packstack/puppet/modules/network/manifests/bond/wrlinux.pp -new file mode 100644 -index 0000000..e240341 ---- /dev/null -+++ b/packstack/puppet/modules/network/manifests/bond/wrlinux.pp -@@ -0,0 +1,56 @@ -+# = Define: network::bond::wrlinux -+# -+# Instantiate bonded interfaces on Debian based systems. -+# -+# == See also -+# -+# * Debian Network Bonding http://wiki.wrlinux.org/Bonding -+define network::bond::wrlinux( -+ $slaves, -+ $ensure = present, -+ $ipaddress = undef, -+ $netmask = undef, -+ $method = undef, -+ $family = undef, -+ $onboot = undef, -+ -+ $mode = undef, -+ $miimon = undef, -+ $downdelay = undef, -+ $updelay = undef, -+ $lacp_rate = undef, -+ $primary = undef, -+ $primary_reselect = undef, -+ $xmit_hash_policy = undef, -+) { -+ -+ $raw = { -+ 'bond-slaves' => join($slaves, ' '), -+ 'bond-mode' => $mode, -+ 'bond-miimon' => $miimon, -+ 'bond-downdelay' => $downdelay, -+ 'bond-updelay' => $updelay, -+ 'bond-lacp-rate' => $lacp_rate, -+ 'bond-primary' => $primary, -+ 'bond-primary-reselect' => $primary_reselect, -+ 'bond-xmit-hash-policy' => $xmit_hash_policy, -+ } -+ -+ $opts = compact_hash($raw) -+ -+ network_config { $name: -+ ensure => $ensure, -+ ipaddress => $ipaddress, -+ netmask => $netmask, -+ family => $family, -+ method => $method, -+ onboot => $onboot, -+ options => $opts, -+ } -+ -+ network_config { $slaves: -+ ensure => absent, -+ reconfigure => true, -+ before => Network_config[$name], -+ } -+} --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/puppet-network-support-ipv6.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/puppet-network-support-ipv6.patch deleted file mode 100644 index b6d2f3c..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/puppet-network-support-ipv6.patch +++ /dev/null @@ -1,46 +0,0 @@ -Index: packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb ---- a/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -+++ b/packstack/puppet/modules/network/lib/puppet/provider/network_config/redhat.rb -@@ -224,6 +224,11 @@ - - pairs = self.unmunge props - -+ ip_version = provider.send(:family) -+ if (ip_version.to_s == "inet6") -+ pairs = self.ipv6_fixup pairs -+ end -+ - content = pairs.inject('') do |str, (key, val)| - str << %{#{key}=#{val}\n} - end -@@ -259,6 +264,30 @@ - pairs - end - -+ def self.ipv6_fixup(pairs) -+ pairs['IPV6INIT'] = 'yes' -+ -+ if (pairs.include? 'NETMASK' and pairs.include? 'IPADDR') -+ pairs['IPV6ADDR'] = pairs['IPADDR'].to_s + "/" + pairs['NETMASK'].to_s -+ pairs.delete('NETMASK') -+ pairs.delete('IPADDR') -+ elsif (pairs.include? 'IPADDR') -+ pairs['IPV6ADDR'] = pairs['IPADDR'].to_s -+ pairs.delete('IPADDR') -+ end -+ -+ if (pairs.include? 'GATEWAY') -+ pairs['IPV6_DEFAULTGW'] = pairs['GATEWAY'] -+ pairs.delete('GATEWAY') -+ end -+ -+ if (pairs['BOOTPROTO'].to_s == 'dhcp') -+ pairs['DHCPV6C'] = 'yes' -+ pairs['DHCLIENTARGS'] = '-1' -+ end -+ pairs -+ end -+ - def self.header - str = <<-HEADER - # HEADER: This file is is being managed by puppet. Changes to diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/route-options-support.patch b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/route-options-support.patch deleted file mode 100644 index 37bf138..0000000 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/files/puppet-network/route-options-support.patch +++ /dev/null @@ -1,28 +0,0 @@ -From c26a70ab9d5839f90148c578edc5d15133355194 Mon Sep 17 00:00:00 2001 -From: Kevin Smith -Date: Wed, 25 Oct 2017 07:37:52 -0500 -Subject: [PATCH 1/1] route options support - ---- - packstack/puppet/modules/network/lib/puppet/type/network_route.rb | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -index fd52c58..13ca06a 100644 ---- a/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -+++ b/packstack/puppet/modules/network/lib/puppet/type/network_route.rb -@@ -3,6 +3,11 @@ require 'ipaddr' - Puppet::Type.newtype(:network_route) do - @doc = "Manage non-volatile route configuration information" - -+ feature :provider_options, <<-EOD -+ The provider can accept an arbitrary options string. The semantics of -+ these options will depend on the provider. -+ EOD -+ - ensurable - - newparam(:name) do --- -1.8.3.1 - diff --git a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/puppet-network_git.bbappend b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/puppet-network_git.bbappend index 3eb5463..bddadf3 100644 --- a/meta-starlingx/meta-stx-cloud/recipes-support/puppet/puppet-network_git.bbappend +++ b/meta-starlingx/meta-stx-cloud/recipes-support/puppet/puppet-network_git.bbappend @@ -1,13 +1,19 @@ +inherit stx-metadata + +STX_REPO = "integ" +STX_SUBPATH = "config/puppet-modules/${BPN}/centos/files" + +SRC_URI_STX += " \ + file://puppet-network-Kilo-quilt-changes.patch;striplevel=5 \ + file://puppet-network-support-ipv6.patch;striplevel=5 \ + file://Don-t-write-absent-to-redhat-route-files-and-test-fo.patch;striplevel=5 \ + file://fix-absent-options.patch;striplevel=5 \ + file://permit-inservice-update-of-static-routes.patch;striplevel=5 \ + file://ipv6-static-route-support.patch;striplevel=5 \ + file://route-options-support.patch;striplevel=5 \ + " -FILESEXTRAPATHS_prepend := "${THISDIR}/files:" SRC_URI += " \ - file://${BPN}/puppet-network-Kilo-quilt-changes.patch;striplevel=5 \ - file://${BPN}/puppet-network-support-ipv6.patch;striplevel=5 \ - file://${BPN}/Don-t-write-absent-to-redhat-route-files-and-test-fo.patch;striplevel=5 \ - file://${BPN}/fix-absent-options.patch;striplevel=5 \ - file://${BPN}/permit-inservice-update-of-static-routes.patch;striplevel=5 \ - file://${BPN}/ipv6-static-route-support.patch;striplevel=5 \ - file://${BPN}/route-options-support.patch;striplevel=5 \ file://${BPN}/0001-Stx-uses-puppet-boolean-instead-of-adrien-boolean.patch \ file://${BPN}/puppet-network-updates-for-poky-stx.patch \ file://${BPN}/puppet-network-config-poky-provider.patch \