Skip to content

Commit

Permalink
Add resource pool resources
Browse files Browse the repository at this point in the history
  • Loading branch information
skatsaounis committed Dec 22, 2023
1 parent 76a4771 commit 7d71d14
Show file tree
Hide file tree
Showing 10 changed files with 453 additions and 0 deletions.
36 changes: 36 additions & 0 deletions docs/data-sources/resource_pool.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "maas_resource_pool Data Source - terraform-provider-maas"
subcategory: ""
description: |-
Provides details about an existing MAAS resource pool.
---

# maas_resource_pool (Data Source)

Provides details about an existing MAAS resource pool.

## Example Usage

```terraform
resource "maas_resource_pool" "test_resource_pool" {
description = "Test description"
name = "test-resource-pool"
}
data "maas_resource_pool" "test_resource_pool" {
name = maas_resource_pool.test_resource_pool.name
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `name` (String) The name of the resource pool.

### Read-Only

- `description` (String) The description of the resource pool.
- `id` (String) The ID of this resource.
44 changes: 44 additions & 0 deletions docs/resources/resource_pool.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "maas_resource_pool Resource - terraform-provider-maas"
subcategory: ""
description: |-
Provides a resource to manage MAAS resource pools.
---

# maas_resource_pool (Resource)

Provides a resource to manage MAAS resource pools.

## Example Usage

```terraform
resource "maas_resource_pool" "test_resource_pool" {
description = "Test description"
name = "test-resource-pool"
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `name` (String) The name of the resource pool.

### Optional

- `description` (String) The description of the resource pool.

### Read-Only

- `id` (String) The ID of this resource.

## Import

Import is supported using the following syntax:

```shell
# Resource pools can be imported using their ID or name. e.g.
$ terraform import maas_resource_pool.test_resource_pool test-resource-pool
```
8 changes: 8 additions & 0 deletions examples/data-sources/maas_resource_pool/data-source.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
resource "maas_resource_pool" "test_resource_pool" {
description = "Test description"
name = "test-resource-pool"
}

data "maas_resource_pool" "test_resource_pool" {
name = maas_resource_pool.test_resource_pool.name
}
2 changes: 2 additions & 0 deletions examples/resources/maas_resource_pool/import.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Resource pools can be imported using their ID or name. e.g.
$ terraform import maas_resource_pool.test_resource_pool test-resource-pool
4 changes: 4 additions & 0 deletions examples/resources/maas_resource_pool/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
resource "maas_resource_pool" "test_resource_pool" {
description = "Test description"
name = "test-resource-pool"
}
46 changes: 46 additions & 0 deletions maas/data_source_maas_resource_pool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package maas

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/maas/gomaasclient/client"
)

func dataSourceMaasResourcePool() *schema.Resource {
return &schema.Resource{
Description: "Provides details about an existing MAAS resource pool.",
ReadContext: dataSourceResourcePoolRead,

Schema: map[string]*schema.Schema{
"description": {
Type: schema.TypeString,
Computed: true,
Description: "The description of the resource pool.",
},
"name": {
Type: schema.TypeString,
Required: true,
Description: "The name of the resource pool.",
},
},
}
}

func dataSourceResourcePoolRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*client.Client)

resourcePool, err := getResourcePool(client, d.Get("name").(string))
if err != nil {
return diag.FromErr(err)
}

d.SetId(fmt.Sprintf("%v", resourcePool.ID))

d.Set("description", resourcePool.Description)
d.Set("name", resourcePool.Name)

return nil
}
46 changes: 46 additions & 0 deletions maas/data_source_maas_resource_pool_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package maas_test

import (
"fmt"
"terraform-provider-maas/maas/testutils"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/maas/gomaasclient/entity"
)

func TestAccDataSourceMaasResourcePool_basic(t *testing.T) {

var resourcePool entity.ResourcePool
description := "Test description"
name := "test-name"

checks := []resource.TestCheckFunc{
testAccMaasResourcePoolCheckExists("data.maas_resource_pool.test", &resourcePool),
resource.TestCheckResourceAttr("data.maas_resource_pool.test", "description", description),
resource.TestCheckResourceAttr("data.maas_resource_pool.test", "name", name),
}

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testutils.PreCheck(t) },
Providers: testutils.TestAccProviders,
CheckDestroy: testAccCheckMaasResourcePoolDestroy,
ErrorCheck: func(err error) error { return err },
Steps: []resource.TestStep{
{
Config: testAccDataSourceMaasResourcePool(description, name),
Check: resource.ComposeTestCheckFunc(checks...),
},
},
})
}

