OpsLevel / terraform-provider-opslevel

Terraform provider for OpsLevel.com
https://registry.terraform.io/providers/OpsLevel/opslevel/latest/docs
MIT License
8 stars 5 forks source link

convert predicates to ObjectModels, needs testing #372

Closed davidbloss closed 1 month ago

davidbloss commented 1 month ago

Issues

Fix Terraform Predicate types across resources

Changelog

Convert PredicateModel to types.Object - Terraform handles this better Add some Predicate type validation. Saves HOURS of guesswork due to opaque API error messages 😞 Update tests

Tophatting

With this config:

resource "opslevel_check_alert_source_usage" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"

  alert_type = "pagerduty"
  alert_name_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_file" "example" {
  name              = "foo"
  enabled           = true
  filepaths         = ["tbd"]
  directory_search  = false
  use_absolute_root = false
  category          = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level             = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner             = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter            = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_grep" "example" {
  name             = "foo"
  enabled          = true
  filepaths        = ["here", "there"]
  directory_search = false
  category         = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level            = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner            = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter           = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_search" "example" {
  name    = "foo"
  enabled = true
  # To set a future enable date remove field 'enabled' and use 'enable_on'
  # enable_on = "2022-05-23T14:14:18.782000Z"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_service_ownership" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
}

resource "opslevel_check_service_property" "example" {
  name     = "foo"
  enabled  = true
  property = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_tag_defined" "example" {
  name     = "foo"
  enabled  = true
  tag_key  = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  tag_predicate = {
    type  = "contains"
    value = "dev"
  }
}

Create resources with predicates. terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # opslevel_check_alert_source_usage.example will be created
  + resource "opslevel_check_alert_source_usage" "example" {
      + alert_name_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      + alert_type           = "pagerduty"
      + category             = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description          = (known after apply)
      + enabled              = true
      + filter               = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                   = (known after apply)
      + level                = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                 = "foo"
      + owner                = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
    }

  # opslevel_check_repository_file.example will be created
  + resource "opslevel_check_repository_file" "example" {
      + category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description             = (known after apply)
      + directory_search        = false
      + enabled                 = true
      + file_contents_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      + filepaths               = [
          + "tbd",
        ]
      + filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                      = (known after apply)
      + level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                    = "foo"
      + owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + use_absolute_root       = false
    }

  # opslevel_check_repository_grep.example will be created
  + resource "opslevel_check_repository_grep" "example" {
      + category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description             = (known after apply)
      + directory_search        = false
      + enabled                 = true
      + file_contents_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      + filepaths               = [
          + "here",
          + "there",
        ]
      + filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                      = (known after apply)
      + level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                    = "foo"
      + owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
    }

  # opslevel_check_repository_search.example will be created
  + resource "opslevel_check_repository_search" "example" {
      + category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description             = (known after apply)
      + enabled                 = true
      + file_contents_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      + filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                      = (known after apply)
      + level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                    = "foo"
      + owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
    }

  # opslevel_check_service_ownership.example will be created
  + resource "opslevel_check_service_ownership" "example" {
      + category               = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + contact_method         = "ANY"
      + description            = (known after apply)
      + enabled                = true
      + filter                 = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                     = (known after apply)
      + level                  = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                   = "foo"
      + owner                  = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + require_contact_method = false
    }

  # opslevel_check_service_property.example will be created
  + resource "opslevel_check_service_property" "example" {
      + category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description = (known after apply)
      + enabled     = true
      + filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id          = (known after apply)
      + level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name        = "foo"
      + owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + predicate   = {
          + type  = "contains"
          + value = "dev"
        }
      + property    = "product"
    }

  # opslevel_check_tag_defined.example will be created
  + resource "opslevel_check_tag_defined" "example" {
      + category      = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description   = (known after apply)
      + enabled       = true
      + filter        = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id            = (known after apply)
      + level         = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name          = "foo"
      + owner         = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + tag_key       = "product"
      + tag_predicate = {
          + type  = "contains"
          + value = "dev"
        }
    }

