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

QA reporting enhancements #55

Merged
merged 12 commits into from
Jan 8, 2024
Merged

Conversation

TylerHendrickson
Copy link
Member

This PR tweaks various parts of the repo involved in the QA phase of the CI workflow, with particular focus on reinforcing existing (lint) checks related to code quality and consistency.

Summary of changes:

  1. Fix an issue in the CI workflow where ESLint checks for web/src were skipped if ESLint failed for api/src. We want ESLint to run for both sides, even if one of them fails. This also fixes an issue where ESLint checks were incorrectly reporting as passing.
  2. Implement suggestions for avoiding rate-limiting on TFLint plugin download by ensuring they are being cached and reused across workflow runs.
  3. Added a quick guide in docs/ for developer reference when dealing with QA check failures.
  4. Resolved all current ESLint errors and warnings (only necessary for api/src).

@TylerHendrickson TylerHendrickson requested a review from a team December 21, 2023 02:30
@TylerHendrickson TylerHendrickson self-assigned this Dec 21, 2023
@TylerHendrickson TylerHendrickson requested a review from a team as a code owner December 21, 2023 02:30
@github-actions github-actions bot added documentation Improvements or additions to documentation enhancement New feature or request github infra javascript terraform labels Dec 21, 2023
@TylerHendrickson TylerHendrickson added the bug Something isn't working label Dec 21, 2023
@TylerHendrickson TylerHendrickson enabled auto-merge (squash) December 21, 2023 02:32
Copy link

github-actions bot commented Dec 21, 2023

QA Summary

QA Check Result
🌐 Web Tests
🔗 API Tests
📏 ESLint
🧹 TFLint

Test Coverage

