mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-11 19:28:58 +00:00
improvement: update intial sync logic to account for replica reads
This commit is contained in:
@@ -305,50 +305,62 @@ 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 secretMap = await $getSecrets(secretSync, false);
|
|
||||||
|
|
||||||
const secretsToCreate: Parameters<typeof $createManySecretsRawFn>[0]["secrets"] = [];
|
const importedSecretMap: TSecretMap = {};
|
||||||
const secretsToUpdate: Parameters<typeof $updateManySecretsRawFn>[0]["secrets"] = [];
|
|
||||||
|
|
||||||
Object.entries(importedSecrets).forEach(([key, { value }]) => {
|
const secretMap = await $getSecrets(secretSync, false);
|
||||||
const secret = {
|
|
||||||
secretName: key,
|
|
||||||
secretValue: value,
|
|
||||||
type: SecretType.Shared,
|
|
||||||
secretComment: ""
|
|
||||||
};
|
|
||||||
|
|
||||||
if (Object.hasOwn(secretMap, key)) {
|
const secretsToCreate: Parameters<typeof $createManySecretsRawFn>[0]["secrets"] = [];
|
||||||
secretsToUpdate.push(secret);
|
const secretsToUpdate: Parameters<typeof $updateManySecretsRawFn>[0]["secrets"] = [];
|
||||||
} else {
|
|
||||||
secretsToCreate.push(secret);
|
Object.entries(importedSecrets).forEach(([key, secretData]) => {
|
||||||
}
|
const { value, comment = "", skipMultilineEncoding } = secretData;
|
||||||
|
|
||||||
|
const secret = {
|
||||||
|
secretName: key,
|
||||||
|
secretValue: value,
|
||||||
|
type: SecretType.Shared,
|
||||||
|
secretComment: comment,
|
||||||
|
skipMultilineEncoding: skipMultilineEncoding ?? undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Object.hasOwn(secretMap, key)) {
|
||||||
|
secretsToUpdate.push(secret);
|
||||||
|
if (importBehavior === SecretSyncImportBehavior.PrioritizeDestination) importedSecretMap[key] = secretData;
|
||||||
|
} else {
|
||||||
|
secretsToCreate.push(secret);
|
||||||
|
importedSecretMap[key] = secretData;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (secretsToCreate.length) {
|
||||||
|
await $createManySecretsRawFn({
|
||||||
|
projectId,
|
||||||
|
path: secretSync.folder.path,
|
||||||
|
environment: environment.slug,
|
||||||
|
secrets: secretsToCreate
|
||||||
});
|
});
|
||||||
|
|
||||||
if (secretsToCreate.length) {
|
|
||||||
await $createManySecretsRawFn({
|
|
||||||
projectId,
|
|
||||||
path: secretSync.folder.path,
|
|
||||||
environment: environment.slug,
|
|
||||||
secrets: secretsToCreate
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (importBehavior === SecretSyncImportBehavior.PrioritizeDestination && secretsToUpdate.length) {
|
|
||||||
await $updateManySecretsRawFn({
|
|
||||||
projectId,
|
|
||||||
path: secretSync.folder.path,
|
|
||||||
environment: environment.slug,
|
|
||||||
secrets: secretsToUpdate
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (importBehavior === SecretSyncImportBehavior.PrioritizeDestination && secretsToUpdate.length) {
|
||||||
|
await $updateManySecretsRawFn({
|
||||||
|
projectId,
|
||||||
|
path: secretSync.folder.path,
|
||||||
|
environment: environment.slug,
|
||||||
|
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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user