Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
tosuke committed Oct 5, 2024
1 parent 9ae58d1 commit 7e17b40
Show file tree
Hide file tree
Showing 12 changed files with 376 additions and 0 deletions.
1 change: 1 addition & 0 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ func (m *mackerelProvider) Configure(ctx context.Context, req provider.Configure
func (m *mackerelProvider) Resources(context.Context) []func() resource.Resource {
return []func() resource.Resource{
NewMackerelAlertGroupSettingResource,
NewMackerelAWSIntegrationResource,
NewMackerelChannelResource,
NewMackerelDashboardResource,
NewMackerelDowntimeResource,
Expand Down
1 change: 1 addition & 0 deletions mackerel/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ func protoV5ProviderServer(provider *schema.Provider) tfprotov5.ProviderServer {

// Resources
delete(provider.ResourcesMap, "mackerel_alert_group_setting")
delete(provider.ResourcesMap, "mackerel_aws_integration")
delete(provider.ResourcesMap, "mackerel_channel")
delete(provider.ResourcesMap, "mackerel_dashboard")
delete(provider.ResourcesMap, "mackerel_downtime")
Expand Down
4 changes: 4 additions & 0 deletions test/sdk-framework/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.terraform/
.terraform.lock.hcl
*.tfstate
*.tfstate.backup
10 changes: 10 additions & 0 deletions test/sdk-framework/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.PHONY: test
test: init
terraform apply -auto-approve -state-out=sdk.tfstate
MACKEREL_EXPERIMENTAL_TFFRAMEWORK=1 terraform apply -auto-approve -state=sdk.tfstate -state-out=framework.tfstate
terraform destroy -auto-approve -state=framework.tfstate -state-out=destroy.tfstate

.PHONY: init
init:
rm .terraform.lock.hcl
terraform init -reconfigure
12 changes: 12 additions & 0 deletions test/sdk-framework/alert_group_setting.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
resource "mackerel_alert_group_setting" "basic" {
name = "tf-alert-group-basic"
}

resource "mackerel_alert_group_setting" "full" {
name = "tf-alert-group-full"
memo = "This alert group setting is managed by Terraform."
service_scopes = [mackerel_service.no_memo.id]
role_scopes = [mackerel_role.no_memo.id]
monitor_scopes = [mackerel_monitor.host.id]
notification_interval = 60
}
56 changes: 56 additions & 0 deletions test/sdk-framework/channel.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
resource "mackerel_channel" "email" {
name = "tf-channel-email"
email {}
}

resource "mackerel_channel" "email-full" {
name = "tf-channel-email-full"
email {
emails = ["[email protected]"]
events = ["alert", "alertGroup"]
}
}

resource "mackerel_channel" "slack" {
name = "tf-channel-slack"
slack {
url = "https://hooks/slack.com/services/xxx/yyy/zzz"
}
}

resource "mackerel_channel" "slack-full" {
name = "tf-channel-slack-full"
slack {
url = "https://hooks/slack.com/services/xxx/yyy/zzz"
mentions = {
"ok" = "OK!!!"
"warning" = "WARNING!!!"
"critical" = "CRITICAL!!!"
}
enabled_graph_image = true
events = [
"alert",
"alertGroup",
"hostStatus",
"hostRegister",
"hostRetire",
"monitor"
]
}
}

resource "mackerel_channel" "webhook" {
name = "tf-channel-webhook"
webhook {
url = "https://example.test/hook"
}
}

resource "mackerel_channel" "webhook-full" {
name = "tf-channel-webhook-full"
webhook {
url = "https://example.test/hook"
events = ["alert"]
}
}

28 changes: 28 additions & 0 deletions test/sdk-framework/downtime.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
resource "mackerel_downtime" "basic" {
name = "tf-test-basic"
start = 1735707600
duration = 3600
}

resource "mackerel_downtime" "full" {
name = "tf-test-full"
memo = "This downtime is managed by Terraform."
start = 1735707600
duration = 3600

recurrence {
type = "weekly"
interval = 2
weekdays = ["Wednesday", "Thursday"]
until = 1767193199
}

service_scopes = [mackerel_service.no_memo.id]
service_exclude_scopes = [mackerel_service.with_memo.id]

role_scopes = ["${mackerel_role.no_memo.service}: ${mackerel_role.no_memo.name}"]
role_exclude_scopes = ["${mackerel_role.with_memo.service}: ${mackerel_role.with_memo.name}"]

monitor_scopes = [mackerel_monitor.host.id]
monitor_exclude_scopes = [mackerel_monitor.service.id]
}
8 changes: 8 additions & 0 deletions test/sdk-framework/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
terraform {
required_providers {
mackerel = {
source = "mackerelio-labs/mackerel"
version = "99.9.9"
}
}
}
179 changes: 179 additions & 0 deletions test/sdk-framework/monitor.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
resource "mackerel_monitor" "host" {
name = "tf-monitor-host"
host_metric {
metric = "cpu.sys"
operator = ">"
warning = 75
duration = 1
scopes = []
}
}

resource "mackerel_monitor" "host_scoped" {
name = "tf-monitor-host-scoped"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30
host_metric {
metric = "cpu.usr"
operator = ">"
warning = "70"
critical = "90"
duration = 3
max_check_attempts = 5
scopes = [
mackerel_service.no_memo.id,
mackerel_role.no_memo.id]
exclude_scopes = [
mackerel_service.with_memo.id,
mackerel_role.with_memo.id]
}
}

resource "mackerel_monitor" "service" {
name = "tf-monitor-svc"
service_metric {
service = mackerel_service.with_memo.name
duration = 1
metric = "custom.access.2xx_ratio"
operator = "<"
warning = "99.9"
}
}

resource "mackerel_monitor" "service-full" {
name = "tf-monitor-svc-full"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30
service_metric {
service = mackerel_service.with_memo.name
duration = 3
metric = "custom.access.5xx_ratio"
operator = "<"
warning = "99.9"
critical = "99.99"
max_check_attempts = 5
missing_duration_warning = 10
missing_duration_critical = 10080
}
}

resource "mackerel_monitor" "expr" {
name = "tf-monitor-expr"
expression {
expression = "max(role(my-service:db, loadavg5))"
operator = ">"
warning = "0.7"
}
}

resource "mackerel_monitor" "expr-full" {
name = "tf-monitor-expr-full"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30
expression {
expression = "max(role(my-service:db, loadavg5))"
operator = ">"
warning = "0.7"
critical = "0.9"
}
}

resource "mackerel_monitor" "query" {
name = "tf-monitor-query"
query {
query = "sum by (k8s.node.name) (container.cpu.utilization{k8s.deployment.name=\"nginx\"})"
legend = "nginx cpu utilization on {{k8s.node.name}}"
operator = ">"
warning = "0.7"
}
}

resource "mackerel_monitor" "query-full" {
name = "tf-monitor-query"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30

query {
query = "sum by (k8s.node.name) (container.cpu.utilization{k8s.deployment.name=\"nginx\"})"
legend = "nginx cpu utilization on {{k8s.node.name}}"
operator = ">"
warning = "0.7"
critical = "0.9"
}
}

resource "mackerel_monitor" "connectivity" {
name = "tf-monitor-connectivity"
connectivity {}
}

resource "mackerel_monitor" "connectivity-full" {
name = "tf-monitor-connectivity-full"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30
connectivity {
scopes = [mackerel_service.no_memo.id, mackerel_role.no_memo.id]
exclude_scopes = [mackerel_service.with_memo.id, mackerel_role.with_memo.id]
alert_status_on_gone = "WARNING"
}
}

resource "mackerel_monitor" "external" {
name = "tf-monitor-external"
external {
method = "GET"
url = "https://terraform-provider-mackerel.test"
}
}

resource "mackerel_monitor" "external-full" {
name = "tf-monitor-external-full"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30
external {
method = "POST"
url = "https://terraform-provider-mackerel.test/"
max_check_attempts = 3
service = mackerel_service.no_memo.name
response_time_critical = 3000
response_time_warning = 2000
response_time_duration = 3
request_body = "foo=bar"
contains_string = "blah blah blah"
certification_expiration_critical = 7
certification_expiration_warning = 14
skip_certificate_verification = true
headers = {
Cache-Control = "no-cache"
}
follow_redirect = true
}
}

resource "mackerel_monitor" "anomaly" {
name = "tf-monitor-anomaly-detection"
anomaly_detection {
warning_sensitivity = "insensitive"
scopes = [mackerel_role.no_memo.id]
}
}

resource "mackerel_monitor" "anomaly-full" {
name = "tf-monitor-anomaly-detection-full"
memo = "This monitor is managed by Terraform."
is_mute = true
notification_interval = 30
anomaly_detection {
warning_sensitivity = "insensitive"
critical_sensitivity = "normal"
max_check_attempts = 5
training_period_from = 1577836800
scopes = [mackerel_role.with_memo.id]
}
}
41 changes: 41 additions & 0 deletions test/sdk-framework/notification-group.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
resource "mackerel_channel" "foo" {
name = "tf-channel-foo"
email {}
}

resource "mackerel_monitor" "foo" {
name = "tf-monitor-foo"
connectivity {}
}

resource "mackerel_notification_group" "empty" {
name = "tf-ng-empty"
}

resource "mackerel_notification_group" "full" {
name = "tf-ng-full"
notification_level = "critical"
child_notification_group_ids = [
mackerel_notification_group.empty.id]
child_channel_ids = [
mackerel_channel.foo.id]
monitor {
id = mackerel_monitor.foo.id
skip_default = false
}
// ignore duplicates
monitor {
id = mackerel_monitor.foo.id
skip_default = false
}
service {
name = mackerel_service.no_memo.name
}
// ignore duplicates
service {
name = mackerel_service.no_memo.name
}
service {
name = mackerel_service.with_memo.name
}
}
24 changes: 24 additions & 0 deletions test/sdk-framework/role.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
resource "mackerel_role" "no_memo" {
name = "tf-no-memo"
service = mackerel_service.no_memo.id
}

resource "mackerel_role" "with_memo" {
name = "tf-with-memo"
service = mackerel_service.with_memo.id
memo = "This role is managed by Terraform"
}

data "mackerel_role" "foo" {
service = mackerel_role.no_memo.service
name = mackerel_role.no_memo.name
}

resource "mackerel_role_metadata" "no_memo" {
service = mackerel_role.no_memo.service
role = mackerel_role.no_memo.name
namespace = "test"
metadata_json = jsonencode({
id = 1
})
}
12 changes: 12 additions & 0 deletions test/sdk-framework/service.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
resource "mackerel_service" "no_memo" {
name = "tf-test-no-memo"
}

data "mackerel_service" "no_memo" {
name = mackerel_service.no_memo.name
}

resource "mackerel_service" "with_memo" {
name = "tf-test-with-memo"
memo = "This resource is Managed by Terraform."
}

0 comments on commit 7e17b40

Please sign in to comment.