Coverage report for api suite
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 23.04 2.17 31.79 23.47
🟢  directives/requireAuth 100 100 100 100
🟢   requireAuth.ts 100 100 100 100
🟡  directives/skipAuth 50 100 0 50
🟡   skipAuth.ts 50 100 0 50 13
🔴  functions 0 100 0 0
🔴   graphql.ts 0 100 0 0 14-22
🔴  functions/cpfValidation 0 100 0 0
🔴   cpfValidation.scenarios.ts 0 100 100 0 3
🔴   cpfValidation.ts 0 100 0 0 7-25
🔴  functions/excelToJson 0 0 0 0
🔴   excelToJson.scenarios.ts 0 100 100 0 3
🔴   excelToJson.ts 0 0 0 0 12-47
🔴  graphql 0 100 100 0
🔴   agencies.sdl.ts 0 100 100 0 1
🔴   expenditureCategories.sdl.ts 0 100 100 0 1
🔴   inputTemplates.sdl.ts 0 100 100 0 1
🔴   organizations.sdl.ts 0 100 100 0 1
🔴   outputTemplates.sdl.ts 0 100 100 0 1
🔴   projects.sdl.ts 0 100 100 0 1
🔴   reportingPeriods.sdl.ts 0 100 100 0 1
🔴   roles.sdl.ts 0 100 100 0 1
🔴   subrecipients.sdl.ts 0 100 100 0 1
🔴   uploadValidations.sdl.ts 0 100 100 0 1
🔴   uploads.sdl.ts 0 100 100 0 1
🔴   users.sdl.ts 0 100 100 0 1
🔴  lib 4.91 2.23 6.66 5.04
🔴   auth.ts 20 10.34 25 21.21 40-41,72-101,120,124-159
🔴   aws.ts 27.02 12.5 18.18 27.02 46-51,67-99,125-166,179
🔴   db.ts 31.25 50 50 31.25 15-35,45,47
🔴   ec-codes.ts 0 100 100 0 1
🟢   logger.ts 100 100 100 100
🔴   persist-upload.js 0 0 0 0 16-295
🔴   preconditions.ts 0 0 0 0 2-3
🔴   records.js 0 0 0 0 12-214
🔴   templateRules.ts 0 0 0 0
🔴   tracer.ts 0 100 100 0 5-14
🔴   validate-upload.js 0 0 0 0 18-790
🔴   validation-error.ts 0 0 0 0 14-22
🔴   validation-rules.js 0 0 0 0 6-194
🟡  services/agencies 70.58 0 83.33 70.58
🟢   agencies.scenarios.ts 100 100 100 100
🟡   agencies.ts 68.75 0 83.33 68.75 39-47
🟢  services/expenditureCategories 92.3 100 83.33 92.3
🟢   expenditureCategories.scenarios.ts 100 100 100 100
🟢   expenditureCategories.ts 91.66 100 83.33 91.66 46
🟢  services/inputTemplates 92.3 100 83.33 92.3
🟢   inputTemplates.scenarios.ts 100 100 100 100
🟢   inputTemplates.ts 91.66 100 83.33 91.66 47
🟢  services/organizations 92.3 100 83.33 92.3
🟢   organizations.scenarios.ts 100 100 100 100
🟢   organizations.ts 91.66 100 83.33 91.66 47
🟢  services/outputTemplates 92.3 100 83.33 92.3
🟢   outputTemplates.scenarios.ts 100 100 100 100
🟢   outputTemplates.ts 91.66 100 83.33 91.66 43
🟡  services/projects 80 100 62.5 80
🟢   projects.scenarios.ts 100 100 100 100
🟡   projects.ts 78.57 100 62.5 78.57 45-51
🟡  services/reportingPeriods 53.84 0 41.66 56
🟢   reportingPeriods.scenarios.ts 100 100 100 100
🟡   reportingPeriods.ts 52 0 41.66 54.16 21-31,42-45,72-82
🟢  services/roles 92.3 100 83.33 92.3
🟢   roles.scenarios.ts 100 100 100 100
🟢   roles.ts 91.66 100 83.33 91.66 40
🟡  services/subrecipients 80 100 62.5 80
🟢   subrecipients.scenarios.ts 100 100 100 100
🟡   subrecipients.ts 78.57 100 62.5 78.57 47-55
🔴  services/uploadValidations 0 100 0 0
🔴   uploadValidations.scenarios.ts 0 100 100 0 5
🔴   uploadValidations.ts 0 100 0 0 9-66
🟡  services/uploads 70 100 45.45 70
🟢   uploads.scenarios.ts 100 100 100 100
🟡   uploads.ts 68.42 100 45.45 68.42 49-66
🟡  services/users 52 0 38.46 52
🟢   users.scenarios.ts 100 100 100 100
🟡   users.ts 50 0 38.46 50 40-48,54-72
Coverage report for web suite
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 13.49 12.6 12.32 12.76
🔴  src 25.92 0 21.42 25.92
🔴   App.tsx 0 0 0 0 3-35
🟢   Routes.tsx 100 100 100 100
🔴   auth.ts 35.71 100 16.66 35.71 33-45,68-88
🔴   entry.client.tsx 0 0 100 0 10-22
🔴  src/components/Agency/Agencies 0 100 0 0
🔴   Agencies.tsx 0 100 0 0 9-21
🔴  src/components/Agency/AgenciesCell 0 100 0 0
🔴   AgenciesCell.tsx 0 100 0 0 8-39
🔴  src/components/Agency/Agency 0 0 0 0
🔴   Agency.tsx 0 0 0 0 10-78
🔴  src/components/Agency/AgencyCell 0 100 0 0
🔴   AgencyCell.tsx 0 100 0 0 7-27
🔴  src/components/Agency/AgencyForm 0 0 0 0
🔴   AgencyForm.tsx 0 0 0 0 24-39
🔴  src/components/Agency/EditAgencyCell 0 100 0 0
🔴   EditAgencyCell.tsx 0 100 0 0 10-58
🔴  src/components/Agency/NewAgency 0 100 0 0
🔴   NewAgency.tsx 0 100 0 0 9-35
🟢  src/components/Navigation 100 100 100 100
🟢   Navigation.tsx 100 100 100 100
🔴  src/components/Organization/EditOrganizationCell 0 100 0 0
🔴   EditOrganizationCell.tsx 0 100 0 0 13-62
🔴  src/components/Organization/NewOrganization 0 100 0 0
🔴   NewOrganization.tsx 0 100 0 0 9-35
🔴  src/components/Organization/Organization 0 0 0 0
🔴   Organization.tsx 0 0 0 0 10-70
🔴  src/components/Organization/OrganizationCell 0 100 0 0
🔴   OrganizationCell.tsx 0 100 0 0 7-27
🔴  src/components/Organization/OrganizationForm 0 0 0 0
🔴   OrganizationForm.tsx 0 0 0 0 27-41
🔴  src/components/Organization/Organizations 0 100 0 0
🔴   Organizations.tsx 0 100 0 0 9-21
🔴  src/components/Organization/OrganizationsCell 0 100 0 0
🔴   OrganizationsCell.tsx 0 100 0 0 8-37
🟡  src/components/ReportingPeriodCell 55 0 55.55 47.05
🟢   ReportingPeriodCell.mock.ts 100 100 100 100
🔴   ReportingPeriodCell.stories.tsx 0 0 0 0 6-32
🟢   ReportingPeriodCell.tsx 100 100 100 100
🟡  src/components/ReportingPeriodsCell 57.14 28.57 60 50
🟢   ReportingPeriodsCell.mock.ts 100 100 100 100
🔴   ReportingPeriodsCell.stories.tsx 0 0 0 0 6-32
🟢   ReportingPeriodsCell.tsx 100 66.66 100 100 63-66
🔴  src/components/TableBuilder 0 0 0 0
🔴   DebouncedInput.tsx 0 0 0 0 13-32
🔴   Filter.tsx 0 0 0 0 6-15
🔴   TableBuilder.tsx 0 0 0 0 22-70
🔴   TableHeader.tsx 0 0 0 0 5-42
🔴   TableRow.tsx 0 100 0 0 3-7
🔴  src/components/Upload/EditUploadCell 0 100 0 0
🔴   EditUploadCell.tsx 0 100 0 0 10-68
🔴  src/components/Upload/NewUpload 0 100 0 0
🔴   NewUpload.tsx 0 100 0 0 7-30
🔴  src/components/Upload/Upload 0 0 0 0
🔴   Upload.tsx 0 0 0 0 12-100
🔴  src/components/Upload/UploadCell 0 100 0 0
🔴   UploadCell.tsx 0 100 0 0 7-32
🔴  src/components/Upload/UploadForm 0 0 0 0
🔴   UploadForm.tsx 0 0 0 0 21-95
🔴  src/components/Upload/Uploads 0 0 0 0
🔴   Uploads.tsx 0 0 0 0 9-66
🔴   columns.tsx 0 0 0 0 7-62
🔴  src/components/Upload/UploadsCell 0 100 0 0
🔴   UploadsCell.tsx 0 100 0 0 8-53
🔴  src/components/User/EditUserCell 0 100 0 0
🔴   EditUserCell.tsx 0 100 0 0 10-60
🔴  src/components/User/NewUser 0 100 0 0
🔴   NewUser.tsx 0 100 0 0 9-32
🔴  src/components/User/User 0 0 0 0
🔴   User.tsx 0 0 0 0 9-93
🔴  src/components/User/UserCell 0 100 0 0
🔴   UserCell.tsx 0 100 0 0 7-31
🔴  src/components/User/UserForm 0 0 0 0
🔴   UserForm.tsx 0 0 0 0 25-39
🔴  src/components/User/Users 0 100 0 0
🔴   Users.tsx 0 100 0 0 9-24
🔴  src/components/User/UsersCell 0 100 0 0
🔴   UsersCell.tsx 0 100 0 0 8-43
🟡  src/layouts/AuthenticatedLayout 60 50 100 60
🔴   AuthenticatedLayout.stories.tsx 0 100 100 0 5-13
🟢   AuthenticatedLayout.tsx 100 50 100 100 24
🟢  src/lib 100 100 100 100
🟢   formatters.tsx 100 100 100 100
🔴  src/pages/Agency/AgenciesPage 0 100 0 0
🔴   AgenciesPage.tsx 0 100 0 0 7-11
🔴  src/pages/Agency/AgencyPage 0 100 0 0
🔴   AgencyPage.tsx 0 100 0 0 7-8
🔴  src/pages/Agency/EditAgencyPage 0 100 0 0
🔴   EditAgencyPage.tsx 0 100 0 0 7-8
🔴  src/pages/Agency/NewAgencyPage 0 100 0 0
🔴   NewAgencyPage.tsx 0 100 0 0 3-4
🔴  src/pages/FatalErrorPage 0 0 0 0
🔴   FatalErrorPage.tsx 0 0 0 0 15
🟡  src/pages/LoginPage 50 100 100 50
🔴   LoginPage.stories.tsx 0 100 100 0 5-13
🟢   LoginPage.tsx 100 100 100 100
🔴  src/pages/NotFoundPage 0 100 0 0
🔴   NotFoundPage.tsx 0 100 0 0 2
🔴  src/pages/Organization/EditOrganizationPage 0 100 0 0
🔴   EditOrganizationPage.tsx 0 100 0 0 7-8
🔴  src/pages/Organization/NewOrganizationPage 0 100 0 0
🔴   NewOrganizationPage.tsx 0 100 0 0 3-4
🔴  src/pages/Organization/OrganizationPage 0 100 0 0
🔴   OrganizationPage.tsx 0 100 0 0 7-8
🔴  src/pages/Organization/OrganizationsPage 0 100 0 0
🔴   OrganizationsPage.tsx 0 100 0 0 7-8
🟡  src/pages/ReportingPeriodsPage 50 100 100 50
🔴   ReportingPeriodsPage.stories.tsx 0 100 100 0 5-13
🟢   ReportingPeriodsPage.tsx 100 100 100 100
🔴  src/pages/Upload/EditUploadPage 0 100 0 0
🔴   EditUploadPage.tsx 0 100 0 0 7-8
🔴  src/pages/Upload/NewUploadPage 0 100 0 0
🔴   NewUploadPage.tsx 0 100 0 0 3-4
🔴  src/pages/Upload/UploadPage 0 100 0 0
🔴   UploadPage.tsx 0 100 0 0 7-8
🔴  src/pages/Upload/UploadsPage 0 100 0 0
🔴   UploadsPage.tsx 0 100 0 0 7-8
🟡  src/pages/UploadTemplatePage 50 100 50 50
🔴   UploadTemplatePage.stories.tsx 0 100 100 0 5-13
🟡   UploadTemplatePage.tsx 75 100 50 75 9
🔴  src/pages/User/EditUserPage 0 100 0 0
🔴   EditUserPage.tsx 0 100 0 0 7-8
🔴  src/pages/User/NewUserPage 0 100 0 0
🔴   NewUserPage.tsx 0 100 0 0 3-4
🔴  src/pages/User/UserPage 0 100 0 0
🔴   UserPage.tsx 0 100 0 0 7-8
🔴  src/pages/User/UsersPage 0 100 0 0
🔴   UsersPage.tsx 0 100 0 0 7-11
🔴  src/utils 0 0 0 0
🔴   index.ts 0 0 0 0 3-37

