Add update support to networks

This commit is contained in:
Paul Tyng
2019-12-30 04:11:09 -05:00
parent 5b5807b7b0
commit 65c4384999
10 changed files with 129 additions and 26 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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())
}

View File

@@ -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 {

View File

@@ -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)
}

View File

@@ -2,6 +2,7 @@ package provider
import (
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/paultyng/terraform-provider-unifi/unifi"
)

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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"`