--- /dev/null
+# == 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']
+}