Xt 321 automate k8s smoke test data cy attributes (#5734)

* added data-cy attributes for robust ui test automation
docs/add-tool-versions
testA113 2021-09-24 13:00:55 +12:00 committed by GitHub
parent 6ac9c4367e
commit 5ad3cacefd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 349 additions and 133 deletions

View File

@ -101,7 +101,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -136,7 +136,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -102,7 +102,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -37,7 +37,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -295,7 +295,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -68,7 +68,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -204,7 +204,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -97,7 +97,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -189,7 +189,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -88,7 +88,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -153,7 +153,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -136,7 +136,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -219,7 +219,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -109,7 +109,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -201,7 +201,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -10,6 +10,7 @@
ng-model="$ctrl.model.Registry" ng-model="$ctrl.model.Registry"
id="image_registry" id="image_registry"
class="form-control" class="form-control"
data-cy="component-registrySelect"
></select> ></select>
</div> </div>
<label for="image_name" ng-class="$ctrl.labelClass" class="margin-sm-top control-label text-left">Image</label> <label for="image_name" ng-class="$ctrl.labelClass" class="margin-sm-top control-label text-left">Image</label>

View File

@ -65,7 +65,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -65,7 +65,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -79,7 +79,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -70,7 +70,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -142,7 +142,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -94,7 +94,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -76,7 +76,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -124,7 +124,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -98,7 +98,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -68,7 +68,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -83,7 +83,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -169,7 +169,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -269,7 +269,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -243,7 +243,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -171,7 +171,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -110,7 +110,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -141,7 +141,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -152,7 +152,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -130,7 +130,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -163,7 +163,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -179,7 +179,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -36,6 +36,7 @@
ng-options="resourcePool.Namespace.Name for resourcePool in ctrl.resourcePools" ng-options="resourcePool.Namespace.Name for resourcePool in ctrl.resourcePools"
ng-change="ctrl.onResourcePoolSelectionChange()" ng-change="ctrl.onResourcePoolSelectionChange()"
ng-disabled="ctrl.state.isEdit" ng-disabled="ctrl.state.isEdit"
data-cy="k8sAppCreate-nsSelect"
></select> ></select>
</div> </div>
</div> </div>
@ -178,6 +179,7 @@
uib-typeahead="stack for stack in ctrl.stacks | filter:$viewValue | limitTo:7" uib-typeahead="stack for stack in ctrl.stacks | filter:$viewValue | limitTo:7"
typeahead-show-hint="true" typeahead-show-hint="true"
typeahead-min-length="0" typeahead-min-length="0"
data-cy="k8sAppCreate-stackName"
/> />
</div> </div>
</div> </div>
@ -190,7 +192,13 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left">Environment variables</label> <label class="control-label text-left">Environment variables</label>
<span ng-if="ctrl.formValues.Containers.length <= 1" class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addEnvironmentVariable()"> <span
ng-if="ctrl.formValues.Containers.length <= 1"
class="label label-default interactive"
style="margin-left: 10px;"
ng-click="ctrl.addEnvironmentVariable()"
data-cy="k8sAppCreate-addEnvVarButton"
>
<i class="fa fa-plus-circle" aria-hidden="true"></i> add environment variable <i class="fa fa-plus-circle" aria-hidden="true"></i> add environment variable
</span> </span>
</div> </div>
@ -210,6 +218,7 @@
ng-pattern="/^[-._a-zA-Z][-._a-zA-Z0-9]*$/" ng-pattern="/^[-._a-zA-Z][-._a-zA-Z0-9]*$/"
placeholder="foo" placeholder="foo"
ng-disabled="ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.formValues.Containers.length > 1"
data-cy="k8sAppCreate-envVarName_{{ $index }}"
required required
/> />
</div> </div>
@ -224,6 +233,7 @@
ng-model="envVar.Value" ng-model="envVar.Value"
placeholder="bar" placeholder="bar"
ng-disabled="ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.formValues.Containers.length > 1"
data-cy="k8sAppCreate-envVarValue_{{ $index }}"
/> />
</div> </div>
@ -231,7 +241,13 @@
<button ng-if="!envVar.NeedsDeletion" class="btn btn-sm btn-danger" type="button" ng-click="ctrl.removeEnvironmentVariable(envVar)"> <button ng-if="!envVar.NeedsDeletion" class="btn btn-sm btn-danger" type="button" ng-click="ctrl.removeEnvironmentVariable(envVar)">
<i class="fa fa-trash-alt" aria-hidden="true"></i> <i class="fa fa-trash-alt" aria-hidden="true"></i>
</button> </button>
<button ng-if="envVar.NeedsDeletion" class="btn btn-sm btn-primary" type="button" ng-click="ctrl.restoreEnvironmentVariable(envVar)"> <button
ng-if="envVar.NeedsDeletion"
class="btn btn-sm btn-primary"
type="button"
ng-click="ctrl.restoreEnvironmentVariable(envVar)"
data-cy="k8sAppCreate-removeEnvVarButton_{{ $index }}"
>
<i class="fa fa-trash-restore" aria-hidden="true"></i> <i class="fa fa-trash-restore" aria-hidden="true"></i>
</button> </button>
</div> </div>
@ -277,14 +293,20 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left">Configurations</label> <label class="control-label text-left">Configurations</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addConfiguration()" ng-if="ctrl.formValues.Containers.length <= 1"> <span
class="label label-default interactive"
style="margin-left: 10px;"
ng-click="ctrl.addConfiguration()"
ng-if="ctrl.formValues.Containers.length <= 1"
data-cy="k8sAppCreate-addConfigButton"
>
<i class="fa fa-plus-circle" aria-hidden="true"></i> add configuration <i class="fa fa-plus-circle" aria-hidden="true"></i> add configuration
</span> </span>
</div> </div>
<div class="col-sm-12 small text-muted" style="margin-top: 15px;" ng-if="ctrl.formValues.Configurations.length"> <div class="col-sm-12 small text-muted" style="margin-top: 15px;" ng-if="ctrl.formValues.Configurations.length">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i>
Portainer will automatically expose all the keys of a configuration as environment variables. This behavior can be overriden to filesystem mounts for each key via Portainer will automatically expose all the keys of a configuration as environment variables. This behavior can be overriden to filesystem mounts for each key
the override button. via the override button.
</div> </div>
</div> </div>
@ -298,6 +320,7 @@
ng-options="c as c.Name for c in ctrl.configurations track by c.Name" ng-options="c as c.Name for c in ctrl.configurations track by c.Name"
ng-change="ctrl.resetConfiguration(index)" ng-change="ctrl.resetConfiguration(index)"
ng-disabled="ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.formValues.Containers.length > 1"
data-cy="k8sAppCreate-addConfigSelect_{{ $index }}"
></select> ></select>
</div> </div>
<div class="col-sm-6" style="margin-top: 2px;"> <div class="col-sm-6" style="margin-top: 2px;">
@ -307,6 +330,7 @@
ng-if="!config.Overriden" ng-if="!config.Overriden"
ng-click="ctrl.overrideConfiguration(index)" ng-click="ctrl.overrideConfiguration(index)"
ng-disabled="!config.SelectedConfiguration || ctrl.formValues.Containers.length > 1" ng-disabled="!config.SelectedConfiguration || ctrl.formValues.Containers.length > 1"
data-cy="k8sAppCreate-configOverrideButton_{{ $index }}"
> >
<i class="fa fa-list" aria-hidden="true"></i> Override <i class="fa fa-list" aria-hidden="true"></i> Override
</button> </button>
@ -316,10 +340,17 @@
ng-if="config.Overriden" ng-if="config.Overriden"
ng-click="ctrl.resetConfiguration(index)" ng-click="ctrl.resetConfiguration(index)"
ng-disabled="ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.formValues.Containers.length > 1"
data-cy="k8sAppCreate-configAutoButton_{{ $index }}"
> >
<i class="fa fa-undo" aria-hidden="true"></i> Auto <i class="fa fa-undo" aria-hidden="true"></i> Auto
</button> </button>
<button class="btn btn-sm btn-danger" type="button" ng-click="ctrl.removeConfiguration(index)" ng-if="ctrl.formValues.Containers.length <= 1"> <button
class="btn btn-sm btn-danger"
type="button"
ng-click="ctrl.removeConfiguration(index)"
ng-if="ctrl.formValues.Containers.length <= 1"
data-cy="k8sAppCreate-configRemoveButton"
>
<i class="fa fa-trash-alt" aria-hidden="true"></i> Remove <i class="fa fa-trash-alt" aria-hidden="true"></i> Remove
</button> </button>
</div> </div>
@ -358,6 +389,7 @@
ng-disabled="ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.formValues.Containers.length > 1"
required required
ng-change="ctrl.onChangeConfigurationPath()" ng-change="ctrl.onChangeConfigurationPath()"
data-cy="k8sAppCreate-pathOnDiskInput"
/> />
</div> </div>
</div> </div>
@ -420,7 +452,13 @@
<div class="form-group" ng-if="ctrl.storageClassAvailable()"> <div class="form-group" ng-if="ctrl.storageClassAvailable()">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px;">
<label class="control-label text-left">Persisted folders</label> <label class="control-label text-left">Persisted folders</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addPersistedFolder()" ng-if="ctrl.isAddPersistentFolderButtonShowed()"> <span
class="label label-default interactive"
style="margin-left: 10px;"
ng-click="ctrl.addPersistedFolder()"
ng-if="ctrl.isAddPersistentFolderButtonShowed()"
data-cy="k8sAppCreate-addPersistentFolderButton"
>
<i class="fa fa-plus-circle" aria-hidden="true"></i> add persisted folder <i class="fa fa-plus-circle" aria-hidden="true"></i> add persisted folder
</span> </span>
</div> </div>
@ -438,6 +476,7 @@
ng-disabled="ctrl.isEditAndExistingPersistedFolder($index) || ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.isEditAndExistingPersistedFolder($index) || ctrl.formValues.Containers.length > 1"
placeholder="/data" placeholder="/data"
required required
data-cy="k8sAppCreate-containerPathInput_{{ $index }}"
/> />
</div> </div>
@ -500,8 +539,16 @@
ng-model="persistedFolder.StorageClass" ng-model="persistedFolder.StorageClass"
ng-options="storageClass as storageClass.Name for storageClass in ctrl.storageClasses" ng-options="storageClass as storageClass.Name for storageClass in ctrl.storageClasses"
ng-disabled="ctrl.state.isEdit || ctrl.formValues.Containers.length > 1" ng-disabled="ctrl.state.isEdit || ctrl.formValues.Containers.length > 1"
data-cy="k8sAppCreate-storageSelect_{{ $index }}"
></select> ></select>
<input ng-if="!ctrl.hasMultipleStorageClassesAvailable()" type="text" class="form-control" disabled ng-model="persistedFolder.StorageClass.Name" /> <input
ng-if="!ctrl.hasMultipleStorageClassesAvailable()"
type="text"
class="form-control"
disabled
ng-model="persistedFolder.StorageClass.Name"
data-cy="k8sAppCreate-storageClassNameInput_{{ $index }}"
/>
</div> </div>
<div class="input-group col-sm-5 input-group-sm" ng-if="!persistedFolder.UseNewVolume" ng-class="{ striked: persistedFolder.NeedsDeletion }"> <div class="input-group col-sm-5 input-group-sm" ng-if="!persistedFolder.UseNewVolume" ng-class="{ striked: persistedFolder.NeedsDeletion }">
@ -521,10 +568,22 @@
<div class="input-group col-sm-1 input-group-sm"> <div class="input-group col-sm-1 input-group-sm">
<div ng-if="!ctrl.isEditAndStatefulSet() && !ctrl.state.useExistingVolume[$index] && ctrl.formValues.Containers.length <= 1"> <div ng-if="!ctrl.isEditAndStatefulSet() && !ctrl.state.useExistingVolume[$index] && ctrl.formValues.Containers.length <= 1">
<button ng-if="!persistedFolder.NeedsDeletion" class="btn btn-sm btn-danger" type="button" ng-click="ctrl.removePersistedFolder($index)"> <button
ng-if="!persistedFolder.NeedsDeletion"
class="btn btn-sm btn-danger"
type="button"
ng-click="ctrl.removePersistedFolder($index)"
data-cy="k8sAppCreate-rmPersistentFolderButton"
>
<i class="fa fa-trash-alt" aria-hidden="true"></i> <i class="fa fa-trash-alt" aria-hidden="true"></i>
</button> </button>
<button ng-if="persistedFolder.NeedsDeletion" class="btn btn-sm btn-primary" type="button" ng-click="ctrl.restorePersistedFolder($index)"> <button
ng-if="persistedFolder.NeedsDeletion"
class="btn btn-sm btn-primary"
type="button"
ng-click="ctrl.restorePersistedFolder($index)"
data-cy="k8sAppCreate-restorePersistentButton"
>
<i class="fa fa-trash-restore" aria-hidden="true"></i> <i class="fa fa-trash-restore" aria-hidden="true"></i>
</button> </button>
</div> </div>
@ -544,7 +603,9 @@
<div <div
class="small text-warning" class="small text-warning"
style="margin-top: 5px;" style="margin-top: 5px;"
ng-show="kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$invalid || ctrl.state.duplicates.persistedFolders.refs[$index] !== undefined" ng-show="
kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$invalid || ctrl.state.duplicates.persistedFolders.refs[$index] !== undefined
"
> >
<ng-messages for="kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$error"> <ng-messages for="kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$error">
<p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Path is required.</p> <p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Path is required.</p>
@ -623,7 +684,9 @@
</div> </div>
<div <div
style="color: #767676;" style="color: #767676;"
ng-if="(ctrl.state.isEdit && ctrl.formValues.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.SHARED) || ctrl.state.persistedFoldersUseExistingVolumes" ng-if="
(ctrl.state.isEdit && ctrl.formValues.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.SHARED) || ctrl.state.persistedFoldersUseExistingVolumes
"
> >
<input type="radio" id="data_access_isolated" disabled /> <input type="radio" id="data_access_isolated" disabled />
<label <label
@ -694,8 +757,8 @@
<div class="form-group" ng-if="ctrl.state.resourcePoolHasQuota && !ctrl.resourceQuotaCapacityExceeded()"> <div class="form-group" ng-if="ctrl.state.resourcePoolHasQuota && !ctrl.resourceQuotaCapacityExceeded()">
<div class="col-sm-12 small text-muted"> <div class="col-sm-12 small text-muted">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px;"></i>
A resource quota is set on this namespace, you must specify resource reservations. Resource reservations are applied per instance of the application. Maximums are A resource quota is set on this namespace, you must specify resource reservations. Resource reservations are applied per instance of the application. Maximums
inherited from the namespace quota. are inherited from the namespace quota.
</div> </div>
</div> </div>
@ -733,6 +796,7 @@
class="form-control" class="form-control"
id="memory-limit" id="memory-limit"
required required
data-cy="k8sAppCreate-memoryLimit"
/> />
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
@ -798,7 +862,13 @@
<div class="form-group" style="margin-bottom: 0;"> <div class="form-group" style="margin-bottom: 0;">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div> <div>
<input type="radio" id="deployment_replicated" ng-value="ctrl.ApplicationDeploymentTypes.REPLICATED" ng-model="ctrl.formValues.DeploymentType" /> <input
type="radio"
id="deployment_replicated"
ng-value="ctrl.ApplicationDeploymentTypes.REPLICATED"
ng-model="ctrl.formValues.DeploymentType"
data-cy="k8sAppCreate-replicatedDeploymentButton"
/>
<label for="deployment_replicated"> <label for="deployment_replicated">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-cube" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-cube" aria-hidden="true" style="margin-right: 2px;"></i>
@ -831,6 +901,7 @@
ng-value="ctrl.ApplicationDeploymentTypes.GLOBAL" ng-value="ctrl.ApplicationDeploymentTypes.GLOBAL"
ng-model="ctrl.formValues.DeploymentType" ng-model="ctrl.formValues.DeploymentType"
ng-click="ctrl.unselectAutoScaler()" ng-click="ctrl.unselectAutoScaler()"
data-cy="k8sAppCreate-globalDeployButton"
/> />
<label for="deployment_global"> <label for="deployment_global">
<div class="boxselector_header"> <div class="boxselector_header">
@ -862,6 +933,7 @@
ng-disabled="!ctrl.supportScalableReplicaDeployment()" ng-disabled="!ctrl.supportScalableReplicaDeployment()"
ng-change="ctrl.enforceReplicaCountMinimum()" ng-change="ctrl.enforceReplicaCountMinimum()"
required required
data-cy="k8sAppCreate-replicaCountInput"
/> />
</div> </div>
</div> </div>
@ -914,7 +986,13 @@
Enable auto scaling for this application Enable auto scaling for this application
</label> </label>
<label class="switch" style="margin-left: 20px;"> <label class="switch" style="margin-left: 20px;">
<input type="checkbox" class="form-control" name="enable_auto_scaling" ng-model="ctrl.formValues.AutoScaler.IsUsed" /> <input
type="checkbox"
class="form-control"
name="enable_auto_scaling"
ng-model="ctrl.formValues.AutoScaler.IsUsed"
data-cy="k8sAppCreate-autoScaleCheckbox"
/>
<i></i> <i></i>
</label> </label>
</div> </div>
@ -957,6 +1035,7 @@
min="0" min="0"
ng-max="ctrl.formValues.AutoScaler.MaxReplicas" ng-max="ctrl.formValues.AutoScaler.MaxReplicas"
ng-model="ctrl.formValues.AutoScaler.MinReplicas" ng-model="ctrl.formValues.AutoScaler.MinReplicas"
data-cy="k8sAppCreate-autoScaleMin"
required required
/> />
</div> </div>
@ -991,7 +1070,16 @@
</td> </td>
<td style="padding: 8px 5px 5px 0; border: none;"> <td style="padding: 8px 5px 5px 0; border: none;">
<div class="input-group input-group-sm" style="width: 100%;"> <div class="input-group input-group-sm" style="width: 100%;">
<input type="number" class="form-control" name="auto_scaler_cpu" ng-model="ctrl.formValues.AutoScaler.TargetCPUUtilization" min="1" max="100" required /> <input
type="number"
class="form-control"
name="auto_scaler_cpu"
ng-model="ctrl.formValues.AutoScaler.TargetCPUUtilization"
min="1"
max="100"
required
data-cy="k8sAppCreate-targetCPUInput"
/>
</div> </div>
<div class="input-group input-group-sm" ng-show="kubernetesApplicationCreationForm['auto_scaler_cpu'].$invalid"> <div class="input-group input-group-sm" ng-show="kubernetesApplicationCreationForm['auto_scaler_cpu'].$invalid">
<div class="small text-warning" style="margin-top: 5px;"> <div class="small text-warning" style="margin-top: 5px;">
@ -1044,6 +1132,7 @@
ng-options="label as (label.Key | kubernetesNodeLabelHumanReadbleText) for label in ctrl.nodesLabels" ng-options="label as (label.Key | kubernetesNodeLabelHumanReadbleText) for label in ctrl.nodesLabels"
ng-change="ctrl.onChangePlacementLabel($index)" ng-change="ctrl.onChangePlacementLabel($index)"
ng-disabled="ctrl.isEditAndNotNewPlacement($index)" ng-disabled="ctrl.isEditAndNotNewPlacement($index)"
data-cy="k8sAppCreate-placementLabel_{{ $index }}"
> >
</select> </select>
</div> </div>
@ -1053,15 +1142,28 @@
ng-model="placement.Value" ng-model="placement.Value"
ng-options="value for value in placement.Label.Values" ng-options="value for value in placement.Label.Values"
ng-disabled="ctrl.isEditAndNotNewPlacement($index)" ng-disabled="ctrl.isEditAndNotNewPlacement($index)"
data-cy="k8sAppCreate-placementName_{{ $index }}"
> >
</select> </select>
</div> </div>
<div class="col-sm-1 input-group"> <div class="col-sm-1 input-group">
<button ng-if="!placement.NeedsDeletion" class="btn btn-sm btn-danger" type="button" ng-click="ctrl.removePlacement($index)"> <button
ng-if="!placement.NeedsDeletion"
class="btn btn-sm btn-danger"
type="button"
ng-click="ctrl.removePlacement($index)"
data-cy="k8sAppCreate-deletePlacementButton"
>
<i class="fa fa-trash-alt" aria-hidden="true"></i> <i class="fa fa-trash-alt" aria-hidden="true"></i>
</button> </button>
<button ng-if="placement.NeedsDeletion" class="btn btn-sm btn-primary" type="button" ng-click="ctrl.restorePlacement($index)"> <button
ng-if="placement.NeedsDeletion"
class="btn btn-sm btn-primary"
type="button"
ng-click="ctrl.restorePlacement($index)"
data-cy="k8sAppCreate-restorePlacementButton"
>
<i class="fa fa-trash-restore" aria-hidden="true"></i> <i class="fa fa-trash-restore" aria-hidden="true"></i>
</button> </button>
</div> </div>
@ -1094,7 +1196,13 @@
<div class="form-group" style="margin-bottom: 0;" ng-if="ctrl.formValues.Placements.length"> <div class="form-group" style="margin-bottom: 0;" ng-if="ctrl.formValues.Placements.length">
<div class="boxselector_wrapper"> <div class="boxselector_wrapper">
<div> <div>
<input type="radio" id="placement_hard" ng-value="ctrl.ApplicationPlacementTypes.MANDATORY" ng-model="ctrl.formValues.PlacementType" /> <input
type="radio"
id="placement_hard"
ng-value="ctrl.ApplicationPlacementTypes.MANDATORY"
ng-model="ctrl.formValues.PlacementType"
data-cy="k8sAppCreate-mandatoryPlacementButton"
/>
<label for="placement_hard"> <label for="placement_hard">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-tasks" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-tasks" aria-hidden="true" style="margin-right: 2px;"></i>
@ -1104,7 +1212,13 @@
</label> </label>
</div> </div>
<div> <div>
<input type="radio" id="placement_soft" ng-value="ctrl.ApplicationPlacementTypes.PREFERRED" ng-model="ctrl.formValues.PlacementType" /> <input
type="radio"
id="placement_soft"
ng-value="ctrl.ApplicationPlacementTypes.PREFERRED"
ng-model="ctrl.formValues.PlacementType"
data-cy="k8sAppCreate-prefferedPlacementButton"
/>
<label for="placement_soft"> <label for="placement_soft">
<div class="boxselector_header"> <div class="boxselector_header">
<i class="fa fa-list" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-list" aria-hidden="true" style="margin-right: 2px;"></i>
@ -1141,11 +1255,13 @@
ng-model="ctrl.formValues.PublishingType" ng-model="ctrl.formValues.PublishingType"
ng-change="ctrl.onChangePublishedPorts()" ng-change="ctrl.onChangePublishedPorts()"
ng-disabled="ctrl.isPublishingTypeEditDisabled()" ng-disabled="ctrl.isPublishingTypeEditDisabled()"
data-cy="k8sAppCreate-internalPublishButton"
/> />
<label <label
for="publishing_internal" for="publishing_internal"
ng-if=" ng-if="
!ctrl.isPublishingTypeEditDisabled() || (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INTERNAL) !ctrl.isPublishingTypeEditDisabled() ||
(ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INTERNAL)
" "
> >
<div class="boxselector_header"> <div class="boxselector_header">
@ -1179,11 +1295,13 @@
ng-model="ctrl.formValues.PublishingType" ng-model="ctrl.formValues.PublishingType"
ng-change="ctrl.onChangePublishedPorts()" ng-change="ctrl.onChangePublishedPorts()"
ng-disabled="ctrl.isPublishingTypeEditDisabled()" ng-disabled="ctrl.isPublishingTypeEditDisabled()"
data-cy="k8sAppCreate-clusterPublishButton"
/> />
<label <label
for="publishing_cluster" for="publishing_cluster"
ng-if=" ng-if="
!ctrl.isPublishingTypeEditDisabled() || (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.CLUSTER) !ctrl.isPublishingTypeEditDisabled() ||
(ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.CLUSTER)
" "
> >
<div class="boxselector_header"> <div class="boxselector_header">
@ -1216,11 +1334,13 @@
ng-model="ctrl.formValues.PublishingType" ng-model="ctrl.formValues.PublishingType"
ng-change="ctrl.onChangePublishedPorts()" ng-change="ctrl.onChangePublishedPorts()"
ng-disabled="ctrl.isPublishingTypeEditDisabled()" ng-disabled="ctrl.isPublishingTypeEditDisabled()"
data-cy="k8sAppCreate-ingressPublishButton"
/> />
<label <label
for="publishing_ingress" for="publishing_ingress"
ng-if=" ng-if="
!ctrl.isPublishingTypeEditDisabled() || (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS) !ctrl.isPublishingTypeEditDisabled() ||
(ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS)
" "
> >
<div class="boxselector_header"> <div class="boxselector_header">
@ -1253,6 +1373,7 @@
ng-model="ctrl.formValues.PublishingType" ng-model="ctrl.formValues.PublishingType"
ng-change="ctrl.onChangePublishedPorts()" ng-change="ctrl.onChangePublishedPorts()"
ng-disabled="ctrl.isPublishingTypeEditDisabled()" ng-disabled="ctrl.isPublishingTypeEditDisabled()"
data-cy="k8sAppCreate-lbPublichButton"
/> />
<label <label
for="publishing_loadbalancer" for="publishing_loadbalancer"
@ -1291,7 +1412,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12" style="margin-top: 5px;"> <div class="col-sm-12" style="margin-top: 5px;">
<label class="control-label text-left">Published ports</label> <label class="control-label text-left">Published ports</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addPublishedPort()" ng-if="!ctrl.disableLoadBalancerEdit()"> <span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addPublishedPort()" data-cy="k8sAppCreate-addNewPortButton">
<i class="fa fa-plus-circle" aria-hidden="true"></i> publish a new port <i class="fa fa-plus-circle" aria-hidden="true"></i> publish a new port
</span> </span>
</div> </div>
@ -1340,6 +1461,7 @@
ng-required="!publishedPort.NeedsDeletion" ng-required="!publishedPort.NeedsDeletion"
ng-change="ctrl.onChangePortMappingContainerPort()" ng-change="ctrl.onChangePortMappingContainerPort()"
ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)" ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)"
data-cy="k8sAppCreate-containerPort_{{ $index }}"
/> />
</div> </div>
@ -1362,7 +1484,8 @@
ng-max="32767" ng-max="32767"
ng-change="ctrl.onChangePortMappingNodePort()" ng-change="ctrl.onChangePortMappingNodePort()"
ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)" ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)"
/> data-cy="k8sAppCreate-nodePort_{{ $index }}"
/>
</div> </div>
<div <div
@ -1386,6 +1509,7 @@
ng-required="!publishedPort.NeedsDeletion" ng-required="!publishedPort.NeedsDeletion"
ng-change="ctrl.onChangePortMappingLoadBalancer()" ng-change="ctrl.onChangePortMappingLoadBalancer()"
ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)" ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)"
data-cy="k8sAppCreate-lbPortInput_{{ $index }}"
/> />
</div> </div>
@ -1406,6 +1530,7 @@
ng-required="!publishedPort.NeedsDeletion" ng-required="!publishedPort.NeedsDeletion"
ng-change="ctrl.onChangePortMappingIngress($index)" ng-change="ctrl.onChangePortMappingIngress($index)"
ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)" ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)"
data-cy="k8sAppCreate-ingressSelect_{{ $index }}"
> >
<option selected disabled hidden value="">Select an ingress</option> <option selected disabled hidden value="">Select an ingress</option>
</select> </select>
@ -1427,6 +1552,7 @@
ng-options="host as (host | kubernetesApplicationIngressEmptyHostname) for host in publishedPort.IngressHosts" ng-options="host as (host | kubernetesApplicationIngressEmptyHostname) for host in publishedPort.IngressHosts"
ng-change="ctrl.onChangePublishedPorts()" ng-change="ctrl.onChangePublishedPorts()"
ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)" ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)"
data-cy="k8sAppCreate-hostnameSelect_{{ $index }}"
> >
<option selected disabled hidden value="">Select a hostname</option> <option selected disabled hidden value="">Select a hostname</option>
</select> </select>
@ -1450,6 +1576,7 @@
ng-change="ctrl.onChangePortMappingIngressRoute()" ng-change="ctrl.onChangePortMappingIngressRoute()"
ng-pattern="/^(\/?[a-zA-Z0-9]+([a-zA-Z0-9-/_]*[a-zA-Z0-9])?|[a-zA-Z0-9]+)|(\/){1}$/" ng-pattern="/^(\/?[a-zA-Z0-9]+([a-zA-Z0-9-/_]*[a-zA-Z0-9])?|[a-zA-Z0-9]+)|(\/){1}$/"
ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)" ng-disabled="ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)"
data-cy="k8sAppCreate-ingressRoute_{{ $index }}"
/> />
</div> </div>
@ -1461,6 +1588,7 @@
uib-btn-radio="'TCP'" uib-btn-radio="'TCP'"
ng-change="ctrl.onChangePortProtocol($index)" ng-change="ctrl.onChangePortProtocol($index)"
ng-disabled="ctrl.isProtocolOptionDisabled($index, 'TCP')" ng-disabled="ctrl.isProtocolOptionDisabled($index, 'TCP')"
data-cy="k8sAppCreate-TCPButton_{{ $index }}"
>TCP</label >TCP</label
> >
<label <label
@ -1469,6 +1597,7 @@
uib-btn-radio="'UDP'" uib-btn-radio="'UDP'"
ng-change="ctrl.onChangePortProtocol($index)" ng-change="ctrl.onChangePortProtocol($index)"
ng-disabled="ctrl.isProtocolOptionDisabled($index, 'UDP')" ng-disabled="ctrl.isProtocolOptionDisabled($index, 'UDP')"
data-cy="k8sAppCreate-UDPButton_{{ $index }}"
>UDP</label >UDP</label
> >
</div> </div>
@ -1477,6 +1606,7 @@
class="btn btn-sm btn-danger" class="btn btn-sm btn-danger"
type="button" type="button"
ng-click="ctrl.removePublishedPort($index)" ng-click="ctrl.removePublishedPort($index)"
data-cy="k8sAppCreate-rmPortButton_{{ $index }}"
> >
<i class="fa fa-trash-alt" aria-hidden="true"></i> <i class="fa fa-trash-alt" aria-hidden="true"></i>
</button> </button>
@ -1485,6 +1615,7 @@
class="btn btn-sm btn-primary" class="btn btn-sm btn-primary"
type="button" type="button"
ng-click="ctrl.restorePublishedPort($index)" ng-click="ctrl.restorePublishedPort($index)"
data-cy="k8sAppCreate-restorePortButton_{{ $index }}"
> >
<i class="fa fa-trash-restore" aria-hidden="true"></i> <i class="fa fa-trash-restore" aria-hidden="true"></i>
</button> </button>
@ -1564,8 +1695,8 @@
<div ng-messages="kubernetesApplicationCreationForm['ingress_route_'+$index].$error"> <div ng-messages="kubernetesApplicationCreationForm['ingress_route_'+$index].$error">
<p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Route is required.</p> <p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Route is required.</p>
<p ng-message="pattern" <p ng-message="pattern"
><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field must consist of alphanumeric characters or the special characters: '-', '_' or ><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field must consist of alphanumeric characters or the special characters: '-', '_'
'/'. It must start and end with an alphanumeric character (e.g. 'my-route', or 'route-123').</p or '/'. It must start and end with an alphanumeric character (e.g. 'my-route', or 'route-123').</p
> >
</div> </div>
<p ng-if="ctrl.state.duplicates.publishedPorts.ingressRoutes.refs[$index] !== undefined"> <p ng-if="ctrl.state.duplicates.publishedPorts.ingressRoutes.refs[$index] !== undefined">
@ -1608,7 +1739,7 @@
form-values="ctrl.formValues" form-values="ctrl.formValues"
old-form-values="ctrl.savedFormValues" old-form-values="ctrl.savedFormValues"
></kubernetes-summary-view> ></kubernetes-summary-view>
</div> </div>
</div> </div>
<div class="col-sm-12 form-section-title" ng-if="ctrl.state.appType !== ctrl.KubernetesDeploymentTypes.GIT"> <div class="col-sm-12 form-section-title" ng-if="ctrl.state.appType !== ctrl.KubernetesDeploymentTypes.GIT">
@ -1636,6 +1767,7 @@
type="button" type="button"
class="btn btn-sm btn-default" class="btn btn-sm btn-default"
ui-sref="kubernetes.applications.application({ name: ctrl.application.Name, namespace: ctrl.application.ResourcePool })" ui-sref="kubernetes.applications.application({ name: ctrl.application.Name, namespace: ctrl.application.ResourcePool })"
data-cy="k8sAppCreate-appCancelButton"
> >
Cancel Cancel
</button> </button>

