|
4 | 4 | "context" |
5 | 5 | "fmt" |
6 | 6 | "log" |
| 7 | + "net/url" |
7 | 8 | "strings" |
8 | 9 | "time" |
9 | 10 |
|
@@ -199,25 +200,10 @@ func resourceVultrLoadBalancer() *schema.Resource { |
199 | 200 | Type: schema.TypeBool, |
200 | 201 | Computed: true, |
201 | 202 | }, |
202 | | - |
203 | | - "auto_ssl": { |
204 | | - Type: schema.TypeSet, |
| 203 | + "auto_ssl_domain": { |
| 204 | + Type: schema.TypeString, |
205 | 205 | Optional: true, |
206 | | - MaxItems: 1, |
207 | | - Elem: &schema.Resource{ |
208 | | - Schema: map[string]*schema.Schema{ |
209 | | - "domain_zone": { |
210 | | - Type: schema.TypeString, |
211 | | - Required: true, |
212 | | - }, |
213 | | - "sub_domain": { |
214 | | - Type: schema.TypeString, |
215 | | - Optional: true, |
216 | | - }, |
217 | | - }, |
218 | | - }, |
219 | 206 | }, |
220 | | - |
221 | 207 | "attached_instances": { |
222 | 208 | Type: schema.TypeList, |
223 | 209 | Optional: true, |
@@ -275,8 +261,13 @@ func resourceVultrLoadBalancerCreate(ctx context.Context, d *schema.ResourceData |
275 | 261 | } |
276 | 262 |
|
277 | 263 | var autoSSL *govultr.AutoSSL |
278 | | - if autoSSLData, autoSSLOk := d.GetOk("auto_ssl"); autoSSLOk { |
279 | | - autoSSL = generateAutoSSL(autoSSLData) |
| 264 | + if autoSSLDomainData, autoSSLDomainOk := d.GetOk("auto_ssl_domain"); autoSSLDomainOk { |
| 265 | + domain := autoSSLDomainData.(string) |
| 266 | + if autoSSLDomain, err := generateAutoSSL(domain); err != nil { |
| 267 | + return diag.Errorf("failed to parse auto SSL domain: %v", err) |
| 268 | + } else { |
| 269 | + autoSSL = autoSSLDomain |
| 270 | + } |
280 | 271 | } |
281 | 272 |
|
282 | 273 | cookieName, cookieOk := d.GetOk("cookie_name") |
@@ -382,19 +373,8 @@ func resourceVultrLoadBalancerRead(ctx context.Context, d *schema.ResourceData, |
382 | 373 | "healthy_threshold": lb.HealthCheck.HealthyThreshold, |
383 | 374 | } |
384 | 375 | hc = append(hc, hcInfo) |
385 | | - |
386 | | - var autoSSL interface{} |
387 | | - if lb.AutoSSL != nil && lb.AutoSSL.DomainZone != "" { |
388 | | - autoSSL = []map[string]interface{}{ |
389 | | - { |
390 | | - "domain_zone": lb.AutoSSL.DomainZone, |
391 | | - "sub_domain": lb.AutoSSL.DomainSub, |
392 | | - }, |
393 | | - } |
394 | | - } |
395 | | - |
396 | | - if err := d.Set("auto_ssl", autoSSL); err != nil { |
397 | | - return diag.Errorf("unable to set resource load_balancer `auto_ssl` read value: %v", err) |
| 376 | + if err := d.Set("auto_ssl_domain", lb.AutoSSL.Domain); err != nil { |
| 377 | + return diag.Errorf("unable to set resource load_balancer `auto_ssl_domain` read value: %v", err) |
398 | 378 | } |
399 | 379 | if err := d.Set("health_check", hc); err != nil { |
400 | 380 | return diag.Errorf("unable to set resource load_balancer `health_check` read value: %v", err) |
@@ -463,18 +443,20 @@ func resourceVultrLoadBalancerUpdate(ctx context.Context, d *schema.ResourceData |
463 | 443 | req.SSL = nil |
464 | 444 | } |
465 | 445 | } |
466 | | - |
467 | | - if d.HasChange("auto_ssl") { |
468 | | - if autoSSLData, autoSSLOk := d.GetOk("auto_ssl"); autoSSLOk { |
469 | | - req.AutoSSL = generateAutoSSL(autoSSLData) |
| 446 | + if d.HasChange("auto_ssl_domain") { |
| 447 | + if autoSSLData, ok := d.GetOk("auto_ssl_domain"); ok && autoSSLData.(string) != "" { |
| 448 | + autoSSL, err := generateAutoSSL(autoSSLData.(string)) |
| 449 | + if err != nil { |
| 450 | + return diag.Errorf("failed to parse auto SSL domain: %v", err) |
| 451 | + } |
| 452 | + req.AutoSSL = autoSSL |
470 | 453 | } else { |
471 | | - log.Printf(`[INFO] Disabled load balancer auto SSL certificate (%v)`, d.Id()) |
| 454 | + log.Printf("[INFO] Disabled load balancer auto SSL certificate (%v)", d.Id()) |
472 | 455 | if err := client.LoadBalancer.DeleteAutoSSL(ctx, d.Id()); err != nil { |
473 | 456 | return diag.Errorf("error disabling load balancer auto SSL certificate (%v): %v", d.Id(), err) |
474 | 457 | } |
475 | 458 | } |
476 | 459 | } |
477 | | - |
478 | 460 | if d.HasChange("forwarding_rules") { |
479 | 461 | _, newFR := d.GetChange("forwarding_rules") |
480 | 462 |
|
@@ -671,12 +653,30 @@ func generateSSL(sslData interface{}) *govultr.SSL { |
671 | 653 | } |
672 | 654 | } |
673 | 655 |
|
674 | | -func generateAutoSSL(autoSSLData interface{}) *govultr.AutoSSL { |
675 | | - k := autoSSLData.(*schema.Set).List() |
676 | | - config := k[0].(map[string]interface{}) |
| 656 | +func generateAutoSSL(domain string) (*govultr.AutoSSL, error) { |
| 657 | + parsedDomain, err := url.Parse(domain) |
| 658 | + if err != nil || parsedDomain.Scheme != "" { |
| 659 | + return nil, fmt.Errorf("domain format must not include URL scheme (http:// or https://)") |
| 660 | + } |
677 | 661 |
|
678 | | - return &govultr.AutoSSL{ |
679 | | - DomainZone: config["domain_zone"].(string), |
680 | | - DomainSub: config["sub_domain"].(string), |
| 662 | + hostname := parsedDomain.Hostname() |
| 663 | + if hostname == "" { |
| 664 | + hostname = domain |
| 665 | + } |
| 666 | + |
| 667 | + subdomainParts := strings.Split(hostname, ".") |
| 668 | + if len(subdomainParts) <= 2 { |
| 669 | + return &govultr.AutoSSL{ |
| 670 | + DomainZone: hostname, |
| 671 | + DomainSub: "", |
| 672 | + }, nil |
681 | 673 | } |
| 674 | + |
| 675 | + subDomain := subdomainParts[0] |
| 676 | + domainZone := strings.Join(subdomainParts[1:], ".") |
| 677 | + |
| 678 | + return &govultr.AutoSSL{ |
| 679 | + DomainZone: domainZone, |
| 680 | + DomainSub: subDomain, |
| 681 | + }, nil |
682 | 682 | } |
0 commit comments