Skip to content

2026-04-10 | MAIN --> PROD | DEV (bda36b2) --> STAGING#5543

Merged
neilmb merged 3 commits into
prodfrom
main
Apr 10, 2026
Merged

2026-04-10 | MAIN --> PROD | DEV (bda36b2) --> STAGING#5543
neilmb merged 3 commits into
prodfrom
main

Conversation

@neilmb
Copy link
Copy Markdown
Contributor

@neilmb neilmb commented Apr 10, 2026

This is an auto-generated pull request to merge main into prod for a staging release on 2026-04-10 with the last commit being merged as bda36b2

jperson1 and others added 3 commits April 9, 2026 15:31
* SAC Admin. Omit cog/over, add fiscal period end, latest transition date, and certifier email addresses

* Add certifying emails to the searchable fields
* Inclusive copying for resubmissions

* File views, upload and delete fixes

On upload, display the correct uploaded_by and removal link info

On delete, don't error due to `audit_audit` info being missing

* Gen info, omit access acheck in favor of the access required mixin

* A very standard linting commit.

* Revert some unhelpful scope creep.

This reverts commit 4115589.
* [RESUB] Resubmission Justification

* ignore

* linting

* testing

* revert package-lock

* rvert

* reverted

* changed

* changed back

* fixed cypress
@neilmb neilmb added autogenerated Automated pull request creation automerge Used for automated deployments labels Apr 10, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Terraform plan for production

Plan: 4 to add, 9 to change, 4 to destroy.
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
!~  update in-place
-/+ destroy and then create replacement
 <= read (data resources)

Terraform will perform the following actions:

  # module.production.cloudfoundry_network_policy.app-network-policy will be updated in-place
!~  resource "cloudfoundry_network_policy" "app-network-policy" {
!~      policies = [
!~          {
!~              destination_app = "f4024808-7dd3-4c34-baf9-e34c85ec6527" -> (known after apply)
#                (3 unchanged attributes hidden)
            },
#            (2 unchanged elements hidden)
        ]
    }

  # module.production.cloudfoundry_network_policy.clamav-network-policy will be updated in-place
!~  resource "cloudfoundry_network_policy" "clamav-network-policy" {
!~      policies = [
!~          {
!~              destination_app = "f4024808-7dd3-4c34-baf9-e34c85ec6527" -> (known after apply)
#                (3 unchanged attributes hidden)
            },
!~          {
!~              destination_app = "f4024808-7dd3-4c34-baf9-e34c85ec6527" -> (known after apply)
#                (3 unchanged attributes hidden)
            },
        ]
    }

  # module.production.cloudfoundry_network_policy.logshipper-network-policy will be updated in-place
!~  resource "cloudfoundry_network_policy" "logshipper-network-policy" {
!~      policies = [
!~          {
!~              destination_app = "f4024808-7dd3-4c34-baf9-e34c85ec6527" -> (known after apply)
!~              source_app      = "85f6e332-8ef0-4fa1-bcc4-ba5803231358" -> (known after apply)
#                (2 unchanged attributes hidden)
            },
        ]
    }

  # module.production.cloudfoundry_network_policy.scanner-network-policy will be updated in-place
!~  resource "cloudfoundry_network_policy" "scanner-network-policy" {
!~      policies = [
!~          {
!~              destination_app = "f4024808-7dd3-4c34-baf9-e34c85ec6527" -> (known after apply)
!~              source_app      = "c7d5a4a2-5eca-46e5-81f0-315381c5b873" -> (known after apply)
#                (2 unchanged attributes hidden)
            },
!~          {
!~              source_app      = "c7d5a4a2-5eca-46e5-81f0-315381c5b873" -> (known after apply)
#                (3 unchanged attributes hidden)
            },
        ]
    }

  # module.production.module.cg-logshipper.cloudfoundry_app.logshipper_app will be updated in-place
!~  resource "cloudfoundry_app" "logshipper_app" {
!~      created_at                  = "2025-04-21T20:52:46Z" -> (known after apply)
!~      enable_ssh                  = false -> (known after apply)
!~      id                          = "************************************" -> (known after apply)
!~      log_rate_limit_per_second   = "-1" -> (known after apply)
        name                        = "logshipper"
!~      readiness_health_check_type = "process" -> (known after apply)
!~      routes                      = [
-           {
-               protocol = "http1" -> null
-               route    = "fac-production-logshipper.app.cloud.gov" -> null
            },
        ] -> (known after apply)
!~      source_code_hash            = "09e5aa3225fb5ce9c29c4c55306d7b1e66c3503ad3bf3eaec0d13bcb631959f8" -> "ee914a5b630832df35a161424fddbf5afd9e1136dc2f6df5f6ed9c71aeccefb3"
!~      stack                       = "cflinuxfs4" -> (known after apply)
!~      updated_at                  = "2026-04-09T16:01:59Z" -> (known after apply)
#        (12 unchanged attributes hidden)
    }

  # module.production.module.cg-logshipper.cloudfoundry_route.logshipper_route will be updated in-place