View File

@ -26,7 +26,7 @@
</tr> </tr>
<tr> <tr>
<td>Stack</td> <td>Stack</td>
<td>{{ ctrl.application.StackName || '-' }}</td> <td data-cy="k8sAppDetail-stackName">{{ ctrl.application.StackName || '-' }}</td>
</tr> </tr>
<tr> <tr>
<td>Namespace</td> <td>Namespace</td>
@ -37,15 +37,15 @@
</tr> </tr>
<tr> <tr>
<td>Application Type</td> <td>Application Type</td>
<td> <td data-cy="k8sAppDetail-appType">
{{ ctrl.application.ApplicationType | kubernetesApplicationTypeText }} {{ ctrl.application.ApplicationType | kubernetesApplicationTypeText }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Status</td> <td>Status</td>
<td ng-if="ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD"> <td ng-if="ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD">
<span ng-if="ctrl.application.DeploymentType === ctrl.KubernetesApplicationDeploymentTypes.REPLICATED">Replicated</span> <span ng-if="ctrl.application.DeploymentType === ctrl.KubernetesApplicationDeploymentTypes.REPLICATED" data-cy="k8sAppDetail-deployType">Replicated</span>
<span ng-if="ctrl.application.DeploymentType === ctrl.KubernetesApplicationDeploymentTypes.GLOBAL">Global</span> <span ng-if="ctrl.application.DeploymentType === ctrl.KubernetesApplicationDeploymentTypes.GLOBAL" data-cy="k8sAppDetail-appType">Global</span>
<code data-cy="k8sAppDetail-runningPods">{{ ctrl.application.RunningPodsCount }}</code> / <code data-cy="k8sAppDetail-runningPods">{{ ctrl.application.RunningPodsCount }}</code> /
<code data-cy="k8sAppDetail-totalPods">{{ ctrl.application.TotalPodsCount }}</code> <code data-cy="k8sAppDetail-totalPods">{{ ctrl.application.TotalPodsCount }}</code>
</td> </td>
@ -59,8 +59,10 @@
<div ng-if="ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD" class="text-muted small"> per instance </div> <div ng-if="ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD" class="text-muted small"> per instance </div>
</td> </td>
<td> <td>
<div ng-if="ctrl.application.Requests.Cpu">CPU {{ ctrl.application.Requests.Cpu | kubernetesApplicationCPUValue }}</div> <div ng-if="ctrl.application.Requests.Cpu" data-cy="k8sAppDetail-cpuReservation"
<div ng-if="ctrl.application.Requests.Memory">Memory {{ ctrl.application.Requests.Memory | humansize }}</div> >CPU {{ ctrl.application.Requests.Cpu | kubernetesApplicationCPUValue }}</div
>
<div ng-if="ctrl.application.Requests.Memory" data-cy="k8sAppDetail-memoryReservation">Memory {{ ctrl.application.Requests.Memory | humansize }}</div>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -79,7 +81,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<i class="fa fa-edit" aria-hidden="true"></i> Note <i class="fa fa-edit" aria-hidden="true"></i> Note
<button class="btn btn-xs btn-primary" ng-click="ctrl.state.expandedNote = !ctrl.state.expandedNote;" <button class="btn btn-xs btn-primary" ng-click="ctrl.state.expandedNote = !ctrl.state.expandedNote;" data-cy="k8sAppDetail-expandNoteButton"
>{{ ctrl.state.expandedNote ? 'Collapse' : 'Expand' }} >{{ ctrl.state.expandedNote ? 'Collapse' : 'Expand' }}
<i class="fas {{ ctrl.state.expandedNote ? 'fa-angle-up' : 'fa-angle-down' }}" aria-hidden="true"></i <i class="fas {{ ctrl.state.expandedNote ? 'fa-angle-up' : 'fa-angle-down' }}" aria-hidden="true"></i
></button> ></button>
@ -105,6 +107,7 @@
type="button" type="button"
ng-click="ctrl.updateApplication()" ng-click="ctrl.updateApplication()"
ng-disabled="ctrl.formValues.Note === ctrl.application.Note" ng-disabled="ctrl.formValues.Note === ctrl.application.Note"
data-cy="k8sAppDetail-saveNoteButton"
>{{ ctrl.application.Note ? 'Update' : 'Save' }} note</button >{{ ctrl.application.Note ? 'Update' : 'Save' }} note</button
> >
</div> </div>
@ -195,7 +198,14 @@
<rd-widget> <rd-widget>
<rd-widget-body> <rd-widget-body>
<div ng-if="!ctrl.isSystemNamespace()" style="margin-bottom: 15px;"> <div ng-if="!ctrl.isSystemNamespace()" style="margin-bottom: 15px;">
<button ng-if="!ctrl.isExternalApplication()" type="button" class="btn btn-sm btn-primary" ui-sref="kubernetes.applications.application.edit" style="margin-left: 0;"> <button
ng-if="!ctrl.isExternalApplication()"
type="button"
class="btn btn-sm btn-primary"
ui-sref="kubernetes.applications.application.edit"
style="margin-left: 0;"
data-cy="k8sAppDetail-editAppButton"
>
<i class="fa fa-file-code space-right" aria-hidden="true"></i>Edit this application <i class="fa fa-file-code space-right" aria-hidden="true"></i>Edit this application
</button> </button>
<button <button
@ -204,6 +214,7 @@
class="btn btn-sm btn-primary" class="btn btn-sm btn-primary"
style="margin-left: 0;" style="margin-left: 0;"
ng-click="ctrl.redeployApplication()" ng-click="ctrl.redeployApplication()"
data-cy="k8sAppDetail-redeployButton"
> >
<i class="fa fa-redo space-right" aria-hidden="true"></i>Redeploy <i class="fa fa-redo space-right" aria-hidden="true"></i>Redeploy
</button> </button>
@ -214,6 +225,7 @@
style="margin-left: 0;" style="margin-left: 0;"
ng-click="ctrl.rollbackApplication()" ng-click="ctrl.rollbackApplication()"
ng-disabled="ctrl.application.Revisions.length < 2 || ctrl.state.appType !== ctrl.KubernetesDeploymentTypes.APPLICATION_FORM" ng-disabled="ctrl.application.Revisions.length < 2 || ctrl.state.appType !== ctrl.KubernetesDeploymentTypes.APPLICATION_FORM"
data-cy="k8sAppDetail-rollbackButton"
> >
<i class="fas fa-history space-right" aria-hidden="true"></i>Rollback to previous configuration <i class="fas fa-history space-right" aria-hidden="true"></i>Rollback to previous configuration
</button> </button>
@ -327,7 +339,7 @@
<span ng-if="ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT" data-cy="k8sAppDetail-nodePort"> <span ng-if="ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT" data-cy="k8sAppDetail-nodePort">
{{ port.NodePort }} {{ port.NodePort }}
</span> </span>
<span ng-if="ctrl.application.ServiceType !== ctrl.KubernetesServiceTypes.NODE_PORT"> <span ng-if="ctrl.application.ServiceType !== ctrl.KubernetesServiceTypes.NODE_PORT" data-cy="k8sAppDetail-containerPort">
{{ port.Port }} {{ port.Port }}
</span> </span>
<a <a
@ -335,6 +347,7 @@
ng-href="http://{{ ctrl.application.LoadBalancerIPAddress }}:{{ port.Port }}" ng-href="http://{{ ctrl.application.LoadBalancerIPAddress }}:{{ port.Port }}"
target="_blank" target="_blank"
style="margin-left: 5px;" style="margin-left: 5px;"
data-cy="k8sAppDetail-accessLink"
> >
<i class="fa fa-external-link-alt" aria-hidden="true"></i> access <i class="fa fa-external-link-alt" aria-hidden="true"></i> access
</a> </a>
@ -342,12 +355,12 @@
<td ng-if="!ctrl.portHasIngressRules(port)">-</td> <td ng-if="!ctrl.portHasIngressRules(port)">-</td>
</tr> </tr>
<tr ng-repeat-end ng-repeat="rule in port.IngressRules"> <tr ng-repeat-end ng-repeat="rule in port.IngressRules">
<td>{{ port.TargetPort }}/{{ port.Protocol }}</td> <td data-cy="k8sAppDetail-httpRoute">{{ port.TargetPort }}/{{ port.Protocol }}</td>
<td> <td>
<span ng-if="ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT"> <span ng-if="ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT" data-cy="k8sAppDetail-nodePort">
{{ port.NodePort }} {{ port.NodePort }}
</span> </span>
<span ng-if="ctrl.application.ServiceType !== ctrl.KubernetesServiceTypes.NODE_PORT"> <span ng-if="ctrl.application.ServiceType !== ctrl.KubernetesServiceTypes.NODE_PORT" data-cy="k8sAppDetail-port">
{{ port.Port }} {{ port.Port }}
</span> </span>
<a <a
@ -371,7 +384,7 @@
>pending >pending
</span> </span>
<span ng-if="ctrl.ruleCanBeDisplayed(rule)"> <span ng-if="ctrl.ruleCanBeDisplayed(rule)">
<a ng-href="{{ ctrl.buildIngressRuleURL(rule) }}" target="_blank"> <a ng-href="{{ ctrl.buildIngressRuleURL(rule) }}" target="_blank" data-cy="k8sAppDetail-httpRouteLink">
{{ ctrl.buildIngressRuleURL(rule) | stripprotocol }} {{ ctrl.buildIngressRuleURL(rule) | stripprotocol }}
</a> </a>
</span> </span>
@ -404,9 +417,9 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>{{ ctrl.application.AutoScaler.MinReplicas }}</td> <td data-cy="k8sAppDetail-minReplicas">{{ ctrl.application.AutoScaler.MinReplicas }}</td>
<td>{{ ctrl.application.AutoScaler.MaxReplicas }}</td> <td data-cy="k8sAppDetail-maxReplicas">{{ ctrl.application.AutoScaler.MaxReplicas }}</td>
<td>{{ ctrl.application.AutoScaler.TargetCPUUtilization }}%</td> <td data-cy="k8sAppDetail-targetCPU">{{ ctrl.application.AutoScaler.TargetCPUUtilization }}%</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -431,7 +444,7 @@
</tr> </tr>
<tbody ng-repeat="container in ctrl.application.Containers" style="border-top: 0;"> <tbody ng-repeat="container in ctrl.application.Containers" style="border-top: 0;">
<tr ng-repeat="envvar in container.Env | orderBy: 'name'"> <tr ng-repeat="envvar in container.Env | orderBy: 'name'">
<td> <td data-cy="k8sAppDetail-containerName">
{{ container.Name }} {{ container.Name }}
<span ng-if="container.Type === ctrl.KubernetesPodContainerTypes.INIT" <span ng-if="container.Type === ctrl.KubernetesPodContainerTypes.INIT"
><i class="fa fa-asterisk" aria-hidden="true"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a ><i class="fa fa-asterisk" aria-hidden="true"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a
@ -441,12 +454,16 @@
>)</span >)</span
> >
</td> </td>
<td>{{ envvar.name }}</td> <td data-cy="k8sAppDetail-envVarName">{{ envvar.name }}</td>
<td> <td>
<span ng-if="envvar.value">{{ envvar.value }}</span> <span ng-if="envvar.value" data-cy="k8sAppDetail-envVarValue">{{ envvar.value }}</span>
<span ng-if="envvar.valueFrom.configMapKeyRef"><i class="fa fa-key" aria-hidden="true"></i> {{ envvar.valueFrom.configMapKeyRef.key }}</span> <span ng-if="envvar.valueFrom.configMapKeyRef" data-cy="k8sAppDetail-envVarValue"
<span ng-if="envvar.valueFrom.secretKeyRef"><i class="fa fa-key" aria-hidden="true"></i> {{ envvar.valueFrom.secretKeyRef.key }}</span> ><i class="fa fa-key" aria-hidden="true"></i> {{ envvar.valueFrom.configMapKeyRef.key }}</span
<span ng-if="envvar.valueFrom.fieldRef" >
<span ng-if="envvar.valueFrom.secretKeyRef" data-cy="k8sAppDetail-envVarValue"
><i class="fa fa-key" aria-hidden="true"></i> {{ envvar.valueFrom.secretKeyRef.key }}</span
>
<span ng-if="envvar.valueFrom.fieldRef" data-cy="k8sAppDetail-envVarValue"
><i class="fa fa-asterisk" aria-hidden="true"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a ><i class="fa fa-asterisk" aria-hidden="true"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a
href="https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-of-the-downward-api" href="https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-of-the-downward-api"
target="_blank" target="_blank"
@ -457,12 +474,12 @@
</td> </td>
<td> <td>
<span ng-if="envvar.value || envvar.valueFrom.fieldRef || (!envvar.valueFrom.secretKeyRef && !envvar.valueFrom.configMapKeyRef)">-</span> <span ng-if="envvar.value || envvar.valueFrom.fieldRef || (!envvar.valueFrom.secretKeyRef && !envvar.valueFrom.configMapKeyRef)">-</span>
<span ng-if="envvar.valueFrom.configMapKeyRef" <span ng-if="envvar.valueFrom.configMapKeyRef" data-cy="k8sAppDetail-configName"
><a ui-sref="kubernetes.configurations.configuration({ name: envvar.valueFrom.configMapKeyRef.name, namespace: ctrl.application.ResourcePool })" ><a ui-sref="kubernetes.configurations.configuration({ name: envvar.valueFrom.configMapKeyRef.name, namespace: ctrl.application.ResourcePool })"
><i class="fa fa-file-code" aria-hidden="true"></i> {{ envvar.valueFrom.configMapKeyRef.name }}</a ><i class="fa fa-file-code" aria-hidden="true"></i> {{ envvar.valueFrom.configMapKeyRef.name }}</a
></span ></span
> >
<span ng-if="envvar.valueFrom.secretKeyRef" <span ng-if="envvar.valueFrom.secretKeyRef" data-cy="k8sAppDetail-configName"
><a ui-sref="kubernetes.configurations.configuration({ name: envvar.valueFrom.secretKeyRef.name, namespace: ctrl.application.ResourcePool })" ><a ui-sref="kubernetes.configurations.configuration({ name: envvar.valueFrom.secretKeyRef.name, namespace: ctrl.application.ResourcePool })"
><i class="fa fa-file-code" aria-hidden="true"></i> {{ envvar.valueFrom.secretKeyRef.name }}</a ><i class="fa fa-file-code" aria-hidden="true"></i> {{ envvar.valueFrom.secretKeyRef.name }}</a
></span ></span
@ -529,11 +546,11 @@
</tr> </tr>
<tbody ng-repeat="container in ctrl.application.Containers" style="border-top: 0;"> <tbody ng-repeat="container in ctrl.application.Containers" style="border-top: 0;">
<tr ng-repeat="volume in container.PersistedFolders track by $index"> <tr ng-repeat="volume in container.PersistedFolders track by $index">
<td> <td data-cy="k8sAppDetail-volMountPath">
{{ volume.MountPath }} {{ volume.MountPath }}
</td> </td>
<td ng-if="volume.PersistentVolumeClaimName"> <td ng-if="volume.PersistentVolumeClaimName">
<a ui-sref="kubernetes.volumes.volume({ name: volume.PersistentVolumeClaimName, namespace: ctrl.application.ResourcePool })" <a ui-sref="kubernetes.volumes.volume({ name: volume.PersistentVolumeClaimName, namespace: ctrl.application.ResourcePool })" data-cy="k8sAppDetail-volClaimName"
><i class="fa fa-database" aria-hidden="true"></i> {{ volume.PersistentVolumeClaimName }}</a ><i class="fa fa-database" aria-hidden="true"></i> {{ volume.PersistentVolumeClaimName }}</a
> >
</td> </td>

