From 6166f56d71cae43eb1258c036298b534a034dc67 Mon Sep 17 00:00:00 2001 From: Sogo Kato Date: Mon, 9 Sep 2024 10:43:41 +0900 Subject: [PATCH 1/4] Fix devops runner --- nifcloud/resources/devops/devopsrunner/expander.go | 7 ++++++- nifcloud/resources/devops/devopsrunner/read.go | 4 ++-- nifcloud/resources/devops/devopsrunner/schema.go | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/nifcloud/resources/devops/devopsrunner/expander.go b/nifcloud/resources/devops/devopsrunner/expander.go index ffc44f0..3754e06 100644 --- a/nifcloud/resources/devops/devopsrunner/expander.go +++ b/nifcloud/resources/devops/devopsrunner/expander.go @@ -8,11 +8,16 @@ import ( ) func expandCreateRunnerInput(d *schema.ResourceData) *devopsrunner.CreateRunnerInput { + var concurrent *int32 + if v := d.Get("concurrent").(int); v != 0 { + concurrent = nifcloud.Int32(int32(v)) + } + return &devopsrunner.CreateRunnerInput{ RunnerName: nifcloud.String(d.Get("name").(string)), InstanceType: types.InstanceTypeOfCreateRunnerRequest(d.Get("instance_type").(string)), AvailabilityZone: types.AvailabilityZoneOfCreateRunnerRequest(d.Get("availability_zone").(string)), - Concurrent: nifcloud.Int32(int32(d.Get("concurrent").(int))), + Concurrent: concurrent, Description: nifcloud.String(d.Get("description").(string)), NetworkConfig: expandNetworkConfig(d), } diff --git a/nifcloud/resources/devops/devopsrunner/read.go b/nifcloud/resources/devops/devopsrunner/read.go index 55ca259..5bd2634 100644 --- a/nifcloud/resources/devops/devopsrunner/read.go +++ b/nifcloud/resources/devops/devopsrunner/read.go @@ -14,7 +14,7 @@ import ( func readRunner(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { svc := meta.(*client.Client).DevOpsRunner - runRes, err := svc.GetRunner(ctx, expandGetRunnerInput(d)) + res, err := svc.GetRunner(ctx, expandGetRunnerInput(d)) if err != nil { var awsErr smithy.APIError if errors.As(err, &awsErr) && awsErr.ErrorCode() == "Client.InvalidParameterNotFound.Runner" { @@ -24,7 +24,7 @@ func readRunner(ctx context.Context, d *schema.ResourceData, meta interface{}) d return diag.FromErr(fmt.Errorf("failed to read a DevOps Runner: %s", err)) } - if err := flatten(d, runRes); err != nil { + if err := flatten(d, res); err != nil { return diag.FromErr(err) } diff --git a/nifcloud/resources/devops/devopsrunner/schema.go b/nifcloud/resources/devops/devopsrunner/schema.go index f85ac4e..8c6dc5b 100644 --- a/nifcloud/resources/devops/devopsrunner/schema.go +++ b/nifcloud/resources/devops/devopsrunner/schema.go @@ -61,6 +61,7 @@ func newSchema() map[string]*schema.Schema { Type: schema.TypeInt, Description: "Limits how many jobs can run concurrently, across all registrations.", Optional: true, + Computed: true, ValidateFunc: validation.All( validation.IntBetween(1, 50), ), From 683d22ee76d6377df50543f997f23db9682e363a Mon Sep 17 00:00:00 2001 From: Sogo Kato Date: Mon, 9 Sep 2024 15:41:45 +0900 Subject: [PATCH 2/4] Create devops runner registration --- docs/resources/devops_runner_registration.md | 42 ++++ examples/devops_runner_registration/main.tf | 27 +++ go.mod | 2 +- go.sum | 4 +- .../acc/devops_runner_parameter_group_test.go | 6 +- .../acc/devops_runner_registration_test.go | 226 ++++++++++++++++++ .../testdata/devops_runner_registration.tf | 33 +++ .../devops_runner_registration_update.tf | 33 +++ nifcloud/provider.go | 2 + .../devops/devopsrunnerregistration/create.go | 36 +++ .../devops/devopsrunnerregistration/delete.go | 29 +++ .../devopsrunnerregistration/expander.go | 45 ++++ .../devopsrunnerregistration/expander_test.go | 172 +++++++++++++ .../devopsrunnerregistration/flattener.go | 54 +++++ .../flattener_test.go | 149 ++++++++++++ .../devops/devopsrunnerregistration/helper.go | 71 ++++++ .../devops/devopsrunnerregistration/read.go | 41 ++++ .../devops/devopsrunnerregistration/schema.go | 107 +++++++++ .../devops/devopsrunnerregistration/update.go | 29 +++ 19 files changed, 1102 insertions(+), 6 deletions(-) create mode 100644 docs/resources/devops_runner_registration.md create mode 100644 examples/devops_runner_registration/main.tf create mode 100644 nifcloud/acc/devops_runner_registration_test.go create mode 100644 nifcloud/acc/testdata/devops_runner_registration.tf create mode 100644 nifcloud/acc/testdata/devops_runner_registration_update.tf create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/create.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/delete.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/expander.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/expander_test.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/flattener.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/flattener_test.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/helper.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/read.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/schema.go create mode 100644 nifcloud/resources/devops/devopsrunnerregistration/update.go diff --git a/docs/resources/devops_runner_registration.md b/docs/resources/devops_runner_registration.md new file mode 100644 index 0000000..c4dcfd4 --- /dev/null +++ b/docs/resources/devops_runner_registration.md @@ -0,0 +1,42 @@ +--- +page_title: "NIFCLOUD: nifcloud_devops_runner_registration" +subcategory: "DevOps with GitLab" +description: |- + Provides a DevOps Runner resource. +--- + +# nifcloud_devops_runner_registration + +Provides a DevOps Runner resource. + +## Example Usage + +```hcl +resource "nifcloud_devops_runner_registration" "example" { + runner_name = nifcloud_devops_runner.example.name + gitlab_url = "https://gitlab.com/" + parameter_group_name = nifcloud_devops_runner_parameter_group.example.name + token = "glrt-thegitlabrunnertoken" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `gitlab_url` - (Required) GitLab URL. +* `parameter_group_name` - (Required) The name of the DevOps Runner parameter group to associate. +* `runner_name` - (Required) The name of the DevOps Runner. +* `token` - (Required) GitLab Runner token. + +## Attribute Reference + +* `id` - ID of the registration. + +## Import + +nifcloud_devops_runner_registration can be imported using the `runner_name` and `id`, separated by an underscore ( _ ). All parts are required. + +``` +$ terraform import nifcloud_devops_runner_registration.example foo_foo-abcde +``` diff --git a/examples/devops_runner_registration/main.tf b/examples/devops_runner_registration/main.tf new file mode 100644 index 0000000..6266aac --- /dev/null +++ b/examples/devops_runner_registration/main.tf @@ -0,0 +1,27 @@ +terraform { + required_providers { + nifcloud = { + source = "nifcloud/nifcloud" + } + } +} + +provider "nifcloud" { + region = "jp-east-1" +} + +resource "nifcloud_devops_runner_registration" "example" { + runner_name = nifcloud_devops_runner.example.name + gitlab_url = "https://gitlab.com/" + parameter_group_name = nifcloud_devops_runner_parameter_group.example.name + token = "glrt-thegitlabrunnertoken" +} + +resource "nifcloud_devops_runner" "example" { + name = "example" + instance_type = "c-small" +} + +resource "nifcloud_devops_runner_parameter_group" "example" { + name = "example" +} diff --git a/go.mod b/go.mod index b5c12a2..265bada 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 github.com/hashicorp/terraform-plugin-sdk/v2 v2.27.0 github.com/katbyte/terrafmt v0.4.0 - github.com/nifcloud/nifcloud-sdk-go v1.27.0 + github.com/nifcloud/nifcloud-sdk-go v1.28.0 github.com/stretchr/testify v1.8.1 golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e golang.org/x/sync v0.1.0 diff --git a/go.sum b/go.sum index b6a4d01..a03bb8b 100644 --- a/go.sum +++ b/go.sum @@ -594,8 +594,8 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6Fx github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nifcloud/nifcloud-sdk-go v1.27.0 h1:1sJDmtVjekMLNs5BOm/t3P3dQmLOB/KXKyD/lJG55BI= -github.com/nifcloud/nifcloud-sdk-go v1.27.0/go.mod h1:+vk7SQl3ed2U4OqEQWmUqW3C/KqtB8VNmbElIbhu2LU= +github.com/nifcloud/nifcloud-sdk-go v1.28.0 h1:D4gCVpCDHZ/McUEjMvgjvbLliRoDnDo9HsNyYT/oHlI= +github.com/nifcloud/nifcloud-sdk-go v1.28.0/go.mod h1:+vk7SQl3ed2U4OqEQWmUqW3C/KqtB8VNmbElIbhu2LU= github.com/nishanths/exhaustive v0.9.5 h1:TzssWan6orBiLYVqewCG8faud9qlFntJE30ACpzmGME= github.com/nishanths/exhaustive v0.9.5/go.mod h1:IbwrGdVMizvDcIxPYGVdQn5BqWJaOwpCvg4RGb8r/TA= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= diff --git a/nifcloud/acc/devops_runner_parameter_group_test.go b/nifcloud/acc/devops_runner_parameter_group_test.go index 6876c52..cdc3b08 100644 --- a/nifcloud/acc/devops_runner_parameter_group_test.go +++ b/nifcloud/acc/devops_runner_parameter_group_test.go @@ -23,9 +23,9 @@ func init() { resource.AddTestSweepers("nifcloud_devops_runner_parameter_group", &resource.Sweeper{ Name: "nifcloud_devops_runner_parameter_group", F: testSweepDevOpsRunnerParameterGroup, - // Dependencies: []string{ - // "nifcloud_devops_runner", - // }, + Dependencies: []string{ + "nifcloud_devops_runner_registration", + }, }) } diff --git a/nifcloud/acc/devops_runner_registration_test.go b/nifcloud/acc/devops_runner_registration_test.go new file mode 100644 index 0000000..ca8c36b --- /dev/null +++ b/nifcloud/acc/devops_runner_registration_test.go @@ -0,0 +1,226 @@ +package acc + +import ( + "context" + "errors" + "fmt" + "os" + "strings" + "testing" + + "github.com/aws/smithy-go" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner/types" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" + "golang.org/x/sync/errgroup" +) + +var devopsGitLabURL = os.Getenv("TF_VAR_devops_gitlab_url") +var devopsRunnerToken = os.Getenv("TF_VAR_devops_runner_token") + +func init() { + resource.AddTestSweepers("nifcloud_devops_runner_registration", &resource.Sweeper{ + Name: "nifcloud_devops_runner_registration", + F: testSweepDevOpsRunnerRegistration, + }) +} + +func TestAcc_DevOpsRunnerRegistration(t *testing.T) { + var registration types.Registrations + + resourceName := "nifcloud_devops_runner_registration.basic" + randName := prefix + acctest.RandString(10) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProviderFactories: testAccProviderFactory, + CheckDestroy: testAccDevOpsRunnerRegistrationResourceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccDevOpsRunnerRegistration(t, "testdata/devops_runner_registration.tf", randName), + Check: resource.ComposeTestCheckFunc( + testAccCheckDevOpsRunnerRegistrationExists(resourceName, ®istration), + testAccCheckDevOpsRunnerRegistrationValues(®istration, randName), + resource.TestCheckResourceAttr(resourceName, "runner_name", randName), + resource.TestCheckResourceAttr(resourceName, "gitlab_url", devopsGitLabURL), + resource.TestCheckResourceAttr(resourceName, "parameter_group_name", randName), + resource.TestCheckResourceAttr(resourceName, "token", devopsRunnerToken[5:14]), + ), + }, + { + Config: testAccDevOpsRunnerRegistration(t, "testdata/devops_runner_registration_update.tf", randName), + Check: resource.ComposeTestCheckFunc( + testAccCheckDevOpsRunnerRegistrationExists(resourceName, ®istration), + testAccCheckDevOpsRunnerRegistrationValuesUpdated(®istration, randName), + resource.TestCheckResourceAttr(resourceName, "runner_name", randName), + resource.TestCheckResourceAttr(resourceName, "gitlab_url", devopsGitLabURL), + resource.TestCheckResourceAttr(resourceName, "parameter_group_name", randName+"-upd"), + resource.TestCheckResourceAttr(resourceName, "token", devopsRunnerToken[5:14]), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateIdFunc: testAccDevOpsRunnerRegistrationImportStateIDFunc(resourceName), + ImportStateVerify: true, + }, + }, + }) +} + +func testAccDevOpsRunnerRegistration(t *testing.T, fileName, rName string) string { + b, err := os.ReadFile(fileName) + if err != nil { + t.Fatal(err) + } + return fmt.Sprintf(string(b), rName, rName, rName) +} + +func testAccCheckDevOpsRunnerRegistrationExists(n string, registration *types.Registrations) resource.TestCheckFunc { + return func(s *terraform.State) error { + saved, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("no devops runner resource: %s", n) + } + + if saved.Primary.Attributes["runner_name"] == "" { + return fmt.Errorf("no devops runner id is set") + } + + svc := testAccProvider.Meta().(*client.Client).DevOpsRunner + res, err := svc.ListRunnerRegistrations(context.Background(), &devopsrunner.ListRunnerRegistrationsInput{ + RunnerName: nifcloud.String(saved.Primary.Attributes["runner_name"]), + }) + if err != nil { + return err + } + + if res.Registrations == nil { + return fmt.Errorf("devops runner registrations are not found in cloud: %s", saved.Primary.ID) + } + + if nifcloud.ToString(res.Registrations[0].RegistrationId) != saved.Primary.ID { + return fmt.Errorf("devops runner registration is not found in cloud: %s", saved.Primary.ID) + } + + *registration = res.Registrations[0] + + return nil + } +} + +func testAccCheckDevOpsRunnerRegistrationValues(registration *types.Registrations, rName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + if nifcloud.ToString(registration.GitlabUrl) != devopsGitLabURL { + return fmt.Errorf("bad gitlab_url state, expected \"%s\", got: %#v", devopsGitLabURL, nifcloud.ToString(registration.GitlabUrl)) + } + + if nifcloud.ToString(registration.ParameterGroupName) != rName { + return fmt.Errorf("bad parameter_group_name state, expected \"%s\", got: %#v", rName, nifcloud.ToString(registration.ParameterGroupName)) + } + + if nifcloud.ToString(registration.Token) != devopsRunnerToken[5:14] { + return fmt.Errorf("bad token state") + } + + return nil + } +} + +func testAccCheckDevOpsRunnerRegistrationValuesUpdated(registration *types.Registrations, rName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + if nifcloud.ToString(registration.GitlabUrl) != devopsGitLabURL { + return fmt.Errorf("bad gitlab_url state, expected \"%s\", got: %#v", devopsGitLabURL, nifcloud.ToString(registration.GitlabUrl)) + } + + if nifcloud.ToString(registration.ParameterGroupName) != rName+"-upd" { + return fmt.Errorf("bad parameter_group_name state, expected \"%s\", got: %#v", rName+"-upd", nifcloud.ToString(registration.ParameterGroupName)) + } + + if nifcloud.ToString(registration.Token) != devopsRunnerToken[5:14] { + return fmt.Errorf("bad token state") + } + + return nil + } +} + +func testAccDevOpsRunnerRegistrationResourceDestroy(s *terraform.State) error { + svc := testAccProvider.Meta().(*client.Client).DevOpsRunner + + for _, rs := range s.RootModule().Resources { + if rs.Type != "nifcloud_devops_runner_registration" { + continue + } + + _, err := svc.GetRunner(context.Background(), &devopsrunner.GetRunnerInput{ + RunnerName: nifcloud.String(rs.Primary.Attributes["runner_name"]), + }) + + if err != nil { + var awsErr smithy.APIError + if errors.As(err, &awsErr) && awsErr.ErrorCode() == "Client.InvalidParameterNotFound.Runner" { + return nil + } + return fmt.Errorf("failed GetRunner: %s", err) + } + + return fmt.Errorf("devops runner (%s) still exists", rs.Primary.Attributes["runner_name"]) + } + return nil +} + +func testSweepDevOpsRunnerRegistration(region string) error { + ctx := context.Background() + svc := sharedClientForRegion(region).DevOpsRunner + + res, err := svc.ListRunners(ctx, nil) + if err != nil { + return err + } + + var sweepRunners []string + for _, r := range res.Runners { + if strings.HasPrefix(nifcloud.ToString(r.RunnerName), prefix) { + sweepRunners = append(sweepRunners, nifcloud.ToString(r.RunnerName)) + } + } + + eg, ctx := errgroup.WithContext(ctx) + for _, n := range sweepRunners { + runner := n + eg.Go(func() error { + _, err := svc.DeleteRunner(ctx, &devopsrunner.DeleteRunnerInput{ + RunnerName: nifcloud.String(runner), + }) + return err + }) + } + if err := eg.Wait(); err != nil { + return err + } + return nil +} + +func testAccDevOpsRunnerRegistrationImportStateIDFunc(resourceName string) resource.ImportStateIdFunc { + return func(s *terraform.State) (string, error) { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return "", fmt.Errorf("not found: %s", resourceName) + } + + runnerName := rs.Primary.Attributes["runner_name"] + registrationId := rs.Primary.ID + + var parts []string + parts = append(parts, runnerName) + parts = append(parts, registrationId) + + id := strings.Join(parts, "_") + return id, nil + } +} diff --git a/nifcloud/acc/testdata/devops_runner_registration.tf b/nifcloud/acc/testdata/devops_runner_registration.tf new file mode 100644 index 0000000..064007a --- /dev/null +++ b/nifcloud/acc/testdata/devops_runner_registration.tf @@ -0,0 +1,33 @@ +provider "nifcloud" { + region = "jp-east-1" +} + +resource "nifcloud_devops_runner_registration" "basic" { + runner_name = nifcloud_devops_runner.basic.name + gitlab_url = var.devops_gitlab_url + parameter_group_name = nifcloud_devops_runner_parameter_group.basic.name + token = var.devops_runner_token +} + +resource "nifcloud_devops_runner" "basic" { + name = "%s" + instance_type = "c-small" +} + +resource "nifcloud_devops_runner_parameter_group" "basic" { + name = "%s" +} + +resource "nifcloud_devops_runner_parameter_group" "upd" { + name = "%s-upd" +} + +variable "devops_gitlab_url" { + description = "test devops GitLab URL" + type = string +} + +variable "devops_runner_token" { + description = "test devops runner token" + type = string +} diff --git a/nifcloud/acc/testdata/devops_runner_registration_update.tf b/nifcloud/acc/testdata/devops_runner_registration_update.tf new file mode 100644 index 0000000..9d61518 --- /dev/null +++ b/nifcloud/acc/testdata/devops_runner_registration_update.tf @@ -0,0 +1,33 @@ +provider "nifcloud" { + region = "jp-east-1" +} + +resource "nifcloud_devops_runner_registration" "basic" { + runner_name = nifcloud_devops_runner.basic.name + gitlab_url = var.devops_gitlab_url + parameter_group_name = nifcloud_devops_runner_parameter_group.upd.name + token = var.devops_runner_token +} + +resource "nifcloud_devops_runner" "basic" { + name = "%s" + instance_type = "c-small" +} + +resource "nifcloud_devops_runner_parameter_group" "basic" { + name = "%s" +} + +resource "nifcloud_devops_runner_parameter_group" "upd" { + name = "%s-upd" +} + +variable "devops_gitlab_url" { + description = "test devops GitLab URL" + type = string +} + +variable "devops_runner_token" { + description = "test devops runner token" + type = string +} diff --git a/nifcloud/provider.go b/nifcloud/provider.go index c3bb82e..fb26d38 100644 --- a/nifcloud/provider.go +++ b/nifcloud/provider.go @@ -17,6 +17,7 @@ import ( "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/devops/devopsparametergroup" "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/devops/devopsrunner" "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/devops/devopsrunnerparametergroup" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/devops/devopsrunnerregistration" "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/dns/record" "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/dns/zone" "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/resources/ess/domaindkim" @@ -137,6 +138,7 @@ func Provider() *schema.Provider { "nifcloud_devops_backup_rule": devopsbackuprule.New(), "nifcloud_devops_runner": devopsrunner.New(), "nifcloud_devops_runner_parameter_group": devopsrunnerparametergroup.New(), + "nifcloud_devops_runner_registration": devopsrunnerregistration.New(), }, } } diff --git a/nifcloud/resources/devops/devopsrunnerregistration/create.go b/nifcloud/resources/devops/devopsrunnerregistration/create.go new file mode 100644 index 0000000..50fa995 --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/create.go @@ -0,0 +1,36 @@ +package devopsrunnerregistration + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" +) + +func createRunnerRegistration(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + svc := meta.(*client.Client).DevOpsRunner + + input := expandRegisterRunnerInput(d) + + _, err := svc.RegisterRunner(ctx, input) + if err != nil { + return diag.FromErr(fmt.Errorf("failed to register the DevOps Runner to a GitLab instance: %s", err)) + } + + err = waitUntilRunnerRunning(ctx, d, svc) + if err != nil { + return diag.FromErr(fmt.Errorf("failed to wait for the DevOps Runner to become ready: %s", err)) + } + + regRes, err := svc.ListRunnerRegistrations(ctx, expandListRunnerRegistrationsInput(d)) + if err != nil { + return diag.FromErr(fmt.Errorf("failed to read a list of DevOps Runner registrations: %s", err)) + } + + d.SetId(nifcloud.ToString(regRes.Registrations[len(regRes.Registrations)-1].RegistrationId)) + + return readRunnerRegistration(ctx, d, meta) +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/delete.go b/nifcloud/resources/devops/devopsrunnerregistration/delete.go new file mode 100644 index 0000000..0d726ff --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/delete.go @@ -0,0 +1,29 @@ +package devopsrunnerregistration + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" +) + +func deleteRunnerRegistration(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + svc := meta.(*client.Client).DevOpsRunner + + input := expandUnregisterRunnerInput(d) + + if _, err := svc.UnregisterRunner(ctx, input); err != nil { + return diag.FromErr(fmt.Errorf("failed to unregister the DevOps runner from a GitLab instance: %s", err)) + } + + err := waitUntilRunnerRunning(ctx, d, svc) + if err != nil { + return diag.FromErr(fmt.Errorf("failed to wait for the DevOps Runner to become ready: %s", err)) + } + + d.SetId("") + + return nil +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/expander.go b/nifcloud/resources/devops/devopsrunnerregistration/expander.go new file mode 100644 index 0000000..6d7ba94 --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/expander.go @@ -0,0 +1,45 @@ +package devopsrunnerregistration + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" +) + +func expandGetRunnerInput(d *schema.ResourceData) *devopsrunner.GetRunnerInput { + return &devopsrunner.GetRunnerInput{ + RunnerName: nifcloud.String(d.Get("runner_name").(string)), + } +} + +func expandListRunnerRegistrationsInput(d *schema.ResourceData) *devopsrunner.ListRunnerRegistrationsInput { + return &devopsrunner.ListRunnerRegistrationsInput{ + RunnerName: nifcloud.String(d.Get("runner_name").(string)), + } +} + +func expandRegisterRunnerInput(d *schema.ResourceData) *devopsrunner.RegisterRunnerInput { + return &devopsrunner.RegisterRunnerInput{ + RunnerName: nifcloud.String(d.Get("runner_name").(string)), + GitlabUrl: nifcloud.String(d.Get("gitlab_url").(string)), + ParameterGroupName: nifcloud.String(d.Get("parameter_group_name").(string)), + AuthenticationToken: nifcloud.String(d.Get("token").(string)), + } +} + +func expandUpdateRunnerRegistrationInput(d *schema.ResourceData) *devopsrunner.UpdateRunnerRegistrationInput { + return &devopsrunner.UpdateRunnerRegistrationInput{ + RunnerName: nifcloud.String(d.Get("runner_name").(string)), + RegistrationId: nifcloud.String(d.Id()), + ParameterGroupName: nifcloud.String(d.Get("parameter_group_name").(string)), + } +} + +func expandUnregisterRunnerInput(d *schema.ResourceData) *devopsrunner.UnregisterRunnerInput { + return &devopsrunner.UnregisterRunnerInput{ + RunnerName: nifcloud.String(d.Get("runner_name").(string)), + RegistrationId: nifcloud.String(d.Id()), + // DisableTokenRevocation is always set to true, enabling the recreation of registrations. + DisableTokenRevocation: nifcloud.Bool(true), + } +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/expander_test.go b/nifcloud/resources/devops/devopsrunnerregistration/expander_test.go new file mode 100644 index 0000000..b2f66b3 --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/expander_test.go @@ -0,0 +1,172 @@ +package devopsrunnerregistration + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" + "github.com/stretchr/testify/assert" +) + +func TestExpandGetsInput(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + "gitlab_url": "test_url", + "parameter_group_name": "test_name_pg", + "token": "glrt-test_token", + }) + rd.SetId("test_id") + + tests := []struct { + name string + args *schema.ResourceData + want *devopsrunner.GetRunnerInput + }{ + { + name: "expands the resource data", + args: rd, + want: &devopsrunner.GetRunnerInput{ + RunnerName: nifcloud.String("test_name"), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := expandGetRunnerInput(tt.args) + assert.Equal(t, tt.want, got) + }) + } +} + +func TestExpandListRunnerRegistrationsInput(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + "gitlab_url": "test_url", + "parameter_group_name": "test_name_pg", + "token": "glrt-test_token", + }) + rd.SetId("test_id") + + tests := []struct { + name string + args *schema.ResourceData + want *devopsrunner.ListRunnerRegistrationsInput + }{ + { + name: "expands the resource data", + args: rd, + want: &devopsrunner.ListRunnerRegistrationsInput{ + RunnerName: nifcloud.String("test_name"), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := expandListRunnerRegistrationsInput(tt.args) + assert.Equal(t, tt.want, got) + }) + } +} + +func TestExpandRegisterRunnerInput(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + "gitlab_url": "test_url", + "parameter_group_name": "test_name_pg", + "token": "glrt-test_token", + }) + rd.SetId("test_id") + + tests := []struct { + name string + args *schema.ResourceData + want *devopsrunner.RegisterRunnerInput + }{ + { + name: "expands the resource data", + args: rd, + want: &devopsrunner.RegisterRunnerInput{ + RunnerName: nifcloud.String("test_name"), + GitlabUrl: nifcloud.String("test_url"), + ParameterGroupName: nifcloud.String("test_name_pg"), + AuthenticationToken: nifcloud.String("glrt-test_token"), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := expandRegisterRunnerInput(tt.args) + assert.Equal(t, tt.want, got) + }) + } +} + +func TestExpandUpdateInput(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + "gitlab_url": "test_url", + "parameter_group_name": "test_name_pg", + "token": "glrt-test_token", + }) + rd.SetId("test_id") + + tests := []struct { + name string + args *schema.ResourceData + want *devopsrunner.UpdateRunnerRegistrationInput + }{ + { + name: "expands the resource data", + args: rd, + want: &devopsrunner.UpdateRunnerRegistrationInput{ + RunnerName: nifcloud.String("test_name"), + RegistrationId: nifcloud.String("test_id"), + ParameterGroupName: nifcloud.String("test_name_pg"), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := expandUpdateRunnerRegistrationInput(tt.args) + assert.Equal(t, tt.want, got) + }) + } +} + +func TestExpandUnregisterRunnerInput(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + "gitlab_url": "test_url", + "parameter_group_name": "test_name_pg", + "token": "glrt-test_token", + }) + rd.SetId("test_id") + + tests := []struct { + name string + args *schema.ResourceData + want *devopsrunner.UnregisterRunnerInput + }{ + { + name: "expands the resource data", + args: rd, + want: &devopsrunner.UnregisterRunnerInput{ + RunnerName: nifcloud.String("test_name"), + RegistrationId: nifcloud.String("test_id"), + DisableTokenRevocation: nifcloud.Bool(true), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := expandUnregisterRunnerInput(tt.args) + assert.Equal(t, tt.want, got) + }) + } +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/flattener.go b/nifcloud/resources/devops/devopsrunnerregistration/flattener.go new file mode 100644 index 0000000..3c62c85 --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/flattener.go @@ -0,0 +1,54 @@ +package devopsrunnerregistration + +import ( + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" +) + +func flattenRunnerName(d *schema.ResourceData, res *devopsrunner.GetRunnerOutput) error { + if res == nil || res.Runner == nil { + d.SetId("") + return nil + } + + runner := res.Runner + + if nifcloud.ToString(runner.RunnerName) != d.Get("runner_name").(string) { + return fmt.Errorf("unable to find the DevOps Runner within: %#v", runner) + } + + if err := d.Set("runner_name", runner.RunnerName); err != nil { + return err + } + + return nil +} + +func flatten(d *schema.ResourceData, res *devopsrunner.ListRunnerRegistrationsOutput) error { + if res == nil || res.Registrations == nil { + return nil + } + + for _, r := range res.Registrations { + if nifcloud.ToString(r.RegistrationId) != d.Id() { + continue + } + + if err := d.Set("gitlab_url", r.GitlabUrl); err != nil { + return err + } + + if err := d.Set("parameter_group_name", r.ParameterGroupName); err != nil { + return err + } + + if err := d.Set("token", r.Token); err != nil { + return err + } + } + + return nil +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/flattener_test.go b/nifcloud/resources/devops/devopsrunnerregistration/flattener_test.go new file mode 100644 index 0000000..9a071fa --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/flattener_test.go @@ -0,0 +1,149 @@ +package devopsrunnerregistration + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner/types" + "github.com/stretchr/testify/assert" +) + +func TestFlattenRunnerName(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + }) + rd.SetId("test_id") + + wantRd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + }) + wantRd.SetId("test_id") + + wantNotFoundRd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{}) + + type args struct { + res *devopsrunner.GetRunnerOutput + d *schema.ResourceData + } + tests := []struct { + name string + args args + want *schema.ResourceData + }{ + { + name: "flattens the response", + args: args{ + d: rd, + res: &devopsrunner.GetRunnerOutput{ + Runner: &types.Runner{ + RunnerName: nifcloud.String("test_name"), + }, + }, + }, + want: wantRd, + }, + { + name: "flattens the response even when the resource has been removed externally", + args: args{ + d: wantNotFoundRd, + res: nil, + }, + want: wantNotFoundRd, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := flattenRunnerName(tt.args.d, tt.args.res) + assert.NoError(t, err) + + wantState := tt.want.State() + if wantState == nil { + tt.want.SetId("some") + wantState = tt.want.State() + } + + gotState := tt.args.d.State() + if gotState == nil { + tt.args.d.SetId("some") + gotState = tt.args.d.State() + } + + assert.Equal(t, wantState.Attributes, gotState.Attributes) + }) + } +} + +func TestFlatten(t *testing.T) { + rd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + }) + rd.SetId("test_id") + + wantRd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{ + "runner_name": "test_name", + "gitlab_url": "test_url", + "parameter_group_name": "test_name_pg", + "token": "test_token", + }) + wantRd.SetId("test_id") + + wantNotFoundRd := schema.TestResourceDataRaw(t, newSchema(), map[string]interface{}{}) + + type args struct { + res *devopsrunner.ListRunnerRegistrationsOutput + d *schema.ResourceData + } + tests := []struct { + name string + args args + want *schema.ResourceData + }{ + { + name: "flattens the response", + args: args{ + d: rd, + res: &devopsrunner.ListRunnerRegistrationsOutput{ + Registrations: []types.Registrations{{ + RegistrationId: nifcloud.String("test_id"), + GitlabUrl: nifcloud.String("test_url/"), + ParameterGroupName: nifcloud.String("test_name_pg"), + Token: nifcloud.String("test_token"), + }}, + }, + }, + want: wantRd, + }, + { + name: "flattens the response even when the resource has been removed externally", + args: args{ + d: wantNotFoundRd, + res: nil, + }, + want: wantNotFoundRd, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := flatten(tt.args.d, tt.args.res) + assert.NoError(t, err) + + wantState := tt.want.State() + if wantState == nil { + tt.want.SetId("some") + wantState = tt.want.State() + } + + gotState := tt.args.d.State() + if gotState == nil { + tt.args.d.SetId("some") + gotState = tt.args.d.State() + } + + assert.Equal(t, wantState.Attributes, gotState.Attributes) + }) + } +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/helper.go b/nifcloud/resources/devops/devopsrunnerregistration/helper.go new file mode 100644 index 0000000..1e35fea --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/helper.go @@ -0,0 +1,71 @@ +package devopsrunnerregistration + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" +) + +// waitUntilRunnerRunning waits until the state of the runner become RUNNING. +// DevOps SDK does not provide a waiter. +func waitUntilRunnerRunning(ctx context.Context, d *schema.ResourceData, svc *devopsrunner.Client) error { + const timeout = 3600 * time.Second + + err := retry.RetryContext(ctx, timeout, func() *retry.RetryError { + input := expandGetRunnerInput(d) + res, err := svc.GetRunner(ctx, input) + if err != nil { + return retry.NonRetryableError(err) + } + + if nifcloud.ToString(res.Runner.Status.Name) == "RUNNING" { + return nil + } + + return retry.RetryableError(fmt.Errorf("expected the DevOps Runner was in state RUNNING")) + }) + + return err +} + +func validateRunnerRegistrationImportString(importStr string) ([]string, error) { + // example: runnerName_registrationId + + importParts := strings.Split(importStr, "_") + errStr := "unexpected format of import string (%q), expected RUNNERNAME_REGISTRATIONID: %s" + if len(importParts) < 2 { + return nil, fmt.Errorf(errStr, importStr, "invalid parts") + } + + runnerName := importParts[0] + id := importParts[1] + + if runnerName == "" { + return nil, fmt.Errorf(errStr, importStr, "runner_name must be required") + } + + if id == "" { + return nil, fmt.Errorf(errStr, importStr, "id must be required") + } + + return importParts, nil +} + +func populateRunnerRegistrationFromImport(d *schema.ResourceData, importParts []string) error { + runnerName := importParts[0] + id := importParts[1] + + if err := d.Set("runner_name", runnerName); err != nil { + return err + } + + d.SetId(id) + + return nil +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/read.go b/nifcloud/resources/devops/devopsrunnerregistration/read.go new file mode 100644 index 0000000..9ebd006 --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/read.go @@ -0,0 +1,41 @@ +package devopsrunnerregistration + +import ( + "context" + "errors" + "fmt" + + "github.com/aws/smithy-go" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" +) + +func readRunnerRegistration(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + svc := meta.(*client.Client).DevOpsRunner + + runRes, err := svc.GetRunner(ctx, expandGetRunnerInput(d)) + if err != nil { + var awsErr smithy.APIError + if errors.As(err, &awsErr) && awsErr.ErrorCode() == "Client.InvalidParameterNotFound.Runner" { + d.SetId("") + return nil + } + return diag.FromErr(fmt.Errorf("failed to read a DevOps Runner: %s", err)) + } + + if err := flattenRunnerName(d, runRes); err != nil { + return diag.FromErr(err) + } + + regRes, err := svc.ListRunnerRegistrations(ctx, expandListRunnerRegistrationsInput(d)) + if err != nil { + return diag.FromErr(fmt.Errorf("failed to read a list of DevOps Runner registrations: %s", err)) + } + + if err := flatten(d, regRes); err != nil { + return diag.FromErr(err) + } + + return nil +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/schema.go b/nifcloud/resources/devops/devopsrunnerregistration/schema.go new file mode 100644 index 0000000..fc2efe1 --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/schema.go @@ -0,0 +1,107 @@ +package devopsrunnerregistration + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/hashicorp/go-cty/cty" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +const description = "Provides a DevOps Runner registration resource." + +// New returns the nifcloud_devops_runner_registration resource schema. +func New() *schema.Resource { + return &schema.Resource{ + Description: description, + Schema: newSchema(), + + CreateContext: createRunnerRegistration, + ReadContext: readRunnerRegistration, + UpdateContext: updateRunnerRegistration, + DeleteContext: deleteRunnerRegistration, + + Importer: &schema.ResourceImporter{ + StateContext: func(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { + importParts, err := validateRunnerRegistrationImportString(d.Id()) + if err != nil { + return nil, err + } + if err := populateRunnerRegistrationFromImport(d, importParts); err != nil { + return nil, err + } + return []*schema.ResourceData{d}, nil + }, + }, + Timeouts: &schema.ResourceTimeout{ + Default: schema.DefaultTimeout(5 * time.Minute), + }, + } +} + +func newSchema() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "id": { + Type: schema.TypeString, + Description: "The name of the DevOps Runner registration.", + Computed: true, + }, + "runner_name": { + Type: schema.TypeString, + Description: "The name of the DevOps Runner to register.", + Required: true, + ForceNew: true, + }, + "gitlab_url": { + Type: schema.TypeString, + Description: "GitLab URL.", + Required: true, + ForceNew: true, + StateFunc: func(i interface{}) string { + v := i.(string) + // NIFCLOUD DevOps Runner API returns URLs with a trailing slash. + if !strings.HasSuffix(v, "/") { + return v + "/" + } + return v + }, + }, + "parameter_group_name": { + Type: schema.TypeString, + Description: "The name of the DevOps Runner parameter group to associate.", + Required: true, + }, + "token": { + Type: schema.TypeString, + Description: "GitLab Runner token.", + Required: true, + ForceNew: true, + Sensitive: true, + DiffSuppressFunc: func(k, oldValue, newValue string, d *schema.ResourceData) bool { + if len(oldValue) > 14 { + oldValue = oldValue[5:14] + } + if len(newValue) > 14 { + newValue = newValue[5:14] + } + return oldValue == newValue + }, + ValidateDiagFunc: func(v any, p cty.Path) diag.Diagnostics { + value := v.(string) + var diags diag.Diagnostics + if !strings.HasPrefix(value, "glrt-") { + diag := diag.Diagnostic{ + Severity: diag.Error, + Summary: "wrong value", + Detail: fmt.Sprintf("%q does not start with \"glrt-\".", value), + } + diags = append(diags, diag) + } + return diags + }, + }, + } +} diff --git a/nifcloud/resources/devops/devopsrunnerregistration/update.go b/nifcloud/resources/devops/devopsrunnerregistration/update.go new file mode 100644 index 0000000..ae69e2a --- /dev/null +++ b/nifcloud/resources/devops/devopsrunnerregistration/update.go @@ -0,0 +1,29 @@ +package devopsrunnerregistration + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" +) + +func updateRunnerRegistration(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + svc := meta.(*client.Client).DevOpsRunner + + if d.HasChange("parameter_group_name") { + input := expandUpdateRunnerRegistrationInput(d) + + if _, err := svc.UpdateRunnerRegistration(ctx, input); err != nil { + return diag.FromErr(fmt.Errorf("failed to update a DevOps Runner registration: %s", err)) + } + + err := waitUntilRunnerRunning(ctx, d, svc) + if err != nil { + return diag.FromErr(fmt.Errorf("failed to wait for the DevOps Runner to become ready: %s", err)) + } + } + + return readRunnerRegistration(ctx, d, meta) +} From 51a9bd177e7bb42bcb171e2a1a154a9c854a4f51 Mon Sep 17 00:00:00 2001 From: Sogo Kato Date: Tue, 1 Oct 2024 16:02:28 +0900 Subject: [PATCH 3/4] Remove devops_runner_registration acc test --- .../acc/devops_runner_registration_test.go | 226 ------------------ .../testdata/devops_runner_registration.tf | 33 --- .../devops_runner_registration_update.tf | 33 --- 3 files changed, 292 deletions(-) delete mode 100644 nifcloud/acc/devops_runner_registration_test.go delete mode 100644 nifcloud/acc/testdata/devops_runner_registration.tf delete mode 100644 nifcloud/acc/testdata/devops_runner_registration_update.tf diff --git a/nifcloud/acc/devops_runner_registration_test.go b/nifcloud/acc/devops_runner_registration_test.go deleted file mode 100644 index ca8c36b..0000000 --- a/nifcloud/acc/devops_runner_registration_test.go +++ /dev/null @@ -1,226 +0,0 @@ -package acc - -import ( - "context" - "errors" - "fmt" - "os" - "strings" - "testing" - - "github.com/aws/smithy-go" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" - "github.com/nifcloud/nifcloud-sdk-go/nifcloud" - "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" - "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner/types" - "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" - "golang.org/x/sync/errgroup" -) - -var devopsGitLabURL = os.Getenv("TF_VAR_devops_gitlab_url") -var devopsRunnerToken = os.Getenv("TF_VAR_devops_runner_token") - -func init() { - resource.AddTestSweepers("nifcloud_devops_runner_registration", &resource.Sweeper{ - Name: "nifcloud_devops_runner_registration", - F: testSweepDevOpsRunnerRegistration, - }) -} - -func TestAcc_DevOpsRunnerRegistration(t *testing.T) { - var registration types.Registrations - - resourceName := "nifcloud_devops_runner_registration.basic" - randName := prefix + acctest.RandString(10) - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactory, - CheckDestroy: testAccDevOpsRunnerRegistrationResourceDestroy, - Steps: []resource.TestStep{ - { - Config: testAccDevOpsRunnerRegistration(t, "testdata/devops_runner_registration.tf", randName), - Check: resource.ComposeTestCheckFunc( - testAccCheckDevOpsRunnerRegistrationExists(resourceName, ®istration), - testAccCheckDevOpsRunnerRegistrationValues(®istration, randName), - resource.TestCheckResourceAttr(resourceName, "runner_name", randName), - resource.TestCheckResourceAttr(resourceName, "gitlab_url", devopsGitLabURL), - resource.TestCheckResourceAttr(resourceName, "parameter_group_name", randName), - resource.TestCheckResourceAttr(resourceName, "token", devopsRunnerToken[5:14]), - ), - }, - { - Config: testAccDevOpsRunnerRegistration(t, "testdata/devops_runner_registration_update.tf", randName), - Check: resource.ComposeTestCheckFunc( - testAccCheckDevOpsRunnerRegistrationExists(resourceName, ®istration), - testAccCheckDevOpsRunnerRegistrationValuesUpdated(®istration, randName), - resource.TestCheckResourceAttr(resourceName, "runner_name", randName), - resource.TestCheckResourceAttr(resourceName, "gitlab_url", devopsGitLabURL), - resource.TestCheckResourceAttr(resourceName, "parameter_group_name", randName+"-upd"), - resource.TestCheckResourceAttr(resourceName, "token", devopsRunnerToken[5:14]), - ), - }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateIdFunc: testAccDevOpsRunnerRegistrationImportStateIDFunc(resourceName), - ImportStateVerify: true, - }, - }, - }) -} - -func testAccDevOpsRunnerRegistration(t *testing.T, fileName, rName string) string { - b, err := os.ReadFile(fileName) - if err != nil { - t.Fatal(err) - } - return fmt.Sprintf(string(b), rName, rName, rName) -} - -func testAccCheckDevOpsRunnerRegistrationExists(n string, registration *types.Registrations) resource.TestCheckFunc { - return func(s *terraform.State) error { - saved, ok := s.RootModule().Resources[n] - if !ok { - return fmt.Errorf("no devops runner resource: %s", n) - } - - if saved.Primary.Attributes["runner_name"] == "" { - return fmt.Errorf("no devops runner id is set") - } - - svc := testAccProvider.Meta().(*client.Client).DevOpsRunner - res, err := svc.ListRunnerRegistrations(context.Background(), &devopsrunner.ListRunnerRegistrationsInput{ - RunnerName: nifcloud.String(saved.Primary.Attributes["runner_name"]), - }) - if err != nil { - return err - } - - if res.Registrations == nil { - return fmt.Errorf("devops runner registrations are not found in cloud: %s", saved.Primary.ID) - } - - if nifcloud.ToString(res.Registrations[0].RegistrationId) != saved.Primary.ID { - return fmt.Errorf("devops runner registration is not found in cloud: %s", saved.Primary.ID) - } - - *registration = res.Registrations[0] - - return nil - } -} - -func testAccCheckDevOpsRunnerRegistrationValues(registration *types.Registrations, rName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - if nifcloud.ToString(registration.GitlabUrl) != devopsGitLabURL { - return fmt.Errorf("bad gitlab_url state, expected \"%s\", got: %#v", devopsGitLabURL, nifcloud.ToString(registration.GitlabUrl)) - } - - if nifcloud.ToString(registration.ParameterGroupName) != rName { - return fmt.Errorf("bad parameter_group_name state, expected \"%s\", got: %#v", rName, nifcloud.ToString(registration.ParameterGroupName)) - } - - if nifcloud.ToString(registration.Token) != devopsRunnerToken[5:14] { - return fmt.Errorf("bad token state") - } - - return nil - } -} - -func testAccCheckDevOpsRunnerRegistrationValuesUpdated(registration *types.Registrations, rName string) resource.TestCheckFunc { - return func(s *terraform.State) error { - if nifcloud.ToString(registration.GitlabUrl) != devopsGitLabURL { - return fmt.Errorf("bad gitlab_url state, expected \"%s\", got: %#v", devopsGitLabURL, nifcloud.ToString(registration.GitlabUrl)) - } - - if nifcloud.ToString(registration.ParameterGroupName) != rName+"-upd" { - return fmt.Errorf("bad parameter_group_name state, expected \"%s\", got: %#v", rName+"-upd", nifcloud.ToString(registration.ParameterGroupName)) - } - - if nifcloud.ToString(registration.Token) != devopsRunnerToken[5:14] { - return fmt.Errorf("bad token state") - } - - return nil - } -} - -func testAccDevOpsRunnerRegistrationResourceDestroy(s *terraform.State) error { - svc := testAccProvider.Meta().(*client.Client).DevOpsRunner - - for _, rs := range s.RootModule().Resources { - if rs.Type != "nifcloud_devops_runner_registration" { - continue - } - - _, err := svc.GetRunner(context.Background(), &devopsrunner.GetRunnerInput{ - RunnerName: nifcloud.String(rs.Primary.Attributes["runner_name"]), - }) - - if err != nil { - var awsErr smithy.APIError - if errors.As(err, &awsErr) && awsErr.ErrorCode() == "Client.InvalidParameterNotFound.Runner" { - return nil - } - return fmt.Errorf("failed GetRunner: %s", err) - } - - return fmt.Errorf("devops runner (%s) still exists", rs.Primary.Attributes["runner_name"]) - } - return nil -} - -func testSweepDevOpsRunnerRegistration(region string) error { - ctx := context.Background() - svc := sharedClientForRegion(region).DevOpsRunner - - res, err := svc.ListRunners(ctx, nil) - if err != nil { - return err - } - - var sweepRunners []string - for _, r := range res.Runners { - if strings.HasPrefix(nifcloud.ToString(r.RunnerName), prefix) { - sweepRunners = append(sweepRunners, nifcloud.ToString(r.RunnerName)) - } - } - - eg, ctx := errgroup.WithContext(ctx) - for _, n := range sweepRunners { - runner := n - eg.Go(func() error { - _, err := svc.DeleteRunner(ctx, &devopsrunner.DeleteRunnerInput{ - RunnerName: nifcloud.String(runner), - }) - return err - }) - } - if err := eg.Wait(); err != nil { - return err - } - return nil -} - -func testAccDevOpsRunnerRegistrationImportStateIDFunc(resourceName string) resource.ImportStateIdFunc { - return func(s *terraform.State) (string, error) { - rs, ok := s.RootModule().Resources[resourceName] - if !ok { - return "", fmt.Errorf("not found: %s", resourceName) - } - - runnerName := rs.Primary.Attributes["runner_name"] - registrationId := rs.Primary.ID - - var parts []string - parts = append(parts, runnerName) - parts = append(parts, registrationId) - - id := strings.Join(parts, "_") - return id, nil - } -} diff --git a/nifcloud/acc/testdata/devops_runner_registration.tf b/nifcloud/acc/testdata/devops_runner_registration.tf deleted file mode 100644 index 064007a..0000000 --- a/nifcloud/acc/testdata/devops_runner_registration.tf +++ /dev/null @@ -1,33 +0,0 @@ -provider "nifcloud" { - region = "jp-east-1" -} - -resource "nifcloud_devops_runner_registration" "basic" { - runner_name = nifcloud_devops_runner.basic.name - gitlab_url = var.devops_gitlab_url - parameter_group_name = nifcloud_devops_runner_parameter_group.basic.name - token = var.devops_runner_token -} - -resource "nifcloud_devops_runner" "basic" { - name = "%s" - instance_type = "c-small" -} - -resource "nifcloud_devops_runner_parameter_group" "basic" { - name = "%s" -} - -resource "nifcloud_devops_runner_parameter_group" "upd" { - name = "%s-upd" -} - -variable "devops_gitlab_url" { - description = "test devops GitLab URL" - type = string -} - -variable "devops_runner_token" { - description = "test devops runner token" - type = string -} diff --git a/nifcloud/acc/testdata/devops_runner_registration_update.tf b/nifcloud/acc/testdata/devops_runner_registration_update.tf deleted file mode 100644 index 9d61518..0000000 --- a/nifcloud/acc/testdata/devops_runner_registration_update.tf +++ /dev/null @@ -1,33 +0,0 @@ -provider "nifcloud" { - region = "jp-east-1" -} - -resource "nifcloud_devops_runner_registration" "basic" { - runner_name = nifcloud_devops_runner.basic.name - gitlab_url = var.devops_gitlab_url - parameter_group_name = nifcloud_devops_runner_parameter_group.upd.name - token = var.devops_runner_token -} - -resource "nifcloud_devops_runner" "basic" { - name = "%s" - instance_type = "c-small" -} - -resource "nifcloud_devops_runner_parameter_group" "basic" { - name = "%s" -} - -resource "nifcloud_devops_runner_parameter_group" "upd" { - name = "%s-upd" -} - -variable "devops_gitlab_url" { - description = "test devops GitLab URL" - type = string -} - -variable "devops_runner_token" { - description = "test devops runner token" - type = string -} From 5f0928f799eb7dd447ca05193383a8dcd2bf939e Mon Sep 17 00:00:00 2001 From: Sogo Kato Date: Tue, 1 Oct 2024 16:03:32 +0900 Subject: [PATCH 4/4] Revert "Remove devops_runner_registration acc test" This reverts commit 51a9bd177e7bb42bcb171e2a1a154a9c854a4f51. --- .../acc/devops_runner_registration_test.go | 226 ++++++++++++++++++ .../testdata/devops_runner_registration.tf | 33 +++ .../devops_runner_registration_update.tf | 33 +++ 3 files changed, 292 insertions(+) create mode 100644 nifcloud/acc/devops_runner_registration_test.go create mode 100644 nifcloud/acc/testdata/devops_runner_registration.tf create mode 100644 nifcloud/acc/testdata/devops_runner_registration_update.tf diff --git a/nifcloud/acc/devops_runner_registration_test.go b/nifcloud/acc/devops_runner_registration_test.go new file mode 100644 index 0000000..ca8c36b --- /dev/null +++ b/nifcloud/acc/devops_runner_registration_test.go @@ -0,0 +1,226 @@ +package acc + +import ( + "context" + "errors" + "fmt" + "os" + "strings" + "testing" + + "github.com/aws/smithy-go" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/nifcloud/nifcloud-sdk-go/nifcloud" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner" + "github.com/nifcloud/nifcloud-sdk-go/service/devopsrunner/types" + "github.com/nifcloud/terraform-provider-nifcloud/nifcloud/client" + "golang.org/x/sync/errgroup" +) + +var devopsGitLabURL = os.Getenv("TF_VAR_devops_gitlab_url") +var devopsRunnerToken = os.Getenv("TF_VAR_devops_runner_token") + +func init() { + resource.AddTestSweepers("nifcloud_devops_runner_registration", &resource.Sweeper{ + Name: "nifcloud_devops_runner_registration", + F: testSweepDevOpsRunnerRegistration, + }) +} + +func TestAcc_DevOpsRunnerRegistration(t *testing.T) { + var registration types.Registrations + + resourceName := "nifcloud_devops_runner_registration.basic" + randName := prefix + acctest.RandString(10) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProviderFactories: testAccProviderFactory, + CheckDestroy: testAccDevOpsRunnerRegistrationResourceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccDevOpsRunnerRegistration(t, "testdata/devops_runner_registration.tf", randName), + Check: resource.ComposeTestCheckFunc( + testAccCheckDevOpsRunnerRegistrationExists(resourceName, ®istration), + testAccCheckDevOpsRunnerRegistrationValues(®istration, randName), + resource.TestCheckResourceAttr(resourceName, "runner_name", randName), + resource.TestCheckResourceAttr(resourceName, "gitlab_url", devopsGitLabURL), + resource.TestCheckResourceAttr(resourceName, "parameter_group_name", randName), + resource.TestCheckResourceAttr(resourceName, "token", devopsRunnerToken[5:14]), + ), + }, + { + Config: testAccDevOpsRunnerRegistration(t, "testdata/devops_runner_registration_update.tf", randName), + Check: resource.ComposeTestCheckFunc( + testAccCheckDevOpsRunnerRegistrationExists(resourceName, ®istration), + testAccCheckDevOpsRunnerRegistrationValuesUpdated(®istration, randName), + resource.TestCheckResourceAttr(resourceName, "runner_name", randName), + resource.TestCheckResourceAttr(resourceName, "gitlab_url", devopsGitLabURL), + resource.TestCheckResourceAttr(resourceName, "parameter_group_name", randName+"-upd"), + resource.TestCheckResourceAttr(resourceName, "token", devopsRunnerToken[5:14]), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateIdFunc: testAccDevOpsRunnerRegistrationImportStateIDFunc(resourceName), + ImportStateVerify: true, + }, + }, + }) +} + +func testAccDevOpsRunnerRegistration(t *testing.T, fileName, rName string) string { + b, err := os.ReadFile(fileName) + if err != nil { + t.Fatal(err) + } + return fmt.Sprintf(string(b), rName, rName, rName) +} + +func testAccCheckDevOpsRunnerRegistrationExists(n string, registration *types.Registrations) resource.TestCheckFunc { + return func(s *terraform.State) error { + saved, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("no devops runner resource: %s", n) + } + + if saved.Primary.Attributes["runner_name"] == "" { + return fmt.Errorf("no devops runner id is set") + } + + svc := testAccProvider.Meta().(*client.Client).DevOpsRunner + res, err := svc.ListRunnerRegistrations(context.Background(), &devopsrunner.ListRunnerRegistrationsInput{ + RunnerName: nifcloud.String(saved.Primary.Attributes["runner_name"]), + }) + if err != nil { + return err + } + + if res.Registrations == nil { + return fmt.Errorf("devops runner registrations are not found in cloud: %s", saved.Primary.ID) + } + + if nifcloud.ToString(res.Registrations[0].RegistrationId) != saved.Primary.ID { + return fmt.Errorf("devops runner registration is not found in cloud: %s", saved.Primary.ID) + } + + *registration = res.Registrations[0] + + return nil + } +} + +func testAccCheckDevOpsRunnerRegistrationValues(registration *types.Registrations, rName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + if nifcloud.ToString(registration.GitlabUrl) != devopsGitLabURL { + return fmt.Errorf("bad gitlab_url state, expected \"%s\", got: %#v", devopsGitLabURL, nifcloud.ToString(registration.GitlabUrl)) + } + + if nifcloud.ToString(registration.ParameterGroupName) != rName { + return fmt.Errorf("bad parameter_group_name state, expected \"%s\", got: %#v", rName, nifcloud.ToString(registration.ParameterGroupName)) + } + + if nifcloud.ToString(registration.Token) != devopsRunnerToken[5:14] { + return fmt.Errorf("bad token state") + } + + return nil + } +} + +func testAccCheckDevOpsRunnerRegistrationValuesUpdated(registration *types.Registrations, rName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + if nifcloud.ToString(registration.GitlabUrl) != devopsGitLabURL { + return fmt.Errorf("bad gitlab_url state, expected \"%s\", got: %#v", devopsGitLabURL, nifcloud.ToString(registration.GitlabUrl)) + } + + if nifcloud.ToString(registration.ParameterGroupName) != rName+"-upd" { + return fmt.Errorf("bad parameter_group_name state, expected \"%s\", got: %#v", rName+"-upd", nifcloud.ToString(registration.ParameterGroupName)) + } + + if nifcloud.ToString(registration.Token) != devopsRunnerToken[5:14] { + return fmt.Errorf("bad token state") + } + + return nil + } +} + +func testAccDevOpsRunnerRegistrationResourceDestroy(s *terraform.State) error { + svc := testAccProvider.Meta().(*client.Client).DevOpsRunner + + for _, rs := range s.RootModule().Resources { + if rs.Type != "nifcloud_devops_runner_registration" { + continue + } + + _, err := svc.GetRunner(context.Background(), &devopsrunner.GetRunnerInput{ + RunnerName: nifcloud.String(rs.Primary.Attributes["runner_name"]), + }) + + if err != nil { + var awsErr smithy.APIError + if errors.As(err, &awsErr) && awsErr.ErrorCode() == "Client.InvalidParameterNotFound.Runner" { + return nil + } + return fmt.Errorf("failed GetRunner: %s", err) + } + + return fmt.Errorf("devops runner (%s) still exists", rs.Primary.Attributes["runner_name"]) + } + return nil +} + +func testSweepDevOpsRunnerRegistration(region string) error { + ctx := context.Background() + svc := sharedClientForRegion(region).DevOpsRunner + + res, err := svc.ListRunners(ctx, nil) + if err != nil { + return err + } + + var sweepRunners []string + for _, r := range res.Runners { + if strings.HasPrefix(nifcloud.ToString(r.RunnerName), prefix) { + sweepRunners = append(sweepRunners, nifcloud.ToString(r.RunnerName)) + } + } + + eg, ctx := errgroup.WithContext(ctx) + for _, n := range sweepRunners { + runner := n + eg.Go(func() error { + _, err := svc.DeleteRunner(ctx, &devopsrunner.DeleteRunnerInput{ + RunnerName: nifcloud.String(runner), + }) + return err + }) + } + if err := eg.Wait(); err != nil { + return err + } + return nil +} + +func testAccDevOpsRunnerRegistrationImportStateIDFunc(resourceName string) resource.ImportStateIdFunc { + return func(s *terraform.State) (string, error) { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return "", fmt.Errorf("not found: %s", resourceName) + } + + runnerName := rs.Primary.Attributes["runner_name"] + registrationId := rs.Primary.ID + + var parts []string + parts = append(parts, runnerName) + parts = append(parts, registrationId) + + id := strings.Join(parts, "_") + return id, nil + } +} diff --git a/nifcloud/acc/testdata/devops_runner_registration.tf b/nifcloud/acc/testdata/devops_runner_registration.tf new file mode 100644 index 0000000..064007a --- /dev/null +++ b/nifcloud/acc/testdata/devops_runner_registration.tf @@ -0,0 +1,33 @@ +provider "nifcloud" { + region = "jp-east-1" +} + +resource "nifcloud_devops_runner_registration" "basic" { + runner_name = nifcloud_devops_runner.basic.name + gitlab_url = var.devops_gitlab_url + parameter_group_name = nifcloud_devops_runner_parameter_group.basic.name + token = var.devops_runner_token +} + +resource "nifcloud_devops_runner" "basic" { + name = "%s" + instance_type = "c-small" +} + +resource "nifcloud_devops_runner_parameter_group" "basic" { + name = "%s" +} + +resource "nifcloud_devops_runner_parameter_group" "upd" { + name = "%s-upd" +} + +variable "devops_gitlab_url" { + description = "test devops GitLab URL" + type = string +} + +variable "devops_runner_token" { + description = "test devops runner token" + type = string +} diff --git a/nifcloud/acc/testdata/devops_runner_registration_update.tf b/nifcloud/acc/testdata/devops_runner_registration_update.tf new file mode 100644 index 0000000..9d61518 --- /dev/null +++ b/nifcloud/acc/testdata/devops_runner_registration_update.tf @@ -0,0 +1,33 @@ +provider "nifcloud" { + region = "jp-east-1" +} + +resource "nifcloud_devops_runner_registration" "basic" { + runner_name = nifcloud_devops_runner.basic.name + gitlab_url = var.devops_gitlab_url + parameter_group_name = nifcloud_devops_runner_parameter_group.upd.name + token = var.devops_runner_token +} + +resource "nifcloud_devops_runner" "basic" { + name = "%s" + instance_type = "c-small" +} + +resource "nifcloud_devops_runner_parameter_group" "basic" { + name = "%s" +} + +resource "nifcloud_devops_runner_parameter_group" "upd" { + name = "%s-upd" +} + +variable "devops_gitlab_url" { + description = "test devops GitLab URL" + type = string +} + +variable "devops_runner_token" { + description = "test devops runner token" + type = string +}