Plan: 7 to add, 0 to change, 0 to destroy.
opslevel_check_tag_defined.example: Creating...
opslevel_check_service_property.example: Creating...
opslevel_check_alert_source_usage.example: Creating...
opslevel_check_repository_search.example: Creating...
opslevel_check_repository_file.example: Creating...
opslevel_check_repository_grep.example: Creating...
opslevel_check_service_ownership.example: Creating...
opslevel_check_repository_file.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM1Mw]
opslevel_check_alert_source_usage.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzU2]
opslevel_check_repository_grep.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM1NQ]
opslevel_check_tag_defined.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzU0]
opslevel_check_service_property.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNTg]
opslevel_check_service_ownership.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM1OQ]
opslevel_check_repository_search.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzU3]

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Destroy resources then, update config:

resource "opslevel_check_alert_source_usage" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"

  alert_type = "pagerduty"
  # alert_name_predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

resource "opslevel_check_repository_file" "example" {
  name              = "foo"
  enabled           = true
  filepaths         = ["tbd"]
  directory_search  = false
  use_absolute_root = false
  category          = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level             = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner             = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter            = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  # file_contents_predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

resource "opslevel_check_repository_grep" "example" {
  name             = "foo"
  enabled          = true
  filepaths        = ["here", "there"]
  directory_search = false
  category         = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level            = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner            = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter           = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_search" "example" {
  name    = "foo"
  enabled = true
  # To set a future enable date remove field 'enabled' and use 'enable_on'
  # enable_on = "2022-05-23T14:14:18.782000Z"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_service_ownership" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
}

resource "opslevel_check_service_property" "example" {
  name     = "foo"
  enabled  = true
  property = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  # predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

resource "opslevel_check_tag_defined" "example" {
  name     = "foo"
  enabled  = true
  tag_key  = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  # tag_predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

Create resources without optional predicates. terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # opslevel_check_alert_source_usage.example will be created
  + resource "opslevel_check_alert_source_usage" "example" {
      + alert_type  = "pagerduty"
      + category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description = (known after apply)
      + enabled     = true
      + filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id          = (known after apply)
      + level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name        = "foo"
      + owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
    }

  # opslevel_check_repository_file.example will be created
  + resource "opslevel_check_repository_file" "example" {
      + category          = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description       = (known after apply)
      + directory_search  = false
      + enabled           = true
      + filepaths         = [
          + "tbd",
        ]
      + filter            = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                = (known after apply)
      + level             = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name              = "foo"
      + owner             = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + use_absolute_root = false
    }

  # opslevel_check_repository_grep.example will be created
  + resource "opslevel_check_repository_grep" "example" {
      + category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description             = (known after apply)
      + directory_search        = false
      + enabled                 = true
      + file_contents_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      + filepaths               = [
          + "here",
          + "there",
        ]
      + filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                      = (known after apply)
      + level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                    = "foo"
      + owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
    }

  # opslevel_check_repository_search.example will be created
  + resource "opslevel_check_repository_search" "example" {
      + category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description             = (known after apply)
      + enabled                 = true
      + file_contents_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      + filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                      = (known after apply)
      + level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                    = "foo"
      + owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
    }

  # opslevel_check_service_ownership.example will be created
  + resource "opslevel_check_service_ownership" "example" {
      + category               = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + contact_method         = "ANY"
      + description            = (known after apply)
      + enabled                = true
      + filter                 = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id                     = (known after apply)
      + level                  = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name                   = "foo"
      + owner                  = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + require_contact_method = false
    }

  # opslevel_check_service_property.example will be created
  + resource "opslevel_check_service_property" "example" {
      + category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description = (known after apply)
      + enabled     = true
      + filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id          = (known after apply)
      + level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name        = "foo"
      + owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + property    = "product"
    }

  # opslevel_check_tag_defined.example will be created
  + resource "opslevel_check_tag_defined" "example" {
      + category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
      + description = (known after apply)
      + enabled     = true
      + filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
      + id          = (known after apply)
      + level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
      + name        = "foo"
      + owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
      + tag_key     = "product"
    }

Plan: 7 to add, 0 to change, 0 to destroy.
opslevel_check_alert_source_usage.example: Creating...
opslevel_check_tag_defined.example: Creating...
opslevel_check_service_property.example: Creating...
opslevel_check_repository_search.example: Creating...
opslevel_check_service_ownership.example: Creating...
opslevel_check_repository_grep.example: Creating...
opslevel_check_repository_file.example: Creating...
opslevel_check_service_property.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_service_ownership.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM2Mg]
opslevel_check_alert_source_usage.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_repository_grep.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM2NA]
opslevel_check_repository_search.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzYx]
opslevel_check_tag_defined.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_repository_file.example: Creation complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Update config, (add optional predicates)

