Merge pull request #22497 from jamieklassen/cluster-title
'title' field for Kubernetes clusters
This commit is contained in:
+2
@@ -43,6 +43,8 @@ export interface Config {
|
||||
url: string;
|
||||
/** @visibility frontend */
|
||||
name: string;
|
||||
/** @visibility frontend */
|
||||
title?: string;
|
||||
/** @visibility secret */
|
||||
serviceAccountToken?: string;
|
||||
/** @visibility frontend */
|
||||
|
||||
@@ -43,6 +43,7 @@ const mockCatalogApi = {
|
||||
'kubernetes.io/dashboard-app': 'my-app',
|
||||
},
|
||||
name: 'owned',
|
||||
title: 'title',
|
||||
namespace: 'default',
|
||||
},
|
||||
},
|
||||
|
||||
@@ -63,6 +63,7 @@ export class CatalogClusterLocator implements KubernetesClustersSupplier {
|
||||
const annotations = entity.metadata.annotations!;
|
||||
const clusterDetails: ClusterDetails = {
|
||||
name: entity.metadata.name,
|
||||
title: entity.metadata.title,
|
||||
url: annotations[ANNOTATION_KUBERNETES_API_SERVER],
|
||||
authMetadata: annotations,
|
||||
caData: annotations[ANNOTATION_KUBERNETES_API_SERVER_CA],
|
||||
|
||||
@@ -21,8 +21,8 @@ import {
|
||||
ANNOTATION_KUBERNETES_AWS_ASSUME_ROLE,
|
||||
ANNOTATION_KUBERNETES_AWS_EXTERNAL_ID,
|
||||
} from '@backstage/plugin-kubernetes-common';
|
||||
import { ClusterDetails } from '@backstage/plugin-kubernetes-node';
|
||||
import { ConfigClusterLocator } from './ConfigClusterLocator';
|
||||
import { ClusterDetails } from '../types/types';
|
||||
import { AuthenticationStrategy } from '../auth';
|
||||
|
||||
describe('ConfigClusterLocator', () => {
|
||||
@@ -78,6 +78,28 @@ describe('ConfigClusterLocator', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it('reads `title` property', async () => {
|
||||
const sut = ConfigClusterLocator.fromConfig(
|
||||
new ConfigReader({
|
||||
clusters: [
|
||||
{
|
||||
name: 'cluster-name',
|
||||
title: 'cluster-title',
|
||||
url: 'url',
|
||||
authMetadata: { 'kubernetes.io/auth-provider': 'serviceAccount' },
|
||||
},
|
||||
],
|
||||
}),
|
||||
authStrategy,
|
||||
);
|
||||
|
||||
const result = await sut.getClusters();
|
||||
|
||||
expect(result).toEqual([
|
||||
expect.objectContaining({ title: 'cluster-title' }),
|
||||
]);
|
||||
});
|
||||
|
||||
it('two clusters returns two cluster details', async () => {
|
||||
const config: Config = new ConfigReader({
|
||||
clusters: [
|
||||
|
||||
@@ -56,8 +56,10 @@ export class ConfigClusterLocator implements KubernetesClustersSupplier {
|
||||
`'authMetadata.${ANNOTATION_KUBERNETES_AUTH_PROVIDER}' parameter`,
|
||||
);
|
||||
}
|
||||
const title = c.getOptionalString('title');
|
||||
const clusterDetails: ClusterDetails = {
|
||||
name,
|
||||
...(title && { title }),
|
||||
url: c.getString('url'),
|
||||
skipTLSVerify: c.getOptionalBoolean('skipTLSVerify') ?? false,
|
||||
skipMetricsLookup: c.getOptionalBoolean('skipMetricsLookup') ?? false,
|
||||
|
||||
+2
@@ -19,6 +19,7 @@ exports[`CatalogClusterLocator returns the aws cluster details provided by annot
|
||||
"name": "owned",
|
||||
"skipMetricsLookup": false,
|
||||
"skipTLSVerify": false,
|
||||
"title": undefined,
|
||||
"url": "https://apiserver.com",
|
||||
}
|
||||
`;
|
||||
@@ -42,6 +43,7 @@ exports[`CatalogClusterLocator returns the cluster details provided by annotatio
|
||||
"name": "owned",
|
||||
"skipMetricsLookup": true,
|
||||
"skipTLSVerify": true,
|
||||
"title": "title",
|
||||
"url": "https://apiserver.com",
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -278,6 +278,32 @@ describe('API integration tests', () => {
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it('surfaces cluster title', async () => {
|
||||
const { server } = await startTestBackend({
|
||||
features: [
|
||||
minimalValidConfigService,
|
||||
import('@backstage/plugin-kubernetes-backend/alpha'),
|
||||
withClusters([
|
||||
{
|
||||
name: 'cluster-name',
|
||||
title: 'cluster-title',
|
||||
url: 'url',
|
||||
authMetadata: {
|
||||
[ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount',
|
||||
},
|
||||
},
|
||||
]),
|
||||
],
|
||||
});
|
||||
app = server;
|
||||
|
||||
const response = await request(app).get('/api/kubernetes/clusters');
|
||||
|
||||
expect(response.body).toEqual({
|
||||
items: [expect.objectContaining({ title: 'cluster-title' })],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('post /services/:serviceId', () => {
|
||||
|
||||
@@ -381,6 +381,7 @@ export class KubernetesBuilder {
|
||||
|
||||
return {
|
||||
name: cd.name,
|
||||
title: cd.title,
|
||||
dashboardUrl: cd.dashboardUrl,
|
||||
authProvider,
|
||||
...(oidcTokenProvider && { oidcTokenProvider }),
|
||||
|
||||
@@ -29,6 +29,7 @@ import { rest } from 'msw';
|
||||
import { setupServer } from 'msw/node';
|
||||
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
|
||||
import {
|
||||
FetchResponse,
|
||||
KubernetesRequestAuth,
|
||||
ObjectsByEntityResponse,
|
||||
} from '@backstage/plugin-kubernetes-common';
|
||||
@@ -104,7 +105,7 @@ describe('KubernetesFanOutHandler', () => {
|
||||
],
|
||||
};
|
||||
|
||||
const mockClusterResourceMap = {
|
||||
const mockClusterResourceMap: Record<string, FetchResponse[]> = {
|
||||
'test-cluster': [
|
||||
{
|
||||
resources: [
|
||||
@@ -358,17 +359,16 @@ describe('KubernetesFanOutHandler', () => {
|
||||
|
||||
describe('getKubernetesObjectsByEntity', () => {
|
||||
it('retrieve objects for one cluster', async () => {
|
||||
getClustersByEntity.mockImplementation(() =>
|
||||
Promise.resolve({
|
||||
clusters: [
|
||||
{
|
||||
name: 'test-cluster',
|
||||
url: '',
|
||||
authMetadata: {},
|
||||
},
|
||||
],
|
||||
}),
|
||||
);
|
||||
getClustersByEntity.mockResolvedValue({
|
||||
clusters: [
|
||||
{
|
||||
name: 'test-cluster',
|
||||
title: 'cluster-title',
|
||||
url: '',
|
||||
authMetadata: {},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
sut = getKubernetesFanOutHandler([]);
|
||||
|
||||
@@ -386,11 +386,12 @@ describe('KubernetesFanOutHandler', () => {
|
||||
new Set(['ns-test-component-test-cluster']),
|
||||
expect.anything(),
|
||||
);
|
||||
expect(result).toStrictEqual({
|
||||
expect(result).toStrictEqual<ObjectsByEntityResponse>({
|
||||
items: [
|
||||
{
|
||||
cluster: {
|
||||
name: 'test-cluster',
|
||||
title: 'cluster-title',
|
||||
},
|
||||
errors: [],
|
||||
podMetrics: [POD_METRICS_FIXTURE],
|
||||
|
||||
@@ -335,6 +335,7 @@ export class KubernetesFanOutHandler {
|
||||
const objects: ClusterObjects = {
|
||||
cluster: {
|
||||
name: clusterDetails.name,
|
||||
...(clusterDetails.title && { title: clusterDetails.title }),
|
||||
},
|
||||
podMetrics: toClientSafePodMetrics(metrics),
|
||||
resources: result.responses,
|
||||
|
||||
Reference in New Issue
Block a user