NodeBalancerConfig   A
last analyzed

Complexity

Total Complexity 1

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 1
eloc 44
c 0
b 0
f 0
dl 0
loc 66
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
A __get() 0 6 1
1
<?php
2
3
// ---------------------------------------------------------------------
4
//
5
//  Copyright (C) 2018-2024 Artem Rodygin
6
//
7
//  You should have received a copy of the MIT License along with
8
//  this file. If not, see <https://opensource.org/licenses/MIT>.
9
//
10
// ---------------------------------------------------------------------
11
12
namespace Linode\NodeBalancers;
13
14
use Linode\Entity;
15
use Linode\NodeBalancers\Repository\NodeBalancerNodeRepository;
16
17
/**
18
 * A NodeBalancer config represents the configuration of this NodeBalancer on a
19
 * single port. For example, a NodeBalancer Config on port 80 would typically
20
 * represent how this NodeBalancer response to HTTP requests.
21
 *
22
 * NodeBalancer configs have a list of backends, called "nodes," that they forward
23
 * requests between based on their configuration.
24
 *
25
 * @property int                                 $id              This config's unique ID
26
 * @property int                                 $port            The port this Config is for. These values must be unique across configs on a
27
 *                                                                single NodeBalancer (you can't have two configs for port 80, for example). While
28
 *                                                                some ports imply some protocols, no enforcement is done and you may configure your
29
 *                                                                NodeBalancer however is useful to you. For example, while port 443 is generally
30
 *                                                                used for HTTPS, you do not need SSL configured to have a NodeBalancer listening on
31
 *                                                                port 443.
32
 * @property string                              $protocol        The protocol this port is configured to serve.
33
 *                                                                * The `http` and `tcp` protocols do not support `ssl_cert` and `ssl_key`.
34
 *                                                                * The `https` protocol is mutually required with `ssl_cert` and `ssl_key`.
35
 *                                                                Review our guide on Available Protocols for information on protocol features.
36
 * @property string                              $algorithm       What algorithm this NodeBalancer should use for routing traffic to backends.
37
 * @property string                              $stickiness      Controls how session stickiness is handled on this port.
38
 *                                                                * If set to `none` connections will always be assigned a backend based on the
39
 *                                                                algorithm configured.
40
 *                                                                * If set to `table` sessions from the same remote address will be routed to the
41
 *                                                                same
42
 *                                                                backend.
43
 *                                                                * For HTTP or HTTPS clients, `http_cookie` allows sessions to be
44
 *                                                                routed to the same backend based on a cookie set by the NodeBalancer.
45
 * @property string                              $check           The type of check to perform against backends to ensure they are serving requests.
46
 *                                                                This is used to determine if backends are up or down.
47
 *                                                                * If `none` no check is performed.
48
 *                                                                * `connection` requires only a connection to the backend to succeed.
49
 *                                                                * `http` and `http_body` rely on the backend serving HTTP, and that
50
 *                                                                the response returned matches what is expected.
51
 * @property int                                 $check_interval  How often, in seconds, to check that backends are up and serving requests.
52
 *                                                                Must be greater than `check_timeout`.
53
 * @property int                                 $check_timeout   How long, in seconds, to wait for a check attempt before considering it failed.
54
 *                                                                Must be less than `check_interval`.
55
 * @property int                                 $check_attempts  How many times to attempt a check before considering a backend to be down.
56
 * @property string                              $check_path      The URL path to check on each backend. If the backend does not respond to this
57
 *                                                                request it is considered to be down.
58
 * @property string                              $check_body      This value must be present in the response body of the check in order for it to
59
 *                                                                pass. If this value is not present in the response body of a check request, the
60
 *                                                                backend is considered to be down.
61
 * @property bool                                $check_passive   If true, any response from this backend with a `5xx` status code will be enough
62
 *                                                                for it to be considered unhealthy and taken out of rotation.
63
 * @property string                              $cipher_suite    What ciphers to use for SSL connections served by this NodeBalancer.
64
 *                                                                * `legacy` is considered insecure and should only be used if necessary.
65
 * @property string                              $ssl_commonname  The read-only common name automatically derived from the SSL certificate assigned
66
 *                                                                to this NodeBalancerConfig. Please refer to this field to verify that the
67
 *                                                                appropriate certificate is assigned to your NodeBalancerConfig.
68
 * @property string                              $ssl_fingerprint The read-only SHA1-encoded fingerprint automatically derived from the SSL
69
 *                                                                certificate assigned to this NodeBalancerConfig. Please refer to this field to
70
 *                                                                verify that the appropriate certificate is assigned to your NodeBalancerConfig.
71
 * @property null|string                         $ssl_cert        The PEM-formatted public SSL certificate (or the combined PEM-formatted SSL
72
 *                                                                certificate and Certificate Authority chain) that should be served on this
73
 *                                                                NodeBalancerConfig's port.
74
 *                                                                Line breaks must be represented as "\n" in the string for requests (but not when
75
 *                                                                using the Linode CLI).
76
 *                                                                Diffie-Hellman Parameters can be included in this value to enable forward secrecy.
77
 *                                                                The contents of this field will not be shown in any responses that display
78
 *                                                                the NodeBalancerConfig. Instead, `<REDACTED>` will be printed where the field
79
 *                                                                appears.
80
 *                                                                The read-only `ssl_commonname` and `ssl_fingerprint` fields in a
81
 *                                                                NodeBalancerConfig
82
 *                                                                response are automatically derived from your certificate. Please refer to these
83
 *                                                                fields to
84
 *                                                                verify that the appropriate certificate was assigned to your NodeBalancerConfig.
85
 * @property null|string                         $ssl_key         The PEM-formatted private key for the SSL certificate set in the `ssl_cert` field.
86
 *                                                                Line breaks must be represented as "\n" in the string for requests (but not when
87
 *                                                                using the Linode CLI).
88
 *                                                                The contents of this field will not be shown in any responses that display
89
 *                                                                the NodeBalancerConfig. Instead, `<REDACTED>` will be printed where the field
90
 *                                                                appears.
91
 *                                                                The read-only `ssl_commonname` and `ssl_fingerprint` fields in a
92
 *                                                                NodeBalancerConfig
93
 *                                                                response are automatically derived from your certificate. Please refer to these
94
 *                                                                fields to
95
 *                                                                verify that the appropriate certificate was assigned to your NodeBalancerConfig.
96
 * @property NodesStatus                         $nodes_status    A structure containing information about the health of the backends for this port.
97
 *                                                                This information is updated periodically as checks are performed against backends.
98
 * @property string                              $proxy_protocol  ProxyProtocol is a TCP extension that sends initial TCP connection information
99
 *                                                                such as source/destination IPs and ports to backend devices. This information
100
 *                                                                would be lost otherwise. Backend devices must be configured to work with
101
 *                                                                ProxyProtocol if enabled.
102
 *                                                                * If ommited, or set to `none`, the NodeBalancer doesn't send any auxilary data
103
 *                                                                over TCP connections. This is the default.
104
 *                                                                * If set to `v1`, the human-readable header format (Version 1) is used. Requires
105
 *                                                                `tcp` protocol.
106
 *                                                                * If set to `v2`, the binary header format (Version 2) is used. Requires `tcp`
107
 *                                                                protocol.
108
 * @property int                                 $nodebalancer_id The ID for the NodeBalancer this config belongs to.
109
 * @property NodeBalancerNodeRepositoryInterface $nodes           NodeBalancer nodes.
110
 */
