@spinnaker/kayenta 2.0.0 → 2.1.0
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-6aa5a1a4.js +2 -0
- package/build/dist/index-6aa5a1a4.js.map +1 -0
- package/build/dist/index.d.ts +1 -0
- package/build/dist/index.d.ts.map +1 -1
- package/build/dist/index.js +1 -1
- package/build/dist/lazy-94b6420d.js +2 -0
- package/build/dist/lazy-94b6420d.js.map +1 -0
- package/build/dist/semioticGraph-a9ade595.js +2 -0
- package/build/dist/{semioticGraph-2e43ef84.js.map → semioticGraph-a9ade595.js.map} +1 -1
- package/package.json +5 -5
- package/src/index.ts +1 -0
- package/build/dist/index-6303bdf8.js +0 -2
- package/build/dist/index-6303bdf8.js.map +0 -1
- package/build/dist/lazy-063c0421.js +0 -2
- package/build/dist/lazy-063c0421.js.map +0 -1
- package/build/dist/semioticGraph-2e43ef84.js +0 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spinnaker/kayenta",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"@uirouter/react": "1.0.2",
|
|
34
34
|
"@uirouter/react-hybrid": "1.0.2",
|
|
35
35
|
"angular-ui-bootstrap": "^2.5.0",
|
|
36
|
-
"ansi_up": "^
|
|
36
|
+
"ansi_up": "^5.0.0",
|
|
37
37
|
"bootstrap": "3.4.1",
|
|
38
38
|
"class-autobind-decorator": "^2.2.1",
|
|
39
39
|
"human-readable-ids": "^1.0.4",
|
|
40
40
|
"lodash": "4.17.21",
|
|
41
41
|
"lodash-decorators": "4.5.0",
|
|
42
|
-
"lodash-es": "4.17.
|
|
42
|
+
"lodash-es": "4.17.21",
|
|
43
43
|
"memoize-one": "^4.0.2",
|
|
44
44
|
"ngimport": "^0.6.0",
|
|
45
45
|
"react": "~16.14.0",
|
|
@@ -136,10 +136,10 @@
|
|
|
136
136
|
"jest": "^26.6.3",
|
|
137
137
|
"jquery": "3.5.1",
|
|
138
138
|
"jquery-textcomplete": "1.6.1",
|
|
139
|
-
"jquery-ui": "1.
|
|
139
|
+
"jquery-ui": "1.13.2",
|
|
140
140
|
"js-worker-search": "^1.2.1",
|
|
141
141
|
"license-checker": "^15.0.0",
|
|
142
|
-
"luxon": "1.
|
|
142
|
+
"luxon": "1.28.1",
|
|
143
143
|
"npm-run-all": "4.1.5",
|
|
144
144
|
"prettier": "2.1.2",
|
|
145
145
|
"pretty-quick": "3.1.0",
|
package/src/index.ts
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import e,{module as t}from"angular";import{SETTINGS as a,REST as n,ReactInjector as r,ApplicationDataSourceRegistry as s,HelpContentsRegistry as o,withErrorBoundary as i,HelpField as c,noop as l,AccountService as p,AppListExtractor as g,NameUtils as u,ProviderSelectionService as d,CloudProviderRegistry as y,OrchestratedItemTransformer as f,HoverablePopover as h,timestamp as m,CopyToClipboard as v,Registry as C}from"@spinnaker/core";import{omit as b,isString as S,get as k,has as w,isEmpty as x,uniq as T,map as $,difference as A,isInteger as E,first as L,unset as j,set as _,isFinite as N,cloneDeep as P,round as O,last as R}from"lodash";import*as D from"react";import I from"react";import M from"react-dom";const z=a.canary||{featureDisabled:!0};function F(e){return n("/v2/canaryConfig").path(e).get().then((t=>Object.assign(Object.assign({},t),{id:e})))}function G(...e){return n("/v2/canaryConfig").query({application:e}).get()}function q(e){return n("/v2/canaryConfig").path(e.id).put(e)}function B(e){return n("/v2/canaryConfig").post(e)}function U(e){return n("/v2/canaryConfig").path(e).delete()}function H(){return n("/v2/canaries/judges").get().then((e=>e.filter((e=>e.visible))))}function W(){return n("/v2/canaries/credentials").useCache().get()}function V(e){const{selectedConfig:t}=e;return t.config?Object.assign(Object.assign({},t.config),{judge:t.judge.judgeConfig,metrics:t.metricList.map((e=>b(e,"id"))),classifier:Object.assign(Object.assign({},t.config.classifier),{groupWeights:t.group.groupWeights})}):null}function K(e){let t="new-config",a=1;for(;(e.data.configSummaries||[]).some((e=>e.name===t));)t=`new-config-${a}`,a++;return{name:t,applications:[e.data.application.name],description:"",isNew:!0,metrics:[],configVersion:"1",templates:{},classifier:{groupWeights:{}},judge:{name:z.defaultJudge||"NetflixACAJudge-v1.0",judgeConfigurations:{}}}}function J(e){const t=Object.assign(Object.assign({},V(e)),{applications:[e.data.application.name]});if(!t)return null;let a=`${t.name}-copy`,n=1;for(;(e.data.configSummaries||[]).some((e=>e.name===a));)a=`${t.name}-copy-${n}`,n++;return b(Object.assign(Object.assign({},t),{name:a,isNew:!0}),"id")}const Q=(e,t)=>n("/v2/canaries/canary").path(e,t).query({storageAccountName:z.storageAccountName}).useCache().get().then((a=>{var n;const{config:r}=a;return r.id=e,a.id=t,null===(n=a.result)||void 0===n||n.judgeResult.results.sort(((e,t)=>e.name.localeCompare(t.name))),a})),Z=(e,t,a={})=>n("/v2/canaries/canary").path(e).query(a).post(t),X=(e,t)=>n("/v2/canaries/metricSetPairList").path(e).query({storageAccountName:z.storageAccountName}).useCache().get().then((e=>e.find((e=>e.id===t)))),Y=e=>{const t=r.$stateParams.count||20;return n("/v2/canaries").path(e,"executions").query({limit:t}).get()},ee=(e,t)=>{const a=(e||"").toLowerCase(),n=(t||"").toLowerCase();return"unhealthy"===a?"unhealthy":"success"===n?"healthy":"failure"===n?"failing":"unknown"},te={loadCanaryExecutions:e=>Y(e.name),afterConfigsLoaded:e=>{},afterJudgesLoaded:e=>{},afterCanaryExecutionsLoaded:e=>{}};const ae={"pipeline.config.canary.analysisType":"\n <p>\n <strong>Real Time</strong> analysis will be performed\n over a time interval beginning at the moment of execution.\n <ul>\n <li>\n <strong>Automatic:</strong> Spinnaker will provision and clean up the baseline and canary server groups. Not all cloud providers support this mode.\n </li>\n <li>\n <strong>Manual:</strong> You are responsible for provisioning and cleaning up the baseline and canary server groups.\n </li>\n </ul>\n </p>\n <p>\n <strong>Retrospective</strong> analysis will be performed over an explicitly-specified time\n interval (likely in the past). You are responsible for provisioning and cleaning up\n the baseline and canary server groups.\n </p>\n ","pipeline.config.canary.delayBeforeAnalysis":"<p>The number of minutes until the first canary analysis measurement interval begins.</p>","pipeline.config.canary.baselineAnalysisOffset":"<p>The offset in minutes of baseline data collection from the beginning of canary analysis. Useful for comparing metrics pre-canary for relative comparison. This field accepts SpEL</p>","pipeline.config.canary.canaryInterval":"\n <p>The frequency at which a canary score is generated. The recommended interval is at least 30 minutes.</p>\n <p>If an interval is not specified, or the specified interval is larger than the overall time range, there will be one canary run over the full time range.</p>","pipeline.config.canary.successfulScore":"<p>The minimum score the canary must achieve to be considered successful.</p>","pipeline.config.canary.unhealthyScore":"<p>The lowest score the canary can attain before it is aborted and disabled as a failure.</p>","pipeline.config.canary.baselineGroup":"<p>The server group to treat as the <em>control</em> in the canary analysis.</p>","pipeline.config.canary.baselineLocation":"<p>The location (could be a region, a namespace, or something else) of the server group to treat as the <em>control</em> in the canary analysis.</p>","pipeline.config.canary.canaryGroup":"<p>The server group to treat as the <em>experiment</em> in the canary analysis.</p>","pipeline.config.canary.canaryLocation":"<p>The location (could be a region, a namespace, or something else) of the server group to treat as the <em>experiment</em> in the canary analysis.</p>","pipeline.config.canary.startTimeIso":'<p>The overall start time of the data points to be retrieved, specified as a UTC instant using <a target="_" href="https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT">ISO-8601 instant format.</a> For example, `2018-07-12T20:28:29Z`.</p>',"pipeline.config.canary.endTimeIso":'<p>The overall end time of the data points to be retrieved, specified as a UTC instant using <a target="_" href="https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT">ISO-8601 instant format.</a> For example, `2018-07-12T22:28:29Z`.</p>',"pipeline.config.canary.extendedScopeParams":"\n <p>Metric source specific parameters which may be used to further alter the canary scope.</p>\n <p>Also used to provide variable bindings for use in the expansion of custom filter templates within the canary config.</p>","pipeline.config.canary.lookback":"<p>With an analysis type of <strong>Growing</strong>, the entire duration of the canary will be considered during the analysis.</p><p>When choosing <strong>Sliding</strong>, the canary will use the most recent number of specified minutes for its analysis report (<b>useful for long running canaries that span multiple days</b>).</p>","pipeline.config.canary.delayBeforeCleanup":"<p>The total time after canary analysis ends before canary cluster cleanup begins. Allows for manual inspection of instances.</p>","pipeline.config.canary.marginalScore":"\n <p>A canary stage can include multiple canary runs.</p>\n <p>If a given canary run score is less than or equal to the marginal threshold, the canary stage will fail immediately.</p>\n <p>If the canary run score is greater than the marginal threshold, the canary stage will not fail and will execute the remaining downstream canary runs.</p>","pipeline.config.canary.passingScore":"<p>When all canary runs in a stage have executed, a canary stage is considered a success if the final (that is, the latest) canary run score is greater than or equal to the pass threshold. Otherwise, it is a failure.</p>","pipeline.config.canary.lifetime":"\n <p>The total time for which data will be collected and analyzed during this stage.</p>\n ","pipeline.config.canary.legacySiteLocalRecipients":"<p>Email addresses to be notified when a canary report completes, separated by commas.</p>","pipeline.config.metricsAccount":"<p>The account to be used to access the metric store defined in this stage's canary config.</p>","pipeline.config.storageAccount":"<p>The account to be used to access a storage service, which will be used to store artifacts generated by this stage.</p>","canary.config.metricGroupWeights":"\n <p>A canary score is the weighted sum of metric group scores.</p>\n <p>Group weights must sum to 100.</p>\n ","canary.config.nanStrategy":"\n <p>When there is no value for a metric at a given point in time, it can either be ignored or assumed to be zero. The right choice depends on what is being measured. For example, when measuring successful attempts (like health checks) replacing missing values with zero may be appropriate.</p>\n <p>The default strategy for a given metric will be used if no strategy is selected.</p>\n ","canary.config.filterTemplate":"\n <p>Templates allow you to compose and parameterize advanced queries against your telemetry provider.</p>\n <p>Parameterized queries are hydrated by values provided in the canary stage. The <strong>project</strong>, <strong>resourceType</strong>, </string><strong>scope</strong>, and <strong>location</strong> variable bindings are implicitly available.</p>\n <p>For example, you can interpolate <strong>project</strong> using the following syntax: <strong>${project}</strong>.</p>\n ","canary.config.signalFx.queryPairs":"\n <p><strong>Query pairs are optional</strong></p>\n <p>Can be dimensions, properties, or tags (Use tag as key for tags).</p>\n <p>\n Example: Given a metric with name <pre>'request.count'</pre> that gets reported with dimensions uri, and stats_code. </br>\n If I added the following query pairs</br>\n <pre>{\n \"uri\": \"v1/some-endpoint\",\n \"status_code\": \"5*\"\n}</pre>\n I could make a metric that tracks the number of server errors for endpoint <pre>/v1/some-endpoint</pre>\n </p>\n <p>These k,v pairs are used to construct filters for the compiled SignalFlow program. EX:<pre>data('request.count', filters=filter('uri', 'v1/some-endpoint') and filter('status_code', '5*') and filter('version', '1.0.0') and filter('environment', 'production')).sum(by=['version', 'environment']).publish()</pre>\n Note that the version and environment would come from the canary scope and the sum method comes from the aggregation method.\n </p>\n ","canary.config.signalFx.aggregationMethod":"\n <p>This must be a method defined in the <a target=\"_blank\" href=\"https://developers.signalfx.com/reference#signalflow-stream-methods-1\">SignalFlow Stream Methods</a> that supports aggregation</p>\n <p>These are methods such as min, max, sum, mean and are documented with supporting the <strong>'by'</strong> keyword, ex: <pre>sum(by=['version', 'environment'])</pre></p>\n <p>Simply put the name of the method that should be used in this field such as sum, Kayenta will populate the by clauses using the canary scope filter keys</p>\n <p>This method is used to construct the compiled SignalFlow program. EX:<pre>data('request.count', filters=filter('uri', 'v1/some-endpoint') and filter('status_code', '5*') and filter('version', '1.0.0') and filter('environment', 'production')).sum(by=['version', 'environment']).publish()</pre>\n Note that the version and environment k,v pairs are sourced from the canary scope. The other k,v pairs come from the metric specific k,v pair list.\n </p>\n ","canary.config.prometheus.queryType":'\n <p>Select <strong>default</strong> to use options from the UI to configure your query.</p>\n <p>Select <strong>PromQL</strong> to compose a custom PromQL query (see <a target="blank" href="https://prometheus.io/docs/prometheus/latest/querying/basics/">documentation</a>).</p>\n ',"canary.config.effectSize.cles":'\n <p>\n The Common Language Effect Size (CLES) reports the probability that a value from one group will be greater than a\n value from the other group.\n </p>\n <p>A value of 0.50 indicates that the two groups are stochastically equal.</p>\n <p>A value of 1 indicates that the first group shows complete stochastic domination over the other group, and a\n value of 0 indicates the complete stochastic domination by the second group.\n </p>\n <p>\n <a href="https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test#Common_language_effect_size" target="_blank">Read more about CLES</a>.\n </p>\n ',"stackdriver.resourceType":"For Stackdriver, a set of time series is identified by a <strong>resource type</strong> and a metric type that has data from that resource type.","stackdriver.metricType":"For Stackdriver, a set of time series is identified by a resource type and a <strong>metric type</strong> that has data from that resource type.","stackdriver.groupBy":"Group by resource or metric labels to reduce the number of time series.","stackdriver.crossSeriesReducer":"Use an algorithm to group multiple time series together.","stackdriver.perSeriesAligner":"Use an algorithm to align individual time series."};Object.keys(ae).forEach((e=>o.register(e,ae[e])));var ne="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function re(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function se(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(a){var n=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,n.get?n:{enumerable:!0,get:function(){return e[a]}})})),t}function oe(e){var t={exports:{}};return e(t,t.exports),t.exports}var ie=function(e){for(var t=-1,a=e?e.length:0,n={};++t<a;){var r=e[t];n[r[0]]=r[1]}return n},ce="object"==typeof ne&&ne&&ne.Object===Object&&ne,le="object"==typeof self&&self&&self.Object===Object&&self,pe=ce||le||Function("return this")(),ge=pe.Symbol,ue=Object.prototype,de=ue.hasOwnProperty,ye=ue.toString,fe=ge?ge.toStringTag:void 0;var he=function(e){var t=de.call(e,fe),a=e[fe];try{e[fe]=void 0;var n=!0}catch(e){}var r=ye.call(e);return n&&(t?e[fe]=a:delete e[fe]),r},me=Object.prototype.toString;var ve=function(e){return me.call(e)},Ce=ge?ge.toStringTag:void 0;var be=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Ce&&Ce in Object(e)?he(e):ve(e)};var Se=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var ke,we=function(e){if(!Se(e))return!1;var t=be(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},xe=pe["__core-js_shared__"],Te=(ke=/[^.]+$/.exec(xe&&xe.keys&&xe.keys.IE_PROTO||""))?"Symbol(src)_1."+ke:"";var $e=function(e){return!!Te&&Te in e},Ae=Function.prototype.toString;var Ee=function(e){if(null!=e){try{return Ae.call(e)}catch(e){}try{return e+""}catch(e){}}return""},Le=/^\[object .+?Constructor\]$/,je=Function.prototype,_e=Object.prototype,Ne=je.toString,Pe=_e.hasOwnProperty,Oe=RegExp("^"+Ne.call(Pe).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var Re=function(e){return!(!Se(e)||$e(e))&&(we(e)?Oe:Le).test(Ee(e))};var De=function(e,t){return null==e?void 0:e[t]};var Ie=function(e,t){var a=De(e,t);return Re(a)?a:void 0},Me=function(){try{var e=Ie(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();var ze=function(e,t,a){"__proto__"==t&&Me?Me(e,t,{configurable:!0,enumerable:!0,value:a,writable:!0}):e[t]=a};var Fe=function(e,t){return e===t||e!=e&&t!=t},Ge=Object.prototype.hasOwnProperty;var qe=function(e,t,a){var n=e[t];Ge.call(e,t)&&Fe(n,a)&&(void 0!==a||t in e)||ze(e,t,a)};var Be=function(e,t,a,n){var r=!a;a||(a={});for(var s=-1,o=t.length;++s<o;){var i=t[s],c=n?n(a[i],e[i],i,a,e):void 0;void 0===c&&(c=e[i]),r?ze(a,i,c):qe(a,i,c)}return a};var Ue=function(e){return e};var He=function(e,t,a){switch(a.length){case 0:return e.call(t);case 1:return e.call(t,a[0]);case 2:return e.call(t,a[0],a[1]);case 3:return e.call(t,a[0],a[1],a[2])}return e.apply(t,a)},We=Math.max;var Ve=function(e,t,a){return t=We(void 0===t?e.length-1:t,0),function(){for(var n=arguments,r=-1,s=We(n.length-t,0),o=Array(s);++r<s;)o[r]=n[t+r];r=-1;for(var i=Array(t+1);++r<t;)i[r]=n[r];return i[t]=a(o),He(e,this,i)}};var Ke=function(e){return function(){return e}},Je=Me?function(e,t){return Me(e,"toString",{configurable:!0,enumerable:!1,value:Ke(t),writable:!0})}:Ue,Qe=Date.now;var Ze=function(e){var t=0,a=0;return function(){var n=Qe(),r=16-(n-a);if(a=n,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(Je);var Xe=function(e,t){return Ze(Ve(e,t,Ue),e+"")};var Ye=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991};var et=function(e){return null!=e&&Ye(e.length)&&!we(e)},tt=/^(?:0|[1-9]\d*)$/;var at=function(e,t){var a=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==a||"symbol"!=a&&tt.test(e))&&e>-1&&e%1==0&&e<t};var nt=function(e,t,a){if(!Se(a))return!1;var n=typeof t;return!!("number"==n?et(a)&&at(t,a.length):"string"==n&&t in a)&&Fe(a[t],e)};var rt=function(e){return Xe((function(t,a){var n=-1,r=a.length,s=r>1?a[r-1]:void 0,o=r>2?a[2]:void 0;for(s=e.length>3&&"function"==typeof s?(r--,s):void 0,o&&nt(a[0],a[1],o)&&(s=r<3?void 0:s,r=1),t=Object(t);++n<r;){var i=a[n];i&&e(t,i,n,s)}return t}))},st=Object.prototype;var ot=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||st)};var it=function(e,t){for(var a=-1,n=Array(e);++a<e;)n[a]=t(a);return n};var ct=function(e){return null!=e&&"object"==typeof e};var lt=function(e){return ct(e)&&"[object Arguments]"==be(e)},pt=Object.prototype,gt=pt.hasOwnProperty,ut=pt.propertyIsEnumerable,dt=lt(function(){return arguments}())?lt:function(e){return ct(e)&>.call(e,"callee")&&!ut.call(e,"callee")},yt=Array.isArray;var ft=function(){return!1},ht=oe((function(e,t){var a=t&&!t.nodeType&&t,n=a&&e&&!e.nodeType&&e,r=n&&n.exports===a?pe.Buffer:void 0,s=(r?r.isBuffer:void 0)||ft;e.exports=s})),mt={};mt["[object Float32Array]"]=mt["[object Float64Array]"]=mt["[object Int8Array]"]=mt["[object Int16Array]"]=mt["[object Int32Array]"]=mt["[object Uint8Array]"]=mt["[object Uint8ClampedArray]"]=mt["[object Uint16Array]"]=mt["[object Uint32Array]"]=!0,mt["[object Arguments]"]=mt["[object Array]"]=mt["[object ArrayBuffer]"]=mt["[object Boolean]"]=mt["[object DataView]"]=mt["[object Date]"]=mt["[object Error]"]=mt["[object Function]"]=mt["[object Map]"]=mt["[object Number]"]=mt["[object Object]"]=mt["[object RegExp]"]=mt["[object Set]"]=mt["[object String]"]=mt["[object WeakMap]"]=!1;var vt=function(e){return ct(e)&&Ye(e.length)&&!!mt[be(e)]};var Ct=function(e){return function(t){return e(t)}},bt=oe((function(e,t){var a=t&&!t.nodeType&&t,n=a&&e&&!e.nodeType&&e,r=n&&n.exports===a&&ce.process,s=function(){try{var e=n&&n.require&&n.require("util").types;return e||r&&r.binding&&r.binding("util")}catch(e){}}();e.exports=s})),St=bt&&bt.isTypedArray,kt=St?Ct(St):vt,wt=Object.prototype.hasOwnProperty;var xt=function(e,t){var a=yt(e),n=!a&&dt(e),r=!a&&!n&&ht(e),s=!a&&!n&&!r&&kt(e),o=a||n||r||s,i=o?it(e.length,String):[],c=i.length;for(var l in e)!t&&!wt.call(e,l)||o&&("length"==l||r&&("offset"==l||"parent"==l)||s&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||at(l,c))||i.push(l);return i};var Tt=function(e,t){return function(a){return e(t(a))}}(Object.keys,Object),$t=Object.prototype.hasOwnProperty;var At=function(e){if(!ot(e))return Tt(e);var t=[];for(var a in Object(e))$t.call(e,a)&&"constructor"!=a&&t.push(a);return t};var Et=function(e){return et(e)?xt(e):At(e)},Lt=Object.prototype.hasOwnProperty,jt=rt((function(e,t){if(ot(t)||et(t))Be(t,Et(t),e);else for(var a in t)Lt.call(t,a)&&qe(e,a,t[a])}));var _t=function(e){return function(t,a,n){for(var r=-1,s=Object(t),o=n(t),i=o.length;i--;){var c=o[e?i:++r];if(!1===a(s[c],c,s))break}return t}}();var Nt=function(e,t){return e&&_t(e,t,Et)};var Pt=function(){this.__data__=[],this.size=0};var Ot=function(e,t){for(var a=e.length;a--;)if(Fe(e[a][0],t))return a;return-1},Rt=Array.prototype.splice;var Dt=function(e){var t=this.__data__,a=Ot(t,e);return!(a<0)&&(a==t.length-1?t.pop():Rt.call(t,a,1),--this.size,!0)};var It=function(e){var t=this.__data__,a=Ot(t,e);return a<0?void 0:t[a][1]};var Mt=function(e){return Ot(this.__data__,e)>-1};var zt=function(e,t){var a=this.__data__,n=Ot(a,e);return n<0?(++this.size,a.push([e,t])):a[n][1]=t,this};function Ft(e){var t=-1,a=null==e?0:e.length;for(this.clear();++t<a;){var n=e[t];this.set(n[0],n[1])}}Ft.prototype.clear=Pt,Ft.prototype.delete=Dt,Ft.prototype.get=It,Ft.prototype.has=Mt,Ft.prototype.set=zt;var Gt=Ft;var qt=function(){this.__data__=new Gt,this.size=0};var Bt=function(e){var t=this.__data__,a=t.delete(e);return this.size=t.size,a};var Ut=function(e){return this.__data__.get(e)};var Ht=function(e){return this.__data__.has(e)},Wt=Ie(pe,"Map"),Vt=Ie(Object,"create");var Kt=function(){this.__data__=Vt?Vt(null):{},this.size=0};var Jt=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Qt=Object.prototype.hasOwnProperty;var Zt=function(e){var t=this.__data__;if(Vt){var a=t[e];return"__lodash_hash_undefined__"===a?void 0:a}return Qt.call(t,e)?t[e]:void 0},Xt=Object.prototype.hasOwnProperty;var Yt=function(e){var t=this.__data__;return Vt?void 0!==t[e]:Xt.call(t,e)};var ea=function(e,t){var a=this.__data__;return this.size+=this.has(e)?0:1,a[e]=Vt&&void 0===t?"__lodash_hash_undefined__":t,this};function ta(e){var t=-1,a=null==e?0:e.length;for(this.clear();++t<a;){var n=e[t];this.set(n[0],n[1])}}ta.prototype.clear=Kt,ta.prototype.delete=Jt,ta.prototype.get=Zt,ta.prototype.has=Yt,ta.prototype.set=ea;var aa=ta;var na=function(){this.size=0,this.__data__={hash:new aa,map:new(Wt||Gt),string:new aa}};var ra=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var sa=function(e,t){var a=e.__data__;return ra(t)?a["string"==typeof t?"string":"hash"]:a.map};var oa=function(e){var t=sa(this,e).delete(e);return this.size-=t?1:0,t};var ia=function(e){return sa(this,e).get(e)};var ca=function(e){return sa(this,e).has(e)};var la=function(e,t){var a=sa(this,e),n=a.size;return a.set(e,t),this.size+=a.size==n?0:1,this};function pa(e){var t=-1,a=null==e?0:e.length;for(this.clear();++t<a;){var n=e[t];this.set(n[0],n[1])}}pa.prototype.clear=na,pa.prototype.delete=oa,pa.prototype.get=ia,pa.prototype.has=ca,pa.prototype.set=la;var ga=pa;var ua=function(e,t){var a=this.__data__;if(a instanceof Gt){var n=a.__data__;if(!Wt||n.length<199)return n.push([e,t]),this.size=++a.size,this;a=this.__data__=new ga(n)}return a.set(e,t),this.size=a.size,this};function da(e){var t=this.__data__=new Gt(e);this.size=t.size}da.prototype.clear=qt,da.prototype.delete=Bt,da.prototype.get=Ut,da.prototype.has=Ht,da.prototype.set=ua;var ya=da;var fa=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this};var ha=function(e){return this.__data__.has(e)};function ma(e){var t=-1,a=null==e?0:e.length;for(this.__data__=new ga;++t<a;)this.add(e[t])}ma.prototype.add=ma.prototype.push=fa,ma.prototype.has=ha;var va=ma;var Ca=function(e,t){for(var a=-1,n=null==e?0:e.length;++a<n;)if(t(e[a],a,e))return!0;return!1};var ba=function(e,t){return e.has(t)};var Sa=function(e,t,a,n,r,s){var o=1&a,i=e.length,c=t.length;if(i!=c&&!(o&&c>i))return!1;var l=s.get(e);if(l&&s.get(t))return l==t;var p=-1,g=!0,u=2&a?new va:void 0;for(s.set(e,t),s.set(t,e);++p<i;){var d=e[p],y=t[p];if(n)var f=o?n(y,d,p,t,e,s):n(d,y,p,e,t,s);if(void 0!==f){if(f)continue;g=!1;break}if(u){if(!Ca(t,(function(e,t){if(!ba(u,t)&&(d===e||r(d,e,a,n,s)))return u.push(t)}))){g=!1;break}}else if(d!==y&&!r(d,y,a,n,s)){g=!1;break}}return s.delete(e),s.delete(t),g},ka=pe.Uint8Array;var wa=function(e){var t=-1,a=Array(e.size);return e.forEach((function(e,n){a[++t]=[n,e]})),a};var xa=function(e){var t=-1,a=Array(e.size);return e.forEach((function(e){a[++t]=e})),a},Ta=ge?ge.prototype:void 0,$a=Ta?Ta.valueOf:void 0;var Aa=function(e,t,a,n,r,s,o){switch(a){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!s(new ka(e),new ka(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return Fe(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var i=wa;case"[object Set]":var c=1&n;if(i||(i=xa),e.size!=t.size&&!c)return!1;var l=o.get(e);if(l)return l==t;n|=2,o.set(e,t);var p=Sa(i(e),i(t),n,r,s,o);return o.delete(e),p;case"[object Symbol]":if($a)return $a.call(e)==$a.call(t)}return!1};var Ea=function(e,t){for(var a=-1,n=t.length,r=e.length;++a<n;)e[r+a]=t[a];return e};var La=function(e,t,a){var n=t(e);return yt(e)?n:Ea(n,a(e))};var ja=function(e,t){for(var a=-1,n=null==e?0:e.length,r=0,s=[];++a<n;){var o=e[a];t(o,a,e)&&(s[r++]=o)}return s};var _a=function(){return[]},Na=Object.prototype.propertyIsEnumerable,Pa=Object.getOwnPropertySymbols,Oa=Pa?function(e){return null==e?[]:(e=Object(e),ja(Pa(e),(function(t){return Na.call(e,t)})))}:_a;var Ra=function(e){return La(e,Et,Oa)},Da=Object.prototype.hasOwnProperty;var Ia=function(e,t,a,n,r,s){var o=1&a,i=Ra(e),c=i.length;if(c!=Ra(t).length&&!o)return!1;for(var l=c;l--;){var p=i[l];if(!(o?p in t:Da.call(t,p)))return!1}var g=s.get(e);if(g&&s.get(t))return g==t;var u=!0;s.set(e,t),s.set(t,e);for(var d=o;++l<c;){var y=e[p=i[l]],f=t[p];if(n)var h=o?n(f,y,p,t,e,s):n(y,f,p,e,t,s);if(!(void 0===h?y===f||r(y,f,a,n,s):h)){u=!1;break}d||(d="constructor"==p)}if(u&&!d){var m=e.constructor,v=t.constructor;m==v||!("constructor"in e)||!("constructor"in t)||"function"==typeof m&&m instanceof m&&"function"==typeof v&&v instanceof v||(u=!1)}return s.delete(e),s.delete(t),u},Ma=Ie(pe,"DataView"),za=Ie(pe,"Promise"),Fa=Ie(pe,"Set"),Ga=Ie(pe,"WeakMap"),qa=Ee(Ma),Ba=Ee(Wt),Ua=Ee(za),Ha=Ee(Fa),Wa=Ee(Ga),Va=be;(Ma&&"[object DataView]"!=Va(new Ma(new ArrayBuffer(1)))||Wt&&"[object Map]"!=Va(new Wt)||za&&"[object Promise]"!=Va(za.resolve())||Fa&&"[object Set]"!=Va(new Fa)||Ga&&"[object WeakMap]"!=Va(new Ga))&&(Va=function(e){var t=be(e),a="[object Object]"==t?e.constructor:void 0,n=a?Ee(a):"";if(n)switch(n){case qa:return"[object DataView]";case Ba:return"[object Map]";case Ua:return"[object Promise]";case Ha:return"[object Set]";case Wa:return"[object WeakMap]"}return t});var Ka=Va,Ja="[object Object]",Qa=Object.prototype.hasOwnProperty;var Za=function(e,t,a,n,r,s){var o=yt(e),i=yt(t),c=o?"[object Array]":Ka(e),l=i?"[object Array]":Ka(t),p=(c="[object Arguments]"==c?Ja:c)==Ja,g=(l="[object Arguments]"==l?Ja:l)==Ja,u=c==l;if(u&&ht(e)){if(!ht(t))return!1;o=!0,p=!1}if(u&&!p)return s||(s=new ya),o||kt(e)?Sa(e,t,a,n,r,s):Aa(e,t,c,a,n,r,s);if(!(1&a)){var d=p&&Qa.call(e,"__wrapped__"),y=g&&Qa.call(t,"__wrapped__");if(d||y){var f=d?e.value():e,h=y?t.value():t;return s||(s=new ya),r(f,h,a,n,s)}}return!!u&&(s||(s=new ya),Ia(e,t,a,n,r,s))};var Xa=function e(t,a,n,r,s){return t===a||(null==t||null==a||!ct(t)&&!ct(a)?t!=t&&a!=a:Za(t,a,n,r,e,s))};var Ya=function(e,t,a,n){var r=a.length,s=r,o=!n;if(null==e)return!s;for(e=Object(e);r--;){var i=a[r];if(o&&i[2]?i[1]!==e[i[0]]:!(i[0]in e))return!1}for(;++r<s;){var c=(i=a[r])[0],l=e[c],p=i[1];if(o&&i[2]){if(void 0===l&&!(c in e))return!1}else{var g=new ya;if(n)var u=n(l,p,c,e,t,g);if(!(void 0===u?Xa(p,l,3,n,g):u))return!1}}return!0};var en=function(e){return e==e&&!Se(e)};var tn=function(e){for(var t=Et(e),a=t.length;a--;){var n=t[a],r=e[n];t[a]=[n,r,en(r)]}return t};var an=function(e,t){return function(a){return null!=a&&(a[e]===t&&(void 0!==t||e in Object(a)))}};var nn=function(e){var t=tn(e);return 1==t.length&&t[0][2]?an(t[0][0],t[0][1]):function(a){return a===e||Ya(a,e,t)}};var rn=function(e){return"symbol"==typeof e||ct(e)&&"[object Symbol]"==be(e)},sn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,on=/^\w*$/;var cn=function(e,t){if(yt(e))return!1;var a=typeof e;return!("number"!=a&&"symbol"!=a&&"boolean"!=a&&null!=e&&!rn(e))||(on.test(e)||!sn.test(e)||null!=t&&e in Object(t))};function ln(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var a=function(){var n=arguments,r=t?t.apply(this,n):n[0],s=a.cache;if(s.has(r))return s.get(r);var o=e.apply(this,n);return a.cache=s.set(r,o)||s,o};return a.cache=new(ln.Cache||ga),a}ln.Cache=ga;var pn=ln;var gn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,un=/\\(\\)?/g,dn=function(e){var t=pn(e,(function(e){return 500===a.size&&a.clear(),e})),a=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(gn,(function(e,a,n,r){t.push(n?r.replace(un,"$1"):a||e)})),t}));var yn=function(e,t){for(var a=-1,n=null==e?0:e.length,r=Array(n);++a<n;)r[a]=t(e[a],a,e);return r},fn=ge?ge.prototype:void 0,hn=fn?fn.toString:void 0;var mn=function e(t){if("string"==typeof t)return t;if(yt(t))return yn(t,e)+"";if(rn(t))return hn?hn.call(t):"";var a=t+"";return"0"==a&&1/t==-Infinity?"-0":a};var vn=function(e){return null==e?"":mn(e)};var Cn=function(e,t){return yt(e)?e:cn(e,t)?[e]:dn(vn(e))};var bn=function(e){if("string"==typeof e||rn(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t};var Sn=function(e,t){for(var a=0,n=(t=Cn(t,e)).length;null!=e&&a<n;)e=e[bn(t[a++])];return a&&a==n?e:void 0};var kn=function(e,t,a){var n=null==e?void 0:Sn(e,t);return void 0===n?a:n};var wn=function(e,t){return null!=e&&t in Object(e)};var xn=function(e,t,a){for(var n=-1,r=(t=Cn(t,e)).length,s=!1;++n<r;){var o=bn(t[n]);if(!(s=null!=e&&a(e,o)))break;e=e[o]}return s||++n!=r?s:!!(r=null==e?0:e.length)&&Ye(r)&&at(o,r)&&(yt(e)||dt(e))};var Tn=function(e,t){return null!=e&&xn(e,t,wn)};var $n=function(e,t){return cn(e)&&en(t)?an(bn(e),t):function(a){var n=kn(a,e);return void 0===n&&n===t?Tn(a,e):Xa(t,n,3)}};var An=function(e){return function(t){return null==t?void 0:t[e]}};var En=function(e){return function(t){return Sn(t,e)}};var Ln=function(e){return cn(e)?An(bn(e)):En(e)};var jn=function(e){return"function"==typeof e?e:null==e?Ue:"object"==typeof e?yt(e)?$n(e[0],e[1]):nn(e):Ln(e)};var _n=function(e,t){var a={};return t=jn(t),Nt(e,(function(e,n,r){ze(a,n,t(e,n,r))})),a};var Nn=function(e,t){return function(a,n){if(null==a)return a;if(!et(a))return e(a,n);for(var r=a.length,s=t?r:-1,o=Object(a);(t?s--:++s<r)&&!1!==n(o[s],s,o););return a}}(Nt);var Pn=function(e,t){var a;return Nn(e,(function(e,n,r){return!(a=t(e,n,r))})),!!a};var On,Rn=function(e,t,a){var n=yt(e)?Ca:Pn;return a&&nt(e,t,a)&&(t=void 0),n(e,jn(t))},Dn=function(){function e(){this.__isFirstRender=!0,this.state={},this.props={}}return e.prototype.$onChanges=function(e){var t=this.props,a=_n(e,"currentValue"),n=jt({},this.props,a);if(this.__isFirstRender)jt(this,{props:n}),this.componentWillMount(),this.render(),this.__isFirstRender=!1;else{if(!this.didPropsChange(a,t))return;this.componentWillReceiveProps(n);var r=this.shouldComponentUpdate(n,this.state);if(jt(this,{props:n}),!r)return;this.componentWillUpdate(this.props,this.state),this.render(),this.componentDidUpdate(this.props,this.state)}},e.prototype.$postLink=function(){this.componentDidMount()},e.prototype.$onDestroy=function(){this.componentWillUnmount()},e.prototype.didPropsChange=function(e,t){return Rn(e,(function(e,a){return e!==t[a]}))},e.prototype.componentWillMount=function(){},e.prototype.componentDidMount=function(){},e.prototype.componentWillReceiveProps=function(e){},e.prototype.shouldComponentUpdate=function(e,t){return!0},e.prototype.componentWillUpdate=function(e,t){},e.prototype.componentDidUpdate=function(e,t){},e.prototype.componentWillUnmount=function(){},e.prototype.render=function(){},e}(),In=Object.defineProperty({default:Dn},"__esModule",{value:!0}),Mn=ne&&ne.__extends||(On=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var a in t)t.hasOwnProperty(a)&&(e[a]=t[a])},function(e,t){function a(){this.constructor=e}On(e,t),e.prototype=null===t?Object.create(t):(a.prototype=t.prototype,new a)}),zn=ne&&ne.__assign||Object.assign||function(e){for(var t,a=1,n=arguments.length;a<n;a++)for(var r in t=arguments[a])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e};var Fn=function(e,t,a){void 0===t&&(t=null),void 0===a&&(a=[]);var n=t||e.propTypes&&Object.keys(e.propTypes)||[];return{bindings:ie(n.map((function(e){return[e,"<"]}))),controller:["$element"].concat(a,[function(t){function n(e){for(var n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];var s=t.call(this)||this;return s.$element=e,s.injectedProps={},a.forEach((function(e,t){s.injectedProps[e]=n[t]})),s}return Mn(n,t),n.prototype.render=function(){M.render(I.createElement(e,zn({},this.injectedProps,this.props)),this.$element[0])},n.prototype.componentWillUnmount=function(){M.unmountComponentAtNode(this.$element[0])},n}(In.default)])}},Gn=oe((function(e){!function(){var t={}.hasOwnProperty;function a(){for(var e=[],n=0;n<arguments.length;n++){var r=arguments[n];if(r){var s=typeof r;if("string"===s||"number"===s)e.push(r);else if(Array.isArray(r))e.push(a.apply(null,r));else if("object"===s)for(var o in r)t.call(r,o)&&r[o]&&e.push(o)}}return e.join(" ")}e.exports?e.exports=a:window.classNames=a}()}));function qn(e,t){void 0===t&&(t={});var a=t.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===a&&n.firstChild?n.insertBefore(r,n.firstChild):n.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}qn(".score.score-label {\n font-size: 110%;\n padding: 3px 6px;\n display: inline-block;\n height: 20px;\n line-height: 14px;\n color: white;\n}\n.score.score-label.inverse {\n padding: 0;\n}\n.score.score-label.label-failing {\n background-color: var(--color-alert-light);\n}\n.score.score-label.label-failing.inverse {\n color: var(--color-alert-light);\n}\n.score.score-label.label-healthy {\n background-color: var(--color-success);\n}\n.score.score-label.label-healthy.inverse {\n color: var(--color-success);\n}\n.score.score-label.label-unhealthy {\n background-color: var(--color-danger);\n}\n.score.score-label.label-unhealthy.inverse {\n color: var(--color-danger);\n}\n.score.score-label.label-unknown {\n background-color: var(--color-text-caption);\n}\n.score.score-label.label-unknown.inverse {\n color: var(--color-text-caption);\n}\n.score.score-label.inverse {\n background-color: transparent;\n font-size: 100%;\n padding: 0;\n}\n.score.score-label .score-classification {\n font-size: 45%;\n display: block;\n margin-top: 15px;\n font-weight: 400;\n text-transform: uppercase;\n}\n.score-large.score {\n height: 48px;\n}\n.score-large .score.score-label {\n height: auto;\n line-height: 48px;\n padding: 0 10px;\n font-size: 28px;\n font-weight: bold;\n margin: 0;\n border-radius: 0;\n display: inline-block;\n}\n.score.score-report {\n align-items: center;\n padding: 12px 12px 6px;\n font-size: 28px;\n font-weight: bold;\n margin-bottom: 10px;\n height: 100%;\n}\n.table-row .score.score-report {\n display: inline-block;\n}\n");class Bn extends D.Component{constructor(e){super(e),this.state=this.getLabelState(e)}getLabelState(e){return{score:0===e.score||e.score&&e.score>0?e.score:"N/A",healthLabel:ee(e.health,e.result)}}componentWillReceiveProps(e){this.setState(this.getLabelState(e))}render(){const e=[this.props.inverse?"inverse":"","score","score-label","label-default",`label-${this.state.healthLabel}`].join(" ");return D.createElement("span",{className:Gn(e,this.props.className)},this.state.score,this.props.classification&&D.createElement("span",{className:"score-classification"},this.props.classification.toString()))}}Bn.defaultProps={health:""};t("spinnaker.kayenta.score.component",[]).component("kayentaCanaryScore",Fn(i(Bn,"kayentaCanaryScore"),["score","health","result","inverse"]));function Un(e){const[t,a]=D.useState(!!e.successfulScore),[n,r]=D.useState(!!e.unhealthyScore),{successfulScore:s,unhealthyScore:o}=e,i=e=>S(e)&&e.includes("${"),l=i(o)||i(s);let p,g;l||(p=Number(s),g=Number(o));const u={successful:"",unhealthy:""};t&&(p<=0&&(u.successful="Must be positive"),p>=100&&(u.successful="Must be less than 100")),n&&(g<=0&&(u.unhealthy="Must be positive"),g>=100&&(u.unhealthy="Must be less than 100")),t&&n&&p<=g&&(u.successful=`Must be greater than ${e.unhealthyLabel}`);const d=!(p&&g);return D.createElement("div",null,l&&D.createElement("div",{className:"form-group"},D.createElement("div",{className:"col-md-2 col-md-offset-1 sm-label-right"},"Canary Scores"),D.createElement("div",{className:"col-md-9 form-control-static"},"Expressions are currently being used for canary scores.")),!l&&D.createElement("div",{className:"canary-score"},D.createElement("div",{className:"form-group"},D.createElement("div",{className:"col-md-2 col-md-offset-1 sm-label-right"},e.unhealthyLabel||"Unhealthy Score ",D.createElement(c,{id:e.unhealthyHelpFieldId||"pipeline.config.canary.unhealthyScore"})),D.createElement("div",{className:"col-md-2"},D.createElement("input",{type:"number",required:!0,disabled:e.disabled,onBlur:()=>r(!0),value:Number.isNaN(g)?"":g,onChange:t=>{e.onChange({successfulScore:s,unhealthyScore:t.target.value})},className:Gn("form-control","input-sm",{"ng-invalid":!!u.unhealthy,"ng-invalid-validate-min":!!u.unhealthy})}),u.unhealthy&&D.createElement("div",{className:"error-message"},u.unhealthy)),D.createElement("div",{className:"col-md-2 col-md-offset-1 sm-label-right"},e.successfulLabel||"Successful Score ",D.createElement(c,{id:e.successfulHelpFieldId||"pipeline.config.canary.successfulScore"})),D.createElement("div",{className:"col-md-2"},D.createElement("input",{type:"number",required:!0,disabled:e.disabled,onBlur:()=>a(!0),value:Number.isNaN(p)?"":p,onChange:t=>{e.onChange({successfulScore:t.target.value,unhealthyScore:o})},className:Gn("form-control","input-sm",{"ng-invalid":!!u.successful,"ng-invalid-validate-max":!!u.successful})}),u.successful&&D.createElement("div",{className:"error-message"},u.successful))),D.createElement("div",{className:"row"},D.createElement("div",{className:"col-md-offset-1 col-md-10"},D.createElement("div",{className:"progress"},D.createElement("div",{className:"progress-bar progress-bar-danger",style:{width:`${d?0:g}%`}}),D.createElement("div",{className:"progress-bar progress-bar-warning",style:{width:(d?0:100-(g+(100-p)))+"%"}}),D.createElement("div",{className:"progress-bar progress-bar-success",style:{width:(d?0:100-p)+"%"}}),D.createElement("div",{className:"progress-bar progress-bar-warning",style:{width:(d?100:0)+"%"}}))))))}qn("div.canary-score div.progress {\n border-radius: 0;\n box-shadow: none;\n -webkit-box-shadow: none;\n height: 10px;\n margin: 20px 0 10px;\n}\ndiv.canary-score div.progress-bar {\n box-shadow: none;\n -webkit-box-shadow: none;\n}\ndiv.canary-score div.progress-bar-danger {\n background-color: var(--color-danger);\n}\ndiv.canary-score div.progress-bar.progress-bar-warning {\n background-color: var(--color-alto);\n}\ndiv.canary-score div.progress-bar.progress-bar-success {\n background-color: var(--color-success-light);\n}\n");var Hn,Wn,Vn,Kn;t("spinnaker.kayenta.canaryScores.component",[]).component("kayentaCanaryScores",Fn(i(Un,"kayentaCanaryScores"),["onChange","successfulHelpFieldId","successfulLabel","successfulScore","unhealthyHelpFieldId","unhealthyLabel","unhealthyScore"])),function(e){e.MetricsStore="METRICS_STORE",e.ObjectStore="OBJECT_STORE",e.ConfigurationStore="CONFIGURATION_STORE"}(Hn||(Hn={})),function(e){e.RealTimeAutomatic="realTimeAutomatic",e.RealTime="realTime",e.Retrospective="retrospective"}(Wn||(Wn={})),function(e){e.Pass="Pass",e.High="High",e.Low="Low",e.Nodata="Nodata",e.Error="Error"}(Vn||(Vn={})),function(e){e.Pass="Pass",e.Marginal="Marginal",e.Fail="Fail",e.Nodata="Nodata",e.Error="Error"}(Kn||(Kn={}));const Jn=()=>D.createElement("div",{className:"alert alert-warning"},"The analysis type you've selected isn't supported by any of this application's cloud providers. Please select a different type."),Qn=({selectedType:e,analysisTypes:t,onChange:a=l,label:n,type:r})=>t.includes(r)?D.createElement("div",{className:"radio"},D.createElement("label",null,D.createElement("input",{type:"radio",name:"analysisType",checked:e===r,onChange:()=>a(r)}),n)):null;t("spinnaker.kayenta.analysisType.component",[]).component("kayentaAnalysisType",Fn(i((e=>{const{analysisTypes:t=[],selectedType:a}=e;return D.createElement(D.Fragment,null,!t.includes(a)&&D.createElement(Jn,null),D.createElement(Qn,Object.assign({},e,{label:"Real Time (Automatic)",type:Wn.RealTimeAutomatic})),D.createElement(Qn,Object.assign({},e,{label:"Real Time (Manual)",type:Wn.RealTime})),D.createElement(Qn,Object.assign({},e,{label:"Retrospective",type:Wn.Retrospective})))}),"kayentaAnalysisType"),["analysisTypes","selectedType","onChange"]));var Zn=oe((function(t,a){Object.defineProperty(a,"__esModule",{value:!0}),a.$httpProvider=void 0,a.$logProvider=void 0,a.$anchorScroll=void 0,a.$cacheFactory=void 0,a.$compile=void 0,a.$controller=void 0,a.$document=void 0,a.$exceptionHandler=void 0,a.$filter=void 0,a.$http=void 0,a.$httpBackend=void 0,a.$httpParamSerializer=void 0,a.$httpParamSerializerJQLike=void 0,a.$injector=void 0,a.$interpolate=void 0,a.$interval=void 0,a.$locale=void 0,a.$location=void 0,a.$log=void 0,a.$parse=void 0,a.$provide=void 0,a.$q=void 0,a.$rootElement=void 0,a.$rootScope=void 0,a.$sce=void 0,a.$sceDelegate=void 0,a.$templateCache=void 0,a.$templateRequest=void 0,a.$timeout=void 0,a.$window=void 0,a.$xhrFactory=void 0;var n=null;try{n=e.module("bcherny/ngimport")}catch(t){n=e.module("bcherny/ngimport",[])}n.config(["$provide","$httpProvider","$logProvider",function(e,t,n){a.$provide=e,a.$httpProvider=t,a.$logProvider=n}]),n.run(["$injector",function(e){a.$anchorScroll=e.get("$anchorScroll"),a.$cacheFactory=e.get("$cacheFactory"),a.$compile=e.get("$compile"),a.$controller=e.get("$controller"),a.$document=e.get("$document"),a.$exceptionHandler=e.get("$exceptionHandler"),a.$filter=e.get("$filter"),a.$http=e.get("$http"),a.$httpBackend=e.get("$httpBackend"),a.$httpParamSerializer=e.get("$httpParamSerializer"),a.$httpParamSerializerJQLike=e.get("$httpParamSerializerJQLike"),a.$injector=e,a.$interpolate=e.get("$interpolate"),a.$interval=e.get("$interval"),a.$locale=e.get("$locale"),a.$location=e.get("$location"),a.$log=e.get("$log"),a.$parse=e.get("$parse"),a.$q=e.get("$q"),a.$rootElement=e.get("$rootElement"),a.$rootScope=e.get("$rootScope"),a.$sce=e.get("$sce"),a.$sceDelegate=e.get("$sceDelegate"),a.$templateCache=e.get("$templateCache"),a.$templateRequest=e.get("$templateRequest"),a.$timeout=e.get("$timeout"),a.$window=e.get("$window"),a.$xhrFactory=e.get("$xhrFactory")}])}));t("spinnaker.kayenta.forAnalysisType.component",[]).component("forAnalysisType",{bindings:{types:"@",stage:"<"},controller:class{constructor(){this.showForAnalysisType=()=>(this.stage||Zn.$log.warn("No stage bound to <for-analysis-type> component"),this.types||Zn.$log.warn("No types bound to <for-analysis-type> component"),(this.types||"").split(",").map((e=>{const t=e.trim();return[Wn.Retrospective,Wn.RealTime,Wn.RealTimeAutomatic].includes(t)||Zn.$log.warn(`${t} is not a Kayenta analysis type.`),t})).includes(this.stage.analysisType))}},transclude:!0,template:'<ng-transclude ng-if="$ctrl.showForAnalysisType()"></ng-transclude>'});const Xn=e=>S(e)&&e.includes("${"),Yn=/^(.+)@(.+).([A-Za-z]{2,6})/,er=/^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/,tr=e=>Xn(e)||S(e)&&e.match(er),ar=(e=[],t,a)=>(n,r)=>!e.includes(r.analysisType)||w(r,t)&&""!==k(r,t)?null:`<strong>${a||t}</strong> is a required field for Kayenta Canary stages.`,nr={label:z.stageName||"Canary Analysis",description:z.stageDescription||"Runs a canary task",key:"kayentaCanary",templateUrl:"./kayentaStage.html",controller:"KayentaCanaryStageCtrl",controllerAs:"kayentaCanaryStageCtrl",executionDetailsUrl:"./kayentaStageExecutionDetails.html",executionLabelComponent:({stage:e})=>{const{overallScore:t,overallResult:a}=k(e,"masterStage.context",{}),n=D.createElement(Bn,{inverse:!0,score:t,result:"success"===a?a:null,health:"success"===a?null:"unhealthy"});return D.createElement("span",{className:"stage-label"},D.createElement("span",null,e.name)," (",n,")")},validators:[{type:"requiredField",fieldName:"canaryConfig.canaryConfigId",fieldLabel:"Config Name"},{type:"requiredField",fieldName:"canaryConfig.metricsAccountName",fieldLabel:"Metrics Account"},{type:"requiredField",fieldName:"canaryConfig.storageAccountName",fieldLabel:"Storage Account"},{type:"custom",validate:ar([Wn.RealTimeAutomatic],"deployments.serverGroupPairs[0].control","Baseline & Canary Server Groups")},{type:"custom",validate:ar([Wn.RealTimeAutomatic],"deployments.baseline.cluster","Baseline Cluster")},{type:"custom",validate:ar([Wn.RealTimeAutomatic],"deployments.baseline.account","Baseline Account")},{type:"custom",validate:ar([Wn.RealTime,Wn.Retrospective],"canaryConfig.scopes[0].controlScope","Baseline Scope")},{type:"custom",validate:ar([Wn.RealTime,Wn.Retrospective],"canaryConfig.scopes[0].experimentScope","Canary Scope")},{type:"custom",validate:ar([Wn.RealTime,Wn.RealTimeAutomatic],"canaryConfig.lifetimeDuration","Lifetime")},{type:"custom",validate:ar([Wn.Retrospective],"canaryConfig.scopes[0].startTimeIso","Start Time")},{type:"custom",validate:ar([Wn.Retrospective],"canaryConfig.scopes[0].endTimeIso","End Time")},{type:"custom",validate:(e,t)=>w(t,"canaryConfig.canaryConfigId")&&t.analysisType!==Wn.RealTimeAutomatic?F(k(t,"canaryConfig.canaryConfigId")).then((e=>"atlas"!==k(e,"metrics[0].query.type")||k(t,"canaryConfig.scopes[0].extendedScopeParams.type")?null:"Scope Type is required")):null},{type:"custom",validate:(e,t)=>F(k(t,"canaryConfig.canaryConfigId")).then((e=>{let a=T($(e.metrics,(e=>e.scopeName||"default")));a=x(a)?["default"]:a;const n=$(k(t,"canaryConfig.scopes"),"scopeName"),r=A(a,n);return r.length>1?`Scopes <strong>${r.join()}</strong> are defined but not configured.`:1===r.length?`Scope <strong>${r[0]}</strong> is defined but not configured.`:null}))},{type:"custom",validate:(e,t)=>F(k(t,"canaryConfig.canaryConfigId")).then((e=>{let a=T($(e.metrics,(e=>e.scopeName||"default")));a=x(a)?["default"]:a;const n=$(k(t,"canaryConfig.scopes"),"scopeName"),r=A(n,a);return r.length>1?`Scopes <strong>${r.join()}</strong> are configured but are not defined in the canary configuration.`:1===r.length?`Scope <strong>${r[0]}</strong> is configured but is not defined in the canary configuration.`:null}))},{type:"custom",validate:(e,{canaryConfig:t})=>{if(!z.legacySiteLocalFieldsEnabled)return null;const a=k(t,"siteLocal.notificationEmail");if(!a)return null;const n=(Array.isArray(a)?a:[a]).find((e=>!(e=>Xn(e)||e.match(Yn))(e)));return n?`Invalid <strong>Notification Email</strong> (${n})`:null}},{type:"custom",validate:(e,t)=>{const a=k(t,"canaryConfig.scopes[0].startTimeIso");return t.analysisType!==Wn.Retrospective||x(a)||tr(a)?null:"<strong>Start Time</strong> must be formatted as a UTC instant using ISO-8601 instant format (e.g., 2018-07-12T20:28:29Z)."}},{type:"custom",validate:(e,t)=>{const a=k(t,"canaryConfig.scopes[0].endTimeIso");return t.analysisType!==Wn.Retrospective||x(a)||tr(a)?null:"<strong>End Time</strong> must be formatted as a UTC instant using ISO-8601 instant format (e.g., 2018-07-12T20:28:29Z)."}}]};window.angular.module("ng").run(["$templateCache",function(e){e.put("./kayentaStage.html",'<loading-spinner\n size="\'medium\'"\n ng-if="kayentaCanaryStageCtrl.state.backingDataLoading">\n</loading-spinner>\n\n<div ng-if="!kayentaCanaryStageCtrl.state.backingDataLoading" class="form-horizontal canary-config-view">\n <div class="alert alert-warning" ng-if="kayentaCanaryStageCtrl.state.lifetimeHoursUpdatedToDuration">\n <p>\n <strong>Kayenta now supports analysis lifetimes shorter than 1 hour.</strong>\n </p>\n <p>\n This canary stage has been updated to reflect the new lifetime support.\n Click "Save Changes" to save the updated lifetime on the server.\n </p>\n </div>\n\n <kayenta-stage-config-section title="Analysis Config">\n\n <stage-config-field label="Analysis Type"\n help-key="pipeline.config.canary.analysisType">\n <kayenta-analysis-type\n analysis-types="kayentaCanaryStageCtrl.state.analysisTypes"\n selected-type="kayentaCanaryStageCtrl.stage.analysisType"\n on-change="kayentaCanaryStageCtrl.handleAnalysisTypeChange"\n ></kayenta-analysis-type>\n </stage-config-field>\n\n <stage-config-field label="Config Name">\n <ui-select required\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.canaryConfigId"\n on-select="kayentaCanaryStageCtrl.onCanaryConfigSelect()"\n class="visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"\n style="width:300px">\n <ui-select-match>{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="summary.id as summary in kayentaCanaryStageCtrl.canaryConfigSummaries | filter: $select.search">\n {{summary.name}}\n </ui-select-choices>\n </ui-select>\n </stage-config-field>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, realTimeAutomatic">\n <stage-config-field label="Lifetime"\n field-columns="8"\n help-key="pipeline.config.canary.lifetime"\n ng-class="kayentaCanaryStageCtrl.getLifetimeClassnames()"\n style="padding-left: 0; padding-right: 0;">\n <input type="number"\n min="0"\n ng-class="kayentaCanaryStageCtrl.getLifetimeInputClassnames()"\n ng-model="kayentaCanaryStageCtrl.state.lifetime.hours"\n class="form-control input-sm"\n style="display: inline-block; width: 11%"\n ng-change="kayentaCanaryStageCtrl.onLifetimeChange()" />\n <span class="form-control-static">\n hours\n </span>\n <input type="number"\n min="0"\n max="59"\n ng-class="kayentaCanaryStageCtrl.getLifetimeInputClassnames()"\n ng-model="kayentaCanaryStageCtrl.state.lifetime.minutes"\n class="form-control input-sm"\n style="display: inline-block; width: 11%; margin-left: 12px;"\n ng-change="kayentaCanaryStageCtrl.onLifetimeChange()" />\n <span class="form-control-static">\n minutes\n </span>\n </stage-config-field>\n </for-analysis-type>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="retrospective">\n <stage-config-field label="Start Time"\n help-key="pipeline.config.canary.startTimeIso">\n <input\n required\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].startTimeIso"\n type="text"/>\n </stage-config-field>\n\n <stage-config-field label="End Time"\n help-key="pipeline.config.canary.endTimeIso">\n <input\n required\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].endTimeIso"\n type="text"/>\n </stage-config-field>\n </for-analysis-type>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, realTimeAutomatic">\n <stage-config-field label="Delay"\n help-key="pipeline.config.canary.delayBeforeAnalysis"\n field-columns="5">\n <input type="text"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.beginCanaryAnalysisAfterMins"\n class="form-control input-sm"\n style="display: inline-block; width: 19%"/>\n <span class="form-control-static">\n minutes before starting analysis\n </span>\n </stage-config-field>\n </for-analysis-type>\n\n <stage-config-field label="Interval"\n help-key="pipeline.config.canary.canaryInterval"\n field-columns="3">\n <input type="text"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.canaryAnalysisIntervalMins"\n class="form-control input-sm"\n style="width: 33%; display: inline-block"/>\n <span class="form-control-static"> minutes</span>\n </stage-config-field>\n\n \x3c!--TODO(dpeach): add help text here--\x3e\n <stage-config-field label="Step"\n field-columns="3">\n <input\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].step"\n type="number"\n min="0"\n style="width: 33%; display: inline-block"/>\n <span class="form-control-static"> seconds</span>\n </stage-config-field>\n\n <stage-config-field label="Baseline Offset"\n help-key="pipeline.config.canary.baselineAnalysisOffset"\n field-columns="3">\n <input\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.baselineAnalysisOffsetInMins"\n type="text"\n min="0"\n style="width: 33%; display: inline-block"/>\n <span class="form-control-static"> minutes</span>\n </stage-config-field>\n\n <stage-config-field label="Lookback Type"\n help-key="pipeline.config.canary.lookback"\n field-columns="3">\n <select class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.state.useLookback"\n ng-options="(useLookback ? \'Sliding\' : \'Growing\') for useLookback in [false, true]"\n ng-change="kayentaCanaryStageCtrl.onUseLookbackChange()">\n </select>\n </stage-config-field>\n\n <stage-config-field ng-if="kayentaCanaryStageCtrl.state.useLookback">\n <div class="form-group">\n <div class="col-md-9">\n <p class="form-control-static" ng-if="kayentaCanaryStageCtrl.isExpression(kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins)">\n Using a sliding lookback duration defined by an expression viewable in the pipeline JSON editor.\n </p>\n <span ng-if="!kayentaCanaryStageCtrl.isExpression(kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins)">\n with a look-back duration of\n <input type="number"\n min="1"\n max="{{kayentaCanaryStageCtrl.state.lifetime.hours * 60}}"\n required\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins"\n class="form-control input-sm" style="display: inline-block; margin: 0 5px; width: 15%"/>\n minutes\n </span>\n </div>\n </div>\n <div class="error-message col-md-12"\n ng-if="kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins > 0 && kayentaCanaryStageCtrl.stage.canaryConfig.lookbackMins < 30">\n <b>NOTE:</b> To provide enough data points for the canary analysis it is recommended to set the look-back\n time to at least 30 minutes.\n </div>\n </stage-config-field>\n </kayenta-stage-config-section>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">\n <stage-config-field label="Delay Before Cleanup"\n field-columns="8"\n help-key="pipeline.config.canary.delayBeforeCleanup"\n style="padding-left: 0; padding-right: 0;">\n <input type="number"\n min="0"\n ng-model="kayentaCanaryStageCtrl.state.delayBeforeCleanup.hours"\n class="form-control input-sm"\n style="display: inline-block; width: 11%;"\n ng-change="kayentaCanaryStageCtrl.onDelayBeforeCleanupChange()" />\n <span class="form-control-static">\n hours\n </span>\n <input type="number"\n min="0"\n max="59"\n ng-model="kayentaCanaryStageCtrl.state.delayBeforeCleanup.minutes"\n class="form-control input-sm"\n style="display: inline-block; width: 11%; margin-left: 12px"\n ng-change="kayentaCanaryStageCtrl.onDelayBeforeCleanupChange()" />\n <span class="form-control-static">\n minutes\n </span>\n </stage-config-field>\n </for-analysis-type>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">\n <kayenta-stage-config-section title="Baseline Version">\n <stage-config-field label="Provider" ng-if="kayentaCanaryStageCtrl.providers.length > 1\n && kayentaCanaryStageCtrl.stage.isNew">\n <provider-selector providers="kayentaCanaryStageCtrl.providers"\n component="kayentaCanaryStageCtrl.stage.deployments.baseline"\n on-change="kayentaCanaryStageCtrl.handleProviderChange()"\n field="cloudProvider"\n read-only="!kayentaCanaryStageCtrl.stage.isNew"></provider-selector>\n </stage-config-field>\n\n <stage-config-field label="Account">\n <account-select-field\n component="kayentaCanaryStageCtrl.stage.deployments.baseline"\n field="account"\n accounts="kayentaCanaryStageCtrl.accounts"\n on-change="kayentaCanaryStageCtrl.setClusterList()"\n provider="kayentaCanaryStageCtrl.stage.deployments.baseline.cloudProvider"\n required>\n </account-select-field>\n </stage-config-field>\n\n <stage-config-field label="Cluster">\n <cluster-selector\n ng-if="application.serverGroups.loaded"\n clusters="kayentaCanaryStageCtrl.clusterList"\n required="true"\n model="kayentaCanaryStageCtrl.stage.deployments.baseline.cluster">\n </cluster-selector>\n </stage-config-field>\n </kayenta-stage-config-section>\n </for-analysis-type>\n\n <kayenta-stage-config-section title="Baseline + Canary Pair">\n <section-header ng-if="kayentaCanaryStageCtrl.stage.analysisType === \'realTime\'">\n <span\n uib-tooltip="Click to populate with expressions for resolving control\n and experiment scopes from an upstream clone stage."\n ng-click="kayentaCanaryStageCtrl.populateScopeWithExpressions()"\n class="fa fa-magic clickable"></span>\n </section-header>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, retrospective">\n <stage-config-field label="Baseline"\n help-key="pipeline.config.canary.baselineGroup">\n <input\n ng-if="kayentaCanaryStageCtrl.state.atlasScopeType !== \'query\'"\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlScope"\n required\n type="text"/>\n\n <textarea\n ng-if="kayentaCanaryStageCtrl.state.atlasScopeType === \'query\'"\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlScope"\n required>\n </textarea>\n </stage-config-field>\n\n <stage-config-field label="Baseline Location"\n help-key="pipeline.config.canary.baselineLocation">\n <select\n required\n class="form-control input-sm"\n ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlLocation"\n ng-options="location for location in kayentaCanaryStageCtrl.getLocationChoices().combinedLocations.control">\n </select>\n <input\n class="form-control input-sm"\n ng-if="!kayentaCanaryStageCtrl.getLocationChoices().hasChoices"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].controlLocation"\n required\n type="text"/>\n <div class="pull-right" ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices">\n <button\n ng-click="kayentaCanaryStageCtrl.toggleAllLocations(\'control\')"\n ng-if="!kayentaCanaryStageCtrl.state.showAllLocations.control && kayentaCanaryStageCtrl.getLocationChoices().locations.length > 0"\n class="link">\n Show all locations\n </button>\n <button\n ng-click="kayentaCanaryStageCtrl.toggleAllLocations(\'control\')"\n ng-if="kayentaCanaryStageCtrl.state.showAllLocations.control && kayentaCanaryStageCtrl.getLocationChoices().recommendedLocations.length > 0"\n class="link">\n Only show recommended locations\n </button>\n </div>\n </stage-config-field>\n\n <stage-config-field label="Canary"\n help-key="pipeline.config.canary.canaryGroup">\n <input\n ng-if="kayentaCanaryStageCtrl.state.atlasScopeType !== \'query\'"\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentScope"\n required\n type="text"/>\n\n <textarea\n ng-if="kayentaCanaryStageCtrl.state.atlasScopeType === \'query\'"\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentScope"\n required>\n </textarea>\n </stage-config-field>\n\n <stage-config-field label="Canary Location"\n help-key="pipeline.config.canary.canaryLocation">\n <select\n required\n class="form-control input-sm"\n ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentLocation"\n ng-options="location for location in kayentaCanaryStageCtrl.getLocationChoices().combinedLocations.experiment">\n </select>\n <input\n class="form-control input-sm"\n ng-if="!kayentaCanaryStageCtrl.getLocationChoices().hasChoices"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].experimentLocation"\n required\n type="text"/>\n <div class="pull-right" ng-if="kayentaCanaryStageCtrl.getLocationChoices().hasChoices">\n <button\n ng-click="kayentaCanaryStageCtrl.toggleAllLocations(\'experiment\')"\n ng-if="!kayentaCanaryStageCtrl.state.showAllLocations.experiment && kayentaCanaryStageCtrl.getLocationChoices().locations.length > 0"\n class="link">\n Show all locations\n </button>\n <button\n ng-click="kayentaCanaryStageCtrl.toggleAllLocations(\'experiment\')"\n ng-if="kayentaCanaryStageCtrl.state.showAllLocations.experiment && kayentaCanaryStageCtrl.getLocationChoices().recommendedLocations.length > 0"\n class="link">\n Only show recommended locations\n </button>\n </div>\n </stage-config-field>\n </for-analysis-type>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">\n <div class="row">\n <div style="margin: 10px 10px 0 50px;">\n <div class="well well-sm">\n <table class="table">\n <thead>\n <tr>\n <th>Location</th>\n <th>Baseline</th>\n <th>Canary</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="clusterPair in kayentaCanaryStageCtrl.stage.deployments.serverGroupPairs">\n <td>\n <account-tag account="clusterPair.control.account"></account-tag>\n {{kayentaCanaryStageCtrl.getRegion(clusterPair.control)}}\n </td>\n <td>\n {{kayentaCanaryStageCtrl.getServerGroupName(clusterPair.control)}}\n <br/>\n <a href ng-click="kayentaCanaryStageCtrl.editServerGroup(clusterPair.control, $index, \'control\')">Edit</a>\n </td>\n <td>\n {{kayentaCanaryStageCtrl.getServerGroupName(clusterPair.experiment)}}\n <br/>\n <a href ng-click="kayentaCanaryStageCtrl.editServerGroup(clusterPair.experiment, $index, \'experiment\')">Edit</a>\n </td>\n <td>\n <a href ng-click="kayentaCanaryStageCtrl.deletePair($index);">\n <span class="glyphicon glyphicon-trash" uib-tooltip="Delete Pair"></span>\n </a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr ng-if="!kayentaCanaryStageCtrl.stage.deployments.serverGroupPairs.length">\n <td colspan="4">\n <button class="btn btn-block btn-sm add-new" ng-click="kayentaCanaryStageCtrl.addPair()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add Baseline + Canary Pair\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n </div>\n </for-analysis-type>\n </kayenta-stage-config-section>\n\n <kayenta-stage-config-section title="Metric Scope">\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTimeAutomatic">\n <stage-config-field label="Dataset" ng-if="kayentaCanaryStageCtrl.metricStore === \'atlas\'">\n <input\n type="checkbox"\n ng-model="kayentaCanaryStageCtrl.state.useAtlasGlobalDataset"\n ng-click="kayentaCanaryStageCtrl.handleAtlasDatasetChange($event)" />\n Use Global Atlas Dataset\n </stage-config-field>\n </for-analysis-type>\n\n <for-analysis-type stage="kayentaCanaryStageCtrl.stage" types="realTime, retrospective">\n <stage-config-field label="Scope Type" ng-if="kayentaCanaryStageCtrl.metricStore === \'atlas\'">\n <select\n required\n class="form-control input-sm" ng-model="kayentaCanaryStageCtrl.state.atlasScopeType"\n ng-options="(type === \'cluster\' ? \'Cluster\' : \'Query\') for type in [\'cluster\', \'query\']"\n ng-change="kayentaCanaryStageCtrl.onAtlasScopeTypeChange()">\n </select>\n </stage-config-field>\n </for-analysis-type>\n\n <stage-config-field label="Extended Params"\n help-key="pipeline.config.canary.extendedScopeParams">\n <map-editor\n hidden-keys="[\'resourceType\', \'dataset\', \'type\', \'environment\']"\n on-change="kayentaCanaryStageCtrl.handleExtendedScopeParamsChange()"\n model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].extendedScopeParams">\n </map-editor>\n </stage-config-field>\n </kayenta-stage-config-section>\n\n <kayenta-stage-config-section title="Scoring Thresholds">\n <kayenta-canary-scores on-change="kayentaCanaryStageCtrl.handleScoreThresholdChange"\n successful-help-field-id="\'pipeline.config.canary.passingScore\'"\n successful-label="\'Pass\'"\n successful-score="kayentaCanaryStageCtrl.stage.canaryConfig.scoreThresholds.pass"\n unhealthy-help-field-id="\'pipeline.config.canary.marginalScore\'"\n unhealthy-label="\'Marginal\'"\n unhealthy-score="kayentaCanaryStageCtrl.stage.canaryConfig.scoreThresholds.marginal"></kayenta-canary-scores>\n </kayenta-stage-config-section>\n\n <kayenta-stage-config-section title="Advanced Settings" ng-if="kayentaCanaryStageCtrl.state.showAdvancedSettings">\n\n <stage-config-field label="Notification Emails" help-key="pipeline.config.canary.legacySiteLocalRecipients" ng-if="kayentaCanaryStageCtrl.state.showLegacySiteLocalRecipients">\n <textarea\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.state.legacySiteLocalRecipients"\n ng-change="kayentaCanaryStageCtrl.handleLegacySiteLocalRecipientsChange()"\n placeholder="Email addresses separated by commas"\n >\n </textarea>\n </stage-config-field>\n\n <stage-config-field label="Metrics Account"\n help-key="pipeline.config.metricsAccount"\n ng-if="kayentaCanaryStageCtrl.kayentaAccounts.get(\'METRICS_STORE\').length > 1">\n <select\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.metricsAccountName"\n ng-options="account.name as account.name for account in kayentaCanaryStageCtrl.kayentaAccounts.get(\'METRICS_STORE\')"\n >\n </select>\n </stage-config-field>\n <stage-config-field label="Storage Account"\n help-key="pipeline.config.storageAccount"\n ng-if="kayentaCanaryStageCtrl.kayentaAccounts.get(\'OBJECT_STORE\').length > 1">\n <select\n class="form-control input-sm"\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.storageAccountName"\n ng-options="account.name as account.name for account in kayentaCanaryStageCtrl.kayentaAccounts.get(\'OBJECT_STORE\')"\n >\n </select>\n </stage-config-field>\n\n <stage-config-field label="Scope Name" ng-if="kayentaCanaryStageCtrl.scopeNames.length > 1">\n <ui-select required\n ng-model="kayentaCanaryStageCtrl.stage.canaryConfig.scopes[0].scopeName"\n class="visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"\n style="width:300px">\n <ui-select-match>{{$select.selected}}</ui-select-match>\n <ui-select-choices repeat="scopeName in kayentaCanaryStageCtrl.scopeNames | filter: $select.search">\n {{scopeName}}\n </ui-select-choices>\n </ui-select>\n </stage-config-field>\n\n <div class="alert alert-warning" ng-if="kayentaCanaryStageCtrl.stage.canaryConfig.scopes.length > 1">\n <strong>Warning!</strong> This stage specifies more than one scope. Please edit the stage JSON to configure scopes beyond the first one.\n </div>\n </kayenta-stage-config-section>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("./kayentaStageExecutionDetails.html",'<div class="canary-details" ng-controller="kayentaStageExecutionDetailsCtrl as kayentaStageDetailsCtrl">\n <execution-details-section-nav sections="configSections"></execution-details-section-nav>\n <div class="step-section-details" ng-if="detailsSection === \'canarySummary\'">\n <div class="row">\n <div class="col-md-2 canary-summary">\n <div class="score score-large">\n <kayenta-canary-score score="stage.context.overallScore"\n health="stage.context.overallHealth"\n result="stage.context.overallResult"></kayenta-canary-score>\n </div>\n </div>\n </div>\n\n <div class="row">\n <div class="col-md-12 horizontal">\n <canary-run-summaries class="horizontal flex-1"\n canary-runs="kayentaStageDetailsCtrl.canaryRuns"\n first-scope-name="kayentaStageDetailsCtrl.firstScopeName"></canary-run-summaries>\n </div>\n </div>\n\n <stage-failure-message stage="stage"\n is-failed="stage.exceptions.length > 0"\n messages="stage.exceptions"></stage-failure-message>\n </div>\n\n <div class="step-section-details" ng-if="detailsSection === \'canaryConfig\'">\n <div class="row">\n <div class="col-md-12 canary-config-section">\n <h5>Scope</h5>\n <div class="horizontal-rule"></div>\n <div class="row">\n <div class="col-md-4 sm-label-right compact">Baseline</div>\n <div class="col-md-8" style="word-wrap: break-word">{{ kayentaStageDetailsCtrl.resolvedControl }}</div>\n </div>\n <div class="row">\n <div class="col-md-4 sm-label-right compact">Canary</div>\n <div class="col-md-8" style="word-wrap: break-word">{{ kayentaStageDetailsCtrl.resolvedExperiment }}</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.scopes[0].step">\n <div class="col-md-4 sm-label-right compact">Step</div>\n <div class="col-md-8" style="word-wrap: break-word">{{stage.context.canaryConfig.scopes[0].step}}</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.scopes[0].startTimeIso">\n <div class="col-md-4 sm-label-right compact">Start Time</div>\n <div class="col-md-8" style="word-wrap: break-word">{{ stage.context.canaryConfig.scopes[0].startTimeIso | dateToMillis | timestamp}}</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.scopes[0].endTimeIso">\n <div class="col-md-4 sm-label-right compact">End Time</div>\n <div class="col-md-8" style="word-wrap: break-word">{{stage.context.canaryConfig.scopes[0].endTimeIso | dateToMillis | timestamp}}</div>\n </div>\n </div>\n <div class="col-md-12 canary-config-section">\n <h5>Analysis Config</h5>\n <div class="horizontal-rule"></div>\n <div class="row">\n <div class="col-md-4 sm-label-right compact">Config Name</div>\n <div class="col-md-8" style="word-wrap: break-word">\n <a href ui-sref="home.applications.application.canary.canaryConfig.configDetail({id: stage.context.canaryConfig.canaryConfigId})">\n {{kayentaStageDetailsCtrl.canaryConfigName}}\n </a>\n </div>\n </div>\n <div class="row">\n <div class="col-md-4 sm-label-right compact">Analysis Type</div>\n <div class="col-md-8" style="word-wrap: break-word">{{stage.context.analysisType | robotToHuman}}</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.lifetimeHours">\n <div class="col-md-4 sm-label-right compact">Duration</div>\n <div class="col-md-6">{{stage.context.canaryConfig.lifetimeHours}} hours</div>\n </div>\n <div class="row">\n <div class="col-md-4 sm-label-right compact">Pass</div>\n <div class="col-md-6">{{stage.context.canaryConfig.scoreThresholds.pass}}</div>\n </div>\n <div class="row">\n <div class="col-md-4 sm-label-right compact">Marginal</div>\n <div class="col-md-6">{{stage.context.canaryConfig.scoreThresholds.marginal}}</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.beginCanaryAnalysisAfterMins">\n <div class="col-md-4 sm-label-right compact">Warmup Period</div>\n <div class="col-md-6">{{stage.context.canaryConfig.beginCanaryAnalysisAfterMins}} minutes</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.canaryAnalysisIntervalMins">\n <div class="col-md-4 sm-label-right compact">Interval</div>\n <div class="col-md-6">{{stage.context.canaryConfig.canaryAnalysisIntervalMins}} minutes</div>\n </div>\n <div class="row" ng-if="stage.context.canaryConfig.baselineAnalysisOffsetInMins">\n <div class="col-md-4 sm-label-right compact">Baseline Offset</div>\n <div class="col-md-6">{{stage.context.canaryConfig.baselineAnalysisOffsetInMins}} minutes</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="step-section-details" ng-if="detailsSection === \'taskStatus\'">\n <div class="row">\n <execution-step-details item="stage"></execution-step-details>\n </div>\n </div>\n</div>\n')}]);const rr={hours:0,minutes:0};function sr(e){const t=Object.assign({},rr);if(!S(e))return t;const a=e.match(/PT(\d+)H(?:(\d+)M)?/i);if(x(a))return t;let n=parseInt(a[1],10);(!E(n)||n<0)&&(n=0);let r=parseInt(a[2],10);return(!E(r)||r<0)&&(r=0),{hours:n,minutes:r}}function or(e){if(!e)return"PT0H0M";let{hours:t,minutes:a}=e;return(!E(t)||t<0)&&(t=0),(!E(a)||a<0)&&(a=0),`PT${t}H${a}M`}qn(".canary-config-view .alert {\n margin-bottom: 0;\n}\n");const ir=["gce","aws","titus"];class cr{constructor(e,t,a,n,r,s){this.$scope=e,this.$uibModal=t,this.$log=a,this.serverGroupCommandBuilder=n,this.serverGroupTransformer=r,this.stage=s,this.state={useLookback:!1,backingDataLoading:!1,lifetimeHoursUpdatedToDuration:!1,lifetime:{hours:0,minutes:0},showAdvancedSettings:!1,useAtlasGlobalDataset:!1,atlasScopeType:"cluster",legacySiteLocalRecipients:"",showLegacySiteLocalRecipients:z.legacySiteLocalFieldsEnabled,showAllLocations:{control:!1,experiment:!1},delayBeforeCleanup:{hours:0,minutes:0},analysisTypes:[Wn.RealTimeAutomatic,Wn.RealTime,Wn.Retrospective]},this.canaryConfigSummaries=[],this.scopeNames=[],this.kayentaAccounts=new Map,this.initialize=async()=>{await this.loadBackingData();const e=L(this.kayentaAccounts.get(Hn.ObjectStore)),t=L(this.kayentaAccounts.get(Hn.MetricsStore));if(this.stage.canaryConfig=Object.assign(Object.assign({storageAccountName:e&&e.name||z.storageAccountName,metricsAccountName:t&&t.name||z.metricsAccountName},this.stage.canaryConfig),{scoreThresholds:Object.assign({marginal:null,pass:null},k(this.stage,"canaryConfig.scoreThresholds"))}),this.stage.analysisType=this.stage.analysisType||this.state.analysisTypes[0],this.stage.canaryConfig.scopes&&this.stage.canaryConfig.scopes.length||(this.stage.canaryConfig.scopes=[{scopeName:"default"}]),!this.stage.isNew){const e=k(this.stage,"canaryConfig.lifetimeDuration");this.state.lifetime=sr(e);const t=k(this.stage,"deployments.delayBeforeCleanup");this.state.delayBeforeCleanup=sr(t)}this.stage.canaryConfig.lookbackMins&&(this.state.useLookback=!0),this.populateScopeNameChoices(),this.setMetricStore(),this.setLocations(),this.setShowAdvancedSettings(),this.setClusterList(),this.deleteConfigAccountsIfMissing(),this.updateLifetimeFromHoursToDuration(),this.deleteCanaryConfigIdIfMissing(),z.legacySiteLocalFieldsEnabled&&this.setLegacySiteLocalRecipients(),this.stage.isNew&&this.stage.analysisType===Wn.RealTimeAutomatic&&await this.initializeRealTimeAutomaticAnalysisType()},this.loadBackingData=async()=>{this.state.backingDataLoading=!0;try{await this.$scope.application.ready(),[this.selectedCanaryConfigDetails,this.kayentaAccounts,this.providers,this.accounts,this.canaryConfigSummaries]=await Promise.all([this.loadCanaryConfigDetails(),this.loadKayentaAccounts(),this.loadProviders(),this.loadAccounts(),Promise.resolve(this.$scope.application.getDataSource("canaryConfigs").data)])}catch(e){this.$log.warn("Error loading backing data for Kayenta stage: ",e)}finally{this.state.backingDataLoading=!1,this.$scope.$applyAsync()}},this.onUseLookbackChange=()=>{this.state.useLookback||delete this.stage.canaryConfig.lookbackMins},this.onCanaryConfigSelect=async()=>{this.selectedCanaryConfigDetails=await this.loadCanaryConfigDetails(),this.populateScopeNameChoices(),this.setMetricStore()},this.isExpression=e=>S(e)&&e.includes("${"),this.handleScoreThresholdChange=e=>{this.$scope.$applyAsync((()=>{this.stage.canaryConfig.scoreThresholds.pass=e.successfulScore,this.stage.canaryConfig.scoreThresholds.marginal=e.unhealthyScore}))},this.handleAnalysisTypeChange=async e=>{switch(this.stage.analysisType=e,this.stage.analysisType){case Wn.RealTime:delete this.stage.canaryConfig.scopes[0].startTimeIso,delete this.stage.canaryConfig.scopes[0].endTimeIso,delete this.stage.deployments,"atlas"===this.metricStore&&(this.stage.canaryConfig.scopes.forEach((e=>{j(e,"extendedScopeParams.dataset"),j(e,"extendedScopeParams.environment")})),this.setAtlasScopeParams());break;case Wn.RealTimeAutomatic:delete this.stage.canaryConfig.scopes[0].startTimeIso,delete this.stage.canaryConfig.scopes[0].endTimeIso,delete this.stage.canaryConfig.scopes[0].controlLocation,delete this.stage.canaryConfig.scopes[0].experimentLocation,this.initializeRealTimeAutomaticAnalysisType();break;case Wn.Retrospective:delete this.stage.canaryConfig.beginCanaryAnalysisAfterMins,delete this.stage.canaryConfig.lifetimeDuration,delete this.stage.deployments,"atlas"===this.metricStore&&(this.stage.canaryConfig.scopes.forEach((e=>{j(e,"extendedScopeParams.dataset"),j(e,"extendedScopeParams.environment")})),this.setAtlasScopeParams())}this.$scope.$applyAsync()},this.initializeRealTimeAutomaticAnalysisType=async()=>{this.stage.deployments=Object.assign(Object.assign({},this.stage.deployments),{baseline:Object.assign(Object.assign({},k(this.stage,"deployments.baseline")),{cloudProvider:this.providers[0],application:this.$scope.application.name,cluster:null,account:null}),serverGroupPairs:[]}),this.accounts=await this.loadAccounts(),this.setClusterList(),this.setMetricStore()},this.loadCanaryConfigDetails=async()=>{if(!w(this.stage,"canaryConfig.canaryConfigId"))return null;const e=this.stage.canaryConfig.canaryConfigId;try{return F(e)}catch(t){return this.$log.warn(`Could not load canary config with id ${e}: `,t),null}},this.setMetricStore=()=>{this.metricStore=k(this.selectedCanaryConfigDetails,"metrics[0].query.type"),"atlas"===this.metricStore?(this.setAtlasScopeParams(),this.$scope.$applyAsync()):this.stage.canaryConfig.scopes.forEach((e=>{j(e,"extendedScopeParams.type")}))},this.setAtlasScopeParams=()=>{const e=this.stage.analysisType===Wn.RealTimeAutomatic,t=k(this.stage.canaryConfig.scopes[0],"extendedScopeParams.type");e||(this.state.atlasScopeType="asg"!==t?t:"cluster"),this.stage.canaryConfig.scopes.forEach((t=>{_(t,"extendedScopeParams.type",e?"asg":this.state.atlasScopeType)})),e&&(this.state.useAtlasGlobalDataset="global"===k(this.stage.canaryConfig.scopes[0],"extendedScopeParams.dataset"),this.stage.canaryConfig.scopes.forEach((e=>{_(e,"extendedScopeParams.dataset",this.state.useAtlasGlobalDataset?"global":"regional")})))},this.setLocations=()=>{const{recommendedLocations:e,locations:t,hasChoices:a}=this.getLocationChoices();a&&(this.state.showAllLocations.control=this.state.showAllLocations.experiment=0===e.length&&t.length>0,this.stage.canaryConfig.scopes.forEach((a=>{e.includes(a.controlLocation)||t.includes(a.controlLocation)?e.includes(a.controlLocation)||(this.state.showAllLocations.control=!0):delete a.controlLocation,e.includes(a.experimentLocation)||t.includes(a.experimentLocation)?e.includes(a.experimentLocation)||(this.state.showAllLocations.experiment=!0):delete a.experimentLocation})))},this.setShowAdvancedSettings=()=>{this.state.showAdvancedSettings=this.kayentaAccounts.get(Hn.MetricsStore).length>1||this.kayentaAccounts.get(Hn.ObjectStore).length>1||this.scopeNames.length>1||z.legacySiteLocalFieldsEnabled},this.getLocationChoices=()=>{const e=this.kayentaAccounts.get(Hn.MetricsStore),t=e&&e.find((({name:e})=>e===this.stage.canaryConfig.metricsAccountName));if(!t)return{combinedLocations:{control:[],experiment:[]},recommendedLocations:[],locations:[],hasChoices:!1};const a=t.locations.length>0||t.recommendedLocations.length>0,n=t.recommendedLocations.concat(t.locations);return{combinedLocations:{control:T(this.state.showAllLocations.control?n:t.recommendedLocations.length>0?t.recommendedLocations:t.locations),experiment:T(this.state.showAllLocations.experiment?n:t.recommendedLocations.length>0?t.recommendedLocations:t.locations)},recommendedLocations:t.recommendedLocations,locations:t.locations,hasChoices:a}},this.toggleAllLocations=e=>{this.state.showAllLocations[e]=!this.state.showAllLocations[e];const t=this.getLocationChoices();this.stage.canaryConfig.scopes.forEach((e=>{t.combinedLocations.control.includes(e.controlLocation)||delete e.controlLocation,t.combinedLocations.experiment.includes(e.experimentLocation)||delete e.experimentLocation}))},this.populateScopeNameChoices=()=>{if(!this.selectedCanaryConfigDetails)return;const e=T($(this.selectedCanaryConfigDetails.metrics,(e=>e.scopeName||"default")));this.scopeNames=x(e)?["default"]:e,this.setShowAdvancedSettings(),x(this.stage.canaryConfig.scopes)||e.includes(this.stage.canaryConfig.scopes[0].scopeName)?x(this.stage.canaryConfig.scopes)&&(this.stage.canaryConfig.scopes=[{scopeName:e[0]}]):delete this.stage.canaryConfig.scopes[0].scopeName},this.loadKayentaAccounts=async()=>{const e=new Map;return(await W()).forEach((t=>{t.supportedTypes.forEach((a=>{e.has(a)?e.set(a,e.get(a).concat([t])):e.set(a,[t])}))})),e},this.deleteConfigAccountsIfMissing=()=>{(this.kayentaAccounts.get(Hn.ObjectStore)||[]).every((e=>e.name!==this.stage.canaryConfig.storageAccountName))&&delete this.stage.canaryConfig.storageAccountName,(this.kayentaAccounts.get(Hn.MetricsStore)||[]).every((e=>e.name!==this.stage.canaryConfig.metricsAccountName))&&delete this.stage.canaryConfig.metricsAccountName},this.deleteCanaryConfigIdIfMissing=()=>{this.canaryConfigSummaries.every((e=>e.id!==this.stage.canaryConfig.canaryConfigId))&&delete this.stage.canaryConfig.canaryConfigId},this.populateScopeWithExpressions=()=>{this.stage.canaryConfig.scopes[0].controlScope="${ #stage('Clone Server Group')['context']['source']['serverGroupName'] }",this.stage.canaryConfig.scopes[0].controlLocation="${ deployedServerGroups[0].region }",this.stage.canaryConfig.scopes[0].experimentScope="${ deployedServerGroups[0].serverGroup }",this.stage.canaryConfig.scopes[0].experimentLocation="${ deployedServerGroups[0].region }"},this.onLifetimeChange=()=>{this.stage.canaryConfig.lifetimeDuration=or(this.state.lifetime)},this.updateLifetimeFromHoursToDuration=()=>{if(w(this.stage,["canaryConfig","lifetimeHours"])){const e=parseInt(this.stage.canaryConfig.lifetimeHours,10);if(N(e)){const t=parseFloat(this.stage.canaryConfig.lifetimeHours)-e,a=Math.floor(60*t);this.stage.canaryConfig.lifetimeDuration=`PT${e}H`,N(a)&&(this.stage.canaryConfig.lifetimeDuration+=`${a}M`),this.state.lifetimeHoursUpdatedToDuration=!0}delete this.stage.canaryConfig.lifetimeHours}},this.getLifetimeClassnames=()=>this.state.lifetimeHoursUpdatedToDuration?"alert alert-warning":"",this.getLifetimeInputClassnames=()=>{const{hours:e,minutes:t}=this.state.lifetime;return 0===e&&0===t?"ng-invalid ng-invalid-required":""},this.loadProviders=async()=>(this.providers=(await p.listProviders(this.$scope.application)).filter((e=>ir.includes(e))),this.providers.length||(this.state.analysisTypes=[Wn.RealTime,Wn.Retrospective]),this.providers),this.handleProviderChange=async()=>{_(this.stage,"deployments.baseline.account",null),_(this.stage,"deployments.baseline.cluster",null),this.accounts=await this.loadAccounts(),this.setClusterList()},this.loadAccounts=()=>w(this.stage,"deployments.baseline.cloudProvider")?Promise.resolve(p.listAccounts(this.stage.deployments.baseline.cloudProvider)):null,this.setClusterList=()=>{this.clusterList=g.getClusters([this.$scope.application],(e=>!w(this.stage,"deployments.baseline.account")||e.account===this.stage.deployments.baseline.account)),this.setAtlasEnvironment()},this.setAtlasEnvironment=()=>{"atlas"===this.metricStore&&this.stage.analysisType===Wn.RealTimeAutomatic&&this.stage.canaryConfig.scopes.forEach((e=>{if(this.stage.deployments.baseline.account){const t=this.accounts.find((({name:e})=>this.stage.deployments.baseline.account===e));t&&_(e,"extendedScopeParams.environment",t.environment)}else j(e,"extendedScopeParams.environment")}))},this.setLegacySiteLocalRecipients=()=>{const e=k(this.stage.canaryConfig,"siteLocal.notificationEmail");Array.isArray(e)?this.state.legacySiteLocalRecipients=e.join(","):this.state.legacySiteLocalRecipients=S(e)?e:""},this.handleLegacySiteLocalRecipientsChange=()=>{this.state.legacySiteLocalRecipients.includes("${")?_(this.stage.canaryConfig,"siteLocal.notificationEmail",this.state.legacySiteLocalRecipients):this.state.legacySiteLocalRecipients.length?_(this.stage.canaryConfig,"siteLocal.notificationEmail",this.state.legacySiteLocalRecipients.split(",").map((e=>e.trim()))):delete this.stage.canaryConfig.siteLocal},this.getRegion=e=>{if(e.region)return e.region;const t=e.availabilityZones;return t&&Object.keys(t).length?Object.keys(t)[0]:"n/a"},this.getServerGroupName=e=>u.getClusterName(e.application,e.stack,e.freeFormDetails),this.addPair=async()=>{this.stage.deployments.serverGroupPairs=this.stage.deployments.serverGroupPairs||[];const e=await(w(this.stage,"deployments.baseline.cloudProvider")?Promise.resolve(this.stage.deployments.baseline.cloudProvider):Promise.resolve(d.selectProvider(this.$scope.application,"serverGroup")));this.stage.deployments.baseline.cloudProvider=e;const t=y.getValue(e,"serverGroup"),a=await this.serverGroupCommandBuilder.buildNewServerGroupCommandForPipeline(e,null,null);a.viewState=Object.assign(Object.assign({},a.viewState),{requiresTemplateSelection:!0,disableStrategySelection:!0,hideClusterNamePreview:!0,readOnlyFields:{credentials:!0,region:!0,subnet:!0,useSourceCapacity:!0},overrides:{capacity:{min:1,max:1,desired:1},useSourceCapacity:!1},imageSourceText:"\n <p>This dialogue will configure two server groups.</p>\n <p>\n The <b>Baseline</b> server group's image will be resolved\n from the <b>Newest</b> server group\n in the <b>Baseline Version</b> cluster defined in this stage.\n </p>\n <p>\n The <b>Canary</b> server group's image will be resolved from\n an upstream <b>Bake</b> or <b>Find Image</b> stage.\n </p>"}),delete a.strategy;try{const e="Add Baseline + Canary Pair",n=this.$scope.application;let r;r=t.CloneServerGroupModal?await t.CloneServerGroupModal.show({title:e,application:n,command:a}):await this.$uibModal.open({templateUrl:t.cloneServerGroupTemplateUrl,controller:`${t.cloneServerGroupController} as ctrl`,size:"lg",resolve:{title:()=>e,application:()=>n,serverGroupCommand:()=>a}}).result;const s=this.serverGroupTransformer.convertServerGroupCommandToDeployConfiguration(r),o=P(s),i=(e,t)=>{delete e.backingData,e.freeFormDetails&&e.freeFormDetails.split("-").pop()===t||(e.freeFormDetails=`${e.freeFormDetails?`${e.freeFormDetails}-`:""}${t}`)};i(s,"baseline"),i(o,"canary"),this.stage.deployments.serverGroupPairs=[{control:s,experiment:o}],this.$scope.$applyAsync()}catch(e){this.$log.warn("Error creating server group pair for Kayenta stage: ",e)}},this.editServerGroup=async(e,t,a)=>{e.provider=e.provider||e.cloudProvider;const n=y.getValue(e.cloudProvider,"serverGroup");try{const r=`Configure ${a[0].toUpperCase()+a.substring(1)} Server Group`,s=this.$scope.application,o=await this.serverGroupCommandBuilder.buildServerGroupCommandFromPipeline(s,e,null,null);let i;o.viewState=Object.assign(Object.assign({},o.viewState),{disableStrategySelection:!0,hideClusterNamePreview:!0,readOnlyFields:{credentials:!0,region:!0,subnet:!0,useSourceCapacity:!0},imageSourceText:this.resolveImageSourceText(a)}),delete o.strategy,i=n.CloneServerGroupModal?await n.CloneServerGroupModal.show({title:r,application:s,command:o}):await this.$uibModal.open({templateUrl:n.cloneServerGroupTemplateUrl,controller:`${n.cloneServerGroupController} as ctrl`,size:"lg",resolve:{title:()=>r,application:()=>s,serverGroupCommand:()=>o}}).result,this.stage.deployments.serverGroupPairs[t][a]=this.serverGroupTransformer.convertServerGroupCommandToDeployConfiguration(i)}catch(e){this.$log.warn("Error editing server group pair for Kayenta stage: ",e)}},this.deletePair=e=>{(this.stage.deployments.serverGroupPairs||[]).splice(e,1)},this.handleAtlasDatasetChange=e=>{const{checked:t}=e.target;this.$scope.$applyAsync((()=>{this.stage.canaryConfig.scopes.forEach((e=>{_(e,"extendedScopeParams.dataset",t?"global":"regional"),_(e,"extendedScopeParams.type",this.stage.analysisType===Wn.RealTimeAutomatic?"asg":this.state.atlasScopeType)}))}))},this.onAtlasScopeTypeChange=()=>{this.$scope.$applyAsync((()=>{this.stage.canaryConfig.scopes.forEach((e=>{_(e,"extendedScopeParams.type",this.state.atlasScopeType)}))}))},this.handleExtendedScopeParamsChange=()=>{"atlas"===this.metricStore&&(this.stage.canaryConfig.scopes.forEach((e=>{_(e,"extendedScopeParams.type",this.stage.analysisType===Wn.RealTimeAutomatic?"asg":this.state.atlasScopeType)})),this.stage.analysisType===Wn.RealTimeAutomatic&&(this.stage.canaryConfig.scopes.forEach((e=>{_(e,"extendedScopeParams.dataset",this.state.useAtlasGlobalDataset?"global":"regional")})),this.setAtlasEnvironment()),this.$scope.$applyAsync())},this.onDelayBeforeCleanupChange=()=>{this.stage.deployments.delayBeforeCleanup=or(this.state.delayBeforeCleanup)},this.initialize()}resolveImageSourceText(e){return"experiment"===e?"This server group's image will be resolved from an upstream\n <b>Bake</b> or <b>Find Image</b> stage.":"This server group's image will be resolved from the <b>Newest</b>\n server group in the <b>Baseline Version</b> cluster defined in this stage."}}cr.$inject=["$scope","$uibModal","$log","serverGroupCommandBuilder","serverGroupTransformer","stage"];const lr="runCanary",pr="wait",gr=["kayentaCanary","createServerGroup"];class ur{transform(e,t){const a=t.stages.filter((({type:e})=>"kayentaCanary"===e));if(!a.length)return;let n=[];t.stages.forEach((e=>{if("kayentaCanary"===e.type){f.defineProperties(e);const a=e.context.intervalStageId,r=a?t.stages.filter((({parentStageId:e,type:t})=>e&&e===a&&[pr,lr].includes(t))):[];n=n.concat(r);const s=r.filter((e=>e.type===lr));r.forEach((e=>f.defineProperties(e))),this.calculateRunCanaryResults(s),this.calculateKayentaCanaryResults(e,r),e.exceptions=[],this.addExceptions([e,...r],e.exceptions),e.tasks=[...r,...e.tasks]}else if("createServerGroup"===e.type&&this.isDescendantOf(e,a,t)){f.defineProperties(e);const n=this.isDescendantOf(e,a,t),r=e.context["deploy.server.groups"]&&Object.keys(e.context["deploy.server.groups"]);e.name=`Deploy ${e.context.freeFormDetails}${r?" in "+r.join(", "):""}`,e.parentStageId=n}}));const r=a.map((({id:e})=>e));t.stages.filter((({parentStageId:e,type:t})=>r.includes(e)&&"deployCanaryServerGroups"===t)).forEach((e=>{const t=a.find((({id:t})=>e.parentStageId===t));if(t&&(e.outputs.deployedServerGroups||[]).length){const[{controlScope:a,experimentScope:n}]=e.outputs.deployedServerGroups;t.outputs=Object.assign(Object.assign({},t.outputs),{controlScope:a,experimentScope:n})}})),t.stages=t.stages.filter((e=>!n.includes(e)&&(!this.isDescendantOf(e,a,t)||gr.includes(e.type)||"SUCCEEDED"!==e.status)))}isDescendantOf(e,t,a){const n=t.map((({id:e})=>e));let r=e;for(;r&&r.parentStageId;){const e=a.stages.find((({id:e})=>r.parentStageId===e));if(e&&n.includes(e.id))return e.id;r=e}return null}calculateRunCanaryResults(e){e.forEach((e=>{"number"==typeof e.getValueFor("canaryScore")&&("SUCCEEDED"===e.status?e.context.canaryScore>=e.context.scoreThresholds.pass&&(e.result="success"):e.health="unhealthy",e.context.canaryScore=O(e.context.canaryScore,2))}))}calculateKayentaCanaryResults(e,t){if(!e.isRunning&&(e.getValueFor("canaryScores")?e.context.overallScore=R(e.getValueFor("canaryScores")):e.context.overallScore=this.getLastCanaryRunScore(t),e.context.overallScore=O(e.context.overallScore,2),e.context.canaryScoreMessage||(e.context.canaryScoreMessage=this.getLastCanaryScoreMessage(t)),!e.isCanceled)){const t=k(e,"context.overallScore",null),a=k(e,"context.canaryConfig.scoreThresholds.marginal",null);"SUCCEEDED"===e.status||t&&t>a?e.context.overallResult="success":e.context.overallHealth="unhealthy"}}getLastCanaryRunScore(e=[]){const t=e.filter((e=>"number"==typeof e.getValueFor("canaryScore"))).map((e=>e.getValueFor("canaryScore")));return R(t)}getLastCanaryScoreMessage(e=[]){const t=e.filter((e=>e.getValueFor("canaryScoreMessage"))).map((e=>e.getValueFor("canaryScoreMessage")));return R(t)}addExceptions(e,t){e.forEach((e=>{this.getException(e)&&t.push(this.getException(e));const a=k(e,"context.overallScore",null),n=k(e,"context.canaryConfig.scoreThresholds.marginal",null),r=k(e,"context.canaryScoreMessage",null);a&&r&&a<=n&&t.push(r)}))}getException(e){return e&&e.isFailed?e.context&&e.context.exception&&e.context.exception.details&&e.context.exception.details.responseBody?e.context.exception.details.responseBody:e.failureMessage:null}}const dr={transclude:{sectionHeader:"?sectionHeader"},bindings:{title:"@"},template:'\n <section>\n <ul class="list-inline">\n <li><h5>{{ $ctrl.title }}</h5></li>\n <li><span ng-transclude="sectionHeader"></span></li>\n </ul>\n <div class="horizontal-rule"></div>\n <ng-transclude></ng-transclude>\n </section>\n '};t("spinnaker.kayenta.stageConfigSection",[]).component("kayentaStageConfigSection",dr);qn(".kayenta {\n width: 100%;\n}\n.kayenta button[disabled] {\n cursor: not-allowed;\n opacity: 0.4;\n}\n.kayenta.kayenta-root {\n overflow: hidden;\n}\n.kayenta .spinner {\n position: inherit;\n}\n.kayenta .list-detail > .col-md-2,\n.kayenta .list-detail .col-md-10 {\n padding-left: 0;\n padding-right: 0;\n}\n.kayenta .config-list ul {\n max-height: calc(70vh - 44px);\n overflow: auto;\n}\n@media screen and (max-height: 1000px) {\n .kayenta .config-list ul {\n max-height: 55vh;\n }\n}\n@media screen and (max-height: 700px) {\n .kayenta .config-list ul {\n max-height: 45vh;\n }\n}\n.kayenta .config-detail {\n padding: 0 1rem 1rem;\n margin-bottom: 40px;\n overflow-y: auto;\n}\n.kayenta .config-detail .config-detail-header {\n padding: 5px 15px 7px 0;\n}\n.kayenta .config-detail .config-detail-header .heading-1 {\n margin: 3px 0 0 0;\n}\n.kayenta .config-detail .config-detail-edit-warning {\n padding: 12px;\n margin-bottom: 12px;\n}\n.kayenta .config-detail .config-detail-edit-warning i.fa {\n color: var(--color-notice);\n font-size: 32px;\n}\n.kayenta .config-detail .contents .native-table-header {\n padding-top: 10px;\n}\n.kayenta .group-tabs .fas.fa-pencil-alt {\n padding-left: 1rem;\n font-size: smaller;\n}\n.kayenta .group-tabs .fas.fa-pencil-alt.disabled {\n color: var(--color-accessory);\n}\n.kayenta .group-tabs .tabs-basic input {\n text-transform: none;\n font-weight: normal;\n}\n.kayenta .table-header.sticky-header {\n background-color: var(--color-alabaster);\n}\n.kayenta .table-header h6 {\n font-weight: 600;\n}\n.kayenta .table-row > div,\n.kayenta .table-row > td {\n padding: 0.8rem 0;\n}\n.kayenta .table-row i.fa,\n.kayenta .table-row i.far {\n padding: 0 0.5rem;\n cursor: pointer;\n}\n.kayenta .table-row i.fa.fa-edit,\n.kayenta .table-row i.far.fa-edit,\n.kayenta .table-row i.fa.fa-folder,\n.kayenta .table-row i.far.fa-folder {\n font-weight: 100;\n}\n.kayenta .table-row i.fa.fa-folder,\n.kayenta .table-row i.far.fa-folder {\n margin-top: 0.2rem;\n}\n.kayenta .table-row i.fa.fa-trash,\n.kayenta .table-row i.far.fa-trash {\n font-size: small;\n margin-top: 0.1rem;\n}\n.kayenta .table-row g {\n margin-top: -0.25rem;\n margin-right: 0.1rem;\n}\n.kayenta .table-header,\n.kayenta .table-row {\n border-bottom: 1px solid var(--color-divider);\n}\n.kayenta .table-header h6,\n.kayenta .table-row h6 {\n margin-bottom: 5px;\n}\n.kayenta .table-header.background-white,\n.kayenta .table-row.background-white {\n background-color: var(--color-white);\n}\n.kayenta .table-header.selected,\n.kayenta .table-row.selected {\n background-color: var(--color-accent-g2);\n}\n.kayenta .native-table-header {\n position: sticky;\n top: 0;\n background-color: var(--color-alabaster);\n box-shadow: 0 1px 0 var(--color-divider);\n}\n.kayenta .metric-list {\n top: -10px;\n}\n.kayenta .header-transparent .native-table-header {\n background-color: transparent;\n}\n.kayenta .header-white .native-table-header {\n background-color: white;\n}\n.kayenta .flex-1 {\n min-height: 0;\n}\n");function yr({children:e,className:t}){return D.createElement("div",{className:Gn("styleguide","kayenta",t)},e)}const fr=({rows:e=[],columns:t,className:a})=>D.createElement("thead",{className:a},D.createElement("tr",null,t.map((({label:t,labelClassName:a,hide:n},r)=>D.createElement("th",{key:t||r,className:"native-table-header"},(!n||!e.every(n))&&D.createElement("h6",{className:Gn("heading-6","uppercase","color-text-primary",a)},t))))));function hr({rows:e,columns:t,rowKey:a,tableBodyClassName:n,rowClassName:r,onRowClick:s,customRow:o,className:i,headerClassName:c}){const l=({row:e})=>D.createElement("tr",{onClick:s?()=>s(e):null,className:Gn({"table-row":!r},r&&r(e))},t.map((({label:t,hide:a,getContent:n},r)=>D.createElement("td",{key:t||r},(!a||!a(e))&&n(e)))));return D.createElement("table",{className:i},D.createElement(fr,{rows:e,columns:t,className:Gn("table-header",c)}),D.createElement("tbody",{className:n},e.map((e=>o&&o(e)?D.createElement("td",{key:a(e)},o(e)):D.createElement(l,{key:a(e),row:e})))))}function mr({canaryRun:e,firstScopeName:t}){const a="Copy timestamp to clipboard as UTC instant in ISO-8601 format";return D.createElement("section",{className:"small"},D.createElement("ul",{className:"list-unstyled"},D.createElement("li",null,D.createElement("b",null,"Start:")," ",m(Date.parse(e.context.scopes[t].experimentScope.start)),D.createElement(v,{displayText:!1,text:e.context.scopes[t].experimentScope.start,toolTip:a})),D.createElement("li",null,D.createElement("b",null,"End:")," ",m(Date.parse(e.context.scopes[t].experimentScope.end)),D.createElement(v,{displayText:!1,text:e.context.scopes[t].experimentScope.end,toolTip:a}))))}function vr({canaryRun:e}){if(!w(e,"context.canaryConfigId")||!w(e,"context.canaryPipelineExecutionId")||"RUNNING"===e.status)return null;return D.createElement("i",{className:"fa fa-chart-bar clickable",onClick:()=>r.$state.go("home.applications.application.canary.report.reportDetail",{configId:e.context.canaryConfigId,runId:e.context.canaryPipelineExecutionId})})}function Cr({messages:e}){return D.createElement("div",null,e.map(((e,t)=>D.createElement("p",{key:`${t}-${e}`},e))))}qn(".canary-run-summaries .native-table-header {\n background-color: transparent;\n}\n");t("spinnaker.kayenta.canaryRunSummaries.component",[]).component("canaryRunSummaries",Fn(i((function({canaryRuns:e,firstScopeName:t}){const a=[{label:"Canary Result",getContent:e=>D.createElement(D.Fragment,null,D.createElement(Bn,{score:e.context.canaryScore,health:e.health,result:e.result,inverse:!1,className:"label"}),k(e,["context","warnings"],[]).length>0&&D.createElement(h,{template:D.createElement(Cr,{messages:e.context.warnings})},D.createElement("i",{className:"fa fa-exclamation-triangle",style:{paddingLeft:"8px"}})))},{label:"Duration",getContent:e=>D.createElement("span",null,e.context.durationString||" - ")},{label:"Last Updated",getContent:e=>D.createElement("span",null,m(e.context.lastUpdated))},{getContent:e=>{const a=D.createElement(mr,{canaryRun:e,firstScopeName:t});return D.createElement("section",{className:"horizontal text-center"},D.createElement("div",{className:"flex-1"},D.createElement(vr,{canaryRun:e})),D.createElement("div",{className:"flex-1"},D.createElement(h,{template:a},D.createElement("i",{className:"far fa-clock"}))))}}];return D.createElement(yr,{className:"horizontal flex-1"},D.createElement(hr,{rows:e,className:"header-transparent flex-1",columns:a,rowKey:e=>e.id}))}),"canaryRunSummaries"),["canaryRuns","firstScopeName"]));qn(".canary-config-section .col-md-6,\n.canary-config-section .col-md-8 {\n margin-top: 5px;\n}\n");class br{constructor(e,t,a){this.$scope=e,this.$stateParams=t,this.executionDetailsSectionService=a,this.$scope.configSections=["canarySummary","canaryConfig","taskStatus"],this.$scope.$on("$stateChangeSuccess",(()=>this.initialize()))}$onInit(){this.initialize()}initialize(){this.executionDetailsSectionService.synchronizeSection(this.$scope.configSections,(()=>this.initialized()))}initialized(){this.$scope.detailsSection=this.$stateParams.details,this.$scope.application.ready().then((()=>{if("kayentaCanary"!==this.$scope.stage.type)return;const e=this.$scope.application.getDataSource("canaryConfigs").data.find((e=>e.id===this.$scope.stage.context.canaryConfig.canaryConfigId));e&&(this.canaryConfigName=e.name)})),this.setCanaryRuns(),this.resolveFirstScopeName(),this.resolveControlAndExperimentNames(),this.$scope.$watchCollection("stage.tasks",(()=>this.setCanaryRuns()))}setCanaryRuns(){this.canaryRuns=this.$scope.stage.tasks.filter((e=>e.type===lr))}resolveFirstScopeName(){this.firstScopeName=this.$scope.stage.context.canaryConfig.scopes[0].scopeName}resolveControlAndExperimentNames(){this.$scope.stage.context.analysisType===Wn.RealTimeAutomatic?(this.resolvedControl=this.$scope.stage.outputs.controlScope,this.resolvedExperiment=this.$scope.stage.outputs.experimentScope):(this.resolvedControl=this.canaryRuns.length?this.canaryRuns[0].context.scopes[this.firstScopeName].controlScope.scope:this.$scope.stage.context.canaryConfig.scopes[0].controlScope,this.resolvedExperiment=this.canaryRuns.length?this.canaryRuns[0].context.scopes[this.firstScopeName].experimentScope.scope:this.$scope.stage.context.canaryConfig.scopes[0].experimentScope)}}br.$inject=["$scope","$stateParams","executionDetailsSectionService"];t("spinnaker.kayenta.kayentaStageExecutionDetails.controller",["spinnaker.kayenta.canaryRunSummaries.component"]).controller("kayentaStageExecutionDetailsCtrl",br).filter("dateToMillis",(()=>Date.parse));const Sr="spinnaker.kayenta";z.featureDisabled?t("spinnaker.kayenta",[]):t("spinnaker.kayenta",["ui.router","spinnaker.kayenta.canaryScores.component","spinnaker.kayenta.score.component","spinnaker.kayenta.forAnalysisType.component","spinnaker.kayenta.analysisType.component","spinnaker.kayenta.stageConfigSection","spinnaker.kayenta.kayentaStageExecutionDetails.controller"]).controller("KayentaCanaryStageCtrl",cr).run(["$uiRouter","applicationState",function(e,t){!function(){const e=(e,t)=>Promise.resolve(t);s.registerDataSource({optIn:!z.optInAll,optional:!0,loader:e=>z.showAllConfigs?G():G(e.name),onLoad:e,afterLoad:e=>te.afterConfigsLoaded(e),description:"Canary analysis configuration and reporting",key:"canaryConfigs",label:"Canary",defaultData:[]}),s.registerDataSource({key:"canaryJudges",label:"Canary Configs",sref:".canary.canaryConfig",activeState:"**.canaryConfig.**",category:"delivery",requiresDataSource:"canaryConfigs",loader:H,onLoad:e,afterLoad:e=>te.afterJudgesLoaded(e),lazy:!0,autoActivate:!0,defaultData:[],iconName:"spMenuCanaryConfig"}),s.registerDataSource({key:"canaryExecutions",label:"Canary Reports",sref:".canary.report",activeState:"**.report.**",category:"delivery",requiresDataSource:"canaryConfigs",loader:e=>te.loadCanaryExecutions(e),onLoad:e,afterLoad:e=>te.afterCanaryExecutionsLoaded(e),lazy:!0,defaultData:[],iconName:"spMenuCanaryReport"})}(),function(e,t){const a=[{name:"canary",url:"/canary",lazyLoad:()=>import(/* webpackChunkName: "Lazy-Kayenta-Tabs" */"./lazy-063c0421.js").then((function(e){return e.l})).then((a=>a.lazyInitializeKayenta(e,t)))},{name:"canary.canaryConfig",url:"/config"},{name:"canary.canaryConfig.configDetail",url:"/:id?copy&new"},{name:"canary.canaryConfig.configDefault",url:""},{name:"canary.report",url:"/report?count"},{name:"canary.report.reportDetail",url:"/:configId/:runId"},{name:"canary.report.reportDefault",url:""}];["home.project","home.applications"].forEach((e=>{a.map((t=>Object.assign(Object.assign({},t),{name:`${e}.application.${t.name}`}))).forEach((e=>t.stateRegistry.register(e)))}))}(t,e),!1!==z.stagesEnabled&&(C.pipeline.registerStage(nr),C.pipeline.registerTransformer(new ur))}]);export{z as C,Hn as K,Vn as M,hr as N,yr as S,oe as a,ne as b,Gn as c,se as d,J as e,K as f,re as g,F as h,B as i,U as j,Q as k,X as l,V as m,W as n,te as o,Y as p,Bn as q,Kn as r,qn as s,Z as t,q as u,Un as v,Zn as w,Sr as x};
|
|
2
|
-
//# sourceMappingURL=index-6303bdf8.js.map
|