improvement: update intial sync logic to account for replica reads

This commit is contained in:
Scott Wilson
2025-01-16 09:48:21 -08:00
parent bc32d6cbbf
commit 6341b7e989
@@ -305,29 +305,40 @@ export const secretSyncQueueFactory = ({
); );
}; };
const $importSecrets = async (secretSync: TSecretSyncWithCredentials, importBehavior: SecretSyncImportBehavior) => { const $importSecrets = async (
secretSync: TSecretSyncWithCredentials,
importBehavior: SecretSyncImportBehavior
): Promise<TSecretMap> => {
const { projectId, environment } = secretSync; const { projectId, environment } = secretSync;
const importedSecrets = await SecretSyncFns.importSecrets(secretSync); const importedSecrets = await SecretSyncFns.importSecrets(secretSync);
if (Object.keys(importedSecrets).length) { if (!Object.keys(importedSecrets).length) return {};
const importedSecretMap: TSecretMap = {};
const secretMap = await $getSecrets(secretSync, false); const secretMap = await $getSecrets(secretSync, false);
const secretsToCreate: Parameters<typeof $createManySecretsRawFn>[0]["secrets"] = []; const secretsToCreate: Parameters<typeof $createManySecretsRawFn>[0]["secrets"] = [];
const secretsToUpdate: Parameters<typeof $updateManySecretsRawFn>[0]["secrets"] = []; const secretsToUpdate: Parameters<typeof $updateManySecretsRawFn>[0]["secrets"] = [];
Object.entries(importedSecrets).forEach(([key, { value }]) => { Object.entries(importedSecrets).forEach(([key, secretData]) => {
const { value, comment = "", skipMultilineEncoding } = secretData;
const secret = { const secret = {
secretName: key, secretName: key,
secretValue: value, secretValue: value,
type: SecretType.Shared, type: SecretType.Shared,
secretComment: "" secretComment: comment,
skipMultilineEncoding: skipMultilineEncoding ?? undefined
}; };
if (Object.hasOwn(secretMap, key)) { if (Object.hasOwn(secretMap, key)) {
secretsToUpdate.push(secret); secretsToUpdate.push(secret);
if (importBehavior === SecretSyncImportBehavior.PrioritizeDestination) importedSecretMap[key] = secretData;
} else { } else {
secretsToCreate.push(secret); secretsToCreate.push(secret);
importedSecretMap[key] = secretData;
} }
}); });
@@ -348,7 +359,8 @@ export const secretSyncQueueFactory = ({
secrets: secretsToUpdate secrets: secretsToUpdate
}); });
} }
}
return importedSecretMap;
}; };
const $handleSyncSecretsJob = async (job: TSecretSyncSyncSecretsDTO) => { const $handleSyncSecretsJob = async (job: TSecretSyncSyncSecretsDTO) => {
@@ -396,16 +408,20 @@ export const secretSyncQueueFactory = ({
syncOptions: { initialSyncBehavior } syncOptions: { initialSyncBehavior }
} = secretSyncWithCredentials; } = secretSyncWithCredentials;
const secretMap = await $getSecrets(secretSync);
if (!lastSyncedAt && initialSyncBehavior !== SecretSyncInitialSyncBehavior.OverwriteDestination) { if (!lastSyncedAt && initialSyncBehavior !== SecretSyncInitialSyncBehavior.OverwriteDestination) {
await $importSecrets( const importedSecretMap = await $importSecrets(
secretSyncWithCredentials, secretSyncWithCredentials,
initialSyncBehavior === SecretSyncInitialSyncBehavior.ImportPrioritizeSource initialSyncBehavior === SecretSyncInitialSyncBehavior.ImportPrioritizeSource
? SecretSyncImportBehavior.PrioritizeSource ? SecretSyncImportBehavior.PrioritizeSource
: SecretSyncImportBehavior.PrioritizeDestination : SecretSyncImportBehavior.PrioritizeDestination
); );
}
const secretMap = await $getSecrets(secretSync); Object.entries(importedSecretMap).forEach(([key, secretData]) => {
secretMap[key] = secretData;
});
}
await SecretSyncFns.syncSecrets(secretSyncWithCredentials, secretMap); await SecretSyncFns.syncSecrets(secretSyncWithCredentials, secretMap);