View File

@ -179,7 +179,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -27,7 +27,9 @@
<label class="control-label text-left"> <label class="control-label text-left">
Allow users to use external load balancer Allow users to use external load balancer
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="ctrl.formValues.UseLoadBalancer" /><i></i> </label> <label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="ctrl.formValues.UseLoadBalancer" /><i data-cy="kubeSetup-loadBalancerToggle"></i>
</label>
</div> </div>
</div> </div>
@ -43,7 +45,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<label class="control-label text-left">Ingress controller</label> <label class="control-label text-left">Ingress controller</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addIngressClass()"> <span class="label label-default interactive" style="margin-left: 10px;" ng-click="ctrl.addIngressClass()" data-cy="kubeSetup-congifIngressButton">
<i class="fa fa-plus-circle" aria-hidden="true"></i> configure ingress controller <i class="fa fa-plus-circle" aria-hidden="true"></i> configure ingress controller
</span> </span>
</div> </div>
@ -61,6 +63,7 @@
ng-pattern="/^[a-z]([-a-z0-9]*[a-z0-9])?$/" ng-pattern="/^[a-z]([-a-z0-9]*[a-z0-9])?$/"
ng-change="ctrl.onChangeIngressClassName($index)" ng-change="ctrl.onChangeIngressClassName($index)"
required required
data-cy="kubeSetup-ingressClassName"
/> />
</div> </div>
<div class="col-sm-3 input-group input-group-sm" ng-class="{ striked: ingressClass.NeedsDeletion }"> <div class="col-sm-3 input-group input-group-sm" ng-class="{ striked: ingressClass.NeedsDeletion }">
@ -71,12 +74,19 @@
ng-model="ingressClass.Type" ng-model="ingressClass.Type"
ng-options="value as value for (key, value) in ctrl.IngressClassTypes" ng-options="value as value for (key, value) in ctrl.IngressClassTypes"
required required
data-cy="kubeSetup-ingressType"
> >
<option selected disabled hidden value="">Select a type</option> <option selected disabled hidden value="">Select a type</option>
</select> </select>
</div> </div>
<div class="col-sm-1 input-group input-group-sm"> <div class="col-sm-1 input-group input-group-sm">
<button ng-if="!ingressClass.NeedsDeletion" class="btn btn-sm btn-danger" type="button" ng-click="ctrl.removeIngressClass($index)"> <button
ng-if="!ingressClass.NeedsDeletion"
class="btn btn-sm btn-danger"
type="button"
ng-click="ctrl.removeIngressClass($index)"
data-cy="kubeSetup-deleteIngress"
>
<i class="fa fa-trash-alt" aria-hidden="true"></i> <i class="fa fa-trash-alt" aria-hidden="true"></i>
</button> </button>
<button ng-if="ingressClass.NeedsDeletion" class="btn btn-sm btn-primary" type="button" ng-click="ctrl.restoreIngressClass($index)"> <button ng-if="ingressClass.NeedsDeletion" class="btn btn-sm btn-primary" type="button" ng-click="ctrl.restoreIngressClass($index)">
@ -145,7 +155,9 @@
<label class="control-label text-left"> <label class="control-label text-left">
Restrict access to the default namespace Restrict access to the default namespace
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="ctrl.formValues.RestrictDefaultNamespace" /><i></i> </label> <label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="ctrl.formValues.RestrictDefaultNamespace" /><i data-cy="kubeSetup-restrictDefaultNsToggle"></i>
</label>
</div> </div>
</div> </div>
@ -169,7 +181,7 @@
<label class="control-label text-left"> <label class="control-label text-left">
Allow resource over-commit Allow resource over-commit
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" checked disabled /><i></i> </label> <label class="switch" style="margin-left: 20px;"> <input type="checkbox" checked disabled /><i data-cy="kubeSetup-resourceOverCommitToggle"></i> </label>
<span class="text-muted small" style="margin-left: 15px;"> <span class="text-muted small" style="margin-left: 15px;">
<i class="fa fa-user" aria-hidden="true"></i> <i class="fa fa-user" aria-hidden="true"></i>
This feature is available in <a href="https://www.portainer.io/business-upsell?from=k8s-setup-overcommit" target="_blank"> Portainer Business Edition</a>. This feature is available in <a href="https://www.portainer.io/business-upsell?from=k8s-setup-overcommit" target="_blank"> Portainer Business Edition</a>.
@ -193,7 +205,7 @@
Enable features using the metrics API Enable features using the metrics API
</label> </label>
<label class="switch" style="margin-left: 20px;"> <label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="ctrl.formValues.UseServerMetrics" ng-change="ctrl.enableMetricsServer()" /><i></i> <input type="checkbox" ng-model="ctrl.formValues.UseServerMetrics" ng-change="ctrl.enableMetricsServer()" /><i data-cy="kubeSetup-metricsToggle"></i>
</label> </label>
</div> </div>
<div ng-if="ctrl.state.metrics.pending && ctrl.state.metrics.userClick" class="col-sm-12 small text-muted" style="margin-top: 5px;"> <div ng-if="ctrl.state.metrics.pending && ctrl.state.metrics.userClick" class="col-sm-12 small text-muted" style="margin-top: 5px;">
@ -252,7 +264,9 @@
<tr ng-repeat="class in ctrl.StorageClasses"> <tr ng-repeat="class in ctrl.StorageClasses">
<td> <td>
<div style="margin: 5px;"> <div style="margin: 5px;">
<label class="switch" style="margin-right: 10px;"> <input type="checkbox" ng-model="class.selected" /><i></i> </label> <label class="switch" style="margin-right: 10px;">
<input type="checkbox" ng-model="class.selected" /><i data-cy="kubeSetup-storageToggle{{ class.Name }}"></i>
</label>
<span>{{ class.Name }}</span> <span>{{ class.Name }}</span>
</div> </div>
</td> </td>
@ -267,12 +281,15 @@
directive-id="{{ class.Name }}" directive-id="{{ class.Name }}"
helper-elements="" helper-elements=""
translation="{nothingSelected: 'Not configured'}" translation="{nothingSelected: 'Not configured'}"
data-cy="kubeSetup-storageAccessSelect{{ class.Name }}"
> >
</span> </span>
</td> </td>
<td> <td>
<div style="margin: 5px;"> <div style="margin: 5px;">
<label class="switch"><input type="checkbox" ng-model="class.AllowVolumeExpansion" /><i></i> </label> <label class="switch"
><input type="checkbox" ng-model="class.AllowVolumeExpansion" /><i data-cy="kubeSetup-storageExpansionToggle{{ class.Name }}"></i>
</label>
</div> </div>
</td> </td>
</tr> </tr>
@ -304,6 +321,7 @@
analytics-category="kubernetes" analytics-category="kubernetes"
analytics-event="kubernetes-configure" analytics-event="kubernetes-configure"
analytics-properties="{ metadata: { restrictAccessToDefaultNamespace: ctrl.formValues.RestrictDefaultNamespace } }" analytics-properties="{ metadata: { restrictAccessToDefaultNamespace: ctrl.formValues.RestrictDefaultNamespace } }"
data-cy="kubeSetup-saveConfigurationButton"
> >
<span ng-hide="ctrl.state.actionInProgress">Save configuration</span> <span ng-hide="ctrl.state.actionInProgress">Save configuration</span>
<span ng-show="ctrl.state.actionInProgress">Saving configuration...</span> <span ng-show="ctrl.state.actionInProgress">Saving configuration...</span>

