0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-07-06 22:14:01 +00:00
terraform-provider-proxmox/fwprovider/cluster/sdn/datasource_sdn_subnets.go
MacherelR 48bb57f0c7 fix(sdn): resolve linter warnings and apply gofumpt formatting
Signed-off-by: MacherelR <64424331+MacherelR@users.noreply.github.com>
2025-06-24 08:32:48 +02:00

153 lines
3.9 KiB
Go

package sdn
import (
"context"
"errors"
"fmt"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
"github.com/bpg/terraform-provider-proxmox/fwprovider/config"
"github.com/bpg/terraform-provider-proxmox/proxmox/api"
"github.com/bpg/terraform-provider-proxmox/proxmox/cluster/sdn/subnets"
)
var _ datasource.DataSource = &sdnSubnetDataSource{}
var _ datasource.DataSourceWithConfigure = &sdnSubnetDataSource{}
type sdnSubnetDataSource struct {
client *subnets.Client
}
func NewSDNSubnetDataSource() datasource.DataSource {
return &sdnSubnetDataSource{}
}
func (d *sdnSubnetDataSource) Metadata(
ctx context.Context,
req datasource.MetadataRequest,
resp *datasource.MetadataResponse,
) {
resp.TypeName = req.ProviderTypeName + "_sdn_subnet"
}
func (d *sdnSubnetDataSource) Configure(
ctx context.Context,
req datasource.ConfigureRequest,
resp *datasource.ConfigureResponse,
) {
if req.ProviderData == nil {
return
}
cfg, ok := req.ProviderData.(config.DataSource)
if !ok {
resp.Diagnostics.AddError(
"Unexpected Provider Configuration",
fmt.Sprintf("Expected config.DataSource, got: %T", req.ProviderData),
)
return
}
d.client = cfg.Client.Cluster().SDNSubnets()
}
func (d *sdnSubnetDataSource) Schema(
ctx context.Context,
req datasource.SchemaRequest,
resp *datasource.SchemaResponse,
) {
resp.Schema = schema.Schema{
Description: "Retrieve details about a specific SDN Subnet in Proxmox VE.",
Attributes: map[string]schema.Attribute{
"id": schema.StringAttribute{
Computed: true,
Description: "The full ID in the format 'vnet-id/subnet-id'.",
},
"subnet": schema.StringAttribute{
Required: true,
},
"canonical_name": schema.StringAttribute{
Computed: true,
},
"type": schema.StringAttribute{
Computed: true,
},
"vnet": schema.StringAttribute{
Required: true,
Description: "The VNet this subnet belongs to.",
},
"dhcp_dns_server": schema.StringAttribute{
Computed: true,
Description: "The DNS server used for DHCP.",
},
"dhcp_range": schema.ListNestedAttribute{
Optional: false,
Computed: true,
Description: "List of DHCP ranges (start and end IPs).",
NestedObject: schema.NestedAttributeObject{
Attributes: map[string]schema.Attribute{
"start_address": schema.StringAttribute{
Computed: true,
Description: "Start of the DHCP range.",
},
"end_address": schema.StringAttribute{
Computed: true,
Description: "End of the DHCP range.",
},
},
},
},
"dnszoneprefix": schema.StringAttribute{
Computed: true,
Description: "Prefix used for DNS zone delegation.",
},
"gateway": schema.StringAttribute{
Computed: true,
Description: "The gateway address for the subnet.",
},
"snat": schema.BoolAttribute{
Computed: true,
Description: "Whether SNAT is enabled for the subnet.",
},
},
}
}
func (d *sdnSubnetDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
var config sdnSubnetModel
resp.Diagnostics.Append(req.Config.Get(ctx, &config)...)
if resp.Diagnostics.HasError() {
return
}
subnet, err := d.client.GetSubnet(ctx, config.Vnet.ValueString(), config.Subnet.ValueString())
if err != nil {
if errors.Is(err, api.ErrResourceDoesNotExist) {
resp.Diagnostics.AddError("Subnet not found", err.Error())
return
}
resp.Diagnostics.AddError("Failed to retrieve subnet", err.Error())
return
}
// Set the state.
state := &sdnSubnetModel{}
state.Subnet = config.Subnet
state.Vnet = config.Vnet
state.importFromAPI(config.Subnet.ValueString(), subnet)
// Set canonical name and ID (both = user-supplied subnet).
state.ID = config.Subnet
state.CanonicalName = config.Subnet
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
}