Add support of sriov CNI

Change-Id: Ibb8792f8b5baaec61094bcf75d38a0be5a2dd4dc
diff --git a/README.rst b/README.rst
index c9dc10a..662556a 100644
--- a/README.rst
+++ b/README.rst
@@ -492,6 +492,35 @@
             - 172.16.10.150-172.16.10.180
             - 172.16.10.192/26
 
+Kubernetes with SRIOV
+-----------------------
+
+On Master:
+
+.. code-block:: yaml
+
+    kubernetes:
+      master:
+        network:
+          sriov:
+            enabled: true
+            interface: eno2
+            subnet: 10.55.208.0/24
+            gateway: 10.55.208.1
+
+On pools:
+
+.. code-block:: yaml
+
+    kubernetes:
+      pool:
+        network:
+          sriov:
+            enabled: true
+            interface: eno2
+            subnet: 10.55.208.0/24
+            gateway: 10.55.208.1
+
 Kubernetes with Flannel
 -----------------------
 
diff --git a/kubernetes/files/sriov/sriov.conf b/kubernetes/files/sriov/sriov.conf
new file mode 100644
index 0000000..637b4be
--- /dev/null
+++ b/kubernetes/files/sriov/sriov.conf
@@ -0,0 +1,13 @@
+{
+   "name": "mynet",
+   "type": "sriov",
+   "master": "{{ sriov_interface }}",
+   "ipam": {
+       "type": "host-local",
+       "subnet": "{{ sriov_subnet }}",
+       "routes": [
+           { "dst": "0.0.0.0/0" }
+       ],
+       "gateway": "{{ sriov_gateway }}"
+   }
+}
diff --git a/kubernetes/master/init.sls b/kubernetes/master/init.sls
index ee62c6b..29cf645 100644
--- a/kubernetes/master/init.sls
+++ b/kubernetes/master/init.sls
@@ -18,6 +18,9 @@
 - kubernetes.master.genie
 {%- endif %}
 {%- endif %}
+{%- if master.network.get('sriov', {}).get('enabled', False) %}
+- kubernetes.master.sriov
+{%- endif %}
 {%- if master.storage.get('engine', 'none') == 'glusterfs' %}
 - kubernetes.master.glusterfs
 {%- endif %}
diff --git a/kubernetes/master/sriov.sls b/kubernetes/master/sriov.sls
new file mode 100644
index 0000000..19ea51b
--- /dev/null
+++ b/kubernetes/master/sriov.sls
@@ -0,0 +1,30 @@
+{%- from "kubernetes/map.jinja" import master with context %}
+{%- if master.enabled %}
+
+/etc/cni/net.d/13-sriov.conf:
+  file.managed:
+    - source: salt://kubernetes/files/sriov/sriov.conf
+    - user: root
+    - group: root
+    - mode: 644
+    - makedirs: true
+    - dir_mode: 755
+    - template: jinja
+    - defaults:
+        sriov_interface: {{ master.network.sriov.interface }}
+        sriov_subnet: {{ master.network.sriov.subnet }}
+        sriov_gateway: {{ master.network.sriov.gateway }}
+
+/opt/cni/bin/sriov:
+  file.managed:
+    - source: {{ master.network.sriov.source }}
+    - source_hash: {{ master.network.sriov.source_hash }}
+    - user: root
+    - group: root
+    - mode: 751
+    - makedirs: true
+    {%- if grains.get('noservices') %}
+    - onlyif: /bin/false
+    {%- endif %}
+
+{%- endif %}
diff --git a/kubernetes/pool/init.sls b/kubernetes/pool/init.sls
index 1270cc2..117ca47 100644
--- a/kubernetes/pool/init.sls
+++ b/kubernetes/pool/init.sls
@@ -13,6 +13,9 @@
 {%- if pool.network.get('genie', {}).get('enabled', False) %}
 - kubernetes.pool.genie
 {%- endif %}
+{%- if pool.network.get('sriov', {}).get('enabled', False) %}
+- kubernetes.pool.sriov
+{%- endif %}
 {%- if pool.get('kube_proxy', {}).get('enabled', True) %}
 - kubernetes.pool.kube-proxy
 {%- endif %}
diff --git a/kubernetes/pool/sriov.sls b/kubernetes/pool/sriov.sls
new file mode 100644
index 0000000..d471c37
--- /dev/null
+++ b/kubernetes/pool/sriov.sls
@@ -0,0 +1,30 @@
+{%- from "kubernetes/map.jinja" import pool with context %}
+{%- if pool.enabled %}
+
+/etc/cni/net.d/13-sriov.conf:
+  file.managed:
+    - source: salt://kubernetes/files/sriov/sriov.conf
+    - user: root
+    - group: root
+    - mode: 644
+    - makedirs: true
+    - dir_mode: 755
+    - template: jinja
+    - defaults:
+        sriov_interface: {{ pool.network.sriov.interface }}
+        sriov_subnet: {{ pool.network.sriov.subnet }}
+        sriov_gateway: {{ pool.network.sriov.gateway }}
+
+/opt/cni/bin/sriov:
+  file.managed:
+    - source: {{ pool.network.sriov.source }}
+    - source_hash: {{ pool.network.sriov.source_hash }}
+    - user: root
+    - group: root
+    - mode: 751
+    - makedirs: true
+    {%- if grains.get('noservices') %}
+    - onlyif: /bin/false
+    {%- endif %}
+
+{%- endif %}