@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,103 @@
1
+ import React, { useEffect, useState } from 'react';
2
+
3
+ import type { IAccount, IStageConfigProps } from '@spinnaker/core';
4
+ import { AccountRegionClusterSelector, AccountService, Registry, StageConfigField } from '@spinnaker/core';
5
+
6
+ const selectionStrategies = [
7
+ {
8
+ label: 'Largest',
9
+ val: 'LARGEST',
10
+ description: 'When multiple server groups exist, prefer the server group with the most instances',
11
+ },
12
+ { label: 'Newest', val: 'NEWEST', description: 'When multiple server groups exist, prefer the newest' },
13
+ { label: 'Oldest', val: 'OLDEST', description: 'When multiple server groups exist, prefer the oldest' },
14
+ { label: 'Fail', val: 'FAIL', description: 'When multiple server groups exist, fail' },
15
+ ];
16
+
17
+ export function OracleFindAmiStageConfig(props: IStageConfigProps) {
18
+ const { application, stage, stageFieldUpdated, updateStageField } = props;
19
+ const [accounts, setAccounts] = useState<IAccount[]>([]);
20
+
21
+ useEffect(() => {
22
+ const changes: Record<string, any> = {};
23
+ if (stage.cloudProvider !== 'oracle') {
24
+ changes.cloudProvider = 'oracle';
25
+ }
26
+ if (!stage.credentials && application.defaultCredentials?.oracle) {
27
+ changes.credentials = application.defaultCredentials.oracle;
28
+ }
29
+ if (!stage.regions?.length && application.defaultRegions?.oracle) {
30
+ changes.regions = [application.defaultRegions.oracle];
31
+ }
32
+ if (!stage.selectionStrategy) {
33
+ changes.selectionStrategy = selectionStrategies[0].val;
34
+ }
35
+ if (stage.onlyEnabled === undefined) {
36
+ changes.onlyEnabled = true;
37
+ }
38
+ if (Object.keys(changes).length) {
39
+ updateStageField(changes);
40
+ }
41
+ }, []);
42
+
43
+ useEffect(() => {
44
+ let active = true;
45
+ AccountService.listAccounts('oracle').then((loadedAccounts) => active && setAccounts(loadedAccounts));
46
+ return () => {
47
+ active = false;
48
+ };
49
+ }, []);
50
+
51
+ return (
52
+ <div className="form-horizontal">
53
+ <AccountRegionClusterSelector
54
+ accounts={accounts}
55
+ application={application}
56
+ component={stage}
57
+ onComponentUpdate={stageFieldUpdated}
58
+ />
59
+ <StageConfigField label="Server Group Selection">
60
+ <select
61
+ className="form-control input-sm"
62
+ onChange={(event) => updateStageField({ selectionStrategy: event.target.value })}
63
+ value={stage.selectionStrategy || selectionStrategies[0].val}
64
+ >
65
+ {selectionStrategies.map((strategy) => (
66
+ <option key={strategy.val} title={strategy.description} value={strategy.val}>
67
+ {strategy.label}
68
+ </option>
69
+ ))}
70
+ </select>
71
+ </StageConfigField>
72
+ <StageConfigField label="Server Group Filters">
73
+ <label className="checkbox-inline">
74
+ <input
75
+ checked={stage.onlyEnabled !== false}
76
+ onChange={(event) => updateStageField({ onlyEnabled: event.target.checked })}
77
+ type="checkbox"
78
+ />
79
+ Only consider enabled Server Groups
80
+ </label>
81
+ </StageConfigField>
82
+ </div>
83
+ );
84
+ }
85
+
86
+ export const oracleFindAmiStage = {
87
+ key: 'findImage',
88
+ provides: 'findImage',
89
+ cloudProvider: 'oracle',
90
+ component: OracleFindAmiStageConfig,
91
+ validators: [
92
+ { type: 'requiredField', fieldName: 'cluster' },
93
+ { type: 'requiredField', fieldName: 'selectionStrategy', fieldLabel: 'Server Group Selection' },
94
+ { type: 'requiredField', fieldName: 'regions' },
95
+ { type: 'requiredField', fieldName: 'credentials' },
96
+ ],
97
+ };
98
+
99
+ export function registerOracleFindAmiStage() {
100
+ Registry.pipeline.registerStage(oracleFindAmiStage);
101
+ }
102
+
103
+ registerOracleFindAmiStage();
@@ -0,0 +1,90 @@
1
+ import React, { useEffect, useState } from 'react';
2
+
3
+ import type { IStageConfigProps } from '@spinnaker/core';
4
+ import {
5
+ BakeryReader,
6
+ ChecklistInput,
7
+ ExecutionDetailsTasks,
8
+ MapEditor,
9
+ Registry,
10
+ StageConfigField,
11
+ } from '@spinnaker/core';
12
+
13
+ export function OracleFindImageFromTagsStageConfig({ pipeline, stage, updateStageField }: IStageConfigProps) {
14
+ const [regions, setRegions] = useState<string[]>([]);
15
+
16
+ useEffect(() => {
17
+ const changes: Record<string, any> = {};
18
+ if (stage.cloudProvider !== 'oracle') {
19
+ changes.cloudProvider = 'oracle';
20
+ }
21
+ if (!stage.packageName) {
22
+ changes.packageName = '*';
23
+ }
24
+ if (!stage.tags) {
25
+ changes.tags = {};
26
+ }
27
+ if (!stage.regions) {
28
+ changes.regions = [];
29
+ }
30
+ if (Object.keys(changes).length) {
31
+ updateStageField(changes);
32
+ }
33
+ }, []);
34
+
35
+ useEffect(() => {
36
+ let active = true;
37
+ BakeryReader.getRegions('oracle').then((loadedRegions) => active && setRegions(loadedRegions));
38
+ return () => {
39
+ active = false;
40
+ };
41
+ }, []);
42
+
43
+ return (
44
+ <div className="form-horizontal">
45
+ <StageConfigField label="Regions">
46
+ <ChecklistInput
47
+ inline={true}
48
+ name="regions"
49
+ onChange={(event: any) => updateStageField({ regions: event.target.value })}
50
+ showSelectAll={true}
51
+ stringOptions={regions}
52
+ value={stage.regions || []}
53
+ />
54
+ </StageConfigField>
55
+ <StageConfigField label="Pattern">
56
+ <input
57
+ className="form-control input-sm"
58
+ onChange={(event) => updateStageField({ packageName: event.target.value })}
59
+ value={stage.packageName || ''}
60
+ />
61
+ </StageConfigField>
62
+ <StageConfigField label="Tags">
63
+ <MapEditor
64
+ allowEmpty={true}
65
+ model={stage.tags || {}}
66
+ onChange={(tags) => updateStageField({ tags })}
67
+ pipeline={pipeline}
68
+ />
69
+ </StageConfigField>
70
+ </div>
71
+ );
72
+ }
73
+
74
+ export const oracleFindImageFromTagsStage = {
75
+ key: 'findImageFromTags',
76
+ provides: 'findImageFromTags',
77
+ cloudProvider: 'oracle',
78
+ component: OracleFindImageFromTagsStageConfig,
79
+ executionDetailsSections: [ExecutionDetailsTasks],
80
+ validators: [
81
+ { type: 'requiredField', fieldName: 'regions' },
82
+ { type: 'requiredField', fieldName: 'packageName' },
83
+ ],
84
+ };
85
+
86
+ export function registerOracleFindImageFromTagsStage() {
87
+ Registry.pipeline.registerStage(oracleFindImageFromTagsStage);
88
+ }
89
+
90
+ registerOracleFindImageFromTagsStage();
@@ -0,0 +1,225 @@
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
+ const scaleActions = [
15
+ { label: 'Scale Up', val: 'scale_up' },
16
+ { label: 'Scale Down', val: 'scale_down' },
17
+ { label: 'Scale to Cluster Size', val: 'scale_to_cluster' },
18
+ { label: 'Scale to Exact Size', val: 'scale_exact' },
19
+ ];
20
+
21
+ const resizeTypes = [
22
+ { label: 'Percentage', val: 'pct' },
23
+ { label: 'Incremental', val: 'incr' },
24
+ ];
25
+
26
+ export function OracleResizeAsgStageConfig(props: IStageConfigProps) {
27
+ const { application, pipeline, stage, stageFieldUpdated, updateStageField } = props;
28
+ const [accounts, setAccounts] = useState<IAccount[]>([]);
29
+
30
+ useEffect(() => {
31
+ const changes: Record<string, any> = {};
32
+ if (stage.cloudProvider !== 'oracle') {
33
+ changes.cloudProvider = 'oracle';
34
+ changes.cloudProviderType = 'oracle';
35
+ }
36
+ if (!stage.credentials && application.defaultCredentials?.oracle) {
37
+ changes.credentials = application.defaultCredentials.oracle;
38
+ }
39
+ if (!stage.regions?.length && application.defaultRegions?.oracle) {
40
+ changes.regions = [application.defaultRegions.oracle];
41
+ }
42
+ if (!stage.target) {
43
+ changes.target = StageConstants.TARGET_LIST[0].val;
44
+ }
45
+ if (!stage.action) {
46
+ changes.action = stage.resizeType === 'exact' ? 'scale_exact' : scaleActions[0].val;
47
+ }
48
+ if (!stage.resizeType) {
49
+ changes.resizeType = resizeTypes[0].val;
50
+ }
51
+ if (!stage.capacity) {
52
+ changes.capacity = {};
53
+ }
54
+ if (Object.keys(changes).length) {
55
+ updateStageField(changes);
56
+ }
57
+ }, []);
58
+
59
+ useEffect(() => {
60
+ let active = true;
61
+ AccountService.listAccounts('oracle').then((loadedAccounts) => active && setAccounts(loadedAccounts));
62
+ return () => {
63
+ active = false;
64
+ };
65
+ }, []);
66
+
67
+ const updateResizeType = (action: string, resizeType = stage.resizeType || resizeTypes[0].val) => {
68
+ if (action === 'scale_exact') {
69
+ updateStageField({ action, resizeType: 'exact', scaleNum: undefined, scalePct: undefined });
70
+ return;
71
+ }
72
+ const nextResizeType = resizeType === 'incr' ? 'incr' : 'pct';
73
+ const changes: Record<string, any> = { action, capacity: {}, resizeType: nextResizeType };
74
+ if (nextResizeType === 'pct') {
75
+ changes.scaleNum = undefined;
76
+ } else {
77
+ changes.scalePct = undefined;
78
+ changes.scaleNum = stage.scaleNum || 0;
79
+ }
80
+ updateStageField(changes);
81
+ };
82
+
83
+ return (
84
+ <div className="form-horizontal">
85
+ {!pipeline.strategy && (
86
+ <AccountRegionClusterSelector
87
+ accounts={accounts}
88
+ application={application}
89
+ component={stage}
90
+ onComponentUpdate={stageFieldUpdated}
91
+ />
92
+ )}
93
+ <StageConfigField label="Target">
94
+ <TargetSelect
95
+ model={{ target: stage.target }}
96
+ onChange={(target: string) => updateStageField({ target })}
97
+ options={StageConstants.TARGET_LIST}
98
+ />
99
+ </StageConfigField>
100
+ <StageConfigField label="Action" helpKey="pipeline.config.resizeAsg.action">
101
+ <select
102
+ className="form-control input-sm"
103
+ onChange={(event) => updateResizeType(event.target.value)}
104
+ value={stage.action || scaleActions[0].val}
105
+ >
106
+ {scaleActions.map((action) => (
107
+ <option key={action.val} value={action.val}>
108
+ {action.label}
109
+ </option>
110
+ ))}
111
+ </select>
112
+ </StageConfigField>
113
+ {stage.action !== 'scale_exact' && (
114
+ <>
115
+ <StageConfigField label={stage.action === 'scale_to_cluster' ? 'Additional Capacity' : 'Type'}>
116
+ <select
117
+ className="form-control input-sm"
118
+ onChange={(event) => updateResizeType(stage.action, event.target.value)}
119
+ value={stage.resizeType || resizeTypes[0].val}
120
+ >
121
+ {resizeTypes.map((type) => (
122
+ <option key={type.val} value={type.val}>
123
+ {type.label}
124
+ </option>
125
+ ))}
126
+ </select>
127
+ </StageConfigField>
128
+ {stage.resizeType === 'pct' && (
129
+ <StageConfigField label="Resize Percentage">
130
+ <input
131
+ className="form-control input-sm"
132
+ min={0}
133
+ onChange={(event) => updateStageField({ scalePct: Number(event.target.value) })}
134
+ type="number"
135
+ value={stage.scalePct ?? ''}
136
+ />
137
+ <div>
138
+ <em className="subinput-note">
139
+ This is the percentage by which the target server group's capacity will be increased
140
+ </em>
141
+ </div>
142
+ </StageConfigField>
143
+ )}
144
+ {stage.resizeType === 'incr' && (
145
+ <StageConfigField label="Resize-by Amount">
146
+ <input
147
+ className="form-control input-sm"
148
+ min={0}
149
+ onChange={(event) => updateStageField({ scaleNum: Number(event.target.value) })}
150
+ type="number"
151
+ value={stage.scaleNum ?? ''}
152
+ />
153
+ <div>
154
+ <em className="subinput-note">
155
+ This is the exact amount by which the target server group's capacity will be increased
156
+ </em>
157
+ </div>
158
+ </StageConfigField>
159
+ )}
160
+ </>
161
+ )}
162
+ {stage.action === 'scale_exact' && (
163
+ <>
164
+ <StageConfigField label="">
165
+ <div className="row small">
166
+ <div className="col-md-3">Min</div>
167
+ <div className="col-md-3">Max</div>
168
+ <div className="col-md-3">Desired</div>
169
+ </div>
170
+ </StageConfigField>
171
+ <StageConfigField label="Match Capacity">
172
+ <div className="row">
173
+ {(['min', 'max', 'desired'] as const).map((field) => (
174
+ <div className="col-md-3" key={field}>
175
+ <input
176
+ className="form-control input-sm"
177
+ onChange={(event) =>
178
+ updateStageField({ capacity: { ...stage.capacity, [field]: Number(event.target.value) } })
179
+ }
180
+ type="number"
181
+ value={stage.capacity?.[field] ?? ''}
182
+ />
183
+ </div>
184
+ ))}
185
+ </div>
186
+ </StageConfigField>
187
+ </>
188
+ )}
189
+ {application.attributes.platformHealthOnlyShowOverride && (
190
+ <StageConfigField label="Task Completion">
191
+ <PlatformHealthOverride
192
+ interestingHealthProviderNames={stage.interestingHealthProviderNames || []}
193
+ onChange={(interestingHealthProviderNames) => updateStageField({ interestingHealthProviderNames })}
194
+ platformHealthType="Oracle"
195
+ />
196
+ </StageConfigField>
197
+ )}
198
+ </div>
199
+ );
200
+ }
201
+
202
+ export const oracleResizeAsgStage = {
203
+ key: 'resizeServerGroup',
204
+ provides: 'resizeServerGroup',
205
+ cloudProvider: 'oracle',
206
+ component: OracleResizeAsgStageConfig,
207
+ validators: [
208
+ {
209
+ type: 'targetImpedance',
210
+ message:
211
+ 'This pipeline will attempt to resize a server group without deploying a new version into the same cluster.',
212
+ },
213
+ { type: 'requiredField', fieldName: 'cluster' },
214
+ { type: 'requiredField', fieldName: 'target' },
215
+ { type: 'requiredField', fieldName: 'action' },
216
+ { type: 'requiredField', fieldName: 'regions' },
217
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
218
+ ],
219
+ };
220
+
221
+ export function registerOracleResizeAsgStage() {
222
+ Registry.pipeline.registerStage(oracleResizeAsgStage);
223
+ }
224
+
225
+ registerOracleResizeAsgStage();
@@ -0,0 +1,122 @@
1
+ import React, { useEffect, useState } from 'react';
2
+
3
+ import type { IAccount, IStageConfigProps } from '@spinnaker/core';
4
+ import { AccountRegionClusterSelector, AccountService, Registry, StageConfigField } from '@spinnaker/core';
5
+
6
+ function pluralize(str: string, val: number): string {
7
+ return val === 1 ? str : `${str}s`;
8
+ }
9
+
10
+ export function OracleScaleDownClusterStageConfig(props: IStageConfigProps) {
11
+ const { application, pipeline, stage, stageFieldUpdated, updateStageField } = props;
12
+ const [accounts, setAccounts] = useState<IAccount[]>([]);
13
+
14
+ useEffect(() => {
15
+ const changes: Record<string, any> = {};
16
+ if (stage.cloudProvider !== 'oracle') {
17
+ changes.cloudProvider = 'oracle';
18
+ }
19
+ if (!stage.credentials && application.defaultCredentials?.oracle) {
20
+ changes.credentials = application.defaultCredentials.oracle;
21
+ }
22
+ if (!stage.regions?.length && application.defaultRegions?.oracle) {
23
+ changes.regions = [application.defaultRegions.oracle];
24
+ }
25
+ if (stage.remainingFullSizeServerGroups === undefined) {
26
+ changes.remainingFullSizeServerGroups = 1;
27
+ }
28
+ if (stage.allowScaleDownActive === undefined) {
29
+ changes.allowScaleDownActive = false;
30
+ }
31
+ if (stage.preferLargerOverNewer === undefined) {
32
+ changes.preferLargerOverNewer = 'false';
33
+ }
34
+ if (Object.keys(changes).length) {
35
+ updateStageField(changes);
36
+ }
37
+ }, []);
38
+
39
+ useEffect(() => {
40
+ let active = true;
41
+ AccountService.listAccounts('oracle').then((loadedAccounts) => active && setAccounts(loadedAccounts));
42
+ return () => {
43
+ active = false;
44
+ };
45
+ }, []);
46
+
47
+ return (
48
+ <div className="form-horizontal">
49
+ {!pipeline.strategy && (
50
+ <AccountRegionClusterSelector
51
+ accounts={accounts}
52
+ application={application}
53
+ component={stage}
54
+ onComponentUpdate={stageFieldUpdated}
55
+ />
56
+ )}
57
+ <StageConfigField label="Scale Down Options">
58
+ <div className="form-inline">
59
+ <p>
60
+ Keep the{' '}
61
+ <input
62
+ className="form-control input-sm"
63
+ min={0}
64
+ onChange={(event) => updateStageField({ remainingFullSizeServerGroups: Number(event.target.value) })}
65
+ required
66
+ style={{ width: 50 }}
67
+ type="number"
68
+ value={stage.remainingFullSizeServerGroups ?? ''}
69
+ />{' '}
70
+ <select
71
+ className="form-control input-sm"
72
+ onChange={(event) => updateStageField({ preferLargerOverNewer: event.target.value })}
73
+ style={{ width: 100 }}
74
+ value={stage.preferLargerOverNewer ?? 'false'}
75
+ >
76
+ <option value="true">largest</option>
77
+ <option value="false">newest</option>
78
+ </select>{' '}
79
+ {pluralize('server group', stage.remainingFullSizeServerGroups)} at current size.
80
+ </p>
81
+ <p>The remaining server groups will be scaled down to zero instances.</p>
82
+ </div>
83
+ </StageConfigField>
84
+ <div className="form-group">
85
+ <div className="col-md-offset-3 col-md-6 checkbox">
86
+ <label>
87
+ <input
88
+ checked={!!stage.allowScaleDownActive}
89
+ onChange={(event) => updateStageField({ allowScaleDownActive: event.target.checked })}
90
+ type="checkbox"
91
+ />
92
+ Allow scale down of active server groups
93
+ </label>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ );
98
+ }
99
+
100
+ export const oracleScaleDownClusterStage = {
101
+ key: 'scaleDownCluster',
102
+ provides: 'scaleDownCluster',
103
+ cloudProvider: 'oracle',
104
+ component: OracleScaleDownClusterStageConfig,
105
+ validators: [
106
+ { type: 'requiredField', fieldName: 'cluster' },
107
+ {
108
+ type: 'requiredField',
109
+ fieldName: 'remainingFullSizeServerGroups',
110
+ fieldLabel: 'Keep [X] full size Server Groups',
111
+ },
112
+ { type: 'requiredField', fieldName: 'regions' },
113
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
114
+ ],
115
+ strategy: true,
116
+ };
117
+
118
+ export function registerOracleScaleDownClusterStage() {
119
+ Registry.pipeline.registerStage(oracleScaleDownClusterStage);
120
+ }
121
+
122
+ registerOracleScaleDownClusterStage();
@@ -0,0 +1,136 @@
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
+ } from '@spinnaker/core';
11
+
12
+ function pluralize(str: string, val: number): string {
13
+ return val === 1 ? str : `${str}s`;
14
+ }
15
+
16
+ export function OracleShrinkClusterStageConfig(props: IStageConfigProps) {
17
+ const { application, pipeline, stage, stageFieldUpdated, updateStageField } = props;
18
+ const [accounts, setAccounts] = useState<IAccount[]>([]);
19
+
20
+ useEffect(() => {
21
+ const changes: Record<string, any> = {};
22
+ if (stage.cloudProvider !== 'oracle') {
23
+ changes.cloudProvider = 'oracle';
24
+ }
25
+ if (!stage.credentials && application.defaultCredentials?.oracle) {
26
+ changes.credentials = application.defaultCredentials.oracle;
27
+ }
28
+ if (!stage.regions?.length && application.defaultRegions?.oracle) {
29
+ changes.regions = [application.defaultRegions.oracle];
30
+ }
31
+ if (stage.shrinkToSize === undefined) {
32
+ changes.shrinkToSize = 1;
33
+ }
34
+ if (stage.allowDeleteActive === undefined) {
35
+ changes.allowDeleteActive = false;
36
+ }
37
+ if (stage.retainLargerOverNewer === undefined) {
38
+ changes.retainLargerOverNewer = 'false';
39
+ }
40
+ if (
41
+ stage.isNew &&
42
+ application.attributes.platformHealthOnlyShowOverride &&
43
+ application.attributes.platformHealthOnly &&
44
+ stage.interestingHealthProviderNames === undefined
45
+ ) {
46
+ changes.interestingHealthProviderNames = ['Oracle'];
47
+ }
48
+ if (Object.keys(changes).length) {
49
+ updateStageField(changes);
50
+ }
51
+ }, []);
52
+
53
+ useEffect(() => {
54
+ let active = true;
55
+ AccountService.listAccounts('oracle').then((loadedAccounts) => active && setAccounts(loadedAccounts));
56
+ return () => {
57
+ active = false;
58
+ };
59
+ }, []);
60
+
61
+ return (
62
+ <div className="form-horizontal">
63
+ {!pipeline.strategy && (
64
+ <AccountRegionClusterSelector
65
+ accounts={accounts}
66
+ application={application}
67
+ component={stage}
68
+ onComponentUpdate={stageFieldUpdated}
69
+ />
70
+ )}
71
+ <StageConfigField label="Shrink Options">
72
+ <div className="form-inline">
73
+ Shrink to{' '}
74
+ <input
75
+ className="form-control input-sm"
76
+ min={0}
77
+ onChange={(event) => updateStageField({ shrinkToSize: Number(event.target.value) })}
78
+ required
79
+ style={{ width: 50 }}
80
+ type="number"
81
+ value={stage.shrinkToSize ?? ''}
82
+ />{' '}
83
+ {pluralize('server group', stage.shrinkToSize)}, keeping the{' '}
84
+ <select
85
+ className="form-control input-sm"
86
+ onChange={(event) => updateStageField({ retainLargerOverNewer: event.target.value })}
87
+ value={stage.retainLargerOverNewer ?? 'false'}
88
+ >
89
+ <option value="true">largest</option>
90
+ <option value="false">newest</option>
91
+ </select>
92
+ </div>
93
+ </StageConfigField>
94
+ <div className="form-group">
95
+ <div className="col-md-offset-3 col-md-6 checkbox">
96
+ <label>
97
+ <input
98
+ checked={!!stage.allowDeleteActive}
99
+ onChange={(event) => updateStageField({ allowDeleteActive: event.target.checked })}
100
+ type="checkbox"
101
+ />
102
+ Allow deletion of active server groups
103
+ </label>
104
+ </div>
105
+ </div>
106
+ {application.attributes.platformHealthOnlyShowOverride && (
107
+ <StageConfigField label="Task Completion">
108
+ <PlatformHealthOverride
109
+ interestingHealthProviderNames={stage.interestingHealthProviderNames || []}
110
+ onChange={(interestingHealthProviderNames) => updateStageField({ interestingHealthProviderNames })}
111
+ platformHealthType="Oracle"
112
+ />
113
+ </StageConfigField>
114
+ )}
115
+ </div>
116
+ );
117
+ }
118
+
119
+ export const oracleShrinkClusterStage = {
120
+ key: 'shrinkCluster',
121
+ provides: 'shrinkCluster',
122
+ cloudProvider: 'oracle',
123
+ component: OracleShrinkClusterStageConfig,
124
+ validators: [
125
+ { type: 'requiredField', fieldName: 'cluster' },
126
+ { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },
127
+ { type: 'requiredField', fieldName: 'regions' },
128
+ { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },
129
+ ],
130
+ };
131
+
132
+ export function registerOracleShrinkClusterStage() {
133
+ Registry.pipeline.registerStage(oracleShrinkClusterStage);
134
+ }
135
+
136
+ registerOracleShrinkClusterStage();
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { CollapsibleSection } from '@spinnaker/core';
3
+
4
+ export function OracleSecurityGroupDetails({ resolvedSecurityGroup }: any) {
5
+ return (
6
+ <CollapsibleSection heading="Security Group Details" defaultExpanded={true}>
7
+ <dl className="dl-horizontal dl-narrow">
8
+ <dt>Name</dt>
9
+ <dd>{resolvedSecurityGroup.name}</dd>
10
+ <dt>Account</dt>
11
+ <dd>{resolvedSecurityGroup.accountId}</dd>
12
+ <dt>Region</dt>
13
+ <dd>{resolvedSecurityGroup.region}</dd>
14
+ <dt>VCN</dt>
15
+ <dd>{resolvedSecurityGroup.vpcId}</dd>
16
+ </dl>
17
+ </CollapsibleSection>
18
+ );
19
+ }