!~  resource "cloudfoundry_route" "logshipper_route" {
!~      destinations = [
-           {
-               app_id           = "85f6e332-8ef0-4fa1-bcc4-ba5803231358" -> null
-               app_process_type = "web" -> null
-               id               = "92e80372-ae8a-4f64-86e4-11727a2d766d" -> null
-               port             = 8080 -> null
-               protocol         = "http1" -> null
            },
+           {
+               app_id           = (known after apply)
+               app_process_type = (known after apply)
+               id               = (known after apply)
+               port             = (known after apply)
+               protocol         = (known after apply)
            },
        ]
        id           = "bac6e24a-a79d-48d6-b96e-05fee20c0539"
!~      updated_at   = "2025-04-21T20:53:39Z" -> (known after apply)
#        (6 unchanged attributes hidden)
    }

  # module.production.module.cors.null_resource.cors_header must be replaced
-/+ resource "null_resource" "cors_header" {
!~      id       = "*******************" -> (known after apply)
!~      triggers = { # forces replacement
!~          "always_run" = "2026-04-09T14:46:14Z" -> (known after apply)
        }
    }

  # module.production.module.fac-file-scanner.data.cloudfoundry_domain.internal will be read during apply
  # (depends on a resource or a module with changes pending)
 <= data "cloudfoundry_domain" "internal" {
+       annotations         = (known after apply)
+       created_at          = (known after apply)
+       id                  = (known after apply)
+       internal            = (known after apply)
+       labels              = (known after apply)
+       name                = "apps.internal"
+       org                 = (known after apply)
+       router_group        = (known after apply)
+       shared_orgs         = (known after apply)
+       supported_protocols = (known after apply)
+       updated_at          = (known after apply)
    }

  # module.production.module.fac-file-scanner.data.external.scannerzip will be read during apply
  # (depends on a resource or a module with changes pending)
 <= data "external" "scannerzip" {
+       id          = (known after apply)
+       program     = [
+           "/bin/sh",
+           "prepare-scanner.sh",
        ]
+       query       = {
+           "gitref" = "refs/heads/main"
        }
+       result      = (known after apply)
+       working_dir = "../shared/modules/scanner"
    }

  # module.production.module.fac-file-scanner.cloudfoundry_app.scanner_app will be updated in-place
!~  resource "cloudfoundry_app" "scanner_app" {
!~      created_at                  = "2025-04-21T20:53:41Z" -> (known after apply)
!~      enable_ssh                  = false -> (known after apply)
!~      id                          = "************************************" -> (known after apply)
!~      log_rate_limit_per_second   = "-1" -> (known after apply)
        name                        = "fac-file-scanner"
!~      path                        = "../shared/modules/scanner/scanner.zip" -> (known after apply)
!~      readiness_health_check_type = "process" -> (known after apply)
!~      routes                      = [
-           {
-               protocol = "http1" -> null
-               route    = "fac-file-scanner-production.apps.internal" -> null
            },
        ] -> (known after apply)
!~      source_code_hash            = "faad8f44eb77d23fa63a13c3a20d9995d6165fb6be7f5da6dd72699a0eb955c8" -> (known after apply)
!~      stack                       = "cflinuxfs4" -> (known after apply)
!~      updated_at                  = "2026-04-01T17:17:40Z" -> (known after apply)
#        (11 unchanged attributes hidden)
    }

  # module.production.module.fac-file-scanner.cloudfoundry_route.scanner_route must be replaced
-/+ resource "cloudfoundry_route" "scanner_route" {
!~      created_at   = "2026-04-01T17:17:41Z" -> (known after apply)
!~      destinations = [
-           {
-               app_id           = "c7d5a4a2-5eca-46e5-81f0-315381c5b873" -> null
-               app_process_type = "web" -> null
-               id               = "fc3ec9d4-8d75-43c8-ba61-9b5f87282670" -> null
-               port             = 8080 -> null
-               protocol         = "http1" -> null
            },
+           {
+               app_id           = (known after apply)
+               app_process_type = (known after apply)
+               id               = (known after apply)
+               port             = (known after apply)
+               protocol         = (known after apply)
            },
        ]
!~      domain       = "26df58ef-0c0d-4997-b68b-8defb7b3998b" -> (known after apply) # forces replacement
!~      id           = "************************************" -> (known after apply)
!~      protocol     = "http" -> (known after apply)
!~      updated_at   = "2026-04-01T17:17:41Z" -> (known after apply)
!~      url          = "fac-file-scanner-production.apps.internal" -> (known after apply)
#        (2 unchanged attributes hidden)
    }

  # module.production.module.https-proxy.cloudfoundry_app.egress_app must be replaced
