1%{--
2  - Copyright 2016 SimplifyOps, Inc. (http://simplifyops.com)
3  -
4  - Licensed under the Apache License, Version 2.0 (the "License");
5  - you may not use this file except in compliance with the License.
6  - You may obtain a copy of the License at
7  -
8  -     http://www.apache.org/licenses/LICENSE-2.0
9  -
10  - Unless required by applicable law or agreed to in writing, software
11  - distributed under the License is distributed on an "AS IS" BASIS,
12  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  - See the License for the specific language governing permissions and
14  - limitations under the License.
15  --}%
16
17<%@ page import="rundeck.Execution; rundeck.ScheduledExecution; rundeck.ExecReport" %>
18<%--
19  Created by IntelliJ IDEA.
20  User: greg
21  Date: Aug 7, 2008
22  Time: 10:32:26 AM
23--%>
24<g:set var="rkey" value="${g.rkey()}"/>
25<g:if test="${!options}">
26    <g:set var="options" value="[title:true,message:true,end:true,job:true,author:true,stat:true,out:true,context:true,duration:true,cmdinf:true,node:true,msgsplitsize:60]"/>
27</g:if>
28<%
29    if(!options.msgsplitsize){
30        options.msgsplitsize=100
31    }
32    def j = 0;
33%>
34<g:set var="maxmsgsize" value="${options.evtmaxsize?options.evtmaxsize:options.msgsplitsize?options.msgsplitsize:-1}"/>
35<g:set var="maxtitlesize" value="${30}"/>
36    <g:set var="sincetime" value="${0}"/>
37    <g:if test="${hiliteSince}">
38        <g:set var="sincetime" value="${hiliteSince instanceof String? Long.parseLong(hiliteSince) : hiliteSince}"/>
39    </g:if>
40    <g:each in="${reports}">
41        <g:set var="rpt" value="${it}"/>
42        <g:set var="foundJob" value="${null}"/>
43        <g:set var="execution" value="${null}"/>
44        <g:set var="status" value="${it?.status=='succeed'?'succeeded':'failed'}"/>
45        <g:if test="${rpt?.jcJobId}">
46            <g:set var="foundJob" value="${ScheduledExecution.getByIdOrUUID(it.jcJobId)}"/>
47        </g:if>
48        <g:if test="${rpt?.jcExecId}">
49            <g:set var="execution" value="${Execution.get(it.jcExecId)}"/>
50            <g:set var="status" value="${execution.executionState}"/>
51        </g:if>
52        <tr class="link autoclick ${it?.status != 'succeed' ? 'fail' : ''}  ${!it.dateCompleted ? 'nowrunning' : ''} ${sincetime && it.dateCompleted.time>sincetime?'newitem':''}  " >
53            <g:if test="${!hideEdit}">
54            <td style="display: none" class="eventicon obs_bulk_edit_enable">
55                <input type="checkbox" value="${enc(attr:rpt.jcExecId)}" name="bulk_edit" class="_defaultInput bulk_edit"/>
56            </td>
57            </g:if>
58            <g:set var="statusIcon" value="${execution.status == 'scheduled' ? 'time' : !execution.dateCompleted ? 'running' : execution.statusSucceeded() ?
59                    'succeed' : execution.cancelled ? 'aborted' :execution.willRetry ? 'failedretry' :execution.timedOut ? 'timedout' :
60                    execution.status in ['false','failed']?'fail':execution.status in ['incomplete']?'fail':'other'}"/>
61            <g:set var="statusIcon" value="${[succeeded:'succeed','failed-with-retry':'failedretry',failed:'fail'].get(status)?:status}"/>
62            <td class="eventicon autoclickable">
63                <i class="exec-status icon " data-execstate="${execution.executionState?.toUpperCase()}" data-statusstring="${execution.customStatusString}"></i>
64            </td>
65            <g:set var="vals" value="${['?','?','?']}"/>
66            <g:if test="${it instanceof ExecReport}">
67                <g:if test="${it?.node=~/^\d+\/\d+\/\d+$/}">
68                    <g:set var="vals" value="${it.node.split('/') as List}"/>
69                </g:if>
70                <g:else>
71                    <g:set var="vals" value="${[it?.status=='succeed'?'1':'0',it?.status=='succeed'?'0':'1','1']}"/>
72                </g:else>
73            </g:if>
74
75
76            <g:set var="hasJobArgs" value="${rpt?.jcJobId && execution && execution.argString}"/>
77        <td class="eventtitle ${rpt?.jcJobId ? 'job' : 'adhoc'} autoclickable" colspan="${hasJobArgs?1:2}">
78            <g:link controller="execution" action="show" id="${rpt.jcExecId}" class="_defaultAction"
79                params="[project:execution?execution.project:rpt.ctxProject?:params.project]"
80                    title="View execution output" absolute="${absoluteLinks}">#<g:enc>${rpt.jcExecId}</g:enc></g:link>
81            <g:if test="${options.summary}">
82                <g:if test="${rpt?.jcJobId}">
83                    <g:set var="foundJob" value="${ScheduledExecution.getByIdOrUUID(it.jcJobId)}"/>
84                    <g:if test="${foundJob}">
85                        <g:enc>${foundJob.groupPath ? foundJob.groupPath+'/':''}${foundJob.jobName}</g:enc>
86                    </g:if>
87                    <g:else>
88                        <span class="text-muted">(<g:message
89                                code="domain.ScheduledExecution.title"/> ID <g:enc>${it.jcJobId}</g:enc> has been deleted)</span>
90                    </g:else>
91
92                </g:if>
93                <g:else>
94                    <g:enc>${rpt.title}</g:enc>
95                </g:else>
96            </g:if>
97            <g:else>
98                <g:if test="${!it.status}">
99                    <g:message code="status.label.${it.status}"/>
100                </g:if>
101                <g:if test="${(status == 'killed')}">
102                    by <g:enc>${it.abortedByUser}</g:enc>
103                </g:if>
104            </g:else>
105            <g:if test="${statusIcon=='other'}">
106                <span class="exec-status-text custom-status">${execution.status}</span>
107            </g:if>
108        </td>
109            <g:if test="${rpt?.jcJobId && execution && execution.argString}">
110        <td class="eventargs autoclickable">
111            <div class="argstring-scrollable">
112            <g:if test="${execution && execution.argString}">
113                <g:render template="/execution/execArgString" model="[argString: execution.argString]"/>
114            </g:if>
115            <g:if test="${params.debug}">
116                <g:enc>${rpt.toMap()}</g:enc>
117            </g:if>
118            </div>
119        </td>
120            </g:if>
121
122            <td style="white-space:nowrap;text-overflow: ellipsis; overflow: hidden" class="right  date autoclickable">
123                <g:if test="${it.dateCompleted}">
124                    %{--<g:relativeDate elapsed="${it?.dateCompleted}" agoClass="timeago"/>--}%
125                    <g:unless test="${hideDate}">
126                    <span class="timeabs"><g:formatDate date="${it?.dateCompleted}" formatName="jobslist.date.format"/></span>
127                    </g:unless>
128                    <g:if test="${it?.dateStarted?.getTime() < it?.dateCompleted?.getTime()}">
129                        <span title="<g:relativeDate atDate='${it?.dateStarted}'/> to <g:relativeDate
130                                atDate='${it?.dateCompleted}'/> ">
131                            <g:message code="in.of" default="in"/> <g:relativeDate end="${it?.dateCompleted}" start="${it?.dateStarted}"/>
132                        </span>
133                    </g:if>
134                </g:if>
135            </td>
136
137            <td class="  user autoclickable" style="white-space: nowrap;text-overflow: ellipsis; overflow: hidden" title="by ${it?.author==session.user?'you':it.author}">
138                <em><g:message code="by" default="by"/></em>
139                <g:username user="${it?.author}"/>
140            </td>
141
142
143            <td class="  user autoclickable" style="white-space: nowrap;text-overflow: ellipsis; overflow: hidden;">
144                <g:if test="${it?.filterApplied}">
145                    <em><g:message code="activity.jobs.executed.node"/>:</em>
146                    ${it?.filterApplied}
147                </g:if>
148                <g:else>
149                    <em><g:message code="activity.jobs.executed.local"/></em>
150                </g:else>
151            </td>
152
153            <g:unless test="${hideNodes}">
154            <td class="${vals[1] != '0' ? 'fail' : 'ok'}  nodecount autoclickable ">
155                <g:if test="${vals[1] != '0'}">
156                    <g:enc>${vals[1]}</g:enc> ${options.summary ? '' : 'node'} failed
157                </g:if>
158                <g:else>
159                    <g:enc>${vals[0]}</g:enc> ${options.summary ? '' : 'node'} ok
160                </g:else>
161            </td>
162            </g:unless>
163
164        </tr>
165        <% j++; %>
166    </g:each>
167<g:if test="${lastDate}">
168    <g:set var="checkUpdatedParams" value="${[since: lastDate,project:params.project]}"/>
169    %{
170        if (filterName) {
171            checkUpdatedParams.filterName = filterName
172        } else {
173            checkUpdatedParams.putAll(paginateParams)
174        }
175    }%
176    <g:set var="checkUpdatedUrl" value="${g.createLink(action: 'since.json', params: checkUpdatedParams)}"/>
177</g:if>
178<g:set var="refreshUrl"
179       value="${g.createLink(action: 'eventsFragment', params: filterName ? [filterName: filterName] : paginateParams)}"/>
180<g:set var="rssUrl"
181       value="${g.createLink(controller: 'feed', action: 'index', params: filterName ? [filterName: filterName] : paginateParams)}"/>
182<g:render template="/common/boxinfo"
183          model="${[name: 'events', model: [total: total, max: max, offset: offset, url: refreshUrl, checkUpdatedUrl: checkUpdatedUrl, rssUrl: rssUrl, lastDate: lastDate]]}"/>
184