resource "opslevel_check_alert_source_usage" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"

  alert_type = "pagerduty"
  alert_name_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_file" "example" {
  name              = "foo"
  enabled           = true
  filepaths         = ["tbd"]
  directory_search  = false
  use_absolute_root = false
  category          = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level             = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner             = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter            = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_grep" "example" {
  name             = "foo"
  enabled          = true
  filepaths        = ["here", "there"]
  directory_search = false
  category         = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level            = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner            = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter           = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_search" "example" {
  name    = "foo"
  enabled = true
  # To set a future enable date remove field 'enabled' and use 'enable_on'
  # enable_on = "2022-05-23T14:14:18.782000Z"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_service_ownership" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
}

resource "opslevel_check_service_property" "example" {
  name     = "foo"
  enabled  = true
  property = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_tag_defined" "example" {
  name     = "foo"
  enabled  = true
  tag_key  = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  tag_predicate = {
    type  = "contains"
    value = "dev"
  }
}

Update resources, add optional predicates. terraform apply

opslevel_check_repository_search.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzYx]
opslevel_check_tag_defined.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_service_property.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_service_ownership.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM2Mg]
opslevel_check_alert_source_usage.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_repository_file.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_repository_grep.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM2NA]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # opslevel_check_alert_source_usage.example will be updated in-place
  ~ resource "opslevel_check_alert_source_usage" "example" {
      + alert_name_predicate = {
          + type  = "contains"
          + value = "dev"
        }
      ~ description          = "The service is using a PagerDuty alert source." -> (known after apply)
        id                   = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz"
        name                 = "foo"
        # (6 unchanged attributes hidden)
    }

  # opslevel_check_repository_file.example will be updated in-place
  ~ resource "opslevel_check_repository_file" "example" {
      ~ description             = "Repo file 'tbd' exists." -> (known after apply)
      + file_contents_predicate = {
          + type  = "contains"
          + value = "dev"
        }
        id                      = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng"
        name                    = "foo"
        # (8 unchanged attributes hidden)
    }

  # opslevel_check_service_property.example will be updated in-place
  ~ resource "opslevel_check_service_property" "example" {
      ~ description = "The service has a product." -> (known after apply)
        id          = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA"
        name        = "foo"
      + predicate   = {
          + type  = "contains"
          + value = "dev"
        }
        # (6 unchanged attributes hidden)
    }

  # opslevel_check_tag_defined.example will be updated in-place
  ~ resource "opslevel_check_tag_defined" "example" {
      ~ description   = "Verifies that the service has the specified tag defined." -> (known after apply)
        id            = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1"
        name          = "foo"
      + tag_predicate = {
          + type  = "contains"
          + value = "dev"
        }
        # (6 unchanged attributes hidden)
    }

Plan: 0 to add, 4 to change, 0 to destroy.
opslevel_check_tag_defined.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_service_property.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_repository_file.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_alert_source_usage.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_repository_file.example: Modifications complete after 1s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_alert_source_usage.example: Modifications complete after 1s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_service_property.example: Modifications complete after 1s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_tag_defined.example: Modifications complete after 1s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]

Apply complete! Resources: 0 added, 4 changed, 0 destroyed.

Update config (remove optional predicates)

resource "opslevel_check_alert_source_usage" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"

  alert_type = "pagerduty"
  # alert_name_predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