-/+ resource "cloudfoundry_app" "egress_app" {
!~      created_at                  = "2026-04-01T17:15:13Z" -> (known after apply)
!~      disk_quota                  = "2048M" -> (known after apply)
!~      enable_ssh                  = false -> (known after apply)
!~      health_check_type           = "port" -> (known after apply)
!~      id                          = "************************************" -> (known after apply)
!~      log_rate_limit_per_second   = "-1" -> (known after apply)
        name                        = "https-proxy"
!~      readiness_health_check_type = "process" -> (known after apply)
!~      routes                      = [
-           {
-               protocol = "http1" -> null
-               route    = "gsa-tts-oros-fac-production-egress-https-proxy.apps.internal" -> null
            },
        ] -> (known after apply)
+       service_bindings            = (known after apply) # forces replacement
!~      source_code_hash            = "9b3e2a98210a05dcee7a895a07334238f27415365f95d475d118140d282f3010" -> "4855648c520f8b06119913d47f061969e29b99a4cbd6b718689eb28616b8c961"
!~      stack                       = "cflinuxfs4" -> (known after apply)
!~      updated_at                  = "2026-04-09T16:01:49Z" -> (known after apply)
#        (9 unchanged attributes hidden)
    }

  # module.production.module.https-proxy.cloudfoundry_route.egress_route will be updated in-place
!~  resource "cloudfoundry_route" "egress_route" {
!~      destinations = [
-           {
-               app_id           = "f4024808-7dd3-4c34-baf9-e34c85ec6527" -> null
-               app_process_type = "web" -> null
-               id               = "a45617d2-f6f2-4a2a-ae36-d29d9e17cb90" -> null
-               port             = 8080 -> null
-               protocol         = "http1" -> null
            },
+           {
+               app_id           = (known after apply)
+               app_process_type = (known after apply)
+               id               = (known after apply)
+               port             = (known after apply)
+               protocol         = (known after apply)
            },
        ]
        id           = "456570fe-c30a-4ed5-a2ef-ab3f768e617a"
!~      updated_at   = "2026-04-01T17:15:28Z" -> (known after apply)
#        (6 unchanged attributes hidden)
    }

  # module.production.module.fac-file-scanner.module.quarantine.data.cloudfoundry_service_plans.s3 will be read during apply
  # (depends on a resource or a module with changes pending)
 <= data "cloudfoundry_service_plans" "s3" {
+       name                  = "basic"
+       service_offering_name = "s3"
+       service_plans         = (known after apply)
    }

  # module.production.module.fac-file-scanner.module.quarantine.cloudfoundry_service_instance.bucket will be updated in-place
!~  resource "cloudfoundry_service_instance" "bucket" {
+       dashboard_url     = (known after apply)
        id                = "ca564d14-b89a-4944-a43f-033dca62ab30"
!~      last_operation    = {
!~          created_at  = "2025-03-14T15:36:40Z" -> (known after apply)
+           description = (known after apply)
!~          state       = "succeeded" -> (known after apply)
!~          type        = "update" -> (known after apply)
!~          updated_at  = "2025-03-14T15:36:40Z" -> (known after apply)
        } -> (known after apply)
!~      maintenance_info  = {
+           description = (known after apply)
+           version     = (known after apply)
        } -> (known after apply)
        name              = "fac-file-scanner-quarantine"
!~      service_plan      = "021bb2a3-7e11-4fc2-b06b-d9f5938cd806" -> (known after apply)
        tags              = [
            "s3",
            "terraform-cloudgov-managed",
        ]
!~      updated_at        = "2025-03-14T15:36:40Z" -> (known after apply)
!~      upgrade_available = false -> (known after apply)
#        (3 unchanged attributes hidden)
    }

  # module.production.module.file_scanner_clamav.module.route.data.cloudfoundry_domain.domain will be read during apply
  # (depends on a resource or a module with changes pending)
 <= data "cloudfoundry_domain" "domain" {
+       annotations         = (known after apply)
+       created_at          = (known after apply)
+       id                  = (known after apply)
+       internal            = (known after apply)
+       labels              = (known after apply)
+       name                = "apps.internal"
+       org                 = (known after apply)
+       router_group        = (known after apply)
+       shared_orgs         = (known after apply)
+       supported_protocols = (known after apply)
+       updated_at          = (known after apply)
    }

  # module.production.module.file_scanner_clamav.module.route.data.cloudfoundry_org.org will be read during apply
  # (depends on a resource or a module with changes pending)
 <= data "cloudfoundry_org" "org" {
+       annotations = (known after apply)
+       created_at  = (known after apply)
+       id          = (known after apply)
+       labels      = (known after apply)
+       name        = "gsa-tts-oros-fac"
+       quota       = (known after apply)
+       suspended   = (known after apply)
+       updated_at  = (known after apply)
    }

  # module.production.module.file_scanner_clamav.module.route.data.cloudfoundry_space.space will be read during apply
  # (config refers to values not yet known)
 <= data "cloudfoundry_space" "space" {
+       allow_ssh         = (known after apply)
+       annotations       = (known after apply)
+       created_at        = (known after apply)
+       id                = (known after apply)
+       isolation_segment = (known after apply)
+       labels            = (known after apply)
+       name              = "production"
+       org               = (known after apply)
+       quota             = (known after apply)
+       updated_at        = (known after apply)
    }

  # module.production.module.file_scanner_clamav.module.route.cloudfoundry_route.app_route must be replaced
