This repository has been archived by the owner on Aug 12, 2020. It is now read-only.
forked from huaweicloud/terraform-provider-huaweicloud
/
elb_utils.go
117 lines (94 loc) · 3.69 KB
/
elb_utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package huaweicloud
import (
"fmt"
"log"
"time"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/huaweicloud/golangsdk"
"github.com/huaweicloud/golangsdk/openstack/networking/v2/extensions/elb"
"github.com/huaweicloud/golangsdk/openstack/networking/v2/extensions/elb/listeners"
"github.com/huaweicloud/golangsdk/openstack/networking/v2/extensions/elb/loadbalancers"
)
func waitForELBJobSuccess(networkingClient *golangsdk.ServiceClient, j *elb.Job, timeout time.Duration) (*elb.JobInfo, error) {
jobId := j.JobId
target := "SUCCESS"
pending := []string{"INIT", "RUNNING"}
log.Printf("[DEBUG] Waiting for elb job %s to become %s.", jobId, target)
ji, err := waitForELBResource(networkingClient, "job", jobId, target, pending, timeout, getELBJobInfo)
if err == nil {
return ji.(*elb.JobInfo), nil
}
return nil, err
}
func getELBJobInfo(networkingClient *golangsdk.ServiceClient, jobId string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
info, err := elb.QueryJobInfo(networkingClient, jobId).Extract()
if err != nil {
return nil, "", err
}
return info, info.Status, nil
}
}
func waitForELBLoadBalancerActive(networkingClient *golangsdk.ServiceClient, id string, timeout time.Duration) error {
target := "ACTIVE"
log.Printf("[DEBUG] Waiting for elb %s to become %s.", id, target)
_, err := waitForELBResource(networkingClient, "loadbalancer", id, target, []string{"PENDING_CREATE"}, timeout, getELBLoadBalancer)
return err
}
func getELBLoadBalancer(networkingClient *golangsdk.ServiceClient, id string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
lb, err := loadbalancers.Get(networkingClient, id).Extract()
if err != nil {
return nil, "", err
}
return lb, lb.Status, nil
}
}
func waitForELBListenerActive(networkingClient *golangsdk.ServiceClient, id string, timeout time.Duration) error {
target := "ACTIVE"
log.Printf("[DEBUG] Waiting for elb-listener %s to become %s.", id, target)
_, err := waitForELBResource(networkingClient, "listener", id, target, []string{"PENDING_CREATE"}, timeout, getELBListener)
return err
}
func getELBListener(networkingClient *golangsdk.ServiceClient, id string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
l, err := listeners.Get(networkingClient, id).Extract()
if err != nil {
return nil, "", err
}
return l, l.Status, nil
}
}
type getELBResource func(networkingClient *golangsdk.ServiceClient, id string) resource.StateRefreshFunc
func waitForELBResource(networkingClient *golangsdk.ServiceClient, name string, id string, target string, pending []string, timeout time.Duration, f getELBResource) (interface{}, error) {
stateConf := &resource.StateChangeConf{
Target: []string{target},
Pending: pending,
Refresh: f(networkingClient, id),
Timeout: timeout,
Delay: 5 * time.Second,
MinTimeout: 1 * time.Second,
}
o, err := stateConf.WaitForState()
if err != nil {
if _, ok := err.(golangsdk.ErrDefault404); ok {
return nil, fmt.Errorf("Error: elb %s %s not found: %s", name, id, err)
}
return nil, fmt.Errorf("Error waiting for elb %s %s to become %s: %s", name, id, target, err)
}
return o, nil
}
func chooseELBClient(d *schema.ResourceData, config *Config) (*golangsdk.ServiceClient, error) {
return config.loadElasticLoadBalancerClient(GetRegion(d, config))
}
func chooseCESClient(d *schema.ResourceData, config *Config) (*golangsdk.ServiceClient, error) {
return config.loadCESClient(GetRegion(d, config))
}
func isResourceNotFound(err error) bool {
if err == nil {
return false
}
_, ok := err.(golangsdk.ErrDefault404)
return ok
}