Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(bigquery-firestore-export): avoid the setup getting stuck #426

Merged
merged 8 commits into from
May 4, 2024
7 changes: 7 additions & 0 deletions bigquery-firestore-export/functions/__tests__/dts.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ describe('dts', () => {
};

describe('updateTransferConfigRequest', () => {
test('config not found', async () => {
const wrongName =
'projects/409146382768/locations/us/transferConfigs/wrong-id';
expect(
await dts.constructUpdateTransferConfigRequest(wrongName, baseConfig)
).toThrowError('Transfer config not found');
});
test('no change to the config', async () => {
const testConfig = baseConfig;
const expectedResponse = JSON.parse(JSON.stringify(baseResponse));
Expand Down
60 changes: 40 additions & 20 deletions bigquery-firestore-export/functions/src/dts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,20 @@ const mapValues = require('lodash.mapvalues');
import * as logs from './logs';
import {Config} from './types';

import * as functions from 'firebase-functions';

export const getTransferConfig = async (transferConfigName: string) => {
const datatransferClient =
new bigqueryDataTransfer.v1.DataTransferServiceClient();
const request = {name: transferConfigName};
const response = await datatransferClient.getTransferConfig(request);
return response[0];
try {
const datatransferClient =
new bigqueryDataTransfer.v1.DataTransferServiceClient();
const request = {name: transferConfigName};
const response = await datatransferClient.getTransferConfig(request);

return response[0];
} catch (e) {
functions.logger.error(`Failed to get transfer config: ${e}`);
return null;
}
};

export const createTransferConfigRequest = (config: Config) => {
Expand Down Expand Up @@ -74,6 +82,11 @@ export const constructUpdateTransferConfigRequest = async (
config: Config
) => {
const transferConfig = await getTransferConfig(transferConfigName);

if (!transferConfig) {
throw new Error('Transfer config not found');
}

const updateMask = [];
const updatedConfig = JSON.parse(JSON.stringify(transferConfig));
//TODO - what if null or undefined?
Expand Down Expand Up @@ -113,24 +126,31 @@ export const constructUpdateTransferConfigRequest = async (
updateMask: {paths: updateMask},
name: transferConfig.name,
};

return request;
};

export const updateTransferConfig = async (transferConfigName: string) => {
const datatransferClient =
new bigqueryDataTransfer.v1.DataTransferServiceClient();
const request = constructUpdateTransferConfigRequest(
transferConfigName,
config
);

// Run request
logs.updateTransferConfig(transferConfigName);
const converted =
bigqueryDataTransfer.protos.google.cloud.bigquery.datatransfer.v1.UpdateTransferConfigRequest.fromObject(
request
try {
const datatransferClient =
new bigqueryDataTransfer.v1.DataTransferServiceClient();
const request = await constructUpdateTransferConfigRequest(
transferConfigName,
config
);
const response = await datatransferClient.updateTransferConfig(converted);
logs.transferConfigUpdated(transferConfigName);
return response[0];

// Run request
logs.updateTransferConfig(transferConfigName);
const converted =
bigqueryDataTransfer.protos.google.cloud.bigquery.datatransfer.v1.UpdateTransferConfigRequest.fromObject(
request
);

const response = await datatransferClient.updateTransferConfig(converted);
logs.transferConfigUpdated(transferConfigName);
return response[0];
} catch (e) {
functions.logger.error(`Error updating transfer config: ${e}`);
return null;
}
};
34 changes: 23 additions & 11 deletions bigquery-firestore-export/functions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,21 +75,33 @@ export const upsertTransferConfig = functions.tasks
const splitName = transferConfigName.split('/');
const transferConfigId = splitName[splitName.length - 1];

await dts.updateTransferConfig(transferConfigName);
const response = await dts.updateTransferConfig(transferConfigName);

if (response) {
const updatedConfig = dts.getTransferConfig(
config.transferConfigName
);

await db
.collection(config.firestoreCollection)
.doc(transferConfigId)
.set({
extInstanceId: config.instanceId,
...updatedConfig,
});

await runtime.setProcessingState(
'PROCESSING_COMPLETE',
'Transfer Config Name was not provided to the extension, and an existing Transfer Config found. Transfer Config object was successfully updated in BQ and Firestore.'
);
return;
}

const updatedConfig = dts.getTransferConfig(config.transferConfigName);

await db
.collection(config.firestoreCollection)
.doc(transferConfigId)
.set({
extInstanceId: config.instanceId,
...updatedConfig,
});
await runtime.setProcessingState(
'PROCESSING_COMPLETE',
'Transfer Config Name was not provided to the extension, and an existing Transfer Config found. Transfer Config object was successfully updated in BQ and Firestore.'
`An existing Transfer Config name found in ${config.firestoreCollection}, but the associated Transfer Config does not exist.`
);

return;
} else {
const transferConfig = await dts.createTransferConfig();
Expand Down
6 changes: 3 additions & 3 deletions firestore-multimodal-genai/functions/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading