Skip to content

Commit d28e06e

Browse files
feat(telemetry link): Onboarding TelemetryLink (#1456)
1 parent b9296ba commit d28e06e

19 files changed

Lines changed: 1904 additions & 1 deletion

File tree

docs/data-sources/telemetrylink.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_telemetrylink Data Source - stackit"
4+
subcategory: ""
5+
description: |-
6+
TelemetryLink data source schema. Uses the default_region specified in the provider configuration as a fallback in case no region is defined on datasource level.
7+
---
8+
9+
# stackit_telemetrylink (Data Source)
10+
11+
TelemetryLink data source schema. Uses the `default_region` specified in the provider configuration as a fallback in case no `region` is defined on datasource level.
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "stackit_telemetrylink" "link" {
17+
resource_type = "project"
18+
resource_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
region = "eu01"
20+
}
21+
```
22+
23+
<!-- schema generated by tfplugindocs -->
24+
## Schema
25+
26+
### Required
27+
28+
- `resource_id` (String) STACKIT project ID, folder ID, or organization ID associated with the Telemetry Link resource.
29+
- `resource_type` (String) The resource type of the TelemetryLink resource, possible values: Possible values are: `organization`, `folder`, `project`.
30+
31+
### Optional
32+
33+
- `region` (String) STACKIT region name the resource is located in. If not defined, the provider region is used.
34+
35+
### Read-Only
36+
37+
- `create_time` (String) The time the Telemetry Link was created.
38+
- `description` (String) The description of the Telemetry Link resource.
39+
- `display_name` (String) The displayed name of the Telemetry Link resource.
40+
- `id` (String) Terraform's internal resource identifier. It is structured as "`resource_type`, `resource_id`,`region`".
41+
- `status` (String) The status of the TelemetryLink, possible values: Possible values are: `active`, `inactive`, `failed`, `reconciling`, `deleting`.
42+
- `telemetry_router_id` (String) The Telemetry Router ID.

docs/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ Note: AWS specific checks must be skipped as they do not work on STACKIT. For de
210210
- `sfs_custom_endpoint` (String) Custom endpoint for the Stackit Filestorage API
211211
- `ske_custom_endpoint` (String) Custom endpoint for the Kubernetes Engine (SKE) service
212212
- `sqlserverflex_custom_endpoint` (String) Custom endpoint for the SQL Server Flex service
213+
- `telemetrylink_custom_endpoint` (String) Custom endpoint for the Telemetry Link service
213214
- `telemetryrouter_custom_endpoint` (String) Custom endpoint for the Telemetry Router service
214215
- `token_custom_endpoint` (String) Custom endpoint for the token API, which is used to request access tokens when using the key flow
215216
- `use_oidc` (Boolean) Enables OIDC for Authentication. This can also be sourced from the `STACKIT_USE_OIDC` Environment Variable. Defaults to `false`.

docs/resources/telemetrylink.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_telemetrylink Resource - stackit"
4+
subcategory: ""
5+
description: |-
6+
TelemetryLink instance resource schema. Uses the default_region specified in the provider configuration as a fallback in case no region is defined on resource level.
7+
---
8+
9+
# stackit_telemetrylink (Resource)
10+
11+
TelemetryLink instance resource schema. Uses the `default_region` specified in the provider configuration as a fallback in case no `region` is defined on resource level.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "stackit_telemetrylink" "link" {
17+
resource_type = "project"
18+
resource_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
region = "eu01"
20+
display_name = "telemetrylink-example"
21+
access_token = "eyJxxx"
22+
telemetry_router_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
23+
}
24+
25+
resource "stackit_telemetrylink" "link2" {
26+
resource_type = "project"
27+
resource_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
28+
region = "eu01"
29+
display_name = "telemetrylink-example"
30+
description = "telemetrylink description"
31+
access_token = "eyJxxx"
32+
telemetry_router_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
33+
}
34+
35+
# Only use the import statement, if you want to import an existing TelemetryLink
36+
import {
37+
to = stackit_telemetrylink.import-example
38+
id = "${var.resource_type},${var.resource_id},${var.region}"
39+
}
40+
```
41+
42+
<!-- schema generated by tfplugindocs -->
43+
## Schema
44+
45+
### Required
46+
47+
- `display_name` (String) The displayed name of the Telemetry Link resource.
48+
- `resource_id` (String) STACKIT project ID, folder ID, or organization ID associated with the Telemetry Link resource.
49+
- `resource_type` (String) The resource type of the TelemetryLink resource, possible values: Possible values are: `organization`, `folder`, `project`.
50+
- `telemetry_router_id` (String) The Telemetry Router ID.
51+
52+
### Optional
53+
54+
- `access_token` (String, Sensitive) The access token of the Telemetry Router instance.
55+
- `description` (String) The description of the Telemetry Link resource.
56+
- `region` (String) STACKIT region name the resource is located in. If not defined, the provider region is used.
57+
58+
### Read-Only
59+
60+
- `create_time` (String) The time the Telemetry Link was created.
61+
- `id` (String) Terraform's internal resource identifier. It is structured as "`resource_type`, `resource_id`,`region`".
62+
- `status` (String) The status of the TelemetryLink, possible values: Possible values are: `active`, `inactive`, `failed`, `reconciling`, `deleting`.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data "stackit_telemetrylink" "link" {
2+
resource_type = "project"
3+
resource_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
region = "eu01"
5+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
resource "stackit_telemetrylink" "link" {
2+
resource_type = "project"
3+
resource_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
region = "eu01"
5+
display_name = "telemetrylink-example"
6+
access_token = "eyJxxx"
7+
telemetry_router_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
8+
}
9+
10+
resource "stackit_telemetrylink" "link2" {
11+
resource_type = "project"
12+
resource_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
13+
region = "eu01"
14+
display_name = "telemetrylink-example"
15+
description = "telemetrylink description"
16+
access_token = "eyJxxx"
17+
telemetry_router_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
}
19+
20+
# Only use the import statement, if you want to import an existing TelemetryLink
21+
import {
22+
to = stackit_telemetrylink.import-example
23+
id = "${var.resource_type},${var.resource_id},${var.region}"
24+
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ require (
4444
github.com/stackitcloud/stackit-sdk-go/services/sfs v0.10.1
4545
github.com/stackitcloud/stackit-sdk-go/services/ske v1.15.0
4646
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.11.0
47+
github.com/stackitcloud/stackit-sdk-go/services/telemetrylink v0.2.0
4748
github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter v0.3.0
4849
github.com/teambition/rrule-go v1.8.2
4950
golang.org/x/mod v0.36.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,8 @@ github.com/stackitcloud/stackit-sdk-go/services/ske v1.15.0 h1:sSuwbqAvh89jUUX2R
734734
github.com/stackitcloud/stackit-sdk-go/services/ske v1.15.0/go.mod h1:TbqmZhLMofmfl+HhVl6oHYcI3zvXTm1vRjN3A/fOkM4=
735735
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.11.0 h1:PwjQeupEnXxhu+uWCUzO/hUfL4yqNblOcZbP2jvaQtU=
736736
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.11.0/go.mod h1:AiUoMAqQcOlMgDtkVJlqI7P/VGD5xjN3dYjERGnwN/M=
737+
github.com/stackitcloud/stackit-sdk-go/services/telemetrylink v0.2.0 h1:U1mQoCk0TXc8NsSc/Sl9PKMdEyJpWNU2zLnsqmx6wEc=
738+
github.com/stackitcloud/stackit-sdk-go/services/telemetrylink v0.2.0/go.mod h1:hgw8janWmDfP2bnuZensxqcAePr49BX5ug8Rq85o+h8=
737739
github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter v0.3.0 h1:MEvzGItcbig+9A4JvK2E5W6/mqXDPafiGkDZ1BprBAI=
738740
github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter v0.3.0/go.mod h1:WUmgKtwpe90Yq3YbgNxc2clTTULVxCu0ha6lMTjUnII=
739741
github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g=

stackit/internal/core/core.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ type ProviderData struct {
7272
ServiceEnablementCustomEndpoint string
7373
SfsCustomEndpoint string
7474
ServiceAccountCustomEndpoint string
75+
TelemetryLinkCustomEndpoint string
7576
TelemetryRouterCustomEndpoint string
7677
EnableBetaResources bool
7778
Experiments []string
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
package link
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
"time"
8+
9+
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
10+
"github.com/hashicorp/terraform-plugin-framework/datasource"
11+
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
12+
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
13+
"github.com/hashicorp/terraform-plugin-framework/types"
14+
"github.com/hashicorp/terraform-plugin-log/tflog"
15+
telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1betaapi"
16+
17+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
18+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
19+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetrylink/utils"
20+
tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils"
21+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate"
22+
)
23+
24+
var (
25+
_ datasource.DataSource = &telemetryLinkDataSource{}
26+
)
27+
28+
func NewTelemetryLinkDataSource() datasource.DataSource {
29+
return &telemetryLinkDataSource{}
30+
}
31+
32+
type DataSourceModel struct {
33+
ID types.String `tfsdk:"id"` // Required by Terraform
34+
Region types.String `tfsdk:"region"`
35+
ResourceType types.String `tfsdk:"resource_type"`
36+
ResourceID types.String `tfsdk:"resource_id"`
37+
DisplayName types.String `tfsdk:"display_name"`
38+
Description types.String `tfsdk:"description"`
39+
TelemetryRouterID types.String `tfsdk:"telemetry_router_id"`
40+
CreateTime types.String `tfsdk:"create_time"`
41+
Status types.String `tfsdk:"status"`
42+
}
43+
44+
type telemetryLinkDataSource struct {
45+
client *telemetrylink.APIClient
46+
providerData core.ProviderData
47+
}
48+
49+
func (d *telemetryLinkDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
50+
resp.TypeName = req.ProviderTypeName + "_telemetrylink"
51+
}
52+
53+
func (d *telemetryLinkDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
54+
providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics)
55+
if !ok {
56+
return
57+
}
58+
d.providerData = providerData
59+
60+
apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics)
61+
if resp.Diagnostics.HasError() {
62+
return
63+
}
64+
d.client = apiClient
65+
tflog.Info(ctx, "TelemetryLink client configured")
66+
}
67+
68+
func (d *telemetryLinkDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
69+
resp.Schema = schema.Schema{
70+
Description: fmt.Sprintf("TelemetryLink data source schema. %s", core.DatasourceRegionFallbackDocstring),
71+
Attributes: map[string]schema.Attribute{
72+
"id": schema.StringAttribute{
73+
Description: schemaDescriptions["id"],
74+
Computed: true,
75+
},
76+
"resource_type": schema.StringAttribute{
77+
Description: schemaDescriptions["resource_type"],
78+
Required: true,
79+
Validators: []validator.String{
80+
stringvalidator.OneOf(resourceTypes...),
81+
validate.NoSeparator(),
82+
},
83+
},
84+
"resource_id": schema.StringAttribute{
85+
Description: schemaDescriptions["resource_id"],
86+
Required: true,
87+
Validators: []validator.String{
88+
validate.UUID(),
89+
validate.NoSeparator(),
90+
},
91+
},
92+
"region": schema.StringAttribute{
93+
Description: schemaDescriptions["region"],
94+
// the region cannot be found, so it has to be passed
95+
Optional: true,
96+
},
97+
"display_name": schema.StringAttribute{
98+
Description: schemaDescriptions["display_name"],
99+
Computed: true,
100+
},
101+
"description": schema.StringAttribute{
102+
Description: schemaDescriptions["description"],
103+
Computed: true,
104+
},
105+
"telemetry_router_id": schema.StringAttribute{
106+
Description: schemaDescriptions["telemetry_router_id"],
107+
Computed: true,
108+
},
109+
"create_time": schema.StringAttribute{
110+
Description: schemaDescriptions["create_time"],
111+
Computed: true,
112+
},
113+
"status": schema.StringAttribute{
114+
Description: schemaDescriptions["status"],
115+
Computed: true,
116+
},
117+
},
118+
}
119+
}
120+
121+
func (d *telemetryLinkDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // nolint:gocritic // function signature required by Terraform
122+
var model DataSourceModel
123+
diags := req.Config.Get(ctx, &model)
124+
resp.Diagnostics.Append(diags...)
125+
if resp.Diagnostics.HasError() {
126+
return
127+
}
128+
129+
ctx = core.InitProviderContext(ctx)
130+
131+
resourceType := model.ResourceType.ValueString()
132+
resourceID := model.ResourceID.ValueString()
133+
region := d.providerData.GetRegionWithOverride(model.Region)
134+
135+
ctx = tflog.SetField(ctx, "resource_type", resourceType)
136+
ctx = tflog.SetField(ctx, "resource_id", resourceID)
137+
ctx = tflog.SetField(ctx, "region", region)
138+
139+
var response *telemetrylink.TelemetryLinkResponse
140+
var err error
141+
switch resourceType {
142+
case resourceTypeOrganization:
143+
response, err = d.client.DefaultAPI.GetOrganizationTelemetryLink(ctx, resourceID, region).Execute()
144+
case resourceTypeFolder:
145+
response, err = d.client.DefaultAPI.GetFolderTelemetryLink(ctx, resourceID, region).Execute()
146+
case resourceTypeProject:
147+
response, err = d.client.DefaultAPI.GetProjectTelemetryLink(ctx, resourceID, region).Execute()
148+
default:
149+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading TelemetryLink", fmt.Sprintf("Unsupported resource type: %s", resourceType))
150+
return
151+
}
152+
if err != nil {
153+
tfutils.LogError(
154+
ctx,
155+
&resp.Diagnostics,
156+
err,
157+
"Error reading TelemetryLink",
158+
fmt.Sprintf("TelemetryLink for resource type %q and resource ID %q does not exist.", resourceType, resourceID),
159+
map[int]string{
160+
http.StatusForbidden: fmt.Sprintf("Resource with type %q ID %q not found or forbidden access", resourceType, resourceID),
161+
},
162+
)
163+
resp.State.RemoveResource(ctx)
164+
return
165+
}
166+
ctx = core.LogResponse(ctx)
167+
168+
err = mapDataSourceFields(ctx, response, &model, region)
169+
if err != nil {
170+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading TelemetryLink", fmt.Sprintf("Processing response: %v", err))
171+
return
172+
}
173+
diags = resp.State.Set(ctx, model)
174+
resp.Diagnostics.Append(diags...)
175+
if resp.Diagnostics.HasError() {
176+
return
177+
}
178+
tflog.Info(ctx, "TelemetryLink read", map[string]interface{}{
179+
"resource_type": resourceType,
180+
"resource_id": resourceID,
181+
})
182+
}
183+
184+
func mapDataSourceFields(_ context.Context, link *telemetrylink.TelemetryLinkResponse, model *DataSourceModel, region string) error {
185+
if link == nil {
186+
return fmt.Errorf("link is nil")
187+
}
188+
if model == nil {
189+
return fmt.Errorf("model is nil")
190+
}
191+
192+
model.ID = tfutils.BuildInternalTerraformId(model.ResourceType.ValueString(), model.ResourceID.ValueString(), region)
193+
model.Region = types.StringValue(region)
194+
model.DisplayName = types.StringValue(link.DisplayName)
195+
model.Description = types.StringPointerValue(link.Description)
196+
model.TelemetryRouterID = types.StringValue(link.TelemetryRouterId)
197+
model.CreateTime = types.StringValue(link.CreateTime.Format(time.RFC3339))
198+
model.Status = types.StringValue(string(link.Status))
199+
200+
return nil
201+
}

0 commit comments

Comments
 (0)