in api/v1/src/admin/dataManager.js [51:142]
async function syncResources(projectId, type) {
const bigqueryUtil = new BigQueryUtil(projectId);
let bigQueryPermissions = false;
let topicPermissions = false;
let bucketPermissions = false;
let views = false;
let marketplace = false;
try {
if (type === 'BIGQUERY_PERMISSIONS') {
console.log('Sync BigQuery permissions called');
bigQueryPermissions = true;
} else if (type === 'STORAGE_BUCKET_PERMISSIONS') {
console.log('Sync storage bucket permissions called');
bucketPermissions = true;
} else if (type === 'TOPIC_PERMISSIONS') {
console.log('Sync pubsub topic permissions called');
topicPermissions = true;
} else if (type === 'BIGQUERY_VIEWS') {
console.log('Sync views called');
views = true;
} else if (type === 'MARKETPLACE') {
console.log('Sync marketplace entitlements called');
marketplace = await runtimeConfig.marketplaceIntegration(projectId);
} else if (type === 'ALL') {
console.log('Sync all called');
bigQueryPermissions = true;
topicPermissions = true;
bucketPermissions = true;
views = true;
marketplace = await runtimeConfig.marketplaceIntegration(projectId);
}
const labelKey = cfg.cdsManagedLabelKey;
if (marketplace) {
await procurementManager.syncAllAccountEntitlements(projectId);
}
if (bigQueryPermissions) {
await metaManager.performPolicyUpdates(projectId, null, true, metaManager.filters.BIG_QUERY);
}
if (topicPermissions) {
await metaManager.performPolicyUpdates(projectId, null, true, metaManager.filters.PUB_SUB);
}
if (bucketPermissions) {
await metaManager.performPolicyUpdates(projectId, null, true, metaManager.filters.CLOUD_STORAGE);
}
if (views) {
// Get list of configured views
const viewResult = await datasetManager.listDatasetViews(projectId, null, true);
if (viewResult.success) {
const viewList = viewResult.data;
const role = await runtimeConfig.bigQueryDataViewerRole(projectId);
const datasets = await bigqueryUtil.getDatasetsByLabel(labelKey, role);
for (const dataset of datasets) {
const tables = await bigqueryUtil.getTablesByLabel(dataset.datasetId, labelKey);
if (tables.length > 0) {
const views = underscore.where(tables, { type: 'VIEW' });
if (views.length > 0) {
for (const view of views) {
// Only delete the view if it no longer is configured
const found = underscore.findWhere(viewResult.data, { datasetId: view.datasetId, name: view.tableId });
if (!found) {
console.log(`Deleting view: ${view.datasetId}.${view.tableId}`);
await bigqueryUtil.deleteTable(view.datasetId, view.tableId);
}
}
}
}
}
// Iterate all views and create/modify them.
for (const view of viewList) {
let viewClone = JSON.parse(JSON.stringify(view));
const sql = viewClone.viewSql;
console.log(`Creating view ${viewClone.datasetId}.${viewClone.name}`);
viewClone.projectId = projectId;
if (view.expiration && view.expiration.time) {
// This logic should probably be re-factored to a shared place maybe in createView using a type check
// See datasets dataManager as the logic should be re-factored out of there from createOrUpdateDatasetView.
viewClone.expiration.time = new Date(view.expiration.time);
}
// console.log(viewClone);
await datasetManager.createView(viewClone, sql);
}
}
}
console.log('Sync completed');
} catch (err) {
return { success: false, code: 500, errors: [err.message] };
}
return { success: true, data: {} };
}