Add ability to install hwe/virtual linux kernel

Change-Id: Id2353d3982ad5146e14ba653ba6be4adec4b0030
Related-Prod: PROD-31654
diff --git a/README.rst b/README.rst
index ea0b419..a0fb69d 100644
--- a/README.rst
+++ b/README.rst
@@ -777,6 +777,25 @@
           headers: true
           version: 4.2.0-22
 
+Also it is possible to install Kernel with Hardware Enablement or virtual
+kernel packages. For example, for Xenial:
+
+.. code-block:: yaml
+
+    linux:
+      system:
+        kernel:
+          type: generic
+          extra: true
+          headers: true
+          version: 4.15.0-65
+          hwe:
+            type: hwe
+            version: 16.04
+            kernel_version: 4.15.0.65
+
+Set `linux:system:kernel:hwe:type:virtual` if you need Virtual kernel packages.
+
 Systcl kernel parameters:
 
 .. code-block:: yaml
diff --git a/linux/system/kernel.sls b/linux/system/kernel.sls
index 59405d0..ed8606b 100644
--- a/linux/system/kernel.sls
+++ b/linux/system/kernel.sls
@@ -24,7 +24,7 @@
 {%- endif %}
 {%- endif %}
 
-{%- if system.kernel.version is defined %}
+{%- if system.kernel.version is defined and grains.get('os_family') == 'Debian' %}
 
 linux_kernel_package:
   pkg.installed:
@@ -36,12 +36,32 @@
     {%- if system.kernel.get('extra', False) %}
     - linux-image-extra-{{ system.kernel.version }}-{{ system.kernel.type|default('generic') }}
     {%- endif %}
+    {%- if system.kernel.hwe is defined %}
+      {%- set osVersion = salt['grains.get']('osrelease') %}
+      {%- set hweVersion = system.kernel.hwe.get('version', osVersion) %}
+      {%- set hwePackageVersion = system.kernel.hwe.get('kernel_version', system.kernel.version|replace('-', '.')) + '*' %}
+      {%- set hweType = system.kernel.hwe.get('type', 'generic') %}
+    - linux-image-{{ hweType }}-hwe-{{ hweVersion }} : {{ hwePackageVersion }}
+      {%- if system.kernel.get('headers', False) %}
+    - linux-headers-{{ hweType }}-hwe-{{ hweVersion }} : {{ hwePackageVersion }}
+      {%- endif %}
+      {%- if hweType == 'virtual' %}
+    - linux-image-extra-{{ hweType }}-hwe-{{ hweVersion }} : {{ hwePackageVersion }}
+      {%- endif %}
+    {%- endif %}
   - refresh: true
 
+
+  {%- if system.kernel.hwe is defined %}
+    {%- set exlcudeRule = system.kernel.version + '|hwe' %}
+  {%- else %}
+    {%- set exlcudeRule = system.kernel.version %}
+  {%- endif %}
+
 # Not very Salt-ish.. :-(
 linux_kernel_old_absent:
   cmd.wait:
-  - name: "dpkg -l '*linux-generic-*[0-9]*' '*linux-image-*[0-9]*' '*linux-headers-*[0-9]*' '*linux-image-extra-*[0-9]*' | grep -E '^ii' | awk '{print $2}' | grep -v '{{ system.kernel.version }}' | xargs dpkg --purge --force-depends"
+  - name: "dpkg -l '*linux-generic-*[0-9]*' '*linux-image-*[0-9]*' '*linux-headers-*[0-9]*' '*linux-modules-*[0-9]*' '*linux-image-extra-*[0-9]*' | grep -E '^ii' | awk '{print $2}' | grep -vE '{{ exlcudeRule }}' | xargs dpkg --purge --force-depends"
   - watch:
     - pkg: linux_kernel_package