resource "opslevel_check_repository_file" "example" {
  name              = "foo"
  enabled           = true
  filepaths         = ["tbd"]
  directory_search  = false
  use_absolute_root = false
  category          = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level             = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner             = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter            = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  # file_contents_predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

resource "opslevel_check_repository_grep" "example" {
  name             = "foo"
  enabled          = true
  filepaths        = ["here", "there"]
  directory_search = false
  category         = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level            = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner            = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter           = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_repository_search" "example" {
  name    = "foo"
  enabled = true
  # To set a future enable date remove field 'enabled' and use 'enable_on'
  # enable_on = "2022-05-23T14:14:18.782000Z"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  file_contents_predicate = {
    type  = "contains"
    value = "dev"
  }
}

resource "opslevel_check_service_ownership" "example" {
  name     = "foo"
  enabled  = true
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
}

resource "opslevel_check_service_property" "example" {
  name     = "foo"
  enabled  = true
  property = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  # predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

resource "opslevel_check_tag_defined" "example" {
  name     = "foo"
  enabled  = true
  tag_key  = "product"
  category = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw"
  level    = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA"
  owner    = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA"
  filter   = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk"
  # tag_predicate = {
  #   type  = "contains"
  #   value = "dev"
  # }
}

Update resources, remove optional predicates. terraform apply

opslevel_check_repository_search.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzYx]
opslevel_check_repository_file.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_tag_defined.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_service_ownership.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM2Mg]
opslevel_check_alert_source_usage.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_service_property.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_repository_grep.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM2NA]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # opslevel_check_alert_source_usage.example will be updated in-place
  ~ resource "opslevel_check_alert_source_usage" "example" {
      - alert_name_predicate = {
          - type  = "contains" -> null
          - value = "dev" -> null
        } -> null
      ~ description          = "The service is using a PagerDuty alert source whose name contains 'dev'." -> (known after apply)
        id                   = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz"
        name                 = "foo"
        # (6 unchanged attributes hidden)
    }

  # opslevel_check_repository_file.example will be updated in-place
  ~ resource "opslevel_check_repository_file" "example" {
      ~ description             = "Repo file 'tbd' contains 'dev'." -> (known after apply)
      - file_contents_predicate = {
          - type  = "contains" -> null
          - value = "dev" -> null
        } -> null
        id                      = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng"
        name                    = "foo"
        # (8 unchanged attributes hidden)
    }

  # opslevel_check_service_property.example will be updated in-place
  ~ resource "opslevel_check_service_property" "example" {
      ~ description = "The service has a product that contains <code>dev</code>" -> (known after apply)
        id          = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA"
        name        = "foo"
      - predicate   = {
          - type  = "contains" -> null
          - value = "dev" -> null
        } -> null
        # (6 unchanged attributes hidden)
    }

  # opslevel_check_tag_defined.example will be updated in-place
  ~ resource "opslevel_check_tag_defined" "example" {
      ~ description   = "Verifies that the service has the specified tag defined." -> (known after apply)
        id            = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1"
        name          = "foo"
      - tag_predicate = {
          - type  = "contains" -> null
          - value = "dev" -> null
        } -> null
        # (6 unchanged attributes hidden)
    }

Plan: 0 to add, 4 to change, 0 to destroy.
opslevel_check_tag_defined.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_alert_source_usage.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_service_property.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_repository_file.example: Modifying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_alert_source_usage.example: Modifications complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_repository_file.example: Modifications complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_service_property.example: Modifications complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_tag_defined.example: Modifications complete after 0s [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]

Apply complete! Resources: 0 added, 4 changed, 0 destroyed.

Destroy resources terraform destroy