View File

@ -213,8 +213,8 @@
<div class="form-group" ng-if="$ctrl.formValues.IngressClasses.length === 0"> <div class="form-group" ng-if="$ctrl.formValues.IngressClasses.length === 0">
<div class="col-sm-12 small text-muted"> <div class="col-sm-12 small text-muted">
The ingress feature must be enabled in the The ingress feature must be enabled in the
<a ui-sref="portainer.endpoints.endpoint.kubernetesConfig({id: $ctrl.endpoint.Id})">environment configuration view</a> to be able to register ingresses inside this <a ui-sref="portainer.endpoints.endpoint.kubernetesConfig({id: $ctrl.endpoint.Id})">environment configuration view</a> to be able to register ingresses inside
namespace. this namespace.
</div> </div>
</div> </div>
@ -238,7 +238,9 @@
<label class="control-label text-left"> <label class="control-label text-left">
Allow users to use this ingress Allow users to use this ingress
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="ic.Selected" /><i></i> </label> <label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="ic.Selected" /><i data-cy="namespaceCreate-ingressToggle{{ ic.IngressClass.Name }}"></i>
</label>
</div> </div>
</div> </div>
@ -253,7 +255,12 @@
> >
</portainer-tooltip> </portainer-tooltip>
</label> </label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="$ctrl.addHostname(ic)"> <span
class="label label-default interactive"
style="margin-left: 10px;"
ng-click="$ctrl.addHostname(ic)"
data-cy="namespaceCreate-addHostButton{{ ic.IngressClass.Name }}"
>
<i class="fa fa-plus-circle" aria-hidden="true"></i> add hostname <i class="fa fa-plus-circle" aria-hidden="true"></i> add hostname
</span> </span>
</div> </div>
@ -270,6 +277,7 @@
ng-change="$ctrl.onChangeIngressHostname()" ng-change="$ctrl.onChangeIngressHostname()"
placeholder="foo" placeholder="foo"
required required
data-cy="namespaceCreate-hostnameInput{{ ic.IngressClass.Name }}_{{ $index }}"
/> />
</div> </div>
<div class="col-sm-1 input-group input-group-sm" ng-if="$index > 0"> <div class="col-sm-1 input-group input-group-sm" ng-if="$index > 0">
@ -306,17 +314,19 @@
> >
</portainer-tooltip> </portainer-tooltip>
</label> </label>
<label class="switch" style="margin-left: 20px;"> <input type="checkbox" ng-model="ic.RewriteTarget" /><i></i> </label> <label class="switch" style="margin-left: 20px;">
<input type="checkbox" ng-model="ic.RewriteTarget" /><i data-cy="namespaceCreate-redirectRoutesToggle{{ ic.IngressClass.Name }}"></i>
</label>
</div> </div>
</div> </div>
</div> </div>
<div ng-repeat-end class="form-group" ng-if="ic.Selected" style="margin-bottom: 20px;"> <div ng-repeat-end class="form-group" ng-if="ic.Selected" style="margin-bottom: 20px;">
<div class="col-sm-12"> <div class="col-sm-12">
<p> <p>
<a class="small interactive" ng-if="!ic.AdvancedConfig" ng-click="ic.AdvancedConfig = true"> <a class="small interactive" ng-if="!ic.AdvancedConfig" ng-click="ic.AdvancedConfig = true" data-cy="namespaceCreate-advancedConfig{{ ic.IngressClass.Name }}">
<i class="fa fa-plus space-right" aria-hidden="true"></i> Advanced configuration <i class="fa fa-plus space-right" aria-hidden="true"></i> Advanced configuration
</a> </a>
<a class="small interactive" ng-if="ic.AdvancedConfig" ng-click="ic.AdvancedConfig = false"> <a class="small interactive" ng-if="ic.AdvancedConfig" ng-click="ic.AdvancedConfig = false" data-cy="namespaceCreate-hideConfig{{ ic.IngressClass.Name }}">
<i class="fa fa-minus space-right" aria-hidden="true"></i> Hide configuration <i class="fa fa-minus space-right" aria-hidden="true"></i> Hide configuration
</a> </a>
</p> </p>
@ -331,7 +341,12 @@
<div class="col-sm-12" ng-if="ic.AdvancedConfig"> <div class="col-sm-12" ng-if="ic.AdvancedConfig">
<label class="control-label text-left">Annotations</label> <label class="control-label text-left">Annotations</label>
<span class="label label-default interactive" style="margin-left: 10px;" ng-click="$ctrl.addAnnotation(ic)"> <span
class="label label-default interactive"
style="margin-left: 10px;"
ng-click="$ctrl.addAnnotation(ic)"
data-cy="namespaceCreate-addAnnotation{{ ic.IngressClass.Name }}"
>
<i class="fa fa-plus-circle" aria-hidden="true"></i> add annotation <i class="fa fa-plus-circle" aria-hidden="true"></i> add annotation
</span> </span>
</div> </div>
@ -340,14 +355,33 @@
<div ng-repeat="annotation in ic.Annotations track by $index" style="margin-top: 2px;"> <div ng-repeat="annotation in ic.Annotations track by $index" style="margin-top: 2px;">
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">Key</span> <span class="input-group-addon">Key</span>
<input type="text" class="form-control" ng-model="annotation.Key" placeholder="nginx.ingress.kubernetes.io/rewrite-target" required /> <input
type="text"
class="form-control"
ng-model="annotation.Key"
placeholder="nginx.ingress.kubernetes.io/rewrite-target"
required
data-cy="namespaceCreate-annotationKey{{ ic.IngressClass.Name }}"
/>
</div> </div>
<div class="input-group col-sm-5 input-group-sm"> <div class="input-group col-sm-5 input-group-sm">
<span class="input-group-addon">Value</span> <span class="input-group-addon">Value</span>
<input type="text" class="form-control" ng-model="annotation.Value" placeholder="/$1" required /> <input
type="text"
class="form-control"
ng-model="annotation.Value"
placeholder="/$1"
required
data-cy="namespaceCreate-annotationValue{{ ic.IngressClass.Name }}"
/>
</div> </div>
<div class="col-sm-1 input-group input-group-sm"> <div class="col-sm-1 input-group input-group-sm">
<button class="btn btn-sm btn-danger" type="button" ng-click="$ctrl.removeAnnotation(ic, $index)"> <button
class="btn btn-sm btn-danger"
type="button"
ng-click="$ctrl.removeAnnotation(ic, $index)"
data-cy="namespaceCreate-deleteAnnotationButton{{ ic.IngressClass.Name }}"
>
<i class="fa fa-trash-alt" aria-hidden="true"></i> <i class="fa fa-trash-alt" aria-hidden="true"></i>
</button> </button>
</div> </div>
@ -392,6 +426,7 @@
helper-elements="filter" helper-elements="filter"
search-property="Name" search-property="Name"
translation="{nothingSelected: 'Select one or more registry', search: 'Search...'}" translation="{nothingSelected: 'Select one or more registry', search: 'Search...'}"
data-cy="namespaceCreate-registrySelect"
> >
</span> </span>
</div> </div>