func testAccDataSourceMaasResourcePool(description string, name string) string {
return fmt.Sprintf(`
%s
data "maas_resource_pool" "test" {
name = maas_resource_pool.test.name
}
`, testAccMaasResourcePool(description, name))
}
2 changes: 2 additions & 0 deletions maas/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ func Provider() *schema.Provider {
"maas_block_device": resourceMaasBlockDevice(),
"maas_tag": resourceMaasTag(),
"maas_user": resourceMaasUser(),
"maas_resource_pool": resourceMaasResourcePool(),
},
DataSourcesMap: map[string]*schema.Resource{
"maas_fabric": dataSourceMaasFabric(),
Expand All @@ -69,6 +70,7 @@ func Provider() *schema.Provider {
"maas_machine": dataSourceMaasMachine(),
"maas_network_interface_physical": dataSourceMaasNetworkInterfacePhysical(),
"maas_device": dataSourceMaasDevice(),
"maas_resource_pool": dataSourceMaasResourcePool(),
},
ConfigureContextFunc: providerConfigure,
}
Expand Down
135 changes: 135 additions & 0 deletions maas/resource_maas_resource_pool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package maas

import (
"context"
"fmt"
"strconv"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/maas/gomaasclient/client"
"github.com/maas/gomaasclient/entity"
)

func resourceMaasResourcePool() *schema.Resource {
return &schema.Resource{
Description: "Provides a resource to manage MAAS resource pools.",
CreateContext: resourceResourcePoolCreate,
ReadContext: resourceResourcePoolRead,
UpdateContext: resourceResourcePoolUpdate,
DeleteContext: resourceResourcePoolDelete,
Importer: &schema.ResourceImporter{
StateContext: func(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
client := meta.(*client.Client)
resourcePool, err := getResourcePool(client, d.Id())
if err != nil {
return nil, err
}
d.SetId(fmt.Sprintf("%v", resourcePool.ID))
return []*schema.ResourceData{d}, nil
},
},

Schema: map[string]*schema.Schema{
"description": {
Type: schema.TypeString,
Optional: true,
Description: "The description of the resource pool.",
},
"name": {
Type: schema.TypeString,
Required: true,
Description: "The name of the resource pool.",
},
},
}
}

func resourceResourcePoolCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*client.Client)

resourcePoolParams := entity.ResourcePoolParams{
Description: d.Get("description").(string),
Name: d.Get("name").(string),
}

resourcePool, err := client.ResourcePools.Create(&resourcePoolParams)
if err != nil {
return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%v", resourcePool.ID))

return resourceDeviceRead(ctx, d, meta)
}

func resourceResourcePoolUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*client.Client)

id, err := strconv.Atoi(d.Id())
if err != nil {
return diag.FromErr(err)
}

resourcePoolParams := entity.ResourcePoolParams{
Description: d.Get("description").(string),
Name: d.Get("name").(string),
}

resourcePool, err := client.ResourcePool.Update(id, &resourcePoolParams)
if err != nil {
return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%v", resourcePool.ID))

return resourceResourcePoolRead(ctx, d, meta)
}

func resourceResourcePoolDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*client.Client)

id, err := strconv.Atoi(d.Id())
if err != nil {
return diag.FromErr(err)
}
return diag.FromErr(client.ResourcePool.Delete(id))
}

func resourceResourcePoolRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*client.Client)

resourcePool, err := getResourcePool(client, d.Id())
if err != nil {
return diag.FromErr(err)
}

d.SetId(fmt.Sprintf("%v", resourcePool.ID))

d.Set("description", resourcePool.Description)
d.Set("name", resourcePool.Name)

return nil
}

func getResourcePool(client *client.Client, identifier string) (*entity.ResourcePool, error) {
resourcePool, err := findResourcePool(client, identifier)
if err != nil {
return nil, err
}
if resourcePool == nil {
return nil, fmt.Errorf("resource pool (%s) was not found", identifier)
}
return resourcePool, nil
}

func findResourcePool(client *client.Client, identifier string) (*entity.ResourcePool, error) {
resourcePools, err := client.ResourcePools.Get()
if err != nil {
return nil, err
}
for _, d := range resourcePools {
if fmt.Sprintf("%v", d.ID) == identifier || d.Name == identifier {
return &d, nil
}
}
return nil, nil
}
Loading

0 comments on commit 7d71d14

Please sign in to comment.