blob: 28b12e006d342da322b936ef6fc348945a30eac3 [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
74def present(name, type="ListView", **kwargs):
75 """
76 Jenkins view present state method
77
78 :param name: view name
79 :param type: view type (default ListView)
80 :returns: salt-specified state dict
81 """
82 return _plugin_call(name, type, add_view_groovy, ["ADDED/CHANGED", "EXISTS"], **kwargs)
83
84
85def absent(name, **kwargs):
86 """
87 Jenkins view absent state method
88
89 :param name: view name
90 :returns: salt-specified state dict
91 """
92 return _plugin_call(name, None, remove_view_groovy, ["REMOVED", "NOT PRESENT"], **kwargs)
93
94
95def _plugin_call(name, type, template, success_msgs, **kwargs):
96 test = __opts__['test'] # noqa
97 ret = {
98 'name': name,
99 'changes': {},
100 'result': False,
101 'comment': '',
102 }
103 result = False
104 if test:
105 status = success_msgs[0]
106 ret['changes'][name] = status
107 ret['comment'] = 'Jenkins view %s %s' % (name, status.lower())
108 else:
109 view_def = "view = new {}(\"{}\")".format(type, name)
110 # handle view specific params
111 include_regex = kwargs.get('include_regex')
Jakub Josef7d9fce32017-03-24 16:46:56 +0100112 categories_string = ""
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100113 if type == "ListView":
114 if include_regex:
Jakub Josef7d9fce32017-03-24 16:46:56 +0100115 view_def += "\nview.setIncludeRegex(\"{}\")".format(
116 include_regex)
117 if type == "CategorizedJobsView":
118 # add imports for categorized views
Jakub Josef7d9fce32017-03-24 16:46:56 +0100119 if include_regex:
120 view_def += "\nview.setIncludeRegex(\"{}\")".format(
121 include_regex)
122 categories = kwargs.get('categories', [])
123 for category in categories:
124 view_def += "\nview.categorizationCriteria.add(new GroupingRule(\"{}\", \"{}\"))".format(
125 category["group_regex"], category["naming_rule"])
126 # create catogories string readable in groovy
127 categories_string = dumps(categories)
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100128
129 call_result = __salt__['jenkins_common.call_groovy_script'](
Jakub Josef7d9fce32017-03-24 16:46:56 +0100130 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 +0100131 if call_result["code"] == 200 and call_result["msg"] in success_msgs:
132 status = call_result["msg"]
133 if status == success_msgs[0]:
134 ret['changes'][name] = status
135 ret['comment'] = 'Jenkins view %s %s' % (name, status.lower())
136 result = True
137 else:
138 status = 'FAILED'
139 logger.error(
140 "Jenkins view API call failure: %s", call_result["msg"])
141 ret['comment'] = 'Jenkins view API call failure: %s' % (call_result[
Jakub Josef7d9fce32017-03-24 16:46:56 +0100142 "msg"])
Jakub Josef7bb17ab2017-01-12 14:52:53 +0100143 ret['result'] = None if test else result
144 return ret