mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-08-25 04:45:46 +00:00
179 lines
6.5 KiB
Go
179 lines
6.5 KiB
Go
/*
|
|
* 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 zone
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hashicorp/terraform-plugin-framework/diag"
|
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
|
|
|
"github.com/bpg/terraform-provider-proxmox/fwprovider/types/stringset"
|
|
"github.com/bpg/terraform-provider-proxmox/proxmox/cluster/sdn/zones"
|
|
|
|
proxmoxtypes "github.com/bpg/terraform-provider-proxmox/proxmox/types"
|
|
)
|
|
|
|
type baseModel struct {
|
|
ID types.String `tfsdk:"id"`
|
|
IPAM types.String `tfsdk:"ipam"`
|
|
DNS types.String `tfsdk:"dns"`
|
|
ReverseDNS types.String `tfsdk:"reverse_dns"`
|
|
DNSZone types.String `tfsdk:"dns_zone"`
|
|
Nodes stringset.Value `tfsdk:"nodes"`
|
|
MTU types.Int64 `tfsdk:"mtu"`
|
|
// // VLAN.
|
|
// Bridge types.String `tfsdk:"bridge"`
|
|
// // QinQ.
|
|
// ServiceVLAN types.Int64 `tfsdk:"service_vlan"`
|
|
// ServiceVLANProtocol types.String `tfsdk:"service_vlan_protocol"`
|
|
// // VXLAN.
|
|
// Peers stringset.Value `tfsdk:"peers"`
|
|
// // EVPN.
|
|
// Controller types.String `tfsdk:"controller"`
|
|
// ExitNodes stringset.Value `tfsdk:"exit_nodes"`
|
|
// PrimaryExitNode types.String `tfsdk:"primary_exit_node"`
|
|
// RouteTargetImport types.String `tfsdk:"rt_import"`
|
|
// VRFVXLANID types.Int64 `tfsdk:"vrf_vxlan"`
|
|
// ExitNodesLocalRouting types.Bool `tfsdk:"exit_nodes_local_routing"`
|
|
// AdvertiseSubnets types.Bool `tfsdk:"advertise_subnets"`
|
|
// DisableARPNDSuppression types.Bool `tfsdk:"disable_arp_nd_suppression"`
|
|
}
|
|
|
|
func (m *baseModel) importFromAPI(name string, data *zones.ZoneData, diags *diag.Diagnostics) {
|
|
m.ID = types.StringValue(name)
|
|
|
|
m.DNS = types.StringPointerValue(data.DNS)
|
|
m.DNSZone = types.StringPointerValue(data.DNSZone)
|
|
m.IPAM = types.StringPointerValue(data.IPAM)
|
|
m.MTU = types.Int64PointerValue(data.MTU)
|
|
m.Nodes = stringset.NewValueString(data.Nodes, diags, stringset.WithSeparator(","))
|
|
m.ReverseDNS = types.StringPointerValue(data.ReverseDNS)
|
|
}
|
|
|
|
func (m *baseModel) toAPIRequestBody(ctx context.Context, diags *diag.Diagnostics) *zones.ZoneRequestData {
|
|
data := &zones.ZoneRequestData{}
|
|
|
|
data.ID = m.ID.ValueString()
|
|
|
|
data.IPAM = m.IPAM.ValueStringPointer()
|
|
data.DNS = m.DNS.ValueStringPointer()
|
|
data.ReverseDNS = m.ReverseDNS.ValueStringPointer()
|
|
data.DNSZone = m.DNSZone.ValueStringPointer()
|
|
data.Nodes = m.Nodes.ValueStringPointer(ctx, diags, stringset.WithSeparator(","))
|
|
data.MTU = m.MTU.ValueInt64Pointer()
|
|
|
|
return data
|
|
}
|
|
|
|
type simpleModel struct {
|
|
baseModel
|
|
}
|
|
|
|
type vlanModel struct {
|
|
baseModel
|
|
|
|
Bridge types.String `tfsdk:"bridge"`
|
|
}
|
|
|
|
func (m *vlanModel) importFromAPI(name string, data *zones.ZoneData, diags *diag.Diagnostics) {
|
|
m.baseModel.importFromAPI(name, data, diags)
|
|
|
|
m.Bridge = types.StringPointerValue(data.Bridge)
|
|
}
|
|
|
|
func (m *vlanModel) toAPIRequestBody(ctx context.Context, diags *diag.Diagnostics) *zones.ZoneRequestData {
|
|
data := m.baseModel.toAPIRequestBody(ctx, diags)
|
|
|
|
data.Bridge = m.Bridge.ValueStringPointer()
|
|
|
|
return data
|
|
}
|
|
|
|
type qinqModel struct {
|
|
vlanModel
|
|
|
|
ServiceVLAN types.Int64 `tfsdk:"service_vlan"`
|
|
ServiceVLANProtocol types.String `tfsdk:"service_vlan_protocol"`
|
|
}
|
|
|
|
func (m *qinqModel) importFromAPI(name string, data *zones.ZoneData, diags *diag.Diagnostics) {
|
|
m.vlanModel.importFromAPI(name, data, diags)
|
|
|
|
m.ServiceVLAN = types.Int64PointerValue(data.ServiceVLAN)
|
|
m.ServiceVLANProtocol = types.StringPointerValue(data.ServiceVLANProtocol)
|
|
}
|
|
|
|
func (m *qinqModel) toAPIRequestBody(ctx context.Context, diags *diag.Diagnostics) *zones.ZoneRequestData {
|
|
data := m.vlanModel.toAPIRequestBody(ctx, diags)
|
|
|
|
data.ServiceVLAN = m.ServiceVLAN.ValueInt64Pointer()
|
|
data.ServiceVLANProtocol = m.ServiceVLANProtocol.ValueStringPointer()
|
|
|
|
return data
|
|
}
|
|
|
|
type vxlanModel struct {
|
|
baseModel
|
|
|
|
Peers stringset.Value `tfsdk:"peers"`
|
|
}
|
|
|
|
func (m *vxlanModel) importFromAPI(name string, data *zones.ZoneData, diags *diag.Diagnostics) {
|
|
m.baseModel.importFromAPI(name, data, diags)
|
|
m.Peers = stringset.NewValueString(data.Peers, diags, stringset.WithSeparator(","))
|
|
}
|
|
|
|
func (m *vxlanModel) toAPIRequestBody(ctx context.Context, diags *diag.Diagnostics) *zones.ZoneRequestData {
|
|
data := m.baseModel.toAPIRequestBody(ctx, diags)
|
|
|
|
data.Peers = m.Peers.ValueStringPointer(ctx, diags, stringset.WithSeparator(","))
|
|
|
|
return data
|
|
}
|
|
|
|
type evpnModel struct {
|
|
baseModel
|
|
|
|
AdvertiseSubnets types.Bool `tfsdk:"advertise_subnets"`
|
|
Controller types.String `tfsdk:"controller"`
|
|
DisableARPNDSuppression types.Bool `tfsdk:"disable_arp_nd_suppression"`
|
|
ExitNodes stringset.Value `tfsdk:"exit_nodes"`
|
|
ExitNodesLocalRouting types.Bool `tfsdk:"exit_nodes_local_routing"`
|
|
PrimaryExitNode types.String `tfsdk:"primary_exit_node"`
|
|
RouteTargetImport types.String `tfsdk:"rt_import"`
|
|
VRFVXLANID types.Int64 `tfsdk:"vrf_vxlan"`
|
|
}
|
|
|
|
func (m *evpnModel) importFromAPI(name string, data *zones.ZoneData, diags *diag.Diagnostics) {
|
|
m.baseModel.importFromAPI(name, data, diags)
|
|
|
|
m.AdvertiseSubnets = types.BoolPointerValue(data.AdvertiseSubnets.PointerBool())
|
|
m.Controller = types.StringPointerValue(data.Controller)
|
|
m.DisableARPNDSuppression = types.BoolPointerValue(data.DisableARPNDSuppression.PointerBool())
|
|
m.ExitNodes = stringset.NewValueString(data.ExitNodes, diags, stringset.WithSeparator(","))
|
|
m.ExitNodesLocalRouting = types.BoolPointerValue(data.ExitNodesLocalRouting.PointerBool())
|
|
m.PrimaryExitNode = types.StringPointerValue(data.ExitNodesPrimary)
|
|
m.RouteTargetImport = types.StringPointerValue(data.RouteTargetImport)
|
|
m.VRFVXLANID = types.Int64PointerValue(data.VRFVXLANID)
|
|
}
|
|
|
|
func (m *evpnModel) toAPIRequestBody(ctx context.Context, diags *diag.Diagnostics) *zones.ZoneRequestData {
|
|
data := m.baseModel.toAPIRequestBody(ctx, diags)
|
|
|
|
data.AdvertiseSubnets = proxmoxtypes.CustomBoolPtr(m.AdvertiseSubnets.ValueBoolPointer())
|
|
data.Controller = m.Controller.ValueStringPointer()
|
|
data.DisableARPNDSuppression = proxmoxtypes.CustomBoolPtr(m.DisableARPNDSuppression.ValueBoolPointer())
|
|
data.ExitNodes = m.ExitNodes.ValueStringPointer(ctx, diags, stringset.WithSeparator(","))
|
|
data.ExitNodesLocalRouting = proxmoxtypes.CustomBoolPtr(m.ExitNodesLocalRouting.ValueBoolPointer())
|
|
data.ExitNodesPrimary = m.PrimaryExitNode.ValueStringPointer()
|
|
data.RouteTargetImport = m.RouteTargetImport.ValueStringPointer()
|
|
data.VRFVXLANID = m.VRFVXLANID.ValueInt64Pointer()
|
|
|
|
return data
|
|
}
|