# == Class: nova::compute::neutron
#
# Manage the network driver to use for compute guests
# This will use virtio for VM guests and the
# specified driver for the VIF
#
# === Parameters
#
# [*libvirt_vif_driver*]
#   (optional) The libvirt VIF driver to configure the VIFs.
#   Defaults to 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver'.
#
# [*force_snat_range*]
#  (optional) Force SNAT rule to specified network for nova-network
#  Default to 0.0.0.0/0
#  Due to architecture constraints in nova_config, it's not possible to setup
#  more than one SNAT rule though initial parameter is MultiStrOpt
class nova::compute::neutron (
  $libvirt_vif_driver = 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver',
  $force_snat_range   = '0.0.0.0/0',
) {
  include ::nova::deps

  if $libvirt_vif_driver == 'nova.virt.libvirt.vif.LibvirtOpenVswitchDriver' {
    fail('nova.virt.libvirt.vif.LibvirtOpenVswitchDriver as vif_driver is removed from Icehouse')
  }

  nova_config {
    'libvirt/vif_driver': value => $libvirt_vif_driver;
  }

  if $libvirt_vif_driver == 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver' and $force_snat_range {
    # Validate ip and mask for force_snat_range
    $force_snat_range_array = split($force_snat_range, '/')
    if is_ip_address($force_snat_range_array[0]) and is_integer($force_snat_range_array[1])  {
      nova_config {
        'DEFAULT/force_snat_range': value => $force_snat_range;
      }
    } else {
      fail('force_snat_range should be IPv4 or IPv6 CIDR notation')
    }
  } else {
    nova_config {
      'DEFAULT/force_snat_range': ensure => absent;
    }
  }

}
