Skip to content

Commit

Permalink
refactor(stepFunctions): use globalState abstraction #5323
Browse files Browse the repository at this point in the history
  • Loading branch information
justinmk3 authored Jul 18, 2024
1 parent e2a90ce commit aa58698
Show file tree
Hide file tree
Showing 9 changed files with 39 additions and 71 deletions.
3 changes: 3 additions & 0 deletions packages/core/src/shared/globalState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@ type samInitStateKey =
| 'SAM_INIT_IMAGE_BOOLEAN_KEY'
| 'SAM_INIT_ARCH_KEY'

type stepFunctionsKey = 'SCRIPT_LAST_DOWNLOADED_URL' | 'CSS_LAST_DOWNLOADED_URL'

type globalKey =
| samInitStateKey
| stepFunctionsKey
| 'aws.downloadPath'
| 'aws.lastTouchedS3Folder'
| 'aws.lastUploadedToS3Folder'
Expand Down
8 changes: 4 additions & 4 deletions packages/core/src/stepFunctions/activation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export async function activate(
*/
export const previewStateMachineCommand = Commands.declare(
'aws.previewStateMachine',
(globalState: vscode.Memento, manager: AslVisualizationManager) => async (arg?: vscode.TextEditor | vscode.Uri) => {
(manager: AslVisualizationManager) => async (arg?: vscode.TextEditor | vscode.Uri) => {
try {
arg ??= vscode.window.activeTextEditor
const input = arg instanceof vscode.Uri ? arg : arg?.document
Expand All @@ -71,7 +71,7 @@ export const previewStateMachineCommand = Commands.declare(
throw new ToolkitError('No active text editor or document found')
}

return await manager.visualizeStateMachine(globalState, input)
return await manager.visualizeStateMachine(input)
} finally {
// TODO: Consider making the metric reflect the success/failure of the above call
telemetry.stepfunctions_previewstatemachine.emit()
Expand All @@ -88,8 +88,8 @@ async function registerStepFunctionCommands(
const cdkVisualizationManager = new AslVisualizationCDKManager(extensionContext)

extensionContext.subscriptions.push(
previewStateMachineCommand.register(extensionContext.globalState, visualizationManager),
renderCdkStateMachineGraph.register(extensionContext.globalState, cdkVisualizationManager),
previewStateMachineCommand.register(visualizationManager),
renderCdkStateMachineGraph.register(cdkVisualizationManager),
Commands.register('aws.stepfunctions.createStateMachineFromTemplate', async () => {
try {
await createStateMachineFromTemplate(extensionContext)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@ export abstract class AbstractAslVisualizationManager<T extends AslVisualization

public constructor(private readonly extensionContext: vscode.ExtensionContext) {}

public abstract visualizeStateMachine(
globalState: vscode.Memento,
uri: vscode.Uri
): Promise<vscode.WebviewPanel | undefined>
public abstract visualizeStateMachine(uri: vscode.Uri): Promise<vscode.WebviewPanel | undefined>

protected pushToExtensionContextSubscriptions(visualizationDisposable: vscode.Disposable): void {
this.extensionContext.subscriptions.push(visualizationDisposable)
Expand Down Expand Up @@ -57,9 +54,9 @@ export abstract class AbstractAslVisualizationManager<T extends AslVisualization
return this.managedVisualizations.get(key)
}

protected async updateCache(globalState: vscode.Memento, logger: Logger): Promise<void> {
protected async updateCache(logger: Logger): Promise<void> {
try {
await this.cache.updateCache(globalState)
await this.cache.updateCache()
} catch (err) {
// So we can't update the cache, but can we use an existing on disk version.
logger.warn('Updating State Machine Graph Visualisation assets failed, checking for fallback local cache.')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@ export class AslVisualizationCDKManager extends AbstractAslVisualizationManager<
super(extensionContext)
}

public async visualizeStateMachine(
globalState: vscode.Memento,
uri: vscode.Uri
): Promise<vscode.WebviewPanel | undefined> {
public async visualizeStateMachine(uri: vscode.Uri): Promise<vscode.WebviewPanel | undefined> {
const logger = getLogger()
const existingVisualization = this.getExistingVisualization(this.getKey(uri))

Expand All @@ -34,7 +31,7 @@ export class AslVisualizationCDKManager extends AbstractAslVisualizationManager<
const templateUri = vscode.Uri.joinPath(cdkOutPath, `${appName}.template.json`)

try {
await this.cache.updateCache(globalState)
await this.cache.updateCache()

const textDocument = await vscode.workspace.openTextDocument(templateUri.with({ fragment: '' }))
const newVisualization = new AslVisualizationCDK(textDocument, templateUri.fsPath, resourceName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ export class AslVisualizationManager extends AbstractAslVisualizationManager {
}

public async visualizeStateMachine(
globalState: vscode.Memento,
target: vscode.TextDocument | vscode.Uri
): Promise<vscode.WebviewPanel | undefined> {
const logger: Logger = getLogger()
Expand All @@ -33,7 +32,7 @@ export class AslVisualizationManager extends AbstractAslVisualizationManager {

// Existing visualization does not exist, construct new visualization
try {
await this.updateCache(globalState, logger)
await this.updateCache(logger)
const newVisualization = new AslVisualization(document)
this.handleNewVisualization(document.uri.fsPath, newVisualization)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ function isLocationResource(obj: unknown): obj is { location: vscode.Uri } {
*/
export const renderCdkStateMachineGraph = Commands.declare(
'aws.cdk.renderStateMachineGraph',
(memento: vscode.Memento, manager: AslVisualizationCDKManager) => async (input?: unknown) => {
(manager: AslVisualizationCDKManager) => async (input?: unknown) => {
const resource = isTreeNode(input) ? unboxTreeNode(input, isLocationResource) : undefined
const resourceUri = resource?.location ?? (await new PreviewStateMachineCDKWizard().run())?.resource.location

if (!resourceUri) {
return
}

await manager.visualizeStateMachine(memento, resourceUri)
await manager.visualizeStateMachine(resourceUri)
}
)
11 changes: 4 additions & 7 deletions packages/core/src/stepFunctions/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ const scriptsLastDownloadedUrl = 'SCRIPT_LAST_DOWNLOADED_URL'
const cssLastDownloadedUrl = 'CSS_LAST_DOWNLOADED_URL'

export interface UpdateCachedScriptOptions {
globalState: vscode.Memento
lastDownloadedURLKey: string
lastDownloadedURLKey: 'SCRIPT_LAST_DOWNLOADED_URL' | 'CSS_LAST_DOWNLOADED_URL'
currentURL: string
filePath: string
}
Expand Down Expand Up @@ -73,9 +72,8 @@ export class StateMachineGraphCache {
this.fileExists = fileExistsCustom ?? fileExists
}

public async updateCache(globalState: vscode.Memento): Promise<void> {
public async updateCache(): Promise<void> {
const scriptUpdate = this.updateCachedFile({
globalState: globalState,
lastDownloadedURLKey: scriptsLastDownloadedUrl,
currentURL: visualizationScriptUrl,
filePath: this.jsFilePath,
Expand All @@ -87,7 +85,6 @@ export class StateMachineGraphCache {
})

const cssUpdate = this.updateCachedFile({
globalState: globalState,
lastDownloadedURLKey: cssLastDownloadedUrl,
currentURL: visualizationCssUrl,
filePath: this.cssFilePath,
Expand All @@ -102,7 +99,7 @@ export class StateMachineGraphCache {
}

public async updateCachedFile(options: UpdateCachedScriptOptions) {
const downloadedUrl = options.globalState.get<string>(options.lastDownloadedURLKey)
const downloadedUrl = globals.globalState.tryGet<string>(options.lastDownloadedURLKey, String)
const cachedFileExists = await this.fileExists(options.filePath)

// if current url is different than url that was previously used to download the assets
Expand All @@ -113,7 +110,7 @@ export class StateMachineGraphCache {
await this.writeToLocalStorage(options.filePath, response)

// save the url of the downloaded and cached assets
void options.globalState.update(options.lastDownloadedURLKey, options.currentURL)
await globals.globalState.update(options.lastDownloadedURLKey, options.currentURL)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ describe('StepFunctions VisualizeStateMachine', async function () {
const doc = await getDoc1()
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc)
await aslVisualizationManager.visualizeStateMachine(doc)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

const managedVisualizations = aslVisualizationManager.getManagedVisualizations()
Expand All @@ -101,10 +101,10 @@ describe('StepFunctions VisualizeStateMachine', async function () {
const doc = await getDoc1()
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc)
await aslVisualizationManager.visualizeStateMachine(doc)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc)
await aslVisualizationManager.visualizeStateMachine(doc)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

const managedVisualizations = aslVisualizationManager.getManagedVisualizations()
Expand All @@ -117,10 +117,10 @@ describe('StepFunctions VisualizeStateMachine', async function () {

assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc1)
await aslVisualizationManager.visualizeStateMachine(doc1)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc2)
await aslVisualizationManager.visualizeStateMachine(doc2)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 2)

const managedVisualizations = aslVisualizationManager.getManagedVisualizations()
Expand All @@ -134,16 +134,16 @@ describe('StepFunctions VisualizeStateMachine', async function () {

assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc1)
await aslVisualizationManager.visualizeStateMachine(doc1)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc2)
await aslVisualizationManager.visualizeStateMachine(doc2)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 2)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc1)
await aslVisualizationManager.visualizeStateMachine(doc1)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 2)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc2)
await aslVisualizationManager.visualizeStateMachine(doc2)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 2)

const managedVisualizations = aslVisualizationManager.getManagedVisualizations()
Expand All @@ -154,7 +154,7 @@ describe('StepFunctions VisualizeStateMachine', async function () {
it('Test AslVisualizationManager managedVisualizations set removes visualization on visualization dispose, single vis', async function () {
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)

let panel = await aslVisualizationManager.visualizeStateMachine(globals.globalState, await getDoc1())
let panel = await aslVisualizationManager.visualizeStateMachine(await getDoc1())
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

// Dispose of visualization panel
Expand All @@ -171,10 +171,10 @@ describe('StepFunctions VisualizeStateMachine', async function () {

assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)

let panel = await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc1)
let panel = await aslVisualizationManager.visualizeStateMachine(doc1)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 1)

await aslVisualizationManager.visualizeStateMachine(globals.globalState, doc2)
await aslVisualizationManager.visualizeStateMachine(doc2)
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 2)

// Dispose of first visualization panel
Expand Down
41 changes: 8 additions & 33 deletions packages/core/src/test/stepFunctions/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import * as sinon from 'sinon'
import * as vscode from 'vscode'
import { makeTemporaryToolkitFolder } from '../../shared/filesystemUtilities'
import { isDocumentValid, isStepFunctionsRole, StateMachineGraphCache } from '../../stepFunctions/utils'
import globals from '../../shared/extensionGlobals'

const requestBody = 'request body string'
const assetUrl = 'https://something'
const filePath = '/some/path'
const storageKey = 'KEY'
const storageKey = 'SCRIPT_LAST_DOWNLOADED_URL'
let tempFolder = ''

describe('StateMachineGraphCache', function () {
Expand All @@ -28,12 +29,6 @@ describe('StateMachineGraphCache', function () {

describe('updateCachedFile', function () {
it('downloads a file when it is not in cache and stores it', async function () {
const globalStorage = {
keys: () => [],
update: sinon.spy(),
get: sinon.stub().returns(undefined),
}

const getFileData = sinon.stub().resolves(requestBody)
const fileExists = sinon.stub().onFirstCall().resolves(false).onSecondCall().resolves(true)

Expand All @@ -49,23 +44,17 @@ describe('StateMachineGraphCache', function () {
})

await cache.updateCachedFile({
globalState: globalStorage,
lastDownloadedURLKey: storageKey,
currentURL: assetUrl,
filePath: filePath,
})

assert.ok(globalStorage.update.calledWith(storageKey, assetUrl))
assert.deepStrictEqual(globals.globalState.get(storageKey), assetUrl)
assert.ok(writeFile.calledWith(filePath, requestBody))
})

it('downloads and stores a file when cached file exists but url has been updated', async function () {
const globalStorage = {
keys: () => [],
update: sinon.spy(),
get: sinon.stub().returns('https://old-url'),
}

await globals.globalState.update(storageKey, 'https://old-url')
const getFileData = sinon.stub().resolves(requestBody)
const fileExists = sinon.stub().onFirstCall().resolves(true).onSecondCall().resolves(true)

Expand All @@ -81,23 +70,17 @@ describe('StateMachineGraphCache', function () {
})

await cache.updateCachedFile({
globalState: globalStorage,
lastDownloadedURLKey: storageKey,
currentURL: assetUrl,
filePath: filePath,
})

assert.ok(globalStorage.update.calledWith(storageKey, assetUrl))
assert.deepStrictEqual(globals.globalState.get(storageKey), assetUrl)
assert.ok(writeFile.calledWith(filePath, requestBody))
})

it('it does not store data when file exists and url for it is same', async function () {
const globalStorage = {
keys: () => [],
update: sinon.spy(),
get: sinon.stub().returns(assetUrl),
}

await globals.globalState.update(storageKey, assetUrl)
const getFileData = sinon.stub().resolves(requestBody)
const fileExists = sinon.stub().onFirstCall().resolves(true).onSecondCall().resolves(true)

Expand All @@ -113,13 +96,12 @@ describe('StateMachineGraphCache', function () {
})

await cache.updateCachedFile({
globalState: globalStorage,
lastDownloadedURLKey: storageKey,
currentURL: assetUrl,
filePath: filePath,
})

assert.ok(globalStorage.update.notCalled)
assert.deepStrictEqual(globals.globalState.get(storageKey), assetUrl)
assert.ok(writeFile.notCalled)
})
it('it passes if both files required exist', async function () {
Expand Down Expand Up @@ -160,12 +142,6 @@ describe('StateMachineGraphCache', function () {
})

it('creates assets directory when it does not exist', async function () {
const globalStorage = {
keys: () => [],
update: sinon.spy(),
get: sinon.stub().returns(undefined),
}

const getFileData = sinon.stub().resolves(requestBody)
const fileExists = sinon.stub().onFirstCall().resolves(false).onSecondCall().resolves(false)

Expand All @@ -185,13 +161,12 @@ describe('StateMachineGraphCache', function () {
})

await cache.updateCachedFile({
globalState: globalStorage,
lastDownloadedURLKey: storageKey,
currentURL: assetUrl,
filePath: filePath,
})

assert.ok(globalStorage.update.calledWith(storageKey, assetUrl))
assert.deepStrictEqual(globals.globalState.get(storageKey), assetUrl)
assert.ok(writeFile.calledWith(filePath, requestBody))
assert.ok(makeDir.calledWith(dirPath))
})
Expand Down

0 comments on commit aa58698

Please sign in to comment.