Add update support to networks
This commit is contained in:
@@ -113,5 +113,3 @@ resource "unifi_wlan" "test" {
|
||||
## TODO
|
||||
|
||||
* [ ] automatically fixup subnet cidrs from .0 to .1?
|
||||
* [ ] update support for wlan
|
||||
* [ ] update support for network
|
||||
|
||||
@@ -46,6 +46,10 @@ func (c *lazyClient) GetNetwork(site, id string) (*unifi.Network, error) {
|
||||
c.init()
|
||||
return c.inner.GetNetwork(site, id)
|
||||
}
|
||||
func (c *lazyClient) UpdateNetwork(site string, d *unifi.Network) (*unifi.Network, error) {
|
||||
c.init()
|
||||
return c.inner.UpdateNetwork(site, d)
|
||||
}
|
||||
func (c *lazyClient) DeleteWLAN(site, id string) error {
|
||||
c.init()
|
||||
return c.inner.DeleteWLAN(site, id)
|
||||
|
||||
@@ -85,6 +85,7 @@ type unifiClient interface {
|
||||
DeleteNetwork(site, id, name string) error
|
||||
CreateNetwork(site string, d *unifi.Network) (*unifi.Network, error)
|
||||
GetNetwork(site, id string) (*unifi.Network, error)
|
||||
UpdateNetwork(site string, d *unifi.Network) (*unifi.Network, error)
|
||||
|
||||
DeleteWLAN(site, id string) error
|
||||
CreateWLAN(site string, d *unifi.WLAN) (*unifi.WLAN, error)
|
||||
|
||||
@@ -7,15 +7,34 @@ import (
|
||||
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||
|
||||
"github.com/paultyng/terraform-provider-unifi/unifi"
|
||||
)
|
||||
|
||||
var providers map[string]terraform.ResourceProvider
|
||||
var testClient *unifi.Client
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
if os.Getenv("TF_ACC") == "" {
|
||||
// short circuit non acceptance test runs
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
providers = map[string]terraform.ResourceProvider{
|
||||
"unifi": Provider(),
|
||||
}
|
||||
|
||||
user := os.Getenv("UNIFI_USERNAME")
|
||||
pass := os.Getenv("UNIFI_PASSWORD")
|
||||
baseURL := os.Getenv("UNIFI_API")
|
||||
|
||||
testClient := &unifi.Client{}
|
||||
testClient.SetBaseURL(baseURL)
|
||||
err := testClient.Login(user, pass)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
|
||||
@@ -68,9 +68,25 @@ func resourceNetwork() *schema.Resource {
|
||||
func resourceNetworkCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
c := meta.(*client)
|
||||
|
||||
req, err := resourceNetworkGetResourceData(d)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := c.c.CreateNetwork(c.site, req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
d.SetId(resp.ID)
|
||||
|
||||
return resourceNetworkSetResourceData(resp, d)
|
||||
}
|
||||
|
||||
func resourceNetworkGetResourceData(d *schema.ResourceData) (*unifi.Network, error) {
|
||||
vlan := d.Get("vlan_id").(int)
|
||||
|
||||
req := &unifi.Network{
|
||||
return &unifi.Network{
|
||||
Name: d.Get("name").(string),
|
||||
Purpose: d.Get("purpose").(string),
|
||||
VLAN: fmt.Sprintf("%d", d.Get("vlan_id").(int)),
|
||||
@@ -88,16 +104,7 @@ func resourceNetworkCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
// 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)
|
||||
}, nil
|
||||
}
|
||||
|
||||
func resourceNetworkSetResourceData(resp *unifi.Network, d *schema.ResourceData) error {
|
||||
@@ -146,7 +153,22 @@ func resourceNetworkRead(d *schema.ResourceData, meta interface{}) error {
|
||||
}
|
||||
|
||||
func resourceNetworkUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
panic("not implemented")
|
||||
c := meta.(*client)
|
||||
|
||||
req, err := resourceNetworkGetResourceData(d)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
req.ID = d.Id()
|
||||
req.SiteID = c.site
|
||||
|
||||
resp, err := c.c.UpdateNetwork(c.site, req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return resourceNetworkSetResourceData(resp, d)
|
||||
}
|
||||
|
||||
func resourceNetworkDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
package provider
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||
|
||||
"github.com/paultyng/terraform-provider-unifi/unifi"
|
||||
)
|
||||
|
||||
func TestAccNetwork_basic(t *testing.T) {
|
||||
@@ -13,9 +17,20 @@ func TestAccNetwork_basic(t *testing.T) {
|
||||
// TODO: CheckDestroy: ,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
Config: testAccNetworkConfig,
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
// testCheckNetworkExists(t, "name"),
|
||||
Config: testAccNetworkConfig("10.0.202.1/24", 202),
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
// testCheckNetworkExists(t, "name"),
|
||||
resource.TestCheckResourceAttr("unifi_network.test", "subnet", "10.0.202.1/24"),
|
||||
resource.TestCheckResourceAttr("unifi_network.test", "vlan_id", "202"),
|
||||
),
|
||||
},
|
||||
importStep("unifi_network.test"),
|
||||
{
|
||||
Config: testAccNetworkConfig("10.0.203.1/24", 203),
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
testCheckNetworkExists(t, "tfacc", nil),
|
||||
resource.TestCheckResourceAttr("unifi_network.test", "subnet", "10.0.203.1/24"),
|
||||
resource.TestCheckResourceAttr("unifi_network.test", "vlan_id", "203"),
|
||||
),
|
||||
},
|
||||
importStep("unifi_network.test"),
|
||||
@@ -23,9 +38,30 @@ func TestAccNetwork_basic(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
const testAccNetworkConfig = `
|
||||
func testCheckNetworkExists(t *testing.T, name string, network *unifi.Network) resource.TestCheckFunc {
|
||||
return func(s *terraform.State) error {
|
||||
networks, err := testClient.ListNetwork("default")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, net := range networks {
|
||||
if net.Name == name {
|
||||
if network != nil {
|
||||
*network = net
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("unable to find network %q", name)
|
||||
}
|
||||
}
|
||||
|
||||
func testAccNetworkConfig(subnet string, vlan int) string {
|
||||
return fmt.Sprintf(`
|
||||
variable "subnet" {
|
||||
default = "10.0.202.1/24"
|
||||
default = "%s"
|
||||
}
|
||||
|
||||
resource "unifi_network" "test" {
|
||||
@@ -33,9 +69,10 @@ resource "unifi_network" "test" {
|
||||
purpose = "corporate"
|
||||
|
||||
subnet = var.subnet
|
||||
vlan_id = 202
|
||||
vlan_id = %d
|
||||
dhcp_start = cidrhost(var.subnet, 6)
|
||||
dhcp_stop = cidrhost(var.subnet, 254)
|
||||
dhcp_enabled = true
|
||||
}
|
||||
`
|
||||
`, subnet, vlan)
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package provider
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||
|
||||
"github.com/paultyng/terraform-provider-unifi/unifi"
|
||||
)
|
||||
|
||||
|
||||
@@ -5,7 +5,9 @@ import (
|
||||
)
|
||||
|
||||
type Network struct {
|
||||
ID string `json:"_id,omitempty"`
|
||||
ID string `json:"_id,omitempty"`
|
||||
SiteID string `json:"site_id,omitempty"`
|
||||
Name string `json:"name"`
|
||||
|
||||
// Hidden bool `json:"attr_hidden,omitempty"`
|
||||
// HiddenID string `json:"attr_hidden_id,omitempty"`
|
||||
@@ -14,7 +16,6 @@ type Network struct {
|
||||
|
||||
Purpose string `json:"purpose"` // "corporate"
|
||||
NetworkGroup string `json:"networkgroup"` // "LAN"
|
||||
Name string `json:"name"`
|
||||
VLAN string `json:"vlan"`
|
||||
VLANEnabled bool `json:"vlan_enabled"`
|
||||
IPSubnet string `json:"ip_subnet"`
|
||||
@@ -101,3 +102,23 @@ func (c *Client) CreateNetwork(site string, d *Network) (*Network, error) {
|
||||
|
||||
return &new, nil
|
||||
}
|
||||
|
||||
func (c *Client) UpdateNetwork(site string, d *Network) (*Network, error) {
|
||||
var respBody struct {
|
||||
Meta meta `json:"meta"`
|
||||
Data []Network `json:"data"`
|
||||
}
|
||||
|
||||
err := c.do("PUT", fmt.Sprintf("s/%s/rest/networkconf/%s", site, d.ID), d, &respBody)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(respBody.Data) != 1 {
|
||||
return nil, &NotFoundError{}
|
||||
}
|
||||
|
||||
new := respBody.Data[0]
|
||||
|
||||
return &new, nil
|
||||
}
|
||||
@@ -117,7 +117,7 @@ func (c *Client) do(method, relativeURL string, reqBody interface{}, respBody in
|
||||
return nil
|
||||
}
|
||||
|
||||
// TODO: check rc?
|
||||
// TODO: check rc in addition to status code?
|
||||
|
||||
err = json.NewDecoder(resp.Body).Decode(respBody)
|
||||
if err != nil {
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
)
|
||||
|
||||
type UserGroup struct {
|
||||
ID string `json:"_id"`
|
||||
SiteID string `json:"site_id"`
|
||||
ID string `json:"_id,omitempty"`
|
||||
SiteID string `json:"site_id,omitempty"`
|
||||
Name string `json:"name"`
|
||||
|
||||
//Hidden bool `json:"attr_hidden,omitempty"`
|
||||
|
||||
Reference in New Issue
Block a user