Files
terraform-provider-unifi/provider/resource_network.go
2019-12-28 19:49:09 -05:00

160 lines
3.6 KiB
Go

package provider
import (
"fmt"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/paultyng/terraform-provider-unifi/unifi"
)
func resourceNetwork() *schema.Resource {
return &schema.Resource{
Create: resourceNetworkCreate,
Read: resourceNetworkRead,
Update: resourceNetworkUpdate,
Delete: resourceNetworkDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"purpose": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{"corporate", "guest", "vlan-only"}, false),
},
"vlan_id": {
Type: schema.TypeInt,
Optional: true,
Default: 1,
},
"subnet": {
Type: schema.TypeString,
Optional: true,
},
"network_group": {
Type: schema.TypeString,
Optional: true,
Default: "LAN",
},
"dhcp_start": {
Type: schema.TypeString,
Optional: true,
},
"dhcp_stop": {
Type: schema.TypeString,
Optional: true,
},
"dhcp_enabled": {
Type: schema.TypeBool,
Optional: true,
},
"dhcp_lease": {
Type: schema.TypeInt,
Optional: true,
Default: 86400,
},
},
}
}
func resourceNetworkCreate(d *schema.ResourceData, meta interface{}) error {
c := meta.(*client)
vlan := d.Get("vlan_id").(int)
req := &unifi.Network{
Name: d.Get("name").(string),
Purpose: d.Get("purpose").(string),
VLAN: fmt.Sprintf("%d", d.Get("vlan_id").(int)),
IPSubnet: d.Get("subnet").(string),
NetworkGroup: d.Get("network_group").(string),
DHCPDStart: d.Get("dhcp_start").(string),
DHCPDStop: d.Get("dhcp_stop").(string),
DHCPDEnabled: d.Get("dhcp_enabled").(bool),
DHCPDLeaseTime: d.Get("dhcp_lease").(int),
VLANEnabled: vlan != 0,
Enabled: true,
IPV6InterfaceType: "none",
// IPV6InterfaceType string `json:"ipv6_interface_type"` // "none"
// IPV6PDStart string `json:"ipv6_pd_start"` // "::2"
// IPV6PDStop string `json:"ipv6_pd_stop"` // "::7d1"
}
resp, err := c.c.CreateNetwork(c.site, req)
if err != nil {
return err
}
d.SetId(resp.ID)
return resourceNetworkSetResourceData(resp, d)
}
func resourceNetworkSetResourceData(resp *unifi.Network, d *schema.ResourceData) error {
var err error
vlan := 0
if resp.VLANEnabled {
vlan, err = strconv.Atoi(resp.VLAN)
if err != nil {
return err
}
}
d.Set("name", resp.Name)
d.Set("purpose", resp.Purpose)
d.Set("vlan_id", vlan)
d.Set("subnet", resp.IPSubnet)
d.Set("network_group", resp.NetworkGroup)
d.Set("dhcp_start", resp.DHCPDStart)
d.Set("dhcp_stop", resp.DHCPDStop)
d.Set("dhcp_enabled", resp.DHCPDEnabled)
d.Set("dhcp_lease", resp.DHCPDLeaseTime)
return nil
}
func resourceNetworkRead(d *schema.ResourceData, meta interface{}) error {
c := meta.(*client)
id := d.Id()
resp, err := c.c.GetNetwork(c.site, id)
if _, ok := err.(*unifi.NotFoundError); ok {
d.SetId("")
return nil
}
if err != nil {
return err
}
return resourceNetworkSetResourceData(resp, d)
}
func resourceNetworkUpdate(d *schema.ResourceData, meta interface{}) error {
panic("not implemented")
}
func resourceNetworkDelete(d *schema.ResourceData, meta interface{}) error {
c := meta.(*client)
name := d.Get("name").(string)
id := d.Id()
err := c.c.DeleteNetwork(c.site, id, name)
if _, ok := err.(*unifi.NotFoundError); ok {
return nil
}
return err
}