Skip to content

Add requirement type and expression to compliance_requirements

What does this MR do and why?

Adding following columns to compliance_requirements table:

  1. requirement_type: It will be internal only for now.
  2. control_expression: It will be a text field which will store a json object for now.

This MR also has changes in the model corresponding to columns addition and validation of control expression json via json schema which adheres to https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/compliance-adherence-reporting/decisions/003_custom_controls/.

Corresponding changes for the above fields are also added in the existing create mutation for the compliance requirement.

MR acceptance checklist

Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Database


### up

bundle exec rake db:migrate:up:main VERSION=20241014154409
main: == [advisory_lock_connection] object_id: 129060, pg_backend_pid: 57752
main: == 20241014154409 AddColumnsTypeExpressionToComplianceRequirements: migrating =
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- add_column(:compliance_requirements, :control_expression, :text, {:if_not_exists=>true})
main:    -> 0.0214s
main: -- add_column(:compliance_requirements, :requirement_type, :smallint, {:null=>false, :default=>0, :if_not_exists=>true})
main:    -> 0.0043s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE compliance_requirements\nADD CONSTRAINT check_be5c3cfc16\nCHECK ( char_length(control_expression) <= 2048 )\nNOT VALID;\n")
main:    -> 0.0013s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0003s
main: -- execute("ALTER TABLE compliance_requirements VALIDATE CONSTRAINT check_be5c3cfc16;")
main:    -> 0.0019s
main: -- execute("RESET statement_timeout")
main:    -> 0.0004s
main: == 20241014154409 AddColumnsTypeExpressionToComplianceRequirements: migrated (0.0561s)

main: == [advisory_lock_connection] object_id: 129060, pg_backend_pid: 57752


### down

bundle exec rake db:migrate:down:main VERSION=20241014154409
main: == [advisory_lock_connection] object_id: 129080, pg_backend_pid: 58818
main: == 20241014154409 AddColumnsTypeExpressionToComplianceRequirements: reverting =
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- remove_column(:compliance_requirements, :control_expression, {:if_exists=>true})
main:    -> 0.0335s
main: -- remove_column(:compliance_requirements, :requirement_type, {:if_exists=>true})
main:    -> 0.0020s
main: == 20241014154409 AddColumnsTypeExpressionToComplianceRequirements: reverted (0.0737s)

main: == [advisory_lock_connection] object_id: 129080, pg_backend_pid: 58818

Validation steps

  1. For this you need to have a group with Ultimate license.
  2. Create a new compliance framework for the group by following steps here.
  3. Now for that framework we will create the compliance requirement by running following mutation in http://gdk.test:3000/-/graphql-explorer.
mutation createComplianceRequirement {
  createComplianceRequirement(
    input: {
      complianceFrameworkId: "gid://gitlab/ComplianceManagement::Framework/<framework_id>",
      params: {
        name: "Custom req 3",
        description: "some description",
        controlExpression:  "{\"operator\":\"=\",\"field\":\"minimum_approvals_required\",\"value\":2}"
      }
    }) {
    errors
    requirement {
      id
      name
      description
      controlExpression
    }
  }
}
  1. The response would be something like:
{
  "data": {
    "createComplianceRequirement": {
      "errors": [],
      "requirement": {
        "id": "gid://gitlab/ComplianceManagement::ComplianceFramework::ComplianceRequirement/6",
        "name": "Custom req 3",
        "description": "some description",
        "controlExpression": "{\"operator\":\"=\",\"field\":\"minimum_approvals_required\",\"value\":2}"
      }
    }
  },
  "correlationId": "01JBVTNAC9R46RB2JA6GQSN705"
}

Related to #482489 (closed)

Edited by Hitesh Raghuvanshi

Merge request reports

Loading