opslevel_check_service_property.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_service_ownership.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM2Mg]
opslevel_check_repository_file.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_alert_source_usage.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_tag_defined.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_repository_search.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzYx]
opslevel_check_repository_grep.example: Refreshing state... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM2NA]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # opslevel_check_alert_source_usage.example will be destroyed
  - resource "opslevel_check_alert_source_usage" "example" {
      - alert_type  = "pagerduty" -> null
      - category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - description = "The service is using a PagerDuty alert source." -> null
      - enabled     = true -> null
      - filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id          = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz" -> null
      - level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name        = "foo" -> null
      - owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
    }

  # opslevel_check_repository_file.example will be destroyed
  - resource "opslevel_check_repository_file" "example" {
      - category          = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - description       = "Repo file 'tbd' exists." -> null
      - directory_search  = false -> null
      - enabled           = true -> null
      - filepaths         = [
          - "tbd",
        ] -> null
      - filter            = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id                = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng" -> null
      - level             = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name              = "foo" -> null
      - owner             = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
      - use_absolute_root = false -> null
    }

  # opslevel_check_repository_grep.example will be destroyed
  - resource "opslevel_check_repository_grep" "example" {
      - category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - description             = "Verifies the existence and/or contents of files in a service's attached Git repositories." -> null
      - directory_search        = false -> null
      - enabled                 = true -> null
      - file_contents_predicate = {
          - type  = "contains" -> null
          - value = "dev" -> null
        } -> null
      - filepaths               = [
          - "here",
          - "there",
        ] -> null
      - filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id                      = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM2NA" -> null
      - level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name                    = "foo" -> null
      - owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
    }

  # opslevel_check_repository_search.example will be destroyed
  - resource "opslevel_check_repository_search" "example" {
      - category                = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - description             = "Repo contains search term 'dev' in at least one file." -> null
      - enabled                 = true -> null
      - file_contents_predicate = {
          - type  = "contains" -> null
          - value = "dev" -> null
        } -> null
      - filter                  = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id                      = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzYx" -> null
      - level                   = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name                    = "foo" -> null
      - owner                   = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
    }

  # opslevel_check_service_ownership.example will be destroyed
  - resource "opslevel_check_service_ownership" "example" {
      - category               = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - contact_method         = "ANY" -> null
      - description            = "Verifies that the service has an owner defined and with an optional requirement for a contact method and/or tag to be associated with that owner." -> null
      - enabled                = true -> null
      - filter                 = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id                     = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM2Mg" -> null
      - level                  = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name                   = "foo" -> null
      - owner                  = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
      - require_contact_method = false -> null
    }

  # opslevel_check_service_property.example will be destroyed
  - resource "opslevel_check_service_property" "example" {
      - category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - description = "The service has a product." -> null
      - enabled     = true -> null
      - filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id          = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA" -> null
      - level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name        = "foo" -> null
      - owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
      - property    = "product" -> null
    }

  # opslevel_check_tag_defined.example will be destroyed
  - resource "opslevel_check_tag_defined" "example" {
      - category    = "Z2lkOi8vb3BzbGV2ZWwvQ2F0ZWdvcnkvNjk3Nw" -> null
      - description = "Verifies that the service has the specified tag defined." -> null
      - enabled     = true -> null
      - filter      = "Z2lkOi8vb3BzbGV2ZWwvRmlsdGVyLzM1Njk" -> null
      - id          = "Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1" -> null
      - level       = "Z2lkOi8vb3BzbGV2ZWwvTGV2ZWwvMzcwOA" -> null
      - name        = "foo" -> null
      - owner       = "Z2lkOi8vb3BzbGV2ZWwvVGVhbS8xNzQzNA" -> null
      - tag_key     = "product" -> null
    }

Plan: 0 to add, 0 to change, 7 to destroy.
opslevel_check_repository_search.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvU2VhcmNoLzI2MzYx]
opslevel_check_alert_source_usage.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpBbGVydFNvdXJjZVVzYWdlLzI2MzYz]
opslevel_check_service_property.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpTZXJ2aWNlUHJvcGVydHkvMjYzNjA]
opslevel_check_repository_grep.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvR3JlcC8yNjM2NA]
opslevel_check_repository_file.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpSZXBvRmlsZS8yNjM2Ng]
opslevel_check_tag_defined.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpUYWdEZWZpbmVkLzI2MzY1]
opslevel_check_service_ownership.example: Destroying... [id=Z2lkOi8vb3BzbGV2ZWwvQ2hlY2tzOjpIYXNPd25lci8yNjM2Mg]
opslevel_check_service_ownership.example: Destruction complete after 1s
opslevel_check_repository_file.example: Destruction complete after 1s
opslevel_check_service_property.example: Destruction complete after 1s
opslevel_check_repository_grep.example: Destruction complete after 1s
opslevel_check_repository_search.example: Destruction complete after 1s
opslevel_check_tag_defined.example: Destruction complete after 1s
opslevel_check_alert_source_usage.example: Destruction complete after 1s

Destroy complete! Resources: 7 destroyed.