Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/core/project/backends/cdk/credentials.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,27 @@ describe("projects migrated from v0", () => {
expect(result["openai-key"]?.credentialProviderArn).toBe("arn:apikey:openai-key");
});

test("a new target deploys when another target uses the bare payment provider", async () => {
const oldProvider = { credentialProviderArn: paymentArn("wallet") };
const subject = account({ wallet: oldProvider });
const input = await migratedProject(
[COINBASE],
"AGENTCORE_CREDENTIAL_WALLET_API_KEY_ID='key-1'\n" +
"AGENTCORE_CREDENTIAL_WALLET_API_KEY_SECRET='key-secret'\n" +
"AGENTCORE_CREDENTIAL_WALLET_WALLET_SECRET='wallet-secret'\n",
);

const { result } = await run(subject.provision, input, {
...INPUT,
targetName: "prod",
});

expect(subject.contents().wallet).toEqual(oldProvider);
expect(result.wallet?.credentialProviderArn).toMatch(
/^arn:payment:example-prod-wallet-[a-f0-9]{16}$/,
);
});

test("never delete API key or OAuth providers, which v0 projects may share", async () => {
const subject = account({ "openai-key": { credentialProviderArn: "arn:apikey:openai-key" } });

Expand Down
10 changes: 7 additions & 3 deletions src/core/project/backends/cdk/credentials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,13 @@ export function createCredentialProvisioner(
// first provider is written, not partway through the list.
const plans: (NamedCredential & { provision: Provision })[] = [];
for (const { credential, provider } of named) {
// Lost target state must not turn an existing payment provider into an
// untracked orphan while a newly named provider takes its place.
if (credential.authorizerType === "PaymentCredentialProvider" && !recorded[credential.name]) {
// A bare v0 provider may belong to another target, so its existence does
// not prove this target lost state.
if (
credential.authorizerType === "PaymentCredentialProvider" &&
!recorded[credential.name] &&
!keepsV0CredentialNames(project)
) {
const previousName = previousProviderName(project, targetName, credential.name);
if (
previousName !== provider &&
Expand Down
Loading