diff --git a/client/src/config.js b/client/src/config.js index d5b4be1..006204b 100644 --- a/client/src/config.js +++ b/client/src/config.js @@ -87,7 +87,7 @@ const recruitment = { organization: 'AWS-SRB-Recruitment' }; -const stage = process.env.NODE_ENV === 'production' ? recruitment : recruitment; +const stage = process.env.NODE_ENV === 'production' ? serbia : serbia; export default { ...stage diff --git a/client/src/containers/AccountsView.js b/client/src/containers/AccountsView.js index 4006440..051b7db 100644 --- a/client/src/containers/AccountsView.js +++ b/client/src/containers/AccountsView.js @@ -128,8 +128,8 @@ const AccountsView = () => { account={account} refreshList={refreshList} apiFunction={ - show === 'Create new AWS account' || 'Create new GCP account' ? - serviceHandler.createAccount : serviceHandler.updateAccount + show === 'Create new AWS account' ? + awsServices.createAccount : awsServices.updateAccount } handleViewChange={handleViewChange} /> @@ -160,8 +160,8 @@ const AccountsView = () => { account={account} refreshList={refreshList} apiFunction={ - show === 'Create new AWS account' || 'Create new GCP account' ? - serviceHandler.createAccount : serviceHandler.updateAccount + show === 'Create new GCP account' ? + gcpServices.createAccount : gcpServices.updateAccount } handleViewChange={handleViewChange} /> diff --git a/server/serverless-gcp-account-crud.yml b/server/serverless-gcp-account-crud.yml index ec15722..fa04ddc 100644 --- a/server/serverless-gcp-account-crud.yml +++ b/server/serverless-gcp-account-crud.yml @@ -55,3 +55,13 @@ functions: cors: true authorizer: ${self:custom.authorizer} - schedule: cron(2,32 8-18 * * ? *) + gcpResetBudgets: + handler: src/handler/gcp-account-handler.resetBudgets + timeout: 900 + events: + - http: + path: gcp/reset-budgets + method: post # TODO: use node v15.14.0 (otherwise post api does not work) + cors: true + authorizer: ${self:custom.authorizer} + - schedule: cron(0 6 1 * ? *) # Run at 6:00 am (UTC+0) every 1st day of the month diff --git a/server/src/handler/gcp-account-handler.js b/server/src/handler/gcp-account-handler.js index 22c5547..5ee72d1 100644 --- a/server/src/handler/gcp-account-handler.js +++ b/server/src/handler/gcp-account-handler.js @@ -38,7 +38,6 @@ const updateAccount = async (event) => { if (oldStateAccount.budget != account.budget) { const budgets = await getBudgetList(); const budgetsForUpdate = budgets.filter(budget => budget.displayName === `${account.name}${budgetNameSuffix.EMAIL}` || budget.displayName === `${account.name}${budgetNameSuffix.PUBSUB}`); - await Promise.all(budgetsForUpdate.map(async (budget) => { await updateBudget(budget, account.budget); })); @@ -80,6 +79,18 @@ const syncBudgets = async () => { } }; + +const resetBudgets = async () => { + try { + await accountSyncService.resetBudget(); + return okResponse({ success: true, message: 'Budget reset is done' }); + } catch (error) { + console.log('Budget sync failed', error); + return errorResponse({ statusCode: 500, message: 'Budget reset failed'}); + } +}; + + const syncOwners = async () => { try { const result = await accountSyncService.syncOwners(); @@ -107,5 +118,6 @@ module.exports = { updateAccount, syncBudgets, syncOwners, - syncAccounts + syncAccounts, + resetBudgets }; diff --git a/server/src/service/gcp-account-sync-service.js b/server/src/service/gcp-account-sync-service.js index bb78fbf..df61177 100644 --- a/server/src/service/gcp-account-sync-service.js +++ b/server/src/service/gcp-account-sync-service.js @@ -108,9 +108,25 @@ const syncBudgets = async () => { return { success: true, message: 'Budget sync is done' }; } + +const resetBudget = async () => { + + // get existing accounts from dynamodb + const accounts = await accountService.getAccounts(tableName); + + // update budgets to 0 + for (const account of accounts) { + await accountService.updateAccount({ id: account.id, actualSpend: `0` }, tableName); + console.log(`Account with id ${account.id} has reset budget`) + } + + return { success: true, message: 'Budget reset is done' }; +} + module.exports = { syncAccounts, syncAccountsMembers, syncOwners, - syncBudgets + syncBudgets, + resetBudget }; diff --git a/server/src/service/gcp-budget-service.js b/server/src/service/gcp-budget-service.js index 34c2e58..ddcee82 100644 --- a/server/src/service/gcp-budget-service.js +++ b/server/src/service/gcp-budget-service.js @@ -114,7 +114,7 @@ const getBudgetList = async () => { // use next token to get all pages/budgets do { response = await gcpClient.request({ method: 'GET', url: !nextToken ? url : `${url}?pageToken=${nextToken}` }); - budgets.push(response.budgets); + budgets = budgets.concat(response.data.budgets); nextToken = response.nextPageToken ? response.nextPageToken : null; } while (nextToken); @@ -129,7 +129,7 @@ const updateBudget = async (budget, newAmount) => { console.log(`Updating GCP project budget amount, new amount: ${newAmount}, budget: ${JSON.stringify(budget)}`); try { const gcpClient = await getGcpAuthClient(); - const url = `https://billingbudgets.googleapis.com/v1/billingAccounts/${process.env.GCP_BILLING_ACCOUNT_ID}/budgets/${budget.name}`; + const url = `https://billingbudgets.googleapis.com/v1/${budget.name}`; const body = { amount: budget.amount };