nodebalancer_configs.go raw

   1  package linodego
   2  
   3  import (
   4  	"context"
   5  )
   6  
   7  // NodeBalancerConfig objects allow a NodeBalancer to accept traffic on a new port
   8  type NodeBalancerConfig struct {
   9  	ID            int                 `json:"id"`
  10  	Port          int                 `json:"port"`
  11  	Protocol      ConfigProtocol      `json:"protocol"`
  12  	ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol"`
  13  	Algorithm     ConfigAlgorithm     `json:"algorithm"`
  14  	Stickiness    ConfigStickiness    `json:"stickiness"`
  15  	Check         ConfigCheck         `json:"check"`
  16  	CheckInterval int                 `json:"check_interval"`
  17  	CheckAttempts int                 `json:"check_attempts"`
  18  	CheckPath     string              `json:"check_path"`
  19  	CheckBody     string              `json:"check_body"`
  20  	CheckPassive  bool                `json:"check_passive"`
  21  	CheckTimeout  int                 `json:"check_timeout"`
  22  
  23  	// NOTE: UDPCheckPort may not currently be available to all users.
  24  	UDPCheckPort int `json:"udp_check_port"`
  25  
  26  	// NOTE: UDPSessionTimeout may not currently be available to all users.
  27  	UDPSessionTimeout int `json:"udp_session_timeout"`
  28  
  29  	CipherSuite    ConfigCipher            `json:"cipher_suite"`
  30  	NodeBalancerID int                     `json:"nodebalancer_id"`
  31  	SSLCommonName  string                  `json:"ssl_commonname"`
  32  	SSLFingerprint string                  `json:"ssl_fingerprint"`
  33  	SSLCert        string                  `json:"ssl_cert"`
  34  	SSLKey         string                  `json:"ssl_key"`
  35  	NodesStatus    *NodeBalancerNodeStatus `json:"nodes_status"`
  36  }
  37  
  38  // ConfigAlgorithm constants start with Algorithm and include Linode API NodeBalancer Config Algorithms
  39  type ConfigAlgorithm string
  40  
  41  // ConfigAlgorithm constants reflect the NodeBalancer Config Algorithm
  42  const (
  43  	AlgorithmRoundRobin ConfigAlgorithm = "roundrobin"
  44  	AlgorithmLeastConn  ConfigAlgorithm = "leastconn"
  45  	AlgorithmSource     ConfigAlgorithm = "source"
  46  	AlgorithmRingHash   ConfigAlgorithm = "ring_hash"
  47  )
  48  
  49  // ConfigStickiness constants start with Stickiness and include Linode API NodeBalancer Config Stickiness
  50  type ConfigStickiness string
  51  
  52  // ConfigStickiness constants reflect the node stickiness method for a NodeBalancer Config
  53  const (
  54  	StickinessNone       ConfigStickiness = "none"
  55  	StickinessSession    ConfigStickiness = "session"
  56  	StickinessTable      ConfigStickiness = "table"
  57  	StickinessHTTPCookie ConfigStickiness = "http_cookie"
  58  	StickinessSourceIP   ConfigStickiness = "source_ip"
  59  )
  60  
  61  // ConfigCheck constants start with Check and include Linode API NodeBalancer Config Check methods
  62  type ConfigCheck string
  63  
  64  // ConfigCheck constants reflect the node health status checking method for a NodeBalancer Config
  65  const (
  66  	CheckNone       ConfigCheck = "none"
  67  	CheckConnection ConfigCheck = "connection"
  68  	CheckHTTP       ConfigCheck = "http"
  69  	CheckHTTPBody   ConfigCheck = "http_body"
  70  )
  71  
  72  // ConfigProtocol constants start with Protocol and include Linode API Nodebalancer Config protocols
  73  type ConfigProtocol string
  74  
  75  // ConfigProtocol constants reflect the protocol used by a NodeBalancer Config
  76  const (
  77  	ProtocolHTTP  ConfigProtocol = "http"
  78  	ProtocolHTTPS ConfigProtocol = "https"
  79  	ProtocolTCP   ConfigProtocol = "tcp"
  80  	ProtocolUDP   ConfigProtocol = "udp"
  81  )
  82  
  83  // ConfigProxyProtocol constants start with ProxyProtocol and include Linode API NodeBalancer Config proxy protocol versions
  84  type ConfigProxyProtocol string
  85  
  86  // ConfigProxyProtocol constants reflect the proxy protocol version used by a NodeBalancer Config
  87  const (
  88  	ProxyProtocolNone ConfigProxyProtocol = "none"
  89  	ProxyProtocolV1   ConfigProxyProtocol = "v1"
  90  	ProxyProtocolV2   ConfigProxyProtocol = "v2"
  91  )
  92  
  93  // ConfigCipher constants start with Cipher and include Linode API NodeBalancer Config Cipher values
  94  type ConfigCipher string
  95  
  96  // ConfigCipher constants reflect the preferred cipher set for a NodeBalancer Config
  97  const (
  98  	CipherRecommended ConfigCipher = "recommended"
  99  	CipherLegacy      ConfigCipher = "legacy"
 100  )
 101  
 102  // NodeBalancerNodeStatus represents the total number of nodes whose status is Up or Down
 103  type NodeBalancerNodeStatus struct {
 104  	Up   int `json:"up"`
 105  	Down int `json:"down"`
 106  }
 107  
 108  // NodeBalancerConfigCreateOptions are permitted by CreateNodeBalancerConfig
 109  type NodeBalancerConfigCreateOptions struct {
 110  	Port          int                 `json:"port"`
 111  	Protocol      ConfigProtocol      `json:"protocol,omitempty"`
 112  	ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"`
 113  	Algorithm     ConfigAlgorithm     `json:"algorithm,omitempty"`
 114  	Stickiness    ConfigStickiness    `json:"stickiness,omitempty"`
 115  	Check         ConfigCheck         `json:"check,omitempty"`
 116  	CheckInterval int                 `json:"check_interval,omitempty"`
 117  	CheckAttempts int                 `json:"check_attempts,omitempty"`
 118  	CheckPath     string              `json:"check_path,omitempty"`
 119  	CheckBody     string              `json:"check_body,omitempty"`
 120  	CheckPassive  *bool               `json:"check_passive,omitempty"`
 121  	CheckTimeout  int                 `json:"check_timeout,omitempty"`
 122  
 123  	// NOTE: UDPCheckPort may not currently be available to all users.
 124  	UDPCheckPort *int `json:"udp_check_port,omitempty"`
 125  
 126  	CipherSuite ConfigCipher                    `json:"cipher_suite,omitempty"`
 127  	SSLCert     string                          `json:"ssl_cert,omitempty"`
 128  	SSLKey      string                          `json:"ssl_key,omitempty"`
 129  	Nodes       []NodeBalancerNodeCreateOptions `json:"nodes,omitempty"`
 130  }
 131  
 132  // NodeBalancerConfigRebuildOptions used by RebuildNodeBalancerConfig
 133  type NodeBalancerConfigRebuildOptions struct {
 134  	Port          int                 `json:"port"`
 135  	Protocol      ConfigProtocol      `json:"protocol,omitempty"`
 136  	ProxyProtocol ConfigProxyProtocol `json:"proxy_protocol,omitempty"`
 137  	Algorithm     ConfigAlgorithm     `json:"algorithm,omitempty"`
 138  	Stickiness    ConfigStickiness    `json:"stickiness,omitempty"`
 139  	Check         ConfigCheck         `json:"check,omitempty"`
 140  	CheckInterval int                 `json:"check_interval,omitempty"`
 141  	CheckAttempts int                 `json:"check_attempts,omitempty"`
 142  	CheckPath     string              `json:"check_path,omitempty"`
 143  	CheckBody     string              `json:"check_body,omitempty"`
 144  	CheckPassive  *bool               `json:"check_passive,omitempty"`
 145  	CheckTimeout  int                 `json:"check_timeout,omitempty"`
 146  
 147  	// NOTE: UDPCheckPort may not currently be available to all users.
 148  	UDPCheckPort *int `json:"udp_check_port,omitempty"`
 149  
 150  	CipherSuite ConfigCipher                           `json:"cipher_suite,omitempty"`
 151  	SSLCert     string                                 `json:"ssl_cert,omitempty"`
 152  	SSLKey      string                                 `json:"ssl_key,omitempty"`
 153  	Nodes       []NodeBalancerConfigRebuildNodeOptions `json:"nodes"`
 154  }
 155  
 156  // NodeBalancerConfigRebuildNodeOptions represents a node defined when rebuilding a
 157  // NodeBalancer config.
 158  type NodeBalancerConfigRebuildNodeOptions struct {
 159  	NodeBalancerNodeCreateOptions
 160  
 161  	ID int `json:"id,omitempty"`
 162  }
 163  
 164  // NodeBalancerConfigUpdateOptions are permitted by UpdateNodeBalancerConfig
 165  type NodeBalancerConfigUpdateOptions NodeBalancerConfigCreateOptions
 166  
 167  // GetCreateOptions converts a NodeBalancerConfig to NodeBalancerConfigCreateOptions for use in CreateNodeBalancerConfig
 168  func (i NodeBalancerConfig) GetCreateOptions() NodeBalancerConfigCreateOptions {
 169  	var udpCheckPort *int
 170  	if i.UDPCheckPort != 0 {
 171  		udpCheckPort = &i.UDPCheckPort
 172  	}
 173  
 174  	return NodeBalancerConfigCreateOptions{
 175  		Port:          i.Port,
 176  		Protocol:      i.Protocol,
 177  		ProxyProtocol: i.ProxyProtocol,
 178  		Algorithm:     i.Algorithm,
 179  		Stickiness:    i.Stickiness,
 180  		Check:         i.Check,
 181  		CheckInterval: i.CheckInterval,
 182  		CheckAttempts: i.CheckAttempts,
 183  		CheckTimeout:  i.CheckTimeout,
 184  		CheckPath:     i.CheckPath,
 185  		CheckBody:     i.CheckBody,
 186  		CheckPassive:  copyBool(&i.CheckPassive),
 187  		UDPCheckPort:  udpCheckPort,
 188  		CipherSuite:   i.CipherSuite,
 189  		SSLCert:       i.SSLCert,
 190  		SSLKey:        i.SSLKey,
 191  	}
 192  }
 193  
 194  // GetUpdateOptions converts a NodeBalancerConfig to NodeBalancerConfigUpdateOptions for use in UpdateNodeBalancerConfig
 195  func (i NodeBalancerConfig) GetUpdateOptions() NodeBalancerConfigUpdateOptions {
 196  	var udpCheckPort *int
 197  	if i.UDPCheckPort != 0 {
 198  		udpCheckPort = &i.UDPCheckPort
 199  	}
 200  
 201  	return NodeBalancerConfigUpdateOptions{
 202  		Port:          i.Port,
 203  		Protocol:      i.Protocol,
 204  		ProxyProtocol: i.ProxyProtocol,
 205  		Algorithm:     i.Algorithm,
 206  		Stickiness:    i.Stickiness,
 207  		Check:         i.Check,
 208  		CheckInterval: i.CheckInterval,
 209  		CheckAttempts: i.CheckAttempts,
 210  		CheckPath:     i.CheckPath,
 211  		CheckBody:     i.CheckBody,
 212  		CheckPassive:  copyBool(&i.CheckPassive),
 213  		CheckTimeout:  i.CheckTimeout,
 214  		UDPCheckPort:  udpCheckPort,
 215  		CipherSuite:   i.CipherSuite,
 216  		SSLCert:       i.SSLCert,
 217  		SSLKey:        i.SSLKey,
 218  	}
 219  }
 220  
 221  // GetRebuildOptions converts a NodeBalancerConfig to NodeBalancerConfigRebuildOptions for use in RebuildNodeBalancerConfig
 222  func (i NodeBalancerConfig) GetRebuildOptions() NodeBalancerConfigRebuildOptions {
 223  	var udpCheckPort *int
 224  	if i.UDPCheckPort != 0 {
 225  		udpCheckPort = &i.UDPCheckPort
 226  	}
 227  
 228  	return NodeBalancerConfigRebuildOptions{
 229  		Port:          i.Port,
 230  		Protocol:      i.Protocol,
 231  		ProxyProtocol: i.ProxyProtocol,
 232  		Algorithm:     i.Algorithm,
 233  		Stickiness:    i.Stickiness,
 234  		Check:         i.Check,
 235  		CheckInterval: i.CheckInterval,
 236  		CheckAttempts: i.CheckAttempts,
 237  		CheckTimeout:  i.CheckTimeout,
 238  		CheckPath:     i.CheckPath,
 239  		CheckBody:     i.CheckBody,
 240  		CheckPassive:  copyBool(&i.CheckPassive),
 241  		UDPCheckPort:  udpCheckPort,
 242  		CipherSuite:   i.CipherSuite,
 243  		SSLCert:       i.SSLCert,
 244  		SSLKey:        i.SSLKey,
 245  		Nodes:         make([]NodeBalancerConfigRebuildNodeOptions, 0),
 246  	}
 247  }
 248  
 249  // ListNodeBalancerConfigs lists NodeBalancerConfigs
 250  func (c *Client) ListNodeBalancerConfigs(ctx context.Context, nodebalancerID int, opts *ListOptions) ([]NodeBalancerConfig, error) {
 251  	return getPaginatedResults[NodeBalancerConfig](ctx, c, formatAPIPath("nodebalancers/%d/configs", nodebalancerID), opts)
 252  }
 253  
 254  // GetNodeBalancerConfig gets the template with the provided ID
 255  func (c *Client) GetNodeBalancerConfig(ctx context.Context, nodebalancerID int, configID int) (*NodeBalancerConfig, error) {
 256  	e := formatAPIPath("nodebalancers/%d/configs/%d", nodebalancerID, configID)
 257  	return doGETRequest[NodeBalancerConfig](ctx, c, e)
 258  }
 259  
 260  // CreateNodeBalancerConfig creates a NodeBalancerConfig
 261  func (c *Client) CreateNodeBalancerConfig(ctx context.Context, nodebalancerID int, opts NodeBalancerConfigCreateOptions) (*NodeBalancerConfig, error) {
 262  	e := formatAPIPath("nodebalancers/%d/configs", nodebalancerID)
 263  	return doPOSTRequest[NodeBalancerConfig](ctx, c, e, opts)
 264  }
 265  
 266  // UpdateNodeBalancerConfig updates the NodeBalancerConfig with the specified id
 267  func (c *Client) UpdateNodeBalancerConfig(
 268  	ctx context.Context,
 269  	nodebalancerID int,
 270  	configID int,
 271  	opts NodeBalancerConfigUpdateOptions,
 272  ) (*NodeBalancerConfig, error) {
 273  	e := formatAPIPath("nodebalancers/%d/configs/%d", nodebalancerID, configID)
 274  	return doPUTRequest[NodeBalancerConfig](ctx, c, e, opts)
 275  }
 276  
 277  // DeleteNodeBalancerConfig deletes the NodeBalancerConfig with the specified id
 278  func (c *Client) DeleteNodeBalancerConfig(ctx context.Context, nodebalancerID int, configID int) error {
 279  	e := formatAPIPath("nodebalancers/%d/configs/%d", nodebalancerID, configID)
 280  	return doDELETERequest(ctx, c, e)
 281  }
 282  
 283  // RebuildNodeBalancerConfig updates the NodeBalancer with the specified id
 284  func (c *Client) RebuildNodeBalancerConfig(
 285  	ctx context.Context,
 286  	nodeBalancerID int,
 287  	configID int,
 288  	opts NodeBalancerConfigRebuildOptions,
 289  ) (*NodeBalancerConfig, error) {
 290  	e := formatAPIPath("nodebalancers/%d/configs/%d/rebuild", nodeBalancerID, configID)
 291  	return doPOSTRequest[NodeBalancerConfig](ctx, c, e, opts)
 292  }
 293