@spinnaker/google 2026.3.1 → 2026.4.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 (108) hide show
  1. package/dist/autoscalingPolicy/GceAutoScalingFieldLayout.d.ts +2 -2
  2. package/dist/domain/loadBalancer.d.ts +6 -3
  3. package/dist/image/ImageSelect.d.ts +1 -1
  4. package/dist/index.js +159 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/loadBalancer/configure/common/gceLoadBalancerModels.d.ts +13 -2
  7. package/dist/loadBalancer/configure/http/GceHttpLoadBalancerEditor.d.ts +3 -0
  8. package/dist/loadBalancer/configure/http/GceHttpLoadBalancerModal.d.ts +1 -1
  9. package/dist/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerEditor.d.ts +30 -0
  10. package/dist/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerModal.d.ts +53 -0
  11. package/dist/loadBalancer/httpLoadBalancerUtils.service.d.ts +3 -1
  12. package/dist/serverGroup/configure/wizard/GceCloneServerGroupModal.d.ts +3 -0
  13. package/dist/serverGroup/configure/wizard/GceServerGroupWizard.types.d.ts +1 -0
  14. package/dist/serverGroup/configure/wizard/customInstance/CustomInstanceConfigurer.d.ts +1 -1
  15. package/dist/serverGroup/configure/wizard/customInstance/GceCustomInstanceBuilder.d.ts +2 -2
  16. package/dist/serverGroup/configure/wizard/pages/AdvancedSettings.d.ts +3 -0
  17. package/dist/serverGroup/configure/wizard/pages/GceServerGroupLoadBalancers.d.ts +1 -0
  18. package/dist/serverGroup/configure/wizard/pages/Policies.d.ts +21 -3
  19. package/dist/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.d.ts +1 -0
  20. package/dist/serverGroup/configure/wizard/pages/ServerGroupCapacity.d.ts +1 -0
  21. package/dist/serverGroup/configure/wizard/pages/ServerGroupImageSettings.d.ts +1 -0
  22. package/dist/serverGroup/configure/wizard/pages/ServerGroupInstanceType.d.ts +1 -0
  23. package/dist/serverGroup/configure/wizard/zones/GceInstanceFlexibilityConfigurer.d.ts +2 -2
  24. package/dist/serverGroup/details/GceInstanceFlexibilityPolicyDetails.d.ts +2 -2
  25. package/dist/serverGroup/details/stateful/MarkDiskStatefulButton.d.ts +2 -2
  26. package/dist/serverGroup/details/stateful/UpdateBootImageButton.d.ts +2 -2
  27. package/package.json +5 -5
  28. package/src/autoHealingPolicy/GceAutoHealingPolicyEditor.spec.tsx +68 -52
  29. package/src/autoscalingPolicy/GceAutoscalingPolicyEditor.spec.tsx +43 -50
  30. package/src/autoscalingPolicy/GceAutoscalingPolicyEditor.tsx +1 -1
  31. package/src/autoscalingPolicy/GceAutoscalingPolicyWriter.spec.ts +1 -1
  32. package/src/domain/loadBalancer.ts +6 -3
  33. package/src/gce.module.spec.ts +132 -153
  34. package/src/instance/details/GceInstanceDetails.spec.tsx +86 -83
  35. package/src/loadBalancer/configure/choice/GceLoadBalancerChoiceModal.spec.tsx +162 -121
  36. package/src/loadBalancer/configure/choice/GceLoadBalancerChoiceModal.tsx +13 -1
  37. package/src/loadBalancer/configure/common/GceProxyLoadBalancerEditor.spec.tsx +47 -30
  38. package/src/loadBalancer/configure/common/GceProxyLoadBalancerEditor.tsx +2 -1
  39. package/src/loadBalancer/configure/common/GceProxyLoadBalancerModal.spec.tsx +85 -57
  40. package/src/loadBalancer/configure/common/gceLoadBalancerData.spec.ts +17 -16
  41. package/src/loadBalancer/configure/common/gceLoadBalancerModels.spec.ts +230 -5
  42. package/src/loadBalancer/configure/common/gceLoadBalancerModels.ts +186 -22
  43. package/src/loadBalancer/configure/common/gceLoadBalancerSubmission.spec.ts +298 -2
  44. package/src/loadBalancer/configure/common/gceLoadBalancerSubmission.ts +35 -5
  45. package/src/loadBalancer/configure/common/useGceLoadBalancerData.spec.tsx +37 -46
  46. package/src/loadBalancer/configure/http/GceHttpLoadBalancerEditor.spec.tsx +399 -58
  47. package/src/loadBalancer/configure/http/GceHttpLoadBalancerEditor.tsx +148 -41
  48. package/src/loadBalancer/configure/http/GceHttpLoadBalancerListenerEditor.spec.tsx +169 -36
  49. package/src/loadBalancer/configure/http/GceHttpLoadBalancerListenerEditor.tsx +80 -12
  50. package/src/loadBalancer/configure/http/GceHttpLoadBalancerModal.spec.tsx +224 -124
  51. package/src/loadBalancer/configure/http/GceHttpLoadBalancerModal.tsx +8 -2
  52. package/src/loadBalancer/configure/http/GceHttpLoadBalancerResourceEditors.spec.tsx +57 -22
  53. package/src/loadBalancer/configure/http/GceHttpLoadBalancerResourceEditors.tsx +21 -0
  54. package/src/loadBalancer/configure/http/GceHttpLoadBalancerRoutingEditor.spec.tsx +24 -20
  55. package/src/loadBalancer/configure/network/GceNetworkLoadBalancerEditor.spec.tsx +41 -32
  56. package/src/loadBalancer/configure/network/GceNetworkLoadBalancerModal.spec.tsx +35 -30
  57. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerEditor.spec.tsx +443 -0
  58. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerEditor.tsx +401 -0
  59. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerModal.spec.tsx +330 -0
  60. package/src/loadBalancer/configure/network/GceRegionalExternalNetworkLoadBalancerModal.tsx +348 -0
  61. package/src/loadBalancer/details/gceLoadBalancerDetails.spec.tsx +439 -35
  62. package/src/loadBalancer/details/gceLoadBalancerDetails.tsx +104 -21
  63. package/src/loadBalancer/httpLoadBalancerUtils.service.spec.ts +126 -0
  64. package/src/loadBalancer/httpLoadBalancerUtils.service.ts +27 -11
  65. package/src/loadBalancer/loadBalancer.setTransformer.spec.ts +165 -0
  66. package/src/loadBalancer/loadBalancer.setTransformer.ts +15 -2
  67. package/src/pipeline/stages/googleStageConfig.spec.js +22 -16
  68. package/src/securityGroup/configure/GceSecurityGroupModal.spec.tsx +177 -193
  69. package/src/securityGroup/configure/GceSecurityGroupModal.tsx +14 -2
  70. package/src/securityGroup/details/GceSecurityGroupDetails.spec.tsx +69 -78
  71. package/src/serverGroup/configure/serverGroupCommandBuilder.service.spec.js +35 -15
  72. package/src/serverGroup/configure/serverGroupConfiguration.service.js +7 -1
  73. package/src/serverGroup/configure/serverGroupConfiguration.service.spec.js +74 -4
  74. package/src/serverGroup/configure/wizard/GceCloneServerGroupModal.spec.tsx +593 -855
  75. package/src/serverGroup/configure/wizard/GceCloneServerGroupModal.tsx +120 -38
  76. package/src/serverGroup/configure/wizard/GceServerGroupWizard.types.ts +1 -0
  77. package/src/serverGroup/configure/wizard/GceServerGroupWizardPage.spec.tsx +53 -50
  78. package/src/serverGroup/configure/wizard/customInstance/GceCustomInstanceBuilder.spec.tsx +65 -49
  79. package/src/serverGroup/configure/wizard/hiddenMetadataKeys.value.js +1 -0
  80. package/src/serverGroup/configure/wizard/pages/AdvancedSettings.spec.tsx +101 -108
  81. package/src/serverGroup/configure/wizard/pages/AdvancedSettings.tsx +32 -28
  82. package/src/serverGroup/configure/wizard/pages/GceServerGroupFirewalls.spec.tsx +60 -59
  83. package/src/serverGroup/configure/wizard/pages/GceServerGroupLoadBalancers.spec.tsx +240 -114
  84. package/src/serverGroup/configure/wizard/pages/GceServerGroupLoadBalancers.tsx +152 -63
  85. package/src/serverGroup/configure/wizard/pages/Policies.spec.tsx +93 -48
  86. package/src/serverGroup/configure/wizard/pages/Policies.tsx +80 -55
  87. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.spec.tsx +123 -94
  88. package/src/serverGroup/configure/wizard/pages/ServerGroupBasicSettings.tsx +24 -18
  89. package/src/serverGroup/configure/wizard/pages/ServerGroupCapacity.spec.tsx +152 -133
  90. package/src/serverGroup/configure/wizard/pages/ServerGroupCapacity.tsx +40 -37
  91. package/src/serverGroup/configure/wizard/pages/ServerGroupImageSettings.spec.tsx +66 -60
  92. package/src/serverGroup/configure/wizard/pages/ServerGroupImageSettings.tsx +8 -2
  93. package/src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.spec.tsx +131 -101
  94. package/src/serverGroup/configure/wizard/pages/ServerGroupInstanceType.tsx +29 -28
  95. package/src/serverGroup/configure/wizard/zones/GceInstanceFlexibilityConfigurer.spec.tsx +104 -81
  96. package/src/serverGroup/details/GceInstanceFlexibilityPolicyDetails.spec.tsx +10 -11
  97. package/src/serverGroup/details/autoHealingPolicy/GceAutoHealingPolicyDetails.spec.tsx +51 -59
  98. package/src/serverGroup/details/autoHealingPolicy/modal/GceUpsertAutoHealingPolicyModal.spec.tsx +3 -3
  99. package/src/serverGroup/details/autoscalingPolicy/GceAutoscalingPolicyDetails.spec.tsx +49 -58
  100. package/src/serverGroup/details/autoscalingPolicy/modal/GceUpsertAutoscalingPolicyModal.spec.tsx +3 -3
  101. package/src/serverGroup/details/gceServerGroupDetails.spec.tsx +162 -141
  102. package/src/serverGroup/details/resize/GceResizeServerGroupModal.spec.tsx +102 -86
  103. package/src/serverGroup/details/resize/GceResizeServerGroupModal.tsx +4 -0
  104. package/src/serverGroup/details/rollback/GceRollbackServerGroupModal.spec.tsx +40 -31
  105. package/src/serverGroup/serverGroup.transformer.js +1 -0
  106. package/src/serverGroup/serverGroup.transformer.spec.js +48 -0
  107. package/src/validation/ApplicationNameValidator.spec.ts +1 -1
  108. /package/dist/{gce.logo2ae85d8704b1d6b8.png → gce.logoChI3w_A5.png} +0 -0
