github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/builtin/providers/profitbricks/resource_profitbricks_firewall.go (about) 1 package profitbricks 2 3 import ( 4 "fmt" 5 "github.com/hashicorp/terraform/helper/schema" 6 "github.com/profitbricks/profitbricks-sdk-go" 7 ) 8 9 func resourceProfitBricksFirewall() *schema.Resource { 10 return &schema.Resource{ 11 Create: resourceProfitBricksFirewallCreate, 12 Read: resourceProfitBricksFirewallRead, 13 Update: resourceProfitBricksFirewallUpdate, 14 Delete: resourceProfitBricksFirewallDelete, 15 Schema: map[string]*schema.Schema{ 16 17 "name": { 18 Type: schema.TypeString, 19 Optional: true, 20 }, 21 22 "protocol": { 23 Type: schema.TypeString, 24 Required: true, 25 }, 26 "source_mac": { 27 Type: schema.TypeString, 28 Optional: true, 29 }, 30 "source_ip": { 31 Type: schema.TypeString, 32 Optional: true, 33 }, 34 "target_ip": { 35 Type: schema.TypeString, 36 Optional: true, 37 }, 38 "port_range_start": { 39 Type: schema.TypeInt, 40 Optional: true, 41 ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { 42 if v.(int) < 1 && v.(int) > 65534 { 43 errors = append(errors, fmt.Errorf("Port start range must be between 1 and 65534")) 44 } 45 return 46 }, 47 }, 48 49 "port_range_end": { 50 Type: schema.TypeInt, 51 Optional: true, 52 ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { 53 if v.(int) < 1 && v.(int) > 65534 { 54 errors = append(errors, fmt.Errorf("Port end range must be between 1 and 65534")) 55 } 56 return 57 }, 58 }, 59 "icmp_type": { 60 Type: schema.TypeString, 61 Optional: true, 62 }, 63 "icmp_code": { 64 Type: schema.TypeString, 65 Optional: true, 66 }, 67 "datacenter_id": { 68 Type: schema.TypeString, 69 Required: true, 70 }, 71 "server_id": { 72 Type: schema.TypeString, 73 Required: true, 74 }, 75 "nic_id": { 76 Type: schema.TypeString, 77 Required: true, 78 }, 79 }, 80 } 81 } 82 83 func resourceProfitBricksFirewallCreate(d *schema.ResourceData, meta interface{}) error { 84 config := meta.(*Config) 85 profitbricks.SetAuth(config.Username, config.Password) 86 87 fw := profitbricks.FirewallRule{ 88 Properties: profitbricks.FirewallruleProperties{ 89 Protocol: d.Get("protocol").(string), 90 }, 91 } 92 93 if _, ok := d.GetOk("name"); ok { 94 fw.Properties.Name = d.Get("name").(string) 95 } 96 if _, ok := d.GetOk("source_mac"); ok { 97 fw.Properties.SourceMac = d.Get("source_mac").(string) 98 } 99 if _, ok := d.GetOk("source_ip"); ok { 100 fw.Properties.SourceIp = d.Get("source_ip").(string) 101 } 102 if _, ok := d.GetOk("target_ip"); ok { 103 fw.Properties.TargetIp = d.Get("target_ip").(string) 104 } 105 if _, ok := d.GetOk("port_range_start"); ok { 106 fw.Properties.PortRangeStart = d.Get("port_range_start").(int) 107 } 108 if _, ok := d.GetOk("port_range_end"); ok { 109 fw.Properties.PortRangeEnd = d.Get("port_range_end").(int) 110 } 111 if _, ok := d.GetOk("icmp_type"); ok { 112 fw.Properties.IcmpType = d.Get("icmp_type").(string) 113 } 114 if _, ok := d.GetOk("icmp_code"); ok { 115 fw.Properties.IcmpCode = d.Get("icmp_code").(string) 116 } 117 118 fw = profitbricks.CreateFirewallRule(d.Get("datacenter_id").(string), d.Get("server_id").(string), d.Get("nic_id").(string), fw) 119 120 if fw.StatusCode > 299 { 121 return fmt.Errorf("An error occured while creating a firewall rule: %s", fw.Response) 122 } 123 124 err := waitTillProvisioned(meta, fw.Headers.Get("Location")) 125 if err != nil { 126 return err 127 } 128 d.SetId(fw.Id) 129 130 return resourceProfitBricksFirewallRead(d, meta) 131 } 132 133 func resourceProfitBricksFirewallRead(d *schema.ResourceData, meta interface{}) error { 134 config := meta.(*Config) 135 profitbricks.SetAuth(config.Username, config.Password) 136 137 fw := profitbricks.GetFirewallRule(d.Get("datacenter_id").(string), d.Get("server_id").(string), d.Get("nic_id").(string), d.Id()) 138 139 if fw.StatusCode > 299 { 140 return fmt.Errorf("An error occured while fetching a firewall rule dcId: %s server_id: %s nic_id: %s ID: %s %s", d.Get("datacenter_id").(string), d.Get("server_id").(string), d.Get("nic_id").(string), d.Id(), fw.Response) 141 } 142 143 d.Set("protocol", fw.Properties.Protocol) 144 d.Set("name", fw.Properties.Name) 145 d.Set("source_mac", fw.Properties.SourceMac) 146 d.Set("source_ip", fw.Properties.SourceIp) 147 d.Set("target_ip", fw.Properties.TargetIp) 148 d.Set("port_range_start", fw.Properties.PortRangeStart) 149 d.Set("port_range_end", fw.Properties.PortRangeEnd) 150 d.Set("icmp_type", fw.Properties.IcmpType) 151 d.Set("icmp_code", fw.Properties.IcmpCode) 152 d.Set("nic_id", d.Get("nic_id").(string)) 153 154 return nil 155 } 156 157 func resourceProfitBricksFirewallUpdate(d *schema.ResourceData, meta interface{}) error { 158 config := meta.(*Config) 159 profitbricks.SetAuth(config.Username, config.Password) 160 161 properties := profitbricks.FirewallruleProperties{} 162 163 if d.HasChange("name") { 164 _, new := d.GetChange("name") 165 166 properties.Name = new.(string) 167 } 168 if d.HasChange("source_mac") { 169 _, new := d.GetChange("source_mac") 170 171 properties.SourceMac = new.(string) 172 } 173 if d.HasChange("source_ip") { 174 _, new := d.GetChange("source_ip") 175 176 properties.SourceIp = new.(string) 177 } 178 if d.HasChange("target_ip") { 179 _, new := d.GetChange("target_ip") 180 181 properties.TargetIp = new.(string) 182 } 183 if d.HasChange("port_range_start") { 184 _, new := d.GetChange("port_range_start") 185 186 properties.PortRangeStart = new.(int) 187 } 188 if d.HasChange("port_range_end") { 189 _, new := d.GetChange("port_range_end") 190 191 properties.PortRangeEnd = new.(int) 192 } 193 if d.HasChange("icmp_type") { 194 _, new := d.GetChange("icmp_type") 195 196 properties.IcmpType = new.(int) 197 } 198 if d.HasChange("icmp_code") { 199 _, new := d.GetChange("icmp_code") 200 201 properties.IcmpCode = new.(int) 202 } 203 204 resp := profitbricks.PatchFirewallRule(d.Get("datacenter_id").(string), d.Get("server_id").(string), d.Get("nic_id").(string), d.Id(), properties) 205 206 if resp.StatusCode > 299 { 207 return fmt.Errorf("An error occured while deleting a firewall rule ID %s %s", d.Id(), resp.Response) 208 } 209 210 err := waitTillProvisioned(meta, resp.Headers.Get("Location")) 211 if err != nil { 212 return err 213 } 214 return resourceProfitBricksFirewallRead(d, meta) 215 } 216 217 func resourceProfitBricksFirewallDelete(d *schema.ResourceData, meta interface{}) error { 218 config := meta.(*Config) 219 profitbricks.SetAuth(config.Username, config.Password) 220 221 resp := profitbricks.DeleteFirewallRule(d.Get("datacenter_id").(string), d.Get("server_id").(string), d.Get("nic_id").(string), d.Id()) 222 223 if resp.StatusCode > 299 { 224 return fmt.Errorf("An error occured while deleting a firewall rule ID %s %s", d.Id(), string(resp.Body)) 225 } 226 227 err := waitTillProvisioned(meta, resp.Headers.Get("Location")) 228 if err != nil { 229 return err 230 } 231 d.SetId("") 232 233 return nil 234 }