@spinnaker/oracle 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 (138) hide show
  1. package/dist/image/image.reader.d.ts +4 -2
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/instance/details/OracleInstanceDetails.d.ts +2 -0
  6. package/dist/loadBalancer/details/OracleLoadBalancerDetails.d.ts +10 -0
  7. package/dist/loadBalancer/loadBalancer.transformer.d.ts +4 -5
  8. package/dist/oracle.provider.d.ts +3 -0
  9. package/dist/pipeline/stages/bake/OracleBakeStageConfig.d.ts +50 -0
  10. package/dist/pipeline/stages/destroyAsg/OracleDestroyAsgStageConfig.d.ts +26 -0
  11. package/dist/pipeline/stages/disableAsg/OracleDisableAsgStageConfig.d.ts +26 -0
  12. package/dist/pipeline/stages/findAmi/OracleFindAmiStageConfig.d.ts +19 -0
  13. package/dist/pipeline/stages/findImageFromTags/OracleFindImageFromTagsStageConfig.d.ts +16 -0
  14. package/dist/pipeline/stages/resizeAsg/OracleResizeAsgStageConfig.d.ts +26 -0
  15. package/dist/pipeline/stages/scaleDownCluster/OracleScaleDownClusterStageConfig.d.ts +20 -0
  16. package/dist/pipeline/stages/shrinkCluster/OracleShrinkClusterStageConfig.d.ts +19 -0
  17. package/dist/securityGroup/details/OracleSecurityGroupDetails.d.ts +2 -0
  18. package/dist/securityGroup/securityGroup.reader.d.ts +3 -2
  19. package/dist/securityGroup/securityGroup.transformer.d.ts +3 -2
  20. package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +41 -2
  21. package/dist/serverGroup/configure/serverGroupConfiguration.service.d.ts +8 -2
  22. package/dist/serverGroup/details/OracleServerGroupDetails.d.ts +6 -0
  23. package/dist/serverGroup/serverGroup.transformer.d.ts +4 -2
  24. package/package.json +5 -9
  25. package/src/image/image.reader.js +4 -13
  26. package/src/index.ts +4 -1
  27. package/src/instance/details/OracleInstanceDetails.tsx +21 -0
  28. package/src/loadBalancer/details/OracleLoadBalancerDetails.spec.tsx +48 -0
  29. package/src/loadBalancer/details/OracleLoadBalancerDetails.tsx +84 -0
  30. package/src/loadBalancer/loadBalancer.transformer.ts +5 -11
  31. package/src/oracle.provider.spec.ts +45 -0
  32. package/src/oracle.provider.ts +85 -0
  33. package/src/pipeline/stages/bake/OracleBakeStageConfig.tsx +325 -0
  34. package/src/pipeline/stages/destroyAsg/OracleDestroyAsgStageConfig.tsx +87 -0
  35. package/src/pipeline/stages/disableAsg/OracleDisableAsgStageConfig.tsx +105 -0
  36. package/src/pipeline/stages/findAmi/OracleFindAmiStageConfig.tsx +103 -0
  37. package/src/pipeline/stages/findImageFromTags/OracleFindImageFromTagsStageConfig.tsx +90 -0
  38. package/src/pipeline/stages/resizeAsg/OracleResizeAsgStageConfig.tsx +225 -0
  39. package/src/pipeline/stages/scaleDownCluster/OracleScaleDownClusterStageConfig.tsx +122 -0
  40. package/src/pipeline/stages/shrinkCluster/OracleShrinkClusterStageConfig.tsx +136 -0
  41. package/src/securityGroup/details/OracleSecurityGroupDetails.tsx +19 -0
  42. package/src/securityGroup/securityGroup.reader.js +3 -11
  43. package/src/securityGroup/securityGroup.transformer.js +8 -15
  44. package/src/serverGroup/configure/serverGroupCommandBuilder.service.js +71 -87
  45. package/src/serverGroup/configure/serverGroupConfiguration.service.js +210 -214
  46. package/src/serverGroup/details/OracleServerGroupDetails.spec.ts +47 -0
  47. package/src/serverGroup/details/OracleServerGroupDetails.tsx +106 -0
  48. package/src/serverGroup/serverGroup.transformer.js +11 -23
  49. package/dist/common/footer.component.d.ts +0 -2
  50. package/dist/instance/details/instance.details.controller.d.ts +0 -2
  51. package/dist/loadBalancer/configure/createLoadBalancer.controller.d.ts +0 -87
  52. package/dist/loadBalancer/details/loadBalancerDetail.controller.d.ts +0 -21
  53. package/dist/oracle.module.d.ts +0 -2
  54. package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +0 -2
  55. package/dist/pipeline/stages/bake/ociBakeStage.d.ts +0 -2
  56. package/dist/pipeline/stages/destroyAsg/destroyAsgStage.d.ts +0 -2
  57. package/dist/pipeline/stages/disableAsg/disableAsgStage.d.ts +0 -2
  58. package/dist/pipeline/stages/findAmi/findAmiStage.d.ts +0 -2
  59. package/dist/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.d.ts +0 -2
  60. package/dist/pipeline/stages/resizeAsg/resizeAsgStage.d.ts +0 -2
  61. package/dist/pipeline/stages/scaleDownCluster/scaleDownClusterStage.d.ts +0 -2
  62. package/dist/pipeline/stages/shrinkCluster/shrinkClusterStage.d.ts +0 -2
  63. package/dist/securityGroup/configure/createSecurityGroup.controller.d.ts +0 -2
  64. package/dist/serverGroup/configure/serverGroup.configure.module.d.ts +0 -2
  65. package/dist/serverGroup/configure/wizard/basicSettings/basicSettings.controller.d.ts +0 -2
  66. package/dist/serverGroup/configure/wizard/capacity/capacitySelector.component.d.ts +0 -2
  67. package/dist/serverGroup/configure/wizard/cloneServerGroup.controller.d.ts +0 -2
  68. package/dist/serverGroup/details/resize/resizeCapacity.component.d.ts +0 -2
  69. package/dist/serverGroup/details/resize/resizeServerGroup.controller.d.ts +0 -2
  70. package/dist/serverGroup/details/rollback/rollbackServerGroup.controller.d.ts +0 -2
  71. package/dist/serverGroup/details/serverGroupDetails.controller.d.ts +0 -2
  72. package/src/common/footer.component.html +0 -7
  73. package/src/common/footer.component.js +0 -18
  74. package/src/common/ocid/ocid.component.js +0 -15
  75. package/src/common/ocid/ocid.template.html +0 -10
  76. package/src/common/ocid/truncateOcid.filter.js +0 -14
  77. package/src/instance/details/instance.details.controller.js +0 -56
  78. package/src/instance/details/instanceDetails.html +0 -31
  79. package/src/loadBalancer/configure/backendSets.html +0 -67
  80. package/src/loadBalancer/configure/certificates.html +0 -63
  81. package/src/loadBalancer/configure/createLoadBalancer.controller.spec.ts +0 -201
  82. package/src/loadBalancer/configure/createLoadBalancer.controller.ts +0 -540
  83. package/src/loadBalancer/configure/createLoadBalancer.html +0 -25
  84. package/src/loadBalancer/configure/createLoadBalancerProperties.html +0 -167
  85. package/src/loadBalancer/configure/editLoadBalancer.html +0 -26
  86. package/src/loadBalancer/configure/listeners.html +0 -88
  87. package/src/loadBalancer/details/loadBalancerDetail.controller.spec.ts +0 -62
  88. package/src/loadBalancer/details/loadBalancerDetail.controller.ts +0 -163
  89. package/src/loadBalancer/details/loadBalancerDetail.html +0 -100
  90. package/src/oracle.module.ts +0 -94
  91. package/src/pipeline/disableAsg/disableAsgStage.html +0 -11
  92. package/src/pipeline/disableAsg/disableAsgStage.js +0 -62
  93. package/src/pipeline/disableAsg/disableAsgStepLabel.html +0 -1
  94. package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +0 -38
  95. package/src/pipeline/stages/bake/bakeExecutionDetails.html +0 -52
  96. package/src/pipeline/stages/bake/bakeStage.html +0 -109
  97. package/src/pipeline/stages/bake/ociBakeStage.js +0 -147
  98. package/src/pipeline/stages/destroyAsg/destroyAsgStage.html +0 -9
  99. package/src/pipeline/stages/destroyAsg/destroyAsgStage.js +0 -64
  100. package/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html +0 -1
  101. package/src/pipeline/stages/disableAsg/disableAsgStage.html +0 -11
  102. package/src/pipeline/stages/disableAsg/disableAsgStage.js +0 -63
  103. package/src/pipeline/stages/disableAsg/disableAsgStepLabel.html +0 -1
  104. package/src/pipeline/stages/findAmi/findAmiStage.html +0 -20
  105. package/src/pipeline/stages/findAmi/findAmiStage.js +0 -82
  106. package/src/pipeline/stages/findImageFromTags/findImageFromTagsExecutionDetails.html +0 -44
  107. package/src/pipeline/stages/findImageFromTags/findImageFromTagsStage.html +0 -11
  108. package/src/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.js +0 -36
  109. package/src/pipeline/stages/resizeAsg/resizeAsgStage.html +0 -89
  110. package/src/pipeline/stages/resizeAsg/resizeAsgStage.js +0 -101
  111. package/src/pipeline/stages/resizeAsg/resizeAsgStepLabel.html +0 -1
  112. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.html +0 -35
  113. package/src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.js +0 -75
  114. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.html +0 -34
  115. package/src/pipeline/stages/shrinkCluster/shrinkClusterStage.js +0 -71
  116. package/src/securityGroup/configure/createSecurityGroup.controller.js +0 -19
  117. package/src/securityGroup/configure/createSecurityGroup.html +0 -19
  118. package/src/serverGroup/configure/serverGroup.configure.module.js +0 -15
  119. package/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html +0 -13
  120. package/src/serverGroup/configure/wizard/basicSettings/basicSettings.controller.js +0 -35
  121. package/src/serverGroup/configure/wizard/basicSettings/basicSettings.html +0 -134
  122. package/src/serverGroup/configure/wizard/capacity/capacity.html +0 -7
  123. package/src/serverGroup/configure/wizard/capacity/capacitySelector.component.html +0 -13
  124. package/src/serverGroup/configure/wizard/capacity/capacitySelector.component.js +0 -17
  125. package/src/serverGroup/configure/wizard/cloneServerGroup.controller.js +0 -109
  126. package/src/serverGroup/configure/wizard/instanceType/instanceType.html +0 -29
  127. package/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html +0 -44
  128. package/src/serverGroup/configure/wizard/network/networkSettings.html +0 -15
  129. package/src/serverGroup/configure/wizard/serverGroupWizard.html +0 -40
  130. package/src/serverGroup/configure/wizard/templateSelection/templateSelection.html +0 -9
  131. package/src/serverGroup/details/resize/resizeCapacity.component.html +0 -36
  132. package/src/serverGroup/details/resize/resizeCapacity.component.js +0 -42
  133. package/src/serverGroup/details/resize/resizeServerGroup.controller.js +0 -62
  134. package/src/serverGroup/details/resize/resizeServerGroup.html +0 -33
  135. package/src/serverGroup/details/rollback/rollbackServerGroup.controller.js +0 -73
  136. package/src/serverGroup/details/rollback/rollbackServerGroup.html +0 -41
  137. package/src/serverGroup/details/serverGroupDetails.controller.js +0 -230
  138. package/src/serverGroup/details/serverGroupDetails.html +0 -94
