@@ -3,13 +3,13 @@ package github
33import (
44 "context"
55 "fmt"
6- "log"
76 "net/http"
87 "regexp"
98 "strconv"
109 "time"
1110
1211 "github.com/google/go-github/v82/github"
12+ "github.com/hashicorp/terraform-plugin-log/tflog"
1313 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1414 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
1515 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -25,6 +25,11 @@ func resourceGithubEnterpriseActionsHostedRunner() *schema.Resource {
2525 Importer : & schema.ResourceImporter {
2626 StateContext : schema .ImportStatePassthroughContext ,
2727 },
28+
29+ Timeouts : & schema.ResourceTimeout {
30+ Delete : schema .DefaultTimeout (15 * time .Minute ),
31+ },
32+
2833 Schema : map [string ]* schema.Schema {
2934 "enterprise_slug" : {
3035 Type : schema .TypeString ,
@@ -228,48 +233,46 @@ func resourceGithubEnterpriseActionsHostedRunnerCreate(ctx context.Context, d *s
228233 }
229234
230235 // Set the ID in the format enterprise_slug/runner_id
231- d .SetId (fmt .Sprintf ("%s/%d" , enterpriseSlug , * runner .ID ))
236+ id , err := buildID (enterpriseSlug , strconv .FormatInt (runner .GetID (), 10 ))
237+ if err != nil {
238+ return diag .FromErr (err )
239+ }
240+ d .SetId (id )
232241
233242 // Populate computed fields directly from API response
234243 if err := d .Set ("enterprise_slug" , enterpriseSlug ); err != nil {
235244 return diag .FromErr (err )
236245 }
237246
238247 // runner.ID is guaranteed non-nil due to check above
239- if err := d .Set ("runner_id" , int (* runner .ID )); err != nil {
248+ if err := d .Set ("runner_id" , int (runner .GetID () )); err != nil {
240249 return diag .FromErr (err )
241250 }
242251
243- if runner .Name != nil {
244- if err := d .Set ("name" , * runner .Name ); err != nil {
245- return diag .FromErr (err )
246- }
252+ if err := d .Set ("name" , runner .GetName ()); err != nil {
253+ return diag .FromErr (err )
247254 }
248- if runner .Status != nil {
249- if err := d .Set ("status" , * runner .Status ); err != nil {
250- return diag .FromErr (err )
251- }
255+
256+ if err := d .Set ("status" , runner .GetStatus ()); err != nil {
257+ return diag .FromErr (err )
252258 }
253- if runner .Platform != nil {
254- if err := d .Set ("platform" , * runner .Platform ); err != nil {
255- return diag .FromErr (err )
256- }
259+
260+ if err := d .Set ("platform" , runner .GetPlatform ()); err != nil {
261+ return diag .FromErr (err )
257262 }
263+
258264 if runner .LastActiveOn != nil {
259265 if err := d .Set ("last_active_on" , runner .LastActiveOn .Format (time .RFC3339 )); err != nil {
260266 return diag .FromErr (err )
261267 }
262268 }
263- if runner .PublicIPEnabled != nil {
264- if err := d .Set ("public_ip_enabled" , * runner .PublicIPEnabled ); err != nil {
265- return diag .FromErr (err )
266- }
269+
270+ if err := d .Set ("public_ip_enabled" , runner .GetPublicIPEnabled ()); err != nil {
271+ return diag .FromErr (err )
267272 }
268273
269- if runner .ImageDetails != nil {
270- if err := d .Set ("image" , flattenHostedRunnerImage (runner .ImageDetails )); err != nil {
271- return diag .FromErr (err )
272- }
274+ if err := d .Set ("image" , flattenHostedRunnerImage (runner .ImageDetails )); err != nil {
275+ return diag .FromErr (err )
273276 }
274277
275278 if runner .MachineSizeDetails != nil {
@@ -281,16 +284,12 @@ func resourceGithubEnterpriseActionsHostedRunnerCreate(ctx context.Context, d *s
281284 }
282285 }
283286
284- if runner .RunnerGroupID != nil {
285- if err := d .Set ("runner_group_id" , int (* runner .RunnerGroupID )); err != nil {
286- return diag .FromErr (err )
287- }
287+ if err := d .Set ("runner_group_id" , int (runner .GetRunnerGroupID ())); err != nil {
288+ return diag .FromErr (err )
288289 }
289290
290- if runner .MaximumRunners != nil {
291- if err := d .Set ("maximum_runners" , int (* runner .MaximumRunners )); err != nil {
292- return diag .FromErr (err )
293- }
291+ if err := d .Set ("maximum_runners" , int (runner .GetMaximumRunners ())); err != nil {
292+ return diag .FromErr (err )
294293 }
295294
296295 if runner .PublicIPs != nil {
@@ -305,7 +304,7 @@ func resourceGithubEnterpriseActionsHostedRunnerCreate(ctx context.Context, d *s
305304func resourceGithubEnterpriseActionsHostedRunnerRead (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
306305 client := meta .(* Owner ).v3client
307306
308- enterpriseSlug , runnerIDStr , err := parseTwoPartID (d .Id (), "enterprise_slug" , "runner_id" )
307+ enterpriseSlug , runnerIDStr , err := parseID2 (d .Id ())
309308 if err != nil {
310309 return diag .FromErr (err )
311310 }
@@ -318,57 +317,49 @@ func resourceGithubEnterpriseActionsHostedRunnerRead(ctx context.Context, d *sch
318317 runner , resp , err := client .Enterprise .GetHostedRunner (ctx , enterpriseSlug , runnerID )
319318 if err != nil {
320319 if resp != nil && resp .StatusCode == http .StatusNotFound {
321- log .Printf ("[WARN] Removing enterprise hosted runner %s from state because it no longer exists in GitHub" , d .Id ())
320+ tflog .Info (ctx , "Removing enterprise hosted runner from state because it no longer exists in GitHub" , map [string ]any {
321+ "id" : d .Id (),
322+ "enterprise_slug" : enterpriseSlug ,
323+ "runner_id" : runnerID ,
324+ })
322325 d .SetId ("" )
323326 return nil
324327 }
325328 return diag .FromErr (fmt .Errorf ("error reading enterprise hosted runner: %w" , err ))
326329 }
327330
328- if runner == nil {
329- return diag .Errorf ("no runner data returned from API" )
330- }
331-
332331 if err := d .Set ("enterprise_slug" , enterpriseSlug ); err != nil {
333332 return diag .FromErr (err )
334333 }
335334
336- if runner .ID != nil {
337- if err := d .Set ("runner_id" , int (* runner .ID )); err != nil {
338- return diag .FromErr (err )
339- }
335+ if err := d .Set ("runner_id" , int (runner .GetID ())); err != nil {
336+ return diag .FromErr (err )
340337 }
341338
342- if runner .Name != nil {
343- if err := d .Set ("name" , * runner .Name ); err != nil {
344- return diag .FromErr (err )
345- }
339+ if err := d .Set ("name" , runner .GetName ()); err != nil {
340+ return diag .FromErr (err )
346341 }
347- if runner .Status != nil {
348- if err := d .Set ("status" , * runner .Status ); err != nil {
349- return diag .FromErr (err )
350- }
342+
343+ if err := d .Set ("status" , runner .GetStatus ()); err != nil {
344+ return diag .FromErr (err )
351345 }
352- if runner .Platform != nil {
353- if err := d .Set ("platform" , * runner .Platform ); err != nil {
354- return diag .FromErr (err )
355- }
346+
347+ if err := d .Set ("platform" , runner .GetPlatform ()); err != nil {
348+ return diag .FromErr (err )
356349 }
350+
357351 if runner .LastActiveOn != nil {
358352 if err := d .Set ("last_active_on" , runner .LastActiveOn .Format (time .RFC3339 )); err != nil {
359353 return diag .FromErr (err )
360354 }
361355 }
362- if runner .PublicIPEnabled != nil {
363- if err := d .Set ("public_ip_enabled" , * runner .PublicIPEnabled ); err != nil {
364- return diag .FromErr (err )
365- }
356+
357+ if err := d .Set ("public_ip_enabled" , runner .GetPublicIPEnabled ()); err != nil {
358+ return diag .FromErr (err )
366359 }
367360
368- if runner .ImageDetails != nil {
369- if err := d .Set ("image" , flattenHostedRunnerImage (runner .ImageDetails )); err != nil {
370- return diag .FromErr (err )
371- }
361+ if err := d .Set ("image" , flattenHostedRunnerImage (runner .ImageDetails )); err != nil {
362+ return diag .FromErr (err )
372363 }
373364
374365 if runner .MachineSizeDetails != nil {
@@ -380,16 +371,12 @@ func resourceGithubEnterpriseActionsHostedRunnerRead(ctx context.Context, d *sch
380371 }
381372 }
382373
383- if runner .RunnerGroupID != nil {
384- if err := d .Set ("runner_group_id" , int (* runner .RunnerGroupID )); err != nil {
385- return diag .FromErr (err )
386- }
374+ if err := d .Set ("runner_group_id" , int (runner .GetRunnerGroupID ())); err != nil {
375+ return diag .FromErr (err )
387376 }
388377
389- if runner .MaximumRunners != nil {
390- if err := d .Set ("maximum_runners" , int (* runner .MaximumRunners )); err != nil {
391- return diag .FromErr (err )
392- }
378+ if err := d .Set ("maximum_runners" , int (runner .GetMaximumRunners ())); err != nil {
379+ return diag .FromErr (err )
393380 }
394381
395382 if runner .PublicIPs != nil {
@@ -404,7 +391,7 @@ func resourceGithubEnterpriseActionsHostedRunnerRead(ctx context.Context, d *sch
404391func resourceGithubEnterpriseActionsHostedRunnerUpdate (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
405392 client := meta .(* Owner ).v3client
406393
407- enterpriseSlug , runnerIDStr , err := parseTwoPartID (d .Id (), "enterprise_slug" , "runner_id" )
394+ enterpriseSlug , runnerIDStr , err := parseID2 (d .Id ())
408395 if err != nil {
409396 return diag .FromErr (err )
410397 }
@@ -415,33 +402,21 @@ func resourceGithubEnterpriseActionsHostedRunnerUpdate(ctx context.Context, d *s
415402 }
416403
417404 request := & github.HostedRunnerRequest {}
418- hasChanges := false
419405
420406 if d .HasChange ("name" ) {
421407 request .Name = d .Get ("name" ).(string )
422- hasChanges = true
423408 }
424409 if d .HasChange ("size" ) {
425410 request .Size = d .Get ("size" ).(string )
426- hasChanges = true
427411 }
428412 if d .HasChange ("runner_group_id" ) {
429413 request .RunnerGroupID = int64 (d .Get ("runner_group_id" ).(int ))
430- hasChanges = true
431414 }
432415 if d .HasChange ("maximum_runners" ) {
433416 request .MaximumRunners = int64 (d .Get ("maximum_runners" ).(int ))
434- hasChanges = true
435417 }
436418 if d .HasChange ("public_ip_enabled" ) {
437419 request .EnableStaticIP = d .Get ("public_ip_enabled" ).(bool )
438- hasChanges = true
439- }
440-
441- // This should rarely happen as Terraform only calls Update when there are changes in the plan.
442- // However, computed fields or external changes could trigger Update without actual user-configurable changes.
443- if ! hasChanges {
444- return nil
445420 }
446421
447422 _ , _ , err = client .Enterprise .UpdateHostedRunner (ctx , enterpriseSlug , runnerID , * request )
@@ -455,7 +430,7 @@ func resourceGithubEnterpriseActionsHostedRunnerUpdate(ctx context.Context, d *s
455430func resourceGithubEnterpriseActionsHostedRunnerDelete (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
456431 client := meta .(* Owner ).v3client
457432
458- enterpriseSlug , runnerIDStr , err := parseTwoPartID (d .Id (), "enterprise_slug" , "runner_id" )
433+ enterpriseSlug , runnerIDStr , err := parseID2 (d .Id ())
459434 if err != nil {
460435 return diag .FromErr (err )
461436 }
0 commit comments