View File

@ -117,7 +117,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -127,7 +127,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -13,14 +13,14 @@
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<uib-tabset active="ctrl.state.activeTab" justified="true" type="pills"> <uib-tabset active="ctrl.state.activeTab" justified="true" type="pills">
<uib-tab index="0" classes="btn-sm" select="ctrl.selectTab(0)"> <uib-tab index="0" classes="btn-sm" select="ctrl.selectTab(0)">
<uib-tab-heading> <i class="fa fa-database space-right" aria-hidden="true"></i> Volume </uib-tab-heading> <uib-tab-heading data-cy="k8sVolDetail-volTab"> <i class="fa fa-database space-right" aria-hidden="true"></i> Volume </uib-tab-heading>
<div style="padding: 20px;"> <div style="padding: 20px;">
<table class="table"> <table class="table">
<tbody> <tbody>
<tr> <tr>
<td>Name</td> <td>Name</td>
<td> <td data-cy="k8sVolDetail-volName">
{{ ctrl.volume.PersistentVolumeClaim.Name }} {{ ctrl.volume.PersistentVolumeClaim.Name }}
<span class="label label-primary image-tag label-margins" ng-if="!ctrl.isSystemNamespace() && ctrl.isExternalVolume()">external</span> <span class="label label-primary image-tag label-margins" ng-if="!ctrl.isSystemNamespace() && ctrl.isExternalVolume()">external</span>
<span class="label label-warning image-tag label-margins" ng-if="!ctrl.isSystemNamespace() && !ctrl.isUsed()">unused</span> <span class="label label-warning image-tag label-margins" ng-if="!ctrl.isSystemNamespace() && !ctrl.isUsed()">unused</span>
@ -29,17 +29,19 @@
<tr> <tr>
<td>Namespace</td> <td>Namespace</td>
<td> <td>
<a ui-sref="kubernetes.resourcePools.resourcePool({ id: ctrl.volume.ResourcePool.Namespace.Name })">{{ ctrl.volume.ResourcePool.Namespace.Name }}</a> <a ui-sref="kubernetes.resourcePools.resourcePool({ id: ctrl.volume.ResourcePool.Namespace.Name })" data-cy="k8sVolDetail-volNamespace">{{
ctrl.volume.ResourcePool.Namespace.Name
}}</a>
<span style="margin-left: 5px;" class="label label-info image-tag" ng-if="ctrl.isSystemNamespace()">system</span> <span style="margin-left: 5px;" class="label label-info image-tag" ng-if="ctrl.isSystemNamespace()">system</span>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Storage</td> <td>Storage</td>
<td>{{ ctrl.volume.PersistentVolumeClaim.StorageClass.Name }}</td> <td data-cy="k8sVolDetail-volStorageClassname">{{ ctrl.volume.PersistentVolumeClaim.StorageClass.Name }}</td>
</tr> </tr>
<tr> <tr>
<td>Shared Access Policy</td> <td>Shared Access Policy</td>
<td <td data-cy="k8sVolDetail-volAccessPolicy"
>{{ ctrl.state.volumeSharedAccessPolicy }} >{{ ctrl.state.volumeSharedAccessPolicy }}
<portainer-tooltip <portainer-tooltip
position="bottom" position="bottom"
@ -50,11 +52,13 @@
</tr> </tr>
<tr> <tr>
<td>Provisioner</td> <td>Provisioner</td>
<td>{{ ctrl.volume.PersistentVolumeClaim.StorageClass.Provisioner ? ctrl.volume.PersistentVolumeClaim.StorageClass.Provisioner : '-' }}</td> <td data-cy="k8sVolDetail-volProvisioner">{{
ctrl.volume.PersistentVolumeClaim.StorageClass.Provisioner ? ctrl.volume.PersistentVolumeClaim.StorageClass.Provisioner : '-'
}}</td>
</tr> </tr>
<tr> <tr>
<td>Creation date</td> <td>Creation date</td>
<td>{{ ctrl.volume.PersistentVolumeClaim.CreationDate | getisodate }}</td> <td data-cy="k8sVolDetail-volCreatedAt">{{ ctrl.volume.PersistentVolumeClaim.CreationDate | getisodate }}</td>
</tr> </tr>
<tr> <tr>
<td>Size</td> <td>Size</td>
@ -65,6 +69,7 @@
class="btn btn-sm btn-primary" class="btn btn-sm btn-primary"
ng-click="ctrl.state.increaseSize = true" ng-click="ctrl.state.increaseSize = true"
ng-if="ctrl.volume.PersistentVolumeClaim.StorageClass.AllowVolumeExpansion" ng-if="ctrl.volume.PersistentVolumeClaim.StorageClass.AllowVolumeExpansion"
data-cy="k8sVolDetail-increaseSizeButton"
>Increase size</button >Increase size</button
> >
</td> </td>
@ -82,6 +87,7 @@
min="0" min="0"
ng-change="ctrl.onChangeSize()" ng-change="ctrl.onChangeSize()"
required required
data-cy="k8sVolDetail-increaseSizeInput"
/> />
<span class="input-group-addon" style="padding: 0;"> <span class="input-group-addon" style="padding: 0;">
<select <select
@ -89,13 +95,20 @@
ng-change="ctrl.onChangeSize()" ng-change="ctrl.onChangeSize()"
ng-options="unit for unit in ctrl.state.availableSizeUnits" ng-options="unit for unit in ctrl.state.availableSizeUnits"
style="width: 100%; height: 100%;" style="width: 100%; height: 100%;"
data-cy="k8sVolDetail-increaseSizeUnits"
></select> ></select>
</span> </span>
</div> </div>
<button type="button" class="btn btn-sm btn-primary" ng-disabled="!ctrl.sizeIsValid()" ng-click="ctrl.updateVolume()"> <button
type="button"
class="btn btn-sm btn-primary"
ng-disabled="!ctrl.sizeIsValid()"
ng-click="ctrl.updateVolume()"
data-cy="k8sVolDetail-updateSizeConfirm"
>
Update size Update size
</button> </button>
<button type="button" class="btn btn-sm btn-default" ng-click="ctrl.state.increaseSize = false"> <button type="button" class="btn btn-sm btn-default" ng-click="ctrl.state.increaseSize = false" data-cy="k8sVolDetail-cancelUpdateSize">
Cancel Cancel
</button> </button>
</div> </div>
@ -119,7 +132,7 @@
</uib-tab> </uib-tab>
<uib-tab index="1" classes="btn-sm" select="ctrl.selectTab(1)"> <uib-tab index="1" classes="btn-sm" select="ctrl.selectTab(1)">
<uib-tab-heading> <uib-tab-heading data-cy="k8sVolDetail-volEventsTab">
<i class="fa fa-history space-right" aria-hidden="true"></i> Events <i class="fa fa-history space-right" aria-hidden="true"></i> Events
<div ng-if="ctrl.hasEventWarnings()"> <div ng-if="ctrl.hasEventWarnings()">
<i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px;"></i> <i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px;"></i>
@ -140,7 +153,7 @@
</uib-tab> </uib-tab>
<uib-tab index="2" ng-if="ctrl.volume.PersistentVolumeClaim.Yaml" select="ctrl.showEditor()" classes="btn-sm"> <uib-tab index="2" ng-if="ctrl.volume.PersistentVolumeClaim.Yaml" select="ctrl.showEditor()" classes="btn-sm">
<uib-tab-heading> <i class="fa fa-code space-right" aria-hidden="true"></i> YAML </uib-tab-heading> <uib-tab-heading data-cy="k8sVolDetail-volYamlTab"> <i class="fa fa-code space-right" aria-hidden="true"></i> YAML </uib-tab-heading>
<div style="padding-right: 25px;" ng-if="ctrl.state.showEditorTab"> <div style="padding-right: 25px;" ng-if="ctrl.state.showEditorTab">
<kubernetes-yaml-inspector key="volume-yaml" data="ctrl.volume.PersistentVolumeClaim.Yaml"></kubernetes-yaml-inspector> <kubernetes-yaml-inspector key="volume-yaml" data="ctrl.volume.PersistentVolumeClaim.Yaml"></kubernetes-yaml-inspector>
</div> </div>

View File

@ -81,7 +81,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -115,7 +115,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -82,7 +82,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -116,7 +116,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -231,7 +231,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -67,7 +67,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -67,7 +67,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -100,7 +100,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>

View File

@ -76,7 +76,7 @@
<span style="margin-right: 5px;"> <span style="margin-right: 5px;">
Items per page Items per page
</span> </span>
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
<option value="25">25</option> <option value="25">25</option>