@spinnaker/kubernetes 2026.2.3 → 2026.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/instance/details/KubernetesInstanceDetails.d.ts +54 -0
- package/dist/instance/details/kubernetesInstanceDetails.utils.d.ts +13 -0
- package/dist/instance/index.d.ts +1 -1
- package/dist/kubernetes.module.d.ts +5 -1
- package/dist/loadBalancer/transformer.d.ts +1 -1
- package/dist/manifest/AnnotationCustomSections.d.ts +3 -2
- package/dist/manifest/ManifestKindSearch.d.ts +1 -1
- package/dist/manifest/delete/Delete.d.ts +0 -1
- package/dist/manifest/delete/DeleteModal.d.ts +1 -1
- package/dist/manifest/delete/delete.types.d.ts +4 -0
- package/dist/manifest/index.d.ts +3 -6
- package/dist/manifest/manifest.service.d.ts +5 -0
- package/dist/manifest/manifestCommandBuilder.service.d.ts +1 -1
- package/dist/manifest/rollout/PauseRollout.d.ts +0 -1
- package/dist/manifest/rollout/ResumeRollout.d.ts +0 -1
- package/dist/manifest/rollout/RollingRestart.d.ts +4 -4
- package/dist/manifest/rollout/UndoRollout.d.ts +0 -1
- package/dist/manifest/scale/Scale.d.ts +1 -2
- package/dist/manifest/scale/ScaleModal.d.ts +3 -3
- package/dist/manifest/scale/ScaleSettingsForm.d.ts +7 -1
- package/dist/manifest/selector/ManifestSelector.d.ts +1 -1
- package/dist/manifest/traffic/ManifestTrafficService.d.ts +2 -2
- package/dist/pipelines/stages/deleteManifest/DeleteManifestOptionsForm.d.ts +1 -1
- package/dist/pipelines/stages/deployManifest/manifestStatus/DeployStatus.d.ts +1 -0
- package/dist/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.d.ts +6 -3
- package/dist/pipelines/stages/traffic/disableManifest.stage.d.ts +2 -1
- package/dist/pipelines/stages/traffic/enableManifest.stage.d.ts +2 -1
- package/dist/rawResource/index.d.ts +3 -1
- package/dist/rawResource/rawResource.dataSource.d.ts +1 -1
- package/dist/rawResource/rawResource.states.d.ts +4 -1
- package/dist/resources/resources.state.d.ts +2 -1
- package/dist/securityGroup/details/KubernetesSecurityGroupDetails.d.ts +49 -0
- package/dist/securityGroup/index.d.ts +3 -1
- package/dist/securityGroup/transformer.d.ts +4 -1
- package/dist/serverGroup/serverGroupCommandBuilder.d.ts +1 -1
- package/dist/serverGroup/serverGroupTransformer.d.ts +1 -1
- package/dist/serverGroupManager/details/ServerGroupManagerDetails.d.ts +7 -3
- package/package.json +3 -12
- package/src/help/kubernetes.help.ts +2 -0
- package/src/index.ts +2 -2
- package/src/instance/details/KubernetesInstanceDetails.spec.tsx +451 -0
- package/src/instance/details/KubernetesInstanceDetails.tsx +342 -0
- package/src/instance/details/kubernetesInstanceDetails.utils.ts +77 -0
- package/src/instance/index.ts +1 -1
- package/src/kubernetes.module.spec.ts +25 -0
- package/src/kubernetes.module.ts +23 -87
- package/src/loadBalancer/details/KubernetesLoadBalancerActions.tsx +30 -35
- package/src/loadBalancer/details/sections/LoadBalancerAnnotationCustomSection.tsx +2 -3
- package/src/loadBalancer/transformer.ts +1 -1
- package/src/manifest/AnnotationCustomSections.spec.tsx +178 -0
- package/src/manifest/AnnotationCustomSections.tsx +179 -2
- package/src/manifest/ManifestKindSearch.tsx +1 -1
- package/src/manifest/delete/Delete.tsx +0 -9
- package/src/manifest/delete/DeleteModal.tsx +69 -72
- package/src/manifest/delete/delete.types.ts +4 -0
- package/src/manifest/index.ts +3 -6
- package/src/manifest/manifest.service.ts +18 -1
- package/src/manifest/manifestCommandBuilder.service.spec.ts +41 -0
- package/src/manifest/manifestCommandBuilder.service.ts +45 -59
- package/src/manifest/rollout/PauseRollout.tsx +1 -9
- package/src/manifest/rollout/ResumeRollout.tsx +2 -10
- package/src/manifest/rollout/RollingRestart.tsx +16 -22
- package/src/manifest/rollout/UndoRollout.tsx +1 -10
- package/src/manifest/rollout/UndoRolloutModal.tsx +5 -1
- package/src/manifest/scale/Scale.tsx +12 -11
- package/src/manifest/scale/ScaleModal.tsx +43 -31
- package/src/manifest/scale/ScaleSettingsForm.tsx +8 -1
- package/src/manifest/selector/ManifestSelector.spec.tsx +89 -46
- package/src/manifest/selector/ManifestSelector.tsx +4 -5
- package/src/manifest/traffic/ManifestTrafficService.ts +2 -2
- package/src/manifest/wizard/ManifestWizard.tsx +1 -1
- package/src/pipelines/stages/deleteManifest/DeleteManifestOptionsForm.tsx +1 -1
- package/src/pipelines/stages/deleteManifest/DeleteManifestStageConfig.tsx +1 -1
- package/src/pipelines/stages/deployManifest/DeployManifestStageForm.tsx +16 -0
- package/src/pipelines/stages/deployManifest/ManifestCopier.spec.ts +52 -77
- package/src/pipelines/stages/deployManifest/ManifestDeploymentOptions.spec.tsx +2 -0
- package/src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx +39 -4
- package/src/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.spec.tsx +35 -0
- package/src/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx +10 -5
- package/src/pipelines/stages/traffic/ManifestTrafficStageRegistration.spec.ts +34 -0
- package/src/pipelines/stages/traffic/disableManifest.stage.ts +17 -19
- package/src/pipelines/stages/traffic/enableManifest.stage.ts +17 -19
- package/src/rawResource/index.ts +18 -1
- package/src/rawResource/rawResource.dataSource.ts +5 -8
- package/src/rawResource/rawResource.states.ts +50 -51
- package/src/resources/resources.state.spec.ts +138 -0
- package/src/resources/resources.state.ts +30 -35
- package/src/securityGroup/details/KubernetesSecurityGroupDetails.spec.tsx +292 -0
- package/src/securityGroup/details/KubernetesSecurityGroupDetails.tsx +304 -0
- package/src/securityGroup/index.ts +3 -1
- package/src/securityGroup/transformer.ts +2 -10
- package/src/serverGroup/details/KubernetesServerGroupActions.tsx +31 -61
- package/src/serverGroup/details/kubernetesServerGroupDetailsGetter.ts +1 -1
- package/src/serverGroup/details/sections/ServerGroupAnnotationCustomSection.tsx +2 -3
- package/src/serverGroup/serverGroupCommandBuilder.ts +1 -1
- package/src/serverGroup/serverGroupTransformer.ts +1 -1
- package/src/serverGroupManager/details/ServerGroupManagerActions.tsx +48 -128
- package/src/serverGroupManager/details/ServerGroupManagerDetails.spec.ts +12 -0
- package/src/serverGroupManager/details/ServerGroupManagerDetails.tsx +19 -8
- package/src/serverGroupManager/details/sections/ServerGroupManagerAnnotationCustomSection.tsx +2 -3
- package/src/serverGroupManager/details/useKubernetesServerGroupManagerDetails.spec.tsx +112 -0
- package/src/serverGroupManager/details/useKubernetesServerGroupManagerDetails.tsx +50 -29
- package/dist/instance/details/details.controller.d.ts +0 -1
- package/dist/manifest/annotationCustomSections.component.d.ts +0 -3
- package/dist/manifest/delete/delete.controller.d.ts +0 -12
- package/dist/manifest/delete/deleteOptionsForm.component.d.ts +0 -1
- package/dist/manifest/editor/json/jsonEditor.component.d.ts +0 -1
- package/dist/manifest/manifestEvents.component.d.ts +0 -1
- package/dist/manifest/manifestImageDetails.component.d.ts +0 -1
- package/dist/manifest/manifestLabels.component.d.ts +0 -1
- package/dist/manifest/manifestQos.component.d.ts +0 -1
- package/dist/manifest/manifestResources.component.d.ts +0 -1
- package/dist/manifest/rollout/pause.controller.d.ts +0 -1
- package/dist/manifest/rollout/resume.controller.d.ts +0 -1
- package/dist/manifest/rollout/undo.controller.d.ts +0 -5
- package/dist/manifest/scale/scale.controller.d.ts +0 -8
- package/dist/manifest/scale/scaleSettingsForm.component.d.ts +0 -1
- package/dist/manifest/selector/selector.component.d.ts +0 -1
- package/dist/manifest/status/condition.component.d.ts +0 -1
- package/dist/manifest/status/status.component.d.ts +0 -1
- package/dist/rawResource/rawResource.module.d.ts +0 -1
- package/dist/reactShims/index.d.ts +0 -1
- package/dist/reactShims/kubernetes.react.injector.d.ts +0 -11
- package/dist/reactShims/kubernetes.react.module.d.ts +0 -1
- package/dist/securityGroup/details/details.controller.d.ts +0 -1
- package/src/instance/details/details.controller.ts +0 -186
- package/src/instance/details/details.html +0 -80
- package/src/manifest/annotationCustomSections.component.ts +0 -114
- package/src/manifest/delete/delete.controller.ts +0 -80
- package/src/manifest/delete/delete.html +0 -42
- package/src/manifest/delete/deleteOptionsForm.component.ts +0 -52
- package/src/manifest/editor/json/jsonEditor.component.ts +0 -12
- package/src/manifest/manifestEvents.component.ts +0 -12
- package/src/manifest/manifestImageDetails.component.ts +0 -12
- package/src/manifest/manifestLabels.component.ts +0 -12
- package/src/manifest/manifestQos.component.ts +0 -12
- package/src/manifest/manifestResources.component.ts +0 -12
- package/src/manifest/rollout/pause.controller.ts +0 -66
- package/src/manifest/rollout/pause.html +0 -28
- package/src/manifest/rollout/resume.controller.ts +0 -66
- package/src/manifest/rollout/resume.html +0 -28
- package/src/manifest/rollout/undo.controller.ts +0 -74
- package/src/manifest/rollout/undo.html +0 -44
- package/src/manifest/scale/scale.controller.ts +0 -75
- package/src/manifest/scale/scale.html +0 -32
- package/src/manifest/scale/scaleSettingsForm.component.ts +0 -11
- package/src/manifest/selector/selector.component.ts +0 -17
- package/src/manifest/status/condition.component.ts +0 -12
- package/src/manifest/status/status.component.ts +0 -11
- package/src/rawResource/rawResource.module.ts +0 -8
- package/src/reactShims/index.ts +0 -1
- package/src/reactShims/kubernetes.react.injector.ts +0 -30
- package/src/reactShims/kubernetes.react.module.ts +0 -12
- package/src/securityGroup/details/details.controller.ts +0 -118
- package/src/securityGroup/details/details.html +0 -91
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { shallow } from 'enzyme';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import { AccountService } from '@spinnaker/core';
|
|
5
|
+
|
|
6
|
+
import { ManifestDetailsLinkComponent } from './ManifestDetailsLink';
|
|
7
|
+
|
|
8
|
+
describe('Kubernetes ManifestDetailsLink', () => {
|
|
9
|
+
it('builds its link through the injected state service', async () => {
|
|
10
|
+
spyOn(AccountService, 'getAccountDetails').and.returnValue(
|
|
11
|
+
Promise.resolve({ spinnakerKindMap: { Deployment: 'serverGroups' } } as any) as any,
|
|
12
|
+
);
|
|
13
|
+
const href = jasmine.createSpy('href').and.returnValue('#/manifest');
|
|
14
|
+
const component = shallow(
|
|
15
|
+
<ManifestDetailsLinkComponent
|
|
16
|
+
{...({ router: {}, stateParams: {}, stateService: { href } } as any)}
|
|
17
|
+
accountId="test-account"
|
|
18
|
+
linkName="Manifest"
|
|
19
|
+
manifest={{ manifest: { kind: 'Deployment', metadata: { annotations: {}, name: 'test-v001' } } } as any}
|
|
20
|
+
/>,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
await Promise.resolve();
|
|
24
|
+
component.update();
|
|
25
|
+
|
|
26
|
+
expect(href).toHaveBeenCalledWith('home.applications.application.insight.clusters.serverGroup', {
|
|
27
|
+
accountId: 'test-account',
|
|
28
|
+
provider: 'kubernetes',
|
|
29
|
+
reg: '',
|
|
30
|
+
region: '_',
|
|
31
|
+
serverGroup: 'deployment test-v001',
|
|
32
|
+
});
|
|
33
|
+
expect(component.find('a').prop('href')).toBe('#/manifest');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { get, trim } from 'lodash';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
|
|
4
|
-
import type { IManifest } from '@spinnaker/core';
|
|
5
|
-
import { AccountService,
|
|
4
|
+
import type { IManifest, IRouterInjectedProps } from '@spinnaker/core';
|
|
5
|
+
import { AccountService, withRouter } from '@spinnaker/core';
|
|
6
6
|
|
|
7
7
|
const UNMAPPED_K8S_RESOURCE_STATE_KEY = 'kubernetesResource';
|
|
8
8
|
|
|
@@ -16,14 +16,17 @@ export interface IManifestDetailsState {
|
|
|
16
16
|
url: string;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export class
|
|
19
|
+
export class ManifestDetailsLinkComponent extends React.Component<
|
|
20
|
+
IManifestDetailsProps & IRouterInjectedProps,
|
|
21
|
+
IManifestDetailsState
|
|
22
|
+
> {
|
|
20
23
|
private spinnakerKindStateMap: { [k: string]: string } = {
|
|
21
24
|
// keys from clouddriver's KubernetesSpinnakerKindMap
|
|
22
25
|
serverGroupManagers: 'serverGroupManager',
|
|
23
26
|
serverGroups: 'serverGroup',
|
|
24
27
|
};
|
|
25
28
|
|
|
26
|
-
constructor(props: IManifestDetailsProps) {
|
|
29
|
+
constructor(props: IManifestDetailsProps & IRouterInjectedProps) {
|
|
27
30
|
super(props);
|
|
28
31
|
this.state = {
|
|
29
32
|
url: '',
|
|
@@ -73,7 +76,7 @@ export class ManifestDetailsLink extends React.Component<IManifestDetailsProps,
|
|
|
73
76
|
const spinnakerKind = this.spinnakerKindFromKubernetesKind(kind, account.spinnakerKindMap);
|
|
74
77
|
const stateKey = this.spinnakerKindStateMap[spinnakerKind] || UNMAPPED_K8S_RESOURCE_STATE_KEY;
|
|
75
78
|
const params = this.getStateParams(stateKey);
|
|
76
|
-
const url =
|
|
79
|
+
const url = this.props.stateService.href(`home.applications.application.insight.clusters.${stateKey}`, params);
|
|
77
80
|
this.setState({ url });
|
|
78
81
|
});
|
|
79
82
|
}
|
|
@@ -90,3 +93,5 @@ export class ManifestDetailsLink extends React.Component<IManifestDetailsProps,
|
|
|
90
93
|
}
|
|
91
94
|
}
|
|
92
95
|
}
|
|
96
|
+
|
|
97
|
+
export const ManifestDetailsLink = withRouter(ManifestDetailsLinkComponent);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Registry } from '@spinnaker/core';
|
|
2
|
+
|
|
3
|
+
import { DISABLE_MANIFEST_STAGE_CONFIG } from './disableManifest.stage';
|
|
4
|
+
import { ENABLE_MANIFEST_STAGE_CONFIG } from './enableManifest.stage';
|
|
5
|
+
import { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';
|
|
6
|
+
|
|
7
|
+
describe('ManifestTraffic stage registration', () => {
|
|
8
|
+
beforeEach(() => Registry.reinitialize());
|
|
9
|
+
afterEach(() => Registry.reinitialize());
|
|
10
|
+
|
|
11
|
+
it('registers enable and disable manifest stage configs', () => {
|
|
12
|
+
Registry.pipeline.registerStage(ENABLE_MANIFEST_STAGE_CONFIG);
|
|
13
|
+
Registry.pipeline.registerStage(DISABLE_MANIFEST_STAGE_CONFIG);
|
|
14
|
+
|
|
15
|
+
const enableStage = Registry.pipeline.getStageConfig({ type: 'enableManifest' } as any);
|
|
16
|
+
const disableStage = Registry.pipeline.getStageConfig({ type: 'disableManifest' } as any);
|
|
17
|
+
|
|
18
|
+
expect(ENABLE_MANIFEST_STAGE_CONFIG.key).toBe('enableManifest');
|
|
19
|
+
expect(enableStage.label).toBe('Enable (Manifest)');
|
|
20
|
+
expect(enableStage.description).toBe('Enable a Kubernetes manifest.');
|
|
21
|
+
expect(enableStage.cloudProvider).toBe('kubernetes');
|
|
22
|
+
expect(enableStage.component).toBe(ManifestTrafficStageConfig);
|
|
23
|
+
expect(enableStage.accountExtractor({ account: 'k8s-local' } as any)).toEqual(['k8s-local']);
|
|
24
|
+
expect(enableStage.configAccountExtractor({ account: 'k8s-local' } as any)).toEqual(['k8s-local']);
|
|
25
|
+
|
|
26
|
+
expect(DISABLE_MANIFEST_STAGE_CONFIG.key).toBe('disableManifest');
|
|
27
|
+
expect(disableStage.label).toBe('Disable (Manifest)');
|
|
28
|
+
expect(disableStage.description).toBe('Disable a Kubernetes manifest.');
|
|
29
|
+
expect(disableStage.cloudProvider).toBe('kubernetes');
|
|
30
|
+
expect(disableStage.component).toBe(ManifestTrafficStageConfig);
|
|
31
|
+
expect(disableStage.accountExtractor({ account: 'k8s-local' } as any)).toEqual(['k8s-local']);
|
|
32
|
+
expect(disableStage.configAccountExtractor({ account: 'k8s-local' } as any)).toEqual(['k8s-local']);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import type { IStage } from '@spinnaker/core';
|
|
4
|
-
import { EXECUTION_ARTIFACT_TAB, ExecutionDetailsTasks, Registry } from '@spinnaker/core';
|
|
1
|
+
import type { IStage, IStageTypeConfig } from '@spinnaker/core';
|
|
2
|
+
import { ExecutionDetailsTasks, Registry } from '@spinnaker/core';
|
|
5
3
|
|
|
6
4
|
import { manifestExecutionDetails } from '../ManifestExecutionDetails';
|
|
7
5
|
import { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';
|
|
@@ -9,18 +7,18 @@ import { manifestSelectorValidators } from '../validators/manifestSelectorValida
|
|
|
9
7
|
|
|
10
8
|
const STAGE_NAME = 'Disable (Manifest)';
|
|
11
9
|
const STAGE_KEY = 'disableManifest';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
10
|
+
|
|
11
|
+
export const DISABLE_MANIFEST_STAGE_CONFIG: IStageTypeConfig = {
|
|
12
|
+
label: STAGE_NAME,
|
|
13
|
+
description: 'Disable a Kubernetes manifest.',
|
|
14
|
+
key: STAGE_KEY,
|
|
15
|
+
cloudProvider: 'kubernetes',
|
|
16
|
+
component: ManifestTrafficStageConfig,
|
|
17
|
+
executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],
|
|
18
|
+
supportsCustomTimeout: true,
|
|
19
|
+
accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
|
|
20
|
+
configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
|
|
21
|
+
validators: manifestSelectorValidators(STAGE_NAME),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
Registry.pipeline.registerStage(DISABLE_MANIFEST_STAGE_CONFIG);
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import type { IStage } from '@spinnaker/core';
|
|
4
|
-
import { EXECUTION_ARTIFACT_TAB, ExecutionDetailsTasks, Registry } from '@spinnaker/core';
|
|
1
|
+
import type { IStage, IStageTypeConfig } from '@spinnaker/core';
|
|
2
|
+
import { ExecutionDetailsTasks, Registry } from '@spinnaker/core';
|
|
5
3
|
|
|
6
4
|
import { manifestExecutionDetails } from '../ManifestExecutionDetails';
|
|
7
5
|
import { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';
|
|
@@ -9,18 +7,18 @@ import { manifestSelectorValidators } from '../validators/manifestSelectorValida
|
|
|
9
7
|
|
|
10
8
|
const STAGE_NAME = 'Enable (Manifest)';
|
|
11
9
|
const STAGE_KEY = 'enableManifest';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
10
|
+
|
|
11
|
+
export const ENABLE_MANIFEST_STAGE_CONFIG: IStageTypeConfig = {
|
|
12
|
+
label: STAGE_NAME,
|
|
13
|
+
description: 'Enable a Kubernetes manifest.',
|
|
14
|
+
key: STAGE_KEY,
|
|
15
|
+
cloudProvider: 'kubernetes',
|
|
16
|
+
component: ManifestTrafficStageConfig,
|
|
17
|
+
executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],
|
|
18
|
+
supportsCustomTimeout: true,
|
|
19
|
+
accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
|
|
20
|
+
configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
|
|
21
|
+
validators: manifestSelectorValidators(STAGE_NAME),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
Registry.pipeline.registerStage(ENABLE_MANIFEST_STAGE_CONFIG);
|
package/src/rawResource/index.ts
CHANGED
|
@@ -1 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { SETTINGS } from '@spinnaker/core';
|
|
2
|
+
|
|
3
|
+
import { registerKubernetesRawResourceDataSource } from './rawResource.dataSource';
|
|
4
|
+
import { registerKubernetesRawResourceStates } from './rawResource.states';
|
|
5
|
+
|
|
6
|
+
export * from './rawResource.dataSource';
|
|
7
|
+
export * from './rawResource.states';
|
|
8
|
+
|
|
9
|
+
export function registerKubernetesRawResources(): void {
|
|
10
|
+
if (!SETTINGS.feature.kubernetesRawResources) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
registerKubernetesRawResourceDataSource();
|
|
15
|
+
registerKubernetesRawResourceStates();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
registerKubernetesRawResources();
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import { module } from 'angular';
|
|
2
|
-
|
|
3
1
|
import type { Application } from '@spinnaker/core';
|
|
4
2
|
import { ApplicationDataSourceRegistry, INFRASTRUCTURE_KEY, REST } from '@spinnaker/core';
|
|
5
3
|
|
|
6
|
-
export const KUBERNETS_RAW_RESOURCE_DATA_SOURCE = 'spinnaker.core.rawresource.dataSource';
|
|
7
4
|
export const KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY = 'k8s';
|
|
8
5
|
const KUBERNETS_RAW_RESOURCE_DATA_SOURCE_SREF = `.insight.${KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY}`;
|
|
9
6
|
|
|
10
7
|
type ApiK8sResource = any;
|
|
11
8
|
|
|
12
|
-
const fetchK8sResources = (application: Application):
|
|
9
|
+
const fetchK8sResources = (application: Application): Promise<ApiK8sResource> =>
|
|
13
10
|
REST('applications').path(application.name, 'rawResources').get();
|
|
14
11
|
|
|
15
|
-
const formatK8sResources = (_: Application, result: ApiK8sResource):
|
|
16
|
-
Promise.resolve(result);
|
|
12
|
+
const formatK8sResources = (_: Application, result: ApiK8sResource): Promise<ApiK8sResource> => Promise.resolve(result);
|
|
17
13
|
|
|
18
|
-
|
|
14
|
+
export function registerKubernetesRawResourceDataSource(): void {
|
|
15
|
+
ApplicationDataSourceRegistry.removeDataSource(KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY);
|
|
19
16
|
ApplicationDataSourceRegistry.registerDataSource({
|
|
20
17
|
key: KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,
|
|
21
18
|
label: 'Kubernetes',
|
|
@@ -32,4 +29,4 @@ module(KUBERNETS_RAW_RESOURCE_DATA_SOURCE, []).run(() => {
|
|
|
32
29
|
description: 'Collections of kubernetes resources',
|
|
33
30
|
defaultData: [],
|
|
34
31
|
});
|
|
35
|
-
}
|
|
32
|
+
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
//import { StateParams } from '@uirouter/angularjs';
|
|
4
|
-
import type { ApplicationStateProvider, INestedState } from '@spinnaker/core';
|
|
5
|
-
import { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';
|
|
1
|
+
import type { INestedState } from '@spinnaker/core';
|
|
2
|
+
import { registerApplicationState } from '@spinnaker/core';
|
|
6
3
|
|
|
7
4
|
import { K8sResources } from './component/K8sResources';
|
|
8
5
|
import { K8sResourcesFilters } from './component/K8sResourcesFilters';
|
|
@@ -14,51 +11,53 @@ export interface IKubernetesRawResourceStateParams {
|
|
|
14
11
|
region: string;
|
|
15
12
|
}
|
|
16
13
|
|
|
17
|
-
export const
|
|
18
|
-
|
|
19
|
-
'
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
type: 'rawResources',
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
const kubernetes: INestedState = {
|
|
47
|
-
url: `/kubernetes`,
|
|
48
|
-
name: 'k8s',
|
|
49
|
-
views: {
|
|
50
|
-
nav: { component: K8sResourcesFilters, $type: 'react' },
|
|
51
|
-
master: { component: K8sResources, $type: 'react' },
|
|
52
|
-
},
|
|
53
|
-
data: {
|
|
54
|
-
pageTitleSection: {
|
|
55
|
-
title: 'Kubernetes',
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
children: [],
|
|
59
|
-
};
|
|
14
|
+
export const KUBERNETES_RAW_RESOURCE_DETAILS_STATE: INestedState = {
|
|
15
|
+
name: 'rawResourceDetails',
|
|
16
|
+
url: '/rawResourceDetails/:account/:region/:name',
|
|
17
|
+
views: {
|
|
18
|
+
'detail@../insight': {
|
|
19
|
+
component: RawResourceDetails,
|
|
20
|
+
$type: 'react',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
resolve: {
|
|
24
|
+
account: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.account],
|
|
25
|
+
name: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.name],
|
|
26
|
+
region: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.region],
|
|
27
|
+
},
|
|
28
|
+
data: {
|
|
29
|
+
pageTitleDetails: {
|
|
30
|
+
title: 'Raw Resource Details',
|
|
31
|
+
nameParam: 'name',
|
|
32
|
+
accountParam: 'account',
|
|
33
|
+
},
|
|
34
|
+
history: {
|
|
35
|
+
type: 'rawResources',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
};
|
|
60
39
|
|
|
61
|
-
|
|
62
|
-
|
|
40
|
+
export const KUBERNETES_RAW_RESOURCE_INSIGHT_STATE: INestedState = {
|
|
41
|
+
url: '/kubernetes',
|
|
42
|
+
name: 'k8s',
|
|
43
|
+
views: {
|
|
44
|
+
nav: { component: K8sResourcesFilters, $type: 'react' },
|
|
45
|
+
master: { component: K8sResources, $type: 'react' },
|
|
63
46
|
},
|
|
64
|
-
|
|
47
|
+
data: {
|
|
48
|
+
pageTitleSection: {
|
|
49
|
+
title: 'Kubernetes',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
children: [],
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export function registerKubernetesRawResourceStates(): void {
|
|
56
|
+
registerApplicationState((applicationStateProvider) => {
|
|
57
|
+
applicationStateProvider.addInsightState({
|
|
58
|
+
...KUBERNETES_RAW_RESOURCE_INSIGHT_STATE,
|
|
59
|
+
children: [],
|
|
60
|
+
});
|
|
61
|
+
applicationStateProvider.addInsightDetailState(KUBERNETES_RAW_RESOURCE_DETAILS_STATE);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { ApplicationStateProvider, INestedState } from '@spinnaker/core';
|
|
2
|
+
import { ApplicationDataSourceRegistry, INFRASTRUCTURE_KEY, SETTINGS } from '@spinnaker/core';
|
|
3
|
+
|
|
4
|
+
// eslint-disable-next-line @spinnaker/import-from-npm-not-relative
|
|
5
|
+
import type { ApplicationStateRegistration } from '../../../core/src/application/applicationState.registration';
|
|
6
|
+
// eslint-disable-next-line @spinnaker/import-from-npm-not-relative
|
|
7
|
+
import {
|
|
8
|
+
getApplicationStateRegistrationsForTests,
|
|
9
|
+
resetApplicationStateRegistrationsForTests,
|
|
10
|
+
} from '../../../core/src/application/applicationState.registration';
|
|
11
|
+
import { registerKubernetesRawResources } from '../rawResource';
|
|
12
|
+
import {
|
|
13
|
+
KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,
|
|
14
|
+
registerKubernetesRawResourceDataSource,
|
|
15
|
+
} from '../rawResource/rawResource.dataSource';
|
|
16
|
+
import {
|
|
17
|
+
KUBERNETES_RAW_RESOURCE_DETAILS_STATE,
|
|
18
|
+
KUBERNETES_RAW_RESOURCE_INSIGHT_STATE,
|
|
19
|
+
registerKubernetesRawResourceStates,
|
|
20
|
+
} from '../rawResource/rawResource.states';
|
|
21
|
+
import { KUBERNETES_RESOURCE_DETAILS_STATE } from './resources.state';
|
|
22
|
+
|
|
23
|
+
describe('Kubernetes resource state registration', () => {
|
|
24
|
+
let originalRegistrations: ApplicationStateRegistration[];
|
|
25
|
+
|
|
26
|
+
function makeApplicationStateProvider(): ApplicationStateProvider {
|
|
27
|
+
return {
|
|
28
|
+
addInsightState: jasmine.createSpy('addInsightState'),
|
|
29
|
+
addInsightDetailState: jasmine.createSpy('addInsightDetailState'),
|
|
30
|
+
} as any;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
originalRegistrations = getApplicationStateRegistrationsForTests();
|
|
35
|
+
resetApplicationStateRegistrationsForTests();
|
|
36
|
+
ApplicationDataSourceRegistry.clearDataSources();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
resetApplicationStateRegistrationsForTests(originalRegistrations);
|
|
41
|
+
ApplicationDataSourceRegistry.clearDataSources();
|
|
42
|
+
SETTINGS.resetToOriginal();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('defines the generic Kubernetes resource detail state as a React insight detail', () => {
|
|
46
|
+
const applicationStateProvider = makeApplicationStateProvider();
|
|
47
|
+
|
|
48
|
+
applicationStateProvider.addInsightDetailState(KUBERNETES_RESOURCE_DETAILS_STATE);
|
|
49
|
+
|
|
50
|
+
expect(applicationStateProvider.addInsightDetailState).toHaveBeenCalledWith(
|
|
51
|
+
jasmine.objectContaining<INestedState>({
|
|
52
|
+
name: 'kubernetesResource',
|
|
53
|
+
url: '/manifest/:provider/:accountId/:region/:kubernetesResource',
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
expect(KUBERNETES_RESOURCE_DETAILS_STATE.views['detail@../insight'].$type).toBe('react');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('defines raw resource insight and detail states as React states', () => {
|
|
60
|
+
expect(KUBERNETES_RAW_RESOURCE_INSIGHT_STATE).toEqual(
|
|
61
|
+
jasmine.objectContaining<INestedState>({
|
|
62
|
+
name: 'k8s',
|
|
63
|
+
url: '/kubernetes',
|
|
64
|
+
}),
|
|
65
|
+
);
|
|
66
|
+
expect(KUBERNETES_RAW_RESOURCE_INSIGHT_STATE.views.nav.$type).toBe('react');
|
|
67
|
+
expect(KUBERNETES_RAW_RESOURCE_INSIGHT_STATE.views.master.$type).toBe('react');
|
|
68
|
+
|
|
69
|
+
expect(KUBERNETES_RAW_RESOURCE_DETAILS_STATE).toEqual(
|
|
70
|
+
jasmine.objectContaining<INestedState>({
|
|
71
|
+
name: 'rawResourceDetails',
|
|
72
|
+
url: '/rawResourceDetails/:account/:region/:name',
|
|
73
|
+
}),
|
|
74
|
+
);
|
|
75
|
+
expect(KUBERNETES_RAW_RESOURCE_DETAILS_STATE.views['detail@../insight'].$type).toBe('react');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('queues raw resource states', () => {
|
|
79
|
+
registerKubernetesRawResourceStates();
|
|
80
|
+
const applicationStateProvider = makeApplicationStateProvider();
|
|
81
|
+
|
|
82
|
+
getApplicationStateRegistrationsForTests().forEach((registration) => registration(applicationStateProvider));
|
|
83
|
+
|
|
84
|
+
expect(applicationStateProvider.addInsightState).toHaveBeenCalledWith(
|
|
85
|
+
jasmine.objectContaining<INestedState>({
|
|
86
|
+
name: 'k8s',
|
|
87
|
+
url: '/kubernetes',
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
90
|
+
expect(applicationStateProvider.addInsightDetailState).toHaveBeenCalledWith(
|
|
91
|
+
jasmine.objectContaining<INestedState>({
|
|
92
|
+
name: 'rawResourceDetails',
|
|
93
|
+
url: '/rawResourceDetails/:account/:region/:name',
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('registers the raw resource data source', () => {
|
|
99
|
+
registerKubernetesRawResourceDataSource();
|
|
100
|
+
|
|
101
|
+
const rawResourceDataSource = ApplicationDataSourceRegistry.getDataSources().find(
|
|
102
|
+
(dataSource) => dataSource.key === KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
expect(rawResourceDataSource).toEqual(
|
|
106
|
+
jasmine.objectContaining({
|
|
107
|
+
key: KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,
|
|
108
|
+
label: 'Kubernetes',
|
|
109
|
+
category: INFRASTRUCTURE_KEY,
|
|
110
|
+
sref: '.insight.k8s',
|
|
111
|
+
primary: true,
|
|
112
|
+
providerField: 'cloudProvider',
|
|
113
|
+
credentialsField: 'account',
|
|
114
|
+
regionField: 'region',
|
|
115
|
+
}),
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('keeps raw resource registration behind the feature flag', () => {
|
|
120
|
+
SETTINGS.feature.kubernetesRawResources = false;
|
|
121
|
+
|
|
122
|
+
registerKubernetesRawResources();
|
|
123
|
+
|
|
124
|
+
expect(ApplicationDataSourceRegistry.getDataSources()).toEqual([]);
|
|
125
|
+
expect(getApplicationStateRegistrationsForTests()).toEqual([]);
|
|
126
|
+
|
|
127
|
+
SETTINGS.feature.kubernetesRawResources = true;
|
|
128
|
+
|
|
129
|
+
registerKubernetesRawResources();
|
|
130
|
+
|
|
131
|
+
expect(
|
|
132
|
+
ApplicationDataSourceRegistry.getDataSources().some(
|
|
133
|
+
(dataSource) => dataSource.key === KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,
|
|
134
|
+
),
|
|
135
|
+
).toBe(true);
|
|
136
|
+
expect(getApplicationStateRegistrationsForTests().length).toBe(1);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';
|
|
1
|
+
import type { INestedState } from '@spinnaker/core';
|
|
2
|
+
import { registerApplicationState } from '@spinnaker/core';
|
|
4
3
|
import { KubernetesResourceDetails } from './ResourceDetails';
|
|
5
4
|
|
|
6
5
|
export interface IKubernetesResourceStateParams {
|
|
@@ -10,36 +9,32 @@ export interface IKubernetesResourceStateParams {
|
|
|
10
9
|
kubernetesResource: string;
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
export const
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
},
|
|
26
|
-
resolve: {
|
|
27
|
-
accountId: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams.accountId],
|
|
28
|
-
kubernetesResource: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams],
|
|
29
|
-
},
|
|
30
|
-
data: {
|
|
31
|
-
pageTitleDetails: {
|
|
32
|
-
title: 'Generic Kubernetes Resource Details',
|
|
33
|
-
nameParam: 'kubernetesResource',
|
|
34
|
-
accountParam: 'accountId',
|
|
35
|
-
regionParam: 'region',
|
|
36
|
-
},
|
|
37
|
-
history: {
|
|
38
|
-
type: 'kubernetesResource',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
applicationStateProvider.addInsightDetailState(kubernetesResourceDetails);
|
|
12
|
+
export const KUBERNETES_RESOURCE_DETAILS_STATE: INestedState = {
|
|
13
|
+
name: 'kubernetesResource',
|
|
14
|
+
url: '/manifest/:provider/:accountId/:region/:kubernetesResource',
|
|
15
|
+
views: {
|
|
16
|
+
'detail@../insight': {
|
|
17
|
+
component: KubernetesResourceDetails,
|
|
18
|
+
$type: 'react',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
resolve: {
|
|
22
|
+
accountId: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams.accountId],
|
|
23
|
+
kubernetesResource: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams],
|
|
44
24
|
},
|
|
45
|
-
|
|
25
|
+
data: {
|
|
26
|
+
pageTitleDetails: {
|
|
27
|
+
title: 'Generic Kubernetes Resource Details',
|
|
28
|
+
nameParam: 'kubernetesResource',
|
|
29
|
+
accountParam: 'accountId',
|
|
30
|
+
regionParam: 'region',
|
|
31
|
+
},
|
|
32
|
+
history: {
|
|
33
|
+
type: 'kubernetesResource',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
registerApplicationState((applicationStateProvider) => {
|
|
39
|
+
applicationStateProvider.addInsightDetailState(KUBERNETES_RESOURCE_DETAILS_STATE);
|
|
40
|
+
});
|