try again, with puppetforge modules, correctly included now
[mirror/dsa-puppet.git] / 3rdparty / modules / neutron / manifests / agents / n1kv_vem.pp
diff --git a/3rdparty/modules/neutron/manifests/agents/n1kv_vem.pp b/3rdparty/modules/neutron/manifests/agents/n1kv_vem.pp
new file mode 100644 (file)
index 0000000..dc740c0
--- /dev/null
@@ -0,0 +1,241 @@
+# == Class: n1kv_vem
+#
+# Deploy N1KV VEM on compute and network nodes.
+# Support exists and tested for RedHat.
+# (For Ubuntu/Debian platforms few changes and testing pending.)
+#
+# === Parameters
+# [*n1kv_vsm_ip*]
+#   (required) N1KV VSM(Virtual Supervisor Module) VM's IP.
+#   Defaults to 127.0.0.1
+#
+# [*n1kv_vsm_domainid*]
+#   (required) N1KV VSM DomainID.
+#   Defaults to 1000
+#
+# [*host_mgmt_intf*]
+#   (required) Management Interface of node where VEM will be installed.
+#   Defaults to eth1
+#
+# [*uplink_profile*]
+#   (optional) Uplink Interfaces that will be managed by VEM. The uplink
+#      port-profile that configures these interfaces should also be specified.
+#   (format)
+#    $uplink_profile = { 'eth1' => 'profile1',
+#                        'eth2' => 'profile2'
+#                       },
+#   Defaults to empty
+#
+# [*vtep_config*]
+#   (optional) Virtual tunnel interface configuration.
+#              Eg:VxLAN tunnel end-points.
+#   (format)
+#   $vtep_config = { 'vtep1' => { 'profile' => 'virtprof1',
+#                                 'ipmode'  => 'dhcp'
+#                               },
+#                    'vtep2' => { 'profile'   => 'virtprof2',
+#                                 'ipmode'    => 'static',
+#                                 'ipaddress' => '192.168.1.1',
+#                                 'netmask'   => '255.255.255.0'
+#                               }
+#                  },
+#   Defaults to empty
+#
+# [*node_type*]
+#   (optional). Specify the type of node: 'compute' (or) 'network'.
+#   Defaults to 'compute'
+#
+# All the above parameter values will be used in the config file: n1kv.conf
+#
+# [*vteps_in_same_subnet*]
+#   (optional)
+#   The VXLAN tunnel interfaces created on VEM can belong to same IP-subnet.
+#   In such case, set this parameter to true. This results in below
+#   'sysctl:ipv4' values to be modified.
+#     rp_filter (reverse path filtering) set to 2(Loose).Default is 1(Strict)
+#     arp_ignore (arp reply mode) set to 1:reply only if target ip matches
+#                                that of incoming interface. Default is 0
+#     arp_announce (arp announce mode) set to 1. Default is 0
+#   Please refer Linux Documentation for detailed description
+#   http://lxr.free-electrons.com/source/Documentation/networking/ip-sysctl.txt
+#
+#   If the tunnel interfaces are not in same subnet set this parameter to false.
+#   Note that setting to false causes no change in the sysctl settings and does
+#   not revert the changes made if it was originally set to true on a previous
+#   catalog run.
+#
+#   Defaults to false
+#
+# [*n1kv_source*]
+#   (optional)
+#     n1kv_source ==> VEM package location. One of below
+#       A)URL of yum repository that hosts VEM package.
+#       B)VEM RPM/DPKG file name, If present locally in 'files' folder
+#       C)If not specified, assumes that VEM image is available in
+#         default enabled repositories.
+#   Defaults to empty
+#
+# [*n1kv_version*]
+#   (optional). Specify VEM package version to be installed.
+#       Not applicable if 'n1kv_source' is a file. (Option-B above)
+#   Defaults to 'present'
+#
+# [*package_ensure*]
+#   (optional) Ensure state for dependent packages: Openvswitch/libnl.
+#   Defaults to 'present'.
+#
+# [*enable*]
+#   (optional) Enable state for service. Defaults to 'true'.
+#
+# [*manage_service*]
+#   (optional) Whether to start/stop the service
+#   Defaults to true
+#
+# [*portdb*]
+#   (optional) PortDB (ovs|vem)
+#   Defaults to ovs
+#
+# [*fastpath_flood*]
+#   (optional) Handle broadcast floods and unknown pkts in fastpath(KLM)
+#   Defaults to disable
+#
+class neutron::agents::n1kv_vem (
+  $n1kv_vsm_ip          = '127.0.0.1',
+  $n1kv_vsm_domain_id   = 1000,
+  $host_mgmt_intf       = 'eth1',
+  $uplink_profile       = {},
+  $vtep_config          = {},
+  $node_type            = 'compute',
+  $vteps_in_same_subnet = false,
+  $n1kv_source          = '',
+  $n1kv_version         = 'present',
+  $package_ensure       = 'present',
+  $enable               = true,
+  $manage_service       = true,
+  $portdb               = 'ovs',
+  $fastpath_flood       = 'disable'
+) {
+
+  include neutron::params
+  require vswitch::ovs
+
+  Exec { path => [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ] }
+
+  if($::osfamily != 'Redhat') {
+    #current support exists for Redhat family.
+    #Support for Debian will be added soon.
+    fail("Unsupported osfamily ${::osfamily}")
+  }
+
+  #Check source of n1kv-vem image:yum-repo (or) local file in 'files' directory
+  if $n1kv_source != '' {
+    if ($n1kv_source =~ /^http/) or ($n1kv_source =~ /^ftp/) {
+      $vemimage_uri = 'repo'
+    } else {
+      $vemimage_uri = 'file'
+      $vemtgtimg    = "/var/n1kv/${n1kv_source}"
+    }
+  } else {
+    $vemimage_uri = 'unspec'
+  }
+
+
+  package { 'libnl':
+    ensure => $package_ensure,
+    name   => $::neutron::params::libnl_package
+  }
+
+  file {
+    '/etc/n1kv':
+      ensure => directory,
+      owner  => 'root',
+      group  => 'root',
+      mode   => '0755';
+    '/var/n1kv':
+      ensure => directory,
+      owner  => 'root',
+      group  => 'root',
+      mode   => '0755',
+  }
+
+  #specify template corresponding to 'n1kv.conf'
+  file {'/etc/n1kv/n1kv.conf':
+    ensure  => present,
+    owner   => 'root',
+    group   => 'root',
+    mode    => '0664',
+    content => template('neutron/n1kv.conf.erb'),
+    require => File['/etc/n1kv'],
+  }
+
+  if $vemimage_uri == 'file' {
+    #specify location on target-host where image file will be downloaded to.
+    #Later vem package: 'nexus1000v' will be installed from this file.
+    file { $vemtgtimg:
+      owner   => 'root',
+      group   => 'root',
+      mode    => '0664',
+      source  => "puppet:///modules/neutron/${n1kv_source}",
+      require => File['/var/n1kv'],
+    }
+    package {'nexus1000v':
+      ensure   => $n1kv_version,
+      provider => $::neutron::params::package_provider,
+      source   => $vemtgtimg,
+      require  => File[$vemtgtimg]
+    }
+  } else {
+    if $vemimage_uri == 'repo' {
+      #vem package: 'nexus1000v' will be downloaded and installed
+      #from below repo.
+      yumrepo { 'cisco-vem-repo':
+        baseurl  => $n1kv_source,
+        descr    => 'Repo for VEM Image',
+        enabled  => 1,
+        gpgcheck => 1,
+        gpgkey   => "${n1kv_source}/RPM-GPG-KEY"
+        #proxy   => '_none_',
+      }
+    }
+    package {'nexus1000v':
+      ensure => $package_ensure
+    }
+  }
+
+  if $manage_service {
+    if $enable {
+      $service_ensure = 'running'
+    } else {
+      $service_ensure = 'stopped'
+    }
+  }
+
+  service { 'nexus1000v':
+    ensure    => $service_ensure,
+  }
+
+  #Upon config change in 'n1kv.conf' execute below 'vemcmd reread config'.
+  #No need to restart service.
+  exec { 'vemcmd reread config':
+    subscribe   => File['/etc/n1kv/n1kv.conf'],
+    refreshonly => true,
+    require     => Service['nexus1000v']
+  }
+
+  if $vteps_in_same_subnet == true {
+    $my_sysctl_settings = {
+      'net.ipv4.conf.default.rp_filter'    => { value => 2 },
+      'net.ipv4.conf.all.rp_filter'        => { value => 2 },
+      'net.ipv4.conf.default.arp_ignore'   => { value => 1 },
+      'net.ipv4.conf.all.arp_ignore'       => { value => 1 },
+      'net.ipv4.conf.all.arp_announce'     => { value => 2 },
+      'net.ipv4.conf.default.arp_announce' => { value => 2 },
+    }
+    create_resources(sysctl::value,$my_sysctl_settings)
+  }
+
+  Package['libnl']            -> Package['nexus1000v']
+  Service['openvswitch']      ~> Package['nexus1000v']
+  File['/etc/n1kv/n1kv.conf'] -> Package['nexus1000v']
+  Package['nexus1000v']       ~> Service['nexus1000v']
+}