change dashboardParameters signature after code review
Signed-off-by: Morgan Martinet <morgan.martinet@montreal.ca>
This commit is contained in:
@@ -39,6 +39,7 @@ kubernetes:
|
||||
region: 'europe-west1'
|
||||
skipTLSVerify: true
|
||||
skipMetricsLookup: true
|
||||
exposeDashboard: true
|
||||
```
|
||||
|
||||
### `serviceLocatorMethod`
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
import { Config } from '@backstage/config';
|
||||
import express from 'express';
|
||||
import type { FetchResponse } from '@backstage/plugin-kubernetes-common';
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import type { KubernetesFetchError } from '@backstage/plugin-kubernetes-common';
|
||||
import type { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';
|
||||
import { Logger as Logger_2 } from 'winston';
|
||||
@@ -31,7 +32,7 @@ export interface ClusterDetails {
|
||||
// (undocumented)
|
||||
caData?: string | undefined;
|
||||
dashboardApp?: string;
|
||||
dashboardParameters?: any;
|
||||
dashboardParameters?: JsonObject;
|
||||
dashboardUrl?: string;
|
||||
name: string;
|
||||
// (undocumented)
|
||||
|
||||
@@ -176,4 +176,76 @@ describe('ConfigClusterLocator', () => {
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it('one cluster with dashboardParameters', async () => {
|
||||
const config: Config = new ConfigReader({
|
||||
clusters: [
|
||||
{
|
||||
name: 'cluster1',
|
||||
url: 'http://localhost:8080',
|
||||
authProvider: 'serviceAccount',
|
||||
dashboardApp: 'gke',
|
||||
dashboardParameters: {
|
||||
projectId: 'some-project',
|
||||
region: 'some-region',
|
||||
clusterName: 'cluster1',
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const sut = ConfigClusterLocator.fromConfig(config);
|
||||
|
||||
const result = await sut.getClusters();
|
||||
|
||||
expect(result).toStrictEqual([
|
||||
{
|
||||
name: 'cluster1',
|
||||
serviceAccountToken: undefined,
|
||||
url: 'http://localhost:8080',
|
||||
authProvider: 'serviceAccount',
|
||||
skipMetricsLookup: false,
|
||||
skipTLSVerify: false,
|
||||
caData: undefined,
|
||||
dashboardApp: 'gke',
|
||||
dashboardParameters: {
|
||||
projectId: 'some-project',
|
||||
region: 'some-region',
|
||||
clusterName: 'cluster1',
|
||||
},
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it('one cluster with dashboardUrl', async () => {
|
||||
const config: Config = new ConfigReader({
|
||||
clusters: [
|
||||
{
|
||||
name: 'cluster1',
|
||||
url: 'http://localhost:8080',
|
||||
authProvider: 'serviceAccount',
|
||||
dashboardApp: 'standard',
|
||||
dashboardUrl: 'http://someurl',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const sut = ConfigClusterLocator.fromConfig(config);
|
||||
|
||||
const result = await sut.getClusters();
|
||||
|
||||
expect(result).toStrictEqual([
|
||||
{
|
||||
name: 'cluster1',
|
||||
serviceAccountToken: undefined,
|
||||
url: 'http://localhost:8080',
|
||||
authProvider: 'serviceAccount',
|
||||
skipMetricsLookup: false,
|
||||
skipTLSVerify: false,
|
||||
caData: undefined,
|
||||
dashboardApp: 'standard',
|
||||
dashboardUrl: 'http://someurl',
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -47,9 +47,8 @@ export class ConfigClusterLocator implements KubernetesClustersSupplier {
|
||||
if (dashboardApp) {
|
||||
clusterDetails.dashboardApp = dashboardApp;
|
||||
}
|
||||
const dashboardParameters = c.getOptionalString('dashboardParameters');
|
||||
if (dashboardParameters) {
|
||||
clusterDetails.dashboardParameters = dashboardParameters;
|
||||
if (c.has('dashboardParameters')) {
|
||||
clusterDetails.dashboardParameters = c.get('dashboardParameters');
|
||||
}
|
||||
|
||||
switch (authProvider) {
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
import { Logger } from 'winston';
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import type {
|
||||
FetchResponse,
|
||||
KubernetesFetchError,
|
||||
@@ -135,7 +136,7 @@ export interface ClusterDetails {
|
||||
* This is used by the GKE formatter which requires the project, region and cluster name.
|
||||
* @see dashboardApp
|
||||
*/
|
||||
dashboardParameters?: any;
|
||||
dashboardParameters?: JsonObject;
|
||||
}
|
||||
|
||||
export interface GKEClusterDetails extends ClusterDetails {}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
```ts
|
||||
import { Entity } from '@backstage/catalog-model';
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import { V1ConfigMap } from '@kubernetes/client-node';
|
||||
import { V1CronJob } from '@kubernetes/client-node';
|
||||
import { V1Deployment } from '@kubernetes/client-node';
|
||||
@@ -62,7 +63,7 @@ export interface ClientPodStatus {
|
||||
// @public (undocumented)
|
||||
export interface ClusterAttributes {
|
||||
dashboardApp?: string;
|
||||
dashboardParameters?: any;
|
||||
dashboardParameters?: JsonObject;
|
||||
dashboardUrl?: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import {
|
||||
V1ConfigMap,
|
||||
V1CronJob,
|
||||
@@ -69,7 +70,7 @@ export interface ClusterAttributes {
|
||||
* Specifies specific parameters used by some dashboard URL formatters.
|
||||
* This is used by the GKE formatter which requires the project, region and cluster name.
|
||||
*/
|
||||
dashboardParameters?: any;
|
||||
dashboardParameters?: JsonObject;
|
||||
}
|
||||
|
||||
export interface ClusterObjects {
|
||||
|
||||
@@ -10,6 +10,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api';
|
||||
import { DiscoveryApi } from '@backstage/core-plugin-api';
|
||||
import { Entity } from '@backstage/catalog-model';
|
||||
import { IdentityApi } from '@backstage/core-plugin-api';
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';
|
||||
import { OAuthApi } from '@backstage/core-plugin-api';
|
||||
import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import {
|
||||
V1Deployment,
|
||||
V1Pod,
|
||||
@@ -44,7 +45,7 @@ export interface GroupedResponses extends DeploymentResources {
|
||||
|
||||
export interface ClusterLinksFormatterOptions {
|
||||
dashboardUrl?: URL;
|
||||
dashboardParameters?: any;
|
||||
dashboardParameters?: JsonObject;
|
||||
object: any;
|
||||
kind: string;
|
||||
}
|
||||
|
||||
@@ -114,5 +114,47 @@ describe('clusterLinks', () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
describe('GKE app', () => {
|
||||
it('should return an url on the deployment', () => {
|
||||
const url = formatClusterLink({
|
||||
dashboardApp: 'gke',
|
||||
dashboardParameters: {
|
||||
projectId: 'foobar-333614',
|
||||
region: 'us-east1-c',
|
||||
clusterName: 'cluster-1',
|
||||
},
|
||||
object: {
|
||||
metadata: {
|
||||
name: 'foobar',
|
||||
namespace: 'bar',
|
||||
},
|
||||
},
|
||||
kind: 'Deployment',
|
||||
});
|
||||
expect(url).toBe(
|
||||
'https://console.cloud.google.com/kubernetes/deployment/us-east1-c/cluster-1/bar/foobar/overview?project=foobar-333614',
|
||||
);
|
||||
});
|
||||
it('should return an url on the service', () => {
|
||||
const url = formatClusterLink({
|
||||
dashboardApp: 'gke',
|
||||
dashboardParameters: {
|
||||
projectId: 'foobar-333614',
|
||||
region: 'us-east1-c',
|
||||
clusterName: 'cluster-1',
|
||||
},
|
||||
object: {
|
||||
metadata: {
|
||||
name: 'foobar',
|
||||
namespace: 'bar',
|
||||
},
|
||||
},
|
||||
kind: 'Service',
|
||||
});
|
||||
expect(url).toBe(
|
||||
'https://console.cloud.google.com/kubernetes/service/us-east1-c/cluster-1/bar/foobar/overview?project=foobar-333614',
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,12 +14,13 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { JsonObject } from '@backstage/types';
|
||||
import { defaultFormatterName, clusterLinksFormatters } from './formatters';
|
||||
|
||||
export type FormatClusterLinkOptions = {
|
||||
dashboardUrl?: string;
|
||||
dashboardApp?: string;
|
||||
dashboardParameters?: any;
|
||||
dashboardParameters?: JsonObject;
|
||||
object: any;
|
||||
kind: string;
|
||||
};
|
||||
|
||||
@@ -45,7 +45,7 @@ describe('clusterLinks - GKE formatter', () => {
|
||||
kind: 'Deployment',
|
||||
}),
|
||||
).toThrowError(
|
||||
'GKE dashboard requires a "projectId" in the dashboardParameters option',
|
||||
'GKE dashboard requires a "projectId" of type string in the dashboardParameters option',
|
||||
);
|
||||
});
|
||||
it('should provide a region in the dashboardParameters options', () => {
|
||||
@@ -64,7 +64,7 @@ describe('clusterLinks - GKE formatter', () => {
|
||||
kind: 'Deployment',
|
||||
}),
|
||||
).toThrowError(
|
||||
'GKE dashboard requires a "region" in the dashboardParameters option',
|
||||
'GKE dashboard requires a "region" of type string in the dashboardParameters option',
|
||||
);
|
||||
});
|
||||
it('should provide a clusterName in the dashboardParameters options', () => {
|
||||
@@ -83,7 +83,7 @@ describe('clusterLinks - GKE formatter', () => {
|
||||
kind: 'Deployment',
|
||||
}),
|
||||
).toThrowError(
|
||||
'GKE dashboard requires a "clusterName" in the dashboardParameters option',
|
||||
'GKE dashboard requires a "clusterName" of type string in the dashboardParameters option',
|
||||
);
|
||||
});
|
||||
it('should return an url on the cluster when there is a namespace only', () => {
|
||||
|
||||
@@ -28,19 +28,19 @@ export function gkeFormatter(options: ClusterLinksFormatterOptions): URL {
|
||||
throw new Error('GKE dashboard requires a dashboardParameters option');
|
||||
}
|
||||
const args = options.dashboardParameters;
|
||||
if (!args.projectId) {
|
||||
if (typeof args.projectId !== 'string') {
|
||||
throw new Error(
|
||||
'GKE dashboard requires a "projectId" in the dashboardParameters option',
|
||||
'GKE dashboard requires a "projectId" of type string in the dashboardParameters option',
|
||||
);
|
||||
}
|
||||
if (!args.region) {
|
||||
if (typeof args.region !== 'string') {
|
||||
throw new Error(
|
||||
'GKE dashboard requires a "region" in the dashboardParameters option',
|
||||
'GKE dashboard requires a "region" of type string in the dashboardParameters option',
|
||||
);
|
||||
}
|
||||
if (!args.clusterName) {
|
||||
if (typeof args.clusterName !== 'string') {
|
||||
throw new Error(
|
||||
'GKE dashboard requires a "clusterName" in the dashboardParameters option',
|
||||
'GKE dashboard requires a "clusterName" of type string in the dashboardParameters option',
|
||||
);
|
||||
}
|
||||
const basePath = new URL('https://console.cloud.google.com/');
|
||||
|
||||
Reference in New Issue
Block a user