refactor(kube/namespaces): remove unused ingresses table [EE-6448] (#11029)
parent
946166319f
commit
d99486ee72
|
@ -1,74 +0,0 @@
|
||||||
import _ from 'lodash-es';
|
|
||||||
|
|
||||||
angular.module('portainer.kubernetes').controller('KubernetesResourcePoolIngressesDatatableController', function ($scope, $controller, DatatableService) {
|
|
||||||
angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));
|
|
||||||
this.state = Object.assign(this.state, {
|
|
||||||
expandedItems: [],
|
|
||||||
expandAll: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.onSettingsRepeaterChange = function () {
|
|
||||||
DatatableService.setDataTableSettings(this.tableKey, this.settings);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.expandItem = function (item, expanded) {
|
|
||||||
if (!this.itemCanExpand(item)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
item.Expanded = expanded;
|
|
||||||
if (!expanded) {
|
|
||||||
item.Highlighted = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.itemCanExpand = function (item) {
|
|
||||||
return item.Paths.length > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.hasExpandableItems = function () {
|
|
||||||
return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.expandAll = function () {
|
|
||||||
this.state.expandAll = !this.state.expandAll;
|
|
||||||
_.forEach(this.state.filteredDataSet, (item) => {
|
|
||||||
if (this.itemCanExpand(item)) {
|
|
||||||
this.expandItem(item, this.state.expandAll);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$onInit = function () {
|
|
||||||
this.setDefaults();
|
|
||||||
this.prepareTableFromDataset();
|
|
||||||
|
|
||||||
this.state.orderBy = this.orderBy;
|
|
||||||
var storedOrder = DatatableService.getDataTableOrder(this.tableKey);
|
|
||||||
if (storedOrder !== null) {
|
|
||||||
this.state.reverseOrder = storedOrder.reverse;
|
|
||||||
this.state.orderBy = storedOrder.orderBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);
|
|
||||||
if (textFilter !== null) {
|
|
||||||
this.state.textFilter = textFilter;
|
|
||||||
this.onTextFilterChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
var storedFilters = DatatableService.getDataTableFilters(this.tableKey);
|
|
||||||
if (storedFilters !== null) {
|
|
||||||
this.filters = storedFilters;
|
|
||||||
}
|
|
||||||
if (this.filters && this.filters.state) {
|
|
||||||
this.filters.state.open = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var storedSettings = DatatableService.getDataTableSettings(this.tableKey);
|
|
||||||
if (storedSettings !== null) {
|
|
||||||
this.settings = storedSettings;
|
|
||||||
this.settings.open = false;
|
|
||||||
}
|
|
||||||
this.onSettingsRepeaterChange();
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -1,13 +0,0 @@
|
||||||
angular.module('portainer.kubernetes').component('kubernetesResourcePoolIngressesDatatable', {
|
|
||||||
templateUrl: './template.html',
|
|
||||||
controller: 'KubernetesResourcePoolIngressesDatatableController',
|
|
||||||
bindings: {
|
|
||||||
titleText: '@',
|
|
||||||
titleIcon: '@',
|
|
||||||
dataset: '<',
|
|
||||||
tableKey: '@',
|
|
||||||
orderBy: '@',
|
|
||||||
reverseOrder: '<',
|
|
||||||
refreshCallback: '<',
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -1,142 +0,0 @@
|
||||||
<div class="datatable">
|
|
||||||
<rd-widget>
|
|
||||||
<rd-widget-body classes="no-padding">
|
|
||||||
<div class="toolBar">
|
|
||||||
<div class="toolBarTitle vertical-center">
|
|
||||||
<div class="widget-icon space-right">
|
|
||||||
<pr-icon icon="$ctrl.titleIcon"></pr-icon>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{ $ctrl.titleText }}
|
|
||||||
</div>
|
|
||||||
<div class="searchBar vertical-center">
|
|
||||||
<pr-icon icon="'search'" class="searchIcon"></pr-icon>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="searchInput"
|
|
||||||
ng-model="$ctrl.state.textFilter"
|
|
||||||
ng-change="$ctrl.onTextFilterChange()"
|
|
||||||
placeholder="Search for an ingress..."
|
|
||||||
auto-focus
|
|
||||||
ng-model-options="{ debounce: 300 }"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="settings">
|
|
||||||
<span class="setting" ng-class="{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.settings.open">
|
|
||||||
<span uib-dropdown-toggle><pr-icon icon="'more-vertical'"></pr-icon></span>
|
|
||||||
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
|
|
||||||
<div class="tableMenu">
|
|
||||||
<div class="menuHeader"> Table settings </div>
|
|
||||||
<div class="menuContent">
|
|
||||||
<div>
|
|
||||||
<div class="md-checkbox">
|
|
||||||
<input id="setting_auto_refresh" type="checkbox" ng-model="$ctrl.settings.repeater.autoRefresh" ng-change="$ctrl.onSettingsRepeaterChange()" />
|
|
||||||
<label for="setting_auto_refresh">Auto refresh</label>
|
|
||||||
</div>
|
|
||||||
<div ng-if="$ctrl.settings.repeater.autoRefresh">
|
|
||||||
<label for="settings_refresh_rate"> Refresh rate </label>
|
|
||||||
<select id="settings_refresh_rate" ng-model="$ctrl.settings.repeater.refreshRate" ng-change="$ctrl.onSettingsRepeaterChange()" class="small-select">
|
|
||||||
<option value="10">10s</option>
|
|
||||||
<option value="30">30s</option>
|
|
||||||
<option value="60">1min</option>
|
|
||||||
<option value="120">2min</option>
|
|
||||||
<option value="300">5min</option>
|
|
||||||
</select>
|
|
||||||
<span>
|
|
||||||
<pr-icon id="refreshRateChange" style="display: none" icon="'check'" mode="'success'"></pr-icon>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.settings.open = false;">Close</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="table-hover nowrap-cells table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th ng-if="$ctrl.hasExpandableItems()" class="datatable-wide dropdown">
|
|
||||||
<div class="vertical-center cursor-pointer" ng-click="$ctrl.expandAll()">
|
|
||||||
<pr-icon ng-if="$ctrl.state.expandAll" icon="'chevron-down'"></pr-icon>
|
|
||||||
<pr-icon ng-if="!$ctrl.state.expandAll" icon="'chevron-right'"></pr-icon>
|
|
||||||
</div>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
<table-column-header
|
|
||||||
col-title="'Name'"
|
|
||||||
can-sort="true"
|
|
||||||
is-sorted="$ctrl.state.orderBy === 'Name'"
|
|
||||||
is-sorted-desc="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"
|
|
||||||
ng-click="$ctrl.changeOrderBy('Name')"
|
|
||||||
></table-column-header>
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr
|
|
||||||
dir-paginate-start="item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))"
|
|
||||||
ng-class="{ active: item.Checked, 'datatable-highlighted': item.Highlighted }"
|
|
||||||
ng-click="$ctrl.expandItem(item, !item.Expanded)"
|
|
||||||
pagination-id="$ctrl.tableKey"
|
|
||||||
>
|
|
||||||
<td ng-if="$ctrl.hasExpandableItems()">
|
|
||||||
<div ng-if="$ctrl.itemCanExpand(item)" class="vertical-center">
|
|
||||||
<pr-icon ng-if="item.Expanded" icon="'chevron-down'"></pr-icon>
|
|
||||||
<pr-icon ng-if="!item.Expanded" icon="'chevron-right'"></pr-icon>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>{{ item.Name }}</td>
|
|
||||||
<td>{{ item.size }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr
|
|
||||||
dir-paginate-end
|
|
||||||
ng-show="item.Expanded"
|
|
||||||
ng-repeat="path in item.Paths"
|
|
||||||
ng-class="{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }"
|
|
||||||
>
|
|
||||||
<td>
|
|
||||||
<a style="margin-left: 15px" ng-href="http://{{ path.Host ? path.Host : path.IP }}{{ path.Path }}" target="_blank">
|
|
||||||
{{ path.Host ? path.Host : path.IP }}{{ path.Path }}
|
|
||||||
</a>
|
|
||||||
<span ng-if="path.ApplicationName !== '-'">
|
|
||||||
<pr-icon icon="'arrow-right'" class-name="'m-0.5'"></pr-icon>
|
|
||||||
<a ui-sref="kubernetes.applications.application({ name: path.ApplicationName, namespace: item.Namespace })">{{ path.ApplicationName }}</a>
|
|
||||||
</span>
|
|
||||||
<span class="label label-warning image-tag label-margins" ng-if="path.ApplicationName === '-'">unused</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr ng-if="!$ctrl.dataset">
|
|
||||||
<td colspan="4" class="text-muted text-center">Loading...</td>
|
|
||||||
</tr>
|
|
||||||
<tr ng-if="$ctrl.state.filteredDataSet.length === 0">
|
|
||||||
<td colspan="4" class="text-muted text-center">No ingresses available.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="footer" ng-if="$ctrl.dataset">
|
|
||||||
<div class="infoBar" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>
|
|
||||||
<div class="paginationControls">
|
|
||||||
<form class="form-inline">
|
|
||||||
<span class="limitSelector">
|
|
||||||
<span style="margin-right: 5px"> Items per page </span>
|
|
||||||
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
|
|
||||||
<option value="0">All</option>
|
|
||||||
<option value="10">10</option>
|
|
||||||
<option value="25">25</option>
|
|
||||||
<option value="50">50</option>
|
|
||||||
<option value="100">100</option>
|
|
||||||
</select>
|
|
||||||
</span>
|
|
||||||
<dir-pagination-controls max-size="5" pagination-id="$ctrl.tableKey"></dir-pagination-controls>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</rd-widget-body>
|
|
||||||
</rd-widget>
|
|
||||||
</div>
|
|
|
@ -323,19 +323,4 @@
|
||||||
</kubernetes-resource-pool-applications-datatable>
|
</kubernetes-resource-pool-applications-datatable>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row" ng-if="ctrl.ingresses && ctrl.ingresses.length > 0">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<kubernetes-resource-pool-ingresses-datatable
|
|
||||||
dataset="ctrl.ingresses"
|
|
||||||
table-key="kubernetes.resourcepool.ingresses"
|
|
||||||
order-by="Name"
|
|
||||||
refresh-callback="ctrl.getIngresses"
|
|
||||||
loading="ctrl.state.ingressesLoading"
|
|
||||||
title-text="Ingress routes and applications"
|
|
||||||
title-icon="database"
|
|
||||||
>
|
|
||||||
</kubernetes-resource-pool-ingresses-datatable>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,8 +6,7 @@ import KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceRese
|
||||||
import { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';
|
import { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';
|
||||||
import KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';
|
import KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';
|
||||||
|
|
||||||
import { KubernetesResourcePoolFormValues, KubernetesResourcePoolIngressClassHostFormValue } from 'Kubernetes/models/resource-pool/formValues';
|
import { KubernetesResourcePoolFormValues } from 'Kubernetes/models/resource-pool/formValues';
|
||||||
import { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';
|
|
||||||
import { KubernetesFormValidationReferences } from 'Kubernetes/models/application/formValues';
|
import { KubernetesFormValidationReferences } from 'Kubernetes/models/application/formValues';
|
||||||
import { KubernetesIngressClassTypes } from 'Kubernetes/ingress/constants';
|
import { KubernetesIngressClassTypes } from 'Kubernetes/ingress/constants';
|
||||||
import KubernetesResourceQuotaConverter from 'Kubernetes/converters/resourceQuota';
|
import KubernetesResourceQuotaConverter from 'Kubernetes/converters/resourceQuota';
|
||||||
|
@ -269,30 +268,6 @@ class KubernetesResourcePoolController {
|
||||||
}
|
}
|
||||||
/* #endregion */
|
/* #endregion */
|
||||||
|
|
||||||
/* #region GET INGRESSES */
|
|
||||||
getIngresses() {
|
|
||||||
return this.$async(async () => {
|
|
||||||
this.state.ingressesLoading = true;
|
|
||||||
try {
|
|
||||||
const namespace = this.pool.Namespace.Name;
|
|
||||||
this.allIngresses = await this.KubernetesIngressService.get(this.state.hasWriteAuthorization ? '' : namespace);
|
|
||||||
this.ingresses = _.filter(this.allIngresses, { Namespace: namespace });
|
|
||||||
_.forEach(this.ingresses, (ing) => {
|
|
||||||
ing.Namespace = namespace;
|
|
||||||
_.forEach(ing.Paths, (path) => {
|
|
||||||
const application = _.find(this.applications, { ServiceName: path.ServiceName });
|
|
||||||
path.ApplicationName = application && application.Name ? application.Name : '-';
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
this.Notifications.error('Failure', err, 'Unable to retrieve ingresses.');
|
|
||||||
} finally {
|
|
||||||
this.state.ingressesLoading = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/* #endregion */
|
|
||||||
|
|
||||||
/* #region GET REGISTRIES */
|
/* #region GET REGISTRIES */
|
||||||
getRegistries() {
|
getRegistries() {
|
||||||
return this.$async(async () => {
|
return this.$async(async () => {
|
||||||
|
@ -359,7 +334,6 @@ class KubernetesResourcePoolController {
|
||||||
ingressesLoading: true,
|
ingressesLoading: true,
|
||||||
viewReady: false,
|
viewReady: false,
|
||||||
eventWarningCount: 0,
|
eventWarningCount: 0,
|
||||||
canUseIngress: false,
|
|
||||||
useServerMetrics: this.endpoint.Kubernetes.Configuration.UseServerMetrics,
|
useServerMetrics: this.endpoint.Kubernetes.Configuration.UseServerMetrics,
|
||||||
duplicates: {
|
duplicates: {
|
||||||
ingressHosts: new KubernetesFormValidationReferences(),
|
ingressHosts: new KubernetesFormValidationReferences(),
|
||||||
|
@ -407,17 +381,6 @@ class KubernetesResourcePoolController {
|
||||||
await this.getEvents();
|
await this.getEvents();
|
||||||
await this.getApplications();
|
await this.getApplications();
|
||||||
|
|
||||||
if (this.state.canUseIngress) {
|
|
||||||
await this.getIngresses();
|
|
||||||
const ingressClasses = this.endpoint.Kubernetes.Configuration.IngressClasses;
|
|
||||||
this.formValues.IngressClasses = KubernetesIngressConverter.ingressClassesToFormValues(ingressClasses, this.ingresses);
|
|
||||||
_.forEach(this.formValues.IngressClasses, (ic) => {
|
|
||||||
if (ic.Hosts.length === 0) {
|
|
||||||
ic.Hosts.push(new KubernetesResourcePoolIngressClassHostFormValue());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.getRegistries();
|
await this.getRegistries();
|
||||||
|
|
||||||
this.savedFormValues = angular.copy(this.formValues);
|
this.savedFormValues = angular.copy(this.formValues);
|
||||||
|
|
Loading…
Reference in New Issue