@@ -1,4 +1,4 @@
1
- export declare const GCE_LOAD_BALANCER_TYPES: readonly ["NETWORK", "INTERNAL", "TCP", "SSL", "HTTP", "INTERNAL_MANAGED"];
1
+ export declare const GCE_LOAD_BALANCER_TYPES: readonly ["NETWORK", "INTERNAL", "TCP", "SSL", "HTTP", "INTERNAL_MANAGED", "EXTERNAL_MANAGED", "REGIONAL_EXTERNAL_NETWORK"];
2
2
  export type GceLoadBalancerType = typeof GCE_LOAD_BALANCER_TYPES[number];
3
3
  export type GceLoadBalancerEditorMode = 'create' | 'edit' | 'pipeline';
4
4
  export type GceLoadBalancerProtocol = 'TCP' | 'UDP' | 'HTTP' | 'HTTPS' | 'HTTP2' | 'GRPC' | 'SSL';
@@ -24,6 +24,7 @@ export interface IGceLoadBalancerListener {
24
24
  address?: IGceResourceReference;
25
25
  certificate?: IGceResourceReference;
26
26
  certificateMap?: string;
27
+ networkTier?: string;
27
28
  subnet?: IGceResourceReference;
28
29
  }
29
30
  export interface IGceLoadBalancerHealthCheck {
@@ -33,7 +34,7 @@ export interface IGceLoadBalancerHealthCheck {
33
34
  healthyThreshold?: number;
34
35
  host?: string;
35
36
  name?: string;
36
- port?: number;
37
+ port?: number | string;
37
38
  proxyHeader?: string;
38
39
  requestPath?: string;
39
40
  timeoutSec?: number;
@@ -42,8 +43,15 @@ export interface IGceLoadBalancerHealthCheck {
42
43
  [key: string]: unknown;
43
44
  }
44
45
  export interface IGceLoadBalancerBackendService {
46
+ affinityCookieTtlSec?: number;
47
+ backends?: unknown[];
48
+ connectionDrainingTimeoutSec?: number;
49
+ enableCDN?: boolean;
45
50
  name: string;
46
51
  healthCheck?: IGceResourceReference;
52
+ portName?: string;
53
+ protocol?: GceLoadBalancerProtocol;
54
+ sessionAffinity?: string;
47
55
  [key: string]: unknown;
48
56
  }
49
57
  export interface IGceLoadBalancerPathRule {
@@ -76,6 +84,7 @@ interface IGceLoadBalancerCommandBase {
76
84
  defaultService?: IGceResourceReference;
77
85
  network?: IGceResourceReference;
78
86
  original?: IGceLoadBalancerOriginalState;
87
+ networkTier?: string;
79
88
  subnet?: IGceResourceReference;
80
89
  }
81
90
  export interface IGceCreateLoadBalancerCommand extends IGceLoadBalancerCommandBase {
@@ -103,4 +112,6 @@ type UnknownRecord = Record<string, unknown>;
103
112
  export declare function normalizeGceLoadBalancerCommand(persisted: UnknownRecord, mode: GceLoadBalancerEditorMode): IGceLoadBalancerCommand;
104
113
  export declare function serializeGceLoadBalancerCommand(command: IGceLoadBalancerCommand): IGceSerializedLoadBalancerCommand;
105
114
  export declare function normalizeGceHealthCheck(value: unknown): IGceLoadBalancerHealthCheck;
115
+ export declare function serializeGceBackendService(service: IGceLoadBalancerBackendService): UnknownRecord;
116
+ export declare function serializeGceHealthCheck(healthCheck: IGceLoadBalancerHealthCheck): UnknownRecord;
106
117
  export {};
@@ -8,8 +8,11 @@ export interface IGceHttpLoadBalancerEditorProps {
8
8
  }
9
9
  interface IGceHttpLoadBalancerDataItem extends IGceLoadBalancerDataItem {
10
10
  account?: string;
11
+ address?: string;
12
+ addressType?: string;
11
13
  id?: string;
12
14
  network?: string;
15
+ purpose?: string;
13
16
  region?: string;
14
17
  }
15
18
  export declare function FormRow({ children, label }: {
@@ -12,7 +12,7 @@ export interface IGceHttpLoadBalancerModalProps extends IModalComponentProps {
12
12
  forPipelineConfig?: boolean;
13
13
  isNew?: boolean;
14
14
  loadBalancer?: Record<string, unknown>;
15
- loadBalancerType?: Extract<GceLoadBalancerType, 'HTTP' | 'INTERNAL_MANAGED'>;
15
+ loadBalancerType?: Extract<GceLoadBalancerType, 'HTTP' | 'INTERNAL_MANAGED' | 'EXTERNAL_MANAGED'>;
16
16
  mode?: GceLoadBalancerEditorMode;
17
17
  }
18
18
  interface IGceHttpLoadBalancerModalState extends IGceLoadBalancerDataState {
@@ -0,0 +1,30 @@
1
+ /// <reference types="react" />
2
+ import type { IGceLoadBalancerCommand, IGceLoadBalancerData, IGceLoadBalancerDataItem, IGceLoadBalancerHealthCheck } from '../common';
3
+ export type GceRegionalExternalNetworkSessionAffinity = 'NONE' | 'CLIENT_IP' | 'CLIENT_IP_PROTO' | 'CLIENT_IP_PORT_PROTO';
4
+ export type IGceRegionalExternalNetworkLoadBalancerCommand = IGceLoadBalancerCommand & {
5
+ loadBalancerType: 'REGIONAL_EXTERNAL_NETWORK';
6
+ ports: string[];
7
+ };
8
+ interface IGceRegionalExternalNetworkDataItem extends IGceLoadBalancerDataItem {
9
+ account?: string;
10
+ address?: string;
11
+ addressType?: string;
12
+ credentials?: string;
13
+ networkTier?: string;
14
+ region?: string;
15
+ }
16
+ export interface IGceRegionalExternalNetworkLoadBalancerOptions {
17
+ accounts: IGceRegionalExternalNetworkDataItem[];
18
+ addresses: IGceRegionalExternalNetworkDataItem[];
19
+ regions: IGceRegionalExternalNetworkDataItem[];
20
+ }
21
+ export interface IGceRegionalExternalNetworkLoadBalancerEditorProps {
22
+ command: IGceRegionalExternalNetworkLoadBalancerCommand;
23
+ data: IGceLoadBalancerData;
24
+ onChange: (command: IGceRegionalExternalNetworkLoadBalancerCommand) => void;
25
+ }
26
+ export declare function createGceRegionalExternalNetworkHealthCheck(name: string): IGceLoadBalancerHealthCheck;
27
+ export declare function buildGceRegionalExternalNetworkLoadBalancerOptions(command: IGceRegionalExternalNetworkLoadBalancerCommand, data: IGceLoadBalancerData): IGceRegionalExternalNetworkLoadBalancerOptions;
28
+ export declare function validateGceRegionalExternalNetworkLoadBalancerCommand(command: IGceRegionalExternalNetworkLoadBalancerCommand): string[];
29
+ export declare function GceRegionalExternalNetworkLoadBalancerEditor({ command, data, onChange, }: IGceRegionalExternalNetworkLoadBalancerEditorProps): JSX.Element;
30
+ export {};
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import type { Application, IModalComponentProps, ITask, ITaskCommand } from '@spinnaker/core';
3
+ import { TaskMonitor } from '@spinnaker/core';
4
+ import type { IGceRegionalExternalNetworkLoadBalancerCommand } from './GceRegionalExternalNetworkLoadBalancerEditor';
5
+ import type { GceLoadBalancerEditorMode, IGceLoadBalancerData, IGceLoadBalancerDataReaders, IGceLoadBalancerDataState, IGceSerializedLoadBalancerCommand } from '../common';
6
+ type UnknownRecord = Record<string, any>;
7
+ export interface IGceRegionalExternalNetworkLoadBalancerPayload extends IGceSerializedLoadBalancerCommand {
8
+ backendService: UnknownRecord;
9
+ ipAddress?: string;
10
+ ipProtocol: string;
11
+ networkTier?: string;
12
+ ports: string[];
13
+ }
14
+ export interface IGceRegionalExternalNetworkLoadBalancerModalProps extends IModalComponentProps {
15
+ app?: Application;
16
+ application?: Application;
17
+ credentials?: string;
18
+ data?: IGceLoadBalancerData;
19
+ dataReaders?: IGceLoadBalancerDataReaders;
20
+ executeTask?: (taskCommand: ITaskCommand) => PromiseLike<ITask>;
21
+ forPipelineConfig?: boolean;
22
+ isNew?: boolean;
23
+ loadBalancer?: UnknownRecord;
24
+ mode?: GceLoadBalancerEditorMode;
25
+ }
26
+ interface IGceRegionalExternalNetworkLoadBalancerModalState extends IGceLoadBalancerDataState {
27
+ command: IGceRegionalExternalNetworkLoadBalancerCommand;
28
+ taskMonitor: TaskMonitor;
29
+ }
30
+ interface IGceRegionalExternalNetworkSubmissionDependencies {
31
+ application: Application;
32
+ executeTask?: (taskCommand: ITaskCommand) => PromiseLike<ITask>;
33
+ }
34
+ export declare function normalizeGceRegionalExternalNetworkLoadBalancerCommand(persisted: UnknownRecord | null | undefined, mode: GceLoadBalancerEditorMode, applicationName?: string, defaults?: Partial<Record<'credentials' | 'region', unknown>>): IGceRegionalExternalNetworkLoadBalancerCommand;
35
+ export declare function serializeGceRegionalExternalNetworkLoadBalancerCommand(command: IGceRegionalExternalNetworkLoadBalancerCommand): IGceRegionalExternalNetworkLoadBalancerPayload;
36
+ export declare function submitGceRegionalExternalNetworkLoadBalancerCommand(command: IGceRegionalExternalNetworkLoadBalancerCommand, { application, executeTask }: IGceRegionalExternalNetworkSubmissionDependencies): IGceRegionalExternalNetworkLoadBalancerPayload | Promise<ITask>;
37
+ declare class GceRegionalExternalNetworkLoadBalancerModalComponent extends React.Component<IGceRegionalExternalNetworkLoadBalancerModalProps, IGceRegionalExternalNetworkLoadBalancerModalState> {
38
+ private dataController?;
39
+ private unsubscribe?;
40
+ constructor(props: IGceRegionalExternalNetworkLoadBalancerModalProps);
41
+ componentDidMount(): void;
42
+ componentWillUnmount(): void;
43
+ render(): JSX.Element;
44
+ private application;
45
+ private mode;
46
+ private updateCommand;
47
+ private submit;
48
+ }
49
+ export declare const GceRegionalExternalNetworkLoadBalancerModal: typeof GceRegionalExternalNetworkLoadBalancerModalComponent & {
50
+ show: (props: IGceRegionalExternalNetworkLoadBalancerModalProps) => Promise<any>;
51
+ supportsPipelineConfig: boolean;
52
+ };
53
+ export {};
@@ -1,6 +1,8 @@
1
1
  import type { IGceHttpLoadBalancer, IGceLoadBalancer } from '../domain/loadBalancer';
2
2
  export declare class GceHttpLoadBalancerUtils {
3
3
  static REGION: string;
4
+ static HTTP_LOAD_BALANCER_TYPES: string[];
4
5
  isHttpLoadBalancer(lb: IGceLoadBalancer): lb is IGceHttpLoadBalancer;
5
- normalizeLoadBalancerNamesForAccount(loadBalancerNames: string[], account: string, loadBalancers: IGceLoadBalancer[]): string[];
6
+ isRegionalHttpLoadBalancer(lb: IGceLoadBalancer): lb is IGceHttpLoadBalancer;
7
+ normalizeLoadBalancerNamesForAccount(loadBalancerNames: string[], account: string, loadBalancers: IGceLoadBalancer[], region?: string): string[];
6
8
  }
@@ -31,6 +31,7 @@ export declare class GceCloneServerGroupModalComponent extends React.Component<I
31
31
  static show(props: IGceCloneServerGroupModalProps, runtimeServices: DeckRuntimeServices): Promise<any>;
32
32
  constructor(props: IGceCloneServerGroupModalProps & IRouterInjectedProps, context: React.ContextType<typeof DeckRuntimeContext>);
33
33
  componentDidMount(): void;
34
+ componentDidUpdate(previousProps: IGceCloneServerGroupModalProps & IRouterInjectedProps): void;
34
35
  componentWillUnmount(): void;
35
36
  private configureCommand;
36
37
  private retryConfiguration;
@@ -46,4 +47,6 @@ export declare const GceCloneServerGroupModal: React.ForwardRefExoticComponent<O
46
47
  } & React.RefAttributes<any>> & {
47
48
  show: typeof GceCloneServerGroupModalComponent.show;
48
49
  };
50
+ export declare function reconcileGceServerGroupCommand(persistedCommand: IGceServerGroupCommand, configuredCommand: IGceServerGroupCommand): IGceServerGroupCommand;
51
+ export declare function initializePipelineCreateCommand(baseCommand: IGceServerGroupCommand, placeholder: IGceServerGroupCommand): IGceServerGroupCommand;
49
52
  export {};
@@ -107,6 +107,7 @@ export interface IGceServerGroupCommandValidationErrors {
107
107
  };
108
108
  freeFormDetails?: string;
109
109
  image?: string;
110
+ loadBalancers?: string;
110
111
  region?: string;
111
112
  stack?: string;
112
113
  zone?: string;
@@ -17,7 +17,7 @@ export interface ICustomInstanceConfigurerProps {
17
17
  onChange: (config: ICustomInstanceConfig) => void;
18
18
  }
19
19
  export declare class CustomInstanceConfigurer extends React.Component<ICustomInstanceConfigurerProps> {
20
- render(): JSX.Element;
20
+ render(): React.JSX.Element;
21
21
  private handleVCpuChange;
22
22
  private handleMemoryChange;
23
23
  private handleInstanceFamilyChange;
@@ -1,3 +1,3 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import type { ICustomInstanceBuilderProps } from '@spinnaker/core';
3
- export declare function GceCustomInstanceBuilder({ command, onTypeChanged }: ICustomInstanceBuilderProps): JSX.Element;
3
+ export declare function GceCustomInstanceBuilder({ command, onTypeChanged }: ICustomInstanceBuilderProps): React.JSX.Element;
@@ -18,3 +18,6 @@ export declare class AdvancedSettings extends GceServerGroupWizardPage {
18
18
  private booleanRadios;
19
19
  render(): JSX.Element;
20
20
  }
21
+ export declare function validateGceAdvancedSettings(values: IGceServerGroupCommand): {
22
+ [key: string]: string;
23
+ };
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { IGceServerGroupCommand, IGceServerGroupCommandValidationErrors, IGceServerGroupWizardPageProps } from '../GceServerGroupWizard.types';
3
3
  import { GceServerGroupWizardPage } from '../GceServerGroupWizardPage';
4
+ export declare function validateGceServerGroupLoadBalancers(values: IGceServerGroupCommand): IGceServerGroupCommandValidationErrors;
4
5
  export declare class GceServerGroupLoadBalancers extends GceServerGroupWizardPage<IGceServerGroupWizardPageProps> {
5
6
  validate(values: IGceServerGroupCommand): IGceServerGroupCommandValidationErrors;
6
7
  render(): React.ReactElement;
@@ -1,10 +1,26 @@
1
1
  /// <reference types="react" />
2
2
  import type { IGceServerGroupCommand } from '../GceServerGroupWizard.types';
3
3
  import { GceServerGroupWizardPage } from '../GceServerGroupWizardPage';
4
+ interface IAutoscalingPolicyValidationErrors {
5
+ coolDownPeriodSec?: string;
6
+ maxNumReplicas?: string;
7
+ metric?: string;
8
+ minNumReplicas?: string;
9
+ predictiveAutoscaling?: string;
10
+ scaleInControl?: string;
11
+ scalingSchedules?: string;
12
+ }
13
+ interface IAutoHealingPolicyValidationErrors {
14
+ healthCheck?: string;
15
+ healthCheckKind?: string;
16
+ initialDelaySec?: string;
17
+ }
18
+ interface IPoliciesValidationErrors {
19
+ autoHealingPolicy?: IAutoHealingPolicyValidationErrors;
20
+ autoscalingPolicy?: IAutoscalingPolicyValidationErrors;
21
+ }
4
22
  export declare class Policies extends GceServerGroupWizardPage {
5
- validate(values: IGceServerGroupCommand): {
6
- [key: string]: any;
7
- };
23
+ validate(values: IGceServerGroupCommand): IPoliciesValidationErrors;
8
24
  private setField;
9
25
  private toggleAutoscaling;
10
26
  private setAutoscalingPolicy;
@@ -12,3 +28,5 @@ export declare class Policies extends GceServerGroupWizardPage {
12
28
  private filteredHealthCheckReader;
13
29
  render(): JSX.Element;
14
30
  }
31
+ export declare function validateGceServerGroupPolicies(values: IGceServerGroupCommand): IPoliciesValidationErrors;
32
+ export {};
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import type { IGceServerGroupCommand, IGceServerGroupCommandValidationErrors } from '../GceServerGroupWizard.types';
3
3
  import { GceServerGroupWizardPage } from '../GceServerGroupWizardPage';
4
+ export declare function validateGceServerGroupBasicSettings(values: IGceServerGroupCommand): IGceServerGroupCommandValidationErrors;
4
5
  export declare class ServerGroupBasicSettings extends GceServerGroupWizardPage {
5
6
  validate(values: IGceServerGroupCommand): IGceServerGroupCommandValidationErrors;
6
7
  private parentChanged;
@@ -16,6 +16,7 @@ interface ICapacityValidationErrors {
16
16
  instanceFlexibilityPolicy?: string;
17
17
  zone?: string;
18
18
  }
19
+ export declare function validateGceServerGroupCapacity(values: IGceServerGroupCommand): ICapacityValidationErrors;
19
20
  export declare class ServerGroupCapacity extends GceServerGroupWizardPage {
20
21
  validate(values: IGceServerGroupCommand): ICapacityValidationErrors;
21
22
  private commandChanged;
@@ -9,3 +9,4 @@ export declare class ServerGroupImageSettings extends GceServerGroupWizardPage {
9
9
  private renderImageSelect;
10
10
  render(): JSX.Element;
11
11
  }
12
+ export declare function validateGceServerGroupImageSettings(values: IGceServerGroupCommand): IGceServerGroupCommandValidationErrors;
@@ -7,6 +7,7 @@ interface IGceInstanceTypeValidationErrors {
7
7
  disks?: string;
8
8
  instanceType?: string;
9
9
  }
10
+ export declare function validateGceServerGroupInstanceType(values: IGceServerGroupCommand): IGceInstanceTypeValidationErrors;
10
11
  export declare class ServerGroupInstanceType extends GceServerGroupWizardPage {
11
12
  static contextType: React.Context<import("@spinnaker/core").DeckRuntimeContextValue>;
12
13
  context: React.ContextType<typeof DeckRuntimeContext>;
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import type { IGceInstanceFlexibilityPolicy } from '../../../../domain/serverGroup';
3
3
  export interface IGceInstanceFlexibilityConfigurerProps {
4
4
  instanceFlexibilityPolicy?: IGceInstanceFlexibilityPolicy;
@@ -9,7 +9,7 @@ export interface IGceInstanceFlexibilityConfigurerProps {
9
9
  }
10
10
  /** First unused selection-N name so rename/remove cannot overwrite an existing entry. */
11
11
  export declare function nextSelectionName(existingNames: string[]): string;
12
- export declare function GceInstanceFlexibilityConfigurer({ instanceFlexibilityPolicy, regional, targetShape: targetShapeProp, validationError, setInstanceFlexibilityPolicy, }: IGceInstanceFlexibilityConfigurerProps): JSX.Element;
12
+ export declare function GceInstanceFlexibilityConfigurer({ instanceFlexibilityPolicy, regional, targetShape: targetShapeProp, validationError, setInstanceFlexibilityPolicy, }: IGceInstanceFlexibilityConfigurerProps): React.JSX.Element;
13
13
  export declare function hasValidFlexibilityPolicy(command: {
14
14
  regional?: boolean;
15
15
  distributionPolicy?: {
@@ -1,6 +1,6 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import type { IGceInstanceFlexibilityPolicy } from '../../domain/serverGroup';
3
3
  export interface IGceInstanceFlexibilityPolicyDetailsProps {
4
4
  instanceFlexibilityPolicy?: IGceInstanceFlexibilityPolicy;
5
5
  }
6
- export declare function GceInstanceFlexibilityPolicyDetails({ instanceFlexibilityPolicy, }: IGceInstanceFlexibilityPolicyDetailsProps): JSX.Element;
6
+ export declare function GceInstanceFlexibilityPolicyDetails({ instanceFlexibilityPolicy, }: IGceInstanceFlexibilityPolicyDetailsProps): React.JSX.Element;
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import type { Application } from '@spinnaker/core';
3
3
  import type { IGceServerGroup } from '../../../domain';
4
4
  interface IMarkDiskStatefulButtonProps {
@@ -6,5 +6,5 @@ interface IMarkDiskStatefulButtonProps {
6
6
  deviceName: string;
7
7
  serverGroup: IGceServerGroup;
8
8
  }
9
- export declare function MarkDiskStatefulButton({ application, deviceName, serverGroup }: IMarkDiskStatefulButtonProps): JSX.Element;
9
+ export declare function MarkDiskStatefulButton({ application, deviceName, serverGroup }: IMarkDiskStatefulButtonProps): React.JSX.Element;
10
10
  export {};
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import type { Application } from '@spinnaker/core';
3
3
  import type { IGceServerGroup } from '../../../domain';
4
4
  interface IUpdateBootImageButtonProps {
@@ -6,5 +6,5 @@ interface IUpdateBootImageButtonProps {
6
6
  bootImage: string;
7
7
  serverGroup: IGceServerGroup;
8
8
  }
9
- export declare function UpdateBootImageButton(props: IUpdateBootImageButtonProps): JSX.Element;
9
+ export declare function UpdateBootImageButton(props: IUpdateBootImageButtonProps): React.JSX.Element;
10
10
  export {};
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "https://github.com/spinnaker/spinnaker.git"
6
6
  },
7
7
  "license": "Apache-2.0",
8
- "version": "2026.3.1",
8
+ "version": "2026.4.0",
9
9
  "module": "dist/index.js",
10
10
  "typings": "dist/index.d.ts",
11
11
  "publishConfig": {
@@ -23,18 +23,18 @@
23
23
  "dependencies": {
24
24
  "@spinnaker/core": "^0.29.1",
25
25
  "lodash": "4.18.1",
26
- "react": "16.14.0",
26
+ "react": "17.0.2",
27
27
  "react-select": "1.2.1",
28
- "rxjs": "6.6.7"
28
+ "rxjs": "7.8.2"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@spinnaker/eslint-plugin": "^3.0.2",
32
32
  "@spinnaker/scripts": "^0.4.0",
33
33
  "@types/lodash": "4.14.64",
34
- "@types/react": "16.14.10",
34
+ "@types/react": "17.0.93",
35
35
  "@types/react-select": "1.3.4",
36
36
  "shx": "0.3.3",
37
37
  "typescript": "5.0.4"
38
38
  },
39
- "gitHead": "edb1aa9de446184eadee134ea51110609278929f"
39
+ "gitHead": "8d2819815061bd8ddc714287d229fce3d3d0a16b"
40
40
  }
@@ -1,18 +1,13 @@
1
+ import { fireEvent, render, screen, waitFor, within } from '@testing-library/react';
1
2
  import React from 'react';
2
- import { shallow } from 'enzyme';
3
3
 
4
- import { IGceHealthCheckKind } from '../domain';
5
4
  import { GceAutoHealingPolicyEditor } from './GceAutoHealingPolicyEditor';
5
+ import { IGceHealthCheckKind } from '../domain';
6
6
 
7
7
  describe('GceAutoHealingPolicyEditor', () => {
8
- async function flush(): Promise<void> {
9
- await Promise.resolve();
10
- await Promise.resolve();
11
- }
12
-
13
8
  it('loads only health checks from the selected account', async () => {
14
9
  const reader = {
15
- listHealthChecks: jasmine.createSpy('listHealthChecks').and.returnValue(
10
+ listHealthChecks: vi.fn().mockReturnValue(
16
11
  Promise.resolve([
17
12
  {
18
13
  account: 'my-account',
@@ -29,26 +24,40 @@ describe('GceAutoHealingPolicyEditor', () => {
29
24
  ]),
30
25
  ),
31
26
  };
32
- const wrapper = shallow(
27
+ render(
33
28
  <GceAutoHealingPolicyEditor account="my-account" policy={{}} onChange={() => undefined} reader={reader as any} />,
34
29
  );
35
30
 
36
- await flush();
37
- wrapper.update();
38
-
39
- expect(wrapper.find('[data-testid="health-check"] option').length).toBe(2);
40
- expect(wrapper.find('[data-testid="health-check"]').text()).toContain('web');
41
- expect(wrapper.find('[data-testid="health-check"]').text()).not.toContain('other');
31
+ const select = await screen.findByTestId('health-check');
32
+ await waitFor(() => expect(reader.listHealthChecks).toHaveBeenCalled());
33
+ expect(within(select).getAllByRole('option')).toHaveLength(2);
34
+ expect(select).toHaveTextContent('web');
35
+ expect(select).not.toHaveTextContent('other');
42
36
  });
43
37
 
44
- it('writes the selected health check name and kind from its URL', () => {
45
- const onChange = jasmine.createSpy('onChange');
46
- const wrapper = shallow(
47
- <GceAutoHealingPolicyEditor account="my-account" policy={{ initialDelaySec: 0 }} onChange={onChange} />,
48
- { disableLifecycleMethods: true },
38
+ it('writes the selected health check name and kind from its URL', async () => {
39
+ const onChange = vi.fn();
40
+ const reader = {
41
+ listHealthChecks: vi.fn().mockResolvedValue([
42
+ {
43
+ account: 'my-account',
44
+ kind: IGceHealthCheckKind.httpHealthCheck,
45
+ name: 'web',
46
+ selfLink: 'https://compute/httpHealthChecks/web',
47
+ },
48
+ ]),
49
+ };
50
+ render(
51
+ <GceAutoHealingPolicyEditor
52
+ account="my-account"
53
+ policy={{ initialDelaySec: 0 }}
54
+ onChange={onChange}
55
+ reader={reader as any}
56
+ />,
49
57
  );
50
58
 
51
- wrapper.find('[data-testid="health-check"]').simulate('change', {
59
+ await waitFor(() => expect(screen.getByTestId('health-check')).toBeEnabled());
60
+ fireEvent.change(screen.getByTestId('health-check'), {
52
61
  target: { value: 'https://compute/httpHealthChecks/web' },
53
62
  });
54
63
 
@@ -61,11 +70,11 @@ describe('GceAutoHealingPolicyEditor', () => {
61
70
  });
62
71
 
63
72
  it('normalizes an existing healthCheck URL into its URL, name, and kind fields', async () => {
64
- const onChange = jasmine.createSpy('onChange');
73
+ const onChange = vi.fn();
65
74
  const reader = {
66
- listHealthChecks: jasmine.createSpy('listHealthChecks').and.returnValue(Promise.resolve([])),
75
+ listHealthChecks: vi.fn().mockReturnValue(Promise.resolve([])),
67
76
  };
68
- shallow(
77
+ render(
69
78
  <GceAutoHealingPolicyEditor
70
79
  account="my-account"
71
80
  policy={{ healthCheck: 'https://compute/httpHealthChecks/web', initialDelaySec: 0 }}
@@ -74,20 +83,20 @@ describe('GceAutoHealingPolicyEditor', () => {
74
83
  />,
75
84
  );
76
85
 
77
- await flush();
78
-
79
- expect(onChange).toHaveBeenCalledWith({
80
- healthCheckUrl: 'https://compute/httpHealthChecks/web',
81
- healthCheck: 'web',
82
- healthCheckKind: IGceHealthCheckKind.httpHealthCheck,
83
- initialDelaySec: 0,
84
- });
86
+ await waitFor(() =>
87
+ expect(onChange).toHaveBeenCalledWith({
88
+ healthCheckUrl: 'https://compute/httpHealthChecks/web',
89
+ healthCheck: 'web',
90
+ healthCheckKind: IGceHealthCheckKind.httpHealthCheck,
91
+ initialDelaySec: 0,
92
+ }),
93
+ );
85
94
  });
86
95
 
87
96
  it('resolves an existing healthCheck name to the matching URL and kind', async () => {
88
- const onChange = jasmine.createSpy('onChange');
97
+ const onChange = vi.fn();
89
98
  const reader = {
90
- listHealthChecks: jasmine.createSpy('listHealthChecks').and.returnValue(
99
+ listHealthChecks: vi.fn().mockReturnValue(
91
100
  Promise.resolve([
92
101
  {
93
102
  account: 'my-account',
@@ -98,7 +107,7 @@ describe('GceAutoHealingPolicyEditor', () => {
98
107
  ]),
99
108
  ),
100
109
  };
101
- shallow(
110
+ render(
102
111
  <GceAutoHealingPolicyEditor
103
112
  account="my-account"
104
113
  policy={{ healthCheck: 'web', initialDelaySec: 0 }}
@@ -107,27 +116,34 @@ describe('GceAutoHealingPolicyEditor', () => {
107
116
  />,
108
117
  );
109
118
 
110
- await flush();
111
-
112
- expect(onChange).toHaveBeenCalledWith({
113
- healthCheckUrl: 'https://compute/healthChecks/web',
114
- healthCheck: 'web',
115
- healthCheckKind: IGceHealthCheckKind.healthCheck,
116
- initialDelaySec: 0,
117
- });
119
+ await waitFor(() =>
120
+ expect(onChange).toHaveBeenCalledWith({
121
+ healthCheckUrl: 'https://compute/healthChecks/web',
122
+ healthCheck: 'web',
123
+ healthCheckKind: IGceHealthCheckKind.healthCheck,
124
+ initialDelaySec: 0,
125
+ }),
126
+ );
118
127
  });
119
128
 
120
- it('preserves zero for initial delay without rendering legacy max unavailable controls', () => {
121
- const onChange = jasmine.createSpy('onChange');
129
+ it('preserves zero for initial delay without rendering legacy max unavailable controls', async () => {
130
+ const onChange = vi.fn();
131
+ const reader = { listHealthChecks: vi.fn().mockResolvedValue([]) };
122
132
  const legacyPolicy = { initialDelaySec: 0, maxUnavailable: { percent: 0 } };
123
- const wrapper = shallow(
124
- <GceAutoHealingPolicyEditor account="my-account" policy={legacyPolicy as any} onChange={onChange} />,
125
- { disableLifecycleMethods: true },
133
+ const { container } = render(
134
+ <GceAutoHealingPolicyEditor
135
+ account="my-account"
136
+ policy={legacyPolicy as any}
137
+ onChange={onChange}
138
+ reader={reader as any}
139
+ />,
126
140
  );
127
141
 
128
- expect(wrapper.find('[data-testid="initial-delay"]').prop('value')).toBe(0);
129
- expect(wrapper.find('[data-testid="max-unavailable"]').exists()).toBe(false);
130
- expect(wrapper.find('[data-testid="max-unavailable-unit"]').exists()).toBe(false);
131
- expect(wrapper.text()).not.toContain('Max unavailable');
142
+ await waitFor(() => expect(screen.getByTestId('health-check')).toBeEnabled());
143
+ expect(reader.listHealthChecks).toHaveBeenCalled();
144
+ expect(screen.getByTestId('initial-delay')).toHaveValue(0);
145
+ expect(screen.queryByTestId('max-unavailable')).not.toBeInTheDocument();
146
+ expect(screen.queryByTestId('max-unavailable-unit')).not.toBeInTheDocument();
147
+ expect(container).not.toHaveTextContent('Max unavailable');
132
148
  });
133
149
  });