blob: dc941e905ee1803894bd5aedac9ace0119e20ce5 [file] [log] [blame]
Jakub Josef7bb17ab2017-01-12 14:52:53 +01001import logging
Jakub Josef7d9fce32017-03-24 16:46:56 +01002from json import dumps
Jakub Josef7bb17ab2017-01-12 14:52:53 +01003logger = logging.getLogger(__name__)
4
5add_view_groovy = """\
Jakub Josefe74e7a62017-04-06 11:50:55 +02006import java.util.stream.Collectors
7import org.jenkinsci.plugins.categorizedview.CategorizedJobsView
8import org.jenkinsci.plugins.categorizedview.GroupingRule
Jakub Josef7bb17ab2017-01-12 14:52:53 +01009view = Jenkins.instance.getView("{view_name}")
10if(view){{
11 if(view.getClass().getName().equals("hudson.model.ListView")){{
12 include_regex="{include_regex}"
13 if(include_regex != "" && !view.getIncludeRegex().equals(include_regex)){{
14 view.setIncludeRegex(include_regex)
15 print("ADDED/CHANGED")
16 }}else{{
17 print("EXISTS")
18 }}
Jakub Josef7d9fce32017-03-24 16:46:56 +010019 }}else if(view.getClass().getName().equals("org.jenkinsci.plugins.categorizedview.CategorizedJobsView")){{
20 def jsonSlurper = new groovy.json.JsonSlurper()
21 def inputCategories = jsonSlurper.parseText('{categories_string}')
22 def groupRegexes = inputCategories.stream().map{{e -> e["group_regex"]}}.collect(Collectors.toList())
23 def namingRules = inputCategories.stream().map{{e -> e["naming_rule"]}}.collect(Collectors.toList())
24 def actualCategories = view.categorizationCriteria
25 def equals = !actualCategories.isEmpty()
26 def include_regex="{include_regex}"
27 if(include_regex != "" && !view.getIncludeRegex().equals(include_regex)){{
28 view.setIncludeRegex(include_regex)
29 equals = false
30 }}
31 for(int i=0;i<actualCategories.size();i++){{
32 if(!groupRegexes.contains(actualCategories[i].groupRegex) || !namingRules.contains(actualCategories[i].namingRule)){{
33 equals = false
34 }}
35 }}
36 if(!equals){{
37 view.categorizationCriteria.clear()
38 for(int i=0;i<inputCategories.size();i++){{
39 view.categorizationCriteria.add(new GroupingRule(inputCategories[i].group_regex,inputCategories[i].naming_rule))
40 }}
41 print("ADDED/CHANGED")
42 }}else{{
43 print("EXISTS")
44 }}
Jakub Josef7bb17ab2017-01-12 14:52:53 +010045 }}else{{
46 print("EXISTS")
47 }}
48}}else{{
49 try{{
50 {view_def}
51 Jenkins.instance.addView(view)
52 print("ADDED/CHANGED")
53 }}catch(Exception e){{
54 print("FAILED")
55 }}
56}}
Jakub Josef7d9fce32017-03-24 16:46:56 +010057""" # noqa
Jakub Josef7bb17ab2017-01-12 14:52:53 +010058
59remove_view_groovy = """\
60view = Jenkins.instance.getView("{view_name}")
61if(view){{
62 try{{
63 Jenkins.instance.deleteView(view)
64 print("REMOVED")
65 }}catch(Exception e){{
66 print("FAILED")
67 }}
68}}else{{
69 print("NOT PRESENT")
70}}
Jakub Josef7d9fce32017-03-24 16:46:56 +010071""" # noqa
Jakub Josef7bb17ab2017-01-12 14:52:53 +010072
73
Ilya Kharin3d8bffe2017-06-22 17:40:31 +040074def __virtual__():
75 '''
76 Only load if jenkins_common module exist.
77 '''
78 if 'jenkins_common.call_groovy_script' not in __salt__:
79 return (
80 False,
81 'The jenkins_view state module cannot be loaded: '
82 'jenkins_common not found')
83 return True
84
85
Jakub Josef7bb17ab2017-01-12 14:52:53 +010086def present(name, type="ListView", **kwargs):
87 """
88 Jenkins view present state method
89
90 :param name: view name
91 :param type: view type (default ListView)
92 :returns: salt-specified state dict
93 """
94 return _plugin_call(name, type, add_view_groovy, ["ADDED/CHANGED", "EXISTS"], **kwargs)
95
96
97def absent(name, **kwargs):
98 """
99 Jenkins view absent state method
100
101 :param name: view name
102 :returns: salt-specified state dict
103 """
104 return _plugin_call(name, None, remove_view_groovy, ["REMOVED", "NOT PRESENT"], **kwargs)
105
106
107def _plugin_call(name, type, template, success_msgs, **kwargs):
108 test = __opts__['test'] # noqa
109 ret = {
110 'name': name,
111 'changes': {},
112 'result': False,
113 'comment': '',
114 }
115 result = False
116 if test:
117 status = success_msgs[0]
118 ret['changes'][name] = status
119 ret['comment'] = 'Jenkins view %s %s' % (name, status.lower())
120 else:
121 view_def = "view = new {}(\"{}\")".format(type, name)
122 # handle view specific params
123 include_regex = kwargs.get('include_regex')
Jakub Josef7d9fce32017-03-24 16:46:56 +0100124 categories_string = ""
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100125 if type == "ListView":
126 if include_regex:
Jakub Josef7d9fce32017-03-24 16:46:56 +0100127 view_def += "\nview.setIncludeRegex(\"{}\")".format(
128 include_regex)
129 if type == "CategorizedJobsView":
130 # add imports for categorized views
Jakub Josef7d9fce32017-03-24 16:46:56 +0100131 if include_regex:
132 view_def += "\nview.setIncludeRegex(\"{}\")".format(
133 include_regex)
134 categories = kwargs.get('categories', [])
135 for category in categories:
136 view_def += "\nview.categorizationCriteria.add(new GroupingRule(\"{}\", \"{}\"))".format(
137 category["group_regex"], category["naming_rule"])
138 # create catogories string readable in groovy
139 categories_string = dumps(categories)
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100140
141 call_result = __salt__['jenkins_common.call_groovy_script'](
Jakub Josef7d9fce32017-03-24 16:46:56 +0100142 template, {"view_def": view_def, "view_name": name, "type": type if type else "", "include_regex": include_regex if include_regex else "", "categories_string": categories_string if categories_string else ""})
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100143 if call_result["code"] == 200 and call_result["msg"] in success_msgs:
144 status = call_result["msg"]
145 if status == success_msgs[0]:
146 ret['changes'][name] = status
147 ret['comment'] = 'Jenkins view %s %s' % (name, status.lower())
148 result = True
149 else:
150 status = 'FAILED'
151 logger.error(
152 "Jenkins view API call failure: %s", call_result["msg"])
153 ret['comment'] = 'Jenkins view API call failure: %s' % (call_result[
Jakub Josef7d9fce32017-03-24 16:46:56 +0100154 "msg"])
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100155 ret['result'] = None if test else result
156 return ret