mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-07-02 03:22:59 +00:00
Initial work on pool resource
This commit is contained in:
parent
59598cf544
commit
14c2d219d7
@ -4,11 +4,15 @@ FEATURES:
|
|||||||
|
|
||||||
* **New Data Source:** `proxmox_virtual_environment_group`
|
* **New Data Source:** `proxmox_virtual_environment_group`
|
||||||
* **New Data Source:** `proxmox_virtual_environment_groups`
|
* **New Data Source:** `proxmox_virtual_environment_groups`
|
||||||
|
* **New Data Source:** `proxmox_virtual_environment_pool`
|
||||||
|
* **New Data Source:** `proxmox_virtual_environment_pools`
|
||||||
* **New Data Source:** `proxmox_virtual_environment_role`
|
* **New Data Source:** `proxmox_virtual_environment_role`
|
||||||
* **New Data Source:** `proxmox_virtual_environment_roles`
|
* **New Data Source:** `proxmox_virtual_environment_roles`
|
||||||
* **New Data Source:** `proxmox_virtual_environment_user`
|
* **New Data Source:** `proxmox_virtual_environment_user`
|
||||||
* **New Data Source:** `proxmox_virtual_environment_users`
|
* **New Data Source:** `proxmox_virtual_environment_users`
|
||||||
* **New Data Source:** `proxmox_virtual_environment_version`
|
* **New Data Source:** `proxmox_virtual_environment_version`
|
||||||
|
|
||||||
* **New Resource:** `proxmox_virtual_environment_group`
|
* **New Resource:** `proxmox_virtual_environment_group`
|
||||||
|
* **New Resource:** `proxmox_virtual_environment_pool`
|
||||||
* **New Resource:** `proxmox_virtual_environment_role`
|
* **New Resource:** `proxmox_virtual_environment_role`
|
||||||
* **New Resource:** `proxmox_virtual_environment_user`
|
* **New Resource:** `proxmox_virtual_environment_user`
|
||||||
|
36
README.md
36
README.md
@ -55,6 +55,28 @@ This data source doesn't accept arguments.
|
|||||||
* `comments` - The group comments
|
* `comments` - The group comments
|
||||||
* `group_ids` - The group ids
|
* `group_ids` - The group ids
|
||||||
|
|
||||||
|
##### Pool (proxmox_virtual_environment_pool)
|
||||||
|
|
||||||
|
###### Arguments
|
||||||
|
* `pool_id` - (Required) The pool id
|
||||||
|
|
||||||
|
###### Attributes
|
||||||
|
* `comment` - The pool comment
|
||||||
|
* `members` - The pool members
|
||||||
|
* `id` - The member id
|
||||||
|
* `node` - The node id
|
||||||
|
* `storage` - The storage id
|
||||||
|
* `type` - The member type
|
||||||
|
* `virtual_machine_id` - The virtual machine id
|
||||||
|
|
||||||
|
##### Pools (proxmox_virtual_environment_pools)
|
||||||
|
|
||||||
|
###### Arguments
|
||||||
|
This data source doesn't accept arguments.
|
||||||
|
|
||||||
|
###### Attributes
|
||||||
|
* `pool_ids` - The pool ids
|
||||||
|
|
||||||
##### Role (proxmox_virtual_environment_role)
|
##### Role (proxmox_virtual_environment_role)
|
||||||
|
|
||||||
###### Arguments
|
###### Arguments
|
||||||
@ -128,6 +150,20 @@ This data source doesn't accept arguments.
|
|||||||
###### Attributes
|
###### Attributes
|
||||||
* `members` - The group members as a list with `username@realm` entries
|
* `members` - The group members as a list with `username@realm` entries
|
||||||
|
|
||||||
|
##### Pool (proxmox_virtual_environment_pool)
|
||||||
|
|
||||||
|
###### Arguments
|
||||||
|
* `comment` - (Optional) The pool comment
|
||||||
|
* `pool_id` - (Required) The pool id
|
||||||
|
|
||||||
|
###### Attributes
|
||||||
|
* `members` - The pool members
|
||||||
|
* `id` - The member id
|
||||||
|
* `node` - The node id
|
||||||
|
* `storage` - The storage id
|
||||||
|
* `type` - The member type
|
||||||
|
* `virtual_machine_id` - The virtual machine id
|
||||||
|
|
||||||
##### Role (proxmox_virtual_environment_role)
|
##### Role (proxmox_virtual_environment_role)
|
||||||
|
|
||||||
###### Arguments
|
###### Arguments
|
||||||
|
122
data_source_virtual_environment_pool.go
Normal file
122
data_source_virtual_environment_pool.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/* 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 (
|
||||||
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
mkDataSourceVirtualEnvironmentPoolComment = "comment"
|
||||||
|
mkDataSourceVirtualEnvironmentPoolMembers = "members"
|
||||||
|
mkDataSourceVirtualEnvironmentPoolPoolID = "pool_id"
|
||||||
|
)
|
||||||
|
|
||||||
|
func dataSourceVirtualEnvironmentPool() *schema.Resource {
|
||||||
|
return &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
mkDataSourceVirtualEnvironmentPoolComment: &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Description: "The pool comment",
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
|
mkDataSourceVirtualEnvironmentPoolMembers: &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Description: "The pool members",
|
||||||
|
Computed: true,
|
||||||
|
Elem: &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersID: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
Description: "The member id",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersNode: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
Description: "The node id",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersStorage: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Description: "The storage id",
|
||||||
|
Default: "",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersType: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
Description: "The member type",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersVirtualMachineID: {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Optional: true,
|
||||||
|
Description: "The virtual machine id",
|
||||||
|
Default: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mkDataSourceVirtualEnvironmentPoolPoolID: &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Description: "The pool id",
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Read: dataSourceVirtualEnvironmentPoolRead,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dataSourceVirtualEnvironmentPoolRead(d *schema.ResourceData, m interface{}) error {
|
||||||
|
config := m.(providerConfiguration)
|
||||||
|
veClient, err := config.GetVEClient()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
poolID := d.Get(mkDataSourceVirtualEnvironmentPoolPoolID).(string)
|
||||||
|
pool, err := veClient.GetPool(poolID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId(poolID)
|
||||||
|
|
||||||
|
if pool.Comment != nil {
|
||||||
|
d.Set(mkDataSourceVirtualEnvironmentPoolComment, pool.Comment)
|
||||||
|
} else {
|
||||||
|
d.Set(mkDataSourceVirtualEnvironmentPoolComment, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
members := make([]interface{}, len(pool.Members))
|
||||||
|
|
||||||
|
for i, v := range pool.Members {
|
||||||
|
values := make(map[string]interface{})
|
||||||
|
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersID] = v.ID
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersNode] = v.Node
|
||||||
|
|
||||||
|
if v.Storage != nil {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersStorage] = v.Storage
|
||||||
|
} else {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersStorage] = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersType] = v.Type
|
||||||
|
|
||||||
|
if v.VirtualMachineID != nil {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersVirtualMachineID] = v.VirtualMachineID
|
||||||
|
} else {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersVirtualMachineID] = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
members[i] = values
|
||||||
|
}
|
||||||
|
|
||||||
|
d.Set(mkResourceVirtualEnvironmentPoolMembers, members)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
38
data_source_virtual_environment_pool_test.go
Normal file
38
data_source_virtual_environment_pool_test.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* 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 (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestDataSourceVirtualEnvironmentPoolInstantiation tests whether the DataSourceVirtualEnvironmentPool instance can be instantiated.
|
||||||
|
func TestDataSourceVirtualEnvironmentPoolInstantiation(t *testing.T) {
|
||||||
|
s := dataSourceVirtualEnvironmentPool()
|
||||||
|
|
||||||
|
if s == nil {
|
||||||
|
t.Fatalf("Cannot instantiate dataSourceVirtualEnvironmentPool")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDataSourceVirtualEnvironmentPoolSchema tests the dataSourceVirtualEnvironmentPool schema.
|
||||||
|
func TestDataSourceVirtualEnvironmentPoolSchema(t *testing.T) {
|
||||||
|
s := dataSourceVirtualEnvironmentPool()
|
||||||
|
|
||||||
|
attributeKeys := []string{
|
||||||
|
mkDataSourceVirtualEnvironmentPoolComment,
|
||||||
|
mkDataSourceVirtualEnvironmentPoolMembers,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range attributeKeys {
|
||||||
|
if s.Schema[v] == nil {
|
||||||
|
t.Fatalf("Error in dataSourceVirtualEnvironmentPool.Schema: Missing attribute \"%s\"", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.Schema[v].Computed != true {
|
||||||
|
t.Fatalf("Error in dataSourceVirtualEnvironmentPool.Schema: Attribute \"%s\" is not computed", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
54
data_source_virtual_environment_pools.go
Normal file
54
data_source_virtual_environment_pools.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/* 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 (
|
||||||
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
mkDataSourceVirtualEnvironmentPoolsPoolIDs = "pool_ids"
|
||||||
|
)
|
||||||
|
|
||||||
|
func dataSourceVirtualEnvironmentPools() *schema.Resource {
|
||||||
|
return &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
mkDataSourceVirtualEnvironmentPoolsPoolIDs: &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Description: "The pool ids",
|
||||||
|
Computed: true,
|
||||||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Read: dataSourceVirtualEnvironmentPoolsRead,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dataSourceVirtualEnvironmentPoolsRead(d *schema.ResourceData, m interface{}) error {
|
||||||
|
config := m.(providerConfiguration)
|
||||||
|
veClient, err := config.GetVEClient()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
list, err := veClient.ListPools()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
poolIDs := make([]interface{}, len(list))
|
||||||
|
|
||||||
|
for i, v := range list {
|
||||||
|
poolIDs[i] = v.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId("pools")
|
||||||
|
|
||||||
|
d.Set(mkDataSourceVirtualEnvironmentPoolsPoolIDs, poolIDs)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
37
data_source_virtual_environment_pools_test.go
Normal file
37
data_source_virtual_environment_pools_test.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/* 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 (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestDataSourceVirtualEnvironmentPoolsInstantiation tests whether the DataSourceVirtualEnvironmentPools instance can be instantiated.
|
||||||
|
func TestDataSourceVirtualEnvironmentPoolsInstantiation(t *testing.T) {
|
||||||
|
s := dataSourceVirtualEnvironmentPools()
|
||||||
|
|
||||||
|
if s == nil {
|
||||||
|
t.Fatalf("Cannot instantiate dataSourceVirtualEnvironmentPools")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDataSourceVirtualEnvironmentPoolsSchema tests the dataSourceVirtualEnvironmentPools schema.
|
||||||
|
func TestDataSourceVirtualEnvironmentPoolsSchema(t *testing.T) {
|
||||||
|
s := dataSourceVirtualEnvironmentPools()
|
||||||
|
|
||||||
|
attributeKeys := []string{
|
||||||
|
mkDataSourceVirtualEnvironmentPoolsPoolIDs,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range attributeKeys {
|
||||||
|
if s.Schema[v] == nil {
|
||||||
|
t.Fatalf("Error in dataSourceVirtualEnvironmentPools.Schema: Missing attribute \"%s\"", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.Schema[v].Computed != true {
|
||||||
|
t.Fatalf("Error in dataSourceVirtualEnvironmentPools.Schema: Attribute \"%s\" is not computed", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,10 +2,10 @@ data "proxmox_virtual_environment_group" "example" {
|
|||||||
group_id = "${proxmox_virtual_environment_group.example.id}"
|
group_id = "${proxmox_virtual_environment_group.example.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
output "data_proxmox_virtual_environment_group_example_comments" {
|
output "data_proxmox_virtual_environment_group_example_comment" {
|
||||||
value = "${data.proxmox_virtual_environment_group.example.*.comment}"
|
value = "${data.proxmox_virtual_environment_group.example.comment}"
|
||||||
}
|
}
|
||||||
|
|
||||||
output "data_proxmox_virtual_environment_group_example_members" {
|
output "data_proxmox_virtual_environment_group_example_members" {
|
||||||
value = "${data.proxmox_virtual_environment_group.example.*.members}"
|
value = "${data.proxmox_virtual_environment_group.example.members}"
|
||||||
}
|
}
|
||||||
|
15
example/data_source_virtual_environment_pool.tf
Normal file
15
example/data_source_virtual_environment_pool.tf
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
data "proxmox_virtual_environment_pool" "example" {
|
||||||
|
pool_id = "${proxmox_virtual_environment_pool.example.id}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "data_proxmox_virtual_environment_pool_example_comment" {
|
||||||
|
value = "${data.proxmox_virtual_environment_pool.example.comment}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "data_proxmox_virtual_environment_pool_example_members" {
|
||||||
|
value = "${data.proxmox_virtual_environment_pool.example.members}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "data_proxmox_virtual_environment_pool_example_pool_id" {
|
||||||
|
value = "${data.proxmox_virtual_environment_pool.example.id}"
|
||||||
|
}
|
9
example/data_source_virtual_environment_pools.tf
Normal file
9
example/data_source_virtual_environment_pools.tf
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
data "proxmox_virtual_environment_pools" "example" {
|
||||||
|
depends_on = ["proxmox_virtual_environment_pool.example"]
|
||||||
|
}
|
||||||
|
|
||||||
|
output "data_proxmox_virtual_environment_pools_example" {
|
||||||
|
value = "${map(
|
||||||
|
"pool_ids", data.proxmox_virtual_environment_pools.example.pool_ids,
|
||||||
|
)}"
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
data "proxmox_virtual_environment_users" "example" {
|
data "proxmox_virtual_environment_users" "example" {
|
||||||
depends_on = ["proxmox_virtual_environment_role.example"]
|
depends_on = ["proxmox_virtual_environment_user.example"]
|
||||||
}
|
}
|
||||||
|
|
||||||
output "data_proxmox_virtual_environment_users_example_comments" {
|
output "data_proxmox_virtual_environment_users_example_comments" {
|
||||||
|
16
example/resource_virtual_environment_pool.tf
Normal file
16
example/resource_virtual_environment_pool.tf
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
resource "proxmox_virtual_environment_pool" "example" {
|
||||||
|
comment = "Managed by Terraform"
|
||||||
|
pool_id = "terraform-provider-proxmox-example"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "resource_proxmox_virtual_environment_pool_example_comment" {
|
||||||
|
value = "${proxmox_virtual_environment_pool.example.comment}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "resource_proxmox_virtual_environment_pool_example_members" {
|
||||||
|
value = "${proxmox_virtual_environment_pool.example.members}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "resource_proxmox_virtual_environment_pool_example_pool_id" {
|
||||||
|
value = "${proxmox_virtual_environment_pool.example.id}"
|
||||||
|
}
|
@ -30,6 +30,8 @@ func Provider() *schema.Provider {
|
|||||||
DataSourcesMap: map[string]*schema.Resource{
|
DataSourcesMap: map[string]*schema.Resource{
|
||||||
"proxmox_virtual_environment_group": dataSourceVirtualEnvironmentGroup(),
|
"proxmox_virtual_environment_group": dataSourceVirtualEnvironmentGroup(),
|
||||||
"proxmox_virtual_environment_groups": dataSourceVirtualEnvironmentGroups(),
|
"proxmox_virtual_environment_groups": dataSourceVirtualEnvironmentGroups(),
|
||||||
|
"proxmox_virtual_environment_pool": dataSourceVirtualEnvironmentPool(),
|
||||||
|
"proxmox_virtual_environment_pools": dataSourceVirtualEnvironmentPools(),
|
||||||
"proxmox_virtual_environment_role": dataSourceVirtualEnvironmentRole(),
|
"proxmox_virtual_environment_role": dataSourceVirtualEnvironmentRole(),
|
||||||
"proxmox_virtual_environment_roles": dataSourceVirtualEnvironmentRoles(),
|
"proxmox_virtual_environment_roles": dataSourceVirtualEnvironmentRoles(),
|
||||||
"proxmox_virtual_environment_user": dataSourceVirtualEnvironmentUser(),
|
"proxmox_virtual_environment_user": dataSourceVirtualEnvironmentUser(),
|
||||||
@ -38,6 +40,7 @@ func Provider() *schema.Provider {
|
|||||||
},
|
},
|
||||||
ResourcesMap: map[string]*schema.Resource{
|
ResourcesMap: map[string]*schema.Resource{
|
||||||
"proxmox_virtual_environment_group": resourceVirtualEnvironmentGroup(),
|
"proxmox_virtual_environment_group": resourceVirtualEnvironmentGroup(),
|
||||||
|
"proxmox_virtual_environment_pool": resourceVirtualEnvironmentPool(),
|
||||||
"proxmox_virtual_environment_role": resourceVirtualEnvironmentRole(),
|
"proxmox_virtual_environment_role": resourceVirtualEnvironmentRole(),
|
||||||
"proxmox_virtual_environment_user": resourceVirtualEnvironmentUser(),
|
"proxmox_virtual_environment_user": resourceVirtualEnvironmentUser(),
|
||||||
},
|
},
|
||||||
|
@ -151,7 +151,7 @@ func (c *VirtualEnvironmentClient) ValidateResponseCode(res *http.Response) erro
|
|||||||
return fmt.Errorf("Received a HTTP %d response - Please verify that the user account has the necessary permissions", res.StatusCode)
|
return fmt.Errorf("Received a HTTP %d response - Please verify that the user account has the necessary permissions", res.StatusCode)
|
||||||
case 404:
|
case 404:
|
||||||
return fmt.Errorf("Received a HTTP %d response - Please verify that the endpoint refers to a supported version of the Proxmox Virtual Environment API", res.StatusCode)
|
return fmt.Errorf("Received a HTTP %d response - Please verify that the endpoint refers to a supported version of the Proxmox Virtual Environment API", res.StatusCode)
|
||||||
case 500:
|
case 500, 501, 502, 503:
|
||||||
return fmt.Errorf("Received a HTTP %d response - Please verify that the Proxmox Virtual Environment API is healthy (status: %s)", res.StatusCode, res.Status)
|
return fmt.Errorf("Received a HTTP %d response - Please verify that the Proxmox Virtual Environment API is healthy (status: %s)", res.StatusCode, res.Status)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Received a HTTP %d response", res.StatusCode)
|
return fmt.Errorf("Received a HTTP %d response", res.StatusCode)
|
||||||
|
109
proxmox/virtual_environment_pools.go
Normal file
109
proxmox/virtual_environment_pools.go
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/* 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 proxmox
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolCreateRequestBody contains the data for an pool create request.
|
||||||
|
type VirtualEnvironmentPoolCreateRequestBody struct {
|
||||||
|
Comment *string `json:"comment,omitempty" url:"comment,omitempty"`
|
||||||
|
ID string `json:"groupid" url:"poolid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolGetResponseBody contains the body from an pool get response.
|
||||||
|
type VirtualEnvironmentPoolGetResponseBody struct {
|
||||||
|
Data *VirtualEnvironmentPoolGetResponseData `json:"data,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolGetResponseData contains the data from an pool get response.
|
||||||
|
type VirtualEnvironmentPoolGetResponseData struct {
|
||||||
|
Comment *string `json:"comment,omitempty"`
|
||||||
|
Members []VirtualEnvironmentPoolGetResponseMembers `json:"members,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolGetResponseMembers contains the members data from an pool get response.
|
||||||
|
type VirtualEnvironmentPoolGetResponseMembers struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Node string `json:"node"`
|
||||||
|
Storage *string `json:"storage,omitempty"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
VirtualMachineID *int `json:"vmid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolListResponseBody contains the body from an pool list response.
|
||||||
|
type VirtualEnvironmentPoolListResponseBody struct {
|
||||||
|
Data []*VirtualEnvironmentPoolListResponseData `json:"data,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolListResponseData contains the data from an pool list response.
|
||||||
|
type VirtualEnvironmentPoolListResponseData struct {
|
||||||
|
Comment *string `json:"comment,omitempty"`
|
||||||
|
ID string `json:"poolid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VirtualEnvironmentPoolUpdateRequestBody contains the data for an pool update request.
|
||||||
|
type VirtualEnvironmentPoolUpdateRequestBody struct {
|
||||||
|
Comment *string `json:"comment,omitempty" url:"comment,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreatePool creates an pool.
|
||||||
|
func (c *VirtualEnvironmentClient) CreatePool(d *VirtualEnvironmentPoolCreateRequestBody) error {
|
||||||
|
return c.DoRequest(hmPOST, "pools", d, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeletePool deletes an pool.
|
||||||
|
func (c *VirtualEnvironmentClient) DeletePool(id string) error {
|
||||||
|
return c.DoRequest(hmDELETE, fmt.Sprintf("pools/%s", id), nil, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPool retrieves an pool.
|
||||||
|
func (c *VirtualEnvironmentClient) GetPool(id string) (*VirtualEnvironmentPoolGetResponseData, error) {
|
||||||
|
resBody := &VirtualEnvironmentPoolGetResponseBody{}
|
||||||
|
err := c.DoRequest(hmGET, fmt.Sprintf("pools/%s", url.PathEscape(id)), nil, resBody)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resBody.Data == nil {
|
||||||
|
return nil, errors.New("The server did not include a data object in the response")
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(resBody.Data.Members, func(i, j int) bool {
|
||||||
|
return resBody.Data.Members[i].ID < resBody.Data.Members[j].ID
|
||||||
|
})
|
||||||
|
|
||||||
|
return resBody.Data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListPools retrieves a list of pools.
|
||||||
|
func (c *VirtualEnvironmentClient) ListPools() ([]*VirtualEnvironmentPoolListResponseData, error) {
|
||||||
|
resBody := &VirtualEnvironmentPoolListResponseBody{}
|
||||||
|
err := c.DoRequest(hmGET, "pools", nil, resBody)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resBody.Data == nil {
|
||||||
|
return nil, errors.New("The server did not include a data object in the response")
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(resBody.Data, func(i, j int) bool {
|
||||||
|
return resBody.Data[i].ID < resBody.Data[j].ID
|
||||||
|
})
|
||||||
|
|
||||||
|
return resBody.Data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdatePool updates an pool.
|
||||||
|
func (c *VirtualEnvironmentClient) UpdatePool(id string, d *VirtualEnvironmentPoolUpdateRequestBody) error {
|
||||||
|
return c.DoRequest(hmPUT, fmt.Sprintf("pools/%s", id), d, nil)
|
||||||
|
}
|
218
resource_virtual_environment_pool.go
Normal file
218
resource_virtual_environment_pool.go
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/* 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 (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/danitso/terraform-provider-proxmox/proxmox"
|
||||||
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
mkResourceVirtualEnvironmentPoolComment = "comment"
|
||||||
|
mkResourceVirtualEnvironmentPoolMembers = "members"
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersID = "id"
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersNode = "node"
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersStorage = "storage"
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersType = "type"
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersVirtualMachineID = "virtual_machine_id"
|
||||||
|
mkResourceVirtualEnvironmentPoolPoolID = "pool_id"
|
||||||
|
)
|
||||||
|
|
||||||
|
func resourceVirtualEnvironmentPool() *schema.Resource {
|
||||||
|
return &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
mkResourceVirtualEnvironmentPoolComment: &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Description: "The pool comment",
|
||||||
|
Optional: true,
|
||||||
|
Default: "",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembers: &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Description: "The pool members",
|
||||||
|
Computed: true,
|
||||||
|
Elem: &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersID: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
Description: "The member id",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersNode: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
Description: "The node id",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersStorage: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Description: "The storage id",
|
||||||
|
Default: "",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersType: {
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
Description: "The member type",
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolMembersVirtualMachineID: {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Optional: true,
|
||||||
|
Description: "The virtual machine id",
|
||||||
|
Default: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mkResourceVirtualEnvironmentPoolPoolID: &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Description: "The pool id",
|
||||||
|
Required: true,
|
||||||
|
ForceNew: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Create: resourceVirtualEnvironmentPoolCreate,
|
||||||
|
Read: resourceVirtualEnvironmentPoolRead,
|
||||||
|
Update: resourceVirtualEnvironmentPoolUpdate,
|
||||||
|
Delete: resourceVirtualEnvironmentPoolDelete,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceVirtualEnvironmentPoolCreate(d *schema.ResourceData, m interface{}) error {
|
||||||
|
config := m.(providerConfiguration)
|
||||||
|
veClient, err := config.GetVEClient()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
comment := d.Get(mkResourceVirtualEnvironmentPoolComment).(string)
|
||||||
|
poolID := d.Get(mkResourceVirtualEnvironmentPoolPoolID).(string)
|
||||||
|
|
||||||
|
body := &proxmox.VirtualEnvironmentPoolCreateRequestBody{
|
||||||
|
Comment: &comment,
|
||||||
|
ID: poolID,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = veClient.CreatePool(body)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId(poolID)
|
||||||
|
|
||||||
|
return resourceVirtualEnvironmentPoolRead(d, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceVirtualEnvironmentPoolRead(d *schema.ResourceData, m interface{}) error {
|
||||||
|
config := m.(providerConfiguration)
|
||||||
|
veClient, err := config.GetVEClient()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
poolID := d.Id()
|
||||||
|
pool, err := veClient.GetPool(poolID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "HTTP 404") {
|
||||||
|
d.SetId("")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId(poolID)
|
||||||
|
|
||||||
|
if pool.Comment != nil {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentPoolComment, pool.Comment)
|
||||||
|
} else {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentPoolComment, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
members := make([]interface{}, len(pool.Members))
|
||||||
|
|
||||||
|
for i, v := range pool.Members {
|
||||||
|
values := make(map[string]interface{})
|
||||||
|
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersID] = v.ID
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersNode] = v.Node
|
||||||
|
|
||||||
|
if v.Storage != nil {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersStorage] = v.Storage
|
||||||
|
} else {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersStorage] = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersType] = v.Type
|
||||||
|
|
||||||
|
if v.VirtualMachineID != nil {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersVirtualMachineID] = v.VirtualMachineID
|
||||||
|
} else {
|
||||||
|
values[mkResourceVirtualEnvironmentPoolMembersVirtualMachineID] = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
members[i] = values
|
||||||
|
}
|
||||||
|
|
||||||
|
d.Set(mkResourceVirtualEnvironmentPoolMembers, members)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceVirtualEnvironmentPoolUpdate(d *schema.ResourceData, m interface{}) error {
|
||||||
|
config := m.(providerConfiguration)
|
||||||
|
veClient, err := config.GetVEClient()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
comment := d.Get(mkResourceVirtualEnvironmentPoolComment).(string)
|
||||||
|
poolID := d.Id()
|
||||||
|
|
||||||
|
body := &proxmox.VirtualEnvironmentPoolUpdateRequestBody{
|
||||||
|
Comment: &comment,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = veClient.UpdatePool(poolID, body)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resourceVirtualEnvironmentPoolRead(d, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceVirtualEnvironmentPoolDelete(d *schema.ResourceData, m interface{}) error {
|
||||||
|
config := m.(providerConfiguration)
|
||||||
|
veClient, err := config.GetVEClient()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
poolID := d.Id()
|
||||||
|
err = veClient.DeletePool(poolID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "HTTP 404") {
|
||||||
|
d.SetId("")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId("")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
35
resource_virtual_environment_pool_test.go
Normal file
35
resource_virtual_environment_pool_test.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* 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 (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestResourceVirtualEnvironmentPoolInstantiation tests whether the ResourceVirtualEnvironmentPool instance can be instantiated.
|
||||||
|
func TestResourceVirtualEnvironmentPoolInstantiation(t *testing.T) {
|
||||||
|
s := resourceVirtualEnvironmentPool()
|
||||||
|
|
||||||
|
if s == nil {
|
||||||
|
t.Fatalf("Cannot instantiate resourceVirtualEnvironmentPool")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestResourceVirtualEnvironmentPoolSchema tests the resourceVirtualEnvironmentPool schema.
|
||||||
|
func TestResourceVirtualEnvironmentPoolSchema(t *testing.T) {
|
||||||
|
s := resourceVirtualEnvironmentPool()
|
||||||
|
|
||||||
|
attributeKeys := []string{}
|
||||||
|
|
||||||
|
for _, v := range attributeKeys {
|
||||||
|
if s.Schema[v] == nil {
|
||||||
|
t.Fatalf("Error in resourceVirtualEnvironmentPool.Schema: Missing attribute \"%s\"", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.Schema[v].Computed != true {
|
||||||
|
t.Fatalf("Error in resourceVirtualEnvironmentPool.Schema: Attribute \"%s\" is not computed", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/danitso/terraform-provider-proxmox/proxmox"
|
"github.com/danitso/terraform-provider-proxmox/proxmox"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
"github.com/hashicorp/terraform/helper/validation"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -51,6 +52,7 @@ func resourceVirtualEnvironmentUser() *schema.Resource {
|
|||||||
Description: "The user account's expiration date",
|
Description: "The user account's expiration date",
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Default: time.Unix(0, 0).UTC().Format(time.RFC3339),
|
Default: time.Unix(0, 0).UTC().Format(time.RFC3339),
|
||||||
|
ValidateFunc: validation.ValidateRFC3339TimeString,
|
||||||
},
|
},
|
||||||
mkResourceVirtualEnvironmentUserFirstName: &schema.Schema{
|
mkResourceVirtualEnvironmentUserFirstName: &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
|
Loading…
Reference in New Issue
Block a user