@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.
Files changed (158) hide show
  1. package/dist/index.d.ts +1 -2
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/instance/details/KubernetesInstanceDetails.d.ts +54 -0
  5. package/dist/instance/details/kubernetesInstanceDetails.utils.d.ts +13 -0
  6. package/dist/instance/index.d.ts +1 -1
  7. package/dist/kubernetes.module.d.ts +5 -1
  8. package/dist/loadBalancer/transformer.d.ts +1 -1
  9. package/dist/manifest/AnnotationCustomSections.d.ts +3 -2
  10. package/dist/manifest/ManifestKindSearch.d.ts +1 -1
  11. package/dist/manifest/delete/Delete.d.ts +0 -1
  12. package/dist/manifest/delete/DeleteModal.d.ts +1 -1
  13. package/dist/manifest/delete/delete.types.d.ts +4 -0
  14. package/dist/manifest/index.d.ts +3 -6
  15. package/dist/manifest/manifest.service.d.ts +5 -0
  16. package/dist/manifest/manifestCommandBuilder.service.d.ts +1 -1
  17. package/dist/manifest/rollout/PauseRollout.d.ts +0 -1
  18. package/dist/manifest/rollout/ResumeRollout.d.ts +0 -1
  19. package/dist/manifest/rollout/RollingRestart.d.ts +4 -4
  20. package/dist/manifest/rollout/UndoRollout.d.ts +0 -1
  21. package/dist/manifest/scale/Scale.d.ts +1 -2
  22. package/dist/manifest/scale/ScaleModal.d.ts +3 -3
  23. package/dist/manifest/scale/ScaleSettingsForm.d.ts +7 -1
  24. package/dist/manifest/selector/ManifestSelector.d.ts +1 -1
  25. package/dist/manifest/traffic/ManifestTrafficService.d.ts +2 -2
  26. package/dist/pipelines/stages/deleteManifest/DeleteManifestOptionsForm.d.ts +1 -1
  27. package/dist/pipelines/stages/deployManifest/manifestStatus/DeployStatus.d.ts +1 -0
  28. package/dist/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.d.ts +6 -3
  29. package/dist/pipelines/stages/traffic/disableManifest.stage.d.ts +2 -1
  30. package/dist/pipelines/stages/traffic/enableManifest.stage.d.ts +2 -1
  31. package/dist/rawResource/index.d.ts +3 -1
  32. package/dist/rawResource/rawResource.dataSource.d.ts +1 -1
  33. package/dist/rawResource/rawResource.states.d.ts +4 -1
  34. package/dist/resources/resources.state.d.ts +2 -1
  35. package/dist/securityGroup/details/KubernetesSecurityGroupDetails.d.ts +49 -0
  36. package/dist/securityGroup/index.d.ts +3 -1
  37. package/dist/securityGroup/transformer.d.ts +4 -1
  38. package/dist/serverGroup/serverGroupCommandBuilder.d.ts +1 -1
  39. package/dist/serverGroup/serverGroupTransformer.d.ts +1 -1
  40. package/dist/serverGroupManager/details/ServerGroupManagerDetails.d.ts +7 -3
  41. package/package.json +3 -12
  42. package/src/help/kubernetes.help.ts +2 -0
  43. package/src/index.ts +2 -2
  44. package/src/instance/details/KubernetesInstanceDetails.spec.tsx +451 -0
  45. package/src/instance/details/KubernetesInstanceDetails.tsx +342 -0
  46. package/src/instance/details/kubernetesInstanceDetails.utils.ts +77 -0
  47. package/src/instance/index.ts +1 -1
  48. package/src/kubernetes.module.spec.ts +25 -0
  49. package/src/kubernetes.module.ts +23 -87
  50. package/src/loadBalancer/details/KubernetesLoadBalancerActions.tsx +30 -35
  51. package/src/loadBalancer/details/sections/LoadBalancerAnnotationCustomSection.tsx +2 -3
  52. package/src/loadBalancer/transformer.ts +1 -1
  53. package/src/manifest/AnnotationCustomSections.spec.tsx +178 -0
  54. package/src/manifest/AnnotationCustomSections.tsx +179 -2
  55. package/src/manifest/ManifestKindSearch.tsx +1 -1
  56. package/src/manifest/delete/Delete.tsx +0 -9
  57. package/src/manifest/delete/DeleteModal.tsx +69 -72
  58. package/src/manifest/delete/delete.types.ts +4 -0
  59. package/src/manifest/index.ts +3 -6
  60. package/src/manifest/manifest.service.ts +18 -1
  61. package/src/manifest/manifestCommandBuilder.service.spec.ts +41 -0
  62. package/src/manifest/manifestCommandBuilder.service.ts +45 -59
  63. package/src/manifest/rollout/PauseRollout.tsx +1 -9
  64. package/src/manifest/rollout/ResumeRollout.tsx +2 -10
  65. package/src/manifest/rollout/RollingRestart.tsx +16 -22
  66. package/src/manifest/rollout/UndoRollout.tsx +1 -10
  67. package/src/manifest/rollout/UndoRolloutModal.tsx +5 -1
  68. package/src/manifest/scale/Scale.tsx +12 -11
  69. package/src/manifest/scale/ScaleModal.tsx +43 -31
  70. package/src/manifest/scale/ScaleSettingsForm.tsx +8 -1
  71. package/src/manifest/selector/ManifestSelector.spec.tsx +89 -46
  72. package/src/manifest/selector/ManifestSelector.tsx +4 -5
  73. package/src/manifest/traffic/ManifestTrafficService.ts +2 -2
  74. package/src/manifest/wizard/ManifestWizard.tsx +1 -1
  75. package/src/pipelines/stages/deleteManifest/DeleteManifestOptionsForm.tsx +1 -1
  76. package/src/pipelines/stages/deleteManifest/DeleteManifestStageConfig.tsx +1 -1
  77. package/src/pipelines/stages/deployManifest/DeployManifestStageForm.tsx +16 -0
  78. package/src/pipelines/stages/deployManifest/ManifestCopier.spec.ts +52 -77
  79. package/src/pipelines/stages/deployManifest/ManifestDeploymentOptions.spec.tsx +2 -0
  80. package/src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx +39 -4
  81. package/src/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.spec.tsx +35 -0
  82. package/src/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx +10 -5
  83. package/src/pipelines/stages/traffic/ManifestTrafficStageRegistration.spec.ts +34 -0
  84. package/src/pipelines/stages/traffic/disableManifest.stage.ts +17 -19
  85. package/src/pipelines/stages/traffic/enableManifest.stage.ts +17 -19
  86. package/src/rawResource/index.ts +18 -1
  87. package/src/rawResource/rawResource.dataSource.ts +5 -8
  88. package/src/rawResource/rawResource.states.ts +50 -51
  89. package/src/resources/resources.state.spec.ts +138 -0
  90. package/src/resources/resources.state.ts +30 -35
  91. package/src/securityGroup/details/KubernetesSecurityGroupDetails.spec.tsx +292 -0
  92. package/src/securityGroup/details/KubernetesSecurityGroupDetails.tsx +304 -0
  93. package/src/securityGroup/index.ts +3 -1
  94. package/src/securityGroup/transformer.ts +2 -10
  95. package/src/serverGroup/details/KubernetesServerGroupActions.tsx +31 -61
  96. package/src/serverGroup/details/kubernetesServerGroupDetailsGetter.ts +1 -1
  97. package/src/serverGroup/details/sections/ServerGroupAnnotationCustomSection.tsx +2 -3
  98. package/src/serverGroup/serverGroupCommandBuilder.ts +1 -1
  99. package/src/serverGroup/serverGroupTransformer.ts +1 -1
  100. package/src/serverGroupManager/details/ServerGroupManagerActions.tsx +48 -128
  101. package/src/serverGroupManager/details/ServerGroupManagerDetails.spec.ts +12 -0
  102. package/src/serverGroupManager/details/ServerGroupManagerDetails.tsx +19 -8
  103. package/src/serverGroupManager/details/sections/ServerGroupManagerAnnotationCustomSection.tsx +2 -3
  104. package/src/serverGroupManager/details/useKubernetesServerGroupManagerDetails.spec.tsx +112 -0
  105. package/src/serverGroupManager/details/useKubernetesServerGroupManagerDetails.tsx +50 -29
  106. package/dist/instance/details/details.controller.d.ts +0 -1
  107. package/dist/manifest/annotationCustomSections.component.d.ts +0 -3
  108. package/dist/manifest/delete/delete.controller.d.ts +0 -12
  109. package/dist/manifest/delete/deleteOptionsForm.component.d.ts +0 -1
  110. package/dist/manifest/editor/json/jsonEditor.component.d.ts +0 -1
  111. package/dist/manifest/manifestEvents.component.d.ts +0 -1
  112. package/dist/manifest/manifestImageDetails.component.d.ts +0 -1
  113. package/dist/manifest/manifestLabels.component.d.ts +0 -1
  114. package/dist/manifest/manifestQos.component.d.ts +0 -1
  115. package/dist/manifest/manifestResources.component.d.ts +0 -1
  116. package/dist/manifest/rollout/pause.controller.d.ts +0 -1
  117. package/dist/manifest/rollout/resume.controller.d.ts +0 -1
  118. package/dist/manifest/rollout/undo.controller.d.ts +0 -5
  119. package/dist/manifest/scale/scale.controller.d.ts +0 -8
  120. package/dist/manifest/scale/scaleSettingsForm.component.d.ts +0 -1
  121. package/dist/manifest/selector/selector.component.d.ts +0 -1
  122. package/dist/manifest/status/condition.component.d.ts +0 -1
  123. package/dist/manifest/status/status.component.d.ts +0 -1
  124. package/dist/rawResource/rawResource.module.d.ts +0 -1
  125. package/dist/reactShims/index.d.ts +0 -1
  126. package/dist/reactShims/kubernetes.react.injector.d.ts +0 -11
  127. package/dist/reactShims/kubernetes.react.module.d.ts +0 -1
  128. package/dist/securityGroup/details/details.controller.d.ts +0 -1
  129. package/src/instance/details/details.controller.ts +0 -186
  130. package/src/instance/details/details.html +0 -80
  131. package/src/manifest/annotationCustomSections.component.ts +0 -114
  132. package/src/manifest/delete/delete.controller.ts +0 -80
  133. package/src/manifest/delete/delete.html +0 -42
  134. package/src/manifest/delete/deleteOptionsForm.component.ts +0 -52
  135. package/src/manifest/editor/json/jsonEditor.component.ts +0 -12
  136. package/src/manifest/manifestEvents.component.ts +0 -12
  137. package/src/manifest/manifestImageDetails.component.ts +0 -12
  138. package/src/manifest/manifestLabels.component.ts +0 -12
  139. package/src/manifest/manifestQos.component.ts +0 -12
  140. package/src/manifest/manifestResources.component.ts +0 -12
  141. package/src/manifest/rollout/pause.controller.ts +0 -66
  142. package/src/manifest/rollout/pause.html +0 -28
  143. package/src/manifest/rollout/resume.controller.ts +0 -66
  144. package/src/manifest/rollout/resume.html +0 -28
  145. package/src/manifest/rollout/undo.controller.ts +0 -74
  146. package/src/manifest/rollout/undo.html +0 -44
  147. package/src/manifest/scale/scale.controller.ts +0 -75
  148. package/src/manifest/scale/scale.html +0 -32
  149. package/src/manifest/scale/scaleSettingsForm.component.ts +0 -11
  150. package/src/manifest/selector/selector.component.ts +0 -17
  151. package/src/manifest/status/condition.component.ts +0 -12
  152. package/src/manifest/status/status.component.ts +0 -11
  153. package/src/rawResource/rawResource.module.ts +0 -8
  154. package/src/reactShims/index.ts +0 -1
  155. package/src/reactShims/kubernetes.react.injector.ts +0 -30
  156. package/src/reactShims/kubernetes.react.module.ts +0 -12
  157. package/src/securityGroup/details/details.controller.ts +0 -118
  158. 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, ReactInjector } from '@spinnaker/core';
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 ManifestDetailsLink extends React.Component<IManifestDetailsProps, IManifestDetailsState> {
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 = ReactInjector.$state.href(`home.applications.application.insight.clusters.${stateKey}`, params);
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 { module } from 'angular';
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
- export const KUBERNETES_DISABLE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.disableManifestStage';
13
- module(KUBERNETES_DISABLE_MANIFEST_STAGE, [EXECUTION_ARTIFACT_TAB]).config(() => {
14
- Registry.pipeline.registerStage({
15
- label: STAGE_NAME,
16
- description: 'Disable a Kubernetes manifest.',
17
- key: STAGE_KEY,
18
- cloudProvider: 'kubernetes',
19
- component: ManifestTrafficStageConfig,
20
- executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],
21
- supportsCustomTimeout: true,
22
- accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
23
- configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
24
- validators: manifestSelectorValidators(STAGE_NAME),
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 { module } from 'angular';
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
- export const KUBERNETES_ENABLE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.enableManifestStage';
13
- module(KUBERNETES_ENABLE_MANIFEST_STAGE, [EXECUTION_ARTIFACT_TAB]).config(() => {
14
- Registry.pipeline.registerStage({
15
- label: STAGE_NAME,
16
- description: 'Enable a Kubernetes manifest.',
17
- key: STAGE_KEY,
18
- cloudProvider: 'kubernetes',
19
- component: ManifestTrafficStageConfig,
20
- executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],
21
- supportsCustomTimeout: true,
22
- accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
23
- configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),
24
- validators: manifestSelectorValidators(STAGE_NAME),
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);
@@ -1 +1,18 @@
1
- export * from './rawResource.module';
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): PromiseLike<ApiK8sResource> =>
9
+ const fetchK8sResources = (application: Application): Promise<ApiK8sResource> =>
13
10
  REST('applications').path(application.name, 'rawResources').get();
14
11
 
15
- const formatK8sResources = (_: Application, result: ApiK8sResource): PromiseLike<ApiK8sResource> =>
16
- Promise.resolve(result);
12
+ const formatK8sResources = (_: Application, result: ApiK8sResource): Promise<ApiK8sResource> => Promise.resolve(result);
17
13
 
18
- module(KUBERNETS_RAW_RESOURCE_DATA_SOURCE, []).run(() => {
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 { module } from 'angular';
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 KUBERNETS_RAW_RESOURCE_STATES = 'spinnaker.kubernetes.rawresource.states';
18
- module(KUBERNETS_RAW_RESOURCE_STATES, [APPLICATION_STATE_PROVIDER]).config([
19
- 'applicationStateProvider',
20
- (applicationStateProvider: ApplicationStateProvider) => {
21
- const rawResourceDetails: INestedState = {
22
- name: 'rawResourceDetails',
23
- url: '/rawResourceDetails/:account/:region/:name',
24
- views: {
25
- 'detail@../insight': {
26
- component: RawResourceDetails,
27
- $type: 'react',
28
- },
29
- },
30
- resolve: {
31
- account: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.account],
32
- name: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.name],
33
- region: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.region],
34
- },
35
- data: {
36
- pageTitleDetails: {
37
- title: 'Raw Resource Details',
38
- nameParam: 'name',
39
- accountParam: 'account',
40
- },
41
- history: {
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
- applicationStateProvider.addInsightState(kubernetes);
62
- applicationStateProvider.addInsightDetailState(rawResourceDetails);
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 { module } from 'angular';
2
- import type { ApplicationStateProvider, INestedState } from '@spinnaker/core';
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 KUBERNETES_RESOURCE_STATES = 'spinnaker.core.kubernetesResource.states';
14
- module(KUBERNETES_RESOURCE_STATES, [APPLICATION_STATE_PROVIDER]).config([
15
- 'applicationStateProvider',
16
- (applicationStateProvider: ApplicationStateProvider) => {
17
- const kubernetesResourceDetails: INestedState = {
18
- name: 'kubernetesResource',
19
- url: '/manifest/:provider/:accountId/:region/:kubernetesResource',
20
- views: {
21
- 'detail@../insight': {
22
- component: KubernetesResourceDetails,
23
- $type: 'react',
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
+ });