@@ -0,0 +1,45 @@
1
+ import { CloudProviderRegistry, Registry } from '@spinnaker/core';
2
+
3
+ import './index';
4
+ import { OracleImageReader } from './image/image.reader';
5
+ import { OracleLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';
6
+ import { registerOraclePipelineStages } from './oracle.provider';
7
+ import { OracleSecurityGroupReader } from './securityGroup/securityGroup.reader';
8
+ import { OracleSecurityGroupTransformer } from './securityGroup/securityGroup.transformer';
9
+ import { OracleServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';
10
+ import { OracleServerGroupConfigurationService } from './serverGroup/configure/serverGroupConfiguration.service';
11
+ import { OracleServerGroupTransformer } from './serverGroup/serverGroup.transformer';
12
+
13
+ describe('Oracle provider registration', () => {
14
+ it('registers provider delegates', () => {
15
+ expect(CloudProviderRegistry.getValue('oracle', 'image.reader')).toBe(OracleImageReader);
16
+ expect(CloudProviderRegistry.getValue('oracle', 'loadBalancer.transformer')).toBe(OracleLoadBalancerTransformer);
17
+ expect(CloudProviderRegistry.getValue('oracle', 'serverGroup.transformer')).toBe(OracleServerGroupTransformer);
18
+ expect(CloudProviderRegistry.getValue('oracle', 'serverGroup.commandBuilder')).toBe(
19
+ OracleServerGroupCommandBuilder,
20
+ );
21
+ expect(CloudProviderRegistry.getValue('oracle', 'serverGroup.configurationService')).toBe(
22
+ OracleServerGroupConfigurationService,
23
+ );
24
+ expect(CloudProviderRegistry.getValue('oracle', 'securityGroup.reader')).toBe(OracleSecurityGroupReader);
25
+ expect(CloudProviderRegistry.getValue('oracle', 'securityGroup.transformer')).toBe(OracleSecurityGroupTransformer);
26
+
27
+ expect(CloudProviderRegistry.getValue('oracle', 'loadBalancer.details')).toBeNull();
28
+ expect(CloudProviderRegistry.getValue('oracle', 'serverGroup.detailsActions')).toBeDefined();
29
+ expect(CloudProviderRegistry.getValue('oracle', 'instance.details')).toBeDefined();
30
+ expect(CloudProviderRegistry.getValue('oracle', 'securityGroup.details')).toBeDefined();
31
+ });
32
+
33
+ it('registers Oracle pipeline stages during package import', () => {
34
+ Registry.reinitialize();
35
+ registerOraclePipelineStages();
36
+
37
+ const stages = Registry.pipeline.getStageTypes();
38
+
39
+ expect(stages.some((stage) => stage.provides === 'findImage' && stage.cloudProvider === 'oracle')).toBe(true);
40
+ expect(stages.some((stage) => stage.provides === 'resizeServerGroup' && stage.cloudProvider === 'oracle')).toBe(
41
+ true,
42
+ );
43
+ expect(stages.some((stage) => stage.provides === 'bake' && stage.cloudProvider === 'oracle')).toBe(true);
44
+ });
45
+ });
@@ -0,0 +1,85 @@
1
+ import type React from 'react';
2
+
3
+ import { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';
4
+
5
+ import './helpContents/oracleHelpContents';
6
+ import { OracleImageReader } from './image/image.reader';
7
+ import { OracleInstanceDetails } from './instance/details/OracleInstanceDetails';
8
+ import {
9
+ OracleLoadBalancerDetailsSections,
10
+ useOracleLoadBalancerDetails,
11
+ } from './loadBalancer/details/OracleLoadBalancerDetails';
12
+ import { OracleLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';
13
+ import { registerOracleBakeStage } from './pipeline/stages/bake/OracleBakeStageConfig';
14
+ import { registerOracleDestroyAsgStage } from './pipeline/stages/destroyAsg/OracleDestroyAsgStageConfig';
15
+ import { registerOracleDisableAsgStage } from './pipeline/stages/disableAsg/OracleDisableAsgStageConfig';
16
+ import { registerOracleFindAmiStage } from './pipeline/stages/findAmi/OracleFindAmiStageConfig';
17
+ import { registerOracleFindImageFromTagsStage } from './pipeline/stages/findImageFromTags/OracleFindImageFromTagsStageConfig';
18
+ import { registerOracleResizeAsgStage } from './pipeline/stages/resizeAsg/OracleResizeAsgStageConfig';
19
+ import { registerOracleScaleDownClusterStage } from './pipeline/stages/scaleDownCluster/OracleScaleDownClusterStageConfig';
20
+ import { registerOracleShrinkClusterStage } from './pipeline/stages/shrinkCluster/OracleShrinkClusterStageConfig';
21
+ import { OracleSecurityGroupDetails } from './securityGroup/details/OracleSecurityGroupDetails';
22
+ import { OracleSecurityGroupReader } from './securityGroup/securityGroup.reader';
23
+ import { OracleSecurityGroupTransformer } from './securityGroup/securityGroup.transformer';
24
+ import { OracleServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';
25
+ import { OracleServerGroupConfigurationService } from './serverGroup/configure/serverGroupConfiguration.service';
26
+ import {
27
+ OracleServerGroupActions,
28
+ oracleServerGroupDetailsGetter,
29
+ OracleServerGroupInformationSection,
30
+ OracleServerGroupLaunchConfigSection,
31
+ OracleServerGroupSizeSection,
32
+ } from './serverGroup/details/OracleServerGroupDetails';
33
+ import { OracleServerGroupTransformer } from './serverGroup/serverGroup.transformer';
34
+
35
+ export function registerOracleProvider(): void {
36
+ CloudProviderRegistry.registerProvider('oracle', {
37
+ name: 'Oracle',
38
+ image: {
39
+ reader: OracleImageReader,
40
+ },
41
+ loadBalancer: {
42
+ transformer: OracleLoadBalancerTransformer,
43
+ useDetailsHook: useOracleLoadBalancerDetails,
44
+ detailsActions: function OracleLoadBalancerActions(): React.ReactElement | null {
45
+ return null;
46
+ },
47
+ detailsSections: OracleLoadBalancerDetailsSections,
48
+ },
49
+ serverGroup: {
50
+ transformer: OracleServerGroupTransformer,
51
+ detailsActions: OracleServerGroupActions,
52
+ detailsGetter: oracleServerGroupDetailsGetter,
53
+ detailsSections: [
54
+ OracleServerGroupInformationSection,
55
+ OracleServerGroupSizeSection,
56
+ OracleServerGroupLaunchConfigSection,
57
+ ],
58
+ // Oracle does not provide a create or clone modal.
59
+ commandBuilder: OracleServerGroupCommandBuilder,
60
+ configurationService: OracleServerGroupConfigurationService,
61
+ },
62
+ instance: {
63
+ details: OracleInstanceDetails,
64
+ },
65
+ securityGroup: {
66
+ reader: OracleSecurityGroupReader,
67
+ transformer: OracleSecurityGroupTransformer,
68
+ details: OracleSecurityGroupDetails,
69
+ },
70
+ });
71
+ }
72
+
73
+ export function registerOraclePipelineStages(): void {
74
+ registerOracleBakeStage();
75
+ registerOracleDestroyAsgStage();
76
+ registerOracleDisableAsgStage();
77
+ registerOracleFindAmiStage();
78
+ registerOracleFindImageFromTagsStage();
79
+ registerOracleResizeAsgStage();
80
+ registerOracleScaleDownClusterStage();
81
+ registerOracleShrinkClusterStage();
82
+ }
83
+
84
+ registerOracleProvider();
85
+ DeploymentStrategyRegistry.registerProvider('oracle', []);
@@ -0,0 +1,325 @@
1
+ import React from 'react';
2
+
3
+ import type { IAccount, IStageConfigProps } from '@spinnaker/core';
4
+ import {
5
+ AccountService,
6
+ AuthenticationService,
7
+ BakeExecutionLabel,
8
+ BakeryReader,
9
+ ExecutionDetailsTasks,
10
+ HelpField,
11
+ Registry,
12
+ StageConfigField,
13
+ } from '@spinnaker/core';
14
+
15
+ interface IBaseOsOption {
16
+ id: string;
17
+ shortDescription?: string;
18
+ detailedDescription?: string;
19
+ }
20
+
21
+ interface IOracleBakeStageState {
22
+ accounts: IAccount[];
23
+ baseOsOptions: IBaseOsOption[];
24
+ extendedAttributeKey: string;
25
+ extendedAttributeValue: string;
26
+ loading: boolean;
27
+ }
28
+
29
+ function baseOsDescription(baseOsOption: IBaseOsOption): string {
30
+ return baseOsOption.id + (baseOsOption.shortDescription ? ` (${baseOsOption.shortDescription})` : '');
31
+ }
32
+
33
+ export class OracleBakeStageConfig extends React.Component<IStageConfigProps, IOracleBakeStageState> {
34
+ private mounted = false;
35
+
36
+ public state: IOracleBakeStageState = {
37
+ accounts: [],
38
+ baseOsOptions: [],
39
+ extendedAttributeKey: '',
40
+ extendedAttributeValue: '',
41
+ loading: true,
42
+ };
43
+
44
+ public componentDidMount(): void {
45
+ this.mounted = true;
46
+ const stage = this.props.stage as any;
47
+ if (!stage.cloudProvider) {
48
+ this.props.updateStageField({ cloudProvider: 'oracle', cloudProviderType: 'oracle' });
49
+ }
50
+
51
+ Promise.all([BakeryReader.getBaseOsOptions('oracle'), AccountService.listAccounts('oracle')]).then(
52
+ ([baseOsOptions, accounts]) => {
53
+ if (!this.mounted) {
54
+ return;
55
+ }
56
+
57
+ const changes: Record<string, any> = {};
58
+ if (!stage.user) {
59
+ changes.user = AuthenticationService.getAuthenticatedUser()?.name;
60
+ }
61
+ if (!stage.upgrade) {
62
+ changes.upgrade = true;
63
+ }
64
+ if (!stage.baseOs && baseOsOptions.baseImages.length > 0) {
65
+ changes.baseOs = baseOsOptions.baseImages[0].id;
66
+ }
67
+ if (Object.keys(changes).length) {
68
+ this.props.updateStageField(changes);
69
+ }
70
+
71
+ if (stage.accountName) {
72
+ this.loadRegionForAccount(stage.accountName);
73
+ }
74
+
75
+ this.setState({ accounts, baseOsOptions: baseOsOptions.baseImages, loading: false });
76
+ },
77
+ );
78
+ }
79
+
80
+ public componentWillUnmount(): void {
81
+ this.mounted = false;
82
+ }
83
+
84
+ private loadRegionForAccount(accountName: string): void {
85
+ AccountService.getRegionsForAccount(accountName).then((regions) => {
86
+ if (this.mounted && Array.isArray(regions) && regions.length) {
87
+ this.props.updateStageField({ region: regions[0].name });
88
+ }
89
+ });
90
+ }
91
+
92
+ private accountChanged = (accountName: string): void => {
93
+ this.props.updateStageField({ accountName });
94
+ this.loadRegionForAccount(accountName);
95
+ };
96
+
97
+ private updateExtendedAttribute(key: string, value: string): void {
98
+ const stage = this.props.stage as any;
99
+ this.props.updateStageField({ extendedAttributes: { ...(stage.extendedAttributes || {}), [key]: value } });
100
+ }
101
+
102
+ private removeExtendedAttribute(key: string): void {
103
+ const stage = this.props.stage as any;
104
+ const extendedAttributes = { ...(stage.extendedAttributes || {}) };
105
+ delete extendedAttributes[key];
106
+ this.props.updateStageField({ extendedAttributes });
107
+ }
108
+
109
+ private addExtendedAttribute = (): void => {
110
+ const key = this.state.extendedAttributeKey.trim();
111
+ if (!key) {
112
+ return;
113
+ }
114
+ this.updateExtendedAttribute(key, this.state.extendedAttributeValue);
115
+ this.setState({ extendedAttributeKey: '', extendedAttributeValue: '' });
116
+ };
117
+
118
+ public render() {
119
+ if (this.state.loading) {
120
+ return <div className="horizontal center middle">Loading...</div>;
121
+ }
122
+
123
+ const stage = this.props.stage as any;
124
+ const extendedAttributes = stage.extendedAttributes || {};
125
+
126
+ return (
127
+ <div className="form-horizontal">
128
+ <StageConfigField label="Oracle Account" helpKey="oracle.pipeline.config.bake.account_name">
129
+ <select
130
+ className="form-control input-sm"
131
+ onChange={(event) => this.accountChanged(event.target.value)}
132
+ value={stage.accountName || ''}
133
+ >
134
+ <option value="" />
135
+ {this.state.accounts.map((account) => (
136
+ <option key={account.name} value={account.name}>
137
+ {account.name}
138
+ </option>
139
+ ))}
140
+ </select>
141
+ </StageConfigField>
142
+ <StageConfigField label="Region" helpKey="oracle.pipeline.config.bake.regions">
143
+ <input className="form-control input-sm" readOnly={true} value={stage.region || ''} />
144
+ </StageConfigField>
145
+ <StageConfigField label="Base Image" helpKey="oracle.pipeline.config.bake.baseOsOption">
146
+ {this.state.baseOsOptions.map((baseImage) => (
147
+ <div className="radio" key={baseImage.id}>
148
+ <label>
149
+ <input
150
+ checked={stage.baseOs === baseImage.id}
151
+ onChange={() => this.props.updateStageField({ baseOs: baseImage.id })}
152
+ type="radio"
153
+ />
154
+ {baseOsDescription(baseImage)} <HelpField content={baseImage.detailedDescription} />
155
+ </label>
156
+ </div>
157
+ ))}
158
+ </StageConfigField>
159
+ <StageConfigField label="Image Name" helpKey="oracle.pipeline.config.bake.image_name">
160
+ <input
161
+ className="form-control input-sm"
162
+ onChange={(event) => this.props.updateStageField({ amiName: event.target.value })}
163
+ value={stage.amiName || ''}
164
+ />
165
+ </StageConfigField>
166
+ <StageConfigField label="Package" helpKey="oracle.pipeline.config.bake.package">
167
+ <input
168
+ className="form-control input-sm"
169
+ onChange={(event) => this.props.updateStageField({ package: event.target.value })}
170
+ value={stage.package || ''}
171
+ />
172
+ </StageConfigField>
173
+ <StageConfigField label="Rebake" helpKey="execution.forceRebake">
174
+ <div className="checkbox" style={{ marginBottom: 0 }}>
175
+ <label>
176
+ <input
177
+ checked={!!stage.rebake}
178
+ onChange={(event) => this.props.updateStageField({ rebake: event.target.checked })}
179
+ type="checkbox"
180
+ />
181
+ Rebake image without regard to the status of any existing bake
182
+ </label>
183
+ </div>
184
+ </StageConfigField>
185
+ <div className="form-group">
186
+ <div className="col-md-9 col-md-offset-1">
187
+ <div className="checkbox">
188
+ <label>
189
+ <input
190
+ checked={!!stage.showAdvancedOptions}
191
+ onChange={(event) => this.props.updateStageField({ showAdvancedOptions: event.target.checked })}
192
+ type="checkbox"
193
+ />
194
+ <strong>Show Advanced Options</strong>
195
+ </label>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ {stage.showAdvancedOptions && (
200
+ <>
201
+ <StageConfigField label="Template File Name" helpKey="pipeline.config.bake.templateFileName">
202
+ <input
203
+ className="form-control input-sm"
204
+ onChange={(event) => this.props.updateStageField({ templateFileName: event.target.value })}
205
+ value={stage.templateFileName || ''}
206
+ />
207
+ </StageConfigField>
208
+ <StageConfigField label="Var File Name" helpKey="pipeline.config.bake.varFileName">
209
+ <input
210
+ className="form-control input-sm"
211
+ onChange={(event) => this.props.updateStageField({ varFileName: event.target.value })}
212
+ value={stage.varFileName || ''}
213
+ />
214
+ </StageConfigField>
215
+ <StageConfigField label="Extended Attributes" helpKey="pipeline.config.bake.extendedAttributes">
216
+ <table className="table table-condensed packed">
217
+ <thead>
218
+ <tr>
219
+ <th style={{ width: '40%' }}>Key</th>
220
+ <th style={{ width: '60%' }}>Value</th>
221
+ <th className="text-right">Actions</th>
222
+ </tr>
223
+ </thead>
224
+ <tbody>
225
+ {Object.keys(extendedAttributes).map((key) => (
226
+ <tr key={key}>
227
+ <td>
228
+ <strong className="small">{key}</strong>
229
+ </td>
230
+ <td>
231
+ <input
232
+ className="form-control input-sm"
233
+ onChange={(event) => this.updateExtendedAttribute(key, event.target.value)}
234
+ value={extendedAttributes[key]}
235
+ />
236
+ </td>
237
+ <td className="text-right">
238
+ <a
239
+ className="small"
240
+ href=""
241
+ onClick={(event) => {
242
+ event.preventDefault();
243
+ this.removeExtendedAttribute(key);
244
+ }}
245
+ >
246
+ Remove
247
+ </a>
248
+ </td>
249
+ </tr>
250
+ ))}
251
+ </tbody>
252
+ <tfoot>
253
+ <tr>
254
+ <td>
255
+ <input
256
+ className="form-control input-sm"
257
+ onChange={(event) => this.setState({ extendedAttributeKey: event.target.value })}
258
+ placeholder="Key"
259
+ value={this.state.extendedAttributeKey}
260
+ />
261
+ </td>
262
+ <td>
263
+ <input
264
+ className="form-control input-sm"
265
+ onChange={(event) => this.setState({ extendedAttributeValue: event.target.value })}
266
+ placeholder="Value"
267
+ value={this.state.extendedAttributeValue}
268
+ />
269
+ </td>
270
+ <td className="text-right">
271
+ <button
272
+ className="btn btn-block btn-sm add-new"
273
+ onClick={this.addExtendedAttribute}
274
+ type="button"
275
+ >
276
+ <span className="glyphicon glyphicon-plus-sign" /> Add Extended Attribute
277
+ </button>
278
+ </td>
279
+ </tr>
280
+ </tfoot>
281
+ </table>
282
+ </StageConfigField>
283
+ <StageConfigField label="Upgrade" helpKey="oracle.pipeline.config.bake.upgrade">
284
+ <label className="checkbox-inline">
285
+ <input
286
+ checked={!!stage.upgrade}
287
+ onChange={(event) => this.props.updateStageField({ upgrade: event.target.checked })}
288
+ type="checkbox"
289
+ />
290
+ Perform a package manager upgrade before proceeding with the package installation
291
+ </label>
292
+ </StageConfigField>
293
+ </>
294
+ )}
295
+ </div>
296
+ );
297
+ }
298
+ }
299
+
300
+ export const oracleBakeStage = {
301
+ key: 'bake',
302
+ provides: 'bake',
303
+ cloudProvider: 'oracle',
304
+ label: 'Bake',
305
+ description: 'Bakes an image',
306
+ component: OracleBakeStageConfig,
307
+ executionDetailsSections: [ExecutionDetailsTasks],
308
+ executionLabelComponent: BakeExecutionLabel,
309
+ supportsCustomTimeout: true,
310
+ validators: [
311
+ { type: 'requiredField', fieldName: 'accountName' },
312
+ { type: 'requiredField', fieldName: 'region' },
313
+ { type: 'requiredField', fieldName: 'baseOs' },
314
+ { type: 'requiredField', fieldName: 'upgrade' },
315
+ { type: 'requiredField', fieldName: 'cloudProviderType' },
316
+ { type: 'requiredField', fieldName: 'amiName', fieldLabel: 'Image Name' },
317
+ ],
318
+ restartable: true,
319
+ };
320
+
321
+ export function registerOracleBakeStage() {
322
+ Registry.pipeline.registerStage(oracleBakeStage);
323
+ }
324
+
325
+ registerOracleBakeStage();
@@ -0,0 +1,87 @@
1
+ import React, { useEffect, useState } from 'react';
2
+
3
+ import type { IAccount, IStageConfigProps } from '@spinnaker/core';
4
+ import {
5
+ AccountRegionClusterSelector,
6
+ AccountService,
7
+ Registry,
8
+ StageConfigField,
9
+ StageConstants,
10
+ TargetSelect,
11
+ } from '@spinnaker/core';
12
+
13
+ export function OracleDestroyAsgStageConfig(props: IStageConfigProps) {
14
+ const { application, pipeline, stage, stageFieldUpdated, updateStageField } = props;
15
+ const [accounts, setAccounts] = useState<IAccount[]>([]);
16
+
17
+ useEffect(() => {
18
+ const changes: Record<string, any> = {};
19
+ if (stage.cloudProvider !== 'oracle') {
20
+ changes.cloudProvider = 'oracle';
21
+ }
22
+ if (!stage.credentials && application.defaultCredentials?.oracle) {
23
+ changes.credentials = application.defaultCredentials.oracle;
24
+ }
25
+ if (!stage.regions?.length && application.defaultRegions?.oracle) {
26
+ changes.regions = [application.defaultRegions.oracle];
27
+ }
28
+ if (!stage.target) {
29
+ changes.target = StageConstants.TARGET_LIST[0].val;
30
+ }
31
+ if (Object.keys(changes).length) {
32
+ updateStageField(changes);
33
+ }
34
+ }, []);
35
+
36
+ useEffect(() => {
37
+ let active = true;
38
+ AccountService.listAccounts('oracle').then((loadedAccounts) => active && setAccounts(loadedAccounts));
39
+ return () => {
40
+ active = false;
41
+ };
42
+ }, []);
43
+
44
+ return (
45
+ <div className="form-horizontal">
46
+ {!pipeline.strategy && (
47
+ <AccountRegionClusterSelector
48
+ accounts={accounts}
49
+ application={application}
50
+ component={stage}
51
+ onComponentUpdate={stageFieldUpdated}
52
+ />
53
+ )}
54
+ <StageConfigField label="Target">
55
+ <TargetSelect
56
+ model={{ target: stage.target }}
57
+ onChange={(target: string) => updateStageField({ target })}
58
+ options={StageConstants.TARGET_LIST}
59
+ />
60
+ </StageConfigField>
61
+ </div>
62
+ );
63
+ }
64
+
65
+ export const oracleDestroyAsgStage = {
66
+ key: 'destroyServerGroup',
67
+ provides: 'destroyServerGroup',
68
+ cloudProvider: 'oracle',
69
+ component: OracleDestroyAsgStageConfig,
70
+ validators: [
71
+ {
72
+ type: 'targetImpedance',
73
+ message:
74
+ 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',
75
+ },
76
+ { type: 'requiredField', fieldName: 'cluster' },
77
+ { type: 'requiredField', fieldName: 'target' },
78
+ { type: 'requiredField', fieldName: 'regions' },
79
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
80
+ ],
81
+ };
82
+
83
+ export function registerOracleDestroyAsgStage() {
84
+ Registry.pipeline.registerStage(oracleDestroyAsgStage);
85
+ }
86
+
87
+ registerOracleDestroyAsgStage();
@@ -0,0 +1,105 @@
1
+ import React, { useEffect, useState } from 'react';
2
+
3
+ import type { IAccount, IStageConfigProps } from '@spinnaker/core';
4
+ import {
5
+ AccountRegionClusterSelector,
6
+ AccountService,
7
+ PlatformHealthOverride,
8
+ Registry,
9
+ StageConfigField,
10
+ StageConstants,
11
+ TargetSelect,
12
+ } from '@spinnaker/core';
13
+
14
+ export function OracleDisableAsgStageConfig(props: IStageConfigProps) {
15
+ const { application, pipeline, stage, stageFieldUpdated, updateStageField } = props;
16
+ const [accounts, setAccounts] = useState<IAccount[]>([]);
17
+
18
+ useEffect(() => {
19
+ const changes: Record<string, any> = {};
20
+ if (stage.cloudProvider !== 'oracle') {
21
+ changes.cloudProvider = 'oracle';
22
+ }
23
+ if (!stage.credentials && application.defaultCredentials?.oracle) {
24
+ changes.credentials = application.defaultCredentials.oracle;
25
+ }
26
+ if (!stage.regions?.length && application.defaultRegions?.oracle) {
27
+ changes.regions = [application.defaultRegions.oracle];
28
+ }
29
+ if (!stage.target) {
30
+ changes.target = StageConstants.TARGET_LIST[0].val;
31
+ }
32
+ if (
33
+ stage.isNew &&
34
+ application.attributes.platformHealthOnlyShowOverride &&
35
+ application.attributes.platformHealthOnly &&
36
+ stage.interestingHealthProviderNames === undefined
37
+ ) {
38
+ changes.interestingHealthProviderNames = ['Oracle'];
39
+ }
40
+ if (Object.keys(changes).length) {
41
+ updateStageField(changes);
42
+ }
43
+ }, []);
44
+
45
+ useEffect(() => {
46
+ let active = true;
47
+ AccountService.listAccounts('oracle').then((loadedAccounts) => active && setAccounts(loadedAccounts));
48
+ return () => {
49
+ active = false;
50
+ };
51
+ }, []);
52
+
53
+ return (
54
+ <div className="form-horizontal">
55
+ {!pipeline.strategy && (
56
+ <AccountRegionClusterSelector
57
+ accounts={accounts}
58
+ application={application}
59
+ component={stage}
60
+ onComponentUpdate={stageFieldUpdated}
61
+ />
62
+ )}
63
+ <StageConfigField label="Target">
64
+ <TargetSelect
65
+ model={{ target: stage.target }}
66
+ onChange={(target: string) => updateStageField({ target })}
67
+ options={StageConstants.TARGET_LIST}
68
+ />
69
+ </StageConfigField>
70
+ {application.attributes.platformHealthOnlyShowOverride && (
71
+ <StageConfigField label="Task Completion">
72
+ <PlatformHealthOverride
73
+ interestingHealthProviderNames={stage.interestingHealthProviderNames || []}
74
+ onChange={(interestingHealthProviderNames) => updateStageField({ interestingHealthProviderNames })}
75
+ platformHealthType="Oracle"
76
+ />
77
+ </StageConfigField>
78
+ )}
79
+ </div>
80
+ );
81
+ }
82
+
83
+ export const oracleDisableAsgStage = {
84
+ key: 'disableServerGroup',
85
+ provides: 'disableServerGroup',
86
+ cloudProvider: 'oracle',
87
+ component: OracleDisableAsgStageConfig,
88
+ validators: [
89
+ {
90
+ type: 'targetImpedance',
91
+ message:
92
+ 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',
93
+ },
94
+ { type: 'requiredField', fieldName: 'cluster' },
95
+ { type: 'requiredField', fieldName: 'target' },
96
+ { type: 'requiredField', fieldName: 'regions' },
97
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
98
+ ],
99
+ };
100
+
101
+ export function registerOracleDisableAsgStage() {
102
+ Registry.pipeline.registerStage(oracleDisableAsgStage);
103
+ }
104
+
105
+ registerOracleDisableAsgStage();