Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Adding network CRUD support #24

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions proxmox/virtual_environment_network.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package proxmox

import (
"errors"
"fmt"
"net/url"
"sort"
)

// ListNodeNetworkDevices retrieves a list of network devices for a specific nodes.
func (c *VirtualEnvironmentClient) ListNodeNetworkDevices(nodeName string) ([]*VirtualEnvironmentNodeNetworkDeviceResponseData, error) {
resBody := &VirtualEnvironmentNodeNetworkDeviceListResponseBody{}
err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/network", url.PathEscape(nodeName)), nil, resBody)

if err != nil {
return nil, err
}

if resBody.Data == nil {
return nil, errors.New("The server did not include a data object in the response")
}

sort.Slice(resBody.Data, func(i, j int) bool {
return resBody.Data[i].Priority < resBody.Data[j].Priority
})

return resBody.Data, nil
}

// GetNetworkInterface retrieves the specified network device for a specific nodes.
func (c *VirtualEnvironmentClient) GetNetworkInterface(nodeName string, iface string) (*VirtualEnvironmentNodeNetworkDeviceResponseData, error) {
resBody := &VirtualEnvironmentNodeNetworkGetResponseBody{}
err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/network/%s", url.PathEscape(nodeName), iface), nil, resBody)

if err != nil {
return nil, err
}

if resBody.Data == nil {
return nil, errors.New("The server did not include a data object in the response")
}

return resBody.Data, nil
}

// CreateNetworkInterface create the specified network interface for a specific nodes.
func (c *VirtualEnvironmentClient) CreateNetworkInterface(nodeName string, d *VirtualEnvironmentNetworkInterfaceCreateRequestBody) error {
return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/network", nodeName), d, nil)
}

// UpdateNetworkInterface update the specified network interface for a specific nodes.
func (c *VirtualEnvironmentClient) UpdateNetworkInterface(nodeName string, iface string, d *VirtualEnvironmentNetworkInterfaceCreateRequestBody) error {
return c.DoRequest(hmPUT, fmt.Sprintf("nodes/%s/network/%s", nodeName, iface), d, nil)
}

// DeleteNetworkInterface delete the specified network interface for a specific nodes.
func (c *VirtualEnvironmentClient) DeleteNetworkInterface(nodeName string, iface string) error {
return c.DoRequest(hmDELETE, fmt.Sprintf("nodes/%s/network/%s", nodeName, iface), nil, nil)
}
63 changes: 63 additions & 0 deletions proxmox/virtual_environment_network_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package proxmox

type NetworkType string

// VirtualEnvironmentNodeNetworkDeviceListResponseBody contains the body from a node network device list response.
type VirtualEnvironmentNodeNetworkDeviceListResponseBody struct {
Data []*VirtualEnvironmentNodeNetworkDeviceResponseData `json:"data,omitempty"`
}

// VirtualEnvironmentNodeNetworkGetResponseBody contains the body from a node network interface response.
type VirtualEnvironmentNodeNetworkGetResponseBody struct {
Data *VirtualEnvironmentNodeNetworkDeviceResponseData `json:"data,omitempty"`
}

// VirtualEnvironmentNodeNetworkDeviceResponseData contains the data from a node network device list response.
type VirtualEnvironmentNodeNetworkDeviceResponseData struct {
Active *CustomBool `json:"active,omitempty"`
Address *string `json:"address,omitempty"`
Autostart *CustomBool `json:"autostart,omitempty"`
BridgeFD *string `json:"bridge_fd,omitempty"`
BridgePorts *string `json:"bridge_ports,omitempty"`
BridgeSTP *string `json:"bridge_stp,omitempty"`
CIDR *string `json:"cidr,omitempty"`
Exists *CustomBool `json:"exists,omitempty"`
Families *[]string `json:"families,omitempty"`
Gateway *string `json:"gateway,omitempty"`
Iface string `json:"iface"`
MethodIPv4 *string `json:"method,omitempty"`
MethodIPv6 *string `json:"method6,omitempty"`
Netmask *string `json:"netmask,omitempty"`
Priority int `json:"priority"`
Type string `json:"type"`
}

