|
| 1 | +package client |
| 2 | + |
| 3 | +import ( |
| 4 | + "bytes" |
| 5 | + "context" |
| 6 | + "encoding/json" |
| 7 | + "fmt" |
| 8 | + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" |
| 9 | + "io/ioutil" |
| 10 | + "net/http" |
| 11 | +) |
| 12 | + |
| 13 | +const trustedNetworkEndpoint = "v1/trusted_networks" |
| 14 | + |
| 15 | +type ExternalIpConfig struct { |
| 16 | + AddressesRanges []string `json:"addresses_ranges"` |
| 17 | +} |
| 18 | + |
| 19 | +func newExternalIPConfig(input interface{}) *ExternalIpConfig { |
| 20 | + newExternalIpConfig := &ExternalIpConfig{} |
| 21 | + inputList := input.([]interface{}) |
| 22 | + if len(inputList) == 0 { |
| 23 | + return nil |
| 24 | + } |
| 25 | + externalIpConfig := inputList[0].(map[string]interface{}) |
| 26 | + addressesRanges := externalIpConfig["addresses_ranges"].([]interface{}) |
| 27 | + newExternalIpConfig.AddressesRanges = make([]string, len(addressesRanges)) |
| 28 | + for j, address := range addressesRanges { |
| 29 | + newExternalIpConfig.AddressesRanges[j] = address.(string) |
| 30 | + } |
| 31 | + return newExternalIpConfig |
| 32 | +} |
| 33 | + |
| 34 | +type ResolvedAddressConfig struct { |
| 35 | + AddressesRanges []string `json:"addresses_ranges"` |
| 36 | + Hostname string `json:"hostname"` |
| 37 | +} |
| 38 | + |
| 39 | +func newResolvedAddressConfig(input interface{}) *ResolvedAddressConfig { |
| 40 | + newResolvedAddressConfig := &ResolvedAddressConfig{} |
| 41 | + inputList := input.([]interface{}) |
| 42 | + if len(inputList) == 0 { |
| 43 | + return nil |
| 44 | + } |
| 45 | + resolvedAddressConfig := inputList[0].(map[string]interface{}) |
| 46 | + addressesRanges := resolvedAddressConfig["addresses_ranges"].([]interface{}) |
| 47 | + newResolvedAddressConfig.AddressesRanges = make([]string, len(addressesRanges)) |
| 48 | + for j, address := range addressesRanges { |
| 49 | + newResolvedAddressConfig.AddressesRanges[j] = address.(string) |
| 50 | + } |
| 51 | + newResolvedAddressConfig.Hostname = resolvedAddressConfig["hostname"].(string) |
| 52 | + return newResolvedAddressConfig |
| 53 | +} |
| 54 | + |
| 55 | +type Criteria struct { |
| 56 | + ExternalIpConfig *ExternalIpConfig `json:"external_ip_config,omitempty"` |
| 57 | + ResolvedAddressConfig *ResolvedAddressConfig `json:"resolved_address_config,omitempty"` |
| 58 | + Type string `json:"type,omitempty"` |
| 59 | +} |
| 60 | + |
| 61 | +func newCriteria(d *schema.ResourceData) []Criteria { |
| 62 | + c := d.Get("criteria").([]interface{}) |
| 63 | + res := make([]Criteria, len(c)) |
| 64 | + for i, criteria := range c { |
| 65 | + newCriteria := Criteria{} |
| 66 | + criteria := criteria.(map[string]interface{}) |
| 67 | + if externalIpConfig, ok := criteria["external_ip_config"]; ok { |
| 68 | + newCriteria.ExternalIpConfig = newExternalIPConfig(externalIpConfig) |
| 69 | + } |
| 70 | + if resolvedAddressConfig, ok := criteria["resolved_address_config"]; ok { |
| 71 | + newCriteria.ResolvedAddressConfig = newResolvedAddressConfig(resolvedAddressConfig) |
| 72 | + } |
| 73 | + res[i] = newCriteria |
| 74 | + } |
| 75 | + return res |
| 76 | +} |
| 77 | + |
| 78 | +type TrustedNetwork struct { |
| 79 | + ID string `json:"id,omitempty"` |
| 80 | + Name string `json:"name,omitempty"` |
| 81 | + Description string `json:"description"` |
| 82 | + Enabled bool `json:"enabled"` |
| 83 | + ApplyToOrg bool `json:"apply_to_org"` |
| 84 | + ApplyToEntities []string `json:"apply_to_entities"` |
| 85 | + ExemptEntities []string `json:"exempt_entities"` |
| 86 | + Criteria []Criteria `json:"criteria"` |
| 87 | +} |
| 88 | + |
| 89 | +func NewTrustedNetwork(d *schema.ResourceData) *TrustedNetwork { |
| 90 | + res := &TrustedNetwork{} |
| 91 | + if d.HasChange("name") { |
| 92 | + res.Name = d.Get("name").(string) |
| 93 | + } |
| 94 | + res.Description = d.Get("description").(string) |
| 95 | + res.Enabled = d.Get("enabled").(bool) |
| 96 | + res.ApplyToOrg = d.Get("apply_to_org").(bool) |
| 97 | + res.ApplyToEntities = ConfigToStringSlice("apply_to_entities", d) |
| 98 | + res.ExemptEntities = ConfigToStringSlice("exempt_entities", d) |
| 99 | + res.Criteria = newCriteria(d) |
| 100 | + return res |
| 101 | +} |
| 102 | + |
| 103 | +func parseTrustedNetwork(resp *http.Response) (*TrustedNetwork, error) { |
| 104 | + defer resp.Body.Close() |
| 105 | + body, err := ioutil.ReadAll(resp.Body) |
| 106 | + e := &TrustedNetwork{} |
| 107 | + err = json.Unmarshal(body, e) |
| 108 | + if err != nil { |
| 109 | + return nil, fmt.Errorf("could not parse trusted network response: %v", err) |
| 110 | + } |
| 111 | + return e, nil |
| 112 | +} |
| 113 | + |
| 114 | +func CreateTrustedNetwork(ctx context.Context, c *Client, e *TrustedNetwork) (*TrustedNetwork, error) { |
| 115 | + url := fmt.Sprintf("%s/%s", c.BaseURL, trustedNetworkEndpoint) |
| 116 | + body, err := json.Marshal(e) |
| 117 | + if err != nil { |
| 118 | + return nil, fmt.Errorf("could not convert trusted network to json: %v", err) |
| 119 | + } |
| 120 | + resp, err := c.Post(ctx, url, bytes.NewReader(body)) |
| 121 | + if err != nil { |
| 122 | + return nil, err |
| 123 | + } |
| 124 | + return parseTrustedNetwork(resp) |
| 125 | +} |
| 126 | + |
| 127 | +func GetTrustedNetwork(ctx context.Context, c *Client, eID string) (*TrustedNetwork, error) { |
| 128 | + url := fmt.Sprintf("%s/%s/%s", c.BaseURL, trustedNetworkEndpoint, eID) |
| 129 | + resp, err := c.Get(ctx, url, nil) |
| 130 | + if err != nil { |
| 131 | + return nil, err |
| 132 | + } |
| 133 | + return parseTrustedNetwork(resp) |
| 134 | +} |
| 135 | + |
| 136 | +func UpdateTrustedNetwork(ctx context.Context, c *Client, eID string, e *TrustedNetwork) (*TrustedNetwork, error) { |
| 137 | + url := fmt.Sprintf("%s/%s/%s", c.BaseURL, trustedNetworkEndpoint, eID) |
| 138 | + body, err := json.Marshal(e) |
| 139 | + if err != nil { |
| 140 | + return nil, fmt.Errorf("could not convert trusted network to json: %v", err) |
| 141 | + } |
| 142 | + resp, err := c.Patch(ctx, url, bytes.NewReader(body)) |
| 143 | + if err != nil { |
| 144 | + return nil, err |
| 145 | + } |
| 146 | + return parseTrustedNetwork(resp) |
| 147 | +} |
| 148 | + |
| 149 | +func DeleteTrustedNetwork(ctx context.Context, c *Client, mID string) (*TrustedNetwork, error) { |
| 150 | + url := fmt.Sprintf("%s/%s/%s", c.BaseURL, trustedNetworkEndpoint, mID) |
| 151 | + resp, err := c.Delete(ctx, url, nil) |
| 152 | + if err != nil { |
| 153 | + return nil, err |
| 154 | + } |
| 155 | + return parseTrustedNetwork(resp) |
| 156 | +} |
0 commit comments