From bc3889b8eb36cb13c534626ef0158703e9bd3535 Mon Sep 17 00:00:00 2001 From: Dan Petersen Date: Sat, 7 Dec 2019 23:12:33 +0100 Subject: [PATCH] Latest work --- CHANGELOG.md | 3 +- README.md | 13 ++ ...source_virtual_environment_access_group.go | 3 - ...ource_virtual_environment_access_groups.go | 2 - data_source_virtual_environment_version.go | 2 - ...source_virtual_environment_access_group.tf | 16 ++ provider.go | 5 +- proxmox/virtual_environment_access_groups.go | 32 ++-- resource_virtual_environment_access_group.go | 145 ++++++++++++++++++ 9 files changed, 197 insertions(+), 24 deletions(-) create mode 100644 example/resource_virtual_environment_access_group.tf create mode 100644 resource_virtual_environment_access_group.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bc8ddfb..e61399cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ -## 0.1.0 +## 0.1.0 (UNRELEASED) FEATURES: * **New Data Source:** `proxmox_virtual_environment_access_group` * **New Data Source:** `proxmox_virtual_environment_access_groups` * **New Data Source:** `proxmox_virtual_environment_version` +* **New Resource:** `proxmox_virtual_environment_access_group` diff --git a/README.md b/README.md index 219d28d5..49e0e12e 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,19 @@ This data source doesn't accept arguments. * `repository_id` - The repository id. * `version` - The version string. +### Resources + +#### Virtual Environment + +##### Access Group (proxmox_virtual_environment_access_group) + +###### Arguments +* `comment` - (Optional) The group comment. +* `group_id` - (Required) The group id. + +###### Attributes +* `members` - The group members as a list with `username@realm` entries. + ## Developing the Provider If you wish to work on the provider, you'll first need [Go](http://www.golang.org) installed on your machine (version 1.12+ is *required*). You'll also need to correctly setup a [GOPATH](http://golang.org/doc/code.html#GOPATH), as well as adding `$GOPATH/bin` to your `$PATH`. diff --git a/data_source_virtual_environment_access_group.go b/data_source_virtual_environment_access_group.go index a395bebe..0cf767a8 100644 --- a/data_source_virtual_environment_access_group.go +++ b/data_source_virtual_environment_access_group.go @@ -16,7 +16,6 @@ const ( mkDataSourceVirtualEnvironmentAccessGroupMembers = "members" ) -// dataSourceVirtualEnvironmentAccessGroup retrieves a list of access groups. func dataSourceVirtualEnvironmentAccessGroup() *schema.Resource { return &schema.Resource{ Schema: map[string]*schema.Schema{ @@ -41,7 +40,6 @@ func dataSourceVirtualEnvironmentAccessGroup() *schema.Resource { } } -// dataSourceVirtualEnvironmentAccessGroupRead retrieves a list of access groups. func dataSourceVirtualEnvironmentAccessGroupRead(d *schema.ResourceData, m interface{}) error { config := m.(providerConfiguration) @@ -50,7 +48,6 @@ func dataSourceVirtualEnvironmentAccessGroupRead(d *schema.ResourceData, m inter } groupID := d.Get(mkDataSourceVirtualEnvironmentAccessGroupID).(string) - accessGroup, err := config.veClient.GetAccessGroup(groupID) if err != nil { diff --git a/data_source_virtual_environment_access_groups.go b/data_source_virtual_environment_access_groups.go index f16dda8f..2ff78bb2 100644 --- a/data_source_virtual_environment_access_groups.go +++ b/data_source_virtual_environment_access_groups.go @@ -15,7 +15,6 @@ const ( mkDataSourceVirtualEnvironmentAccessGroupsIDs = "ids" ) -// dataSourceVirtualEnvironmentAccessGroups retrieves a list of access groups. func dataSourceVirtualEnvironmentAccessGroups() *schema.Resource { return &schema.Resource{ Schema: map[string]*schema.Schema{ @@ -36,7 +35,6 @@ func dataSourceVirtualEnvironmentAccessGroups() *schema.Resource { } } -// dataSourceVirtualEnvironmentAccessGroupsRead retrieves a list of access groups. func dataSourceVirtualEnvironmentAccessGroupsRead(d *schema.ResourceData, m interface{}) error { config := m.(providerConfiguration) diff --git a/data_source_virtual_environment_version.go b/data_source_virtual_environment_version.go index b551f82d..6dda2b99 100644 --- a/data_source_virtual_environment_version.go +++ b/data_source_virtual_environment_version.go @@ -17,7 +17,6 @@ const ( mkDataSourceVirtualEnvironmentVersionVersion = "version" ) -// dataSourceVirtualEnvironmentVersion retrieves version information for a Proxmox installation. func dataSourceVirtualEnvironmentVersion() *schema.Resource { return &schema.Resource{ Schema: map[string]*schema.Schema{ @@ -50,7 +49,6 @@ func dataSourceVirtualEnvironmentVersion() *schema.Resource { } } -// dataSourceVirtualEnvironmentVersionRead reads version information for a Proxmox installation. func dataSourceVirtualEnvironmentVersionRead(d *schema.ResourceData, m interface{}) error { config := m.(providerConfiguration) diff --git a/example/resource_virtual_environment_access_group.tf b/example/resource_virtual_environment_access_group.tf new file mode 100644 index 00000000..3beac382 --- /dev/null +++ b/example/resource_virtual_environment_access_group.tf @@ -0,0 +1,16 @@ +resource "proxmox_virtual_environment_access_group" "example" { + comment = "Created by Terraform" + group_id = "terraform-provider-proxmox-example" +} + +output "resource_proxmox_virtual_environment_access_group_example_comment" { + value = proxmox_virtual_environment_access_group.example.comment +} + +output "resource_proxmox_virtual_environment_access_group_example_id" { + value = proxmox_virtual_environment_access_group.example.id +} + +output "resource_proxmox_virtual_environment_access_group_example_members" { + value = proxmox_virtual_environment_access_group.example.members +} diff --git a/provider.go b/provider.go index 6c67f164..eaa55acb 100644 --- a/provider.go +++ b/provider.go @@ -30,7 +30,9 @@ func Provider() *schema.Provider { "proxmox_virtual_environment_access_groups": dataSourceVirtualEnvironmentAccessGroups(), "proxmox_virtual_environment_version": dataSourceVirtualEnvironmentVersion(), }, - ResourcesMap: map[string]*schema.Resource{}, + ResourcesMap: map[string]*schema.Resource{ + "proxmox_virtual_environment_access_group": resourceVirtualEnvironmentAccessGroup(), + }, Schema: map[string]*schema.Schema{ mkProviderVirtualEnvironment: &schema.Schema{ Type: schema.TypeList, @@ -66,7 +68,6 @@ func Provider() *schema.Provider { } } -// providerConfigure() configures the provider before processing any IronMQ resources. func providerConfigure(d *schema.ResourceData) (interface{}, error) { var err error var veClient *proxmox.VirtualEnvironmentClient diff --git a/proxmox/virtual_environment_access_groups.go b/proxmox/virtual_environment_access_groups.go index 7ac7510f..260afb93 100644 --- a/proxmox/virtual_environment_access_groups.go +++ b/proxmox/virtual_environment_access_groups.go @@ -10,8 +10,8 @@ import ( "net/url" ) -// VirtualEnvironmentAccessGroupCreateRequestData contains the data for an access group create request. -type VirtualEnvironmentAccessGroupCreateRequestData struct { +// VirtualEnvironmentAccessGroupCreateRequestBody contains the data for an access group create request. +type VirtualEnvironmentAccessGroupCreateRequestBody struct { Comment string `json:"comment" url:"comment"` ID string `json:"groupid" url:"groupid"` } @@ -38,20 +38,19 @@ type VirtualEnvironmentAccessGroupListResponseData struct { ID string `json:"groupid"` } +// VirtualEnvironmentAccessGroupUpdateRequestBody contains the data for an access group update request. +type VirtualEnvironmentAccessGroupUpdateRequestBody struct { + Comment string `json:"comment" url:"comment"` +} + // CreateAccessGroup creates an access group. -func (c *VirtualEnvironmentClient) CreateAccessGroup(id, comment string) error { - reqBody := &VirtualEnvironmentAccessGroupCreateRequestData{ - Comment: comment, - ID: id, - } +func (c *VirtualEnvironmentClient) CreateAccessGroup(d *VirtualEnvironmentAccessGroupCreateRequestBody) error { + return c.DoRequest(hmPOST, "access/groups", d, nil) +} - err := c.DoRequest(hmPOST, "access/groups", reqBody, nil) - - if err != nil { - return err - } - - return nil +// DeleteAccessGroup deletes an access group. +func (c *VirtualEnvironmentClient) DeleteAccessGroup(id string) error { + return c.DoRequest(hmDELETE, fmt.Sprintf("access/groups/%s", id), nil, nil) } // GetAccessGroup retrieves an access group. @@ -85,3 +84,8 @@ func (c *VirtualEnvironmentClient) ListAccessGroups() ([]*VirtualEnvironmentAcce return resBody.Data, nil } + +// UpdateAccessGroup updates an access group. +func (c *VirtualEnvironmentClient) UpdateAccessGroup(id string, d *VirtualEnvironmentAccessGroupUpdateRequestBody) error { + return c.DoRequest(hmPUT, fmt.Sprintf("access/groups/%s", id), d, nil) +} diff --git a/resource_virtual_environment_access_group.go b/resource_virtual_environment_access_group.go new file mode 100644 index 00000000..98f6c66b --- /dev/null +++ b/resource_virtual_environment_access_group.go @@ -0,0 +1,145 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package main + +import ( + "errors" + "strings" + + "github.com/danitso/terraform-provider-proxmox/proxmox" + "github.com/hashicorp/terraform/helper/schema" +) + +const ( + mkResourceVirtualEnvironmentAccessGroupComment = "comment" + mkResourceVirtualEnvironmentAccessGroupID = "group_id" + mkResourceVirtualEnvironmentAccessGroupMembers = "members" +) + +func resourceVirtualEnvironmentAccessGroup() *schema.Resource { + return &schema.Resource{ + Schema: map[string]*schema.Schema{ + mkResourceVirtualEnvironmentAccessGroupComment: &schema.Schema{ + Type: schema.TypeString, + Description: "The group comment", + Optional: true, + Default: "", + }, + mkResourceVirtualEnvironmentAccessGroupID: &schema.Schema{ + Type: schema.TypeString, + Description: "The group id", + Required: true, + }, + mkResourceVirtualEnvironmentAccessGroupMembers: &schema.Schema{ + Type: schema.TypeList, + Description: "The group members", + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + Create: resourceVirtualEnvironmentAccessGroupCreate, + Read: resourceVirtualEnvironmentAccessGroupRead, + Update: resourceVirtualEnvironmentAccessGroupUpdate, + Delete: resourceVirtualEnvironmentAccessGroupDelete, + } +} + +func resourceVirtualEnvironmentAccessGroupCreate(d *schema.ResourceData, m interface{}) error { + config := m.(providerConfiguration) + + if config.veClient == nil { + return errors.New("You must specify the virtual environment details in the provider configuration to use this data source") + } + + groupID := d.Get(mkResourceVirtualEnvironmentAccessGroupID).(string) + body := &proxmox.VirtualEnvironmentAccessGroupCreateRequestBody{ + Comment: d.Get(mkResourceVirtualEnvironmentAccessGroupComment).(string), + ID: groupID, + } + + err := config.veClient.CreateAccessGroup(body) + + if err != nil { + return err + } + + d.SetId(groupID) + + return resourceVirtualEnvironmentAccessGroupRead(d, m) +} + +func resourceVirtualEnvironmentAccessGroupRead(d *schema.ResourceData, m interface{}) error { + config := m.(providerConfiguration) + + if config.veClient == nil { + return errors.New("You must specify the virtual environment details in the provider configuration to use this data source") + } + + groupID := d.Get(mkResourceVirtualEnvironmentAccessGroupID).(string) + accessGroup, err := config.veClient.GetAccessGroup(groupID) + + if err != nil { + if strings.Contains(err.Error(), "HTTP 404") { + d.SetId("") + + return nil + } + + return err + } + + d.SetId(groupID) + + d.Set(mkResourceVirtualEnvironmentAccessGroupComment, accessGroup.Comment) + d.Set(mkResourceVirtualEnvironmentAccessGroupMembers, accessGroup.Members) + + return nil +} + +func resourceVirtualEnvironmentAccessGroupUpdate(d *schema.ResourceData, m interface{}) error { + config := m.(providerConfiguration) + + if config.veClient == nil { + return errors.New("You must specify the virtual environment details in the provider configuration to use this data source") + } + + body := &proxmox.VirtualEnvironmentAccessGroupUpdateRequestBody{ + Comment: d.Get(mkResourceVirtualEnvironmentAccessGroupComment).(string), + } + + groupID := d.Get(mkResourceVirtualEnvironmentAccessGroupID).(string) + err := config.veClient.UpdateAccessGroup(groupID, body) + + if err != nil { + return err + } + + return resourceVirtualEnvironmentAccessGroupRead(d, m) +} + +func resourceVirtualEnvironmentAccessGroupDelete(d *schema.ResourceData, m interface{}) error { + config := m.(providerConfiguration) + + if config.veClient == nil { + return errors.New("You must specify the virtual environment details in the provider configuration to use this data source") + } + + groupID := d.Get(mkResourceVirtualEnvironmentAccessGroupID).(string) + err := config.veClient.DeleteAccessGroup(groupID) + + if err != nil { + if strings.Contains(err.Error(), "HTTP 404") { + d.SetId("") + + return nil + } + + return err + } + + d.SetId("") + + return nil +}