Skip to content

Commit 4365b5a

Browse files
committed
feat(observability): implement cert and http checks
Signed-off-by: Mauritz Uphoff <[email protected]>
1 parent e4e2e55 commit 4365b5a

File tree

19 files changed

+1609
-45
lines changed

19 files changed

+1609
-45
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_observability_cert_check Data Source - stackit"
4+
subcategory: ""
5+
description: |-
6+
Datasource for managing cert-checks in STACKIT Observability.
7+
---
8+
9+
# stackit_observability_cert_check (Data Source)
10+
11+
Datasource for managing cert-checks in STACKIT Observability.
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "stackit_observability_cert_check" "example" {
17+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
cert_check_id = "xxxxxxxxxxxxxxxxxxxxxxxx"
20+
}
21+
```
22+
23+
<!-- schema generated by tfplugindocs -->
24+
## Schema
25+
26+
### Required
27+
28+
- `cert_check_id` (String) Unique ID of the cert-check.
29+
- `instance_id` (String) STACKIT Observability instance ID.
30+
- `project_id` (String) STACKIT project ID.
31+
32+
### Read-Only
33+
34+
- `id` (String) Terraform resource ID in format `project_id,instance_id,cert_check_id`.
35+
- `source` (String) The cert source to check, e.g. tcp://stackit.de:443 Must start with `tcp://`.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_observability_http_check Data Source - stackit"
4+
subcategory: ""
5+
description: |-
6+
Datasource for managing HTTP-checks in STACKIT Observability.
7+
---
8+
9+
# stackit_observability_http_check (Data Source)
10+
11+
Datasource for managing HTTP-checks in STACKIT Observability.
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "stackit_observability_http_check" "example" {
17+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
http_check_id = "xxxxxxxxxxxxxxxxxxxxxxxx"
20+
}
21+
```
22+
23+
<!-- schema generated by tfplugindocs -->
24+
## Schema
25+
26+
### Required
27+
28+
- `http_check_id` (String) Unique ID of the HTTP-check.
29+
- `instance_id` (String) STACKIT Observability instance ID.
30+
- `project_id` (String) STACKIT project ID.
31+
32+
### Read-Only
33+
34+
- `id` (String) Terraform resource ID in format `project_id,instance_id,http_check_id`.
35+
- `url` (String) The URL to check, e.g. https://www.stackit.de. Must start with `http://` or `https://`.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_observability_cert_check Resource - stackit"
4+
subcategory: ""
5+
description: |-
6+
Resource for managing cert-checks in STACKIT Observability.
7+
---
8+
9+
# stackit_observability_cert_check (Resource)
10+
11+
Resource for managing cert-checks in STACKIT Observability.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "stackit_observability_http_check" "example" {
17+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
url = "tcp://stackit.de:443"
20+
}
21+
22+
# Only use the import statement, if you want to import an existing cert-check
23+
import {
24+
to = stackit_observability_http_check.example
25+
id = "${var.project_id},${var.observability_instance_id},${var.cert_check_id}"
26+
}
27+
```
28+
29+
<!-- schema generated by tfplugindocs -->
30+
## Schema
31+
32+
### Required
33+
34+
- `instance_id` (String) STACKIT Observability instance ID.
35+
- `project_id` (String) STACKIT project ID.
36+
- `source` (String) The cert source to check, e.g. tcp://stackit.de:443 Must start with `tcp://`.
37+
38+
### Read-Only
39+
40+
- `cert_check_id` (String)
41+
- `id` (String) Terraform resource ID in format `project_id,instance_id,cert_check_id`.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_observability_http_check Resource - stackit"
4+
subcategory: ""
5+
description: |-
6+
Resource for managing HTTP-checks in STACKIT Observability.
7+
---
8+
9+
# stackit_observability_http_check (Resource)
10+
11+
Resource for managing HTTP-checks in STACKIT Observability.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "stackit_observability_http_check" "example" {
17+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
url = "https://www.stackit.de"
20+
}
21+
22+
# Only use the import statement, if you want to import an existing http-check
23+
import {
24+
to = stackit_observability_http_check.example
25+
id = "${var.project_id},${var.observability_instance_id},${var.http_check_id}"
26+
}
27+
```
28+
29+
<!-- schema generated by tfplugindocs -->
30+
## Schema
31+
32+
### Required
33+
34+
- `instance_id` (String) STACKIT Observability instance ID.
35+
- `project_id` (String) STACKIT project ID.
36+
- `url` (String) The URL to check, e.g. https://www.stackit.de. Must start with `http://` or `https://`.
37+
38+
### Read-Only
39+
40+
- `http_check_id` (String) Unique ID of the HTTP-check.
41+
- `id` (String) Terraform resource ID in format `project_id,instance_id,http_check_id`.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data "stackit_observability_cert_check" "example" {
2+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
cert_check_id = "xxxxxxxxxxxxxxxxxxxxxxxx"
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data "stackit_observability_http_check" "example" {
2+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
http_check_id = "xxxxxxxxxxxxxxxxxxxxxxxx"
5+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
resource "stackit_observability_http_check" "example" {
2+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
url = "tcp://stackit.de:443"
5+
}
6+
7+
# Only use the import statement, if you want to import an existing cert-check
8+
import {
9+
to = stackit_observability_http_check.example
10+
id = "${var.project_id},${var.observability_instance_id},${var.cert_check_id}"
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
resource "stackit_observability_http_check" "example" {
2+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
url = "https://www.stackit.de"
5+
}
6+
7+
# Only use the import statement, if you want to import an existing http-check
8+
import {
9+
to = stackit_observability_http_check.example
10+
id = "${var.project_id},${var.observability_instance_id},${var.http_check_id}"
11+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package certcheck
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-framework/datasource"
8+
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
9+
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
10+
"github.com/hashicorp/terraform-plugin-log/tflog"
11+
"github.com/stackitcloud/stackit-sdk-go/services/observability"
12+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
13+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
14+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features"
15+
observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils"
16+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate"
17+
)
18+
19+
// Ensure the implementation satisfies the expected interfaces.
20+
var (
21+
_ datasource.DataSource = &certCheckDataSource{}
22+
)
23+
24+
// NewCertCheckDataSource creates a new instance of the certCheckDataSource.
25+
func NewCertCheckDataSource() datasource.DataSource {
26+
return &certCheckDataSource{}
27+
}
28+
29+
// certCheckDataSource is the datasource implementation.
30+
type certCheckDataSource struct {
31+
client *observability.APIClient
32+
}
33+
34+
// Configure adds the provider configured client to the resource.
35+
func (d *certCheckDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
36+
providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics)
37+
if !ok {
38+
return
39+
}
40+
41+
features.CheckBetaResourcesEnabled(ctx, &providerData, &resp.Diagnostics, "stackit_observability_cert_check", "datasource")
42+
if resp.Diagnostics.HasError() {
43+
return
44+
}
45+
46+
apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics)
47+
if resp.Diagnostics.HasError() {
48+
return
49+
}
50+
d.client = apiClient
51+
tflog.Info(ctx, "Observability client configured")
52+
}
53+
54+
// Metadata provides metadata for the alert group datasource.
55+
func (d *certCheckDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
56+
resp.TypeName = req.ProviderTypeName + "_observability_cert_check"
57+
}
58+
59+
// Schema defines the schema for the alert group data source.
60+
func (d *certCheckDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
61+
resp.Schema = schema.Schema{
62+
Description: "Datasource for managing cert-checks in STACKIT Observability.",
63+
Attributes: map[string]schema.Attribute{
64+
"id": schema.StringAttribute{
65+
Description: descriptions["id"],
66+
Computed: true,
67+
},
68+
"project_id": schema.StringAttribute{
69+
Description: descriptions["project_id"],
70+
Required: true,
71+
Validators: []validator.String{
72+
validate.UUID(),
73+
validate.NoSeparator(),
74+
},
75+
},
76+
"instance_id": schema.StringAttribute{
77+
Description: descriptions["instance_id"],
78+
Required: true,
79+
Validators: []validator.String{
80+
validate.UUID(),
81+
validate.NoSeparator(),
82+
},
83+
},
84+
"cert_check_id": schema.StringAttribute{
85+
Description: descriptions["cert_check_id"],
86+
Required: true,
87+
},
88+
"source": schema.StringAttribute{
89+
Description: descriptions["source"],
90+
Computed: true,
91+
},
92+
},
93+
}
94+
}
95+
96+
func (d *certCheckDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // nolint:gocritic // function signature required by Terraform
97+
var model Model
98+
diags := req.Config.Get(ctx, &model)
99+
resp.Diagnostics.Append(diags...)
100+
if resp.Diagnostics.HasError() {
101+
return
102+
}
103+
104+
projectId := model.ProjectId.ValueString()
105+
instanceId := model.InstanceId.ValueString()
106+
certCheckId := model.CertCheckId.ValueString()
107+
ctx = tflog.SetField(ctx, "project_id", projectId)
108+
ctx = tflog.SetField(ctx, "instance_id", instanceId)
109+
ctx = tflog.SetField(ctx, "cert_check_id", certCheckId)
110+
111+
listCertChecks, err := d.client.ListCertChecks(ctx, instanceId, projectId).Execute()
112+
if err != nil {
113+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error listing cert-checks", fmt.Sprintf("Listing API payload: %v", err))
114+
return
115+
}
116+
117+
if listCertChecks.CertChecks == nil || len(*listCertChecks.CertChecks) == 0 {
118+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error listing cert-checks", "Response is empty")
119+
return
120+
}
121+
122+
for _, certCheck := range *listCertChecks.CertChecks {
123+
if certCheck.Id != nil && *certCheck.Id == certCheckId {
124+
if err := mapFields(ctx, &certCheck, &model); err != nil {
125+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading cert-check", "Unable to map cert-check model")
126+
return
127+
}
128+
break
129+
}
130+
}
131+
132+
// Set the state with fully populated data.
133+
diags = resp.State.Set(ctx, model)
134+
resp.Diagnostics.Append(diags...)
135+
if resp.Diagnostics.HasError() {
136+
return
137+
}
138+
tflog.Info(ctx, "cert-check read")
139+
}

0 commit comments

Comments
 (0)