-/+ resource "cloudfoundry_route" "app_route" {
!~      created_at   = "2026-04-01T17:17:42Z" -> (known after apply)
!~      destinations = [
-           {
-               app_id           = "f60f73bd-5628-4a57-8552-021a524c0c95" -> null
-               app_process_type = "web" -> null
-               id               = "fc866bee-5020-48fa-bc26-aaba9842d17d" -> null
-               port             = 8080 -> null
-               protocol         = "http1" -> null
            },
+           {
+               app_id           = "************************************"
+               app_process_type = (known after apply)
+               id               = (known after apply)
+               port             = (known after apply)
+               protocol         = (known after apply)
            },
        ]
!~      domain       = "26df58ef-0c0d-4997-b68b-8defb7b3998b" -> (known after apply) # forces replacement
!~      id           = "************************************" -> (known after apply)
!~      protocol     = "http" -> (known after apply)
!~      space        = "5593dba8-7023-49a5-bdbe-e809fe23edf9" -> (known after apply) # forces replacement
!~      updated_at   = "2026-04-01T17:17:42Z" -> (known after apply)
!~      url          = "fac-av-production-fs.apps.internal" -> (known after apply)
#        (1 unchanged attribute hidden)
    }

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

📝 Plan generated in Pull Request Checks #739

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 10, 2026

Terraform plan for staging

Plan: 1 to add, 0 to change, 1 to destroy.
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # module.staging.module.cors.null_resource.cors_header must be replaced
-/+ resource "null_resource" "cors_header" {
!~      id       = "*******************" -> (known after apply)
!~      triggers = { # forces replacement
!~          "always_run" = "2026-04-08T19:05:28Z" -> (known after apply)
        }
    }

Plan: 1 to add, 0 to change, 1 to destroy.

✅ Plan applied in Deploy to the Staging Environment #453

@github-actions
Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Health
. 100% 100%
api 98% 86%
api.serializers 97% 88%
api.views 91% 96%
audit 95% 80%
audit.cross_validation 97% 86%
audit.fixtures 84% 50%
audit.formlib 92% 62%
audit.intakelib 89% 83%
audit.intakelib.checks 92% 86%
audit.intakelib.common 98% 82%
audit.intakelib.transforms 100% 95%
audit.management.commands 78% 17%
audit.migrations 100% 100%
audit.models 91% 68%
audit.templatetags 100% 100%
audit.test_viewlib 100% 100%
audit.views 75% 52%
census_historical_migration 96% 65%
census_historical_migration.migrations 100% 100%
census_historical_migration.sac_general_lib 92% 84%
census_historical_migration.transforms 95% 90%
census_historical_migration.workbooklib 68% 69%
config 78% 37%
curation 98% 100%
curation.curationlib 88% 72%
curation.migrations 100% 100%
dissemination 90% 69%
dissemination.analytics 27% 0%
dissemination.forms 80% 30%
dissemination.migrations 97% 25%
dissemination.models 100% 100%
dissemination.report_generation 21% 0%
dissemination.report_generation.excel 32% 0%
dissemination.searchlib 61% 43%
dissemination.templatetags 52% 6%
dissemination.views 67% 47%
djangooidc 53% 38%
djangooidc.tests 100% 94%
report_submission 100% 96%
report_submission.migrations 100% 100%
report_submission.templatetags 74% 100%
report_submission.views 77% 61%
support 94% 75%
support.migrations 100% 100%
support.models 90% 50%
tools 98% 50%
users 95% 86%
users.fixtures 100% 83%
users.management 100% 100%
users.management.commands 100% 100%
users.migrations 100% 100%
Summary 89% (22134 / 24966) 69% (2703 / 3922)

Minimum allowed line rate is 85%

@neilmb neilmb merged commit 5a86ce7 into prod Apr 10, 2026
62 of 65 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autogenerated Automated pull request creation automerge Used for automated deployments

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants