add aks dashboard formatter

Signed-off-by: Guilherme Oenning <goenning@eshopworld.com>
This commit is contained in:
Guilherme Oenning
2022-05-04 15:08:35 +01:00
parent 8bc3cd1dce
commit ce1e8df8a5
2 changed files with 121 additions and 5 deletions
@@ -16,10 +16,9 @@
import { aksFormatter } from './aks';
describe('clusterLinks - AKS formatter', () => {
it('should return an url on the workloads when there is a namespace only', () => {
it('should provide a dashboardParameters in the options', () => {
expect(() =>
aksFormatter({
dashboardUrl: new URL('https://k8s.foo.com'),
object: {
metadata: {
name: 'foobar',
@@ -28,6 +27,90 @@ describe('clusterLinks - AKS formatter', () => {
},
kind: 'Deployment',
}),
).toThrowError('AKS formatter is not yet implemented. Please, contribute!');
).toThrowError('AKS dashboard requires a dashboardParameters option');
});
it('should provide a subscriptionId in the dashboardParameters options', () => {
expect(() =>
aksFormatter({
dashboardParameters: {
resourceGroup: 'rg-1',
clusterName: 'cluster-1',
},
object: {
metadata: {
name: 'foobar',
namespace: 'bar',
},
},
kind: 'Deployment',
}),
).toThrowError(
'AKS dashboard requires a "subscriptionId" of type string in the dashboardParameters option',
);
});
it('should provide a resourceGroup in the dashboardParameters options', () => {
expect(() =>
aksFormatter({
dashboardParameters: {
subscriptionId: '1234-GUID-5678',
clusterName: 'cluster-1',
},
object: {
metadata: {
name: 'foobar',
namespace: 'bar',
},
},
kind: 'Deployment',
}),
).toThrowError(
'AKS dashboard requires a "resourceGroup" of type string in the dashboardParameters option',
);
});
it('should provide a clusterName in the dashboardParameters options', () => {
expect(() =>
aksFormatter({
dashboardParameters: {
subscriptionId: '1234-GUID-5678',
resourceGroup: 'us-east1-c',
},
object: {
metadata: {
name: 'foobar',
namespace: 'bar',
},
},
kind: 'Deployment',
}),
).toThrowError(
'AKS dashboard requires a "clusterName" of type string in the dashboardParameters option',
);
});
it('should return an url on the cluster with object details', () => {
const url = aksFormatter({
dashboardParameters: {
subscriptionId: '1234-GUID-5678',
resourceGroup: 'rg-1',
clusterName: 'cluster-1',
},
object: {
metadata: {
name: 'my-deployment',
namespace: 'my-namespace',
uid: '111-GUID-222',
},
spec: {
selector: {
matchLabels: {
app: 'foo',
},
},
},
},
kind: 'Deployment',
});
expect(url.href).toBe(
'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId/%2Fsubscriptions%2F1234-GUID-5678%2FresourceGroups%2Frg-1%2Fproviders%2FMicrosoft.ContainerService%2FmanagedClusters%2Fcluster-1/resource/%7B%22kind%22%3A%22Deployment%22%2C%22metadata%22%3A%7B%22name%22%3A%22my-deployment%22%2C%22namespace%22%3A%22my-namespace%22%2C%22uid%22%3A%22111-GUID-222%22%7D%2C%22spec%22%3A%7B%22selector%22%3A%7B%22matchLabels%22%3A%7B%22app%22%3A%22foo%22%7D%7D%7D%7D',
);
});
});
@@ -15,6 +15,39 @@
*/
import { ClusterLinksFormatterOptions } from '../../../types/types';
export function aksFormatter(_options: ClusterLinksFormatterOptions): URL {
throw new Error('AKS formatter is not yet implemented. Please, contribute!');
const basePath =
'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';
const requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];
export function aksFormatter(options: ClusterLinksFormatterOptions): URL {
if (!options.dashboardParameters) {
throw new Error('AKS dashboard requires a dashboardParameters option');
}
const args = options.dashboardParameters;
for (const param of requiredParams) {
if (typeof args[param] !== 'string') {
throw new Error(
`AKS dashboard requires a "${param}" of type string in the dashboardParameters option`,
);
}
}
const path = `/subscriptions/${args.subscriptionId}/resourceGroups/${args.resourceGroup}/providers/Microsoft.ContainerService/managedClusters/${args.clusterName}`;
const { name, namespace, uid } = options.object.metadata;
const { selector } = options.object.spec;
const params = {
kind: options.kind,
metadata: { name, namespace, uid },
spec: {
selector,
},
};
return new URL(
`${basePath}/${encodeURIComponent(path)}/resource/${encodeURIComponent(
JSON.stringify(params),
)}`,
);
}