Add configuration for jenkins location

Location url is used to let Jenkins
know how to refer to itself

Change-Id: I44ac0d271d38e4c04721df605142f44345736cf2
Related-bug: PROD:26834
diff --git a/README.rst b/README.rst
index d21f47f..42bcbeb 100644
--- a/README.rst
+++ b/README.rst
@@ -188,6 +188,8 @@
           host: jenkins.example.com
           port: 80
           protocol: http
+        location:
+          url: http://jenkins.example.com:80
         job:
           jobname:
             type: workflow
diff --git a/_states/jenkins_location.py b/_states/jenkins_location.py
new file mode 100644
index 0000000..7aac8bf
--- /dev/null
+++ b/_states/jenkins_location.py
@@ -0,0 +1,34 @@
+import logging
+
+logger = logging.getLogger(__name__)
+
+def __virtual__():
+    '''
+    Only load if jenkins_common module exist.
+    '''
+    if 'jenkins_common.call_groovy_script' not in __salt__:
+        return (
+            False,
+            'The jenkins_location state module cannot be loaded: '
+            'jenkins_common not found')
+    return True
+
+
+def config(name, url, email=''):
+    """
+    Jenkins location configuration. This value is used to
+    let Jenkins know how to refer to itself.
+
+    :url: Jenkins location url:
+    :email: Jenkins server email
+    :returns: salt-specified state dict
+    """
+
+    template = __salt__['jenkins_common.load_template'](
+        'salt://jenkins/files/groovy/location.template',
+        __env__)
+
+    return __salt__['jenkins_common.api_call'](name, template,
+                        ['CHANGED', 'EXISTS'],
+                        {'url': url, 'email': email},
+                        'location config')
diff --git a/jenkins/client/init.sls b/jenkins/client/init.sls
index 9c8509c..85cacb3 100644
--- a/jenkins/client/init.sls
+++ b/jenkins/client/init.sls
@@ -62,6 +62,9 @@
 {%- if client.theme is defined %}
   - jenkins.client.theme
 {%- endif %}
+{%- if client.location is defined %}
+  - jenkins.client.location
+{%- endif %}
 {%- if client.throttle_category is defined %}
   - jenkins.client.throttle_category
 {%- endif %}
diff --git a/jenkins/client/location.sls b/jenkins/client/location.sls
new file mode 100644
index 0000000..29bdab9
--- /dev/null
+++ b/jenkins/client/location.sls
@@ -0,0 +1,7 @@
+{%- from "jenkins/map.jinja" import client with context %}
+{%- if client.location is defined %}
+set_jenkins_location:
+  jenkins_location.config:
+    - url: {{ client.location.url }}
+    - email: {{ client.location.get('email', '') }}
+{%- endif %}
diff --git a/jenkins/files/groovy/location.template b/jenkins/files/groovy/location.template
new file mode 100644
index 0000000..2e26bbb
--- /dev/null
+++ b/jenkins/files/groovy/location.template
@@ -0,0 +1,22 @@
+#!groovy
+
+import jenkins.model.JenkinsLocationConfiguration
+
+String url = "${url}"
+String email = "${email}"
+def LC = JenkinsLocationConfiguration.getOrDie()
+def changed = false
+String jenkinsUrl = url.endsWith('/') ?: "${url}/"
+if (LC) {
+    if (jenkinsUrl != LC.getUrl()) {
+        LC.setUrl(jenkinsUrl)
+        changed = true
+    }
+    if (email != '' && email != LC.getAdminAddress()) {
+        LC.setAdminAddress(email)
+        changed = true
+    }
+}
+
+String message = changed ? "CHANGED" : "EXISTS"
+print(message)
diff --git a/jenkins/schemas/client.yaml b/jenkins/schemas/client.yaml
index 0eaced4..8373397 100644
--- a/jenkins/schemas/client.yaml
+++ b/jenkins/schemas/client.yaml
@@ -283,6 +283,15 @@
           branch:
             description: Git branch of library to checkout from
             type: string
+  location:
+    description: Jenkins location configuration
+    type: object
+    additionalProperties: false
+    properties:
+      url:
+        type: string
+      email:
+        type: string
   node:
     description: Jenkins slave nodes configuration
     type: object
diff --git a/tests/pillar/client.sls b/tests/pillar/client.sls
index ca1cc5c..21f5ed2 100644
--- a/tests/pillar/client.sls
+++ b/tests/pillar/client.sls
@@ -6,6 +6,8 @@
       host: jenkins.example.com
       port: 80
       protocol: http
+    location:
+      url: http://jenkins.example.com:80
     job:
       jobname:
         type: workflow