github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/triton/resource_fabric.go (about) 1 package triton 2 3 import ( 4 "fmt" 5 6 "github.com/hashicorp/terraform/helper/schema" 7 "github.com/joyent/triton-go" 8 ) 9 10 func resourceFabric() *schema.Resource { 11 return &schema.Resource{ 12 Create: resourceFabricCreate, 13 Exists: resourceFabricExists, 14 Read: resourceFabricRead, 15 Delete: resourceFabricDelete, 16 17 Schema: map[string]*schema.Schema{ 18 "name": { 19 Description: "Network name", 20 Required: true, 21 ForceNew: true, 22 Type: schema.TypeString, 23 }, 24 "public": { 25 Description: "Whether or not this is an RFC1918 network", 26 Computed: true, 27 Type: schema.TypeBool, 28 }, 29 "fabric": { 30 Description: "Whether or not this network is on a fabric", 31 Computed: true, 32 Type: schema.TypeBool, 33 }, 34 "description": { 35 Description: "Description of network", 36 Optional: true, 37 ForceNew: true, 38 Type: schema.TypeString, 39 }, 40 "subnet": { 41 Description: "CIDR formatted string describing network address space", 42 Required: true, 43 ForceNew: true, 44 Type: schema.TypeString, 45 }, 46 "provision_start_ip": { 47 Description: "First IP on the network that can be assigned", 48 Required: true, 49 ForceNew: true, 50 Type: schema.TypeString, 51 }, 52 "provision_end_ip": { 53 Description: "Last assignable IP on the network", 54 Required: true, 55 ForceNew: true, 56 Type: schema.TypeString, 57 }, 58 "gateway": { 59 Description: "Gateway IP", 60 Optional: true, 61 ForceNew: true, 62 Type: schema.TypeString, 63 }, 64 "resolvers": { 65 Description: "List of IP addresses for DNS resolvers", 66 Optional: true, 67 Computed: true, 68 Type: schema.TypeList, 69 Elem: &schema.Schema{Type: schema.TypeString}, 70 }, 71 "routes": { 72 Description: "Map of CIDR block to Gateway IP address", 73 Computed: true, 74 Optional: true, 75 ForceNew: true, 76 Type: schema.TypeMap, 77 }, 78 "internet_nat": { 79 Description: "Whether or not a NAT zone is provisioned at the Gateway IP address", 80 Computed: true, 81 Optional: true, 82 ForceNew: true, 83 Type: schema.TypeBool, 84 }, 85 "vlan_id": { 86 Description: "VLAN on which the network exists", 87 Required: true, 88 ForceNew: true, 89 Type: schema.TypeInt, 90 }, 91 }, 92 } 93 } 94 95 func resourceFabricCreate(d *schema.ResourceData, meta interface{}) error { 96 client := meta.(*triton.Client) 97 98 var resolvers []string 99 for _, resolver := range d.Get("resolvers").([]interface{}) { 100 resolvers = append(resolvers, resolver.(string)) 101 } 102 103 routes := map[string]string{} 104 for cidr, v := range d.Get("routes").(map[string]interface{}) { 105 ip, ok := v.(string) 106 if !ok { 107 return fmt.Errorf(`Cannot use "%v" as an IP address`, v) 108 } 109 routes[cidr] = ip 110 } 111 112 fabric, err := client.Fabrics().CreateFabricNetwork(&triton.CreateFabricNetworkInput{ 113 FabricVLANID: d.Get("vlan_id").(int), 114 Name: d.Get("name").(string), 115 Description: d.Get("description").(string), 116 Subnet: d.Get("subnet").(string), 117 ProvisionStartIP: d.Get("provision_start_ip").(string), 118 ProvisionEndIP: d.Get("provision_end_ip").(string), 119 Gateway: d.Get("gateway").(string), 120 Resolvers: resolvers, 121 Routes: routes, 122 InternetNAT: d.Get("internet_nat").(bool), 123 }, 124 ) 125 if err != nil { 126 return err 127 } 128 129 d.SetId(fabric.Id) 130 131 return resourceFabricRead(d, meta) 132 } 133 134 func resourceFabricExists(d *schema.ResourceData, meta interface{}) (bool, error) { 135 client := meta.(*triton.Client) 136 137 return resourceExists(client.Fabrics().GetFabricNetwork(&triton.GetFabricNetworkInput{ 138 FabricVLANID: d.Get("vlan_id").(int), 139 NetworkID: d.Id(), 140 })) 141 } 142 143 func resourceFabricRead(d *schema.ResourceData, meta interface{}) error { 144 client := meta.(*triton.Client) 145 146 fabric, err := client.Fabrics().GetFabricNetwork(&triton.GetFabricNetworkInput{ 147 FabricVLANID: d.Get("vlan_id").(int), 148 NetworkID: d.Id(), 149 }) 150 if err != nil { 151 return err 152 } 153 154 d.SetId(fabric.Id) 155 d.Set("name", fabric.Name) 156 d.Set("public", fabric.Public) 157 d.Set("fabric", fabric.Fabric) 158 d.Set("description", fabric.Description) 159 d.Set("subnet", fabric.Subnet) 160 d.Set("provision_start_ip", fabric.ProvisioningStartIP) 161 d.Set("provision_end_ip", fabric.ProvisioningEndIP) 162 d.Set("gateway", fabric.Gateway) 163 d.Set("resolvers", fabric.Resolvers) 164 d.Set("routes", fabric.Routes) 165 d.Set("internet_nat", fabric.InternetNAT) 166 d.Set("vlan_id", d.Get("vlan_id").(int)) 167 168 return nil 169 } 170 171 func resourceFabricDelete(d *schema.ResourceData, meta interface{}) error { 172 client := meta.(*triton.Client) 173 174 return client.Fabrics().DeleteFabricNetwork(&triton.DeleteFabricNetworkInput{ 175 FabricVLANID: d.Get("vlan_id").(int), 176 NetworkID: d.Id(), 177 }) 178 }