Pusher: @TylerHendrickson, Action: pull_request_target, Workflow: Continuous Integration

Copy link

github-actions bot commented Dec 21, 2023

Terraform Summary

Step Result
🖌 Terraform Format & Style
⚙️ Terraform Initialization
🤖 Terraform Validation
📖 Terraform Plan

Hint: If "Terraform Format & Style" failed, run terraform fmt -recursive from the terraform/ directory and commit the results.

Output

Validation Output
Success! The configuration is valid.


Plan Output
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+   create
  ~ update in-place
-   destroy
-/+ destroy and then create replacement
+/- create replacement and then destroy

Terraform will perform the following actions:

  # aws_ecs_service.console will be updated in-place
  ~ resource "aws_ecs_service" "console" {
        id                                 = "arn:aws:ecs:us-west-2:357150818708:service/cpfreporter/cpfreporter-console"
        name                               = "cpfreporter-console"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console:30" -> (known after apply)
        # (15 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }

  # aws_ecs_task_definition.console must be replaced
+/- resource "aws_ecs_task_definition" "console" {
      ~ arn                      = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console:30" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console" -> (known after apply)
      ~ container_definitions    = (sensitive value) # forces replacement
      ~ id                       = "cpfreporter-console" -> (known after apply)
      ~ revision                 = 30 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # aws_s3_bucket_notification.excel_notification will be created
+   resource "aws_s3_bucket_notification" "excel_notification" {
+       bucket      = "cpfreporter-cpf-reporter-staging-357150818708-us-west-2"
+       eventbridge = false
+       id          = (known after apply)

+       lambda_function {
+           events              = [
+               "s3:ObjectCreated:*",
            ]
+           filter_suffix       = ".xlsm"
+           id                  = (known after apply)
+           lambda_function_arn = (known after apply)
        }
    }

  # aws_s3_bucket_notification.json_notification will be created
+   resource "aws_s3_bucket_notification" "json_notification" {
+       bucket      = "cpfreporter-cpf-reporter-staging-357150818708-us-west-2"
+       eventbridge = false
+       id          = (known after apply)

+       lambda_function {
+           events              = [
+               "s3:ObjectCreated:*",
            ]
+           filter_suffix       = ".json"
+           id                  = (known after apply)
+           lambda_function_arn = (known after apply)
        }
    }

  # aws_s3_object.lambda_artifact-cpfValidation will be updated in-place
  ~ resource "aws_s3_object" "lambda_artifact-cpfValidation" {
      ~ etag                   = "812b842ca7e65e7a018d21ee16b22edd-5" -> "b1d7303d212a05c9e6bb7c868b81296b"
        id                     = "cpfValidation.b1d7303d212a05c9e6bb7c868b81296b.zip"
        tags                   = {}
      ~ version_id             = "goxiCsRXN6O8daOS9gJDnZQf_2t1xtNd" -> (known after apply)
        # (11 unchanged attributes hidden)
    }

  # aws_s3_object.lambda_artifact-excelToJson will be updated in-place
  ~ resource "aws_s3_object" "lambda_artifact-excelToJson" {
      ~ etag                   = "41ce91252ab8d3546fb5905ff561b7c4-6" -> "20739793d622992f3eae2ba77a6afbb0"
        id                     = "excelToJson.20739793d622992f3eae2ba77a6afbb0.zip"
        tags                   = {}
      ~ version_id             = "0xOSnc9Ity1JKngLCCY5WJ4tC8TNho35" -> (known after apply)
        # (11 unchanged attributes hidden)
    }

  # aws_s3_object.lambda_artifact-graphql will be updated in-place
  ~ resource "aws_s3_object" "lambda_artifact-graphql" {
      ~ etag                   = "9326a606374d28b4950d319df67d84e1-6" -> "7c136621a9a1c814e2b6341e58a0362e"
        id                     = "graphql.7c136621a9a1c814e2b6341e58a0362e.zip"
        tags                   = {}
      ~ version_id             = "s3kVN.bPwvpvE2J1kP0tdb4Ami6nrJiz" -> (known after apply)
        # (11 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["200.html"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "97963b3e57de06c48bbdbfa50ee12686" -> "26b4ba1df316b898fd04d4aa33fe7033"
        id                     = "dist/200.html"
      ~ source_hash            = "97963b3e57de06c48bbdbfa50ee12686" -> "26b4ba1df316b898fd04d4aa33fe7033"
        tags                   = {}
      ~ version_id             = "9XD2FFv0MWobxmeaeL7O8u3i1TVCk3Ff" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["build-manifest.json"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "6d989e54b15594d712bf9ac874eb1709" -> "3230fb7175d132db128371edce2e0926"
        id                     = "dist/build-manifest.json"
      ~ source_hash            = "6d989e54b15594d712bf9ac874eb1709" -> "3230fb7175d132db128371edce2e0926"
        tags                   = {}
      ~ version_id             = "RNKRV8bafx7FqxjsvKfRzEUqGktWurYP" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["chunk-references.json"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "b60c5472ecccd4db797614c49637bf37" -> "9afd05b39afd4d91a002bf2b91273459"
        id                     = "dist/chunk-references.json"
      ~ source_hash            = "b60c5472ecccd4db797614c49637bf37" -> "9afd05b39afd4d91a002bf2b91273459"
        tags                   = {}
      ~ version_id             = "2cpUKrAqTsQyOVzxwF.zQL2GReQy46sQ" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["index.html"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "97963b3e57de06c48bbdbfa50ee12686" -> "26b4ba1df316b898fd04d4aa33fe7033"
        id                     = "dist/index.html"
      ~ source_hash            = "97963b3e57de06c48bbdbfa50ee12686" -> "26b4ba1df316b898fd04d4aa33fe7033"
        tags                   = {}
      ~ version_id             = "tV3jNHRcgREV13ZfLP4zA8e5FMy0PCzG" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["static/js/app.65a3fc25.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "b330a241c69dbe4c59a9c08e2dc03a76"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/app.65a3fc25.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.65a3fc25.js"
+       source_hash            = "b330a241c69dbe4c59a9c08e2dc03a76"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/app.65a3fc25.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "22534f5b586cb736e9cdf4c0742c3fd1"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/app.65a3fc25.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.65a3fc25.js.LICENSE.txt"
+       source_hash            = "22534f5b586cb736e9cdf4c0742c3fd1"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/app.dc0e7cec.js"] will be destroyed
  # (because key ["static/js/app.dc0e7cec.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "9b07d777749bdd4aa2835f53e8d3ecb4" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/app.dc0e7cec.js" -> null
-       key                    = "dist/static/js/app.dc0e7cec.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.dc0e7cec.js" -> null
-       source_hash            = "9b07d777749bdd4aa2835f53e8d3ecb4" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "XQ.VoWcCkb4nCvN5At4EwMbhDmrs9u2j" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/app.dc0e7cec.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/app.dc0e7cec.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "22534f5b586cb736e9cdf4c0742c3fd1" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/app.dc0e7cec.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/app.dc0e7cec.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.dc0e7cec.js.LICENSE.txt" -> null
-       source_hash            = "22534f5b586cb736e9cdf4c0742c3fd1" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "qVzDODX6x7sFwTazv9lcQwjlPK_DbCMa" -> null
    }

  # module.lambda_function-cpfValidation.aws_iam_policy.logs[0] will be created
+   resource "aws_iam_policy" "logs" {
+       arn         = (known after apply)
+       id          = (known after apply)
+       name        = "lambda-role-cpfValidation-logs"
+       name_prefix = (known after apply)
+       path        = "/"
+       policy      = jsonencode(
            {
+               Statement = [
+                   {
+                       Action   = [
+                           "logs:PutLogEvents",
+                           "logs:CreateLogStream",
+                           "logs:CreateLogGroup",
                        ]
+                       Effect   = "Allow"
+                       Resource = [
+                           "arn:aws:logs:us-west-2:357150818708:log-group:/aws/lambda/cpf-validation:*:*",
+                           "arn:aws:logs:us-west-2:357150818708:log-group:/aws/lambda/cpf-validation:*",
                        ]
                    },
                ]
+               Version   = "2012-10-17"
            }
        )
+       policy_id   = (known after apply)
+       tags_all    = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
    }

  # module.lambda_function-cpfValidation.aws_iam_role.lambda[0] will be created
+   resource "aws_iam_role" "lambda" {
+       arn                   = (known after apply)
+       assume_role_policy    = jsonencode(
            {
+               Statement = [
+                   {
+                       Action    = "sts:AssumeRole"
+                       Effect    = "Allow"
+                       Principal = {
+                           Service = "lambda.amazonaws.com"
                        }
                    },
                ]
+               Version   = "2012-10-17"
            }
        )
+       create_date           = (known after apply)
+       force_detach_policies = true
+       id                    = (known after apply)
+       managed_policy_arns   = (known after apply)
+       max_session_duration  = 3600
+       name                  = "lambda-role-cpfValidation"
+       name_prefix           = (known after apply)
+       path                  = "/"
+       tags_all              = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       unique_id             = (known after apply)
    }

  # module.lambda_function-cpfValidation.aws_iam_role_policy_attachment.additional_one[0] will be created
+   resource "aws_iam_role_policy_attachment" "additional_one" {
+       id         = (known after apply)
+       policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
+       role       = "lambda-role-cpfValidation"
    }

  # module.lambda_function-cpfValidation.aws_iam_role_policy_attachment.logs[0] will be created
+   resource "aws_iam_role_policy_attachment" "logs" {
+       id         = (known after apply)
+       policy_arn = (known after apply)
+       role       = "lambda-role-cpfValidation"
    }

  # module.lambda_function-cpfValidation.aws_lambda_function.this[0] will be created
+   resource "aws_lambda_function" "this" {
+       architectures                  = [
+           "x86_64",
        ]
+       arn                            = (known after apply)
+       description                    = "Reacts to S3 events and validates CPF JSON files."
+       function_name                  = "cpf-validation"
+       handler                        = "index.handler"
+       id                             = (known after apply)
+       invoke_arn                     = (known after apply)
+       last_modified                  = (known after apply)
+       layers                         = [
+           "arn:aws:lambda:us-west-2:464622532012:layer:Datadog-Extension:51",
+           "arn:aws:lambda:us-west-2:464622532012:layer:Datadog-Node18-x:101",
        ]
+       memory_size                    = 128
+       package_type                   = "Zip"
+       publish                        = true
+       qualified_arn                  = (known after apply)
+       qualified_invoke_arn           = (known after apply)
+       reserved_concurrent_executions = -1
+       role                           = (known after apply)
+       runtime                        = "nodejs18.x"
+       s3_bucket                      = "cpfreporter-lambdaartifacts-357150818708-us-west-2"
+       s3_key                         = "cpfValidation.b1d7303d212a05c9e6bb7c868b81296b.zip"
+       signing_job_arn                = (known after apply)
+       signing_profile_version_arn    = (known after apply)
+       skip_destroy                   = false
+       source_code_hash               = (known after apply)
+       source_code_size               = (known after apply)
+       tags_all                       = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       timeout                        = 3
+       version                        = (known after apply)

+       ephemeral_storage {
+           size = 512
        }

+       timeouts {}

+       vpc_config {
+           ipv6_allowed_for_dual_stack = false
+           security_group_ids          = [
+               "sg-088d54ce85f679ac1",
+               "sg-0ac4f2c8cfc0c58bc",
            ]
+           subnet_ids                  = (sensitive value)
+           vpc_id                      = (known after apply)
        }
    }

  # module.lambda_function-excelToJson.aws_iam_policy.logs[0] will be created
+   resource "aws_iam_policy" "logs" {
+       arn         = (known after apply)
+       id          = (known after apply)
+       name        = "lambda-role-excelToJson-logs"
+       name_prefix = (known after apply)
+       path        = "/"
+       policy      = jsonencode(
            {
+               Statement = [
+                   {
+                       Action   = [
+                           "logs:PutLogEvents",
+                           "logs:CreateLogStream",
+                           "logs:CreateLogGroup",
                        ]
+                       Effect   = "Allow"
+                       Resource = [
+                           "arn:aws:logs:us-west-2:357150818708:log-group:/aws/lambda/excel-to-json:*:*",
+                           "arn:aws:logs:us-west-2:357150818708:log-group:/aws/lambda/excel-to-json:*",
                        ]
                    },
                ]
+               Version   = "2012-10-17"
            }
        )
+       policy_id   = (known after apply)
+       tags_all    = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
    }

  # module.lambda_function-excelToJson.aws_iam_role.lambda[0] will be created
+   resource "aws_iam_role" "lambda" {
+       arn                   = (known after apply)
+       assume_role_policy    = jsonencode(
            {
+               Statement = [
+                   {
+                       Action    = "sts:AssumeRole"
+                       Effect    = "Allow"
+                       Principal = {
+                           Service = "lambda.amazonaws.com"
                        }
                    },
                ]
+               Version   = "2012-10-17"
            }
        )
+       create_date           = (known after apply)
+       force_detach_policies = true
+       id                    = (known after apply)
+       managed_policy_arns   = (known after apply)
+       max_session_duration  = 3600
+       name                  = "lambda-role-excelToJson"
+       name_prefix           = (known after apply)
+       path                  = "/"
+       tags_all              = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       unique_id             = (known after apply)
    }

  # module.lambda_function-excelToJson.aws_iam_role_policy_attachment.additional_one[0] will be created
+   resource "aws_iam_role_policy_attachment" "additional_one" {
+       id         = (known after apply)
+       policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
+       role       = "lambda-role-excelToJson"
    }

  # module.lambda_function-excelToJson.aws_iam_role_policy_attachment.logs[0] will be created
+   resource "aws_iam_role_policy_attachment" "logs" {
+       id         = (known after apply)
+       policy_arn = (known after apply)
+       role       = "lambda-role-excelToJson"
    }

  # module.lambda_function-excelToJson.aws_lambda_function.this[0] will be created
+   resource "aws_lambda_function" "this" {
+       architectures                  = [
+           "x86_64",
        ]
+       arn                            = (known after apply)
+       description                    = "Reacts to S3 events and converts Excel files to JSON."
+       function_name                  = "excel-to-json"
+       handler                        = "index.handler"
+       id                             = (known after apply)
+       invoke_arn                     = (known after apply)
+       last_modified                  = (known after apply)
+       layers                         = [
+           "arn:aws:lambda:us-west-2:464622532012:layer:Datadog-Extension:51",
+           "arn:aws:lambda:us-west-2:464622532012:layer:Datadog-Node18-x:101",
        ]
+       memory_size                    = 128
+       package_type                   = "Zip"
+       publish                        = true
+       qualified_arn                  = (known after apply)
+       qualified_invoke_arn           = (known after apply)
+       reserved_concurrent_executions = -1
+       role                           = (known after apply)
+       runtime                        = "nodejs18.x"
+       s3_bucket                      = "cpfreporter-lambdaartifacts-357150818708-us-west-2"
+       s3_key                         = "excelToJson.20739793d622992f3eae2ba77a6afbb0.zip"
+       signing_job_arn                = (known after apply)
+       signing_profile_version_arn    = (known after apply)
+       skip_destroy                   = false
+       source_code_hash               = (known after apply)
+       source_code_size               = (known after apply)
+       tags_all                       = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       timeout                        = 3
+       version                        = (known after apply)

+       ephemeral_storage {
+           size = 512
        }

+       timeouts {}

+       vpc_config {
+           ipv6_allowed_for_dual_stack = false
+           security_group_ids          = [
+               "sg-088d54ce85f679ac1",
+               "sg-0ac4f2c8cfc0c58bc",
            ]
+           subnet_ids                  = (sensitive value)
+           vpc_id                      = (known after apply)
        }
    }

  # module.lambda_function-graphql.aws_lambda_function.this[0] will be updated in-place
  ~ resource "aws_lambda_function" "this" {
        id                             = "cpfreporter-graphql"
      ~ qualified_arn                  = "arn:aws:lambda:us-west-2:357150818708:function:cpfreporter-graphql:46" -> (known after apply)
      ~ qualified_invoke_arn           = "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:357150818708:function:cpfreporter-graphql:46/invocations" -> (known after apply)
        tags                           = {}
      ~ version                        = "46" -> (known after apply)
        # (21 unchanged attributes hidden)

      ~ environment {
          ~ variables = {
              ~ "DD_COMMIT_SHA"                      = "6514ba63fe5bffc58dda54d15f1993e17698c761" -> "676ccb9efaea612f207ed1b5551538c702b9cf46"
              ~ "DD_TAGS"                            = "git.commit.sha:6514ba63fe5bffc58dda54d15f1993e17698c761,git.repository_url:github.com/usdigitalresponse/cpf-reporter" -> "git.commit.sha:676ccb9efaea612f207ed1b5551538c702b9cf46,git.repository_url:github.com/usdigitalresponse/cpf-reporter"
              ~ "DD_VERSION"                         = "6514ba63fe5bffc58dda54d15f1993e17698c761" -> "676ccb9efaea612f207ed1b5551538c702b9cf46"
                # (16 unchanged elements hidden)
            }
        }

        # (4 unchanged blocks hidden)
    }

  # module.lambda_function-graphql.aws_lambda_permission.current_version_triggers["APIGateway"] must be replaced
-/+ resource "aws_lambda_permission" "current_version_triggers" {
      ~ id                  = "APIGateway" -> (known after apply)
      ~ qualifier           = "46" # forces replacement -> (known after apply) # forces replacement
+       statement_id_prefix = (known after apply)
        # (5 unchanged attributes hidden)
    }

Plan: 16 to add, 9 to change, 4 to destroy.

Pusher: @TylerHendrickson, Action: pull_request_target, Workflow: Continuous Integration

@@ -61,7 +62,7 @@ function getS3Client() {
export function uploadWorkbook(
upload: CreateUploadInput,
uploadId: number,
body: any
body: StreamingBlobPayloadInputTypes
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using types from @smithy/types as a more descriptive alternative.

This way, type-checkers can determine whether body values are compatible with the S3 PutObject operation.

@@ -70,8 +71,8 @@ export function uploadWorkbook(
async function sendPutObjectToS3Bucket(
bucketName: string,
key: string,
body: any
) {
body: StreamingBlobPayloadInputTypes
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above.

/**
* This function is a wrapper around the getSignedUrl function from the @aws-sdk/s3-request-presigner package.
* Exists to organize the imports and to make it easier to mock in tests.
*/

// eslint-disable-next-line @typescript-eslint/no-unused-vars
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function's signature doesn't appear to have any unused vars, so removed this pragma.

@@ -143,8 +143,7 @@ function getSQSClient() {
return sqs
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function's signature doesn't appear to have any unused vars, so removed this pragma.

@@ -154,7 +153,6 @@ async function sendSqsMessage(queueUrl: string, messageBody: any) {
)
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function's signature doesn't appear to have any unused vars, so removed this pragma.

@@ -143,8 +143,7 @@ function getSQSClient() {
return sqs
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function sendSqsMessage(queueUrl: string, messageBody: any) {
async function sendSqsMessage(queueUrl: string, messageBody: unknown) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This post makes a compelling argument for preferring unknown over any for typing values that are passed through to JSON.stringify(), so decided to go with it.

@TylerHendrickson TylerHendrickson merged commit 373c873 into main Jan 8, 2024
19 checks passed
@TylerHendrickson TylerHendrickson deleted the feat/qa-reporting-enhancements branch January 8, 2024 21:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working documentation Improvements or additions to documentation enhancement New feature or request github infra javascript terraform
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants