add external-services method to peer repo

This commit is contained in:
Michael Klein 2022-10-06 10:30:30 +02:00
parent d33b5c7bd3
commit 961d0179c7
2 changed files with 79 additions and 25 deletions

View File

@ -1,6 +1,10 @@
import Serializer from './application'; import Serializer from './application';
import { PRIMARY_KEY, SLUG_KEY } from 'consul-ui/models/service'; import { PRIMARY_KEY, SLUG_KEY } from 'consul-ui/models/service';
import { get } from '@ember/object'; import { get } from '@ember/object';
import {
HEADERS_NAMESPACE as HTTP_HEADERS_NAMESPACE,
HEADERS_PARTITION as HTTP_HEADERS_PARTITION,
} from 'consul-ui/utils/http/consul';
export default class ServiceSerializer extends Serializer { export default class ServiceSerializer extends Serializer {
primaryKey = PRIMARY_KEY; primaryKey = PRIMARY_KEY;
@ -13,6 +17,54 @@ export default class ServiceSerializer extends Serializer {
// Services and proxies all come together in the same list. Here we // Services and proxies all come together in the same list. Here we
// map the proxies to their related services on a Service.Proxy // map the proxies to their related services on a Service.Proxy
// property for easy access later on // property for easy access later on
return cb(headers, this._transformServicesPayload(body));
}),
query
);
}
respondForQueryRecord(respond, query) {
// Name is added here from the query, which is used to make the uid
// Datacenter gets added in the ApplicationSerializer
return super.respondForQueryRecord(
(cb) =>
respond((headers, body) => {
return cb(headers, {
Name: query.id,
Namespace: get(body, 'firstObject.Service.Namespace'),
Nodes: body,
});
}),
query
);
}
createJSONApiDocumentFromServicesPayload(headers, responseBody, dc) {
const { primaryKey, slugKey, fingerprint } = this;
const transformedBody = this._transformServicesPayload(responseBody);
const attributes = transformedBody.map(
fingerprint(
primaryKey,
slugKey,
dc,
headers[HTTP_HEADERS_NAMESPACE],
headers[HTTP_HEADERS_PARTITION]
)
);
return {
data: attributes.map((attr) => {
return {
id: attr.uid,
type: 'service',
attributes: attr,
};
}),
};
}
_transformServicesPayload(body) {
const services = {}; const services = {};
body body
.filter(function (item) { .filter(function (item) {
@ -36,26 +88,6 @@ export default class ServiceSerializer extends Serializer {
}); });
} }
}); });
return body;
return cb(headers, body);
}),
query
);
}
respondForQueryRecord(respond, query) {
// Name is added here from the query, which is used to make the uid
// Datacenter gets added in the ApplicationSerializer
return super.respondForQueryRecord(
(cb) =>
respond((headers, body) => {
return cb(headers, {
Name: query.id,
Namespace: get(body, 'firstObject.Service.Namespace'),
Nodes: body,
});
}),
query
);
} }
} }

View File

@ -1,5 +1,6 @@
import RepositoryService from 'consul-ui/services/repository'; import RepositoryService from 'consul-ui/services/repository';
import dataSource from 'consul-ui/decorators/data-source'; import dataSource from 'consul-ui/decorators/data-source';
import { inject as service } from '@ember/service';
function normalizePeerPayload(peerPayload, dc, partition) { function normalizePeerPayload(peerPayload, dc, partition) {
const { const {
@ -18,10 +19,31 @@ function normalizePeerPayload(peerPayload, dc, partition) {
}; };
} }
export default class PeerService extends RepositoryService { export default class PeerService extends RepositoryService {
@service store;
getModelName() { getModelName() {
return 'peer'; return 'peer';
} }
@dataSource('/:partition/:ns/:ds/exported-services/:name')
async fetchExportedServices({ dc, ns, partition, name }, configuration, request) {
return (
await request`
GET /v1/internal/ui/exported-services
${{
peer: name,
}}
`
)((headers, body, cache) => {
const serviceSerializer = this.store.serializerFor('service');
return this.store.push(
serviceSerializer.createJSONApiDocumentFromServicesPayload(headers, body, dc)
);
});
}
@dataSource('/:partition/:ns/:dc/peering/token-for/:name') @dataSource('/:partition/:ns/:dc/peering/token-for/:name')
async fetchToken({ dc, ns, partition, name }, configuration, request) { async fetchToken({ dc, ns, partition, name }, configuration, request) {
return ( return (