github.com/1and1/oneandone-cloudserver-sdk-go@v1.4.1/loadbalancers.go (about)

     1  package oneandone
     2  
     3  import (
     4  	"net/http"
     5  )
     6  
     7  type LoadBalancer struct {
     8  	ApiPtr
     9  	idField
    10  	Name                  string             `json:"name,omitempty"`
    11  	Description           string             `json:"description,omitempty"`
    12  	State                 string             `json:"state,omitempty"`
    13  	CreationDate          string             `json:"creation_date,omitempty"`
    14  	Ip                    string             `json:"ip,omitempty"`
    15  	HealthCheckTest       string             `json:"health_check_test,omitempty"`
    16  	HealthCheckInterval   int                `json:"health_check_interval"`
    17  	HealthCheckPath       string             `json:"health_check_path,omitempty"`
    18  	HealthCheckPathParser string             `json:"health_check_path_parser,omitempty"`
    19  	Persistence           bool               `json:"persistence"`
    20  	PersistenceTime       int                `json:"persistence_time"`
    21  	Method                string             `json:"method,omitempty"`
    22  	Rules                 []LoadBalancerRule `json:"rules,omitempty"`
    23  	ServerIps             []ServerIpInfo     `json:"server_ips,omitempty"`
    24  	Datacenter            *Datacenter        `json:"datacenter,omitempty"`
    25  }
    26  
    27  type LoadBalancerRule struct {
    28  	idField
    29  	Protocol     string `json:"protocol,omitempty"`
    30  	PortBalancer uint16 `json:"port_balancer"`
    31  	PortServer   uint16 `json:"port_server"`
    32  	Source       string `json:"source,omitempty"`
    33  }
    34  
    35  type LoadBalancerRequest struct {
    36  	Name                  string             `json:"name,omitempty"`
    37  	Description           string             `json:"description,omitempty"`
    38  	DatacenterId          string             `json:"datacenter_id,omitempty"`
    39  	HealthCheckTest       string             `json:"health_check_test,omitempty"`
    40  	HealthCheckInterval   *int               `json:"health_check_interval"`
    41  	HealthCheckPath       string             `json:"health_check_path,omitempty"`
    42  	HealthCheckPathParser string             `json:"health_check_path_parser,omitempty"`
    43  	Persistence           *bool              `json:"persistence"`
    44  	PersistenceTime       *int               `json:"persistence_time"`
    45  	Method                string             `json:"method,omitempty"`
    46  	Rules                 []LoadBalancerRule `json:"rules,omitempty"`
    47  }
    48  
    49  // GET /load_balancers
    50  func (api *API) ListLoadBalancers(args ...interface{}) ([]LoadBalancer, error) {
    51  	url, err := processQueryParams(createUrl(api, loadBalancerPathSegment), args...)
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  	result := []LoadBalancer{}
    56  	err = api.Client.Get(url, &result, http.StatusOK)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	for index, _ := range result {
    61  		result[index].api = api
    62  	}
    63  	return result, nil
    64  }
    65  
    66  // POST /load_balancers
    67  func (api *API) CreateLoadBalancer(request *LoadBalancerRequest) (string, *LoadBalancer, error) {
    68  	url := createUrl(api, loadBalancerPathSegment)
    69  	result := new(LoadBalancer)
    70  	err := api.Client.Post(url, &request, &result, http.StatusAccepted)
    71  	if err != nil {
    72  		return "", nil, err
    73  	}
    74  	result.api = api
    75  	return result.Id, result, nil
    76  }
    77  
    78  // GET /load_balancers/{id}
    79  func (api *API) GetLoadBalancer(lb_id string) (*LoadBalancer, error) {
    80  	url := createUrl(api, loadBalancerPathSegment, lb_id)
    81  	result := new(LoadBalancer)
    82  	err := api.Client.Get(url, &result, http.StatusOK)
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  	result.api = api
    87  	return result, nil
    88  }
    89  
    90  // DELETE /load_balancers/{id}
    91  func (api *API) DeleteLoadBalancer(lb_id string) (*LoadBalancer, error) {
    92  	url := createUrl(api, loadBalancerPathSegment, lb_id)
    93  	result := new(LoadBalancer)
    94  	err := api.Client.Delete(url, nil, &result, http.StatusAccepted)
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  	result.api = api
    99  	return result, nil
   100  }
   101  
   102  // PUT /load_balancers/{id}
   103  func (api *API) UpdateLoadBalancer(lb_id string, request *LoadBalancerRequest) (*LoadBalancer, error) {
   104  	url := createUrl(api, loadBalancerPathSegment, lb_id)
   105  	result := new(LoadBalancer)
   106  	err := api.Client.Put(url, &request, &result, http.StatusAccepted)
   107  	if err != nil {
   108  		return nil, err
   109  	}
   110  	result.api = api
   111  	return result, nil
   112  }
   113  
   114  // GET /load_balancers/{id}/server_ips
   115  func (api *API) ListLoadBalancerServerIps(lb_id string) ([]ServerIpInfo, error) {
   116  	result := []ServerIpInfo{}
   117  	url := createUrl(api, loadBalancerPathSegment, lb_id, "server_ips")
   118  	err := api.Client.Get(url, &result, http.StatusOK)
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  	return result, nil
   123  }
   124  
   125  // GET /load_balancers/{id}/server_ips/{id}
   126  func (api *API) GetLoadBalancerServerIp(lb_id string, ip_id string) (*ServerIpInfo, error) {
   127  	result := new(ServerIpInfo)
   128  	url := createUrl(api, loadBalancerPathSegment, lb_id, "server_ips", ip_id)
   129  	err := api.Client.Get(url, &result, http.StatusOK)
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  	return result, nil
   134  }
   135  
   136  // POST /load_balancers/{id}/server_ips
   137  func (api *API) AddLoadBalancerServerIps(lb_id string, ip_ids []string) (*LoadBalancer, error) {
   138  	result := new(LoadBalancer)
   139  	request := serverIps{
   140  		ServerIps: ip_ids,
   141  	}
   142  	url := createUrl(api, loadBalancerPathSegment, lb_id, "server_ips")
   143  	err := api.Client.Post(url, &request, &result, http.StatusAccepted)
   144  	if err != nil {
   145  		return nil, err
   146  	}
   147  	result.api = api
   148  	return result, nil
   149  }
   150  
   151  // DELETE /load_balancers/{id}/server_ips/{id}
   152  func (api *API) DeleteLoadBalancerServerIp(lb_id string, ip_id string) (*LoadBalancer, error) {
   153  	result := new(LoadBalancer)
   154  	url := createUrl(api, loadBalancerPathSegment, lb_id, "server_ips", ip_id)
   155  	err := api.Client.Delete(url, nil, &result, http.StatusAccepted)
   156  	if err != nil {
   157  		return nil, err
   158  	}
   159  	result.api = api
   160  	return result, nil
   161  }
   162  
   163  // GET /load_balancers/{load_balancer_id}/rules
   164  func (api *API) ListLoadBalancerRules(lb_id string) ([]LoadBalancerRule, error) {
   165  	result := []LoadBalancerRule{}
   166  	url := createUrl(api, loadBalancerPathSegment, lb_id, "rules")
   167  	err := api.Client.Get(url, &result, http.StatusOK)
   168  	if err != nil {
   169  		return nil, err
   170  	}
   171  	return result, nil
   172  }
   173  
   174  // POST /load_balancers/{load_balancer_id}/rules
   175  func (api *API) AddLoadBalancerRules(lb_id string, lb_rules []LoadBalancerRule) (*LoadBalancer, error) {
   176  	result := new(LoadBalancer)
   177  	data := struct {
   178  		Rules []LoadBalancerRule `json:"rules"`
   179  	}{lb_rules}
   180  	url := createUrl(api, loadBalancerPathSegment, lb_id, "rules")
   181  	err := api.Client.Post(url, &data, &result, http.StatusAccepted)
   182  	if err != nil {
   183  		return nil, err
   184  	}
   185  	result.api = api
   186  	return result, nil
   187  }
   188  
   189  // GET /load_balancers/{load_balancer_id}/rules/{rule_id}
   190  func (api *API) GetLoadBalancerRule(lb_id string, rule_id string) (*LoadBalancerRule, error) {
   191  	result := new(LoadBalancerRule)
   192  	url := createUrl(api, loadBalancerPathSegment, lb_id, "rules", rule_id)
   193  	err := api.Client.Get(url, &result, http.StatusOK)
   194  	if err != nil {
   195  		return nil, err
   196  	}
   197  	return result, nil
   198  }
   199  
   200  // DELETE /load_balancers/{load_balancer_id}/rules/{rule_id}
   201  func (api *API) DeleteLoadBalancerRule(lb_id string, rule_id string) (*LoadBalancer, error) {
   202  	result := new(LoadBalancer)
   203  	url := createUrl(api, loadBalancerPathSegment, lb_id, "rules", rule_id)
   204  	err := api.Client.Delete(url, nil, &result, http.StatusAccepted)
   205  	if err != nil {
   206  		return nil, err
   207  	}
   208  	result.api = api
   209  	return result, nil
   210  }
   211  
   212  func (lb *LoadBalancer) GetState() (string, error) {
   213  	in, err := lb.api.GetLoadBalancer(lb.Id)
   214  	if in == nil {
   215  		return "", err
   216  	}
   217  	return in.State, err
   218  }