Improve service validation during upgrade Manila

  * Added modules which allows to check and manage services statuses.
  * Added states which allows enable/disable one/all services by host name.

Change-Id: I078d089b221180ff2355087bc0601f904f8dbd94
Related-PROD: PROD-25158
diff --git a/_states/example.sls b/_states/example.sls
index 55afcba..66da3a0 100644
--- a/_states/example.sls
+++ b/_states/example.sls
@@ -11,3 +11,17 @@
     manilang.share_type_absent:
       - microversion: '2.4'
       - cloud_name: admin
+
+manilang_service_disabled:
+  manilang.service_disabled:
+  - binary: manila-share
+  - cloud_name: admin_identity
+  - microversion: '2.40'
+  - name: cmp2
+
+manilang_service_enabled:
+  manilang.service_enabled:
+  - binary: manila-share
+  - cloud_name: admin_identity
+  - microversion: '2.40'
+  - name: cmp2
diff --git a/_states/manilang.py b/_states/manilang.py
index 964518a..97609c1 100644
--- a/_states/manilang.py
+++ b/_states/manilang.py
@@ -30,6 +30,8 @@
     'set_type_specs': 'manilang.set_share_type_extra_specs',
     'unset_type_specs': 'manilang.unset_share_type_extra_specs',
     'delete_type': 'manilang.delete_share_type',
+    'service_list': 'manilang.service_list',
+    'service_update': 'manilang.service_update',
 }
 
 
@@ -151,6 +153,64 @@
         return _find_failed(name, 'share_type')
 
 
+def service_enabled(name, binary, cloud_name, microversion=None):
+    """
+    Method allows enable service by binary and name.
+
+    :param name:    name of a host where service is running
+    :param binary:  name of the service have to be run
+    """
+
+    ret = {}
+
+    services = __salt__[manilang_func['service_list']](binary=binary, cloud_name=cloud_name)['services']
+
+    # You are able to either enable certain manila-share instance by name@driver
+    # or all existed instances on a node by name
+    if '@' in name:
+        disabled_services = [s for s in services if name == s['host'] and s['status'] == 'disabled']
+    else:
+        disabled_services = [s for s in services if name == s['host'].split('@')[0] and s['status'] == 'disabled']
+
+    if len(disabled_services):
+        for service in disabled_services:
+
+            changes = __salt__[manilang_func['service_update']](service['host'], binary, 'enable', cloud_name=cloud_name, microversion=microversion)
+            ret[service['host']] = {'disabled': changes['disabled']}
+
+        return _updated(name, binary, ret)
+    return _no_changes(name, binary)
+
+
+def service_disabled(name, binary, cloud_name, microversion=None):
+    """
+    Method allows disable service by binary and name.
+
+    :param name:    name of a host where service is running
+    :param binary:  name of the service have to be disabled
+    """
+
+    ret = {}
+
+    services = __salt__[manilang_func['service_list']](binary=binary, cloud_name=cloud_name)['services']
+
+    # You are able to either disable certain manila-share instance by name@driver
+    # or all existed instances on a node by name
+    if '@' in name:
+        enabled_services = [s for s in services if name == s['host'] and s['status'] == 'enabled']
+    else:
+        enabled_services = [s for s in services if name == s['host'].split('@')[0] and s['status'] == 'enabled']
+
+    if len(enabled_services):
+        for service in enabled_services:
+
+            changes = __salt__[manilang_func['service_update']](service['host'], binary, 'disable', cloud_name=cloud_name, microversion=microversion)
+            ret[service['host']] = {'disabled': changes['disabled']}
+
+        return _updated(name, binary, ret)
+    return _no_changes(name, binary)
+
+
 def _created(name, resource, resource_definition):
     changes_dict = {
         'name': name,