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
147132func (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