@spinnaker/appengine 0.0.0-2025.1-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 (138) hide show
  1. package/CHANGELOG.md +981 -0
  2. package/LICENSE.txt +203 -0
  3. package/dist/appengine.logoc2c312af6aa99037.png +0 -0
  4. package/dist/appengine.module.d.ts +5 -0
  5. package/dist/appengine.settings.d.ts +7 -0
  6. package/dist/common/FormikAccountRegionSelector.d.ts +26 -0
  7. package/dist/common/appengineHealth.d.ts +3 -0
  8. package/dist/common/componentUrlDetails.component.d.ts +1 -0
  9. package/dist/common/conditionalDescriptionListItem.component.d.ts +1 -0
  10. package/dist/common/loadBalancerMessage.component.d.ts +1 -0
  11. package/dist/domain/IAppengineAccount.d.ts +6 -0
  12. package/dist/domain/IAppengineInstance.d.ts +20 -0
  13. package/dist/domain/IAppengineLoadBalancer.d.ts +19 -0
  14. package/dist/domain/IAppengineServerGroup.d.ts +11 -0
  15. package/dist/domain/IAppengineStageScope.d.ts +18 -0
  16. package/dist/domain/IAppengineTriggers.d.ts +11 -0
  17. package/dist/domain/index.d.ts +6 -0
  18. package/dist/helpContents/appengineHelpContents.d.ts +1 -0
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +4084 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/instance/details/details.controller.d.ts +1 -0
  23. package/dist/loadBalancer/configure/wizard/advancedSettings.component.d.ts +1 -0
  24. package/dist/loadBalancer/configure/wizard/allocationConfigurationRow.component.d.ts +1 -0
  25. package/dist/loadBalancer/configure/wizard/basicSettings.component.d.ts +1 -0
  26. package/dist/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.d.ts +1 -0
  27. package/dist/loadBalancer/configure/wizard/wizard.controller.d.ts +2 -0
  28. package/dist/loadBalancer/details/details.controller.d.ts +1 -0
  29. package/dist/loadBalancer/loadBalancer.module.d.ts +1 -0
  30. package/dist/loadBalancer/transformer.d.ts +40 -0
  31. package/dist/pipeline/pipeline.module.d.ts +1 -0
  32. package/dist/pipeline/stages/appengineStage.controller.d.ts +12 -0
  33. package/dist/pipeline/stages/deployAppengineConfig/DeployAppengineConfigForm.d.ts +16 -0
  34. package/dist/pipeline/stages/deployAppengineConfig/DeployAppengineConfigurationConfig.d.ts +5 -0
  35. package/dist/pipeline/stages/deployAppengineConfig/deployAppengineConfigStage.d.ts +1 -0
  36. package/dist/pipeline/stages/destroyAsg/appengineDestroyAsgStage.d.ts +1 -0
  37. package/dist/pipeline/stages/disableAsg/appengineDisableAsgStage.d.ts +1 -0
  38. package/dist/pipeline/stages/editLoadBalancer/appengineEditLoadBalancerStage.d.ts +1 -0
  39. package/dist/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.d.ts +1 -0
  40. package/dist/pipeline/stages/enableAsg/appengineEnableAsgStage.d.ts +1 -0
  41. package/dist/pipeline/stages/shrinkCluster/appengineShrinkClusterStage.d.ts +1 -0
  42. package/dist/pipeline/stages/startServerGroup/appengineStartServerGroupStage.d.ts +1 -0
  43. package/dist/pipeline/stages/stopServerGroup/appengineStopServerGroupStage.d.ts +1 -0
  44. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +74 -0
  45. package/dist/serverGroup/configure/wizard/ConfigFileArtifactList.d.ts +10 -0
  46. package/dist/serverGroup/configure/wizard/basicSettings.controller.d.ts +1 -0
  47. package/dist/serverGroup/configure/wizard/cloneServerGroup.controller.d.ts +2 -0
  48. package/dist/serverGroup/configure/wizard/configFileArtifactList.module.d.ts +1 -0
  49. package/dist/serverGroup/configure/wizard/configFiles.component.d.ts +20 -0
  50. package/dist/serverGroup/configure/wizard/dynamicBranchLabel.component.d.ts +1 -0
  51. package/dist/serverGroup/details/details.controller.d.ts +1 -0
  52. package/dist/serverGroup/transformer.d.ts +45 -0
  53. package/dist/serverGroup/writer/serverGroup.write.service.d.ts +8 -0
  54. package/dist/validation/ApplicationNameValidator.d.ts +1 -0
  55. package/package.json +46 -0
  56. package/src/appengine.module.ts +70 -0
  57. package/src/appengine.settings.ts +14 -0
  58. package/src/common/FormikAccountRegionSelector.tsx +107 -0
  59. package/src/common/appengineHealth.ts +3 -0
  60. package/src/common/componentUrlDetails.component.ts +29 -0
  61. package/src/common/conditionalDescriptionListItem.component.ts +37 -0
  62. package/src/common/loadBalancerMessage.component.html +33 -0
  63. package/src/common/loadBalancerMessage.component.ts +13 -0
  64. package/src/domain/IAppengineAccount.ts +8 -0
  65. package/src/domain/IAppengineInstance.ts +21 -0
  66. package/src/domain/IAppengineLoadBalancer.ts +21 -0
  67. package/src/domain/IAppengineServerGroup.ts +13 -0
  68. package/src/domain/IAppengineStageScope.ts +22 -0
  69. package/src/domain/IAppengineTriggers.ts +12 -0
  70. package/src/domain/index.ts +6 -0
  71. package/src/helpContents/appengineHelpContents.ts +141 -0
  72. package/src/index.ts +1 -0
  73. package/src/instance/details/details.controller.ts +116 -0
  74. package/src/instance/details/details.html +99 -0
  75. package/src/loadBalancer/configure/wizard/advancedSettings.component.ts +56 -0
  76. package/src/loadBalancer/configure/wizard/allocationConfigurationRow.component.ts +70 -0
  77. package/src/loadBalancer/configure/wizard/basicSettings.component.html +65 -0
  78. package/src/loadBalancer/configure/wizard/basicSettings.component.ts +98 -0
  79. package/src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.html +117 -0
  80. package/src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.ts +108 -0
  81. package/src/loadBalancer/configure/wizard/wizard.controller.ts +163 -0
  82. package/src/loadBalancer/configure/wizard/wizard.html +44 -0
  83. package/src/loadBalancer/configure/wizard/wizard.less +17 -0
  84. package/src/loadBalancer/details/details.controller.ts +151 -0
  85. package/src/loadBalancer/details/details.html +102 -0
  86. package/src/loadBalancer/loadBalancer.module.ts +21 -0
  87. package/src/loadBalancer/transformer.ts +170 -0
  88. package/src/logo/appengine.icon.svg +37 -0
  89. package/src/logo/appengine.logo.less +6 -0
  90. package/src/logo/appengine.logo.png +0 -0
  91. package/src/pipeline/pipeline.module.ts +20 -0
  92. package/src/pipeline/stages/appengineStage.controller.ts +45 -0
  93. package/src/pipeline/stages/deployAppengineConfig/DeployAppengineConfigForm.tsx +203 -0
  94. package/src/pipeline/stages/deployAppengineConfig/DeployAppengineConfigurationConfig.tsx +34 -0
  95. package/src/pipeline/stages/deployAppengineConfig/deployAppengineConfigStage.ts +19 -0
  96. package/src/pipeline/stages/destroyAsg/appengineDestroyAsgStage.ts +45 -0
  97. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +16 -0
  98. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +1 -0
  99. package/src/pipeline/stages/disableAsg/appengineDisableAsgStage.ts +54 -0
  100. package/src/pipeline/stages/disableAsg/disableAsgStage.html +18 -0
  101. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +1 -0
  102. package/src/pipeline/stages/editLoadBalancer/appengineEditLoadBalancerStage.ts +74 -0
  103. package/src/pipeline/stages/editLoadBalancer/editLoadBalancerExecutionDetails.html +33 -0
  104. package/src/pipeline/stages/editLoadBalancer/editLoadBalancerStage.html +51 -0
  105. package/src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.ts +65 -0
  106. package/src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.html +45 -0
  107. package/src/pipeline/stages/enableAsg/appengineEnableAsgStage.ts +49 -0
  108. package/src/pipeline/stages/enableAsg/enableAsgStage.html +18 -0
  109. package/src/pipeline/stages/enableAsg/enableAsgStepLabel.html +1 -0
  110. package/src/pipeline/stages/shrinkCluster/appengineShrinkClusterStage.ts +62 -0
  111. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +41 -0
  112. package/src/pipeline/stages/startServerGroup/appengineStartServerGroupStage.ts +54 -0
  113. package/src/pipeline/stages/startServerGroup/startServerGroupExecutionDetails.html +26 -0
  114. package/src/pipeline/stages/startServerGroup/startServerGroupStage.html +18 -0
  115. package/src/pipeline/stages/startServerGroup/startServerGroupStepLabel.html +1 -0
  116. package/src/pipeline/stages/stopServerGroup/appengineStopServerGroupStage.ts +54 -0
  117. package/src/pipeline/stages/stopServerGroup/stopServerGroupExecutionDetails.html +26 -0
  118. package/src/pipeline/stages/stopServerGroup/stopServerGroupStage.html +18 -0
  119. package/src/pipeline/stages/stopServerGroup/stopServerGroupStepLabel.html +1 -0
  120. package/src/serverGroup/configure/serverGroupCommandBuilder.service.ts +235 -0
  121. package/src/serverGroup/configure/wizard/ConfigFileArtifactList.tsx +81 -0
  122. package/src/serverGroup/configure/wizard/advancedSettings.html +33 -0
  123. package/src/serverGroup/configure/wizard/basicSettings.controller.ts +151 -0
  124. package/src/serverGroup/configure/wizard/basicSettings.html +287 -0
  125. package/src/serverGroup/configure/wizard/cloneServerGroup.controller.ts +103 -0
  126. package/src/serverGroup/configure/wizard/configFileArtifactList.module.ts +18 -0
  127. package/src/serverGroup/configure/wizard/configFileArtifactList.spec.tsx +78 -0
  128. package/src/serverGroup/configure/wizard/configFiles.component.html +81 -0
  129. package/src/serverGroup/configure/wizard/configFiles.component.ts +121 -0
  130. package/src/serverGroup/configure/wizard/dynamicBranchLabel.component.ts +19 -0
  131. package/src/serverGroup/configure/wizard/serverGroupWizard.html +39 -0
  132. package/src/serverGroup/configure/wizard/serverGroupWizard.less +28 -0
  133. package/src/serverGroup/details/details.controller.ts +463 -0
  134. package/src/serverGroup/details/details.html +229 -0
  135. package/src/serverGroup/transformer.ts +92 -0
  136. package/src/serverGroup/transformet.spec.ts +40 -0
  137. package/src/serverGroup/writer/serverGroup.write.service.ts +57 -0
  138. package/src/validation/ApplicationNameValidator.ts +40 -0
