Skip to content

Commit ed582a8

Browse files
authored
Faro: Update endpoint-logic with region cutoff dates (#2446)
1 parent b1b7564 commit ed582a8

File tree

3 files changed

+78
-39
lines changed

3 files changed

+78
-39
lines changed

internal/resources/frontendo11y/common.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package frontendo11y
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
"time"
6+
)
47

58
// TODO: make faroEndpointUrl visible in gcom response
69
var faroEndpointUrlsRegionExceptions = map[string]string{
@@ -10,8 +13,27 @@ var faroEndpointUrlsRegionExceptions = map[string]string{
1013
"us": "https://faro-api-prod-us-central-0.grafana.net/faro",
1114
}
1215

13-
// getFrontendO11yAPIURLForRegion gets the frontend o11y API URL given a region slug
14-
func getFrontendO11yAPIURLForRegion(regionSlug string) string {
16+
type faroEndpointUrlsRegionCutoff struct {
17+
cutoffDate time.Time
18+
faroEndpointURL string // URL to use after the cutoff date
19+
}
20+
21+
var faroEndpointUrlsAfterCutoff = map[string]faroEndpointUrlsRegionCutoff{
22+
"prod-us-east-0": {
23+
cutoffDate: time.Date(2024, 12, 18, 0, 0, 0, 0, time.UTC),
24+
faroEndpointURL: "https://faro-api-prod-us-east-2.grafana.net/faro",
25+
},
26+
}
27+
28+
// getFrontendO11yAPIURLForRegion gets the frontend o11y API URL given a region slug and a created_at date
29+
func getFrontendO11yAPIURLForRegion(regionSlug string, createdAt time.Time) string {
30+
if cutoffInfo, ok := faroEndpointUrlsAfterCutoff[regionSlug]; ok {
31+
// if createdAt is after the cutoffInfo date then we have to use the new region endpoint
32+
if createdAt.After(cutoffInfo.cutoffDate) {
33+
return cutoffInfo.faroEndpointURL
34+
}
35+
}
36+
1537
if url, ok := faroEndpointUrlsRegionExceptions[regionSlug]; ok {
1638
return url
1739
}

internal/resources/frontendo11y/data_source_frontend_o11y_app.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"net/http"
8+
"time"
89

910
"github.com/hashicorp/terraform-plugin-framework/datasource"
1011
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
@@ -85,21 +86,21 @@ func (r *datasourceFrontendO11yApp) Schema(ctx context.Context, req datasource.S
8586
}
8687
}
8788

88-
// getStackRegion gets the region slug from the stack id
89-
func (r *datasourceFrontendO11yApp) getStackRegion(ctx context.Context, stackID string) (string, error) {
89+
// getStack gets the stack from the stack id
90+
func (r *datasourceFrontendO11yApp) getStack(ctx context.Context, stackID string) (*gcom.FormattedApiInstance, error) {
9091
stack, res, err := r.gcomClient.InstancesAPI.GetInstance(ctx, stackID).Execute()
9192
if err != nil {
92-
return "", err
93+
return nil, err
9394
}
9495

9596
if res.StatusCode >= 500 {
96-
return "", errors.New("server error")
97+
return nil, errors.New("server error")
9798
}
9899

99100
if res.StatusCode == http.StatusNotFound {
100-
return "", fmt.Errorf("stack %q not found", stackID)
101+
return nil, fmt.Errorf("stack %q not found", stackID)
101102
}
102-
return stack.RegionSlug, nil
103+
return stack, nil
103104
}
104105

105106
func (r *datasourceFrontendO11yApp) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
@@ -110,12 +111,19 @@ func (r *datasourceFrontendO11yApp) Read(ctx context.Context, req datasource.Rea
110111
return
111112
}
112113

113-
stackRegionSlug, err := r.getStackRegion(ctx, dataTF.StackID.String())
114+
stack, err := r.getStack(ctx, dataTF.StackID.String())
114115
if err != nil {
115116
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
116117
return
117118
}
118-
faroEndpointURL := getFrontendO11yAPIURLForRegion(stackRegionSlug)
119+
120+
createdAt, err := time.Parse(time.RFC3339, stack.CreatedAt)
121+
if err != nil {
122+
resp.Diagnostics.AddError("failed to parse stack created_at date", err.Error())
123+
return
124+
}
125+
126+
faroEndpointURL := getFrontendO11yAPIURLForRegion(stack.RegionSlug, createdAt)
119127
appsClientModel, err := r.client.GetApps(ctx, faroEndpointURL, dataTF.StackID.ValueInt64())
120128
if err != nil {
121129
resp.Diagnostics.AddError("failed to get frontend o11y apps", err.Error())

internal/resources/frontendo11y/resource_frontend_o11y_app.go

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"net/http"
88
"strconv"
99
"strings"
10+
"time"
1011

1112
"github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator"
1213
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
@@ -127,23 +128,7 @@ func (r *resourceFrontendO11yApp) Schema(ctx context.Context, req resource.Schem
127128
}
128129
}
129130

130-
// getRegionSlug gets the region slug from the stack id
131-
func (r *resourceFrontendO11yApp) getRegionSlug(ctx context.Context, stackID string) (string, error) {
132-
stack, res, err := r.gcomClient.InstancesAPI.GetInstance(ctx, stackID).Execute()
133-
if err != nil {
134-
return "", err
135-
}
136-
137-
if res.StatusCode >= 500 {
138-
return "", errors.New("server error")
139-
}
140-
141-
if res.StatusCode == http.StatusNotFound {
142-
return "", fmt.Errorf("stack %q not found", stackID)
143-
}
144-
return stack.RegionSlug, nil
145-
}
146-
131+
// getStack gets the stack information from the stack id
147132
func (r *resourceFrontendO11yApp) getStack(ctx context.Context, stackID string) (*gcom.FormattedApiInstance, error) {
148133
stack, res, err := r.gcomClient.InstancesAPI.GetInstance(ctx, stackID).Execute()
149134
if err != nil {
@@ -171,13 +156,19 @@ func (r *resourceFrontendO11yApp) Create(ctx context.Context, req resource.Creat
171156
app, diags := dataTF.toClientModel(ctx)
172157
resp.Diagnostics.Append(diags...)
173158

174-
stackRegionSlug, err := r.getRegionSlug(ctx, dataTF.StackID.String())
159+
stack, err := r.getStack(ctx, dataTF.StackID.String())
175160
if err != nil {
176161
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
177162
return
178163
}
179164

180-
faroEndpointURL := getFrontendO11yAPIURLForRegion(stackRegionSlug)
165+
createdAt, err := time.Parse(time.RFC3339, stack.CreatedAt)
166+
if err != nil {
167+
resp.Diagnostics.AddError("failed to parse stack created_at date", err.Error())
168+
return
169+
}
170+
171+
faroEndpointURL := getFrontendO11yAPIURLForRegion(stack.RegionSlug, createdAt)
181172
appClientModel, err := r.client.CreateApp(ctx, faroEndpointURL, dataTF.StackID.ValueInt64(), app)
182173
if err != nil {
183174
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
@@ -209,13 +200,13 @@ func (r *resourceFrontendO11yApp) ImportState(ctx context.Context, req resource.
209200
return
210201
}
211202

212-
stackRegionSlug, err := r.getRegionSlug(ctx, stackSlug)
203+
createdAt, err := time.Parse(time.RFC3339, stack.CreatedAt)
213204
if err != nil {
214-
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
205+
resp.Diagnostics.AddError("failed to parse stack created_at date", err.Error())
215206
return
216207
}
217208

218-
faroEndpointURL := getFrontendO11yAPIURLForRegion(stackRegionSlug)
209+
faroEndpointURL := getFrontendO11yAPIURLForRegion(stack.RegionSlug, createdAt)
219210
appClientModel, err := r.client.GetApp(ctx, faroEndpointURL, int64(stack.Id), i64AppID)
220211
if err != nil {
221212
resp.Diagnostics.AddError("failed to get frontend o11y app", err.Error())
@@ -235,13 +226,19 @@ func (r *resourceFrontendO11yApp) Read(ctx context.Context, req resource.ReadReq
235226
return
236227
}
237228

238-
stackRegionSlug, err := r.getRegionSlug(ctx, dataTF.StackID.String())
229+
stack, err := r.getStack(ctx, dataTF.StackID.String())
239230
if err != nil {
240231
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
241232
return
242233
}
243234

244-
faroEndpointURL := getFrontendO11yAPIURLForRegion(stackRegionSlug)
235+
createdAt, err := time.Parse(time.RFC3339, stack.CreatedAt)
236+
if err != nil {
237+
resp.Diagnostics.AddError("failed to parse stack created_at date", err.Error())
238+
return
239+
}
240+
241+
faroEndpointURL := getFrontendO11yAPIURLForRegion(stack.RegionSlug, createdAt)
245242
appClientModel, err := r.client.GetApps(ctx, faroEndpointURL, dataTF.StackID.ValueInt64())
246243
if err != nil {
247244
resp.Diagnostics.AddError("failed to get frontend o11y app", err.Error())
@@ -269,13 +266,19 @@ func (r *resourceFrontendO11yApp) Update(ctx context.Context, req resource.Updat
269266
app, diags := dataTF.toClientModel(ctx)
270267
resp.Diagnostics.Append(diags...)
271268

272-
stackRegionSlug, err := r.getRegionSlug(ctx, dataTF.StackID.String())
269+
stack, err := r.getStack(ctx, dataTF.StackID.String())
273270
if err != nil {
274271
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
275272
return
276273
}
277274

278-
faroEndpointURL := getFrontendO11yAPIURLForRegion(stackRegionSlug)
275+
createdAt, err := time.Parse(time.RFC3339, stack.CreatedAt)
276+
if err != nil {
277+
resp.Diagnostics.AddError("failed to parse stack created_at date", err.Error())
278+
return
279+
}
280+
281+
faroEndpointURL := getFrontendO11yAPIURLForRegion(stack.RegionSlug, createdAt)
279282
appClientModel, err := r.client.UpdateApp(ctx, faroEndpointURL, dataTF.StackID.ValueInt64(), app.ID, app)
280283
if err != nil {
281284
resp.Diagnostics.AddError("failed to update frontend o11y app", err.Error())
@@ -296,13 +299,19 @@ func (r *resourceFrontendO11yApp) Delete(ctx context.Context, req resource.Delet
296299
return
297300
}
298301

299-
stackRegionSlug, err := r.getRegionSlug(ctx, dataTF.StackID.String())
302+
stack, err := r.getStack(ctx, dataTF.StackID.String())
300303
if err != nil {
301304
resp.Diagnostics.AddError("failed to get Grafana Cloud Stack information", err.Error())
302305
return
303306
}
304307

305-
faroEndpointURL := getFrontendO11yAPIURLForRegion(stackRegionSlug)
308+
createdAt, err := time.Parse(time.RFC3339, stack.CreatedAt)
309+
if err != nil {
310+
resp.Diagnostics.AddError("failed to parse stack created_at date", err.Error())
311+
return
312+
}
313+
314+
faroEndpointURL := getFrontendO11yAPIURLForRegion(stack.RegionSlug, createdAt)
306315
err = r.client.DeleteApp(ctx, faroEndpointURL, dataTF.StackID.ValueInt64(), dataTF.ID.ValueInt64())
307316
if err != nil {
308317
resp.Diagnostics.AddError("failed to delete frontend o11y app", err.Error())

0 commit comments

Comments
 (0)