diff --git a/web/app/js/components/Tap.jsx b/web/app/js/components/Tap.jsx
index 4392cf0e6..df3d20d55 100644
--- a/web/app/js/components/Tap.jsx
+++ b/web/app/js/components/Tap.jsx
@@ -41,6 +41,7 @@ class Tap extends React.Component {
tapResultsById: {},
tapResultFilterOptions: this.getInitialTapFilterOptions(),
resourcesByNs: {},
+ authoritiesByNs: {},
query: {
resource: "",
namespace: "",
@@ -57,6 +58,7 @@ class Tap extends React.Component {
resource: [],
toNamespace: [],
toResource: [],
+ authority: []
},
maxLinesToDisplay: 40,
awaitingWebSocketConnection: false,
@@ -131,18 +133,34 @@ class Tap extends React.Component {
getResourcesByNs(rsp) {
let statTables = _.get(rsp, [0, "ok", "statTables"]);
- return _.reduce(statTables, (mem, table) => {
+ let authoritiesByNs = {};
+ let resourcesByNs = _.reduce(statTables, (mem, table) => {
_.map(table.podGroup.rows, row => {
if (!mem[row.resource.namespace]) {
mem[row.resource.namespace] = [];
+ authoritiesByNs[row.resource.namespace] = [];
}
- if (row.resource.type.toLowerCase() !== "service") {
- mem[row.resource.namespace].push(`${row.resource.type}/${row.resource.name}`);
+ switch (row.resource.type.toLowerCase()) {
+ case "service":
+ break;
+ case "authority":
+ authoritiesByNs[row.resource.namespace].push(row.resource.name);
+ break;
+ default:
+ mem[row.resource.namespace].push(`${row.resource.type}/${row.resource.name}`);
}
});
return mem;
}, {});
+ return {
+ authoritiesByNs,
+ resourcesByNs
+ };
+ }
+
+ getResourceList(resourcesByNs, ns) {
+ return resourcesByNs[ns] || _.uniq(_.flatten(_.values(resourcesByNs)));
}
parseTapResult = data => {
@@ -307,7 +325,7 @@ class Tap extends React.Component {
this.ws.close(1000);
}
- handleFormChange = (name, scopeResource) => {
+ handleFormChange = (name, scopeResource, shouldScopeAuthority) => {
let state = {
query: this.state.query,
autocomplete: this.state.autocomplete
@@ -319,6 +337,9 @@ class Tap extends React.Component {
// scope the available typeahead resources to the selected namespace
state.autocomplete[scopeResource] = this.state.resourcesByNs[formVal];
}
+ if (shouldScopeAuthority) {
+ state.autocomplete.authority = this.state.authoritiesByNs[formVal];
+ }
this.setState(state);
};
@@ -354,20 +375,21 @@ class Tap extends React.Component {
this.api.setCurrentRequests([this.api.fetchMetrics(url)]);
this.serverPromise = Promise.all(this.api.getCurrentPromises())
.then(rsp => {
- let resourcesByNs = this.getResourcesByNs(rsp);
+ let { resourcesByNs, authoritiesByNs } = this.getResourcesByNs(rsp);
let namespaces = _.sortBy(_.keys(resourcesByNs));
- let resourceNames = resourcesByNs[this.state.query.namespace] ||
- _.uniq(_.flatten(_.values(resourcesByNs)));
- let toResourceNames = resourcesByNs[this.state.query.toNamespace] ||
- _.uniq(_.flatten(_.values(resourcesByNs)));
+ let resourceNames = this.getResourceList(resourcesByNs, this.state.query.namespace);
+ let toResourceNames = this.getResourceList(resourcesByNs, this.state.query.toNamespace);
+ let authorities = this.getResourceList(authoritiesByNs, this.state.query.namespace);
this.setState({
resourcesByNs,
+ authoritiesByNs,
autocomplete: {
namespace: namespaces,
resource: resourceNames,
toNamespace: namespaces,
- toResource: toResourceNames
+ toResource: toResourceNames,
+ authority: authorities
},
pendingRequests: false
});
@@ -397,7 +419,7 @@ class Tap extends React.Component {
allowClear
placeholder="Namespace"
optionFilterProp="children"
- onChange={this.handleFormChange("namespace", "resource")}>
+ onChange={this.handleFormChange("namespace", "resource", true)}>
{
_.map(this.state.autocomplete.namespace, (n, i) => (