type VirtualEnvironmentNetworkInterfaceCreateRequestBody struct {
Iface string `json:"iface,omitempty" url:"iface,omitempty"`
Type string `json:"type" url:"type"`
Address *string `json:"address,omitempty" url:"address,omitempty"`
Address6 *string `json:"address6,omitempty" url:"address6,omitempty"`
Autostart *bool `json:"autostart,omitempty" url:"autostart,omitempty"`
BondPrimary *string `json:"bond-primary,omitempty" url:"bond-primary,omitempty"`
BondMode *string `json:"bond_mode,omitempty" url:"bond_mode,omitempty"`
BondXmitHashPolicy *string `json:"bond_xmit_hash_policy,omitempty" url:"bond_xmit_hash_policy,omitempty"`
BridgePorts *string `json:"bridge_ports,omitempty" url:"bridge_ports,omitempty"`
BridgeVlanAware *bool `json:"bridge_vlan_aware,omitempty" url:"bridge_vlan_aware,omitempty"`
Cidr *string `json:"cidr,omitempty" url:"cidr,omitempty"`
Cidr6 *string `json:"cidr6,omitempty" url:"cidr6,omitempty"`
Comments *string `json:"comments,omitempty" url:"comments,omitempty"`
Comments6 *string `json:"comments6,omitempty" url:"comments6,omitempty"`
Gateway *string `json:"gateway,omitempty" url:"gateway,omitempty"`
Gateway6 *string `json:"gateway6,omitempty" url:"gateway6,omitempty"`
Mtu *int `json:"mtu,omitempty" url:"mtu,omitempty"`
NetMask *string `json:"netmask,omitempty" url:"netmask,omitempty"`
NetMask6 *string `json:"netmask6,omitempty" url:"netmask6,omitempty"`
OvsBond *string `json:"ovs_bonds,omitempty" url:"ovs_bonds,omitempty"`
OvsBridge *string `json:"ovs_bridge,omitempty" url:"ovs_bridge,omitempty"`
OvsOptions *string `json:"ovs_options,omitempty" url:"ovs_options,omitempty"`
OvsPorts *string `json:"ovs_ports,omitempty" url:"ovs_ports,omitempty"`
OvsTags *int `json:"ovs_tag,omitempty" url:"ovs_tag,omitempty"`
OvsSlaves *string `json:"slaves,omitempty" url:"slaves,omitempty"`
VlanId *int `json:"vlan-id,omitempty" url:"vlan-id,omitempty"`
VlanRawDevice *string `json:"vlan-raw-device,omitempty" url:"vlan-raw-device,omitempty"`
}
18 changes: 0 additions & 18 deletions proxmox/virtual_environment_nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,25 +88,7 @@ func (c *VirtualEnvironmentClient) GetNodeTime(nodeName string) (*VirtualEnviron
return resBody.Data, nil
}

// ListNodeNetworkDevices retrieves a list of network devices for a specific nodes.
func (c *VirtualEnvironmentClient) ListNodeNetworkDevices(nodeName string) ([]*VirtualEnvironmentNodeNetworkDeviceListResponseData, error) {
resBody := &VirtualEnvironmentNodeNetworkDeviceListResponseBody{}
err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/network", url.PathEscape(nodeName)), nil, resBody)

if err != nil {
return nil, err
}

if resBody.Data == nil {
return nil, errors.New("The server did not include a data object in the response")
}

sort.Slice(resBody.Data, func(i, j int) bool {
return resBody.Data[i].Priority < resBody.Data[j].Priority
})

return resBody.Data, nil
}

