Skip to content
Snippets Groups Projects
router.pp 8.04 KiB
class iaas::profile::neutron::router (
  $public_interface = hiera('iaas::public_interface', undef),
  $public_gateway = hiera('iaas::public_gateway', undef),

  $external_device1 = undef,
  $external_network1 = hiera('iaas::profile::neutron::external_network1', undef),
  $external_gateway1 = hiera('iaas::profile::neutron::external_gateway1', undef),

  $external_device2 = undef,
  $external_network2 = hiera('iaas::profile::neutron::external_network2', undef),
  $external_gateway2 = hiera('iaas::profile::neutron::external_gateway2', undef),

  $neutron_password = hiera('iaas::profile::neutron::password', undef),
  $neutron_secret = hiera('iaas::profile::neutron::secret', undef),

  $region = hiera('iaas::region', undef),
  $endpoint = hiera('iaas::role::endpoint::main_address', undef),

  $mtu = 1438,

) {

  sysctl::value { "net.ipv4.ip_forward": value => "1" }
  sysctl::value { "net.ipv4.conf.all.rp_filter": value => "0" }
  sysctl::value { "net.ipv4.conf.default.rp_filter": value => "0" }

  sysctl::value { "net.ipv4.conf.all.accept_redirects": value => "0" }
  sysctl::value { "net.ipv4.conf.default.accept_redirects": value => "0" }
  sysctl::value { "net.ipv4.conf.all.send_redirects": value => "0" }
  sysctl::value { "net.ipv4.conf.default.send_redirects": value => "0" }

  package { 'ifupdown-extra': }

  include iaas::profile::neutron::common

  include iaas::resources::connectors

  class { '::neutron::server':
    auth_host => $endpoint,
    auth_uri => "http://${endpoint}:5000/v2.0",
##identity_uri set to be added in next OS release
#    identity_uri => "http://${endpoint}:35357",
    auth_password => $neutron_password,
    database_connection => $iaas::resources::connectors::neutron,
    package_ensure => 'absent',
    enabled => false,
    sync_db => false,
    mysql_module => '2.3',
    database_idle_timeout => 3600,
    l3_ha => false,
  }

  class { '::neutron::agents::l3':
    external_network_bridge => ' ',
    use_namespaces => true,
    router_delete_namespaces => true,
    ha_enabled => true,
    enabled => false,
    package_ensure => 'absent',
  }

  class { '::neutron::agents::dhcp':
    dhcp_delete_namespaces => true,
    enable_isolated_metadata => true,
    enable_metadata_network => true,
    dnsmasq_config_file => "/etc/neutron/dnsmasq-neutron.conf",
  }
  file { '/etc/neutron/dnsmasq-neutron.conf':
    owner => root,
    group => root,
    mode  => 644,
    content => "dhcp-option-force=26,${mtu}"
  }

  class { '::neutron::agents::vpnaas':
    external_network_bridge => ' ',
  }
  class { '::neutron::agents::lbaas': }
  class { '::neutron::agents::metering': }
  class { '::neutron::services::fwaas':
    vpnaas_agent_package => true
  }

  class { '::neutron::agents::metadata':
    auth_password => $neutron_password,
    shared_secret => $neutron_secret,
    auth_url => "http://${endpoint}:5000/v2.0",
    auth_region => $region,
    metadata_ip => $endpoint,
    enabled => true,
  }


  if $ipaddress_br_ex1 == '' {
    $local_ip = $::facts["ipaddress_${public_interface}"]
  } else {
    $local_ip = $::ipaddress_br_ex1
  }


  if $external_device2 {
   $bridge_mappings1="physnet1:br-ex1"
   $bridge_mappings2="physnet2:br-ex2"
  } else {
    $bridge_mappings1='physnet1:br-ex1'
  }

  class { '::neutron::agents::ml2::ovs':
      enable_tunneling => true,
      local_ip => $local_ip,
      enabled => true,
      tunnel_types => ['gre'],
      bridge_mappings => [$bridge_mappings1,$bridge_mappings2],
      require => File['etc_default_neutron-server'],
  }


# notify { "br-ex1: $::brex1_eval":
#  loglevel => alert,
# }
# notify { "br-ex2: $::brex2_eval":
#  loglevel => alert,
# }
# notify { "external device1: $_external_device1 -- external network: $external_network1":
#  loglevel => alert,
# }

# Set public network if public_interface != $external_device1
  if $public_gateway {
    network_config { $public_interface:
      ensure  => 'present',
      family  => 'inet',
      method  => 'dhcp',
    } ->
    network_route { 'route_default':
      ensure => 'present',
      gateway => $public_gateway,
      interface => $public_interface,
      netmask => '0.0.0.0',
      network => 'default',
      require => Package['ifupdown-extra']
    }
  }

# Set loopback interface
  network_config { 'lo':
    ensure => 'present',
    family => 'inet',
    method => 'loopback',
    onboot => 'true',
  }


# Evaluate br-ex1, if present set it
  if $::brex1_eval != 'br-ex1' {

## Store initial configuration from the public interface (assigned by DHCP) to restore on br-ex
    $public_ipaddress1 = $::facts["ipaddress_${external_device1}"]
    $public_netmask1 = $::facts["netmask_${external_device1}"]
    $public_macaddr1 = $::facts["macaddress_${external_device1}"]

    if $public_ipaddress1 {
      network_config { $external_device1:
        ensure  => 'present',
        family  => 'inet',
        method  => 'manual',
        options => {
          'up' => "ifconfig ${external_device1} 0.0.0.0 promisc up",
          'down' => "ifconfig ${external_device1} promisc down",
        },
      } ->
      network_config { 'br-ex1':
        ensure  => 'present',
        family  => 'inet',
        method  => 'static',
        ipaddress => $public_ipaddress1,
        netmask => $public_netmask1,
      } -> 
      vs_port { $external_device1:
        ensure => present,
        bridge => 'br-ex1',
        require => Class['::neutron::agents::ml2::ovs'],
      } ->
      network_route { 'route_ext1':
        ensure => 'present',
        gateway => $external_gateway1,
        interface => 'br-ex1',
        netmask => '0.0.0.0',
        network => 'default',
        require => Package['ifupdown-extra']
      } ->
      exec { "set_br-ex1_hwaddr":
        command => "ovs-vsctl set bridge br-ex1 other-config:hwaddr=$public_macaddr1",
        path    => "/usr/local/bin/:/bin/:/usr/bin:/sbin/:/usr/sbin/",
      } ->
      exec { "restart_external1":
        command => "ifconfig $external_device1 0.0.0.0 promisc",
        path    => "/usr/local/bin/:/bin/:/sbin/:/usr/sbin/",
      } ->
      exec { "restart_br-ex1":
        command => "ifdown br-ex1 && ifup br-ex1",
        path    => "/usr/local/bin/:/bin/:/sbin/:/usr/sbin/",     
      }
    } else { 
      network_config { $external_device1:
        ensure  => 'present',
        family  => 'inet',
        method  => 'manual',
        options => {
          'up' => "ifconfig ${external_device1} 0.0.0.0 promisc up",
          'down' => "ifconfig ${external_device1} promisc down",
        },
      } ->
      vs_port { $external_device1:
        ensure => present,
        bridge => 'br-ex1',
        require => Class['::neutron::agents::ml2::ovs'],
      } ->
      exec { "set_br-ex1_hwaddr":
        command => "ovs-vsctl set bridge br-ex1 other-config:hwaddr=$public_macaddr1",
        path    => "/usr/local/bin/:/bin/:/usr/bin:/sbin/:/usr/sbin/",
      } 
    }
  }

  if $external_device2 {

# notify { "external device2: $_external_device2 -- external network: $external_network2":
#  loglevel => alert,
# }

# Evaluate br-ex2, if presetn set it
    if $::brex2_eval != 'br-ex2' {

## Store initial configuration from the public interface (assigned by DHCP) to restore on br-ex
      $public_ipaddress2 = $::facts["ipaddress_${external_device2}"]
      $public_netmask2 = $::facts["netmask_${external_device2}"]
      $public_macaddr2 = $::facts["macaddress_${external_device2}"]

      network_config { $external_device2:
        ensure  => 'present',
        family  => 'inet',
        method  => 'manual',
        options => {
          'up' => "ifconfig ${external_device2} 0.0.0.0 promisc up",
          'down' => "ifconfig ${external_device2} promisc down",
        },
      } ->
      vs_port { $external_device2:
        ensure => present,
        bridge => 'br-ex2',
        require => Class['::neutron::agents::ml2::ovs'],
      } ->
      exec { "set_br-ex2_hwaddr":
        command => "ovs-vsctl set bridge br-ex2 other-config:hwaddr=$public_macaddr2",
        path    => "/usr/local/bin/:/bin/:/usr/bin:/sbin/:/usr/sbin/",
      } 
    }
  }


##Public/private network configuration for tenant - added
#class { '::iaas::setup::sharednetwork': }

}