Skip to content

Commit

Permalink
Merge pull request #16 from citrix/support_rnat
Browse files Browse the repository at this point in the history
Support rnat
  • Loading branch information
chiradeep authored May 17, 2018
2 parents 36582ef + a024c66 commit 3f79624
Show file tree
Hide file tree
Showing 18 changed files with 586 additions and 11 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ terraform-provider-netscaler
tools/tools
.idea
*.iml
.terraform/
crash.log
9 changes: 5 additions & 4 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ resource "netscaler_nsacls" "allacls" {
vlan = "2000"
priority = 130
}
}
```

Expand All @@ -208,6 +209,45 @@ You can have only one element of type `netscaler_nsacls`. Encapsulating every `n

See <https://developer-docs.citrix.com/projects/netscaler-nitro-api/en/12.0/configuration/ns/nsacl/nsacl/#nsacl> for possible values for these arguments and for an exhaustive list of arguments.

#### `netscaler_inat`

```
resource "netscaler_inat" "foo" {
name = "ip4ip4"
privateip = "192.168.2.5"
publicip = "172.17.1.2"
}
```
See <https://developer-docs.citrix.com/projects/netscaler-nitro-api/en/12.0/configuration/network/inat/inat/#inat> for possible values for these arguments and for an exhaustive list of arguments.

#### `netscaler_rnat`

```
resource "netscaler_rnat" "allrnat" {
depends_on = ["netscaler_nsacls.allacls"]
rnatsname = "rnatsall"
rnat {
network = "192.168.88.0"
netmask = "255.255.255.0"
natip = "172.17.0.2"
}
rnat {
aclname = "RNAT_ACL_1"
}
}
```

##### Argument Reference
You can have only one element of type `netscaler_rnat`. Encapsulate every `rnat` inside the `netscaler_rnat` resource.

See <https://developer-docs.citrix.com/projects/netscaler-nitro-api/en/12.0/configuration/network/rnat/rnat/#rnat> for possible values for these arguments and for an exhaustive list of arguments.

## Building
### Assumption
* You have (some) experience with Terraform, the different provisioners and providers that come out of the box,
Expand Down
40 changes: 40 additions & 0 deletions examples/network/resource.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,47 @@

resource "netscaler_nsacls" "allacls" {
aclsname = "foo"
"acl" {
aclname = "restrict"
protocol = "TCP"
aclaction = "DENY"
destipval = "192.168.1.20"
srcportval = "49-1024"
}
"acl" {
aclname = "RNAT_ACL_1"
aclaction = "ALLOW"
priority = "100"
srcipval = "192.168.10.22"
destipval = "172.17.0.20"
}

}

resource "netscaler_inat" "foo" {

name = "ip4ip4"
privateip = "192.168.2.5"
publicip = "172.17.1.2"
}

resource "netscaler_rnat" "allrnat" {
depends_on = ["netscaler_nsacls.allacls"]

rnatsname = "rnatsall"
rnat {
network = "192.168.20.0"
netmask = "255.255.255.0"
}

rnat {
network = "192.168.88.0"
netmask = "255.255.255.0"
natip = "172.17.0.2"
}

rnat {
aclname = "RNAT_ACL_1"
natip = "172.17.0.2"
}
}
1 change: 1 addition & 0 deletions netscaler/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ func providerResources() map[string]*schema.Resource {
"netscaler_nsacl": resourceNetScalerNsacl(),
"netscaler_nsacls": resourceNetScalerNsacls(),
"netscaler_inat": resourceNetScalerInat(),
"netscaler_rnat": resourceNetScalerRnats(),
}
}

Expand Down
190 changes: 190 additions & 0 deletions netscaler/resource_rnat.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
package netscaler

import (
"github.com/chiradeep/go-nitro/config/network"
"github.com/mitchellh/mapstructure"

"github.com/chiradeep/go-nitro/netscaler"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"

"log"
)

func resourceNetScalerRnats() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
Create: createRnatsFunc,
Read: readRnatsFunc,
Update: updateRnatsFunc,
Delete: deleteRnatsFunc,
Schema: map[string]*schema.Schema{
"rnatsname": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},

