Add alternative plugin update

13 April some new plugins were released leading old jenkins to be
inoperable. Adding semi-pin mechanism will allow us to handle it.

PROD-36857

Change-Id: Ic3d38cb9f86e16c316fb221e8a9d770dc1f5f400
(cherry picked from commit 22b44555bff43bec97ed797f236590ed3875fc06)
diff --git a/_modules/jenkins_common.py b/_modules/jenkins_common.py
index 64cede6..422be23 100644
--- a/_modules/jenkins_common.py
+++ b/_modules/jenkins_common.py
@@ -194,3 +194,41 @@
     ret['result'] = None if test else result
     return ret
 
+
+def jenkins_do_safe_restart(**kwargs):
+    """
+    Execute safe restart using jenkins groovy call
+
+    :returns: salt-specified state dict
+    """
+    restart_cmd_groovy = "Jenkins.instance.doSafeRestart()"
+    test = __opts__['test']  # noqa
+    module_name = 'jenkins_do_safe_restart'
+    ret = {
+        'name': module_name,
+        'changes': {},
+        'result': False,
+        'comment': '',
+    }
+    result = False
+    if test:
+        status = "SUCCESS"
+        ret['changes'][module_name] = status
+        ret['comment'] = 'Jenkins safe restart initiated (test mode)'
+        ret['result'] = None
+        return ret
+
+    call_result = __salt__['jenkins_common.call_groovy_script'](restart_cmd_groovy, [])
+    if call_result["code"] == 200:
+        status = call_result["msg"]
+        ret['changes'][module_name] = status
+        ret['comment'] = 'Jenkins safe restart initiated'
+        ret['result'] = True
+    else:
+        status = 'FAILED'
+        ret['changes'][module_name] = status
+        ret['comment'] = "Failed to initiate jenkins restart: {}".format(call_result["msg"])
+        logger.error("Failed to initiate jenkins restart: {}".format(call_result["msg"]))
+
+    return ret
+