GSA-TTS / FAC

GSA's Federal Audit Clearinghouse
Other
18 stars 5 forks source link

2024-06-26 | MAIN --> PROD | DEV (506e258) --> STAGING #4022

Closed jadudm closed 6 days ago

jadudm commented 6 days ago

This is an auto-generated pull request to merge main into prod for a staging release on 2024-06-26 with the last commit being merged as 506e258

github-actions[bot] commented 6 days ago

Terraform plan for staging

No changes. Your infrastructure matches the configuration. ``` No changes. Your infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed. Warning: Argument is deprecated with module.staging-backups-bucket.cloudfoundry_service_instance.bucket, on /tmp/terraform-data-dir/modules/staging-backups-bucket/s3/main.tf line 14, in resource "cloudfoundry_service_instance" "bucket": 14: recursive_delete = var.recursive_delete Since CF API v3, recursive delete is always done on the cloudcontroller side. This will be removed in future releases (and 6 more similar warnings elsewhere) ```

:white_check_mark: Plan applied in Deploy to Staging Environment #230

github-actions[bot] commented 6 days ago

Terraform plan for production

Plan: 12 to add, 5 to change, 2 to destroy. ```diff Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create !~ update in-place -/+ destroy and then create replacement <= read (data resources) Terraform will perform the following actions: # module.production.cloudfoundry_app.postgrest will be updated in-place !~ resource "cloudfoundry_app" "postgrest" { !~ docker_image = "ghcr.io/gsa-tts/fac/postgrest@sha256:4b903ac223ea5f583bd870a328a3cf54d19267e5b5abfff896863b37f7cb68b6" -> "ghcr.io/gsa-tts/fac/postgrest@sha256:08852a35ccf68490cf974e2b1a47d19480457c24b2244fa9f302ed785bd89462" id = "70ac44be-3507-4867-a75f-c2d1ab12ee89" name = "postgrest" # (17 unchanged attributes hidden) # (1 unchanged block hidden) } # module.production.cloudfoundry_network_policy.logshipper-network-policy will be updated in-place !~ resource "cloudfoundry_network_policy" "logshipper-network-policy" { id = "63155665-aac2-9f9d-6c0f-c98cdcec4047" + policy { + destination_app = "5e81ca8b-99cf-41f8-ae42-76652d51a44c" + port = "61443" + protocol = "tcp" + source_app = (known after apply) } } # module.production.module.cg-logshipper.cloudfoundry_app.cg_logshipper_app will be created + resource "cloudfoundry_app" "cg_logshipper_app" { + buildpack = (known after apply) + buildpacks = [ + "https://github.com/cloudfoundry/apt-buildpack", + "nginx_buildpack", ] + disk_quota = 256 + enable_ssh = (known after apply) + environment = (sensitive value) + health_check_http_endpoint = (known after apply) + health_check_invocation_timeout = (known after apply) + health_check_timeout = (known after apply) + health_check_type = "process" + id = (known after apply) + id_bg = (known after apply) + instances = 1 + memory = 256 + name = "logshipper" + path = "../shared/modules/cg-logshipper/logshipper.zip" + ports = (known after apply) + space = "5593dba8-7023-49a5-bdbe-e809fe23edf9" + stack = (known after apply) + stopped = false + strategy = "rolling" + timeout = 180 + routes { + port = (known after apply) + route = (known after apply) } + service_binding { + service_instance = "e0ea8338-12fd-4f46-80a4-881f1964b42e" } + service_binding { + service_instance = "71fc4c29-c97f-4b0d-aad3-a771cbd70b6b" } + service_binding { + service_instance = "2f160a41-a7b7-417e-8856-f665e11b0d03" } } # module.production.module.cg-logshipper.cloudfoundry_route.logshipper will be created + resource "cloudfoundry_route" "logshipper" { + domain = "50ba3f69-cd54-4963-9172-14f3334b479e" + endpoint = (known after apply) + hostname = "fac-production-logshipper" + id = (known after apply) + port = (known after apply) + space = "5593dba8-7023-49a5-bdbe-e809fe23edf9" } # module.production.module.clamav.cloudfoundry_app.clamav_api will be updated in-place !~ resource "cloudfoundry_app" "clamav_api" { !~ docker_image = "ghcr.io/gsa-tts/fac/clamav@sha256:b0e61e765f6c9a861cb8a4fbcfbd1df3e45fcbfa7cd78cd67c16d2e540d5301d" -> "ghcr.io/gsa-tts/fac/clamav@sha256:ba95b2eab2464f762071de942b60190be73c901a17a143b234ac3a53dc947d68" id = "5d0afa4f-527b-472a-8671-79a60335417f" name = "fac-av-production" # (17 unchanged attributes hidden) # (1 unchanged block hidden) } # module.production.module.file_scanner_clamav.data.cloudfoundry_app.app will be read during apply # (config refers to values not yet known) <= data "cloudfoundry_app" "app" { + buildpack = (known after apply) + command = (known after apply) + disk_quota = (known after apply) + enable_ssh = (known after apply) + environment = (sensitive value) + health_check_http_endpoint = (known after apply) + health_check_timeout = (known after apply) + health_check_type = (known after apply) + id = (known after apply) + instances = (known after apply) + memory = (known after apply) + name = (known after apply) + name_or_id = "****************" + space = (known after apply) + stack = (known after apply) + state = (known after apply) } # module.production.module.file_scanner_clamav.data.cloudfoundry_domain.internal will be read during apply # (depends on a resource or a module with changes pending) <= data "cloudfoundry_domain" "internal" { + domain = (known after apply) + id = (known after apply) + internal = (known after apply) + name = "apps.internal" + org = (known after apply) } # module.production.module.file_scanner_clamav.data.cloudfoundry_space.space will be read during apply # (depends on a resource or a module with changes pending) <= data "cloudfoundry_space" "space" { + id = (known after apply) + name = "production" + org = (known after apply) + org_name = "gsa-tts-oros-fac" + quota = (known after apply) } # module.production.module.file_scanner_clamav.cloudfoundry_app.clamav_api must be replaced -/+ resource "cloudfoundry_app" "clamav_api" { + buildpack = (known after apply) !~ docker_image = "ghcr.io/gsa-tts/fac/clamav@sha256:b0e61e765f6c9a861cb8a4fbcfbd1df3e45fcbfa7cd78cd67c16d2e540d5301d" -> "ghcr.io/gsa-tts/fac/clamav@sha256:ba95b2eab2464f762071de942b60190be73c901a17a143b234ac3a53dc947d68" !~ enable_ssh = true -> (known after apply) + health_check_http_endpoint = (known after apply) !~ health_check_invocation_timeout = 0 -> (known after apply) !~ health_check_timeout = 0 -> (known after apply) !~ id = "************************************" -> (known after apply) !~ id_bg = "************************************" -> (known after apply) - labels = {} -> null name = "fac-av-production-fs" !~ ports = [] -> (known after apply) !~ space = "5593dba8-7023-49a5-bdbe-e809fe23edf9" # forces replacement -> (known after apply) # forces replacement + stack = (known after apply) # (8 unchanged attributes hidden) - routes { - port = 0 -> null - route = "e0fd7d4b-55fd-4188-aa9d-1a13b2462355" -> null } + routes { + port = (known after apply) + route = (known after apply) } } # module.production.module.file_scanner_clamav.cloudfoundry_network_policy.clamav_routing will be updated in-place !~ resource "cloudfoundry_network_policy" "clamav_routing" { id = "22404581-6620-4dc7-9fbb-207db75b10be" - policy { - destination_app = "a14bb29f-8276-4967-9754-cf9c4187ebe3" -> null - port = "61443" -> null - protocol = "tcp" -> null - source_app = "15290fef-8636-4e27-9b57-c86318f85cc8" -> null } + policy { + destination_app = (known after apply) + port = "61443" + protocol = "tcp" + source_app = (known after apply) } } # module.production.module.file_scanner_clamav.cloudfoundry_route.clamav_route must be replaced -/+ resource "cloudfoundry_route" "clamav_route" { !~ domain = "26df58ef-0c0d-4997-b68b-8defb7b3998b" # forces replacement -> (known after apply) # forces replacement !~ endpoint = "fac-av-production-fs.apps.internal" -> (known after apply) !~ id = "************************************" -> (known after apply) + port = (known after apply) !~ space = "5593dba8-7023-49a5-bdbe-e809fe23edf9" # forces replacement -> (known after apply) # forces replacement # (2 unchanged attributes hidden) } # module.production.module.https-proxy.cloudfoundry_app.egress_app will be updated in-place !~ resource "cloudfoundry_app" "egress_app" { id = "5e81ca8b-99cf-41f8-ae42-76652d51a44c" name = "https-proxy" !~ source_code_hash = "e246274fca627d48afccde010de949371f24b6c9974c48aa91044acd36654fa8" -> "9fcf4a7f6abfc9a220de2b8bb97591ab490a271ac0933b984f606f645319e1a4" # (21 unchanged attributes hidden) # (1 unchanged block hidden) } # module.production.module.newrelic.newrelic_alert_policy.alert_policy will be created + resource "newrelic_alert_policy" "alert_policy" { + account_id = (known after apply) + id = (known after apply) + incident_preference = "PER_POLICY" + name = "production-alert-policy" } # module.production.module.newrelic.newrelic_notification_channel.email_channel will be created + resource "newrelic_notification_channel" "email_channel" { + account_id = 3919076 + active = true + destination_id = (known after apply) + id = (known after apply) + name = "production_email_notification_channel" + product = "IINT" + status = (known after apply) + type = "EMAIL" + property { + key = "subject" + value = "{{issueTitle}}" # (2 unchanged attributes hidden) } } # module.production.module.newrelic.newrelic_notification_destination.email_destination will be created + resource "newrelic_notification_destination" "email_destination" { + account_id = 3919076 + active = true + guid = (known after apply) + id = (known after apply) + last_sent = (known after apply) + name = "email_destination" + status = (known after apply) + type = "EMAIL" + property { + key = "email" + value = "daniel.swick@gsa.gov, matthew.jadud@gsa.gov, alexander.steel@gsa.gov" # (2 unchanged attributes hidden) } } # module.production.module.newrelic.newrelic_nrql_alert_condition.error_transactions will be created + resource "newrelic_nrql_alert_condition" "error_transactions" { + account_id = 3919076 + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + enabled = true + entity_guid = (known after apply) + id = (known after apply) + name = "Error Transactions (%)" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above" + threshold = 5 + threshold_duration = 300 + threshold_occurrences = "all" } + nrql { + query = "SELECT percentage(count(*), WHERE error is true) FROM Transaction" } + warning { + operator = "above" + threshold = 3 + threshold_duration = 300 + threshold_occurrences = "all" } } # module.production.module.newrelic.newrelic_nrql_alert_condition.infected_file_found will be created + resource "newrelic_nrql_alert_condition" "infected_file_found" { + account_id = (known after apply) + aggregation_delay = "120" + aggregation_method = "event_flow" + aggregation_window = 60 + enabled = true + entity_guid = (known after apply) + fill_option = "static" + fill_value = 0 + id = (known after apply) + name = "Infected File Found!" + policy_id = (known after apply) + type = "static" + violation_time_limit = (known after apply) + violation_time_limit_seconds = 259200 + critical { + operator = "above_or_equals" + threshold = 1 + threshold_duration = 300 + threshold_occurrences = "at_least_once" } + nrql { + query = "SELECT count(*) FROM Log WHERE tags.space_name ='production' and message LIKE '%ScanResult.INFECTED%'" } } # module.production.module.newrelic.newrelic_one_dashboard.search_dashboard will be created + resource "newrelic_one_dashboard" "search_dashboard" { + account_id = (known after apply) + guid = (known after apply) + id = (known after apply) + name = "Search Dashboard (production)" + permalink = (known after apply) + permissions = "public_read_only" + page { + guid = (known after apply) + name = "Search" + widget_billboard { + column = 1 + height = 3 + id = (known after apply) + legend_enabled = true + row = 1 + title = "Searches Per Hour" + width = 3 + nrql_query { + account_id = (known after apply) + query = "SELECT count(*) as 'Total', rate(count(*), 1 minute) as 'Per Minute' FROM Transaction where request.uri like '%/dissemination/search%' and request.method = 'POST' and appName = 'gsa-fac-production' since 1 hours AGO COMPARE WITH 1 week ago" } } + widget_line { + column = 4 + height = 3 + id = (known after apply) + legend_enabled = true + row = 1 + title = "Search Traffic" + width = 6 + nrql_query { + account_id = (known after apply) + query = "SELECT count(*) FROM Transaction where request.uri like '%/dissemination/search%' and request.method = 'POST' and appName = 'gsa-fac-production' since 4 hours AGO COMPARE WITH 1 week ago TIMESERIES" } } + widget_line { + column = 1 + height = 3 + id = (known after apply) + legend_enabled = true + row = 2 + title = "Search Response Time" + width = 6 + nrql_query { + account_id = (known after apply) + query = "FROM Metric SELECT average(newrelic.timeslice.value) WHERE appName = 'gsa-fac-production' WITH METRIC_FORMAT 'Custom/search' TIMESERIES SINCE 1 day ago COMPARE WITH 1 week ago" } } } } # module.production.module.newrelic.newrelic_workflow.alert_workflow will be created + resource "newrelic_workflow" "alert_workflow" { + account_id = (known after apply) + destinations_enabled = true + enabled = true + enrichments_enabled = true + guid = (known after apply) + id = (known after apply) + last_run = (known after apply) + muting_rules_handling = "DONT_NOTIFY_FULLY_MUTED_ISSUES" + name = "production_alert_workflow" + workflow_id = (known after apply) + destination { + channel_id = (known after apply) + name = (known after apply) + notification_triggers = (known after apply) + type = (known after apply) } + issues_filter { + filter_id = (known after apply) + name = "filter" + type = "FILTER" + predicate { + attribute = "labels.policyIds" + operator = "EXACTLY_MATCHES" + values = (known after apply) } } } # module.production.module.snapshot-database.cloudfoundry_service_instance.rds will be created + resource "cloudfoundry_service_instance" "rds" { + id = (known after apply) + json_params = jsonencode( { + storage = 50 } ) + name = "fac-snapshot-db" + replace_on_params_change = false + replace_on_service_plan_change = false + service_plan = "58b899e8-eb36-441f-b406-d2f5b1e49c00" + space = "5593dba8-7023-49a5-bdbe-e809fe23edf9" + tags = [ + "rds", ] } Plan: 12 to add, 5 to change, 2 to destroy. Warning: Argument is deprecated with module.domain.cloudfoundry_service_instance.external_domain_instance, on /tmp/terraform-data-dir/modules/domain/domain/main.tf line 45, in resource "cloudfoundry_service_instance" "external_domain_instance": 45: recursive_delete = var.recursive_delete Since CF API v3, recursive delete is always done on the cloudcontroller side. This will be removed in future releases (and 6 more similar warnings elsewhere) ```