@@ -0,0 +1,40 @@
1
+ import type { Application, ILoadBalancer, ILoadBalancerUpsertCommand } from '@spinnaker/core';
2
+ import type { IAppengineLoadBalancer, IAppengineTrafficSplit, ShardBy } from '../domain/index';
3
+ export interface IAppengineAllocationDescription {
4
+ serverGroupName?: string;
5
+ target?: string;
6
+ cluster?: string;
7
+ allocation: number;
8
+ locatorType: 'fromExisting' | 'targetCoordinate' | 'text';
9
+ }
10
+ export interface IAppengineTrafficSplitDescription {
11
+ shardBy: ShardBy;
12
+ allocationDescriptions: IAppengineAllocationDescription[];
13
+ }
14
+ export declare class AppengineLoadBalancerUpsertDescription implements ILoadBalancerUpsertCommand, IAppengineLoadBalancer {
15
+ credentials: string;
16
+ account: string;
17
+ loadBalancerName: string;
18
+ name: string;
19
+ splitDescription: IAppengineTrafficSplitDescription;
20
+ split?: IAppengineTrafficSplit;
21
+ migrateTraffic: boolean;
22
+ region: string;
23
+ cloudProvider: string;
24
+ serverGroups?: any[];
25
+ static convertTrafficSplitToTrafficSplitDescription(split: IAppengineTrafficSplit): IAppengineTrafficSplitDescription;
26
+ constructor(loadBalancer: IAppengineLoadBalancer);
27
+ mapAllocationsToDecimals(): void;
28
+ mapAllocationsToPercentages(): void;
29
+ }
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>;
36
+ convertLoadBalancerToUpsertDescription(loadBalancer: IAppengineLoadBalancer): AppengineLoadBalancerUpsertDescription;
37
+ private buildInstanceCounts;
38
+ private transformInstance;
39
+ }
40
+ export declare const APPENGINE_LOAD_BALANCER_TRANSFORMER = "spinnaker.appengine.loadBalancer.transformer.service";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_PIPELINE_MODULE = "spinnaker.appengine.pipeline.module";
@@ -0,0 +1,12 @@
1
+ import type { IController } from 'angular';
2
+ import type { IAppengineStageScope } from '../../domain';
3
+ export declare class AppengineStageCtrl implements IController {
4
+ protected $scope: IAppengineStageScope;
5
+ static $inject: string[];
6
+ constructor($scope: IAppengineStageScope);
7
+ setStageRegion(): void;
8
+ protected setStageCloudProvider(): void;
9
+ protected setAccounts(): PromiseLike<void>;
10
+ protected setTargets(): void;
11
+ protected setStageCredentials(): void;
12
+ }
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import type { IAccount, IFormikStageConfigInjectedProps } from '@spinnaker/core';
3
+ export interface IAppEngineDeployConfigSettingsState {
4
+ accounts: IAccount[];
5
+ }
6
+ export declare class DeployAppengineConfigForm extends React.Component<IFormikStageConfigInjectedProps, IAppEngineDeployConfigSettingsState> {
7
+ private static readonly excludedArtifactTypes;
8
+ private destroy$;
9
+ state: IAppEngineDeployConfigSettingsState;
10
+ componentDidMount(): void;
11
+ private onTemplateArtifactEdited;
12
+ private onTemplateArtifactSelected;
13
+ private removeInputArtifact;
14
+ private getInputArtifact;
15
+ render(): JSX.Element;
16
+ }
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import type { FormikErrors } from 'formik';
3
+ import type { IStage, IStageConfigProps } from '@spinnaker/core';
4
+ export declare function DeployAppengineConfigurationConfig({ application, pipeline, stage, updateStage }: IStageConfigProps): JSX.Element;
5
+ export declare function validateDeployAppengineConfigurationStage(stage: IStage): FormikErrors<IStage>;
@@ -0,0 +1 @@
1
+ export declare const DEPLOY_APPENGINE_CONFIG_STAGE_KEY = "deployAppEngineConfiguration";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_DESTROY_ASG_STAGE = "spinnaker.appengine.pipeline.stage.destroyAsgStage";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_DISABLE_ASG_STAGE = "spinnaker.appengine.pipeline.stage.disableAsgStage";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_EDIT_LOAD_BALANCER_STAGE = "spinnaker.appengine.pipeline.stage.editLoadBalancerStage";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_LOAD_BALANCER_CHOICE_MODAL_CTRL = "spinnaker.appengine.loadBalancerChoiceModal.controller";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_ENABLE_ASG_STAGE = "spinnaker.appengine.pipeline.stage.enableAsgStage";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_SHRINK_CLUSTER_STAGE = "spinnaker.appengine.pipeline.stage.shrinkClusterStage";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_START_SERVER_GROUP_STAGE = "spinnaker.appengine.pipeline.stage.startServerGroupStage";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_STOP_SERVER_GROUP_STAGE = "spinnaker.appengine.pipeline.stage.stopServerGroupStage";
@@ -0,0 +1,74 @@
1
+ import type { IQService } from 'angular';
2
+ import type { Application, IArtifact, IArtifactAccountPair, IExpectedArtifact, IPipeline, IStage } from '@spinnaker/core';
3
+ import type { GitCredentialType, IAppengineGitTrigger, IAppengineJenkinsTrigger, IAppengineServerGroup } from '../../domain';
4
+ import type { AppengineDeployDescription } from '../transformer';
5
+ export interface IAppengineServerGroupCommand {
6
+ application?: string;
7
+ stack?: string;
8
+ freeFormDetails?: string;
9
+ configFilepaths?: string[];
10
+ configFiles?: string[];
11
+ configArtifacts?: IArtifactAccountPair[];
12
+ applicationDirectoryRoot: string;
13
+ branch?: string;
14
+ repositoryUrl?: string;
15
+ credentials: string;
16
+ region: string;
17
+ selectedProvider: string;
18
+ promote?: boolean;
19
+ stopPreviousVersion?: boolean;
20
+ suppressVersionString?: boolean;
21
+ type?: string;
22
+ backingData: any;
23
+ viewState: IViewState;
24
+ strategy?: string;
25
+ strategyApplication?: string;
26
+ strategyPipeline?: string;
27
+ fromTrigger?: boolean;
28
+ trigger?: IAppengineGitTrigger | IAppengineJenkinsTrigger;
29
+ gitCredentialType?: GitCredentialType;
30
+ storageAccountName?: string;
31
+ interestingHealthProviderNames: string[];
32
+ fromArtifact: boolean;
33
+ expectedArtifactId: string;
34
+ expectedArtifact?: IArtifact;
35
+ sourceType: string;
36
+ containerImageUrl?: string;
37
+ }
38
+ export declare enum AppengineSourceType {
39
+ GCS = "gcs",
40
+ GIT = "git",
41
+ ARTIFACT = "artifact",
42
+ CONTAINER_IMAGE = "containerImage"
43
+ }
44
+ export interface IViewState {
45
+ mode: string;
46
+ submitButtonLabel: string;
47
+ disableStrategySelection: boolean;
48
+ stage?: IStage;
49
+ pipeline?: IPipeline;
50
+ }
51
+ export declare class AppengineServerGroupCommandBuilder {
52
+ private $q;
53
+ private static getTriggerOptions;
54
+ 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<{
60
+ viewState: {
61
+ stage: IStage;
62
+ pipeline: IPipeline;
63
+ };
64
+ backingData: {
65
+ triggerOptions: Array<IAppengineGitTrigger | IAppengineJenkinsTrigger>;
66
+ expectedArtifacts: IExpectedArtifact[];
67
+ };
68
+ }>;
69
+ buildServerGroupCommandFromPipeline(app: Application, cluster: AppengineDeployDescription, _stage: IStage, pipeline: IPipeline): PromiseLike<IAppengineServerGroupCommand>;
70
+ private getCredentials;
71
+ private getRegion;
72
+ private getSubmitButtonLabel;
73
+ }
74
+ export declare const APPENGINE_SERVER_GROUP_COMMAND_BUILDER = "spinnaker.appengine.serverGroupCommandBuilder.service";
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import type { IArtifactAccountPair, IPipeline, IStage } from '@spinnaker/core';
3
+ interface IConfigFileArtifactListProps {
4
+ configArtifacts: IArtifactAccountPair[];
5
+ pipeline: IPipeline;
6
+ stage: IStage;
7
+ updateConfigArtifacts: (configArtifacts: any[]) => void;
8
+ }
9
+ export declare const ConfigFileArtifactList: (props: IConfigFileArtifactListProps) => JSX.Element;
10
+ export {};
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_SERVER_GROUP_BASIC_SETTINGS_CTRL = "spinnaker.appengine.basicSettings.controller";
@@ -0,0 +1,2 @@
1
+ import './serverGroupWizard.less';
2
+ export declare const APPENGINE_CLONE_SERVER_GROUP_CTRL = "spinnaker.appengine.cloneServerGroup.controller";
@@ -0,0 +1 @@
1
+ export declare const CONFIG_FILE_ARTIFACT_LIST = "spinnaker.appengine.configFileArtifactList.component";
@@ -0,0 +1,20 @@
1
+ import type { IScope } from 'angular';
2
+ import type { IArtifact, IArtifactAccountPair } from '@spinnaker/core';
3
+ import { ExpectedArtifactSelectorViewController, NgAppengineConfigArtifactDelegate } from '@spinnaker/core';
4
+ import './serverGroupWizard.less';
5
+ export interface IAppengineConfigFileConfigurerCtrlCommand {
6
+ configFiles: string[];
7
+ configArtifacts: ConfigArtifact[];
8
+ sourceType: string;
9
+ }
10
+ declare class ConfigArtifact implements IArtifactAccountPair {
11
+ $scope: IScope;
12
+ controller: ExpectedArtifactSelectorViewController;
13
+ delegate: NgAppengineConfigArtifactDelegate;
14
+ id: string;
15
+ account: string;
16
+ artifact?: IArtifact;
17
+ constructor($scope: IScope, pair?: IArtifactAccountPair);
18
+ }
19
+ export declare const APPENGINE_CONFIG_FILE_CONFIGURER = "spinnaker.appengine.configFileConfigurer.component";
20
+ export {};
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_DYNAMIC_BRANCH_LABEL = "spinnaker.appengine.dynamicBranchLabel.component";
@@ -0,0 +1 @@
1
+ export declare const APPENGINE_SERVER_GROUP_DETAILS_CTRL = "spinnaker.appengine.serverGroup.details.controller";
@@ -0,0 +1,45 @@
1
+ import type { IArtifact, IArtifactAccountPair, IServerGroup } from '@spinnaker/core';
2
+ import type { IAppengineServerGroupCommand } from './configure/serverGroupCommandBuilder.service';
3
+ import type { GitCredentialType, IAppengineGitTrigger, IAppengineJenkinsTrigger } from '../domain/index';
4
+ export declare class AppengineDeployDescription {
5
+ cloudProvider: string;
6
+ provider: string;
7
+ credentials: string;
8
+ account: string;
9
+ application: string;
10
+ stack?: string;
11
+ freeFormDetails?: string;
12
+ repositoryUrl: string;
13
+ branch: string;
14
+ configFilepaths: string[];
15
+ configFiles: string[];
16
+ configArtifacts: IArtifactAccountPair[];
17
+ applicationDirectoryRoot: string;
18
+ promote?: boolean;
19
+ stopPreviousVersion?: boolean;
20
+ type: string;
21
+ region: string;
22
+ strategy?: string;
23
+ strategyApplication?: string;
24
+ strategyPipeline?: string;
25
+ fromTrigger?: boolean;
26
+ trigger?: IAppengineGitTrigger | IAppengineJenkinsTrigger;
27
+ gitCredentialType: GitCredentialType;
28
+ interestingHealthProviderNames: string[];
29
+ expectedArtifactId: string;
30
+ expectedArtifact: IArtifact;
31
+ fromArtifact: boolean;
32
+ sourceType: string;
33
+ storageAccountName?: string;
34
+ containerImageUrl?: string;
35
+ suppressVersionString?: boolean;
36
+ constructor(command: IAppengineServerGroupCommand);
37
+ }
38
+ export declare class AppengineServerGroupTransformer {
39
+ private $q;
40
+ static $inject: string[];
41
+ constructor($q: ng.IQService);
42
+ normalizeServerGroup(serverGroup: IServerGroup): PromiseLike<IServerGroup>;
43
+ convertServerGroupCommandToDeployConfiguration(command: IAppengineServerGroupCommand): AppengineDeployDescription;
44
+ }
45
+ export declare const APPENGINE_SERVER_GROUP_TRANSFORMER = "spinnaker.appengine.serverGroup.transformer.service";
@@ -0,0 +1,8 @@
1
+ import type { Application, ITask } from '@spinnaker/core';
2
+ import type { IAppengineServerGroup } from '../../domain/index';
3
+ export declare class AppengineServerGroupWriter {
4
+ startServerGroup(serverGroup: IAppengineServerGroup, application: Application): PromiseLike<ITask>;
5
+ stopServerGroup(serverGroup: IAppengineServerGroup, application: Application): PromiseLike<ITask>;
6
+ private buildJob;
7
+ }
8
+ export declare const APPENGINE_SERVER_GROUP_WRITER = "spinnaker.appengine.serverGroup.write.service";
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@spinnaker/appengine",
3
+ "license": "Apache-2.0",
4
+ "version": "0.0.0-2025.1-0",
5
+ "module": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "publishConfig": {
8
+ "access": "public",
9
+ "registry": "https://registry.npmjs.org"
10
+ },
11
+ "scripts": {
12
+ "clean": "shx rm -rf dist",
13
+ "prepublishOnly": "npm run build",
14
+ "build": "npm run clean && spinnaker-scripts build",
15
+ "dev": "spinnaker-scripts start",
16
+ "dev:push": "spinnaker-scripts start --push",
17
+ "lib": "npm run build"
18
+ },
19
+ "dependencies": {
20
+ "@spinnaker/core": "^0.29.1",
21
+ "@uirouter/angularjs": "1.0.26",
22
+ "angular": "1.6.10",
23
+ "angular-ui-bootstrap": "2.5.0",
24
+ "classnames": "2.2.6",
25
+ "enzyme": "3.11.0",
26
+ "formik": "1.5.1",
27
+ "lodash": "4.17.21",
28
+ "react": "16.14.0",
29
+ "react2angular": "3.2.1",
30
+ "rxjs": "6.6.7"
31
+ },
32
+ "devDependencies": {
33
+ "@spinnaker/eslint-plugin": "^3.0.2",
34
+ "@spinnaker/mocks": "1.0.7",
35
+ "@spinnaker/scripts": "^0.4.0",
36
+ "@types/angular": "1.6.26",
37
+ "@types/angular-ui-bootstrap": "0.13.41",
38
+ "@types/classnames": "2.2.0",
39
+ "@types/enzyme": "3.10.3",
40
+ "@types/lodash": "4.14.64",
41
+ "@types/react": "16.14.10",
42
+ "shx": "0.3.3",
43
+ "typescript": "5.0.4"
44
+ },
45
+ "gitHead": "34dbf558fc510cee68ecbc8c7921590ef3048dba"
46
+ }
@@ -0,0 +1,70 @@
1
+ import { module } from 'angular';
2
+
3
+ import { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';
4
+
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
+ import './helpContents/appengineHelpContents';
9
+ import { APPENGINE_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';
10
+ import { APPENGINE_LOAD_BALANCER_MODULE } from './loadBalancer/loadBalancer.module';
11
+ import logo from './logo/appengine.logo.png';
12
+ import { APPENGINE_PIPELINE_MODULE } from './pipeline/pipeline.module';
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';
21
+ import './validation/ApplicationNameValidator';
22
+
23
+ import './logo/appengine.logo.less';
24
+
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
+ });
68
+ });
69
+
70
+ DeploymentStrategyRegistry.registerProvider('appengine', ['custom']);
@@ -0,0 +1,14 @@
1
+ import type { IProviderSettings } from '@spinnaker/core';
2
+ import { SETTINGS } from '@spinnaker/core';
3
+
4
+ export interface IAppengineProviderSettings extends IProviderSettings {
5
+ defaults: {
6
+ account?: string;
7
+ };
8
+ }
9
+
10
+ export const AppengineProviderSettings: IAppengineProviderSettings = (SETTINGS.providers
11
+ .appengine as IAppengineProviderSettings) || { defaults: {} };
12
+ if (AppengineProviderSettings) {
13
+ AppengineProviderSettings.resetToOriginal = SETTINGS.resetProvider('appengine');
14
+ }
@@ -0,0 +1,107 @@
1
+ import type { FormikProps } from 'formik';
2
+ import { get } from 'lodash';
3
+ import React from 'react';
4
+ import { from as observableFrom, Subject } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+
7
+ import type { Application, IAccount, IServerGroup, IServerGroupFilter, IStage } from '@spinnaker/core';
8
+ import { AppListExtractor, FormikFormField, ReactSelectInput } from '@spinnaker/core';
9
+
10
+ export interface IFormikAccountRegionSelectorProps {
11
+ accounts: IAccount[];
12
+ application: Application;
13
+ cloudProvider: string;
14
+ componentName?: string;
15
+ credentialsField?: string;
16
+ formik: FormikProps<IStage>;
17
+ }
18
+
19
+ export interface IFormikAccountRegionSelectorState {
20
+ availableRegions: string[];
21
+ cloudProvider: string;
22
+ componentName: string;
23
+ credentialsField: string;
24
+ }
25
+
26
+ export class FormikAccountRegionSelector extends React.Component<
27
+ IFormikAccountRegionSelectorProps,
28
+ IFormikAccountRegionSelectorState
29
+ > {
30
+ private destroy$ = new Subject();
31
+
32
+ constructor(props: IFormikAccountRegionSelectorProps) {
33
+ super(props);
34
+ const credentialsField = props.credentialsField || 'credentials';
35
+ this.state = {
36
+ availableRegions: [],
37
+ cloudProvider: props.cloudProvider,
38
+ componentName: props.componentName || '',
39
+ credentialsField,
40
+ };
41
+ }
42
+
43
+ public componentDidMount(): void {
44
+ const { componentName, formik } = this.props;
45
+ const { credentialsField } = this.state;
46
+ const credentials = get(
47
+ formik.values,
48
+ componentName ? `${componentName}.${credentialsField}` : `${credentialsField}`,
49
+ undefined,
50
+ );
51
+ this.setRegionList(credentials);
52
+ }
53
+
54
+ public componentWillUnmount(): void {
55
+ this.destroy$.next();
56
+ }
57
+
58
+ private setRegionList = (credentials: string): void => {
59
+ const { application } = this.props;
60
+ const accountFilter: IServerGroupFilter = (serverGroup: IServerGroup) =>
61
+ serverGroup ? serverGroup.account === credentials : true;
62
+ observableFrom(application.ready())
63
+ .pipe(takeUntil(this.destroy$))
64
+ .subscribe(() => {
65
+ const availableRegions = AppListExtractor.getRegions([application], accountFilter);
66
+ availableRegions.sort();
67
+ this.setState({ availableRegions });
68
+ });
69
+ };
70
+
71
+ public accountChanged = (credentials: string): void => {
72
+ this.setRegionList(credentials);
73
+ };
74
+
75
+ public render() {
76
+ const { accounts } = this.props;
77
+ const { credentialsField, availableRegions, componentName } = this.state;
78
+ return (
79
+ <div className="col-md-9">
80
+ <div className="sp-margin-m-bottom">
81
+ <FormikFormField
82
+ name={componentName ? `${componentName}.${credentialsField}` : `${credentialsField}`}
83
+ label="Account"
84
+ input={(props) => (
85
+ <ReactSelectInput
86
+ {...props}
87
+ stringOptions={accounts && accounts.map((acc: IAccount) => acc.name)}
88
+ clearable={false}
89
+ />
90
+ )}
91
+ onChange={this.accountChanged}
92
+ required={true}
93
+ />
94
+ </div>
95
+
96
+ <div className="sp-margin-m-bottom">
97
+ <FormikFormField
98
+ name={componentName ? `${componentName}.region` : 'region'}
99
+ label="Region"
100
+ input={(props) => <ReactSelectInput {...props} stringOptions={availableRegions} clearable={false} />}
101
+ required={true}
102
+ />
103
+ </div>
104
+ </div>
105
+ );
106
+ }
107
+ }
@@ -0,0 +1,3 @@
1
+ export class AppengineHealth {
2
+ public static PLATFORM = 'App Engine Service';
3
+ }
@@ -0,0 +1,29 @@
1
+ import type { IComponentOptions } from 'angular';
2
+ import { module } from 'angular';
3
+
4
+ const appengineComponentUrlDetailsComponent: IComponentOptions = {
5
+ bindings: { component: '<' },
6
+ template: `
7
+ <dt>HTTPS</dt>
8
+ <dl class="small">
9
+ <a href="{{$ctrl.component.httpsUrl}}" target="_blank">{{$ctrl.component.httpsUrl}}</a>
10
+ <copy-to-clipboard class="copy-to-clipboard copy-to-clipboard-sm"
11
+ tool-tip="'Copy URL to clipboard'"
12
+ text="$ctrl.component.httpsUrl"></copy-to-clipboard>
13
+ </dl>
14
+ <dt>HTTP</dt>
15
+ <dl class="small">
16
+ <a href="{{$ctrl.component.httpUrl}}" target="_blank">{{$ctrl.component.httpUrl}}</a>
17
+ <copy-to-clipboard class="copy-to-clipboard copy-to-clipboard-sm"
18
+ tool-tip="'Copy URL to clipboard'"
19
+ text="$ctrl.component.httpUrl"></copy-to-clipboard>
20
+ </dl>
21
+ `,
22
+ };
23
+
24
+ export const APPENGINE_COMPONENT_URL_DETAILS = 'spinnaker.appengine.componentUrlDetails.component';
25
+
26
+ module(APPENGINE_COMPONENT_URL_DETAILS, []).component(
27
+ 'appengineComponentUrlDetails',
28
+ appengineComponentUrlDetailsComponent,
29
+ );
@@ -0,0 +1,37 @@
1
+ import type { IComponentOptions, IController, IFilterService } from 'angular';
2
+ import { module } from 'angular';
3
+
4
+ class AppengineConditionalDescriptionListItemCtrl implements IController {
5
+ public label: string;
6
+ public key: string;
7
+ public component: any;
8
+
9
+ public static $inject = ['$filter'];
10
+ constructor(private $filter: IFilterService) {}
11
+
12
+ public $onInit(): void {
13
+ if (!this.label) {
14
+ this.label = this.$filter<Function>('robotToHuman')(this.key);
15
+ }
16
+ }
17
+ }
18
+
19
+ const appengineConditionalDescriptionListItem: IComponentOptions = {
20
+ bindings: { label: '@', key: '@', component: '<' },
21
+ transclude: {
22
+ keyLabel: '?keyText',
23
+ valueLabel: '?valueLabel',
24
+ },
25
+ template: `
26
+ <dt ng-if="$ctrl.component[$ctrl.key]">{{$ctrl.label}}<span ng-transclude="keyLabel"></span></dt>
27
+ <dd ng-if="$ctrl.component[$ctrl.key]">{{$ctrl.component[$ctrl.key]}}<span ng-transclude="valueLabel"></span></dd>
28
+ `,
29
+ controller: AppengineConditionalDescriptionListItemCtrl,
30
+ };
31
+
32
+ export const APPENGINE_CONDITIONAL_DESCRIPTION_LIST_ITEM = 'spinnaker.appengine.conditionalDescriptionListItem';
33
+
34
+ module(APPENGINE_CONDITIONAL_DESCRIPTION_LIST_ITEM, []).component(
35
+ 'appengineConditionalDtDd',
36
+ appengineConditionalDescriptionListItem,
37
+ );
@@ -0,0 +1,33 @@
1
+ <div class="row">
2
+ <div class="col-md-offset-{{ $ctrl.columnOffset || 0 }} col-md-{{ $ctrl.columns || 12 }}">
3
+ <div class="well">
4
+ <p>
5
+ <span ng-if="$ctrl.showCreateMessage">Spinnaker cannot create a load balancer for App Engine.</span>
6
+ A Spinnaker load balancer maps to an App Engine service, which is specified in a version's
7
+ <code>app.yaml</code>.
8
+ </p>
9
+ <p>For example, the following <code>app.yaml</code></p>
10
+ <pre class="text-left" style="white-space: pre-line">
11
+ runtime: python27
12
+ api_version: 1
13
+ &hellip;
14
+ service: mobile
15
+ &hellip;
16
+ </pre
17
+ >
18
+ <p>
19
+ deploys to the <code>mobile</code> service. If you do not specify a service, your version will be deployed to
20
+ the <code>default</code> service.
21
+ </p>
22
+ <p>
23
+ If a service does not exist when a version is deployed, it will be created. It will then be editable as a load
24
+ balancer within Spinnaker.
25
+ </p>
26
+ <p>
27
+ <a href="https://cloud.google.com/appengine/docs/python/config/appref" target="_blank"
28
+ >App Engine Documentation</a
29
+ >
30
+ </p>
31
+ </div>
32
+ </div>
33
+ </div>