"rnat": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"aclname": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"natip": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"natip2": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"netmask": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"network": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"redirectport": &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"td": &schema.Schema{
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
},
},
},
},
}
}

func createRnatsFunc(d *schema.ResourceData, meta interface{}) error {
log.Printf("[DEBUG] netscaler-provider: In createRnatsFunc")

var rnatName string
if v, ok := d.GetOk("rnatsname"); ok {
rnatName = v.(string)
} else {
rnatName = resource.PrefixedUniqueId("tf-rnat-")
d.Set("rnatsname", rnatName)
}
rnats := d.Get("rnat").(*schema.Set).List()
for _, val := range rnats {
rnat := val.(map[string]interface{})
_ = createSingleRnat(rnat, meta)
}

d.SetId(rnatName)

return nil
}

func readRnatsFunc(d *schema.ResourceData, meta interface{}) error {
log.Printf("[DEBUG] netscaler-provider: In readRnatsFunc")
client := meta.(*NetScalerNitroClient).client
rnatName := d.Id()
log.Printf("[DEBUG] netscaler-provider: Reading rnat state %s", rnatName)

data, _ := client.FindAllResources(netscaler.Rnat.Type())
rnats := make([]map[string]interface{}, len(data))
for i, a := range data {
rnats[i] = a
}
d.Set("rnat", rnats)
return nil
}

func updateRnatsFunc(d *schema.ResourceData, meta interface{}) error {
log.Printf("[DEBUG] netscaler-provider: In updateRnatsFunc")

if d.HasChange("rnat") {
orig, noo := d.GetChange("rnat")
if orig == nil {
orig = new(schema.Set)
}
if noo == nil {
noo = new(schema.Set)
}
oset := orig.(*schema.Set)
nset := noo.(*schema.Set)

remove := oset.Difference(nset).List()
add := nset.Difference(oset).List()
log.Printf("[DEBUG] netscaler-provider: need to remove %d rnat", len(remove))
log.Printf("[DEBUG] netscaler-provider: need to add %d rnat", len(add))

for _, val := range remove {
rnat := val.(map[string]interface{})
log.Printf("[DEBUG] netscaler-provider: going to delete rnat %v", rnat)
err := deleteSingleRnat(rnat, meta)
if err != nil {
log.Printf("[DEBUG] netscaler-provider: error deleting rnat %v", rnat)
}
}

for _, val := range add {
rnat := val.(map[string]interface{})
log.Printf("[DEBUG] netscaler-provider: going to add rnat %s", rnat["rnatsname"].(string))
err := createSingleRnat(rnat, meta)
if err != nil {
log.Printf("[DEBUG] netscaler-provider: error adding rnat %s", rnat["rnatsname"].(string))
}
}
}

return readRnatsFunc(d, meta)
}

func deleteRnatsFunc(d *schema.ResourceData, meta interface{}) error {
log.Printf("[DEBUG] netscaler-provider: In deleteRnatsFunc")
rnats := d.Get("rnat").(*schema.Set).List()

log.Printf("[DEBUG] netscaler-provider: deleteRnatsFunc: found %d rnat rules to delete", len(rnats))
for _, val := range rnats {
rnat := val.(map[string]interface{})
_ = deleteSingleRnat(rnat, meta)
}
d.SetId("")
return nil
}

func createSingleRnat(rnat map[string]interface{}, meta interface{}) error {
client := meta.(*NetScalerNitroClient).client
rnat2 := network.Rnat{}
mapstructure.Decode(rnat, &rnat2)

err := client.UpdateUnnamedResource(netscaler.Rnat.Type(), &rnat2)
if err != nil {
return err
}
return nil
}

func deleteSingleRnat(rnat map[string]interface{}, meta interface{}) error {
log.Printf("[DEBUG] netscaler-provider: In deleteSingleRnat")

rnat2 := network.Rnat{}
mapstructure.Decode(rnat, &rnat2)
client := meta.(*NetScalerNitroClient).client
err := client.ActOnResource(netscaler.Rnat.Type(), rnat2, "clear")
if err != nil {
return err
}

return nil
}
Loading

0 comments on commit 3f79624

Please sign in to comment.