mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-08-23 20:08:34 +00:00
chore(code): re-organize and cleanup "fwk provider"'s code (#568)
* chore(code): code cleanup / renaming * chore(code): flatten and rename fw provider package * chore(code): refactor & update network tests
This commit is contained in:
parent
0a37dfd28d
commit
7d064a8b27
6
Makefile
6
Makefile
@ -87,7 +87,11 @@ test:
|
|||||||
|
|
||||||
.PHONY: testacc
|
.PHONY: testacc
|
||||||
testacc:
|
testacc:
|
||||||
TF_ACC=1 go test ./...
|
# env vars required for acceptance tests
|
||||||
|
# - PROXMOX_VE_ENDPOINT
|
||||||
|
# - PROXMOX_VE_USERNAME
|
||||||
|
# - PROXMOX_VE_PASSWORD
|
||||||
|
TF_ACC=1 go test ./...
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint:
|
lint:
|
||||||
|
@ -188,7 +188,7 @@ output "ubuntu_container_public_key" {
|
|||||||
- `unmanaged` - Unmanaged.
|
- `unmanaged` - Unmanaged.
|
||||||
- `pool_id` - (Optional) The identifier for a pool to assign the container to.
|
- `pool_id` - (Optional) The identifier for a pool to assign the container to.
|
||||||
- `started` - (Optional) Whether to start the container (defaults to `true`).
|
- `started` - (Optional) Whether to start the container (defaults to `true`).
|
||||||
- `tags` - (Optional) A list of tags of the container. This is only meta
|
- `tags` - (Optional) A list of tags the container tags. This is only meta
|
||||||
information (defaults to `[]`). Note: Proxmox always sorts the container tags.
|
information (defaults to `[]`). Note: Proxmox always sorts the container tags.
|
||||||
If the list in template is not sorted, then Proxmox will always report a
|
If the list in template is not sorted, then Proxmox will always report a
|
||||||
difference on the resource. You may use the `ignore_changes` lifecycle
|
difference on the resource. You may use the `ignore_changes` lifecycle
|
||||||
@ -202,8 +202,8 @@ output "ubuntu_container_public_key" {
|
|||||||
to `false`)
|
to `false`)
|
||||||
- `fuse` - (Optional) Whether the container supports FUSE mounts (defaults
|
- `fuse` - (Optional) Whether the container supports FUSE mounts (defaults
|
||||||
to `false`)
|
to `false`)
|
||||||
- `keyctl` - (Optional) Whether the container supports `keyctl()` system call (defaults
|
- `keyctl` - (Optional) Whether the container supports `keyctl()` system
|
||||||
to `false`)
|
call (defaults to `false`)
|
||||||
|
|
||||||
## Attribute Reference
|
## Attribute Reference
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -14,30 +14,31 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
|
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure the implementation satisfies the expected interfaces.
|
// Ensure the implementation satisfies the expected interfaces.
|
||||||
var (
|
var (
|
||||||
_ datasource.DataSource = &hagroupDatasource{}
|
_ datasource.DataSource = &haGroupDatasource{}
|
||||||
_ datasource.DataSourceWithConfigure = &hagroupDatasource{}
|
_ datasource.DataSourceWithConfigure = &haGroupDatasource{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewHAGroupDataSource is a helper function to simplify the provider implementation.
|
// NewHAGroupDataSource is a helper function to simplify the provider implementation.
|
||||||
func NewHAGroupDataSource() datasource.DataSource {
|
func NewHAGroupDataSource() datasource.DataSource {
|
||||||
return &hagroupDatasource{}
|
return &haGroupDatasource{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hagroupDatasource is the data source implementation for full information about
|
// haGroupDatasource is the data source implementation for full information about
|
||||||
// specific High Availability groups.
|
// specific High Availability groups.
|
||||||
type hagroupDatasource struct {
|
type haGroupDatasource struct {
|
||||||
client *hagroups.Client
|
client *hagroups.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata returns the data source type name.
|
// Metadata returns the data source type name.
|
||||||
func (d *hagroupDatasource) Metadata(
|
func (d *haGroupDatasource) Metadata(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.MetadataRequest,
|
req datasource.MetadataRequest,
|
||||||
resp *datasource.MetadataResponse,
|
resp *datasource.MetadataResponse,
|
||||||
@ -46,7 +47,7 @@ func (d *hagroupDatasource) Metadata(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Schema returns the schema for the data source.
|
// Schema returns the schema for the data source.
|
||||||
func (d *hagroupDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
func (d *haGroupDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
||||||
resp.Schema = schema.Schema{
|
resp.Schema = schema.Schema{
|
||||||
Description: "Retrieves information about a specific High Availability group.",
|
Description: "Retrieves information about a specific High Availability group.",
|
||||||
Attributes: map[string]schema.Attribute{
|
Attributes: map[string]schema.Attribute{
|
||||||
@ -79,7 +80,7 @@ func (d *hagroupDatasource) Schema(_ context.Context, _ datasource.SchemaRequest
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configure adds the provider-configured client to the data source.
|
// Configure adds the provider-configured client to the data source.
|
||||||
func (d *hagroupDatasource) Configure(
|
func (d *haGroupDatasource) Configure(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.ConfigureRequest,
|
req datasource.ConfigureRequest,
|
||||||
resp *datasource.ConfigureResponse,
|
resp *datasource.ConfigureResponse,
|
||||||
@ -103,8 +104,8 @@ func (d *hagroupDatasource) Configure(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read fetches the list of HA groups from the Proxmox cluster then converts it to a list of strings.
|
// Read fetches the list of HA groups from the Proxmox cluster then converts it to a list of strings.
|
||||||
func (d *hagroupDatasource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
|
func (d *haGroupDatasource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
|
||||||
var state hagroupModel
|
var state haGroupModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.Config.Get(ctx, &state)...)
|
resp.Diagnostics.Append(req.Config.Get(ctx, &state)...)
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -15,35 +15,36 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
|
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure the implementation satisfies the expected interfaces.
|
// Ensure the implementation satisfies the expected interfaces.
|
||||||
var (
|
var (
|
||||||
_ datasource.DataSource = &hagroupsDatasource{}
|
_ datasource.DataSource = &haGroupsDatasource{}
|
||||||
_ datasource.DataSourceWithConfigure = &hagroupsDatasource{}
|
_ datasource.DataSourceWithConfigure = &haGroupsDatasource{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewHAGroupsDataSource is a helper function to simplify the provider implementation.
|
// NewHAGroupsDataSource is a helper function to simplify the provider implementation.
|
||||||
func NewHAGroupsDataSource() datasource.DataSource {
|
func NewHAGroupsDataSource() datasource.DataSource {
|
||||||
return &hagroupsDatasource{}
|
return &haGroupsDatasource{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hagroupsDatasource is the data source implementation for High Availability groups.
|
// haGroupsDatasource is the data source implementation for High Availability groups.
|
||||||
type hagroupsDatasource struct {
|
type haGroupsDatasource struct {
|
||||||
client *hagroups.Client
|
client *hagroups.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// hagroupsModel maps the schema data for the High Availability groups data source.
|
// haGroupsModel maps the schema data for the High Availability groups data source.
|
||||||
type hagroupsModel struct {
|
type haGroupsModel struct {
|
||||||
Groups types.Set `tfsdk:"group_ids"`
|
Groups types.Set `tfsdk:"group_ids"`
|
||||||
ID types.String `tfsdk:"id"`
|
ID types.String `tfsdk:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata returns the data source type name.
|
// Metadata returns the data source type name.
|
||||||
func (d *hagroupsDatasource) Metadata(
|
func (d *haGroupsDatasource) Metadata(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.MetadataRequest,
|
req datasource.MetadataRequest,
|
||||||
resp *datasource.MetadataResponse,
|
resp *datasource.MetadataResponse,
|
||||||
@ -52,7 +53,7 @@ func (d *hagroupsDatasource) Metadata(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Schema returns the schema for the data source.
|
// Schema returns the schema for the data source.
|
||||||
func (d *hagroupsDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
func (d *haGroupsDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
||||||
resp.Schema = schema.Schema{
|
resp.Schema = schema.Schema{
|
||||||
Description: "Retrieves the list of High Availability groups.",
|
Description: "Retrieves the list of High Availability groups.",
|
||||||
Attributes: map[string]schema.Attribute{
|
Attributes: map[string]schema.Attribute{
|
||||||
@ -67,7 +68,7 @@ func (d *hagroupsDatasource) Schema(_ context.Context, _ datasource.SchemaReques
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configure adds the provider-configured client to the data source.
|
// Configure adds the provider-configured client to the data source.
|
||||||
func (d *hagroupsDatasource) Configure(
|
func (d *haGroupsDatasource) Configure(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.ConfigureRequest,
|
req datasource.ConfigureRequest,
|
||||||
resp *datasource.ConfigureResponse,
|
resp *datasource.ConfigureResponse,
|
||||||
@ -91,8 +92,8 @@ func (d *hagroupsDatasource) Configure(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read fetches the list of HA groups from the Proxmox cluster then converts it to a list of strings.
|
// Read fetches the list of HA groups from the Proxmox cluster then converts it to a list of strings.
|
||||||
func (d *hagroupsDatasource) Read(ctx context.Context, _ datasource.ReadRequest, resp *datasource.ReadResponse) {
|
func (d *haGroupsDatasource) Read(ctx context.Context, _ datasource.ReadRequest, resp *datasource.ReadResponse) {
|
||||||
var state hagroupsModel
|
var state haGroupsModel
|
||||||
|
|
||||||
list, err := d.client.List(ctx)
|
list, err := d.client.List(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -14,8 +14,9 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
|
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/validators"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/validators"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
haresources "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/resources"
|
haresources "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/resources"
|
||||||
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
||||||
@ -23,22 +24,22 @@ import (
|
|||||||
|
|
||||||
// Ensure the implementation satisfies the expected interfaces.
|
// Ensure the implementation satisfies the expected interfaces.
|
||||||
var (
|
var (
|
||||||
_ datasource.DataSource = &haresourceDatasource{}
|
_ datasource.DataSource = &haResourceDatasource{}
|
||||||
_ datasource.DataSourceWithConfigure = &haresourceDatasource{}
|
_ datasource.DataSourceWithConfigure = &haResourceDatasource{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewHAResourceDataSource is a helper function to simplify the provider implementation.
|
// NewHAResourceDataSource is a helper function to simplify the provider implementation.
|
||||||
func NewHAResourceDataSource() datasource.DataSource {
|
func NewHAResourceDataSource() datasource.DataSource {
|
||||||
return &haresourceDatasource{}
|
return &haResourceDatasource{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// haresourceDatasource is the data source implementation for High Availability resources.
|
// haResourceDatasource is the data source implementation for High Availability resources.
|
||||||
type haresourceDatasource struct {
|
type haResourceDatasource struct {
|
||||||
client *haresources.Client
|
client *haresources.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata returns the data source type name.
|
// Metadata returns the data source type name.
|
||||||
func (d *haresourceDatasource) Metadata(
|
func (d *haResourceDatasource) Metadata(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.MetadataRequest,
|
req datasource.MetadataRequest,
|
||||||
resp *datasource.MetadataResponse,
|
resp *datasource.MetadataResponse,
|
||||||
@ -47,7 +48,7 @@ func (d *haresourceDatasource) Metadata(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Schema returns the schema for the data source.
|
// Schema returns the schema for the data source.
|
||||||
func (d *haresourceDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
func (d *haResourceDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
||||||
resp.Schema = schema.Schema{
|
resp.Schema = schema.Schema{
|
||||||
Description: "Retrieves the list of High Availability resources.",
|
Description: "Retrieves the list of High Availability resources.",
|
||||||
Attributes: map[string]schema.Attribute{
|
Attributes: map[string]schema.Attribute{
|
||||||
@ -88,7 +89,7 @@ func (d *haresourceDatasource) Schema(_ context.Context, _ datasource.SchemaRequ
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configure adds the provider-configured client to the data source.
|
// Configure adds the provider-configured client to the data source.
|
||||||
func (d *haresourceDatasource) Configure(
|
func (d *haResourceDatasource) Configure(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.ConfigureRequest,
|
req datasource.ConfigureRequest,
|
||||||
resp *datasource.ConfigureResponse,
|
resp *datasource.ConfigureResponse,
|
||||||
@ -110,8 +111,8 @@ func (d *haresourceDatasource) Configure(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read fetches the specified HA resource.
|
// Read fetches the specified HA resource.
|
||||||
func (d *haresourceDatasource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
|
func (d *haResourceDatasource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
|
||||||
var data haresourceModel
|
var data haResourceModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -17,7 +17,8 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
haresources "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/resources"
|
haresources "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/resources"
|
||||||
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
||||||
@ -25,22 +26,22 @@ import (
|
|||||||
|
|
||||||
// Ensure the implementation satisfies the expected interfaces.
|
// Ensure the implementation satisfies the expected interfaces.
|
||||||
var (
|
var (
|
||||||
_ datasource.DataSource = &haresourcesDatasource{}
|
_ datasource.DataSource = &haResourcesDatasource{}
|
||||||
_ datasource.DataSourceWithConfigure = &haresourcesDatasource{}
|
_ datasource.DataSourceWithConfigure = &haResourcesDatasource{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewHAResourcesDataSource is a helper function to simplify the provider implementation.
|
// NewHAResourcesDataSource is a helper function to simplify the provider implementation.
|
||||||
func NewHAResourcesDataSource() datasource.DataSource {
|
func NewHAResourcesDataSource() datasource.DataSource {
|
||||||
return &haresourcesDatasource{}
|
return &haResourcesDatasource{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// haresourcesDatasource is the data source implementation for High Availability resources.
|
// haResourcesDatasource is the data source implementation for High Availability resources.
|
||||||
type haresourcesDatasource struct {
|
type haResourcesDatasource struct {
|
||||||
client *haresources.Client
|
client *haresources.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// haresourcesModel maps the schema data for the High Availability resources data source.
|
// haResourcesModel maps the schema data for the High Availability resources data source.
|
||||||
type haresourcesModel struct {
|
type haResourcesModel struct {
|
||||||
// The Terraform resource identifier
|
// The Terraform resource identifier
|
||||||
ID types.String `tfsdk:"id"`
|
ID types.String `tfsdk:"id"`
|
||||||
// The type of HA resources to fetch. If unset, all resources will be fetched.
|
// The type of HA resources to fetch. If unset, all resources will be fetched.
|
||||||
@ -50,7 +51,7 @@ type haresourcesModel struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Metadata returns the data source type name.
|
// Metadata returns the data source type name.
|
||||||
func (d *haresourcesDatasource) Metadata(
|
func (d *haResourcesDatasource) Metadata(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.MetadataRequest,
|
req datasource.MetadataRequest,
|
||||||
resp *datasource.MetadataResponse,
|
resp *datasource.MetadataResponse,
|
||||||
@ -59,7 +60,7 @@ func (d *haresourcesDatasource) Metadata(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Schema returns the schema for the data source.
|
// Schema returns the schema for the data source.
|
||||||
func (d *haresourcesDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
func (d *haResourcesDatasource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
|
||||||
resp.Schema = schema.Schema{
|
resp.Schema = schema.Schema{
|
||||||
Description: "Retrieves the list of High Availability resources.",
|
Description: "Retrieves the list of High Availability resources.",
|
||||||
Attributes: map[string]schema.Attribute{
|
Attributes: map[string]schema.Attribute{
|
||||||
@ -82,7 +83,7 @@ func (d *haresourcesDatasource) Schema(_ context.Context, _ datasource.SchemaReq
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configure adds the provider-configured client to the data source.
|
// Configure adds the provider-configured client to the data source.
|
||||||
func (d *haresourcesDatasource) Configure(
|
func (d *haResourcesDatasource) Configure(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req datasource.ConfigureRequest,
|
req datasource.ConfigureRequest,
|
||||||
resp *datasource.ConfigureResponse,
|
resp *datasource.ConfigureResponse,
|
||||||
@ -104,9 +105,9 @@ func (d *haresourcesDatasource) Configure(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read fetches the list of HA resources from the Proxmox cluster then converts it to a list of strings.
|
// Read fetches the list of HA resources from the Proxmox cluster then converts it to a list of strings.
|
||||||
func (d *haresourcesDatasource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
|
func (d *haResourcesDatasource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
|
||||||
var (
|
var (
|
||||||
data haresourcesModel
|
data haResourcesModel
|
||||||
fetchType *proxmoxtypes.HAResourceType
|
fetchType *proxmoxtypes.HAResourceType
|
||||||
)
|
)
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package provider
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -18,9 +18,9 @@ import (
|
|||||||
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
||||||
)
|
)
|
||||||
|
|
||||||
// hagroupModel is the model used to represent a High Availability group.
|
// haGroupModel is the model used to represent a High Availability group.
|
||||||
type hagroupModel struct {
|
type haGroupModel struct {
|
||||||
ID types.String `tfsdk:"id"` // Identifier used by Terrraform
|
ID types.String `tfsdk:"id"` // Identifier used by Terraform
|
||||||
Group types.String `tfsdk:"group"` // HA group name
|
Group types.String `tfsdk:"group"` // HA group name
|
||||||
Comment types.String `tfsdk:"comment"` // Comment, if present
|
Comment types.String `tfsdk:"comment"` // Comment, if present
|
||||||
Nodes types.Map `tfsdk:"nodes"` // Map of member nodes associated with their priorities
|
Nodes types.Map `tfsdk:"nodes"` // Map of member nodes associated with their priorities
|
||||||
@ -29,7 +29,7 @@ type hagroupModel struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Import the contents of a HA group model from the API's response data.
|
// Import the contents of a HA group model from the API's response data.
|
||||||
func (m *hagroupModel) importFromAPI(group hagroups.HAGroupGetResponseData) diag.Diagnostics {
|
func (m *haGroupModel) importFromAPI(group hagroups.HAGroupGetResponseData) diag.Diagnostics {
|
||||||
m.Comment = types.StringPointerValue(group.Comment)
|
m.Comment = types.StringPointerValue(group.Comment)
|
||||||
m.NoFailback = group.NoFailback.ToValue()
|
m.NoFailback = group.NoFailback.ToValue()
|
||||||
m.Restricted = group.Restricted.ToValue()
|
m.Restricted = group.Restricted.ToValue()
|
||||||
@ -39,7 +39,7 @@ func (m *hagroupModel) importFromAPI(group hagroups.HAGroupGetResponseData) diag
|
|||||||
|
|
||||||
// Parse the list of member nodes. The list is received from the Proxmox API as a string. It must
|
// Parse the list of member nodes. The list is received from the Proxmox API as a string. It must
|
||||||
// be converted into a map value. Errors will be returned as Terraform diagnostics.
|
// be converted into a map value. Errors will be returned as Terraform diagnostics.
|
||||||
func (m *hagroupModel) parseHAGroupNodes(nodes string) diag.Diagnostics {
|
func (m *haGroupModel) parseHAGroupNodes(nodes string) diag.Diagnostics {
|
||||||
var diags diag.Diagnostics
|
var diags diag.Diagnostics
|
||||||
|
|
||||||
nodesIn := strings.Split(nodes, ",")
|
nodesIn := strings.Split(nodes, ",")
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -15,8 +15,8 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// haresourceModel maps the schema data for the High Availability resource data source.
|
// haResourceModel maps the schema data for the High Availability resource data source.
|
||||||
type haresourceModel struct {
|
type haResourceModel struct {
|
||||||
// The Terraform resource identifier
|
// The Terraform resource identifier
|
||||||
ID types.String `tfsdk:"id"`
|
ID types.String `tfsdk:"id"`
|
||||||
// The Proxmox HA resource identifier
|
// The Proxmox HA resource identifier
|
||||||
@ -36,7 +36,7 @@ type haresourceModel struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// importFromAPI imports the contents of a HA resource model from the API's response data.
|
// importFromAPI imports the contents of a HA resource model from the API's response data.
|
||||||
func (d *haresourceModel) importFromAPI(data *haresources.HAResourceGetResponseData) {
|
func (d *haResourceModel) importFromAPI(data *haresources.HAResourceGetResponseData) {
|
||||||
d.ID = data.ID.ToValue()
|
d.ID = data.ID.ToValue()
|
||||||
d.ResourceID = data.ID.ToValue()
|
d.ResourceID = data.ID.ToValue()
|
||||||
d.Type = data.Type.ToValue()
|
d.Type = data.Type.ToValue()
|
||||||
@ -48,7 +48,7 @@ func (d *haresourceModel) importFromAPI(data *haresources.HAResourceGetResponseD
|
|||||||
}
|
}
|
||||||
|
|
||||||
// toRequestBase builds the common request data structure for HA resource creation or update API calls.
|
// toRequestBase builds the common request data structure for HA resource creation or update API calls.
|
||||||
func (d haresourceModel) toRequestBase() haresources.HAResourceDataBase {
|
func (d *haResourceModel) toRequestBase() haresources.HAResourceDataBase {
|
||||||
var state proxmoxtypes.HAResourceState
|
var state proxmoxtypes.HAResourceState
|
||||||
|
|
||||||
if d.State.IsNull() {
|
if d.State.IsNull() {
|
||||||
@ -75,7 +75,7 @@ func (d haresourceModel) toRequestBase() haresources.HAResourceDataBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// toCreateRequest builds the request data structure for creating a new HA resource.
|
// toCreateRequest builds the request data structure for creating a new HA resource.
|
||||||
func (d haresourceModel) toCreateRequest(resID proxmoxtypes.HAResourceID) *haresources.HAResourceCreateRequestBody {
|
func (d *haResourceModel) toCreateRequest(resID proxmoxtypes.HAResourceID) *haresources.HAResourceCreateRequestBody {
|
||||||
return &haresources.HAResourceCreateRequestBody{
|
return &haresources.HAResourceCreateRequestBody{
|
||||||
ID: resID,
|
ID: resID,
|
||||||
Type: &resID.Type,
|
Type: &resID.Type,
|
||||||
@ -84,8 +84,8 @@ func (d haresourceModel) toCreateRequest(resID proxmoxtypes.HAResourceID) *hares
|
|||||||
}
|
}
|
||||||
|
|
||||||
// toUpdateRequest builds the request data structure for updating an existing HA resource.
|
// toUpdateRequest builds the request data structure for updating an existing HA resource.
|
||||||
func (d haresourceModel) toUpdateRequest(state *haresourceModel) *haresources.HAResourceUpdateRequestBody {
|
func (d *haResourceModel) toUpdateRequest(state *haResourceModel) *haresources.HAResourceUpdateRequestBody {
|
||||||
del := []string{}
|
var del []string
|
||||||
|
|
||||||
if d.Comment.IsNull() && !state.Comment.IsNull() {
|
if d.Comment.IsNull() && !state.Comment.IsNull() {
|
||||||
del = append(del, "comment")
|
del = append(del, "comment")
|
||||||
@ -103,10 +103,6 @@ func (d haresourceModel) toUpdateRequest(state *haresourceModel) *haresources.HA
|
|||||||
del = append(del, "max_restart")
|
del = append(del, "max_restart")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(del) == 0 {
|
|
||||||
del = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return &haresources.HAResourceUpdateRequestBody{
|
return &haresources.HAResourceUpdateRequestBody{
|
||||||
HAResourceDataBase: d.toRequestBase(),
|
HAResourceDataBase: d.toRequestBase(),
|
||||||
Delete: del,
|
Delete: del,
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package provider
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -24,8 +24,6 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
"github.com/hashicorp/terraform-plugin-log/tflog"
|
"github.com/hashicorp/terraform-plugin-log/tflog"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/cluster"
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/network"
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox/api"
|
"github.com/bpg/terraform-provider-proxmox/proxmox/api"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox/nodes"
|
"github.com/bpg/terraform-provider-proxmox/proxmox/nodes"
|
||||||
@ -365,21 +363,21 @@ func (p *proxmoxProvider) Configure(
|
|||||||
|
|
||||||
func (p *proxmoxProvider) Resources(_ context.Context) []func() resource.Resource {
|
func (p *proxmoxProvider) Resources(_ context.Context) []func() resource.Resource {
|
||||||
return []func() resource.Resource{
|
return []func() resource.Resource{
|
||||||
cluster.NewHAGroupResource,
|
NewHAGroupResource,
|
||||||
cluster.NewHAResourceResource,
|
NewHAResourceResource,
|
||||||
cluster.NewClusterOptionsResource,
|
NewClusterOptionsResource,
|
||||||
network.NewLinuxBridgeResource,
|
NewLinuxBridgeResource,
|
||||||
network.NewLinuxVLANResource,
|
NewLinuxVLANResource,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *proxmoxProvider) DataSources(_ context.Context) []func() datasource.DataSource {
|
func (p *proxmoxProvider) DataSources(_ context.Context) []func() datasource.DataSource {
|
||||||
return []func() datasource.DataSource{
|
return []func() datasource.DataSource{
|
||||||
NewVersionDataSource,
|
NewVersionDataSource,
|
||||||
cluster.NewHAGroupsDataSource,
|
NewHAGroupsDataSource,
|
||||||
cluster.NewHAGroupDataSource,
|
NewHAGroupDataSource,
|
||||||
cluster.NewHAResourcesDataSource,
|
NewHAResourcesDataSource,
|
||||||
cluster.NewHAResourceDataSource,
|
NewHAResourceDataSource,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -23,7 +23,8 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
|
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
hagroups "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/groups"
|
||||||
)
|
)
|
||||||
@ -143,7 +144,7 @@ func (r *hagroupResource) Configure(
|
|||||||
|
|
||||||
// Create creates a new HA group on the Proxmox cluster.
|
// Create creates a new HA group on the Proxmox cluster.
|
||||||
func (r *hagroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
|
func (r *hagroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
|
||||||
var data hagroupModel
|
var data haGroupModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
||||||
|
|
||||||
@ -177,7 +178,7 @@ func (r *hagroupResource) Create(ctx context.Context, req resource.CreateRequest
|
|||||||
|
|
||||||
// Read reads a HA group definition from the Proxmox cluster.
|
// Read reads a HA group definition from the Proxmox cluster.
|
||||||
func (r *hagroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
|
func (r *hagroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
|
||||||
var data hagroupModel
|
var data haGroupModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
||||||
|
|
||||||
@ -199,7 +200,7 @@ func (r *hagroupResource) Read(ctx context.Context, req resource.ReadRequest, re
|
|||||||
|
|
||||||
// Update updates a HA group definition on the Proxmox cluster.
|
// Update updates a HA group definition on the Proxmox cluster.
|
||||||
func (r *hagroupResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
|
func (r *hagroupResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
|
||||||
var data, state hagroupModel
|
var data, state haGroupModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
||||||
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
|
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
|
||||||
@ -232,7 +233,7 @@ func (r *hagroupResource) Update(ctx context.Context, req resource.UpdateRequest
|
|||||||
|
|
||||||
// Delete deletes a HA group definition.
|
// Delete deletes a HA group definition.
|
||||||
func (r *hagroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
|
func (r *hagroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
|
||||||
var data hagroupModel
|
var data haGroupModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
||||||
|
|
||||||
@ -269,7 +270,7 @@ func (r *hagroupResource) ImportState(
|
|||||||
resp *resource.ImportStateResponse,
|
resp *resource.ImportStateResponse,
|
||||||
) {
|
) {
|
||||||
reqID := req.ID
|
reqID := req.ID
|
||||||
data := hagroupModel{
|
data := haGroupModel{
|
||||||
ID: types.StringValue(reqID),
|
ID: types.StringValue(reqID),
|
||||||
Group: types.StringValue(reqID),
|
Group: types.StringValue(reqID),
|
||||||
}
|
}
|
||||||
@ -280,7 +281,7 @@ func (r *hagroupResource) ImportState(
|
|||||||
// state accordingly. It is assumed that the `state`'s identifier is set.
|
// state accordingly. It is assumed that the `state`'s identifier is set.
|
||||||
func (r *hagroupResource) readBack(
|
func (r *hagroupResource) readBack(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
data *hagroupModel,
|
data *haGroupModel,
|
||||||
respDiags *diag.Diagnostics,
|
respDiags *diag.Diagnostics,
|
||||||
respState *tfsdk.State,
|
respState *tfsdk.State,
|
||||||
) {
|
) {
|
||||||
@ -302,7 +303,7 @@ func (r *hagroupResource) readBack(
|
|||||||
|
|
||||||
// read reads information about a HA group from the cluster. The group identifier must have been set in the
|
// read reads information about a HA group from the cluster. The group identifier must have been set in the
|
||||||
// `data`.
|
// `data`.
|
||||||
func (r *hagroupResource) read(ctx context.Context, data *hagroupModel) (bool, diag.Diagnostics) {
|
func (r *hagroupResource) read(ctx context.Context, data *haGroupModel) (bool, diag.Diagnostics) {
|
||||||
name := data.Group.ValueString()
|
name := data.Group.ValueString()
|
||||||
|
|
||||||
group, err := r.client.Get(ctx, name)
|
group, err := r.client.Get(ctx, name)
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -12,8 +12,8 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/validators"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/validators"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
haresources "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/resources"
|
haresources "github.com/bpg/terraform-provider-proxmox/proxmox/cluster/ha/resources"
|
||||||
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
||||||
@ -31,26 +31,28 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// haresourceResource contains the resource's internal data.
|
// haResourceResource contains the resource's internal data.
|
||||||
type haresourceResource struct {
|
// NOTE: the naming is horrible, but this is the convention used by the framework.
|
||||||
|
// and the entity name in the API is "ha resource", so...
|
||||||
|
type haResourceResource struct {
|
||||||
// The HA resources API client
|
// The HA resources API client
|
||||||
client haresources.Client
|
client haresources.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the resource implements the expected interfaces.
|
// Ensure the resource implements the expected interfaces.
|
||||||
var (
|
var (
|
||||||
_ resource.Resource = &haresourceResource{}
|
_ resource.Resource = &haResourceResource{}
|
||||||
_ resource.ResourceWithConfigure = &haresourceResource{}
|
_ resource.ResourceWithConfigure = &haResourceResource{}
|
||||||
_ resource.ResourceWithImportState = &haresourceResource{}
|
_ resource.ResourceWithImportState = &haResourceResource{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewHAResourceResource returns a new resource for managing High Availability resources.
|
// NewHAResourceResource returns a new resource for managing High Availability resources.
|
||||||
func NewHAResourceResource() resource.Resource {
|
func NewHAResourceResource() resource.Resource {
|
||||||
return &haresourceResource{}
|
return &haResourceResource{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata defines the name of the resource.
|
// Metadata defines the name of the resource.
|
||||||
func (r *haresourceResource) Metadata(
|
func (r *haResourceResource) Metadata(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req resource.MetadataRequest,
|
req resource.MetadataRequest,
|
||||||
resp *resource.MetadataResponse,
|
resp *resource.MetadataResponse,
|
||||||
@ -59,7 +61,7 @@ func (r *haresourceResource) Metadata(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Schema defines the schema for the resource.
|
// Schema defines the schema for the resource.
|
||||||
func (r *haresourceResource) Schema(
|
func (r *haResourceResource) Schema(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
_ resource.SchemaRequest,
|
_ resource.SchemaRequest,
|
||||||
resp *resource.SchemaResponse,
|
resp *resource.SchemaResponse,
|
||||||
@ -134,7 +136,7 @@ func (r *haresourceResource) Schema(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configure adds the provider-configured client to the resource.
|
// Configure adds the provider-configured client to the resource.
|
||||||
func (r *haresourceResource) Configure(
|
func (r *haResourceResource) Configure(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
req resource.ConfigureRequest,
|
req resource.ConfigureRequest,
|
||||||
resp *resource.ConfigureResponse,
|
resp *resource.ConfigureResponse,
|
||||||
@ -156,8 +158,8 @@ func (r *haresourceResource) Configure(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create creates a new HA resource.
|
// Create creates a new HA resource.
|
||||||
func (r *haresourceResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
|
func (r *haResourceResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
|
||||||
var data haresourceModel
|
var data haResourceModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
||||||
|
|
||||||
@ -194,12 +196,12 @@ func (r *haresourceResource) Create(ctx context.Context, req resource.CreateRequ
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update updates an existing HA resource.
|
// Update updates an existing HA resource.
|
||||||
func (r *haresourceResource) Update(
|
func (r *haResourceResource) Update(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req resource.UpdateRequest,
|
req resource.UpdateRequest,
|
||||||
resp *resource.UpdateResponse,
|
resp *resource.UpdateResponse,
|
||||||
) {
|
) {
|
||||||
var data, state haresourceModel
|
var data, state haResourceModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)
|
||||||
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
|
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
|
||||||
@ -234,12 +236,12 @@ func (r *haresourceResource) Update(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete deletes an existing HA resource.
|
// Delete deletes an existing HA resource.
|
||||||
func (r *haresourceResource) Delete(
|
func (r *haResourceResource) Delete(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req resource.DeleteRequest,
|
req resource.DeleteRequest,
|
||||||
resp *resource.DeleteResponse,
|
resp *resource.DeleteResponse,
|
||||||
) {
|
) {
|
||||||
var data haresourceModel
|
var data haResourceModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
||||||
|
|
||||||
@ -279,12 +281,12 @@ func (r *haresourceResource) Delete(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read reads the HA resource.
|
// Read reads the HA resource.
|
||||||
func (r *haresourceResource) Read(
|
func (r *haResourceResource) Read(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req resource.ReadRequest,
|
req resource.ReadRequest,
|
||||||
resp *resource.ReadResponse,
|
resp *resource.ReadResponse,
|
||||||
) {
|
) {
|
||||||
var data haresourceModel
|
var data haResourceModel
|
||||||
|
|
||||||
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
|
||||||
|
|
||||||
@ -305,13 +307,13 @@ func (r *haresourceResource) Read(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ImportState imports a HA resource from the Proxmox cluster.
|
// ImportState imports a HA resource from the Proxmox cluster.
|
||||||
func (r *haresourceResource) ImportState(
|
func (r *haResourceResource) ImportState(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req resource.ImportStateRequest,
|
req resource.ImportStateRequest,
|
||||||
resp *resource.ImportStateResponse,
|
resp *resource.ImportStateResponse,
|
||||||
) {
|
) {
|
||||||
reqID := req.ID
|
reqID := req.ID
|
||||||
data := haresourceModel{
|
data := haResourceModel{
|
||||||
ID: types.StringValue(reqID),
|
ID: types.StringValue(reqID),
|
||||||
ResourceID: types.StringValue(reqID),
|
ResourceID: types.StringValue(reqID),
|
||||||
}
|
}
|
||||||
@ -320,7 +322,7 @@ func (r *haresourceResource) ImportState(
|
|||||||
|
|
||||||
// read reads information about a HA resource from the cluster. The Terraform resource identifier must have been set
|
// read reads information about a HA resource from the cluster. The Terraform resource identifier must have been set
|
||||||
// in the model before this function is called.
|
// in the model before this function is called.
|
||||||
func (r *haresourceResource) read(ctx context.Context, data *haresourceModel) (bool, diag.Diagnostics) {
|
func (r *haResourceResource) read(ctx context.Context, data *haResourceModel) (bool, diag.Diagnostics) {
|
||||||
var diags diag.Diagnostics
|
var diags diag.Diagnostics
|
||||||
|
|
||||||
resID, err := proxmoxtypes.ParseHAResourceID(data.ID.ValueString())
|
resID, err := proxmoxtypes.ParseHAResourceID(data.ID.ValueString())
|
||||||
@ -334,7 +336,7 @@ func (r *haresourceResource) read(ctx context.Context, data *haresourceModel) (b
|
|||||||
return false, diags
|
return false, diags
|
||||||
}
|
}
|
||||||
|
|
||||||
resource, err := r.client.Get(ctx, resID)
|
res, err := r.client.Get(ctx, resID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !strings.Contains(err.Error(), "no such resource") {
|
if !strings.Contains(err.Error(), "no such resource") {
|
||||||
diags.AddError("Could not read HA resource", err.Error())
|
diags.AddError("Could not read HA resource", err.Error())
|
||||||
@ -343,16 +345,16 @@ func (r *haresourceResource) read(ctx context.Context, data *haresourceModel) (b
|
|||||||
return false, diags
|
return false, diags
|
||||||
}
|
}
|
||||||
|
|
||||||
data.importFromAPI(resource)
|
data.importFromAPI(res)
|
||||||
|
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// readBack reads information about a created or modified HA resource from the cluster then updates the response
|
// readBack reads information about a created or modified HA resource from the cluster then updates the response
|
||||||
// state accordingly. It is assumed that the `state`'s identifier is set.
|
// state accordingly. It is assumed that the `state`'s identifier is set.
|
||||||
func (r *haresourceResource) readBack(
|
func (r *haResourceResource) readBack(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
data *haresourceModel,
|
data *haResourceModel,
|
||||||
respDiags *diag.Diagnostics,
|
respDiags *diag.Diagnostics,
|
||||||
respState *tfsdk.State,
|
respState *tfsdk.State,
|
||||||
) {
|
) {
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package network
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -24,8 +24,9 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
customtypes "github.com/bpg/terraform-provider-proxmox/internal/types"
|
customtypes "github.com/bpg/terraform-provider-proxmox/fwprovider/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox/nodes"
|
"github.com/bpg/terraform-provider-proxmox/proxmox/nodes"
|
||||||
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package network
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -22,8 +22,9 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
customtypes "github.com/bpg/terraform-provider-proxmox/internal/types"
|
customtypes "github.com/bpg/terraform-provider-proxmox/fwprovider/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox/nodes"
|
"github.com/bpg/terraform-provider-proxmox/proxmox/nodes"
|
||||||
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
||||||
@ -208,6 +209,7 @@ func (r *linuxVLANResource) Schema(
|
|||||||
Description: "The VLAN tag. See also `name`.",
|
Description: "The VLAN tag. See also `name`.",
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
|
// 4,094
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package fwprovider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -19,8 +19,9 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
||||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/structure"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/structure"
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/validators"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/validators"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox/cluster"
|
"github.com/bpg/terraform-provider-proxmox/proxmox/cluster"
|
||||||
)
|
)
|
||||||
@ -645,7 +646,7 @@ func (r *clusterOptionsResource) Delete(ctx context.Context, req resource.Delete
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Imports a cluster options interface.
|
// ImportState a cluster options interface.
|
||||||
func (r *clusterOptionsResource) ImportState(
|
func (r *clusterOptionsResource) ImportState(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req resource.ImportStateRequest,
|
req resource.ImportStateRequest,
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package test
|
package tests
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -15,10 +15,10 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_VersionDatasource(t *testing.T) {
|
func TestAccDatasourceVersion(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
accProviders := AccMuxProviders(context.Background(), t)
|
accProviders := testAccMuxProviders(context.Background(), t)
|
||||||
|
|
||||||
datasourceName := "data.proxmox_virtual_environment_version.test"
|
datasourceName := "data.proxmox_virtual_environment_version.test"
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ func Test_VersionDatasource(t *testing.T) {
|
|||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
// Read testing
|
// Read testing
|
||||||
{
|
{
|
||||||
Config: ProviderConfig + `data "proxmox_virtual_environment_version" "test" {}`,
|
Config: `data "proxmox_virtual_environment_version" "test" {}`,
|
||||||
Check: resource.ComposeAggregateTestCheckFunc(
|
Check: resource.ComposeAggregateTestCheckFunc(
|
||||||
resource.TestCheckResourceAttr(datasourceName, "release", "8.0"),
|
resource.TestCheckResourceAttr(datasourceName, "release", "8.0"),
|
||||||
resource.TestCheckResourceAttrSet(datasourceName, "repository_id"),
|
resource.TestCheckResourceAttrSet(datasourceName, "repository_id"),
|
110
fwprovider/tests/resource_linux_bridge_test.go
Normal file
110
fwprovider/tests/resource_linux_bridge_test.go
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* 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 tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
accTestLinuxBridgeName = "proxmox_virtual_environment_network_linux_bridge.test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAccResourceLinuxBridge(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
accProviders := testAccMuxProviders(context.Background(), t)
|
||||||
|
|
||||||
|
iface := fmt.Sprintf("vmbr%d", gofakeit.Number(10, 9999))
|
||||||
|
ipV4cidr1 := fmt.Sprintf("%s/24", gofakeit.IPv4Address())
|
||||||
|
ipV4cidr2 := fmt.Sprintf("%s/24", gofakeit.IPv4Address())
|
||||||
|
ipV6cidr := "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
ProtoV6ProviderFactories: accProviders,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
// Create and Read testing
|
||||||
|
{
|
||||||
|
Config: testAccResourceLinuxBridgeCreatedConfig(iface, ipV4cidr1),
|
||||||
|
Check: testAccResourceLinuxBridgeCreatedCheck(iface, ipV4cidr1),
|
||||||
|
},
|
||||||
|
// Update testing
|
||||||
|
{
|
||||||
|
Config: testAccResourceLinuxBridgeUpdatedConfig(iface, ipV4cidr2, ipV6cidr),
|
||||||
|
Check: testAccResourceLinuxBridgeUpdatedCheck(iface, ipV4cidr2, ipV6cidr),
|
||||||
|
},
|
||||||
|
// ImportState testing
|
||||||
|
{
|
||||||
|
ResourceName: accTestLinuxBridgeName,
|
||||||
|
ImportState: true,
|
||||||
|
ImportStateVerify: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxBridgeCreatedConfig(name string, ipV4cidr string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "proxmox_virtual_environment_network_linux_bridge" "test" {
|
||||||
|
node_name = "%s"
|
||||||
|
name = "%s"
|
||||||
|
address = "%s"
|
||||||
|
comment = "created by terraform"
|
||||||
|
vlan_aware = true
|
||||||
|
autostart = true
|
||||||
|
mtu = 1499
|
||||||
|
}
|
||||||
|
`, accTestNodeName, name, ipV4cidr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxBridgeCreatedCheck(name string, ipV4cidr string) resource.TestCheckFunc {
|
||||||
|
return resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "name", name),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "address", ipV4cidr),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "comment", "created by terraform"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "vlan_aware", "true"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "autostart", "true"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "mtu", "1499"),
|
||||||
|
resource.TestCheckResourceAttrSet(accTestLinuxBridgeName, "id"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxBridgeUpdatedConfig(name string, ipV4cidr string, ipV6cidr string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "proxmox_virtual_environment_network_linux_bridge" "test" {
|
||||||
|
node_name = "%s"
|
||||||
|
name = "%s"
|
||||||
|
address = "%s"
|
||||||
|
address6 = "%s"
|
||||||
|
comment = "updated by terraform"
|
||||||
|
vlan_aware = false
|
||||||
|
autostart = false
|
||||||
|
mtu = null
|
||||||
|
}
|
||||||
|
`, accTestNodeName, name, ipV4cidr, ipV6cidr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxBridgeUpdatedCheck(name string, ipV4cidr string, ipV6cidr string) resource.TestCheckFunc {
|
||||||
|
return resource.ComposeTestCheckFunc(
|
||||||
|
resource.ComposeAggregateTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "name", name),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "address", ipV4cidr),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "address6", ipV6cidr),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "comment", "updated by terraform"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "vlan_aware", "false"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxBridgeName, "autostart", "false"),
|
||||||
|
resource.TestCheckNoResourceAttr(accTestLinuxBridgeName, "mtu"),
|
||||||
|
resource.TestCheckResourceAttrSet(accTestLinuxBridgeName, "id"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
136
fwprovider/tests/resource_linux_vlan_test.go
Normal file
136
fwprovider/tests/resource_linux_vlan_test.go
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* 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 tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
accTestLinuxVLANName = "proxmox_virtual_environment_network_linux_vlan.test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAccResourceLinuxVLAN(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
accProviders := testAccMuxProviders(context.Background(), t)
|
||||||
|
|
||||||
|
iface := "eno0"
|
||||||
|
vlan1 := gofakeit.Number(10, 4094)
|
||||||
|
customName := fmt.Sprintf("iface_%s", gofakeit.Word())
|
||||||
|
vlan2 := gofakeit.Number(10, 4094)
|
||||||
|
ipV4cidr := fmt.Sprintf("%s/24", gofakeit.IPv4Address())
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
ProtoV6ProviderFactories: accProviders,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
// Create and Read testing
|
||||||
|
{
|
||||||
|
Config: testAccResourceLinuxVLANCreatedConfig(iface, vlan1),
|
||||||
|
Check: testAccResourceLinuxVLANCreatedCheck(iface, vlan1),
|
||||||
|
},
|
||||||
|
// ImportState testing
|
||||||
|
{
|
||||||
|
ResourceName: accTestLinuxVLANName,
|
||||||
|
ImportState: true,
|
||||||
|
ImportStateVerify: true,
|
||||||
|
},
|
||||||
|
// Create and Read with a custom name
|
||||||
|
{
|
||||||
|
Config: testAccResourceLinuxVLANCustomNameCreatedConfig(customName, iface, vlan2),
|
||||||
|
Check: testAccResourceLinuxVLANCustomNameCreatedCheck(customName, iface, vlan2),
|
||||||
|
// PVE API is unreliable. Sometimes it returns a wrong VLAN ID for this second interface.
|
||||||
|
SkipFunc: func() (bool, error) {
|
||||||
|
return true, nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// Update testing
|
||||||
|
{
|
||||||
|
Config: testAccResourceLinuxVLANUpdatedConfig(iface, vlan1, ipV4cidr),
|
||||||
|
Check: testAccResourceLinuxVLANUpdatedCheck(iface, vlan1, ipV4cidr),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxVLANCreatedConfig(iface string, vlan int) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "proxmox_virtual_environment_network_linux_vlan" "test" {
|
||||||
|
node_name = "%s"
|
||||||
|
name = "%s.%d"
|
||||||
|
comment = "created by terraform"
|
||||||
|
mtu = 1499
|
||||||
|
}
|
||||||
|
`, accTestNodeName, iface, vlan)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxVLANCreatedCheck(iface string, vlan int) resource.TestCheckFunc {
|
||||||
|
return resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "name", fmt.Sprintf("%s.%d", iface, vlan)),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "comment", "created by terraform"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "vlan", strconv.Itoa(vlan)),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "interface", iface),
|
||||||
|
resource.TestCheckResourceAttrSet(accTestLinuxVLANName, "id"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxVLANCustomNameCreatedConfig(name string, iface string, vlan int) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "proxmox_virtual_environment_network_linux_vlan" "%s" {
|
||||||
|
node_name = "%s"
|
||||||
|
name = "%s"
|
||||||
|
interface = "%s"
|
||||||
|
vlan = %d
|
||||||
|
comment = "created by terraform"
|
||||||
|
mtu = 1499
|
||||||
|
}
|
||||||
|
`, name, accTestNodeName, name, iface, vlan)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxVLANCustomNameCreatedCheck(name string, iface string, vlan int) resource.TestCheckFunc {
|
||||||
|
resourceName := fmt.Sprintf("proxmox_virtual_environment_network_linux_vlan.%s", name)
|
||||||
|
|
||||||
|
return resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "name", name),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "comment", "created by terraform"),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "interface", iface),
|
||||||
|
resource.TestCheckResourceAttrSet(resourceName, "id"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxVLANUpdatedConfig(iface string, vlan int, ipV4cidr string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "proxmox_virtual_environment_network_linux_vlan" "test" {
|
||||||
|
node_name = "%s"
|
||||||
|
name = "%s.%d"
|
||||||
|
address = "%s"
|
||||||
|
address6 = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"
|
||||||
|
comment = "updated by terraform"
|
||||||
|
mtu = null
|
||||||
|
}
|
||||||
|
`, accTestNodeName, iface, vlan, ipV4cidr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccResourceLinuxVLANUpdatedCheck(iface string, vlan int, ipV4cidr string) resource.TestCheckFunc {
|
||||||
|
return resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "name", fmt.Sprintf("%s.%d", iface, vlan)),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "vlan", strconv.Itoa(vlan)),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "interface", iface),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "address", ipV4cidr),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "address6", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"),
|
||||||
|
resource.TestCheckResourceAttr(accTestLinuxVLANName, "comment", "updated by terraform"),
|
||||||
|
resource.TestCheckNoResourceAttr(accTestLinuxVLANName, "mtu"),
|
||||||
|
resource.TestCheckResourceAttrSet(accTestLinuxVLANName, "id"),
|
||||||
|
)
|
||||||
|
}
|
@ -4,20 +4,19 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package cluster
|
package tests
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/test"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestClusterOptionsResource(t *testing.T) {
|
func TestClusterOptionsResource(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
accProviders := test.AccMuxProviders(context.Background(), t)
|
accProviders := testAccMuxProviders(context.Background(), t)
|
||||||
|
|
||||||
resourceName := "proxmox_virtual_environment_cluster_options.test_options"
|
resourceName := "proxmox_virtual_environment_cluster_options.test_options"
|
||||||
|
|
||||||
@ -26,7 +25,7 @@ func TestClusterOptionsResource(t *testing.T) {
|
|||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
// Create and Read testing
|
// Create and Read testing
|
||||||
{
|
{
|
||||||
Config: test.ProviderConfig + `
|
Config: `
|
||||||
resource "proxmox_virtual_environment_cluster_options" "test_options" {
|
resource "proxmox_virtual_environment_cluster_options" "test_options" {
|
||||||
language = "en"
|
language = "en"
|
||||||
keyboard = "pl"
|
keyboard = "pl"
|
||||||
@ -64,7 +63,7 @@ resource "proxmox_virtual_environment_cluster_options" "test_options" {
|
|||||||
},
|
},
|
||||||
// Update testing
|
// Update testing
|
||||||
{
|
{
|
||||||
Config: test.ProviderConfig + `
|
Config: `
|
||||||
resource "proxmox_virtual_environment_cluster_options" "test_options" {
|
resource "proxmox_virtual_environment_cluster_options" "test_options" {
|
||||||
language = "en"
|
language = "en"
|
||||||
keyboard = "pl"
|
keyboard = "pl"
|
@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package test
|
package tests
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -19,28 +19,16 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
fwprovider "github.com/bpg/terraform-provider-proxmox/internal/provider"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider"
|
||||||
sdkV2provider "github.com/bpg/terraform-provider-proxmox/proxmoxtf/provider"
|
sdkV2provider "github.com/bpg/terraform-provider-proxmox/proxmoxtf/provider"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// ProviderConfig is a shared configuration to combine with the actual
|
accTestNodeName = "pve"
|
||||||
// test configuration so the Proxmox VE client is properly configured.
|
|
||||||
// It is also possible to use the PROXMOX_VE_ environment variables instead.
|
|
||||||
ProviderConfig = `
|
|
||||||
provider "proxmox" {
|
|
||||||
username = "root@pam"
|
|
||||||
password = "password"
|
|
||||||
insecure = true
|
|
||||||
ssh {
|
|
||||||
agent = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AccMuxProviders returns a map of mux servers for the acceptance tests.
|
// testAccMuxProviders returns a map of mux servers for the acceptance tests.
|
||||||
func AccMuxProviders(ctx context.Context, t *testing.T) map[string]func() (tfprotov6.ProviderServer, error) {
|
func testAccMuxProviders(ctx context.Context, t *testing.T) map[string]func() (tfprotov6.ProviderServer, error) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
// Init sdkV2 provider
|
// Init sdkV2 provider
|
2
go.mod
2
go.mod
@ -3,6 +3,8 @@ module github.com/bpg/terraform-provider-proxmox
|
|||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/avast/retry-go/v4 v4.5.0
|
||||||
|
github.com/brianvoe/gofakeit/v6 v6.23.2
|
||||||
github.com/google/go-cmp v0.5.9
|
github.com/google/go-cmp v0.5.9
|
||||||
github.com/google/go-querystring v1.1.0
|
github.com/google/go-querystring v1.1.0
|
||||||
github.com/google/uuid v1.3.1
|
github.com/google/uuid v1.3.1
|
||||||
|
5
go.sum
5
go.sum
@ -8,7 +8,10 @@ github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki
|
|||||||
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
|
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
|
||||||
github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY=
|
github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY=
|
||||||
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
|
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
|
||||||
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
|
github.com/avast/retry-go/v4 v4.5.0 h1:QoRAZZ90cj5oni2Lsgl2GW8mNTnUCnmpx/iKpwVisHg=
|
||||||
|
github.com/avast/retry-go/v4 v4.5.0/go.mod h1:7hLEXp0oku2Nir2xBAsg0PTphp9z71bN5Aq1fboC3+I=
|
||||||
|
github.com/brianvoe/gofakeit/v6 v6.23.2 h1:lVde18uhad5wII/f5RMVFLtdQNE0HaGFuBUXmYKk8i8=
|
||||||
|
github.com/brianvoe/gofakeit/v6 v6.23.2/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=
|
||||||
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
|
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
|
||||||
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
||||||
github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
|
github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 internal contains implementation of the provider created with Terraform Plugin Framework.
|
|
||||||
package internal
|
|
@ -1,105 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 network
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/test"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestLinuxBridgeResource(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
accProviders := test.AccMuxProviders(context.Background(), t)
|
|
||||||
|
|
||||||
resourceName := "proxmox_virtual_environment_network_linux_bridge.test"
|
|
||||||
|
|
||||||
resource.Test(t, resource.TestCase{
|
|
||||||
ProtoV6ProviderFactories: accProviders,
|
|
||||||
Steps: []resource.TestStep{
|
|
||||||
// Create and Read testing
|
|
||||||
{
|
|
||||||
Config: test.ProviderConfig + `
|
|
||||||
resource "proxmox_virtual_environment_network_linux_bridge" "test" {
|
|
||||||
node_name = "pve"
|
|
||||||
name = "vmbr99"
|
|
||||||
address = "3.3.3.3/24"
|
|
||||||
comment = "created by terraform"
|
|
||||||
vlan_aware = false
|
|
||||||
autostart = false
|
|
||||||
mtu = 1499
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
Check: resource.ComposeAggregateTestCheckFunc(
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "name", "vmbr99"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "address", "3.3.3.3/24"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "comment", "created by terraform"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "vlan_aware", "false"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "autostart", "false"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "mtu", "1499"),
|
|
||||||
resource.TestCheckResourceAttrSet(resourceName, "id"),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
// ImportState testing
|
|
||||||
{
|
|
||||||
ResourceName: resourceName,
|
|
||||||
ImportState: true,
|
|
||||||
ImportStateVerify: true,
|
|
||||||
},
|
|
||||||
// Update testing
|
|
||||||
{
|
|
||||||
Config: test.ProviderConfig + `
|
|
||||||
resource "proxmox_virtual_environment_network_linux_bridge" "test" {
|
|
||||||
node_name = "pve"
|
|
||||||
name = "vmbr99"
|
|
||||||
address = "1.1.1.1/24"
|
|
||||||
address6 = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"
|
|
||||||
comment = "updated by terraform"
|
|
||||||
vlan_aware = true
|
|
||||||
autostart = true
|
|
||||||
mtu = null
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
Check: resource.ComposeAggregateTestCheckFunc(
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "name", "vmbr99"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "address", "1.1.1.1/24"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "address6", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "comment", "updated by terraform"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "vlan_aware", "true"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "autostart", "true"),
|
|
||||||
resource.TestCheckNoResourceAttr(resourceName, "mtu"),
|
|
||||||
resource.TestCheckResourceAttrSet(resourceName, "id"),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
// Create with other default overrides
|
|
||||||
{
|
|
||||||
Config: test.ProviderConfig + `
|
|
||||||
resource "proxmox_virtual_environment_network_linux_bridge" "test" {
|
|
||||||
node_name = "pve"
|
|
||||||
name = "vmbr98"
|
|
||||||
address = "3.3.3.4/24"
|
|
||||||
comment = "created by terraform 2"
|
|
||||||
vlan_aware = true
|
|
||||||
autostart = true
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
Check: resource.ComposeAggregateTestCheckFunc(
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "name", "vmbr98"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "address", "3.3.3.4/24"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "comment", "created by terraform 2"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "vlan_aware", "true"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "autostart", "true"),
|
|
||||||
resource.TestCheckResourceAttrSet(resourceName, "id"),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 network
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
|
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/internal/test"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestLinuxVLANResource(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
accProviders := test.AccMuxProviders(context.Background(), t)
|
|
||||||
|
|
||||||
resourceName := "proxmox_virtual_environment_network_linux_vlan.test"
|
|
||||||
|
|
||||||
resource.Test(t, resource.TestCase{
|
|
||||||
ProtoV6ProviderFactories: accProviders,
|
|
||||||
Steps: []resource.TestStep{
|
|
||||||
// Create and Read testing
|
|
||||||
{
|
|
||||||
Config: test.ProviderConfig + `
|
|
||||||
resource "proxmox_virtual_environment_network_linux_vlan" "test" {
|
|
||||||
node_name = "pve"
|
|
||||||
name = "eno0.33"
|
|
||||||
comment = "created by terraform"
|
|
||||||
mtu = 1499
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
Check: resource.ComposeAggregateTestCheckFunc(
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "name", "eno0.33"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "comment", "created by terraform"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "vlan", "33"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "interface", "eno0"),
|
|
||||||
resource.TestCheckResourceAttrSet(resourceName, "id"),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
// ImportState testing
|
|
||||||
{
|
|
||||||
ResourceName: resourceName,
|
|
||||||
ImportState: true,
|
|
||||||
ImportStateVerify: true,
|
|
||||||
},
|
|
||||||
// Update testing
|
|
||||||
{
|
|
||||||
Config: test.ProviderConfig + `
|
|
||||||
resource "proxmox_virtual_environment_network_linux_vlan" "test" {
|
|
||||||
node_name = "pve"
|
|
||||||
name = "eno0.33"
|
|
||||||
address = "1.1.1.1/24"
|
|
||||||
address6 = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"
|
|
||||||
comment = "updated by terraform"
|
|
||||||
mtu = null
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
Check: resource.ComposeAggregateTestCheckFunc(
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "name", "eno0.33"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "address", "1.1.1.1/24"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "address6", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329/64"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "comment", "updated by terraform"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "vlan", "33"),
|
|
||||||
resource.TestCheckResourceAttr(resourceName, "interface", "eno0"),
|
|
||||||
resource.TestCheckNoResourceAttr(resourceName, "mtu"),
|
|
||||||
resource.TestCheckResourceAttrSet(resourceName, "id"),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
4
main.go
4
main.go
@ -19,7 +19,7 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-mux/tf6muxserver"
|
"github.com/hashicorp/terraform-plugin-mux/tf6muxserver"
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
||||||
|
|
||||||
newProvider "github.com/bpg/terraform-provider-proxmox/internal/provider"
|
"github.com/bpg/terraform-provider-proxmox/fwprovider"
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmoxtf/provider"
|
"github.com/bpg/terraform-provider-proxmox/proxmoxtf/provider"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
providers := []func() tfprotov6.ProviderServer{
|
providers := []func() tfprotov6.ProviderServer{
|
||||||
providerserver.NewProtocol6(newProvider.New(version)()),
|
providerserver.NewProtocol6(fwprovider.New(version)()),
|
||||||
func() tfprotov6.ProviderServer {
|
func() tfprotov6.ProviderServer {
|
||||||
return upgradedSdkServer
|
return upgradedSdkServer
|
||||||
},
|
},
|
||||||
|
@ -12,6 +12,11 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/avast/retry-go/v4"
|
||||||
|
|
||||||
"github.com/bpg/terraform-provider-proxmox/proxmox/api"
|
"github.com/bpg/terraform-provider-proxmox/proxmox/api"
|
||||||
)
|
)
|
||||||
@ -20,6 +25,12 @@ const (
|
|||||||
networkReloadTimeoutSec = 5
|
networkReloadTimeoutSec = 5
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// reloadLock is used to prevent concurrent network reloads.
|
||||||
|
// global variable by design.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals
|
||||||
|
var reloadLock sync.Mutex
|
||||||
|
|
||||||
// ListNetworkInterfaces retrieves a list of network interfaces for a specific nodes.
|
// ListNetworkInterfaces retrieves a list of network interfaces for a specific nodes.
|
||||||
func (c *Client) ListNetworkInterfaces(ctx context.Context) ([]*NetworkInterfaceListResponseData, error) {
|
func (c *Client) ListNetworkInterfaces(ctx context.Context) ([]*NetworkInterfaceListResponseData, error) {
|
||||||
resBody := &NetworkInterfaceListResponseBody{}
|
resBody := &NetworkInterfaceListResponseBody{}
|
||||||
@ -55,22 +66,34 @@ func (c *Client) CreateNetworkInterface(ctx context.Context, d *NetworkInterface
|
|||||||
|
|
||||||
// ReloadNetworkConfiguration reloads the network configuration for a specific node.
|
// ReloadNetworkConfiguration reloads the network configuration for a specific node.
|
||||||
func (c *Client) ReloadNetworkConfiguration(ctx context.Context) error {
|
func (c *Client) ReloadNetworkConfiguration(ctx context.Context) error {
|
||||||
|
reloadLock.Lock()
|
||||||
|
defer reloadLock.Unlock()
|
||||||
|
|
||||||
resBody := &ReloadNetworkResponseBody{}
|
resBody := &ReloadNetworkResponseBody{}
|
||||||
|
|
||||||
err := c.DoRequest(ctx, http.MethodPut, c.ExpandPath("network"), nil, resBody)
|
err := retry.Do(
|
||||||
|
func() error {
|
||||||
|
err := c.DoRequest(ctx, http.MethodPut, c.ExpandPath("network"), nil, resBody)
|
||||||
|
if err != nil {
|
||||||
|
return err //nolint:wrapcheck
|
||||||
|
}
|
||||||
|
|
||||||
|
if resBody.Data == nil {
|
||||||
|
return api.ErrNoDataObjectInResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Tasks().WaitForTask(ctx, *resBody.Data, networkReloadTimeoutSec, 1) //nolint:wrapcheck
|
||||||
|
},
|
||||||
|
retry.Delay(1*time.Second),
|
||||||
|
retry.Attempts(3),
|
||||||
|
retry.RetryIf(func(err error) bool {
|
||||||
|
return strings.Contains(err.Error(), "exit code 89")
|
||||||
|
}),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to reload network configuration for node \"%s\": %w", c.NodeName, err)
|
return fmt.Errorf("failed to reload network configuration for node \"%s\": %w", c.NodeName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if resBody.Data == nil {
|
|
||||||
return api.ErrNoDataObjectInResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
err = c.Tasks().WaitForTask(ctx, *resBody.Data, networkReloadTimeoutSec, 1)
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ func (c *Client) CloneVM(ctx context.Context, retries int, d *CloneRequestBody,
|
|||||||
|
|
||||||
resBody := &MoveDiskResponseBody{}
|
resBody := &MoveDiskResponseBody{}
|
||||||
|
|
||||||
// just a guard in case someone sets retries to 0 unknowingly
|
// just a guard in case someone sets retries to zero unknowingly
|
||||||
if retries <= 0 {
|
if retries <= 0 {
|
||||||
retries = 1
|
retries = 1
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,8 @@ import (
|
|||||||
// VMID returns a schema validation function for a VM ID.
|
// VMID returns a schema validation function for a VM ID.
|
||||||
func VMID() schema.SchemaValidateDiagFunc {
|
func VMID() schema.SchemaValidateDiagFunc {
|
||||||
return validation.ToDiagFunc(func(i interface{}, k string) ([]string, []error) {
|
return validation.ToDiagFunc(func(i interface{}, k string) ([]string, []error) {
|
||||||
min := 100
|
minID := 100
|
||||||
max := 2147483647
|
maxID := 2147483647
|
||||||
|
|
||||||
var ws []string
|
var ws []string
|
||||||
var es []error
|
var es []error
|
||||||
@ -32,8 +32,8 @@ func VMID() schema.SchemaValidateDiagFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if v != -1 {
|
if v != -1 {
|
||||||
if v < min || v > max {
|
if v < minID || v > maxID {
|
||||||
es = append(es, fmt.Errorf("expected %s to be in the range (%d - %d), got %d", k, min, max, v))
|
es = append(es, fmt.Errorf("expected %s to be in the range (%d - %d), got %d", k, minID, maxID, v))
|
||||||
return ws, es
|
return ws, es
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,15 +31,14 @@ func Test_getCPUTypeValidator(t *testing.T) {
|
|||||||
tt := tt
|
tt := tt
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
require := require.New(t)
|
|
||||||
|
|
||||||
f := CPUType()
|
f := CPUType()
|
||||||
res := f(tt.value, nil)
|
res := f(tt.value, nil)
|
||||||
|
|
||||||
if tt.valid {
|
if tt.valid {
|
||||||
require.Empty(res, "validate: '%s'", tt.value)
|
require.Empty(t, res, "validate: '%s'", tt.value)
|
||||||
} else {
|
} else {
|
||||||
require.NotEmpty(res, "validate: '%s'", tt.value)
|
require.NotEmpty(t, res, "validate: '%s'", tt.value)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -3641,7 +3641,7 @@ func vmReadCustom(
|
|||||||
diags = append(diags, diag.FromErr(err)...)
|
diags = append(diags, diag.FromErr(err)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compare the IDE devices to the CDROM configurations stored in the state.
|
// Compare the IDE devices to the CD-ROM configurations stored in the state.
|
||||||
currentInterface := dvResourceVirtualEnvironmentVMCDROMInterface
|
currentInterface := dvResourceVirtualEnvironmentVMCDROMInterface
|
||||||
|
|
||||||
currentCDROM := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{})
|
currentCDROM := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{})
|
||||||
|
@ -460,18 +460,16 @@ func Test_parseImportIDWIthNodeName(t *testing.T) {
|
|||||||
tt := tt
|
tt := tt
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
require := require.New(t)
|
|
||||||
|
|
||||||
nodeName, id, err := parseImportIDWithNodeName(tt.value)
|
nodeName, id, err := parseImportIDWithNodeName(tt.value)
|
||||||
|
|
||||||
if !tt.valid {
|
if !tt.valid {
|
||||||
require.Error(err)
|
require.Error(t, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
require.Nil(err)
|
require.NoError(t, err)
|
||||||
require.Equal(tt.expectedNodeName, nodeName)
|
require.Equal(t, tt.expectedNodeName, nodeName)
|
||||||
require.Equal(tt.expectedID, id)
|
require.Equal(t, tt.expectedID, id)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,8 @@ import (
|
|||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MergeSchema merges the map[string]*schema.Schema from src into dst. Safety
|
// MergeSchema merges the map[string]*schema.Schema from src into dst.
|
||||||
// against conflicts is enforced by panicking.
|
// Panicking enforces safety against conflicts.
|
||||||
func MergeSchema(dst, src map[string]*schema.Schema) {
|
func MergeSchema(dst, src map[string]*schema.Schema) {
|
||||||
for k, v := range src {
|
for k, v := range src {
|
||||||
if _, ok := dst[k]; ok {
|
if _, ok := dst[k]; ok {
|
||||||
|
Loading…
Reference in New Issue
Block a user