@spinnaker/kayenta 2.3.0 → 2025.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dist/index-70b2ac83.js +2 -0
- package/build/dist/{index-ccf7a9a8.js.map → index-70b2ac83.js.map} +1 -1
- package/build/dist/index.js +1 -1
- package/build/dist/{lazy-c9b39d81.js → lazy-1f6a42b8.js} +2 -2
- package/build/dist/{lazy-c9b39d81.js.map → lazy-1f6a42b8.js.map} +1 -1
- package/build/dist/{semioticGraph-b661061c.js → semioticGraph-d687462f.js} +2 -2
- package/build/dist/{semioticGraph-b661061c.js.map → semioticGraph-d687462f.js.map} +1 -1
- package/build.gradle +67 -0
- package/gradle.properties +0 -0
- package/package.json +6 -3
- package/src/kayenta/stages/kayentaStage/kayentaStage.html +254 -212
- package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.html +25 -12
- package/.github/workflows/ci.yml +0 -75
- package/.github/workflows/publish_lib.yml +0 -26
- package/.husky/pre-commit +0 -6
- package/build/dist/index-ccf7a9a8.js +0 -2
- package/build_scripts/assert_package_bump.sh +0 -93
- package/build_scripts/publish_github_actions.sh +0 -40
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
<loading-spinner
|
|
2
|
-
size="'medium'"
|
|
3
|
-
ng-if="kayentaCanaryStageCtrl.state.backingDataLoading">
|
|
4
|
-
</loading-spinner>
|
|
1
|
+
<loading-spinner size="'medium'" ng-if="kayentaCanaryStageCtrl.state.backingDataLoading"> </loading-spinner>
|
|
5
2
|
|
|
6
3
|
<div ng-if="!kayentaCanaryStageCtrl.state.backingDataLoading" class="form-horizontal canary-config-view">
|
|
7
4
|
<div class="alert alert-warning" ng-if="kayentaCanaryStageCtrl.state.lifetimeHoursUpdatedToDuration">
|
|
@@ -9,15 +6,13 @@
|
|
|
9
6
|
<strong>Kayenta now supports analysis lifetimes shorter than 1 hour.</strong>
|
|
10
7
|
</p>
|
|
11
8
|
<p>
|
|
12
|
-
This canary stage has been updated to reflect the new lifetime support.
|
|
13
|
-
|
|
9
|
+
This canary stage has been updated to reflect the new lifetime support. Click "Save Changes" to save the updated
|
|
10
|
+
lifetime on the server.
|
|
14
11
|
</p>
|
|
15
12
|
</div>
|
|
16
13
|
|
|
17
14
|
<kayenta-stage-config-section title="Analysis Config">
|
|
18
|
-
|
|
19
|
-
<stage-config-field label="Analysis Type"
|
|
20
|
-
help-key="pipeline.config.canary.analysisType">
|
|
15
|
+
<stage-config-field label="Analysis Type" help-key="pipeline.config.canary.analysisType">
|
|
21
16
|
<kayenta-analysis-type
|
|
22
17
|
analysis-types="kayentaCanaryStageCtrl.state.analysisTypes"
|
|
23
18
|
selected-type="kayentaCanaryStageCtrl.stage.analysisType"
|
|
@@ -26,188 +21,209 @@
|
|
|
26
21
|
</stage-config-field>
|
|
27
22
|
|
|
28
23
|
<stage-config-field label="Config Name">
|
|
29
|
-
<ui-select
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
<ui-select
|
|
25
|
+
required
|
|
26
|
+
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.canaryConfigId"
|
|
27
|
+
on-select="kayentaCanaryStageCtrl.onCanaryConfigSelect()"
|
|
28
|
+
class="visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
|
|
29
|
+
style="width: 300px"
|
|
30
|
+
>
|
|
34
31
|
<ui-select-match>{{$select.selected.name}}</ui-select-match>
|
|
35
|
-
<ui-select-choices
|
|
32
|
+
<ui-select-choices
|
|
33
|
+
repeat="summary.id as summary in kayentaCanaryStageCtrl.canaryConfigSummaries | filter: $select.search"
|
|
34
|
+
>
|
|
36
35
|
{{summary.name}}
|
|
37
36
|
</ui-select-choices>
|
|
38
37
|
</ui-select>
|
|
39
38
|
</stage-config-field>
|
|
40
39
|
|
|
41
40
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, realTimeAutomatic">
|
|
42
|
-
<stage-config-field
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
41
|
+
<stage-config-field
|
|
42
|
+
label="Lifetime"
|
|
43
|
+
field-columns="8"
|
|
44
|
+
help-key="pipeline.config.canary.lifetime"
|
|
45
|
+
ng-class="kayentaCanaryStageCtrl.getLifetimeClassnames()"
|
|
46
|
+
style="padding-left: 0; padding-right: 0"
|
|
47
|
+
>
|
|
48
|
+
<input
|
|
49
|
+
type="number"
|
|
50
|
+
min="0"
|
|
51
|
+
ng-class="kayentaCanaryStageCtrl.getLifetimeInputClassnames()"
|
|
52
|
+
ng-model="kayentaCanaryStageCtrl.state.lifetime.hours"
|
|
53
|
+
class="form-control input-sm"
|
|
54
|
+
style="display: inline-block; width: 11%"
|
|
55
|
+
ng-change="kayentaCanaryStageCtrl.onLifetimeChange()"
|
|
56
|
+
/>
|
|
57
|
+
<span class="form-control-static"> hours </span>
|
|
58
|
+
<input
|
|
59
|
+
type="number"
|
|
60
|
+
min="0"
|
|
61
|
+
max="59"
|
|
62
|
+
ng-class="kayentaCanaryStageCtrl.getLifetimeInputClassnames()"
|
|
63
|
+
ng-model="kayentaCanaryStageCtrl.state.lifetime.minutes"
|
|
64
|
+
class="form-control input-sm"
|
|
65
|
+
style="display: inline-block; width: 11%; margin-left: 12px"
|
|
66
|
+
ng-change="kayentaCanaryStageCtrl.onLifetimeChange()"
|
|
67
|
+
/>
|
|
68
|
+
<span class="form-control-static"> minutes </span>
|
|
68
69
|
</stage-config-field>
|
|
69
70
|
</for-analysis-type>
|
|
70
71
|
|
|
71
72
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="retrospective">
|
|
72
|
-
<stage-config-field label="Start Time"
|
|
73
|
-
help-key="pipeline.config.canary.startTimeIso">
|
|
73
|
+
<stage-config-field label="Start Time" help-key="pipeline.config.canary.startTimeIso">
|
|
74
74
|
<input
|
|
75
75
|
required
|
|
76
76
|
class="form-control input-sm"
|
|
77
77
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].startTimeIso"
|
|
78
|
-
type="text"
|
|
78
|
+
type="text"
|
|
79
|
+
/>
|
|
79
80
|
</stage-config-field>
|
|
80
81
|
|
|
81
|
-
<stage-config-field label="End Time"
|
|
82
|
-
help-key="pipeline.config.canary.endTimeIso">
|
|
82
|
+
<stage-config-field label="End Time" help-key="pipeline.config.canary.endTimeIso">
|
|
83
83
|
<input
|
|
84
84
|
required
|
|
85
85
|
class="form-control input-sm"
|
|
86
86
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].endTimeIso"
|
|
87
|
-
type="text"
|
|
87
|
+
type="text"
|
|
88
|
+
/>
|
|
88
89
|
</stage-config-field>
|
|
89
90
|
</for-analysis-type>
|
|
90
91
|
|
|
91
92
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, realTimeAutomatic">
|
|
92
|
-
<stage-config-field label="Delay"
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
<span class="form-control-static">
|
|
100
|
-
minutes before starting analysis
|
|
101
|
-
</span>
|
|
93
|
+
<stage-config-field label="Delay" help-key="pipeline.config.canary.delayBeforeAnalysis" field-columns="5">
|
|
94
|
+
<input
|
|
95
|
+
type="text"
|
|
96
|
+
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.beginCanaryAnalysisAfterMins"
|
|
97
|
+
class="form-control input-sm"
|
|
98
|
+
style="display: inline-block; width: 19%"
|
|
99
|
+
/>
|
|
100
|
+
<span class="form-control-static"> minutes before starting analysis </span>
|
|
102
101
|
</stage-config-field>
|
|
103
102
|
</for-analysis-type>
|
|
104
103
|
|
|
105
|
-
<stage-config-field label="Interval"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
104
|
+
<stage-config-field label="Interval" help-key="pipeline.config.canary.canaryInterval" field-columns="3">
|
|
105
|
+
<input
|
|
106
|
+
type="text"
|
|
107
|
+
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.canaryAnalysisIntervalMins"
|
|
108
|
+
class="form-control input-sm"
|
|
109
|
+
style="width: 33%; display: inline-block"
|
|
110
|
+
/>
|
|
112
111
|
<span class="form-control-static"> minutes</span>
|
|
113
112
|
</stage-config-field>
|
|
114
113
|
|
|
115
114
|
<!--TODO(dpeach): add help text here-->
|
|
116
|
-
<stage-config-field label="Step"
|
|
117
|
-
field-columns="3">
|
|
115
|
+
<stage-config-field label="Step" field-columns="3">
|
|
118
116
|
<input
|
|
119
117
|
class="form-control input-sm"
|
|
120
118
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].step"
|
|
121
119
|
type="number"
|
|
122
120
|
min="0"
|
|
123
|
-
style="width: 33%; display: inline-block"
|
|
121
|
+
style="width: 33%; display: inline-block"
|
|
122
|
+
/>
|
|
124
123
|
<span class="form-control-static"> seconds</span>
|
|
125
124
|
</stage-config-field>
|
|
126
125
|
|
|
127
|
-
<stage-config-field
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
<stage-config-field
|
|
127
|
+
label="Baseline Offset"
|
|
128
|
+
help-key="pipeline.config.canary.baselineAnalysisOffset"
|
|
129
|
+
field-columns="3"
|
|
130
|
+
>
|
|
130
131
|
<input
|
|
131
132
|
class="form-control input-sm"
|
|
132
133
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.baselineAnalysisOffsetInMins"
|
|
133
134
|
type="text"
|
|
134
135
|
min="0"
|
|
135
|
-
style="width: 33%; display: inline-block"
|
|
136
|
+
style="width: 33%; display: inline-block"
|
|
137
|
+
/>
|
|
136
138
|
<span class="form-control-static"> minutes</span>
|
|
137
139
|
</stage-config-field>
|
|
138
140
|
|
|
139
|
-
<stage-config-field label="Lookback Type"
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
</select>
|
|
141
|
+
<stage-config-field label="Lookback Type" help-key="pipeline.config.canary.lookback" field-columns="3">
|
|
142
|
+
<select
|
|
143
|
+
class="form-control input-sm"
|
|
144
|
+
ng-model="kayentaCanaryStageCtrl.state.useLookback"
|
|
145
|
+
ng-options="(useLookback ? 'Sliding' : 'Growing') for useLookback in [false, true]"
|
|
146
|
+
ng-change="kayentaCanaryStageCtrl.onUseLookbackChange()"
|
|
147
|
+
></select>
|
|
147
148
|
</stage-config-field>
|
|
148
149
|
|
|
149
150
|
<stage-config-field ng-if="kayentaCanaryStageCtrl.state.useLookback">
|
|
150
151
|
<div class="form-group">
|
|
151
152
|
<div class="col-md-9">
|
|
152
|
-
<p
|
|
153
|
+
<p
|
|
154
|
+
class="form-control-static"
|
|
155
|
+
ng-if="kayentaCanaryStageCtrl.isExpression(kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins)"
|
|
156
|
+
>
|
|
153
157
|
Using a sliding lookback duration defined by an expression viewable in the pipeline JSON editor.
|
|
154
158
|
</p>
|
|
155
159
|
<span ng-if="!kayentaCanaryStageCtrl.isExpression(kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins)">
|
|
156
160
|
with a look-back duration of
|
|
157
|
-
<input
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
<input
|
|
162
|
+
type="number"
|
|
163
|
+
min="1"
|
|
164
|
+
max="{{kayentaCanaryStageCtrl.state.lifetime.hours * 60}}"
|
|
165
|
+
required
|
|
166
|
+
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins"
|
|
167
|
+
class="form-control input-sm"
|
|
168
|
+
style="display: inline-block; margin: 0 5px; width: 15%"
|
|
169
|
+
/>
|
|
163
170
|
minutes
|
|
164
171
|
</span>
|
|
165
172
|
</div>
|
|
166
173
|
</div>
|
|
167
|
-
<div
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
174
|
+
<div
|
|
175
|
+
class="error-message col-md-12"
|
|
176
|
+
ng-if="kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins > 0 && kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins < 30"
|
|
177
|
+
>
|
|
178
|
+
<b>NOTE:</b> To provide enough data points for the canary analysis it is recommended to set the look-back time
|
|
179
|
+
to at least 30 minutes.
|
|
171
180
|
</div>
|
|
172
181
|
</stage-config-field>
|
|
173
182
|
</kayenta-stage-config-section>
|
|
174
183
|
|
|
175
184
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">
|
|
176
|
-
<stage-config-field
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
185
|
+
<stage-config-field
|
|
186
|
+
label="Delay Before Cleanup"
|
|
187
|
+
field-columns="8"
|
|
188
|
+
help-key="pipeline.config.canary.delayBeforeCleanup"
|
|
189
|
+
style="padding-left: 0; padding-right: 0"
|
|
190
|
+
>
|
|
191
|
+
<input
|
|
192
|
+
type="number"
|
|
193
|
+
min="0"
|
|
194
|
+
ng-model="kayentaCanaryStageCtrl.state.delayBeforeCleanup.hours"
|
|
195
|
+
class="form-control input-sm"
|
|
196
|
+
style="display: inline-block; width: 11%"
|
|
197
|
+
ng-change="kayentaCanaryStageCtrl.onDelayBeforeCleanupChange()"
|
|
198
|
+
/>
|
|
199
|
+
<span class="form-control-static"> hours </span>
|
|
200
|
+
<input
|
|
201
|
+
type="number"
|
|
202
|
+
min="0"
|
|
203
|
+
max="59"
|
|
204
|
+
ng-model="kayentaCanaryStageCtrl.state.delayBeforeCleanup.minutes"
|
|
205
|
+
class="form-control input-sm"
|
|
206
|
+
style="display: inline-block; width: 11%; margin-left: 12px"
|
|
207
|
+
ng-change="kayentaCanaryStageCtrl.onDelayBeforeCleanupChange()"
|
|
208
|
+
/>
|
|
209
|
+
<span class="form-control-static"> minutes </span>
|
|
199
210
|
</stage-config-field>
|
|
200
211
|
</for-analysis-type>
|
|
201
212
|
|
|
202
213
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">
|
|
203
214
|
<kayenta-stage-config-section title="Baseline Version">
|
|
204
|
-
<stage-config-field
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
215
|
+
<stage-config-field
|
|
216
|
+
label="Provider"
|
|
217
|
+
ng-if="kayentaCanaryStageCtrl.providers.length > 1
|
|
218
|
+
&& kayentaCanaryStageCtrl.stage.isNew"
|
|
219
|
+
>
|
|
220
|
+
<provider-selector
|
|
221
|
+
providers="kayentaCanaryStageCtrl.providers"
|
|
222
|
+
component="kayentaCanaryStageCtrl.stage.deployments.baseline"
|
|
223
|
+
on-change="kayentaCanaryStageCtrl.handleProviderChange()"
|
|
224
|
+
field="cloudProvider"
|
|
225
|
+
read-only="!kayentaCanaryStageCtrl.stage.isNew"
|
|
226
|
+
></provider-selector>
|
|
211
227
|
</stage-config-field>
|
|
212
228
|
|
|
213
229
|
<stage-config-field label="Account">
|
|
@@ -217,7 +233,8 @@
|
|
|
217
233
|
accounts="kayentaCanaryStageCtrl.accounts"
|
|
218
234
|
on-change="kayentaCanaryStageCtrl.setClusterList()"
|
|
219
235
|
provider="kayentaCanaryStageCtrl.stage.deployments.baseline.cloudProvider"
|
|
220
|
-
required
|
|
236
|
+
required
|
|
237
|
+
>
|
|
221
238
|
</account-select-field>
|
|
222
239
|
</stage-config-field>
|
|
223
240
|
|
|
@@ -226,7 +243,8 @@
|
|
|
226
243
|
ng-if="application.serverGroups.loaded"
|
|
227
244
|
clusters="kayentaCanaryStageCtrl.clusterList"
|
|
228
245
|
required="true"
|
|
229
|
-
model="kayentaCanaryStageCtrl.stage.deployments.baseline.cluster"
|
|
246
|
+
model="kayentaCanaryStageCtrl.stage.deployments.baseline.cluster"
|
|
247
|
+
>
|
|
230
248
|
</cluster-selector>
|
|
231
249
|
</stage-config-field>
|
|
232
250
|
</kayenta-stage-config-section>
|
|
@@ -238,101 +256,108 @@
|
|
|
238
256
|
uib-tooltip="Click to populate with expressions for resolving control
|
|
239
257
|
and experiment scopes from an upstream clone stage."
|
|
240
258
|
ng-click="kayentaCanaryStageCtrl.populateScopeWithExpressions()"
|
|
241
|
-
class="fa fa-magic clickable"
|
|
259
|
+
class="fa fa-magic clickable"
|
|
260
|
+
></span>
|
|
242
261
|
</section-header>
|
|
243
262
|
|
|
244
263
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, retrospective">
|
|
245
|
-
<stage-config-field label="Baseline"
|
|
246
|
-
help-key="pipeline.config.canary.baselineGroup">
|
|
264
|
+
<stage-config-field label="Baseline" help-key="pipeline.config.canary.baselineGroup">
|
|
247
265
|
<input
|
|
248
266
|
ng-if="kayentaCanaryStageCtrl.state.atlasScopeType !== 'query'"
|
|
249
267
|
class="form-control input-sm"
|
|
250
268
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlScope"
|
|
251
269
|
required
|
|
252
|
-
type="text"
|
|
270
|
+
type="text"
|
|
271
|
+
/>
|
|
253
272
|
|
|
254
273
|
<textarea
|
|
255
274
|
ng-if="kayentaCanaryStageCtrl.state.atlasScopeType === 'query'"
|
|
256
275
|
class="form-control input-sm"
|
|
257
276
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlScope"
|
|
258
|
-
required
|
|
277
|
+
required
|
|
278
|
+
>
|
|
259
279
|
</textarea>
|
|
260
280
|
</stage-config-field>
|
|
261
281
|
|
|
262
|
-
<stage-config-field label="Baseline Location"
|
|
263
|
-
help-key="pipeline.config.canary.baselineLocation">
|
|
282
|
+
<stage-config-field label="Baseline Location" help-key="pipeline.config.canary.baselineLocation">
|
|
264
283
|
<select
|
|
265
284
|
required
|
|
266
285
|
class="form-control input-sm"
|
|
267
286
|
ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices"
|
|
268
287
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlLocation"
|
|
269
|
-
ng-options="location for location in kayentaCanaryStageCtrl.getLocationChoices().combinedLocations.control"
|
|
270
|
-
|
|
288
|
+
ng-options="location for location in kayentaCanaryStageCtrl.getLocationChoices().combinedLocations.control"
|
|
289
|
+
></select>
|
|
271
290
|
<input
|
|
272
291
|
class="form-control input-sm"
|
|
273
292
|
ng-if="!kayentaCanaryStageCtrl.getLocationChoices().hasChoices"
|
|
274
293
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlLocation"
|
|
275
294
|
required
|
|
276
|
-
type="text"
|
|
295
|
+
type="text"
|
|
296
|
+
/>
|
|
277
297
|
<div class="pull-right" ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices">
|
|
278
298
|
<button
|
|
279
299
|
ng-click="kayentaCanaryStageCtrl.toggleAllLocations('control')"
|
|
280
300
|
ng-if="!kayentaCanaryStageCtrl.state.showAllLocations.control && kayentaCanaryStageCtrl.getLocationChoices().locations.length > 0"
|
|
281
|
-
class="link"
|
|
301
|
+
class="link"
|
|
302
|
+
>
|
|
282
303
|
Show all locations
|
|
283
304
|
</button>
|
|
284
305
|
<button
|
|
285
306
|
ng-click="kayentaCanaryStageCtrl.toggleAllLocations('control')"
|
|
286
307
|
ng-if="kayentaCanaryStageCtrl.state.showAllLocations.control && kayentaCanaryStageCtrl.getLocationChoices().recommendedLocations.length > 0"
|
|
287
|
-
class="link"
|
|
308
|
+
class="link"
|
|
309
|
+
>
|
|
288
310
|
Only show recommended locations
|
|
289
311
|
</button>
|
|
290
312
|
</div>
|
|
291
313
|
</stage-config-field>
|
|
292
314
|
|
|
293
|
-
<stage-config-field label="Canary"
|
|
294
|
-
help-key="pipeline.config.canary.canaryGroup">
|
|
315
|
+
<stage-config-field label="Canary" help-key="pipeline.config.canary.canaryGroup">
|
|
295
316
|
<input
|
|
296
317
|
ng-if="kayentaCanaryStageCtrl.state.atlasScopeType !== 'query'"
|
|
297
318
|
class="form-control input-sm"
|
|
298
319
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentScope"
|
|
299
320
|
required
|
|
300
|
-
type="text"
|
|
321
|
+
type="text"
|
|
322
|
+
/>
|
|
301
323
|
|
|
302
324
|
<textarea
|
|
303
325
|
ng-if="kayentaCanaryStageCtrl.state.atlasScopeType === 'query'"
|
|
304
326
|
class="form-control input-sm"
|
|
305
327
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentScope"
|
|
306
|
-
required
|
|
328
|
+
required
|
|
329
|
+
>
|
|
307
330
|
</textarea>
|
|
308
331
|
</stage-config-field>
|
|
309
332
|
|
|
310
|
-
<stage-config-field label="Canary Location"
|
|
311
|
-
help-key="pipeline.config.canary.canaryLocation">
|
|
333
|
+
<stage-config-field label="Canary Location" help-key="pipeline.config.canary.canaryLocation">
|
|
312
334
|
<select
|
|
313
335
|
required
|
|
314
336
|
class="form-control input-sm"
|
|
315
337
|
ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices"
|
|
316
338
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentLocation"
|
|
317
|
-
ng-options="location for location in kayentaCanaryStageCtrl.getLocationChoices().combinedLocations.experiment"
|
|
318
|
-
|
|
339
|
+
ng-options="location for location in kayentaCanaryStageCtrl.getLocationChoices().combinedLocations.experiment"
|
|
340
|
+
></select>
|
|
319
341
|
<input
|
|
320
342
|
class="form-control input-sm"
|
|
321
343
|
ng-if="!kayentaCanaryStageCtrl.getLocationChoices().hasChoices"
|
|
322
344
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentLocation"
|
|
323
345
|
required
|
|
324
|
-
type="text"
|
|
346
|
+
type="text"
|
|
347
|
+
/>
|
|
325
348
|
<div class="pull-right" ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices">
|
|
326
349
|
<button
|
|
327
350
|
ng-click="kayentaCanaryStageCtrl.toggleAllLocations('experiment')"
|
|
328
351
|
ng-if="!kayentaCanaryStageCtrl.state.showAllLocations.experiment && kayentaCanaryStageCtrl.getLocationChoices().locations.length > 0"
|
|
329
|
-
class="link"
|
|
352
|
+
class="link"
|
|
353
|
+
>
|
|
330
354
|
Show all locations
|
|
331
355
|
</button>
|
|
332
356
|
<button
|
|
333
357
|
ng-click="kayentaCanaryStageCtrl.toggleAllLocations('experiment')"
|
|
334
358
|
ng-if="kayentaCanaryStageCtrl.state.showAllLocations.experiment && kayentaCanaryStageCtrl.getLocationChoices().recommendedLocations.length > 0"
|
|
335
|
-
class="link"
|
|
359
|
+
class="link"
|
|
360
|
+
>
|
|
336
361
|
Only show recommended locations
|
|
337
362
|
</button>
|
|
338
363
|
</div>
|
|
@@ -341,48 +366,54 @@
|
|
|
341
366
|
|
|
342
367
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">
|
|
343
368
|
<div class="row">
|
|
344
|
-
<div style="margin: 10px 10px 0 50px
|
|
369
|
+
<div style="margin: 10px 10px 0 50px">
|
|
345
370
|
<div class="well well-sm">
|
|
346
371
|
<table class="table">
|
|
347
372
|
<thead>
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
373
|
+
<tr>
|
|
374
|
+
<th>Location</th>
|
|
375
|
+
<th>Baseline</th>
|
|
376
|
+
<th>Canary</th>
|
|
377
|
+
<th>Actions</th>
|
|
378
|
+
</tr>
|
|
354
379
|
</thead>
|
|
355
380
|
<tbody>
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
<
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
381
|
+
<tr ng-repeat="clusterPair in kayentaCanaryStageCtrl.stage.deployments.serverGroupPairs">
|
|
382
|
+
<td>
|
|
383
|
+
<account-tag account="clusterPair.control.account"></account-tag>
|
|
384
|
+
{{kayentaCanaryStageCtrl.getRegion(clusterPair.control)}}
|
|
385
|
+
</td>
|
|
386
|
+
<td>
|
|
387
|
+
{{kayentaCanaryStageCtrl.getServerGroupName(clusterPair.control)}}
|
|
388
|
+
<br />
|
|
389
|
+
<a href ng-click="kayentaCanaryStageCtrl.editServerGroup(clusterPair.control, $index, 'control')"
|
|
390
|
+
>Edit</a
|
|
391
|
+
>
|
|
392
|
+
</td>
|
|
393
|
+
<td>
|
|
394
|
+
{{kayentaCanaryStageCtrl.getServerGroupName(clusterPair.experiment)}}
|
|
395
|
+
<br />
|
|
396
|
+
<a
|
|
397
|
+
href
|
|
398
|
+
ng-click="kayentaCanaryStageCtrl.editServerGroup(clusterPair.experiment, $index, 'experiment')"
|
|
399
|
+
>Edit</a
|
|
400
|
+
>
|
|
401
|
+
</td>
|
|
402
|
+
<td>
|
|
403
|
+
<a href ng-click="kayentaCanaryStageCtrl.deletePair($index);">
|
|
404
|
+
<span class="glyphicon glyphicon-trash" uib-tooltip="Delete Pair"></span>
|
|
405
|
+
</a>
|
|
406
|
+
</td>
|
|
407
|
+
</tr>
|
|
377
408
|
</tbody>
|
|
378
409
|
<tfoot>
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
410
|
+
<tr ng-if="!kayentaCanaryStageCtrl.stage.deployments.serverGroupPairs.length">
|
|
411
|
+
<td colspan="4">
|
|
412
|
+
<button class="btn btn-block btn-sm add-new" ng-click="kayentaCanaryStageCtrl.addPair()">
|
|
413
|
+
<span class="glyphicon glyphicon-plus-sign"></span> Add Baseline + Canary Pair
|
|
414
|
+
</button>
|
|
415
|
+
</td>
|
|
416
|
+
</tr>
|
|
386
417
|
</tfoot>
|
|
387
418
|
</table>
|
|
388
419
|
</div>
|
|
@@ -392,13 +423,13 @@
|
|
|
392
423
|
</kayenta-stage-config-section>
|
|
393
424
|
|
|
394
425
|
<kayenta-stage-config-section title="Metric Scope">
|
|
395
|
-
|
|
396
426
|
<for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">
|
|
397
427
|
<stage-config-field label="Dataset" ng-if="kayentaCanaryStageCtrl.metricStore === 'atlas'">
|
|
398
428
|
<input
|
|
399
429
|
type="checkbox"
|
|
400
430
|
ng-model="kayentaCanaryStageCtrl.state.useAtlasGlobalDataset"
|
|
401
|
-
ng-click="kayentaCanaryStageCtrl.handleAtlasDatasetChange($event)"
|
|
431
|
+
ng-click="kayentaCanaryStageCtrl.handleAtlasDatasetChange($event)"
|
|
432
|
+
/>
|
|
402
433
|
Use Global Atlas Dataset
|
|
403
434
|
</stage-config-field>
|
|
404
435
|
</for-analysis-type>
|
|
@@ -407,36 +438,42 @@
|
|
|
407
438
|
<stage-config-field label="Scope Type" ng-if="kayentaCanaryStageCtrl.metricStore === 'atlas'">
|
|
408
439
|
<select
|
|
409
440
|
required
|
|
410
|
-
class="form-control input-sm"
|
|
441
|
+
class="form-control input-sm"
|
|
442
|
+
ng-model="kayentaCanaryStageCtrl.state.atlasScopeType"
|
|
411
443
|
ng-options="(type === 'cluster' ? 'Cluster' : 'Query') for type in ['cluster', 'query']"
|
|
412
|
-
ng-change="kayentaCanaryStageCtrl.onAtlasScopeTypeChange()"
|
|
413
|
-
|
|
444
|
+
ng-change="kayentaCanaryStageCtrl.onAtlasScopeTypeChange()"
|
|
445
|
+
></select>
|
|
414
446
|
</stage-config-field>
|
|
415
447
|
</for-analysis-type>
|
|
416
448
|
|
|
417
|
-
<stage-config-field label="Extended Params"
|
|
418
|
-
help-key="pipeline.config.canary.extendedScopeParams">
|
|
449
|
+
<stage-config-field label="Extended Params" help-key="pipeline.config.canary.extendedScopeParams">
|
|
419
450
|
<map-editor
|
|
420
451
|
hidden-keys="['resourceType', 'dataset', 'type', 'environment']"
|
|
421
452
|
on-change="kayentaCanaryStageCtrl.handleExtendedScopeParamsChange()"
|
|
422
|
-
model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].extendedScopeParams"
|
|
453
|
+
model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].extendedScopeParams"
|
|
454
|
+
>
|
|
423
455
|
</map-editor>
|
|
424
456
|
</stage-config-field>
|
|
425
457
|
</kayenta-stage-config-section>
|
|
426
458
|
|
|
427
459
|
<kayenta-stage-config-section title="Scoring Thresholds">
|
|
428
|
-
<kayenta-canary-scores
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
460
|
+
<kayenta-canary-scores
|
|
461
|
+
on-change="kayentaCanaryStageCtrl.handleScoreThresholdChange"
|
|
462
|
+
successful-help-field-id="'pipeline.config.canary.passingScore'"
|
|
463
|
+
successful-label="'Pass'"
|
|
464
|
+
successful-score="kayentaCanaryStageCtrl.stage.canaryConfig.scoreThresholds.pass"
|
|
465
|
+
unhealthy-help-field-id="'pipeline.config.canary.marginalScore'"
|
|
466
|
+
unhealthy-label="'Marginal'"
|
|
467
|
+
unhealthy-score="kayentaCanaryStageCtrl.stage.canaryConfig.scoreThresholds.marginal"
|
|
468
|
+
></kayenta-canary-scores>
|
|
435
469
|
</kayenta-stage-config-section>
|
|
436
470
|
|
|
437
471
|
<kayenta-stage-config-section title="Advanced Settings" ng-if="kayentaCanaryStageCtrl.state.showAdvancedSettings">
|
|
438
|
-
|
|
439
|
-
|
|
472
|
+
<stage-config-field
|
|
473
|
+
label="Notification Emails"
|
|
474
|
+
help-key="pipeline.config.canary.legacySiteLocalRecipients"
|
|
475
|
+
ng-if="kayentaCanaryStageCtrl.state.showLegacySiteLocalRecipients"
|
|
476
|
+
>
|
|
440
477
|
<textarea
|
|
441
478
|
class="form-control input-sm"
|
|
442
479
|
ng-model="kayentaCanaryStageCtrl.state.legacySiteLocalRecipients"
|
|
@@ -446,32 +483,36 @@
|
|
|
446
483
|
</textarea>
|
|
447
484
|
</stage-config-field>
|
|
448
485
|
|
|
449
|
-
<stage-config-field
|
|
450
|
-
|
|
451
|
-
|
|
486
|
+
<stage-config-field
|
|
487
|
+
label="Metrics Account"
|
|
488
|
+
help-key="pipeline.config.metricsAccount"
|
|
489
|
+
ng-if="kayentaCanaryStageCtrl.kayentaAccounts.get('METRICS_STORE').length > 1"
|
|
490
|
+
>
|
|
452
491
|
<select
|
|
453
492
|
class="form-control input-sm"
|
|
454
493
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.metricsAccountName"
|
|
455
494
|
ng-options="account.name as account.name for account in kayentaCanaryStageCtrl.kayentaAccounts.get('METRICS_STORE')"
|
|
456
|
-
>
|
|
457
|
-
</select>
|
|
495
|
+
></select>
|
|
458
496
|
</stage-config-field>
|
|
459
|
-
<stage-config-field
|
|
460
|
-
|
|
461
|
-
|
|
497
|
+
<stage-config-field
|
|
498
|
+
label="Storage Account"
|
|
499
|
+
help-key="pipeline.config.storageAccount"
|
|
500
|
+
ng-if="kayentaCanaryStageCtrl.kayentaAccounts.get('OBJECT_STORE').length > 1"
|
|
501
|
+
>
|
|
462
502
|
<select
|
|
463
503
|
class="form-control input-sm"
|
|
464
504
|
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.storageAccountName"
|
|
465
505
|
ng-options="account.name as account.name for account in kayentaCanaryStageCtrl.kayentaAccounts.get('OBJECT_STORE')"
|
|
466
|
-
>
|
|
467
|
-
</select>
|
|
506
|
+
></select>
|
|
468
507
|
</stage-config-field>
|
|
469
508
|
|
|
470
509
|
<stage-config-field label="Scope Name" ng-if="kayentaCanaryStageCtrl.scopeNames.length > 1">
|
|
471
|
-
<ui-select
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
510
|
+
<ui-select
|
|
511
|
+
required
|
|
512
|
+
ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].scopeName"
|
|
513
|
+
class="visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
|
|
514
|
+
style="width: 300px"
|
|
515
|
+
>
|
|
475
516
|
<ui-select-match>{{$select.selected}}</ui-select-match>
|
|
476
517
|
<ui-select-choices repeat="scopeName in kayentaCanaryStageCtrl.scopeNames | filter: $select.search">
|
|
477
518
|
{{scopeName}}
|
|
@@ -480,7 +521,8 @@
|
|
|
480
521
|
</stage-config-field>
|
|
481
522
|
|
|
482
523
|
<div class="alert alert-warning" ng-if="kayentaCanaryStageCtrl.stage.canaryConfig.scopes.length > 1">
|
|
483
|
-
<strong>Warning!</strong> This stage specifies more than one scope. Please edit the stage JSON to configure scopes
|
|
524
|
+
<strong>Warning!</strong> This stage specifies more than one scope. Please edit the stage JSON to configure scopes
|
|
525
|
+
beyond the first one.
|
|
484
526
|
</div>
|
|
485
527
|
</kayenta-stage-config-section>
|
|
486
528
|
</div>
|