:white_check_mark: Plan applied in Deploy to Production Environment #93

github-actions[bot] commented 6 days ago

File Coverage Missing
All files 87% :white_check_mark:
api/serializers.py 88% :white_check_mark: 177-178 183 188
api/test_views.py 95% :white_check_mark: 103
api/uei.py 88% :white_check_mark: 87 118-119 163 167-168
api/views.py 98% :white_check_mark: 198-199 337-338
audit/forms.py 60% :x: 31-38 109-116
audit/intake_to_dissemination.py 88% :white_check_mark: 57-62 264 308-316
audit/mixins.py 96% :white_check_mark: 28
audit/test_commands.py 91% :white_check_mark:
audit/test_intakelib.py 88% :white_check_mark: 154-158
audit/test_manage_submission_access_view.py 98% :white_check_mark: 15 19
audit/test_mixins.py 90% :white_check_mark: 159-160 164-166 254-255 259-261
audit/test_validators.py 95% :white_check_mark: 439 443 611-612 851 858 865 872 1117-1118 1149-1150 1175-1180
audit/test_views.py 98% :white_check_mark: 132
audit/test_workbooks_should_fail.py 88% :white_check_mark: 58 87-88 92
audit/test_workbooks_should_pass.py 87% :white_check_mark: 59 74-76
audit/utils.py 86% :white_check_mark: 9 19 60-62 65
audit/validators.py 93% :white_check_mark: 138 190 279 419-420 435-436 519-520 622-626 631-635 651-660
audit/cross_validation/additional_ueis.py 93% :white_check_mark: 33
audit/cross_validation/check_award_ref_declaration.py 90% :white_check_mark:
audit/cross_validation/check_award_reference_uniqueness.py 93% :white_check_mark:
audit/cross_validation/check_certifying_contacts.py 87% :white_check_mark:
audit/cross_validation/check_findings_count_consistency.py 87% :white_check_mark: 35
audit/cross_validation/check_ref_number_in_cap.py 91% :white_check_mark:
audit/cross_validation/check_ref_number_in_findings_text.py 91% :white_check_mark:
audit/cross_validation/errors.py 78% :x: 30 77
audit/cross_validation/naming.py 93% :white_check_mark: 229
audit/cross_validation/submission_progress_check.py 91% :white_check_mark: 83 126 174 182-183
audit/cross_validation/tribal_data_sharing_consent.py 81% :x: 33 36 40
audit/cross_validation/validate_general_information.py 65% :x: 77 81-84 96 99
audit/fixtures/dissemination.py 71% :x: 38
audit/fixtures/single_audit_checklist.py 55% :x: 160-197 245-254
audit/intakelib/exceptions.py 71% :x: 7-9 12
audit/intakelib/intermediate_representation.py 91% :white_check_mark: 27-28 73 91 129 200-203 212-213 283-284
audit/intakelib/mapping_audit_findings.py 97% :white_check_mark: 55
audit/intakelib/mapping_audit_findings_text.py 97% :white_check_mark: 54
audit/intakelib/mapping_federal_awards.py 93% :white_check_mark: 92
audit/intakelib/mapping_util.py 79% :x: 21 25 29 63 99 104-105 114-120 130 145 150
audit/intakelib/checks/check_all_unique_award_numbers.py 79% :x: 24
audit/intakelib/checks/check_cluster_names.py 75% :x: 20-25
audit/intakelib/checks/check_cluster_total.py 95% :white_check_mark: 99
audit/intakelib/checks/check_finding_reference_pattern.py 74% :x: 34 44-45
audit/intakelib/checks/check_findings_grid_validation.py 89% :white_check_mark: 59
audit/intakelib/checks/check_has_all_the_named_ranges.py 95% :white_check_mark: 66
audit/intakelib/checks/check_is_a_workbook.py 69% :x: 20
audit/intakelib/checks/check_loan_balance_entries.py 83% :x: 28
audit/intakelib/checks/check_look_for_empty_rows.py 91% :white_check_mark: 18
audit/intakelib/checks/check_no_major_program_no_type.py 76% :x: 18 27
audit/intakelib/checks/check_no_repeat_findings.py 88% :white_check_mark: 21
audit/intakelib/checks/check_other_cluster_names.py 81% :x: 23 33
audit/intakelib/checks/check_passthrough_name_when_no_direct.py 83% :x: 11 49 58
audit/intakelib/checks/check_sequential_award_numbers.py 82% :x: 25 35
audit/intakelib/checks/check_start_and_end_rows_of_all_columns_are_same.py 89% :white_check_mark: 14
audit/intakelib/checks/check_state_cluster_names.py 81% :x: 23 33
audit/intakelib/checks/check_version_number.py 73% :x: 30 40-41
audit/intakelib/checks/runners.py 95% :white_check_mark: 187 217
audit/intakelib/common/util.py 90% :white_check_mark: 22 39
audit/intakelib/transforms/xform_rename_additional_notes_sheet.py 81% :x: 14
audit/management/commands/load_fixtures.py 47% :x: 40-46
audit/models/models.py 85% :white_check_mark: 58 60 65 67 209 215 227 239-242 260 437 455-456 464 486 584-585 589 597 606 612
audit/views/audit_info_form_view.py 27% :x: 25-74 77-117 120-137
audit/views/manage_submission.py 86% :white_check_mark: 73-80
audit/views/manage_submission_access.py 98% :white_check_mark: 113-114
audit/views/pre_dissemination_download_view.py 78% :x: 15-16 21-22 29-39
audit/views/submission_progress_view.py 89% :white_check_mark: 117 182-183
audit/views/tribal_data_consent.py 34% :x: 23-41 44-79
audit/views/unlock_after_certification.py 57% :x: 28-51 73-87
audit/views/upload_report_view.py 26% :x: 32-35 44 91-117 120-170 178-209
audit/views/views.py 53% :x: 74 81-100 123-124 198-199 220-230 257 268-269 280-281 283-287 329-342 345-359 364-377 394-400 405-425 452-456 461-490 533-537 542-562 589-593 598-627 670-674 679-691 694-704 709-721 754-768
census_historical_migration/change_record.py 98% :white_check_mark: 30
census_historical_migration/end_to_end_core.py 26% :x: 57-89 93-111 116-155 161-187 246-258 263 273-307
census_historical_migration/invalid_record.py 94% :white_check_mark: 50 54 58 62 66
census_historical_migration/migration_result.py 75% :x: 17 21 25 29 33-42 46
census_historical_migration/report_type_flag.py 96% :white_check_mark: 19
census_historical_migration/test_federal_awards_xforms.py 99% :white_check_mark: 219-220
census_historical_migration/sac_general_lib/audit_information.py 91% :white_check_mark: 28 82-87 336
census_historical_migration/sac_general_lib/cognizant_oversight.py 68% :x: 11
census_historical_migration/sac_general_lib/general_information.py 86% :white_check_mark: 166-167 177-178 186-187 195-200 233-255 354-355
census_historical_migration/sac_general_lib/sac_creator.py 90% :white_check_mark: 34
census_historical_migration/sac_general_lib/utils.py 84% :x: 35 62-71
census_historical_migration/transforms/xform_remove_hyphen_and_pad_zip.py 92% :white_check_mark: 18
census_historical_migration/transforms/xform_retrieve_uei.py 67% :x: 10
census_historical_migration/transforms/xform_string_to_bool.py 87% :white_check_mark: 17
census_historical_migration/workbooklib/additional_eins.py 84% :x: 58-60 67-77
census_historical_migration/workbooklib/additional_ueis.py 77% :x: 27-29 36-46
census_historical_migration/workbooklib/corrective_action_plan.py 46% :x: 49-51 65 93-125 134-153
census_historical_migration/workbooklib/excel_creation_utils.py 69% :x: 110 119-124 129-136 140-158 171-175 189-192
census_historical_migration/workbooklib/federal_awards.py 77% :x: 181-184 262-301 487 554-562 572-597 621-622 918-1022
census_historical_migration/workbooklib/findings.py 69% :x: 81-86 154-174 179-199 216-218 330-354
census_historical_migration/workbooklib/findings_text.py 46% :x: 50-51 67 97-129 138-160
census_historical_migration/workbooklib/notes_to_sefa.py 66% :x: 34-38 101-102 104-105 107-108 136-143 152-160 168-170 279-326
census_historical_migration/workbooklib/post_upload_utils.py 21% :x: 22-35 66-83 89-111
census_historical_migration/workbooklib/secondary_auditors.py 88% :white_check_mark: 128-130 186-205
census_historical_migration/workbooklib/workbook_builder.py 38% :x: 14-17 26-41
census_historical_migration/workbooklib/workbook_builder_loader.py 41% :x: 18-30
config/error_handlers.py 94% :white_check_mark: 22
config/test_settings.py 92% :white_check_mark: 33-34 49-50
config/urls.py 72% :x: 88
dissemination/file_downloads.py 81% :x: 43-61 91-93
dissemination/forms.py 87% :white_check_mark: 135 144 255
dissemination/search.py 88% :white_check_mark: 113 115 119 127-128
dissemination/summary_reports.py 78% :x: 274 300-302 306-310 421 438 459 511-575 603 638-640 664-672
dissemination/test_search.py 93% :white_check_mark: 51-66 473-474 579-596 608-632 644-669 677-693
dissemination/test_summary_reports.py 98% :white_check_mark:
dissemination/views.py 75% :x: 134 140-142 159-225 268 298 300 336 387 389 391 469-474
dissemination/migrations/0002_general_fac_accepted_date.py 47% :x: 10-12
dissemination/searchlib/search_alns.py 37% :x: 44-58 78-110 115-177 184-187
dissemination/searchlib/search_direct_funding.py 86% :white_check_mark: 21-22
dissemination/searchlib/search_findings.py 76% :x: 18-24 34 36 38
dissemination/searchlib/search_general.py 96% :white_check_mark: 138
dissemination/searchlib/search_passthrough_name.py 35% :x: 21-31
djangooidc/backends.py 78% :x: 32 57-63
djangooidc/exceptions.py 66% :x: 19 21 23 28
djangooidc/oidc.py 16% :x: 32-35 45-51 64-70 92-149 153-199 203-226 230-275 280-281 286
djangooidc/views.py 81% :x: 22 43 109-110 117
djangooidc/tests/common.py 97% :white_check_mark:
report_submission/forms.py 92% :white_check_mark: 35
report_submission/test_views.py 98% :white_check_mark: 835
report_submission/views.py 79% :x: 97 250 274-275 280-281 321-491 494-504 563 599-601 609-610 613-615
report_submission/templatetags/get_attr.py 76% :x: 8 11-14 18
support/admin.py 88% :white_check_mark: 76 79 84 91-97 100-102
support/cog_over.py 91% :white_check_mark: 29-32 92 116-120 156
support/test_admin_api.py 81% :x: 23 147-148 237-238 317-318
support/test_cog_over.py 98% :white_check_mark: 174-175 264
support/management/commands/seed_cog_baseline.py 98% :white_check_mark: 20-21
support/models/cog_over.py 89% :white_check_mark: 103-104
tools/update_program_data.py 89% :white_check_mark: 96
users/admin.py 99% :white_check_mark: 27
users/auth.py 96% :white_check_mark: 58-59
users/models.py 96% :white_check_mark: 18 74-75
users/fixtures/user_fixtures.py 91% :white_check_mark:

Minimum allowed coverage is 85%

Generated by :monkey: cobertura-action against 506e25806bf40f564745f9396c6015a821fdd168