@spinnaker/appengine 2026.2.2 → 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 (131) hide show
  1. package/dist/appengine.module.d.ts +7 -1
  2. package/dist/domain/index.d.ts +0 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/instance/details/AppengineInstanceDetails.d.ts +11 -0
  7. package/dist/loadBalancer/configure/AppengineCreateLoadBalancerModal.d.ts +29 -0
  8. package/dist/loadBalancer/details/AppengineLoadBalancerActions.d.ts +5 -0
  9. package/dist/loadBalancer/details/AppengineLoadBalancerDetailsSection.d.ts +3 -0
  10. package/dist/loadBalancer/details/index.d.ts +3 -0
  11. package/dist/loadBalancer/details/useAppengineLoadBalancerDetails.d.ts +3 -0
  12. package/dist/loadBalancer/transformer.d.ts +2 -6
  13. package/dist/pipeline/stages/AppengineExecutionDetails.d.ts +15 -0
  14. package/dist/pipeline/stages/AppengineServerGroupStageConfig.d.ts +12 -0
  15. package/dist/pipeline/stages/destroyAsg/appengineDestroyAsgStage.d.ts +1 -1
  16. package/dist/pipeline/stages/disableAsg/appengineDisableAsgStage.d.ts +1 -1
  17. package/dist/pipeline/stages/editLoadBalancer/AppengineEditLoadBalancerStageConfig.d.ts +3 -0
  18. package/dist/pipeline/stages/editLoadBalancer/appengineEditLoadBalancerStage.d.ts +1 -1
  19. package/dist/pipeline/stages/enableAsg/appengineEnableAsgStage.d.ts +1 -1
  20. package/dist/pipeline/stages/shrinkCluster/appengineShrinkClusterStage.d.ts +1 -1
  21. package/dist/pipeline/stages/startServerGroup/appengineStartServerGroupStage.d.ts +1 -1
  22. package/dist/pipeline/stages/stopServerGroup/appengineStopServerGroupStage.d.ts +1 -1
  23. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +5 -9
  24. package/dist/serverGroup/configure/wizard/AppengineCloneServerGroupModal.d.ts +22 -0
  25. package/dist/serverGroup/details/AppengineServerGroupActions.d.ts +12 -0
  26. package/dist/serverGroup/details/AppengineServerGroupDetailsSection.d.ts +3 -0
  27. package/dist/serverGroup/details/appengineServerGroupDetailsGetter.d.ts +4 -0
  28. package/dist/serverGroup/details/index.d.ts +3 -0
  29. package/dist/serverGroup/transformer.d.ts +1 -5
  30. package/dist/serverGroup/writer/serverGroup.write.service.d.ts +15 -4
  31. package/package.json +4 -8
  32. package/src/appengine.module.spec.ts +194 -0
  33. package/src/appengine.module.ts +47 -58
  34. package/src/domain/index.ts +0 -1
  35. package/src/index.ts +1 -1
  36. package/src/instance/details/AppengineInstanceDetails.tsx +33 -0
  37. package/src/loadBalancer/configure/AppengineCreateLoadBalancerModal.tsx +342 -0
  38. package/src/loadBalancer/details/AppengineLoadBalancerActions.tsx +66 -0
  39. package/src/loadBalancer/details/AppengineLoadBalancerDetailsSection.tsx +42 -0
  40. package/src/loadBalancer/details/index.ts +3 -0
  41. package/src/loadBalancer/details/useAppengineLoadBalancerDetails.ts +37 -0
  42. package/src/loadBalancer/transformer.ts +3 -14
  43. package/src/pipeline/stages/AppengineExecutionDetails.tsx +90 -0
  44. package/src/pipeline/stages/AppengineServerGroupStageConfig.tsx +190 -0
  45. package/src/pipeline/stages/destroyAsg/appengineDestroyAsgStage.ts +17 -43
  46. package/src/pipeline/stages/disableAsg/appengineDisableAsgStage.ts +18 -53
  47. package/src/pipeline/stages/editLoadBalancer/AppengineEditLoadBalancerStageConfig.tsx +94 -0
  48. package/src/pipeline/stages/editLoadBalancer/appengineEditLoadBalancerStage.ts +14 -74
  49. package/src/pipeline/stages/enableAsg/appengineEnableAsgStage.ts +13 -48
  50. package/src/pipeline/stages/shrinkCluster/appengineShrinkClusterStage.ts +13 -61
  51. package/src/pipeline/stages/startServerGroup/appengineStartServerGroupStage.ts +17 -54
  52. package/src/pipeline/stages/stopServerGroup/appengineStopServerGroupStage.ts +17 -54
  53. package/src/serverGroup/configure/serverGroupCommandBuilder.service.ts +20 -19
  54. package/src/serverGroup/configure/wizard/AppengineCloneServerGroupModal.tsx +119 -0
  55. package/src/serverGroup/configure/wizard/serverGroupWizard.less +0 -8
  56. package/src/serverGroup/details/AppengineServerGroupActions.tsx +245 -0
  57. package/src/serverGroup/details/AppengineServerGroupDetailsSection.tsx +27 -0
  58. package/src/serverGroup/details/appengineServerGroupDetailsGetter.ts +62 -0
  59. package/src/serverGroup/details/index.ts +3 -0
  60. package/src/serverGroup/transformer.ts +3 -15
  61. package/src/serverGroup/writer/serverGroup.write.service.ts +57 -8
  62. package/dist/common/componentUrlDetails.component.d.ts +0 -1
  63. package/dist/common/conditionalDescriptionListItem.component.d.ts +0 -1
  64. package/dist/common/loadBalancerMessage.component.d.ts +0 -1
  65. package/dist/domain/IAppengineStageScope.d.ts +0 -18
  66. package/dist/instance/details/details.controller.d.ts +0 -1
  67. package/dist/loadBalancer/configure/wizard/advancedSettings.component.d.ts +0 -1
  68. package/dist/loadBalancer/configure/wizard/allocationConfigurationRow.component.d.ts +0 -1
  69. package/dist/loadBalancer/configure/wizard/basicSettings.component.d.ts +0 -1
  70. package/dist/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.d.ts +0 -1
  71. package/dist/loadBalancer/configure/wizard/wizard.controller.d.ts +0 -2
  72. package/dist/loadBalancer/details/details.controller.d.ts +0 -1
  73. package/dist/loadBalancer/loadBalancer.module.d.ts +0 -1
  74. package/dist/pipeline/pipeline.module.d.ts +0 -1
  75. package/dist/pipeline/stages/appengineStage.controller.d.ts +0 -12
  76. package/dist/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.d.ts +0 -1
  77. package/dist/serverGroup/configure/wizard/basicSettings.controller.d.ts +0 -1
  78. package/dist/serverGroup/configure/wizard/cloneServerGroup.controller.d.ts +0 -2
  79. package/dist/serverGroup/configure/wizard/configFileArtifactList.module.d.ts +0 -1
  80. package/dist/serverGroup/configure/wizard/configFiles.component.d.ts +0 -20
  81. package/dist/serverGroup/configure/wizard/dynamicBranchLabel.component.d.ts +0 -1
  82. package/dist/serverGroup/details/details.controller.d.ts +0 -1
  83. package/src/common/componentUrlDetails.component.ts +0 -29
  84. package/src/common/conditionalDescriptionListItem.component.ts +0 -37
  85. package/src/common/loadBalancerMessage.component.html +0 -33
  86. package/src/common/loadBalancerMessage.component.ts +0 -13
  87. package/src/domain/IAppengineStageScope.ts +0 -22
  88. package/src/instance/details/details.controller.ts +0 -116
  89. package/src/instance/details/details.html +0 -99
  90. package/src/loadBalancer/configure/wizard/advancedSettings.component.ts +0 -56
  91. package/src/loadBalancer/configure/wizard/allocationConfigurationRow.component.ts +0 -70
  92. package/src/loadBalancer/configure/wizard/basicSettings.component.html +0 -65
  93. package/src/loadBalancer/configure/wizard/basicSettings.component.ts +0 -98
  94. package/src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.html +0 -117
  95. package/src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.ts +0 -108
  96. package/src/loadBalancer/configure/wizard/wizard.controller.ts +0 -163
  97. package/src/loadBalancer/configure/wizard/wizard.html +0 -44
  98. package/src/loadBalancer/configure/wizard/wizard.less +0 -17
  99. package/src/loadBalancer/details/details.controller.ts +0 -151
  100. package/src/loadBalancer/details/details.html +0 -102
  101. package/src/loadBalancer/loadBalancer.module.ts +0 -21
  102. package/src/pipeline/pipeline.module.ts +0 -20
  103. package/src/pipeline/stages/appengineStage.controller.ts +0 -45
  104. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +0 -16
  105. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +0 -1
  106. package/src/pipeline/stages/disableAsg/disableAsgStage.html +0 -18
  107. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +0 -1
  108. package/src/pipeline/stages/editLoadBalancer/editLoadBalancerExecutionDetails.html +0 -33
  109. package/src/pipeline/stages/editLoadBalancer/editLoadBalancerStage.html +0 -51
  110. package/src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.ts +0 -65
  111. package/src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.html +0 -45
  112. package/src/pipeline/stages/enableAsg/enableAsgStage.html +0 -18
  113. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +0 -1
  114. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +0 -41
  115. package/src/pipeline/stages/startServerGroup/startServerGroupExecutionDetails.html +0 -26
  116. package/src/pipeline/stages/startServerGroup/startServerGroupStage.html +0 -18
  117. package/src/pipeline/stages/startServerGroup/startServerGroupStepLabel.html +0 -1
  118. package/src/pipeline/stages/stopServerGroup/stopServerGroupExecutionDetails.html +0 -26
  119. package/src/pipeline/stages/stopServerGroup/stopServerGroupStage.html +0 -18
  120. package/src/pipeline/stages/stopServerGroup/stopServerGroupStepLabel.html +0 -1
  121. package/src/serverGroup/configure/wizard/advancedSettings.html +0 -33
  122. package/src/serverGroup/configure/wizard/basicSettings.controller.ts +0 -151
  123. package/src/serverGroup/configure/wizard/basicSettings.html +0 -287
  124. package/src/serverGroup/configure/wizard/cloneServerGroup.controller.ts +0 -103
  125. package/src/serverGroup/configure/wizard/configFileArtifactList.module.ts +0 -18
  126. package/src/serverGroup/configure/wizard/configFiles.component.html +0 -81
  127. package/src/serverGroup/configure/wizard/configFiles.component.ts +0 -121
  128. package/src/serverGroup/configure/wizard/dynamicBranchLabel.component.ts +0 -19
  129. package/src/serverGroup/configure/wizard/serverGroupWizard.html +0 -39
  130. package/src/serverGroup/details/details.controller.ts +0 -463
  131. package/src/serverGroup/details/details.html +0 -229
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ interface IAppengineInstanceDetailsProps {
3
+ instance: {
4
+ account: string;
5
+ instanceId: string;
6
+ provider: string;
7
+ region: string;
8
+ };
9
+ }
10
+ export declare function AppengineInstanceDetails({ instance }: IAppengineInstanceDetailsProps): JSX.Element;
11
+ export {};
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import type { ILoadBalancerModalProps } from '@spinnaker/core';
3
+ import { TaskMonitor } from '@spinnaker/core';
4
+ import type { IAppengineLoadBalancer } from '../../domain';
5
+ import type { IAppengineAllocationDescription } from '../transformer';
6
+ export declare function updateAllocationLocatorType(allocation: IAppengineAllocationDescription, locatorType: IAppengineAllocationDescription['locatorType']): IAppengineAllocationDescription;
7
+ interface IAppengineCreateLoadBalancerModalState {
8
+ taskMonitor: TaskMonitor;
9
+ }
10
+ export declare class AppengineCreateLoadBalancerModal extends React.Component<ILoadBalancerModalProps, IAppengineCreateLoadBalancerModalState> {
11
+ static defaultProps: Partial<ILoadBalancerModalProps>;
12
+ static show(props: ILoadBalancerModalProps & {
13
+ isNew?: boolean;
14
+ }): Promise<IAppengineLoadBalancer>;
15
+ state: IAppengineCreateLoadBalancerModalState;
16
+ private command;
17
+ private buildInitialCommand;
18
+ private update;
19
+ private updateSplit;
20
+ private updateAllocation;
21
+ private updateAllocationLocatorType;
22
+ private addAllocation;
23
+ private removeAllocation;
24
+ private allocationTotal;
25
+ private submit;
26
+ private renderAllocationTarget;
27
+ render(): JSX.Element;
28
+ }
29
+ export {};
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import type { ILoadBalancerActionsProps } from '@spinnaker/core';
3
+ export declare function canDeleteAppengineLoadBalancer(loadBalancer: any): boolean;
4
+ export declare function getDeleteLoadBalancerWarning(loadBalancer: any): string;
5
+ export declare function AppengineLoadBalancerActions({ app, loadBalancer }: ILoadBalancerActionsProps): JSX.Element;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import type { ILoadBalancerDetailsSectionProps } from '@spinnaker/core';
3
+ export declare function AppengineLoadBalancerDetailsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps): JSX.Element;
@@ -0,0 +1,3 @@
1
+ export * from './AppengineLoadBalancerActions';
2
+ export * from './AppengineLoadBalancerDetailsSection';
3
+ export * from './useAppengineLoadBalancerDetails';
@@ -0,0 +1,3 @@
1
+ import type { IUseDetailsHookProps, UseDetailsResult } from '@spinnaker/core';
2
+ import type { IAppengineLoadBalancer } from '../../domain';
3
+ export declare function useAppengineLoadBalancerDetails({ app, loadBalancerParams, autoClose, }: IUseDetailsHookProps): UseDetailsResult<IAppengineLoadBalancer>;
@@ -28,13 +28,9 @@ export declare class AppengineLoadBalancerUpsertDescription implements ILoadBala
28
28
  mapAllocationsToPercentages(): void;
29
29
  }
30
30
  export declare class AppengineLoadBalancerTransformer {
31
- private $q;
32
- static $inject: string[];
33
- constructor($q: ng.IQService);
34
- normalizeLoadBalancer(loadBalancer: ILoadBalancer): PromiseLike<ILoadBalancer>;
35
- convertLoadBalancerForEditing(loadBalancer: IAppengineLoadBalancer, application: Application): PromiseLike<IAppengineLoadBalancer>;
31
+ normalizeLoadBalancer(loadBalancer: ILoadBalancer): Promise<ILoadBalancer>;
32
+ convertLoadBalancerForEditing(loadBalancer: IAppengineLoadBalancer, application: Application): Promise<IAppengineLoadBalancer>;
36
33
  convertLoadBalancerToUpsertDescription(loadBalancer: IAppengineLoadBalancer): AppengineLoadBalancerUpsertDescription;
37
34
  private buildInstanceCounts;
38
35
  private transformInstance;
39
36
  }
40
- export declare const APPENGINE_LOAD_BALANCER_TRANSFORMER = "spinnaker.appengine.loadBalancer.transformer.service";
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import type { IExecutionDetailsSectionProps } from '@spinnaker/core';
3
+ export declare function getServerGroupDisplayName(context: any): string;
4
+ export declare function AppengineStartServerGroupExecutionDetails(props: IExecutionDetailsSectionProps): JSX.Element;
5
+ export declare namespace AppengineStartServerGroupExecutionDetails {
6
+ var title: string;
7
+ }
8
+ export declare function AppengineStopServerGroupExecutionDetails(props: IExecutionDetailsSectionProps): JSX.Element;
9
+ export declare namespace AppengineStopServerGroupExecutionDetails {
10
+ var title: string;
11
+ }
12
+ export declare function AppengineEditLoadBalancerExecutionDetails(props: IExecutionDetailsSectionProps): JSX.Element;
13
+ export declare namespace AppengineEditLoadBalancerExecutionDetails {
14
+ var title: string;
15
+ }
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { IStageConfigProps } from '@spinnaker/core';
3
+ import type { IAppengineAccount } from '../../domain';
4
+ export declare function getAppengineAccountRegion(accounts: IAppengineAccount[], credentials: string): string;
5
+ export declare function initializeAppengineServerGroupStage(stage: any, application: any): void;
6
+ type AppengineStageConfigProps = Pick<IStageConfigProps, 'application' | 'pipeline' | 'stage' | 'updateStage'> & {
7
+ showHealthOverride?: boolean;
8
+ };
9
+ export declare function AppengineServerGroupStageConfig({ application, pipeline, stage, updateStage, showHealthOverride, }: AppengineStageConfigProps): JSX.Element;
10
+ export declare function AppengineServerGroupStageConfigWithHealthOverride(props: AppengineStageConfigProps): JSX.Element;
11
+ export declare function AppengineShrinkClusterStageConfig({ application, pipeline, stage, updateStage, }: AppengineStageConfigProps): JSX.Element;
12
+ export {};
@@ -1 +1 @@
1
- export declare const APPENGINE_DESTROY_ASG_STAGE = "spinnaker.appengine.pipeline.stage.destroyAsgStage";
1
+ export {};
@@ -1 +1 @@
1
- export declare const APPENGINE_DISABLE_ASG_STAGE = "spinnaker.appengine.pipeline.stage.disableAsgStage";
1
+ export {};
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import type { IStageConfigProps } from '@spinnaker/core';
3
+ export declare function AppengineEditLoadBalancerStageConfig({ application, stage, updateStage }: IStageConfigProps): JSX.Element;
@@ -1 +1 @@
1
- export declare const APPENGINE_EDIT_LOAD_BALANCER_STAGE = "spinnaker.appengine.pipeline.stage.editLoadBalancerStage";
1
+ export {};
@@ -1 +1 @@
1
- export declare const APPENGINE_ENABLE_ASG_STAGE = "spinnaker.appengine.pipeline.stage.enableAsgStage";
1
+ export {};
@@ -1 +1 @@
1
- export declare const APPENGINE_SHRINK_CLUSTER_STAGE = "spinnaker.appengine.pipeline.stage.shrinkClusterStage";
1
+ export {};
@@ -1 +1 @@
1
- export declare const APPENGINE_START_SERVER_GROUP_STAGE = "spinnaker.appengine.pipeline.stage.startServerGroupStage";
1
+ export {};
@@ -1 +1 @@
1
- export declare const APPENGINE_STOP_SERVER_GROUP_STAGE = "spinnaker.appengine.pipeline.stage.stopServerGroupStage";
1
+ export {};
@@ -1,4 +1,3 @@
1
- import type { IQService } from 'angular';
2
1
  import type { Application, IArtifact, IArtifactAccountPair, IExpectedArtifact, IPipeline, IStage } from '@spinnaker/core';