// ListNodes retrieves a list of nodes.
func (c *VirtualEnvironmentClient) ListNodes() ([]*VirtualEnvironmentNodeListResponseData, error) {
Expand Down
25 changes: 0 additions & 25 deletions proxmox/virtual_environment_nodes_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,31 +47,6 @@ type VirtualEnvironmentNodeListResponseData struct {
Uptime *int `json:"uptime"`
}

// VirtualEnvironmentNodeNetworkDeviceListResponseBody contains the body from a node network device list response.
type VirtualEnvironmentNodeNetworkDeviceListResponseBody struct {
Data []*VirtualEnvironmentNodeNetworkDeviceListResponseData `json:"data,omitempty"`
}

// VirtualEnvironmentNodeNetworkDeviceListResponseData contains the data from a node network device list response.
type VirtualEnvironmentNodeNetworkDeviceListResponseData struct {
Active *CustomBool `json:"active,omitempty"`
Address *string `json:"address,omitempty"`
Autostart *CustomBool `json:"autostart,omitempty"`
BridgeFD *string `json:"bridge_fd,omitempty"`
BridgePorts *string `json:"bridge_ports,omitempty"`
BridgeSTP *string `json:"bridge_stp,omitempty"`
CIDR *string `json:"cidr,omitempty"`
Exists *CustomBool `json:"exists,omitempty"`
Families *[]string `json:"families,omitempty"`
Gateway *string `json:"gateway,omitempty"`
Iface string `json:"iface"`
MethodIPv4 *string `json:"method,omitempty"`
MethodIPv6 *string `json:"method6,omitempty"`
Netmask *string `json:"netmask,omitempty"`
Priority int `json:"priority"`
Type string `json:"type"`
}

// VirtualEnvironmentNodeUpdateTimeRequestBody contains the body for a node time update request.
type VirtualEnvironmentNodeUpdateTimeRequestBody struct {
TimeZone string `json:"timezone" url:"timezone"`
Expand Down
166 changes: 166 additions & 0 deletions proxmoxtf/data_source_virtual_environment_network.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
/* 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 proxmoxtf

import (
"fmt"
"github.com/hashicorp/terraform/helper/schema"
)

const (
mkDataSourceVirtualEnvironmentNetworkNodeName = "node_name"
mkDataSourceVirtualEnvironmentNetworkActive = "active"
mkDataSourceVirtualEnvironmentNetworkAddress = "address"
mkDataSourceVirtualEnvironmentNetworkAutostart = "autostart"
mkDataSourceVirtualEnvironmentNetworkBridgeFD = "bridge_fd"
mkDataSourceVirtualEnvironmentNetworkBridgePorts = "bridge_ports"
mkDataSourceVirtualEnvironmentNetworkBridgeSTP = "bridge_stp"
mkDataSourceVirtualEnvironmentNetworkCIDR = "cidr"
mkDataSourceVirtualEnvironmentNetworkExists = "exists"
mkDataSourceVirtualEnvironmentNetworkFamilies = "families"
mkDataSourceVirtualEnvironmentNetworkGateway = "gateway"
mkDataSourceVirtualEnvironmentNetworkIface = "iface"
mkDataSourceVirtualEnvironmentNetworkMethodIPv4 = "method_ipv4"
mkDataSourceVirtualEnvironmentNetworkMethodIPv6 = "method_ipv6"
mkDataSourceVirtualEnvironmentNetworkNetmask = "netmask"
mkDataSourceVirtualEnvironmentNetworkPriority = "priority"
mkDataSourceVirtualEnvironmentNetworkType = "type"
)

func dataSourceVirtualEnvironmentNetwork() *schema.Resource {
return &schema.Resource{
Schema: map[string]*schema.Schema{
mkDataSourceVirtualEnvironmentNetworkNodeName: {
Type: schema.TypeString,
Description: "The network active status",
Required: true,
},
mkDataSourceVirtualEnvironmentNetworkType: {
Type: schema.TypeString,
Description: "The network type",
Optional: true,
},
mkDataSourceVirtualEnvironmentNetworkIface: {
Type: schema.TypeString,
Description: "The network interface",
Optional: true,
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkActive: {
Type: schema.TypeBool,
Description: "The network active status",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkAddress: {
Type: schema.TypeString,
Description: "The network IP address",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkCIDR: {
Type: schema.TypeString,
Description: "The network CIDR",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkNetmask:{
Type: schema.TypeString,
Description: "The network netmask",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkAutostart: {
Type: schema.TypeBool,
Description: "The network autostart status",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkBridgeFD:{
Type: schema.TypeInt,
Description: "The network bridge forwarding delay",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkBridgePorts:{
Type: schema.TypeString,
Description: "The network bridge ports",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkBridgeSTP:{
Type: schema.TypeString,
Description: "The network bridge spanning tree protocol status",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkPriority:{
Type: schema.TypeInt,
Description: "The network priority",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkMethodIPv4:{
Type: schema.TypeString,
Description: "The network method for ipv4",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkMethodIPv6:{
Type: schema.TypeString,
Description: "The network method for ipv6",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkExists:{
Type: schema.TypeBool,
Description: "The network existed prior the request",
Computed: true,
},
mkDataSourceVirtualEnvironmentNetworkFamilies :{
Type: schema.TypeList,
Description: "The network families",
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
mkDataSourceVirtualEnvironmentNetworkGateway:{
Type: schema.TypeString,
Description: "The network gateway",
Computed: true,
},
},
Read: dataSourceVirtualEnvironmentNetworkRead,
}
}

func dataSourceVirtualEnvironmentNetworkRead(d *schema.ResourceData, m interface{}) error {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()

if err != nil {
return err
}

nodeName := d.Get(mkDataSourceVirtualEnvironmentNetworkNodeName).(string)
iface := d.Get(mkDataSourceVirtualEnvironmentNetworkIface).(string)

network, err := veClient.GetNetworkInterface(nodeName,iface)

if err != nil {
return err
}
d.SetId(fmt.Sprintf("%s_network_%s", nodeName,network.Iface))

d.Set(mkDataSourceVirtualEnvironmentNetworkType,network.Type)
d.Set(mkResourceVirtualEnvironmentContainerNetworkInterface,network.Iface)
d.Set(mkDataSourceVirtualEnvironmentNetworkActive,network.Active)
d.Set(mkDataSourceVirtualEnvironmentNetworkAddress,network.Address)
d.Set(mkDataSourceVirtualEnvironmentNetworkCIDR,network.CIDR)
d.Set(mkDataSourceVirtualEnvironmentNetworkNetmask,network.Netmask)
d.Set(mkDataSourceVirtualEnvironmentNetworkAutostart,network.Autostart)
d.Set(mkDataSourceVirtualEnvironmentNetworkBridgeFD,network.BridgeFD)
d.Set(mkDataSourceVirtualEnvironmentNetworkBridgePorts,network.BridgePorts)
d.Set(mkDataSourceVirtualEnvironmentNetworkBridgeSTP,network.BridgeSTP)
d.Set(mkDataSourceVirtualEnvironmentNetworkPriority,network.Priority)
d.Set(mkDataSourceVirtualEnvironmentNetworkMethodIPv4,network.MethodIPv4)
d.Set(mkDataSourceVirtualEnvironmentNetworkMethodIPv6,network.MethodIPv6)

d.Set(mkDataSourceVirtualEnvironmentNetworkExists,network.Exists)
d.Set(mkDataSourceVirtualEnvironmentNetworkFamilies,network.Families)
d.Set(mkDataSourceVirtualEnvironmentNetworkGateway,network.Gateway)


return nil
}

2 changes: 2 additions & 0 deletions proxmoxtf/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ func Provider() *schema.Provider {
"proxmox_virtual_environment_user": dataSourceVirtualEnvironmentUser(),
"proxmox_virtual_environment_users": dataSourceVirtualEnvironmentUsers(),
"proxmox_virtual_environment_version": dataSourceVirtualEnvironmentVersion(),
"proxmox_virtual_environment_network": dataSourceVirtualEnvironmentNetwork(),
},
ResourcesMap: map[string]*schema.Resource{
"proxmox_virtual_environment_certificate": resourceVirtualEnvironmentCertificate(),
Expand All @@ -63,6 +64,7 @@ func Provider() *schema.Provider {
"proxmox_virtual_environment_time": resourceVirtualEnvironmentTime(),
"proxmox_virtual_environment_user": resourceVirtualEnvironmentUser(),
"proxmox_virtual_environment_vm": resourceVirtualEnvironmentVM(),
"proxmox_virtual_environment_network": resourceVirtualEnvironmentNetwork(),
},
Schema: map[string]*schema.Schema{
mkProviderVirtualEnvironment: {
Expand Down
1 change: 0 additions & 1 deletion proxmoxtf/resource_virtual_environment_dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package proxmoxtf

import (
"fmt"

"github.com/danitso/terraform-provider-proxmox/proxmox"
"github.com/hashicorp/terraform/helper/schema"
)
Expand Down
Loading