111
class NodeBalancerConfig extends Entity
112
{
113
    // Available fields.
114
    public const FIELD_ID              = 'id';
115
    public const FIELD_PORT            = 'port';
116
    public const FIELD_PROTOCOL        = 'protocol';
117
    public const FIELD_ALGORITHM       = 'algorithm';
118
    public const FIELD_STICKINESS      = 'stickiness';
119
    public const FIELD_CHECK           = 'check';
120
    public const FIELD_CHECK_INTERVAL  = 'check_interval';
121
    public const FIELD_CHECK_TIMEOUT   = 'check_timeout';
122
    public const FIELD_CHECK_ATTEMPTS  = 'check_attempts';
123
    public const FIELD_CHECK_PATH      = 'check_path';
124
    public const FIELD_CHECK_BODY      = 'check_body';
125
    public const FIELD_CHECK_PASSIVE   = 'check_passive';
126
    public const FIELD_CIPHER_SUITE    = 'cipher_suite';
127
    public const FIELD_SSL_COMMONNAME  = 'ssl_commonname';
128
    public const FIELD_SSL_FINGERPRINT = 'ssl_fingerprint';
129
    public const FIELD_SSL_CERT        = 'ssl_cert';
130
    public const FIELD_SSL_KEY         = 'ssl_key';
131
    public const FIELD_NODES_STATUS    = 'nodes_status';
132
    public const FIELD_PROXY_PROTOCOL  = 'proxy_protocol';
133
    public const FIELD_NODEBALANCER_ID = 'nodebalancer_id';
134
135
    // Extra fields for POST/PUT requests.
136
    public const FIELD_NODES = 'nodes';
137
138
    // `FIELD_PROTOCOL` values.
139
    public const PROTOCOL_HTTP  = 'http';
140
    public const PROTOCOL_HTTPS = 'https';
141
    public const PROTOCOL_TCP   = 'tcp';
142
143
    // `FIELD_ALGORITHM` values.
144
    public const ALGORITHM_ROUNDROBIN = 'roundrobin';
145
    public const ALGORITHM_LEASTCONN  = 'leastconn';
146
    public const ALGORITHM_SOURCE     = 'source';
147
148
    // `FIELD_STICKINESS` values.
149
    public const STICKINESS_NONE        = 'none';
150
    public const STICKINESS_TABLE       = 'table';
151
    public const STICKINESS_HTTP_COOKIE = 'http_cookie';
152
153
    // `FIELD_CHECK` values.
154
    public const CHECK_NONE       = 'none';
155
    public const CHECK_CONNECTION = 'connection';
156
    public const CHECK_HTTP       = 'http';
157
    public const CHECK_HTTP_BODY  = 'http_body';
158
159
    // `FIELD_CIPHER_SUITE` values.
160
    public const CIPHER_SUITE_RECOMMENDED = 'recommended';
161
    public const CIPHER_SUITE_LEGACY      = 'legacy';
162
163
    // `FIELD_PROXY_PROTOCOL` values.
164
    public const PROXY_PROTOCOL_NONE = 'none';
165
    public const PROXY_PROTOCOL_V1   = 'v1';
166
    public const PROXY_PROTOCOL_V2   = 'v2';
167
168
    /**
169
     * @codeCoverageIgnore This method was autogenerated.
170
     */
171
    public function __get(string $name): mixed
172
    {
173
        return match ($name) {
174
            self::FIELD_NODES_STATUS => new NodesStatus($this->client, $this->data[$name]),
175
            self::FIELD_NODES        => new NodeBalancerNodeRepository($this->client, $this->nodebalancer_id, $this->id),
176
            default                  => parent::__get($name),
177
        };
178
    }
179
}
180