Skip to content

Commit a31ce1c

Browse files
authored
feat(codecatalyst): replace 'cawsStage' dev setting with granular api override setting (#4010)
* feat(codecatalyst): replace 'cawsStage' dev setting with granular api override setting * fix(codecatalyst): typo in docs and noisy settings access logging * refactor(codecatalyst): move dev settings service config logic to DevSettings
1 parent f85e6fe commit a31ce1c

File tree

4 files changed

+92
-22
lines changed

4 files changed

+92
-22
lines changed

CONTRIBUTING.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,19 @@ Example:
299299
}
300300
```
301301

302+
Overrides specifically for CodeCatalyst can be set using the `aws.dev.codecatalystService` setting. This is a JSON object consisting of keys/values required to override API calls to CodeCatalyst: `region`, `endpoint`, `hostname`, and `gitHostname`. If this setting is present, then all keys need to be explicitly provided.
303+
304+
Example:
305+
306+
```json
307+
"aws.dev.codecatalystService": {
308+
"region": "us-west-2",
309+
"endpoint": "https://public.codecatalyst-gamma.global.api.aws",
310+
"hostname": "integ.stage.REMOVE.codes",
311+
"gitHostname": "git.gamma.source.caws.REMOVE",
312+
}
313+
```
314+
302315
### SAM/CFN ("goformation") JSON schema
303316

304317
See [docs/cfn-schema-support.md](./docs/cfn-schema-support.md) for how to fix

src/shared/clients/codecatalystClient.ts

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { showMessageWithCancel } from '../utilities/messages'
1818
import { assertHasProps, ClassToInterfaceType, isNonNullable, RequiredProps } from '../utilities/tsUtils'
1919
import { AsyncCollection, toCollection } from '../utilities/asyncCollection'
2020
import { joinAll, pageableToCollection } from '../utilities/collectionUtils'
21-
import { DevSettings } from '../settings'
2221
import { CodeCatalyst } from 'aws-sdk'
2322
import { ToolkitError } from '../errors'
2423
import { TokenProvider } from '../../auth/sso/sdkV2Compat'
@@ -30,32 +29,24 @@ import {
3029
} from 'aws-sdk/clients/codecatalyst'
3130
import { truncateProps } from '../utilities/textUtilities'
3231
import { SsoConnection } from '../../auth/connection'
32+
import { DevSettings } from '../settings'
3333

34-
interface CodeCatalystConfig {
34+
export interface CodeCatalystConfig {
3535
readonly region: string
3636
readonly endpoint: string
3737
readonly hostname: string
3838
readonly gitHostname: string
3939
}
4040

41+
export const defaultServiceConfig: CodeCatalystConfig = {
42+
region: 'us-east-1',
43+
endpoint: 'https://public.codecatalyst.global.api.aws',
44+
hostname: 'codecatalyst.aws',
45+
gitHostname: 'codecatalyst.aws',
46+
}
47+
4148
export function getCodeCatalystConfig(): CodeCatalystConfig {
42-
const stage = DevSettings.instance.get('cawsStage', 'prod')
43-
44-
if (stage === 'gamma') {
45-
return {
46-
region: 'us-west-2',
47-
endpoint: 'https://public.codecatalyst-gamma.global.api.aws',
48-
hostname: 'integ.stage.REMOVED.codes',
49-
gitHostname: 'git.gamma.source.caws.REMOVED',
50-
}
51-
} else {
52-
return {
53-
region: 'us-east-1',
54-
endpoint: 'https://public.codecatalyst.global.api.aws',
55-
hostname: 'codecatalyst.aws',
56-
gitHostname: 'codecatalyst.aws',
57-
}
58-
}
49+
return DevSettings.instance.getCodeCatalystConfig(defaultServiceConfig)
5950
}
6051

6152
export interface DevEnvironment extends CodeCatalyst.DevEnvironmentSummary {

src/shared/settings.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55

66
import * as vscode from 'vscode'
77
import * as packageJson from '../../package.json'
8+
import * as codecatalyst from './clients/codecatalystClient'
89
import { getLogger } from './logger'
910
import { cast, FromDescriptor, Record, TypeConstructor, TypeDescriptor } from './utilities/typeConstructors'
10-
import { ClassToInterfaceType, keys } from './utilities/tsUtils'
11+
import { assertHasProps, ClassToInterfaceType, keys } from './utilities/tsUtils'
1112
import { toRecord } from './utilities/collectionUtils'
1213
import { isNameMangled } from './vscode/env'
13-
import { once } from './utilities/functionUtils'
14+
import { once, onceChanged } from './utilities/functionUtils'
1415
import { ToolkitError } from './errors'
1516

1617
type Workspace = Pick<typeof vscode.workspace, 'getConfiguration' | 'onDidChangeConfiguration'>
@@ -648,7 +649,7 @@ const devSettings = {
648649
telemetryUserPool: String,
649650
renderDebugDetails: Boolean,
650651
endpoints: Record(String, String),
651-
cawsStage: String,
652+
codecatalystService: Record(String, String),
652653
ssoCacheDirectory: String,
653654
}
654655
type ResolvedDevSettings = FromDescriptor<typeof devSettings>
@@ -708,6 +709,28 @@ export class DevSettings extends Settings.define('aws.dev', devSettings) {
708709
return Object.keys(this.activeSettings).length > 0
709710
}
710711

712+
public getCodeCatalystConfig(
713+
defaultConfig: codecatalyst.CodeCatalystConfig
714+
): Readonly<codecatalyst.CodeCatalystConfig> {
715+
const devSetting = 'codecatalystService'
716+
const devConfig = this.get(devSetting, {})
717+
718+
if (Object.keys(devConfig).length === 0) {
719+
this.logCodeCatalystConfigOnce('default')
720+
return defaultConfig
721+
}
722+
723+
try {
724+
// The configuration in dev settings should explicitly override the entire default configuration.
725+
assertHasProps(devConfig, ...Object.keys(defaultConfig))
726+
} catch (err) {
727+
throw ToolkitError.chain(err, `Dev setting '${devSetting}' has missing or invalid properties.`)
728+
}
729+
730+
this.logCodeCatalystConfigOnce(JSON.stringify(devConfig, undefined, 4))
731+
return devConfig as unknown as codecatalyst.CodeCatalystConfig
732+
}
733+
711734
public override get<K extends AwsDevSetting>(key: K, defaultValue: ResolvedDevSettings[K]) {
712735
if (!this.isSet(key)) {
713736
this.unset(key)
@@ -735,6 +758,10 @@ export class DevSettings extends Settings.define('aws.dev', devSettings) {
735758
}
736759
}
737760

761+
private logCodeCatalystConfigOnce = onceChanged(val => {
762+
getLogger().info(`using CodeCatalyst service configuration: ${val}`)
763+
})
764+
738765
static #instance: DevSettings
739766

740767
public static get instance() {

src/test/shared/settingsConfiguration.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { DevSettings, Experiments, fromExtensionManifest, PromptSettings, Settin
99
import { TestSettings } from '../utilities/testSettingsConfiguration'
1010
import { ClassToInterfaceType } from '../../shared/utilities/tsUtils'
1111
import { Optional } from '../../shared/utilities/typeConstructors'
12+
import { ToolkitError } from '../../shared/errors'
1213

1314
const settingsTarget = vscode.ConfigurationTarget.Workspace
1415

@@ -281,6 +282,44 @@ describe('DevSetting', function () {
281282
assert.strictEqual(sut.isDevMode(), false)
282283
})
283284
})
285+
286+
describe('getCodeCatalystConfig()', function () {
287+
const devSettingName = 'aws.dev.codecatalystService'
288+
const defaultConfig = {
289+
region: 'default',
290+
endpoint: 'default',
291+
hostname: 'default',
292+
gitHostname: 'default',
293+
}
294+
295+
it('throws an error for incomplete dev configuration', async function () {
296+
const testSetting = {
297+
// missing region
298+
endpoint: 'test_endpoint',
299+
hostname: 'test_hostname',
300+
gitHostname: 'test_githostname',
301+
}
302+
303+
await settings.update(devSettingName, testSetting)
304+
assert.throws(() => sut.getCodeCatalystConfig(defaultConfig), ToolkitError)
305+
})
306+
307+
it('returns dev settings configuration when provided', async function () {
308+
const testSetting = {
309+
region: 'test_region',
310+
endpoint: 'test_endpoint',
311+
hostname: 'test_hostname',
312+
gitHostname: 'test_githostname',
313+
}
314+
315+
await settings.update(devSettingName, testSetting)
316+
assert.deepStrictEqual(sut.getCodeCatalystConfig(defaultConfig), testSetting)
317+
})
318+
319+
it('returns default configuration when dev settings are not provided', function () {
320+
assert.deepStrictEqual(sut.getCodeCatalystConfig(defaultConfig), defaultConfig)
321+
})
322+
})
284323
})
285324

286325
describe('PromptSetting', function () {

0 commit comments

Comments
 (0)