SRIOV support

Enable SRIOV support in nova scheduler and compute.

Change-Id: Ib1d180a5eb47221d322e4d147dd845aa63b1b408
Epic: PROD-8956
diff --git a/README.rst b/README.rst
index c5080b7..86fb99b 100644
--- a/README.rst
+++ b/README.rst
@@ -260,6 +260,25 @@
           flavor:
             ...
 
+SRIOV
+------
+
+Add PciPassthroughFilter into scheduler filters and NICs on specific compute nodes.
+
+.. code-block:: yaml
+
+  nova:
+    controller:
+      sriov: true
+      scheduler_default_filters: "DifferentHostFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,CoreFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter"
+
+  nova:
+    compute:
+      sriov:
+        nic_one:
+          devname: eth1
+          physical_network: physnet1
+
 
 Documentation and Bugs
 ============================
diff --git a/nova/files/liberty/nova-compute.conf.Debian b/nova/files/liberty/nova-compute.conf.Debian
index a9dc806..09b73fa 100644
--- a/nova/files/liberty/nova-compute.conf.Debian
+++ b/nova/files/liberty/nova-compute.conf.Debian
@@ -17,6 +17,10 @@
 volumes_path=/var/lib/nova/volumes
 enabled_apis=ec2,osapi_compute,metadata
 
+{%- for nic_name, sriov in compute.sriov.iteritems() %}
+pci_passthrough_whitelist = {"devname":"{{ sriov.devname }}","physical_network":"{{ sriov.physical_network }}"}
+{%- endfor %}
+
 {%- if compute.image.use_cow is defined %}
 use_cow_images = {{ compute.image.use_cow }}
 {%- endif %}
diff --git a/nova/files/liberty/nova-controller.conf.Debian b/nova/files/liberty/nova-controller.conf.Debian
index 2c6145a..4aebb27 100644
--- a/nova/files/liberty/nova-controller.conf.Debian
+++ b/nova/files/liberty/nova-controller.conf.Debian
@@ -23,6 +23,10 @@
 ram_allocation_ratio = {{ controller.ram_allocation_ratio }}
 disk_allocation_ratio = {{ controller.disk_allocation_ratio }}
 scheduler_default_filters = {{ controller.scheduler_default_filters }}
+{%- if controller.sriov %}
+scheduler_available_filters = nova.scheduler.filters.all_filters
+scheduler_available_filters = nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
+{%- endif %}
 osapi_max_limit = {{ controller.osapi_max_limit|default('1000') }}
 
 allow_resize_to_same_host = True
diff --git a/nova/files/mitaka/nova-compute.conf.Debian b/nova/files/mitaka/nova-compute.conf.Debian
index af03d27..ee3dbbb 100644
--- a/nova/files/mitaka/nova-compute.conf.Debian
+++ b/nova/files/mitaka/nova-compute.conf.Debian
@@ -19,6 +19,10 @@
 vif_plugging_timeout=300
 dhcp_domain={{ compute.get('dhcp_domain', 'novalocal') }}
 
+{%- for nic_name, sriov in compute.sriov.iteritems() %}
+pci_passthrough_whitelist = {"devname":"{{ sriov.devname }}","physical_network":"{{ sriov.physical_network }}"}
+{%- endfor %}
+
 {%- if compute.image.use_cow is defined %}
 use_cow_images = {{ compute.image.use_cow }}
 {%- endif %}
diff --git a/nova/files/mitaka/nova-controller.conf.Debian b/nova/files/mitaka/nova-controller.conf.Debian
index b5b0a77..bf681db 100644
--- a/nova/files/mitaka/nova-controller.conf.Debian
+++ b/nova/files/mitaka/nova-controller.conf.Debian
@@ -20,6 +20,10 @@
 ram_allocation_ratio = {{ controller.ram_allocation_ratio }}
 disk_allocation_ratio = {{ controller.disk_allocation_ratio }}
 scheduler_default_filters = {{ controller.scheduler_default_filters }}
+{%- if controller.sriov %}
+scheduler_available_filters = nova.scheduler.filters.all_filters
+scheduler_available_filters = nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
+{%- endif %}
 scheduler_driver = filter_scheduler
 allow_resize_to_same_host = True
 osapi_max_limit = {{ controller.osapi_max_limit|default('1000') }}