3
2
  import type { GitCredentialType, IAppengineGitTrigger, IAppengineJenkinsTrigger, IAppengineServerGroup } from '../../domain';
4
3
  import type { AppengineDeployDescription } from '../transformer';
@@ -49,14 +48,11 @@ export interface IViewState {
49
48
  pipeline?: IPipeline;
50
49
  }
51
50
  export declare class AppengineServerGroupCommandBuilder {
52
- private $q;
53
51
  private static getTriggerOptions;
54
52
  private static getExpectedArtifacts;
55
- static $inject: string[];
56
- constructor($q: IQService);
57
- buildNewServerGroupCommand(app: Application, selectedProvider: string, mode?: string): PromiseLike<IAppengineServerGroupCommand>;
58
- buildServerGroupCommandFromExisting(app: Application, serverGroup: IAppengineServerGroup): PromiseLike<IAppengineServerGroupCommand>;
59
- buildNewServerGroupCommandForPipeline(_stage: IStage, pipeline: IPipeline): PromiseLike<{
53
+ buildNewServerGroupCommand(app: Application, selectedProvider: string, mode?: string): Promise<IAppengineServerGroupCommand>;
54
+ buildServerGroupCommandFromExisting(app: Application, serverGroup: IAppengineServerGroup): Promise<IAppengineServerGroupCommand>;
55
+ buildNewServerGroupCommandForPipeline(_stage: IStage, pipeline: IPipeline): Promise<{
60
56
  viewState: {
61
57
  stage: IStage;
62
58
  pipeline: IPipeline;
@@ -66,9 +62,9 @@ export declare class AppengineServerGroupCommandBuilder {
66
62
  expectedArtifacts: IExpectedArtifact[];
67
63
  };
68
64
  }>;
69
- buildServerGroupCommandFromPipeline(app: Application, cluster: AppengineDeployDescription, _stage: IStage, pipeline: IPipeline): PromiseLike<IAppengineServerGroupCommand>;
65
+ buildServerGroupCommandFromPipeline(app: Application, cluster: AppengineDeployDescription, _stage: IStage, pipeline: IPipeline): Promise<IAppengineServerGroupCommand>;
70
66
  private getCredentials;
71
67
  private getRegion;
72
68
  private getSubmitButtonLabel;
69
+ private resolveAll;
73
70
  }
74
- export declare const APPENGINE_SERVER_GROUP_COMMAND_BUILDER = "spinnaker.appengine.serverGroupCommandBuilder.service";
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import type { Application, IModalComponentProps } from '@spinnaker/core';
3
+ import { TaskMonitor } from '@spinnaker/core';
4
+ import type { IAppengineServerGroupCommand } from '../serverGroupCommandBuilder.service';
5
+ export interface IAppengineCloneServerGroupModalProps extends Partial<IModalComponentProps> {
6
+ application: Application;
7
+ command: IAppengineServerGroupCommand;
8
+ title: string;
9
+ }
10
+ interface IAppengineCloneServerGroupModalState {
11
+ taskMonitor: TaskMonitor;
12
+ }
13
+ export declare function normalizeAppengineServerGroupCommandForSubmit(command: IAppengineServerGroupCommand): IAppengineServerGroupCommand;
14
+ export declare class AppengineCloneServerGroupModal extends React.Component<IAppengineCloneServerGroupModalProps, IAppengineCloneServerGroupModalState> {
15
+ static defaultProps: Partial<IAppengineCloneServerGroupModalProps>;
16
+ static show(props: IAppengineCloneServerGroupModalProps): Promise<IAppengineServerGroupCommand>;
17
+ state: IAppengineCloneServerGroupModalState;
18
+ private update;
19
+ private submit;
20
+ render(): JSX.Element;
21
+ }
22
+ export {};
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { IServerGroup, IServerGroupActionsProps } from '@spinnaker/core';
3
+ import type { IAppengineServerGroup } from '../../domain';
4
+ export declare function canStartOrStopServerGroup(serverGroup: IAppengineServerGroup): boolean;
5
+ export declare function canStartServerGroup(serverGroup: IAppengineServerGroup): boolean;
6
+ export declare function canStopServerGroup(serverGroup: IAppengineServerGroup): boolean;
7
+ export declare function expectedAllocationsAfterDisableOperation(serverGroup: IServerGroup, loadBalancers?: any[]): {
8
+ [key: string]: number;
9
+ };
10
+ export declare function canDisableServerGroup(serverGroup: IAppengineServerGroup, loadBalancers?: any[]): boolean;
11
+ export declare function canDestroyServerGroup(serverGroup: IAppengineServerGroup, loadBalancers?: any[]): boolean;
12
+ export declare function AppengineServerGroupActions({ app, serverGroup }: IServerGroupActionsProps): JSX.Element;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import type { IServerGroupDetailsSectionProps } from '@spinnaker/core';
3
+ export declare function AppengineServerGroupDetailsSection({ serverGroup }: IServerGroupDetailsSectionProps): JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { Observable } from 'rxjs';
2
+ import type { IServerGroupDetailsProps } from '@spinnaker/core';
3
+ import type { IAppengineServerGroup } from '../../domain';
4
+ export declare function appengineServerGroupDetailsGetter(props: IServerGroupDetailsProps, autoClose: () => void): Observable<IAppengineServerGroup>;
@@ -0,0 +1,3 @@
1
+ export * from './AppengineServerGroupActions';
2
+ export * from './AppengineServerGroupDetailsSection';
3
+ export * from './appengineServerGroupDetailsGetter';
@@ -36,10 +36,6 @@ export declare class AppengineDeployDescription {
36
36
  constructor(command: IAppengineServerGroupCommand);
37
37
  }
38
38
  export declare class AppengineServerGroupTransformer {
39
- private $q;
40
- static $inject: string[];
41
- constructor($q: ng.IQService);
42
- normalizeServerGroup(serverGroup: IServerGroup): PromiseLike<IServerGroup>;
39
+ normalizeServerGroup(serverGroup: IServerGroup): Promise<IServerGroup>;
43
40
  convertServerGroupCommandToDeployConfiguration(command: IAppengineServerGroupCommand): AppengineDeployDescription;
44
41
  }
45
- export declare const APPENGINE_SERVER_GROUP_TRANSFORMER = "spinnaker.appengine.serverGroup.transformer.service";
@@ -1,8 +1,19 @@
1
- import type { Application, ITask } from '@spinnaker/core';
1
+ import type { Application, IJob, ITask } from '@spinnaker/core';
2
+ import type { IAppengineServerGroupCommand } from '../configure/serverGroupCommandBuilder.service';
2
3
  import type { IAppengineServerGroup } from '../../domain/index';
4
+ interface IAppengineServerGroupWriteJob extends IJob {
5
+ serverGroupName: string;
6
+ region: string;
7
+ credentials: string;
8
+ cloudProvider: string;
9
+ }
3
10
  export declare class AppengineServerGroupWriter {
4
- startServerGroup(serverGroup: IAppengineServerGroup, application: Application): PromiseLike<ITask>;
5
- stopServerGroup(serverGroup: IAppengineServerGroup, application: Application): PromiseLike<ITask>;
11
+ cloneServerGroup(command: IAppengineServerGroupCommand, application: Application): Promise<ITask>;
12
+ startServerGroup(serverGroup: IAppengineServerGroup, application: Application): Promise<ITask>;
13
+ stopServerGroup(serverGroup: IAppengineServerGroup, application: Application): Promise<ITask>;
14
+ enableServerGroup(serverGroup: IAppengineServerGroup, application: Application, params?: Partial<IAppengineServerGroupWriteJob>): Promise<ITask>;
15
+ disableServerGroup(serverGroup: IAppengineServerGroup, application: Application, params?: Partial<IAppengineServerGroupWriteJob>): Promise<ITask>;
16
+ destroyServerGroup(serverGroup: IAppengineServerGroup, application: Application, params?: Partial<IAppengineServerGroupWriteJob>): Promise<ITask>;
6
17
  private buildJob;
7
18
  }
8
- export declare const APPENGINE_SERVER_GROUP_WRITER = "spinnaker.appengine.serverGroup.write.service";
19
+ 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.2.2",
8
+ "version": "2026.3.0",
9
9
  "module": "dist/index.js",
10
10
  "typings": "dist/index.d.ts",
11
11
  "publishConfig": {
@@ -22,29 +22,25 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@spinnaker/core": "^0.29.1",
25
- "@uirouter/angularjs": "1.0.26",
26
- "angular": "1.8.3",
27
- "angular-ui-bootstrap": "2.5.0",
28
25
  "classnames": "2.2.6",
29
26
  "enzyme": "3.11.0",
30
27
  "formik": "1.5.1",
31
28
  "lodash": "4.18.1",
32
29
  "react": "16.14.0",
33
- "react2angular": "3.2.1",
30
+ "react-bootstrap": "0.32.1",
34
31
  "rxjs": "6.6.7"
35
32
  },
36
33
  "devDependencies": {
37
34
  "@spinnaker/eslint-plugin": "^3.0.2",
38
35
  "@spinnaker/mocks": "1.0.7",
39
36
  "@spinnaker/scripts": "^0.4.0",
40
- "@types/angular": "1.6.26",
41
- "@types/angular-ui-bootstrap": "0.13.41",
42
37
  "@types/classnames": "2.2.0",
43
38
  "@types/enzyme": "3.10.3",
44
39
  "@types/lodash": "4.14.64",
45
40
  "@types/react": "16.14.10",
41
+ "@types/react-bootstrap": "0.32.5",
46
42
  "shx": "0.3.3",
47
43
  "typescript": "5.0.4"
48
44
  },
49
- "gitHead": "db086c61529c9421e8c0c2d4a2b8eca88c675ac8"
45
+ "gitHead": "0f7d75f5d4b42c1675e2ecc69a53f8eb73090eb9"
50
46
  }
@@ -0,0 +1,194 @@
1
+ import { CloudProviderRegistry, DeploymentStrategyRegistry, Registry, TaskExecutor } from '@spinnaker/core';
2
+
3
+ import './index';
4
+ import { AppengineInstanceDetails } from './instance/details/AppengineInstanceDetails';
5
+ import {
6
+ AppengineCreateLoadBalancerModal,
7
+ updateAllocationLocatorType,
8
+ } from './loadBalancer/configure/AppengineCreateLoadBalancerModal';
9
+ import {
10
+ AppengineLoadBalancerActions,
11
+ AppengineLoadBalancerDetailsSection,
12
+ canDeleteAppengineLoadBalancer,
13
+ getDeleteLoadBalancerWarning,
14
+ useAppengineLoadBalancerDetails,
15
+ } from './loadBalancer/details';
16
+ import { AppengineLoadBalancerTransformer } from './loadBalancer/transformer';
17
+ import { getServerGroupDisplayName } from './pipeline/stages/AppengineExecutionDetails';
18
+ import { getAppengineAccountRegion } from './pipeline/stages/AppengineServerGroupStageConfig';
19
+ import {
20
+ AppengineCloneServerGroupModal,
21
+ normalizeAppengineServerGroupCommandForSubmit,
22
+ } from './serverGroup/configure/wizard/AppengineCloneServerGroupModal';
23
+ import { AppengineServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';
24
+ import {
25
+ AppengineServerGroupActions,
26
+ appengineServerGroupDetailsGetter,
27
+ AppengineServerGroupDetailsSection,
28
+ canDestroyServerGroup,
29
+ canDisableServerGroup,
30
+ canStartServerGroup,
31
+ canStopServerGroup,
32
+ expectedAllocationsAfterDisableOperation,
33
+ } from './serverGroup/details';
34
+ import { AppengineServerGroupTransformer } from './serverGroup/transformer';
35
+ import { AppengineServerGroupWriter } from './serverGroup/writer/serverGroup.write.service';
36
+
37
+ describe('App Engine provider registration', () => {
38
+ it('registers provider configuration from the package entrypoint', () => {
39
+ expect(CloudProviderRegistry.getValue('appengine', 'serverGroup.transformer')).toBe(
40
+ AppengineServerGroupTransformer,
41
+ );
42
+ expect(CloudProviderRegistry.getValue('appengine', 'serverGroup.commandBuilder')).toBe(
43
+ AppengineServerGroupCommandBuilder,
44
+ );
45
+ expect(CloudProviderRegistry.getValue('appengine', 'loadBalancer.transformer')).toBe(
46
+ AppengineLoadBalancerTransformer,
47
+ );
48
+ expect(CloudProviderRegistry.getValue('appengine', 'instance.details')).toBe(AppengineInstanceDetails);
49
+ expect(CloudProviderRegistry.getValue('appengine', 'serverGroup.detailsActions')).toBe(AppengineServerGroupActions);
50
+ expect(CloudProviderRegistry.getValue('appengine', 'serverGroup.detailsGetter')).toBe(
51
+ appengineServerGroupDetailsGetter,
52
+ );
53
+ expect(CloudProviderRegistry.getValue('appengine', 'serverGroup.detailsSections')).toEqual([
54
+ AppengineServerGroupDetailsSection,
55
+ ]);
56
+ expect(CloudProviderRegistry.getValue('appengine', 'serverGroup.CloneServerGroupModal')).toBe(
57
+ AppengineCloneServerGroupModal,
58
+ );
59
+ expect(CloudProviderRegistry.getValue('appengine', 'loadBalancer.useDetailsHook')).toBe(
60
+ useAppengineLoadBalancerDetails,
61
+ );
62
+ expect(CloudProviderRegistry.getValue('appengine', 'loadBalancer.detailsActions')).toBe(
63
+ AppengineLoadBalancerActions,
64
+ );
65
+ expect(CloudProviderRegistry.getValue('appengine', 'loadBalancer.detailsSections')).toEqual([
66
+ AppengineLoadBalancerDetailsSection,
67
+ ]);
68
+ expect(CloudProviderRegistry.getValue('appengine', 'loadBalancer.CreateLoadBalancerModal')).toBe(
69
+ AppengineCreateLoadBalancerModal,
70
+ );
71
+ expect(DeploymentStrategyRegistry.listStrategies('appengine').map((strategy) => strategy.key)).toContain('custom');
72
+ });
73
+
74
+ it('registers App Engine pipeline stages with React components', () => {
75
+ [
76
+ 'enableServerGroup',
77
+ 'disableServerGroup',
78
+ 'destroyServerGroup',
79
+ 'shrinkCluster',
80
+ 'startAppEngineServerGroup',
81
+ 'stopAppEngineServerGroup',
82
+ 'upsertAppEngineLoadBalancers',
83
+ 'deployAppEngineConfiguration',
84
+ ].forEach((type) => {
85
+ const stageConfig = Registry.pipeline.getStageConfig({ type, cloudProvider: 'appengine' } as any);
86
+ expect(stageConfig).toBeDefined();
87
+ expect(stageConfig.component).toBeDefined();
88
+ });
89
+
90
+ expect(
91
+ Registry.pipeline
92
+ .getStageConfig({ type: 'startAppEngineServerGroup', cloudProvider: 'appengine' } as any)
93
+ .executionDetailsSections.map((section: any) => section.title),
94
+ ).toEqual(['startServerGroupConfig', 'taskStatus']);
95
+ expect(
96
+ Registry.pipeline
97
+ .getStageConfig({ type: 'stopAppEngineServerGroup', cloudProvider: 'appengine' } as any)
98
+ .executionDetailsSections.map((section: any) => section.title),
99
+ ).toEqual(['stopServerGroupConfig', 'taskStatus']);
100
+ expect(
101
+ Registry.pipeline
102
+ .getStageConfig({ type: 'upsertAppEngineLoadBalancers', cloudProvider: 'appengine' } as any)
103
+ .executionDetailsSections.map((section: any) => section.title),
104
+ ).toEqual(['editLoadBalancerConfig', 'taskStatus']);
105
+ });
106
+
107
+ it('keeps start and stop actions eligible only for supported App Engine server groups', () => {
108
+ expect(canStartServerGroup({ env: 'FLEXIBLE', servingStatus: 'STOPPED' } as any)).toBe(true);
109
+ expect(
110
+ canStartServerGroup({ env: 'STANDARD', scalingPolicy: { type: 'AUTOMATIC' }, servingStatus: 'STOPPED' } as any),
111
+ ).toBe(false);
112
+ expect(
113
+ canStopServerGroup({ env: 'STANDARD', scalingPolicy: { type: 'BASIC' }, servingStatus: 'SERVING' } as any),
114
+ ).toBe(true);
115
+ expect(canStopServerGroup({ env: 'FLEXIBLE', servingStatus: 'STOPPED' } as any)).toBe(false);
116
+ });
117
+
118
+ it('keeps App Engine clone submissions on createServerGroup', () => {
119
+ const executeTask = spyOn(TaskExecutor, 'executeTask').and.returnValue(Promise.resolve({}) as any);
120
+ const writer = new AppengineServerGroupWriter();
121
+
122
+ writer.cloneServerGroup(
123
+ {
124
+ application: 'myapp',
125
+ credentials: 'test',
126
+ region: 'europe-west1',
127
+ viewState: { mode: 'clone' },
128
+ configArtifacts: [],
129
+ configFilepaths: [],
130
+ configFiles: [],
131
+ interestingHealthProviderNames: [],
132
+ } as any,
133
+ { name: 'myapp' } as any,
134
+ );
135
+
136
+ expect(executeTask.calls.mostRecent().args[0].job[0].type).toBe('createServerGroup');
137
+ });
138
+
139
+ it('keeps disable server group task ownership on the application object', () => {
140
+ const executeTask = spyOn(TaskExecutor, 'executeTask').and.returnValue(Promise.resolve({}) as any);
141
+ const writer = new AppengineServerGroupWriter();
142
+ const application = { name: 'myapp' } as any;
143
+
144
+ writer.disableServerGroup({ name: 'myapp-v001', region: 'europe-west1', account: 'test' } as any, application);
145
+
146
+ expect(executeTask.calls.mostRecent().args[0].application).toBe(application);
147
+ });
148
+
149
+ it('restores App Engine server group action eligibility from traffic allocations', () => {
150
+ const serverGroup = { name: 'app-v001', disabled: false } as any;
151
+ const loadBalancers = [{ split: { shardBy: 'IP', allocations: { 'app-v001': 0.4, 'app-v002': 0.6 } } }];
152
+
153
+ expect(expectedAllocationsAfterDisableOperation(serverGroup, loadBalancers)).toEqual({ 'app-v002': 1 });
154
+ expect(canDisableServerGroup(serverGroup, loadBalancers)).toBe(true);
155
+ expect(canDestroyServerGroup(serverGroup, loadBalancers)).toBe(true);
156
+ expect(canDisableServerGroup({ ...serverGroup, disabled: true }, loadBalancers)).toBe(false);
157
+ });
158
+
159
+ it('restores App Engine load balancer delete availability and warnings', () => {
160
+ expect(canDeleteAppengineLoadBalancer({ name: 'default' })).toBe(false);
161
+ expect(canDeleteAppengineLoadBalancer({ name: 'service-a' })).toBe(true);
162
+ expect(getDeleteLoadBalancerWarning({ name: 'service-a', serverGroups: [{ name: 'service-a-v001' }] })).toContain(
163
+ 'will destroy <b>service-a-v001</b>',
164
+ );
165
+ });
166
+
167
+ it('defaults App Engine clone command arrays before submit', () => {
168
+ const command = normalizeAppengineServerGroupCommandForSubmit({ viewState: { mode: 'clone' } } as any);
169
+
170
+ expect(command.configArtifacts).toEqual([]);
171
+ expect(command.configFilepaths).toEqual([]);
172
+ expect(command.configFiles).toEqual([]);
173
+ expect(command.interestingHealthProviderNames).toEqual([]);
174
+ expect(command.fromArtifact).toBe(false);
175
+ expect(command.sourceType).toBe('git');
176
+ });
177
+
178
+ it('keeps pipeline load balancer allocations able to target dynamic coordinates', () => {
179
+ const allocation = updateAllocationLocatorType(
180
+ { allocation: 50, locatorType: 'text', serverGroupName: '${sg}' },
181
+ 'targetCoordinate',
182
+ );
183
+
184
+ expect(allocation.locatorType).toBe('targetCoordinate');
185
+ expect(allocation.serverGroupName).toBeUndefined();
186
+ expect(allocation.target).toBe('current_asg_dynamic');
187
+ });
188
+
189
+ it('resolves App Engine stage region from selected account and shows ad-hoc server group names', () => {
190
+ expect(getAppengineAccountRegion([{ name: 'prod', region: 'europe-west1' }] as any, 'prod')).toBe('europe-west1');
191
+ expect(getServerGroupDisplayName({ serverGroupName: 'my-app-v001' })).toBe('my-app-v001');
192
+ expect(getServerGroupDisplayName({ cluster: 'my-app', serverGroupName: 'my-app-v001' })).toBe('my-app');
193
+ });
194
+ });
@@ -1,70 +1,59 @@
1
- import { module } from 'angular';
2
-
3
1
  import { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';
4
2
 
5
- import { APPENGINE_COMPONENT_URL_DETAILS } from './common/componentUrlDetails.component';
6
- import { APPENGINE_CONDITIONAL_DESCRIPTION_LIST_ITEM } from './common/conditionalDescriptionListItem.component';
7
- import { APPENGINE_LOAD_BALANCER_CREATE_MESSAGE } from './common/loadBalancerMessage.component';
8
3
  import './helpContents/appengineHelpContents';
9
- import { APPENGINE_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';
10
- import { APPENGINE_LOAD_BALANCER_MODULE } from './loadBalancer/loadBalancer.module';
4
+ import { AppengineInstanceDetails } from './instance/details/AppengineInstanceDetails';
5
+ import { AppengineCreateLoadBalancerModal } from './loadBalancer/configure/AppengineCreateLoadBalancerModal';
6
+ import {
7
+ AppengineLoadBalancerActions,
8
+ AppengineLoadBalancerDetailsSection,
9
+ useAppengineLoadBalancerDetails,
10
+ } from './loadBalancer/details';
11
+ import { AppengineLoadBalancerTransformer } from './loadBalancer/transformer';
11
12
  import logo from './logo/appengine.logo.png';
12
- import { APPENGINE_PIPELINE_MODULE } from './pipeline/pipeline.module';
13
13
  import './pipeline/stages/deployAppengineConfig/deployAppengineConfigStage';
14
- import { APPENGINE_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/configure/serverGroupCommandBuilder.service';
15
- import { APPENGINE_SERVER_GROUP_BASIC_SETTINGS_CTRL } from './serverGroup/configure/wizard/basicSettings.controller';
16
- import { APPENGINE_CLONE_SERVER_GROUP_CTRL } from './serverGroup/configure/wizard/cloneServerGroup.controller';
17
- import { CONFIG_FILE_ARTIFACT_LIST } from './serverGroup/configure/wizard/configFileArtifactList.module';
18
- import { APPENGINE_SERVER_GROUP_DETAILS_CTRL } from './serverGroup/details/details.controller';
19
- import { APPENGINE_SERVER_GROUP_TRANSFORMER } from './serverGroup/transformer';
20
- import { APPENGINE_SERVER_GROUP_WRITER } from './serverGroup/writer/serverGroup.write.service';
14
+ import './pipeline/stages/destroyAsg/appengineDestroyAsgStage';
15
+ import './pipeline/stages/disableAsg/appengineDisableAsgStage';
16
+ import './pipeline/stages/editLoadBalancer/appengineEditLoadBalancerStage';
17
+ import './pipeline/stages/enableAsg/appengineEnableAsgStage';
18
+ import './pipeline/stages/shrinkCluster/appengineShrinkClusterStage';
19
+ import './pipeline/stages/startServerGroup/appengineStartServerGroupStage';
20
+ import './pipeline/stages/stopServerGroup/appengineStopServerGroupStage';
21
+ import { AppengineServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';
22
+ import { AppengineCloneServerGroupModal } from './serverGroup/configure/wizard/AppengineCloneServerGroupModal';
23
+ import {
24
+ AppengineServerGroupActions,
25
+ appengineServerGroupDetailsGetter,
26
+ AppengineServerGroupDetailsSection,
27
+ } from './serverGroup/details';
28
+ import { AppengineServerGroupTransformer } from './serverGroup/transformer';
21
29
  import './validation/ApplicationNameValidator';
22
30
 
23
31
  import './logo/appengine.logo.less';
24
32
 
25
- export const APPENGINE_MODULE = 'spinnaker.appengine';
26
-
27
- module(APPENGINE_MODULE, [
28
- APPENGINE_CLONE_SERVER_GROUP_CTRL,
29
- APPENGINE_COMPONENT_URL_DETAILS,
30
- APPENGINE_CONDITIONAL_DESCRIPTION_LIST_ITEM,
31
- APPENGINE_INSTANCE_DETAILS_CTRL,
32
- APPENGINE_LOAD_BALANCER_CREATE_MESSAGE,
33
- APPENGINE_LOAD_BALANCER_MODULE,
34
- APPENGINE_PIPELINE_MODULE,
35
- APPENGINE_SERVER_GROUP_BASIC_SETTINGS_CTRL,
36
- APPENGINE_SERVER_GROUP_COMMAND_BUILDER,
37
- APPENGINE_SERVER_GROUP_DETAILS_CTRL,
38
- APPENGINE_SERVER_GROUP_TRANSFORMER,
39
- APPENGINE_SERVER_GROUP_WRITER,
40
- CONFIG_FILE_ARTIFACT_LIST,
41
- ]).config(() => {
42
- CloudProviderRegistry.registerProvider('appengine', {
43
- name: 'App Engine',
44
- instance: {
45
- detailsTemplateUrl: require('./instance/details/details.html'),
46
- detailsController: 'appengineInstanceDetailsCtrl',
47
- },
48
- serverGroup: {
49
- transformer: 'appengineServerGroupTransformer',
50
- detailsController: 'appengineServerGroupDetailsCtrl',
51
- detailsTemplateUrl: require('./serverGroup/details/details.html'),
52
- commandBuilder: 'appengineServerGroupCommandBuilder',
53
- cloneServerGroupController: 'appengineCloneServerGroupCtrl',
54
- cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),
55
- skipUpstreamStageCheck: true,
56
- },
57
- loadBalancer: {
58
- transformer: 'appengineLoadBalancerTransformer',
59
- createLoadBalancerTemplateUrl: require('./loadBalancer/configure/wizard/wizard.html'),
60
- createLoadBalancerController: 'appengineLoadBalancerWizardCtrl',
61
- detailsTemplateUrl: require('./loadBalancer/details/details.html'),
62
- detailsController: 'appengineLoadBalancerDetailsCtrl',
63
- },
64
- logo: {
65
- path: logo,
66
- },
67
- });
33
+ CloudProviderRegistry.registerProvider('appengine', {
34
+ name: 'App Engine',
35
+ instance: {
36
+ details: AppengineInstanceDetails,
37
+ },
38
+ serverGroup: {
39
+ transformer: AppengineServerGroupTransformer,
40
+ commandBuilder: AppengineServerGroupCommandBuilder,
41
+ detailsActions: AppengineServerGroupActions,
42
+ detailsGetter: appengineServerGroupDetailsGetter,
43
+ detailsSections: [AppengineServerGroupDetailsSection],
44
+ CloneServerGroupModal: AppengineCloneServerGroupModal,
45
+ skipUpstreamStageCheck: true,
46
+ },
47
+ loadBalancer: {
48
+ transformer: AppengineLoadBalancerTransformer,
49
+ useDetailsHook: useAppengineLoadBalancerDetails,
50
+ detailsActions: AppengineLoadBalancerActions,
51
+ detailsSections: [AppengineLoadBalancerDetailsSection],
52
+ CreateLoadBalancerModal: AppengineCreateLoadBalancerModal,
53
+ },
54
+ logo: {
55
+ path: logo,
56
+ },
68
57
  });
69
58
 
70
59
  DeploymentStrategyRegistry.registerProvider('appengine', ['custom']);