From aeef0f93c3480b8b7583789468b69477668eb744 Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 28 May 2024 18:43:34 -0500 Subject: [PATCH] Included support for GLP IAM v1 (#197) * Included changes for GLP IAM V1 * Improved docs * Updated metal client to v1.5.13 * Fixed formatting * Implemented review comments and fixed lint * Updated version --- README.md | 20 +++++++++-- examples/provider/provider.tf | 13 +++++++- go.mod | 2 +- go.sum | 4 +-- .../acceptance_test/resource_host_test.go | 6 ++-- .../acceptance_test/resource_image_test.go | 4 +-- .../acceptance_test/resource_network_test.go | 3 +- .../acceptance_test/resource_project_test.go | 4 +-- .../acceptance_test/resource_ssh_key_test.go | 7 ++-- .../acceptance_test/resource_volume_test.go | 6 ++-- internal/resources/resource_host.go | 33 ++++++++++--------- internal/resources/resource_image.go | 4 +-- internal/resources/resource_ip.go | 8 ++--- internal/resources/resource_network.go | 10 +++--- internal/resources/resource_project.go | 13 +++++--- internal/resources/resource_ssh_key.go | 10 +++--- internal/resources/resource_volume.go | 24 +++++++------- pkg/client/client.go | 6 +++- pkg/configuration/config.go | 28 +++++++++++++++- pkg/registration/registration.go | 24 +++++++++++--- version | 2 +- 21 files changed, 156 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index b27e6fc..ef96b3e 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,12 @@ $ make build Note: For debugging the provider please refer to the [debugging guide](https://medium.com/@gandharva666/debugging-terraform-using-jetbrains-goland-f9a7e992cb1d) -## Using GreenLake tokens +## Using GreenLake Cloud Services (GLCS) tokens **NOTE**: The below steps are applicable only when using stand-alone provider. If you are using [hpegl provider](https://registry.terraform.io/providers/HPE/hpegl/latest/docs), then follow the steps explained on that page to specify the parameters. -When using GreenLake tokens, the required parameters is to be provided in a `.gltform` file. +When using GLCS tokens, the required parameters is to be provided in a `.gltform` file. This file can be written in home or in the directory from which terraform is run. The file contents: @@ -59,6 +59,22 @@ access_token: <...> `space_name` is optional, and is only required if the terraform provider is going to be used to create projects. Access token may be obtained by logging into HPE GreenLake Central and then clicking **API Access** on the User menu. +## Using GreenLake Platform (GLP) tokens + +**NOTE**: The below steps are applicable only when using stand-alone provider. If you are using [hpegl provider](https://registry.terraform.io/providers/HPE/hpegl/latest/docs), +then follow the steps explained on that page to specify the parameters. + +When using GreenLake tokens, the required parameters is to be provided in a `.gltform` file. +This file can be written in home or in the directory from which terraform is run. + +The file contents: + +```yaml +rest_url: http://localhost:3002 +project_id: 65c82181-fefc-4ea7-870e-628225fe7664 +access_token: <...> +``` + ## Using Metal tokens diff --git a/examples/provider/provider.tf b/examples/provider/provider.tf index c8ba4a7..aab8469 100644 --- a/examples/provider/provider.tf +++ b/examples/provider/provider.tf @@ -10,12 +10,23 @@ terraform { } } -# Example of provider configuration when using GreenLake IAM token +# Example of provider configuration when using GreenLake Cloud Services (GLCS) IAM token provider "hpegl" { metal { rest_url = "https://localhost:3002" space_name = "space_name" project_id = "1d96bfbc-9cf0-4268-aac6-ca1c65aca385" + + } +} + +# Example of provider configuration when using GreenLake Platform (GLP) IAM token +provider "hpegl" { + metal { + rest_url = "https://localhost:3002" + project_id = "1d96bfbc-9cf0-4268-aac6-ca1c65aca385" + glp_workspace = "1a2ba81600dd11efa47076a3447ec4eb" + glp_role = "service-platform-owner" } } diff --git a/go.mod b/go.mod index 324f1c2..9fb47a0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/golangci/golangci-lint v1.58.2 github.com/hashicorp/terraform-plugin-docs v0.19.2 github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 - github.com/hewlettpackard/hpegl-metal-client v1.5.11 + github.com/hewlettpackard/hpegl-metal-client v1.5.13 github.com/hewlettpackard/hpegl-provider-lib v0.0.15 github.com/stretchr/testify v1.9.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index 514dfcf..2e181a6 100644 --- a/go.sum +++ b/go.sum @@ -387,8 +387,8 @@ github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hewlettpackard/hpegl-metal-client v1.5.11 h1:uTCGYRrKGG/Nd5i7KLL9jSW1XDYrB1pKI3mpZsKtSYM= -github.com/hewlettpackard/hpegl-metal-client v1.5.11/go.mod h1:E72/o32a5WwVAUhXvXEUKZOGiSA84hsTS+xezFqtbgU= +github.com/hewlettpackard/hpegl-metal-client v1.5.13 h1:c4Gb9Gu449LmN0eoDVTwGgkg/rAEaiDQ8jEfMzTXtWU= +github.com/hewlettpackard/hpegl-metal-client v1.5.13/go.mod h1:E72/o32a5WwVAUhXvXEUKZOGiSA84hsTS+xezFqtbgU= github.com/hewlettpackard/hpegl-provider-lib v0.0.15 h1:yDqJNUYDq37LjpwoqvNKv2RS2s5gCEL+qQ3MD0WXIdw= github.com/hewlettpackard/hpegl-provider-lib v0.0.15/go.mod h1:9lEPIb9rKqxZNPkwcgRN+3/rAkpyXCk3KR8GFO5xaZ4= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= diff --git a/internal/acceptance_test/resource_host_test.go b/internal/acceptance_test/resource_host_test.go index 3f477cb..e70cc4b 100644 --- a/internal/acceptance_test/resource_host_test.go +++ b/internal/acceptance_test/resource_host_test.go @@ -170,7 +170,7 @@ func testWaitUntilHostReady(rsrc string) resource.TestCheckFunc { for i := 0; i < hostStatePollCount && hostState != rest.HOSTSTATE_READY; i++ { time.Sleep(hostStateReadyWait) - host, resp, err := p.Client.HostsApi.GetByID(ctx, hostID) + host, resp, err := p.Client.HostsApi.GetByID(ctx, hostID, nil) if err != nil { return fmt.Errorf("Host: %q not found: %s", hostID, err) } @@ -210,7 +210,7 @@ func testVerifyHostReady(resourceStateKey string) resource.TestCheckFunc { ctx := p.GetContext() - host, resp, err := p.Client.HostsApi.GetByID(ctx, hostID) + host, resp, err := p.Client.HostsApi.GetByID(ctx, hostID, nil) if err != nil { return fmt.Errorf("Host: %q not found: %s", hostID, err) } @@ -246,7 +246,7 @@ func testAccCheckHostDestroy(t *testing.T, s *terraform.State) error { ctx := p.GetContext() - _, resp, err := p.Client.HostsApi.GetByID(ctx, hostID) + _, resp, err := p.Client.HostsApi.GetByID(ctx, hostID, nil) if err != nil { return fmt.Errorf("Error retrieving host %s: %v", hostID, err) } diff --git a/internal/acceptance_test/resource_image_test.go b/internal/acceptance_test/resource_image_test.go index ee90ac1..b631499 100644 --- a/internal/acceptance_test/resource_image_test.go +++ b/internal/acceptance_test/resource_image_test.go @@ -95,7 +95,7 @@ func testAccCheckImageDestroy(t *testing.T, s *terraform.State) error { ctx := p.GetContext() - _, res, err := p.Client.ServicesApi.GetByID(ctx, imageID) + _, res, err := p.Client.ServicesApi.GetByID(ctx, imageID, nil) if err == nil { return fmt.Errorf("image %v still exists", imageID) } @@ -126,7 +126,7 @@ func testAccCheckImageExists(resource string) resource.TestCheckFunc { ctx := p.GetContext() - ret, res, err := p.Client.ServicesApi.GetByID(ctx, imageID) + ret, res, err := p.Client.ServicesApi.GetByID(ctx, imageID, nil) if err != nil { return fmt.Errorf("image %v not found: %s", imageID, err) } diff --git a/internal/acceptance_test/resource_network_test.go b/internal/acceptance_test/resource_network_test.go index 36f4ec8..f7af6ef 100644 --- a/internal/acceptance_test/resource_network_test.go +++ b/internal/acceptance_test/resource_network_test.go @@ -95,7 +95,8 @@ func testAccCheckNetworkDestroy(t *testing.T, s *terraform.State) error { ctx := p.GetContext() - _, _, err := p.Client.NetworksApi.GetByID(ctx, rs.Primary.ID) + //nolint:bodyclose // Response body is closed by metal client. + _, _, err := p.Client.NetworksApi.GetByID(ctx, rs.Primary.ID, nil) if err == nil { return fmt.Errorf("Alert pnet still exists") } diff --git a/internal/acceptance_test/resource_project_test.go b/internal/acceptance_test/resource_project_test.go index b31a1e3..488af86 100644 --- a/internal/acceptance_test/resource_project_test.go +++ b/internal/acceptance_test/resource_project_test.go @@ -115,7 +115,7 @@ func testAccCheckProjectDestroy(t *testing.T, s *terraform.State) error { ctx := p.GetContext() - _, res, err := p.Client.ProjectsApi.GetByID(ctx, ProjectID) + _, res, err := p.Client.ProjectsApi.GetByID(ctx, ProjectID, nil) if err == nil { return fmt.Errorf("Project %v still exists", ProjectID) } @@ -146,7 +146,7 @@ func testAccCheckProjectExists(resource string) resource.TestCheckFunc { ctx := p.GetContext() - ret, res, err := p.Client.ProjectsApi.GetByID(ctx, ProjectID) + ret, res, err := p.Client.ProjectsApi.GetByID(ctx, ProjectID, nil) if err != nil { return fmt.Errorf("Project %v not found: %s", ProjectID, err) } diff --git a/internal/acceptance_test/resource_ssh_key_test.go b/internal/acceptance_test/resource_ssh_key_test.go index 1407838..dc68340 100644 --- a/internal/acceptance_test/resource_ssh_key_test.go +++ b/internal/acceptance_test/resource_ssh_key_test.go @@ -75,7 +75,8 @@ func testAccCheckSSHKeyExists(n string, out *rest.SshKey) resource.TestCheckFunc ctx := p.GetContext() - key, _, err := p.Client.SshkeysApi.GetByID(ctx, rs.Primary.ID) + //nolint:bodyclose // Response body is closed by metal client. + key, _, err := p.Client.SshkeysApi.GetByID(ctx, rs.Primary.ID, nil) if err != nil { return err } @@ -99,7 +100,9 @@ func testAccCheckSSHKeyDestroy(s *terraform.State) error { } ctx := p.GetContext() - if _, _, err := p.Client.SshkeysApi.GetByID(ctx, rs.Primary.ID); err == nil { + + //nolint:bodyclose // Response body is closed by metal client. + if _, _, err := p.Client.SshkeysApi.GetByID(ctx, rs.Primary.ID, nil); err == nil { return fmt.Errorf("SSHKey still exists") } } diff --git a/internal/acceptance_test/resource_volume_test.go b/internal/acceptance_test/resource_volume_test.go index 4877d11..8e954f5 100644 --- a/internal/acceptance_test/resource_volume_test.go +++ b/internal/acceptance_test/resource_volume_test.go @@ -113,7 +113,8 @@ func testAccCheckVolumeDestroy(t *testing.T, s *terraform.State) error { ctx := p.GetContext() - volume, _, err := p.Client.VolumesApi.GetByID(ctx, volumeID) + //nolint:bodyclose // Response body is closed by metal client. + volume, _, err := p.Client.VolumesApi.GetByID(ctx, volumeID, nil) if err == nil && volume.State != rest.VOLUMESTATE_DELETED { return fmt.Errorf("Volume: %v still exists", volume) } @@ -142,7 +143,8 @@ func testAccCheckVolumeExists(resource string, id *string) resource.TestCheckFun ctx := p.GetContext() - _, _, err = p.Client.VolumesApi.GetByID(ctx, volumeID) + //nolint:bodyclose // Response body is closed by metal client. + _, _, err = p.Client.VolumesApi.GetByID(ctx, volumeID, nil) if err != nil { return fmt.Errorf("Volume: %q not found: %s", volumeID, err) } diff --git a/internal/resources/resource_host.go b/internal/resources/resource_host.go index c99c1a5..400291d 100644 --- a/internal/resources/resource_host.go +++ b/internal/resources/resource_host.go @@ -487,7 +487,7 @@ func resourceMetalHostCreate(d *schema.ResourceData, meta interface{}) (err erro // Create it ctx := p.GetContext() - h, _, err := p.Client.HostsApi.Add(ctx, host) + h, _, err := p.Client.HostsApi.Add(ctx, host, nil) if err != nil { return err } @@ -516,7 +516,7 @@ func resourceMetalHostCreate(d *schema.ResourceData, meta interface{}) (err erro string(rest.HOSTSTATE_READY), }, Refresh: func() (interface{}, string, error) { - host, _, err := p.Client.HostsApi.GetByID(ctx, h.ID) + host, _, err := p.Client.HostsApi.GetByID(ctx, h.ID, nil) if err != nil { return nil, "", fmt.Errorf("get host %v", h.ID) } @@ -545,7 +545,7 @@ func resourceMetalHostRead(d *schema.ResourceData, meta interface{}) (err error) } ctx := p.GetContext() - host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id()) + host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -569,7 +569,7 @@ func resourceMetalHostRead(d *schema.ResourceData, meta interface{}) (err error) return fmt.Errorf("set summary status: %v", err) } - varesources, _, err := p.Client.VolumeAttachmentsApi.List(ctx) + varesources, _, err := p.Client.VolumeAttachmentsApi.List(ctx, nil) if err != nil { return fmt.Errorf("error reading volume attachment information %v", err) } @@ -690,16 +690,17 @@ func resourceMetalHostUpdate(d *schema.ResourceData, meta interface{}) (err erro ctx := p.GetContext() - host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id()) + host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } - volumes, _, err := p.Client.VolumesApi.List(ctx) + volumes, _, err := p.Client.VolumesApi.List(ctx, nil) if err != nil { return fmt.Errorf("error reading volume information %v", err) } - varesources, _, err := p.Client.VolumeAttachmentsApi.List(ctx) + + varesources, _, err := p.Client.VolumeAttachmentsApi.List(ctx, nil) if err != nil { return fmt.Errorf("error reading volume attachment information %v", err) } @@ -730,7 +731,7 @@ func resourceMetalHostUpdate(d *schema.ResourceData, meta interface{}) (err erro // detach vaHostID := rest.VolumeAttachHostUuid{HostID: host.ID} for _, dv := range detachList { - _, err = p.Client.VolumesApi.Detach(ctx, dv, vaHostID) + _, err = p.Client.VolumesApi.Detach(ctx, dv, vaHostID, nil) if err != nil { return err @@ -739,7 +740,7 @@ func resourceMetalHostUpdate(d *schema.ResourceData, meta interface{}) (err erro // attach for _, av := range attachList { - _, _, err = p.Client.VolumesApi.Attach(ctx, av, vaHostID) + _, _, err = p.Client.VolumesApi.Attach(ctx, av, vaHostID, nil) if err != nil { return err @@ -790,7 +791,7 @@ func resourceMetalHostUpdate(d *schema.ResourceData, meta interface{}) (err erro // Update. ctx = p.GetContext() - _, _, err = p.Client.HostsApi.Update(ctx, updateHost.ID, updateHost) + _, _, err = p.Client.HostsApi.Update(ctx, updateHost.ID, updateHost, nil) if err != nil { //nolint:wrapcheck // defer func is wrapping the error. return err @@ -816,7 +817,7 @@ func resourceMetalHostUpdate(d *schema.ResourceData, meta interface{}) (err erro string(rest.HOSTSTATE_READY), }, Refresh: func() (interface{}, string, error) { - h, _, err := p.Client.HostsApi.GetByID(ctx, host.ID) + h, _, err := p.Client.HostsApi.GetByID(ctx, host.ID, nil) if err != nil { return nil, "", fmt.Errorf("get host %v", host.ID) } @@ -856,7 +857,7 @@ func resourceMetalHostDelete(d *schema.ResourceData, meta interface{}) (err erro ctx := p.GetContext() - host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id()) + host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -873,7 +874,7 @@ func resourceMetalHostDelete(d *schema.ResourceData, meta interface{}) (err erro } } - if _, err := p.Client.HostsApi.Delete(ctx, d.Id()); err != nil { + if _, err := p.Client.HostsApi.Delete(ctx, d.Id(), nil); err != nil { //nolint:wrapcheck // defer func is wrapping the error. return err } @@ -890,7 +891,7 @@ func resourceMetalHostDelete(d *schema.ResourceData, meta interface{}) (err erro string(rest.HOSTSTATE_DELETED), }, Refresh: func() (interface{}, string, error) { - host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id()) + host, _, err := p.Client.HostsApi.GetByID(ctx, d.Id(), nil) if err != nil { return nil, "", fmt.Errorf("get host %v", d.Id()) } @@ -910,7 +911,7 @@ func resourceMetalHostDelete(d *schema.ResourceData, meta interface{}) (err erro } func powerOffHost(ctx context.Context, hostAPI rest.HostsAPI, hostID string, timeout time.Duration) error { - _, _, err := hostAPI.PowerOff(ctx, hostID) + _, _, err := hostAPI.PowerOff(ctx, hostID, nil) if err != nil { return fmt.Errorf("power off host %v: %v", hostID, err) } @@ -925,7 +926,7 @@ func powerOffHost(ctx context.Context, hostAPI rest.HostsAPI, hostID string, tim string(rest.HOSTPOWERSTATE_OFF), }, Refresh: func() (interface{}, string, error) { - host, _, err := hostAPI.GetByID(ctx, hostID) + host, _, err := hostAPI.GetByID(ctx, hostID, nil) if err != nil { return nil, "", fmt.Errorf("get host %v", hostID) } diff --git a/internal/resources/resource_image.go b/internal/resources/resource_image.go index 75f469d..388fd17 100644 --- a/internal/resources/resource_image.go +++ b/internal/resources/resource_image.go @@ -78,7 +78,7 @@ func resourceMetalImageDelete(d *schema.ResourceData, meta interface{}) (err err ctx := p.GetContext() - if _, err = p.Client.ServicesApi.Delete(ctx, d.Id()); err != nil { + if _, err = p.Client.ServicesApi.Delete(ctx, d.Id(), nil); err != nil { return err //nolint:wrapcheck // defer func is wrapping the error. } @@ -104,7 +104,7 @@ func resourceMetalImageUpdate(d *schema.ResourceData, meta interface{}) (err err ctx := p.GetContext() - if _, _, err := p.Client.ServicesApi.Update(ctx, d.Id(), file); err != nil { + if _, _, err := p.Client.ServicesApi.Update(ctx, d.Id(), file, nil); err != nil { return err //nolint:wrapcheck // defer func is wrapping the error. } diff --git a/internal/resources/resource_ip.go b/internal/resources/resource_ip.go index c015db9..fd00e95 100644 --- a/internal/resources/resource_ip.go +++ b/internal/resources/resource_ip.go @@ -71,7 +71,7 @@ func resourceIPCreate(d *schema.ResourceData, meta interface{}) (err error) { ctx := p.GetContext() - ipPools, _, err := p.Client.IppoolsApi.List(ctx) + ipPools, _, err := p.Client.IppoolsApi.List(ctx, nil) if err != nil { return err } @@ -83,7 +83,7 @@ func resourceIPCreate(d *schema.ResourceData, meta interface{}) (err error) { } } - if _, _, err := p.Client.IppoolsApi.AllocateIPs(ctx, poolID, []rest.IpAllocation{allocation}); err != nil { + if _, _, err := p.Client.IppoolsApi.AllocateIPs(ctx, poolID, []rest.IpAllocation{allocation}, nil); err != nil { return err } @@ -104,7 +104,7 @@ func resourceIPRead(d *schema.ResourceData, meta interface{}) (err error) { poolID := extractIPPoolID(d.Id()) allocIP := extractIP(d.Id()) - ippool, _, err := p.Client.IppoolsApi.GetByID(ctx, poolID) + ippool, _, err := p.Client.IppoolsApi.GetByID(ctx, poolID, nil) if err != nil { return err } @@ -145,7 +145,7 @@ func resourceIPDelete(d *schema.ResourceData, meta interface{}) (err error) { poolID := extractIPPoolID(d.Id()) ip := extractIP(d.Id()) - if _, _, err = p.Client.IppoolsApi.ReturnIPs(ctx, poolID, []string{ip}); err != nil { + if _, _, err = p.Client.IppoolsApi.ReturnIPs(ctx, poolID, []string{ip}, nil); err != nil { return err } diff --git a/internal/resources/resource_network.go b/internal/resources/resource_network.go index f9153a0..ab81d01 100644 --- a/internal/resources/resource_network.go +++ b/internal/resources/resource_network.go @@ -244,7 +244,7 @@ func resourceMetalNetworkCreate(d *schema.ResourceData, meta interface{}) (err e } ctx := p.GetContext() - n, _, err := p.Client.NetworksApi.Add(ctx, newNetwork) + n, _, err := p.Client.NetworksApi.Add(ctx, newNetwork, nil) if err != nil { return err } @@ -325,7 +325,7 @@ func resourceMetalNetworkRead(d *schema.ResourceData, meta interface{}) (err err } ctx := p.GetContext() - n, _, err := p.Client.NetworksApi.GetByID(ctx, d.Id()) + n, _, err := p.Client.NetworksApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -383,7 +383,7 @@ func resourceMetalNetworkUpdate(d *schema.ResourceData, meta interface{}) (err e ctx := p.GetContext() - n, _, err := p.Client.NetworksApi.GetByID(ctx, d.Id()) + n, _, err := p.Client.NetworksApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -404,7 +404,7 @@ func resourceMetalNetworkUpdate(d *schema.ResourceData, meta interface{}) (err e updateNetwork.Purpose = rest.NetworkPurpose(purpose) } - _, _, err = p.Client.NetworksApi.Update(ctx, updateNetwork.ID, updateNetwork) + _, _, err = p.Client.NetworksApi.Update(ctx, updateNetwork.ID, updateNetwork, nil) if err != nil { return err } @@ -422,7 +422,7 @@ func resourceMetalNetworkDelete(d *schema.ResourceData, meta interface{}) (err e } ctx := p.GetContext() - _, err = p.Client.NetworksApi.Delete(ctx, d.Id()) + _, err = p.Client.NetworksApi.Delete(ctx, d.Id(), nil) if err != nil { return err } diff --git a/internal/resources/resource_project.go b/internal/resources/resource_project.go index 55db681..b51ce29 100644 --- a/internal/resources/resource_project.go +++ b/internal/resources/resource_project.go @@ -3,6 +3,7 @@ package resources import ( + "context" "fmt" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -335,7 +336,8 @@ func resourceMetalProjectRead(d *schema.ResourceData, meta interface{}) (err err } ctx := p.GetContext() - project, _, err := p.Client.ProjectsApi.GetByID(ctx, d.Id()) + ctx = context.WithValue(ctx, rest.ContextAPIKey, rest.APIKey{Key: d.Id()}) + project, _, err := p.Client.ProjectsApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -400,8 +402,8 @@ func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) (err e } ctx := p.GetContext() - - project, _, err := p.Client.ProjectsApi.GetByID(ctx, d.Id()) + ctx = context.WithValue(ctx, rest.ContextAPIKey, rest.APIKey{Key: d.Id()}) + project, _, err := p.Client.ProjectsApi.GetByID(ctx, d.Id(), nil) if err != nil { return } @@ -445,7 +447,7 @@ func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) (err e updateProject.PermittedOSImages = expandStringList(s.List()) } - _, _, err = p.Client.ProjectsApi.Update(ctx, updateProject.ID, updateProject) + _, _, err = p.Client.ProjectsApi.Update(ctx, updateProject.ID, updateProject, nil) if err != nil { return } @@ -462,7 +464,8 @@ func resourceMetalProjectDelete(d *schema.ResourceData, meta interface{}) (err e } ctx := p.GetContext() - _, err = p.Client.ProjectsApi.Delete(ctx, d.Id()) + ctx = context.WithValue(ctx, rest.ContextAPIKey, rest.APIKey{Key: d.Id()}) + _, err = p.Client.ProjectsApi.Delete(ctx, d.Id(), nil) if err != nil { return err } diff --git a/internal/resources/resource_ssh_key.go b/internal/resources/resource_ssh_key.go index de1a676..f30dedc 100644 --- a/internal/resources/resource_ssh_key.go +++ b/internal/resources/resource_ssh_key.go @@ -54,7 +54,7 @@ func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) (err er Key: d.Get(sshPublicKey).(string), } ctx := p.GetContext() - key, _, err := p.Client.SshkeysApi.Add(ctx, r) + key, _, err := p.Client.SshkeysApi.Add(ctx, r, nil) if err != nil { return err } @@ -76,7 +76,7 @@ func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) (err erro } ctx := p.GetContext() - ssh, _, err := p.Client.SshkeysApi.GetByID(ctx, d.Id()) + ssh, _, err := p.Client.SshkeysApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -95,7 +95,7 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) (err er // Read existing ctx := p.GetContext() - ssh, _, err := p.Client.SshkeysApi.GetByID(ctx, d.Id()) + ssh, _, err := p.Client.SshkeysApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -116,7 +116,7 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) (err er // Update ctx = p.GetContext() - if _, _, err = p.Client.SshkeysApi.Update(ctx, updateSSH.ID, updateSSH); err != nil { + if _, _, err = p.Client.SshkeysApi.Update(ctx, updateSSH.ID, updateSSH, nil); err != nil { return err } @@ -133,7 +133,7 @@ func resourceMetalSSHKeyDelete(d *schema.ResourceData, meta interface{}) (err er } ctx := p.GetContext() - _, err = p.Client.SshkeysApi.Delete(ctx, d.Id()) + _, err = p.Client.SshkeysApi.Delete(ctx, d.Id(), nil) if err != nil { return err } diff --git a/internal/resources/resource_volume.go b/internal/resources/resource_volume.go index 8607b42..ed1f18b 100644 --- a/internal/resources/resource_volume.go +++ b/internal/resources/resource_volume.go @@ -279,7 +279,7 @@ func resourceMetalVolumeCreate(d *schema.ResourceData, meta interface{}) (err er } ctx := p.GetContext() - v, _, err := p.Client.VolumesApi.Add(ctx, volume) + v, _, err := p.Client.VolumesApi.Add(ctx, volume, nil) if err != nil { return err } @@ -288,7 +288,7 @@ func resourceMetalVolumeCreate(d *schema.ResourceData, meta interface{}) (err er time.Sleep(pollInterval) ctx = p.GetContext() - vol, _, err := p.Client.VolumesApi.GetByID(ctx, v.ID) + vol, _, err := p.Client.VolumesApi.GetByID(ctx, v.ID, nil) if err != nil { break } @@ -314,7 +314,7 @@ func resourceMetalVolumeRead(d *schema.ResourceData, meta interface{}) (err erro } ctx := p.GetContext() - volume, _, err := p.Client.VolumesApi.GetByID(ctx, d.Id()) + volume, _, err := p.Client.VolumesApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -384,7 +384,7 @@ func resourceMetalVolumeUpdate(d *schema.ResourceData, meta interface{}) (err er ctx := c.GetContext() - vol, _, err := c.Client.VolumesApi.GetByID(ctx, d.Id()) + vol, _, err := c.Client.VolumesApi.GetByID(ctx, d.Id(), nil) if err != nil { return } @@ -406,7 +406,7 @@ func resourceMetalVolumeUpdate(d *schema.ResourceData, meta interface{}) (err er updateVol.Labels = convertMap(m) } - _, _, err = c.Client.VolumesApi.Update(ctx, updateVol.ID, updateVol) + _, _, err = c.Client.VolumesApi.Update(ctx, updateVol.ID, updateVol, nil) if err != nil { return } @@ -416,7 +416,7 @@ func resourceMetalVolumeUpdate(d *schema.ResourceData, meta interface{}) (err er for { time.Sleep(pollInterval) - vol, _, err := c.Client.VolumesApi.GetByID(ctx, vol.ID) + vol, _, err := c.Client.VolumesApi.GetByID(ctx, vol.ID, nil) if err != nil { return fmt.Errorf("get volume %s: %w", vol.ID, err) } @@ -444,7 +444,7 @@ func deleteVAsForVolume(p *configuration.Config, volID string) error { ctx := p.GetContext() // Get all attachments - vas, _, err := p.Client.VolumeAttachmentsApi.List(ctx) + vas, _, err := p.Client.VolumeAttachmentsApi.List(ctx, nil) if err != nil { return fmt.Errorf("list volume attachments: %w", err) } @@ -452,7 +452,7 @@ func deleteVAsForVolume(p *configuration.Config, volID string) error { // Initiate attachments deletion for this volume for _, va := range vas { if va.VolumeID == volID { - _, err = p.Client.VolumeAttachmentsApi.Delete(ctx, va.ID) + _, err = p.Client.VolumeAttachmentsApi.Delete(ctx, va.ID, nil) if err != nil { return fmt.Errorf("delete volume attachment %s: %w", va.ID, err) } @@ -465,7 +465,7 @@ func deleteVAsForVolume(p *configuration.Config, volID string) error { for { time.Sleep(pollInterval) - volume, _, err := p.Client.VolumesApi.GetByID(ctx, volID) + volume, _, err := p.Client.VolumesApi.GetByID(ctx, volID, nil) if err != nil { return fmt.Errorf("get volume %s: %w", volID, err) } @@ -514,7 +514,7 @@ func resourceMetalVolumeDelete(d *schema.ResourceData, meta interface{}) (err er time.Sleep(pollInterval) ctx := p.GetContext() - volume, _, err = p.Client.VolumesApi.GetByID(ctx, d.Id()) + volume, _, err = p.Client.VolumesApi.GetByID(ctx, d.Id(), nil) if err != nil { return } @@ -536,7 +536,7 @@ func resourceMetalVolumeDelete(d *schema.ResourceData, meta interface{}) (err er }() ctx := p.GetContext() - volume, _, err = p.Client.VolumesApi.GetByID(ctx, d.Id()) + volume, _, err = p.Client.VolumesApi.GetByID(ctx, d.Id(), nil) if err != nil { return err } @@ -555,7 +555,7 @@ func resourceMetalVolumeDelete(d *schema.ResourceData, meta interface{}) (err er } } - _, err = p.Client.VolumesApi.Delete(ctx, d.Id()) + _, err = p.Client.VolumesApi.Delete(ctx, d.Id(), nil) return err } diff --git a/pkg/client/client.go b/pkg/client/client.go index 8fd546a..3592224 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -47,7 +47,11 @@ func (i InitialiseClient) NewClient(r *schema.ResourceData) (interface{}, error) } // Initialize the metal client - metalConfig, err := configuration.NewConfig("", configuration.WithGLToken(metalMap["gl_token"].(bool))) + metalConfig, err := configuration.NewConfig("", + configuration.WithGLToken(metalMap["gl_token"].(bool)), + configuration.WithRole(metalMap["glp_role"].(string)), + configuration.WithWorkspace(metalMap["glp_workspace"].(string)), + ) if err != nil { return nil, fmt.Errorf("error in creating metal client: %s", err) } diff --git a/pkg/configuration/config.go b/pkg/configuration/config.go index 9fcc61d..6e90915 100644 --- a/pkg/configuration/config.go +++ b/pkg/configuration/config.go @@ -29,6 +29,8 @@ type Config struct { token string user string space string + workspace string + role string trf retrieve.TokenRetrieveFuncCtx useGLToken bool context context.Context @@ -39,14 +41,30 @@ type Config struct { AvailableResources rest.AvailableResources } +// CreateOpt defines a create option. type CreateOpt func(c *Config) +// WithGLToken returns a create option with the provided GreenLake token. func WithGLToken(g bool) CreateOpt { return func(c *Config) { c.useGLToken = g } } +// WithWorkspace returns a create option with the provided workspace. +func WithWorkspace(w string) CreateOpt { + return func(c *Config) { + c.workspace = w + } +} + +// WithRole returns a create option with the provided role. +func WithRole(r string) CreateOpt { + return func(c *Config) { + c.role = r + } +} + // WithTRF this create option is for use by the hpegl terraform provider // It is used to pass-in a token retrieve function which is used to get // a GL IAM token. Behind the scenes tokens are generated and refreshed @@ -60,7 +78,7 @@ func WithTRF(trf retrieve.TokenRetrieveFuncCtx) CreateOpt { func (c *Config) RefreshAvailableResources() error { ctx := c.GetContext() - resources, _, err := c.Client.AvailableResourcesApi.List(ctx) + resources, _, err := c.Client.AvailableResourcesApi.List(ctx, nil) if err != nil { return err } @@ -212,6 +230,14 @@ func NewConfig(portalURL string, opts ...CreateOpt) (*Config, error) { if config.space != "" { cfg.AddDefaultHeader("Space", config.space) } + + if config.role != "" { + cfg.AddDefaultHeader("X-Role", config.role) + } + + if config.workspace != "" { + cfg.AddDefaultHeader("X-Workspaceid", config.workspace) + } } else { if err := validateMetalConfig(*config); err != nil { return config, fmt.Errorf("configuration error: %v", err) diff --git a/pkg/registration/registration.go b/pkg/registration/registration.go index ebb26d8..cf95a50 100644 --- a/pkg/registration/registration.go +++ b/pkg/registration/registration.go @@ -23,10 +23,12 @@ const ( qAvailableImages = mPrefix + "_available_images" // These constants are used to set the optional hpegl provider "metal" block field-names - projectID = "project_id" - restURL = "rest_url" - spaceName = "space_name" - glToken = "gl_token" + projectID = "project_id" + restURL = "rest_url" + spaceName = "space_name" + glToken = "gl_token" + glpRole = "glp_role" + glpWorkspace = "glp_workspace" ) type Registration struct{} @@ -81,9 +83,21 @@ func (r Registration) ProviderSchemaEntry() *schema.Resource { Type: schema.TypeBool, Optional: true, DefaultFunc: schema.EnvDefaultFunc("HPEGL_METAL_GL_TOKEN", true), - Description: `Field indicating whether the token is GreenLake IAM issued token or Metal Service issued one, + Description: `Field indicating whether the token is GreenLake (GLCS or GLP) IAM issued token or Metal Service issued one, can also be set with the HPEGL_METAL_GL_TOKEN env-var`, }, + glpRole: { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.EnvDefaultFunc("HPEGL_METAL_GLP_ROLE", true), + Description: `Field indicating the GLP role to be used, can also be set with the HPEGL_METAL_GLP_ROLE env-var`, + }, + glpWorkspace: { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.EnvDefaultFunc("HPEGL_METAL_GLP_WORKSPACE", true), + Description: `Field indicating the GLP workspace to be used, can also be set with the HPEGL_METAL_GLP_WORKSPACE env-var`, + }, }, } } diff --git a/version b/version index 3cb7374..b576a43 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.3.53 +1.3.54