class packstack::nova::compute::libvirt ()
{
    # Ensure Firewall changes happen before libvirt service start
    # preventing a clash with rules being set by libvirt
    Firewall <| |> -> Class['::nova::compute::libvirt']

    $libvirt_vnc_bind_host = hiera('CONFIG_IP_VERSION') ? {
      'ipv6'  => '::0',
      default => '0.0.0.0',
      # TO-DO(mmagr): Add IPv6 support when hostnames are used
    }

    $libvirt_virt_type = hiera('CONFIG_NOVA_LIBVIRT_VIRT_TYPE')
    if $libvirt_virt_type == 'kvm' {
        # Workaround for bad /dev/kvm permissions
        # https://bugzilla.redhat.com/show_bug.cgi?id=950436
        file { '/dev/kvm':
          owner  => 'root',
          group  => 'kvm',
          mode   => '666',
        }

        # We have to fix the permissions after the installation has been done
        # and before the service is started.
        Package <| title == 'libvirt' |> ->
        File['/dev/kvm'] ->
        Service <| title == 'libvirt' |>
    }

    class { '::nova::compute::libvirt':
      libvirt_virt_type        => $libvirt_virt_type,
      vncserver_listen         => $libvirt_vnc_bind_host,
      migration_support        => true,
      libvirt_inject_partition => '-1',
    }

    file_line { 'libvirt-guests':
      path    => '/etc/sysconfig/libvirt-guests',
      line    => 'ON_BOOT=ignore',
      match   => '^[\s#]*ON_BOOT=.*',
      require => Class['::nova::compute::libvirt'],
    }

    # Remove libvirt's default network (usually virbr0) as it's unnecessary and
    # can be confusing
    exec {'virsh-net-destroy-default':
      onlyif  => '/usr/bin/virsh net-list | grep default',
      command => '/usr/bin/virsh net-destroy default',
      require => Service['libvirt'],
    }

    exec {'virsh-net-undefine-default':
      onlyif  => '/usr/bin/virsh net-list --inactive | grep default',
      command => '/usr/bin/virsh net-undefine default',
      require => Exec['virsh-net-destroy-default'],
    }

    $libvirt_debug = hiera('CONFIG_DEBUG_MODE')
    if $libvirt_debug {

      file_line { '/etc/libvirt/libvirt.conf log_filters':
        path   => '/etc/libvirt/libvirtd.conf',
        line   => 'log_filters = "1:libvirt 1:qemu 1:conf 1:security 3:event 3:json 3:file 1:util"',
        match  => 'log_filters =',
        notify => Service['libvirt'],
      }

      file_line { '/etc/libvirt/libvirt.conf log_outputs':
        path   => '/etc/libvirt/libvirtd.conf',
        line   => 'log_outputs = "1:file:/var/log/libvirt/libvirtd.log"',
        match  => 'log_outputs =',
        notify => Service['libvirt'],
      }

    }
}
