ops_proxy_lb.go raw
1 // Copyright 2022-2025 The sacloud/iaas-api-go Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package fake
16
17 import (
18 "context"
19 "net"
20 "time"
21
22 "github.com/sacloud/iaas-api-go"
23 "github.com/sacloud/iaas-api-go/types"
24 )
25
26 // Find is fake implementation
27 func (o *ProxyLBOp) Find(ctx context.Context, conditions *iaas.FindCondition) (*iaas.ProxyLBFindResult, error) {
28 results, _ := find(o.key, iaas.APIDefaultZone, conditions)
29 var values []*iaas.ProxyLB
30 for _, res := range results {
31 dest := &iaas.ProxyLB{}
32 copySameNameField(res, dest)
33 values = append(values, dest)
34 }
35 return &iaas.ProxyLBFindResult{
36 Total: len(results),
37 Count: len(results),
38 From: 0,
39 ProxyLBs: values,
40 }, nil
41 }
42
43 // Create is fake implementation
44 func (o *ProxyLBOp) Create(ctx context.Context, param *iaas.ProxyLBCreateRequest) (*iaas.ProxyLB, error) {
45 result := &iaas.ProxyLB{}
46 copySameNameField(param, result)
47 fill(result, fillID, fillCreatedAt)
48
49 result.Availability = types.Availabilities.Available
50
51 vip := pool().nextSharedIP()
52 vipNet := net.IPNet{IP: vip, Mask: []byte{255, 255, 255, 0}}
53 result.ProxyNetworks = []string{vipNet.String()}
54 if param.UseVIPFailover {
55 result.FQDN = "fake.proxylb.sakura.ne.jp"
56 }
57 if result.SorryServer == nil {
58 result.SorryServer = &iaas.ProxyLBSorryServer{}
59 }
60 if result.Timeout == nil {
61 result.Timeout = &iaas.ProxyLBTimeout{}
62 }
63 if result.Timeout.InactiveSec == 0 {
64 result.Timeout.InactiveSec = 10
65 }
66
67 status := &iaas.ProxyLBHealth{
68 ActiveConn: 10,
69 CPS: 10,
70 CurrentVIP: vip.String(),
71 }
72 for _, server := range param.Servers {
73 status.Servers = append(status.Servers, &iaas.LoadBalancerServerStatus{
74 ActiveConn: 10,
75 Status: types.ServerInstanceStatuses.Up,
76 IPAddress: server.IPAddress,
77 Port: types.StringNumber(server.Port),
78 CPS: 10,
79 })
80 }
81 ds().Put(ResourceProxyLB+"Status", iaas.APIDefaultZone, result.ID, status)
82
83 putProxyLB(iaas.APIDefaultZone, result)
84 return result, nil
85 }
86
87 // Read is fake implementation
88 func (o *ProxyLBOp) Read(ctx context.Context, id types.ID) (*iaas.ProxyLB, error) {
89 value := getProxyLBByID(iaas.APIDefaultZone, id)
90 if value == nil {
91 return nil, newErrorNotFound(o.key, id)
92 }
93 dest := &iaas.ProxyLB{}
94 copySameNameField(value, dest)
95 return dest, nil
96 }
97
98 // Update is fake implementation
99 func (o *ProxyLBOp) Update(ctx context.Context, id types.ID, param *iaas.ProxyLBUpdateRequest) (*iaas.ProxyLB, error) {
100 value, err := o.Read(ctx, id)
101 if err != nil {
102 return nil, err
103 }
104 copySameNameField(param, value)
105 fill(value, fillModifiedAt)
106 if value.SorryServer == nil {
107 value.SorryServer = &iaas.ProxyLBSorryServer{}
108 }
109 if value.Timeout == nil {
110 value.Timeout = &iaas.ProxyLBTimeout{}
111 }
112 if value.Timeout.InactiveSec == 0 {
113 value.Timeout.InactiveSec = 10
114 }
115 putProxyLB(iaas.APIDefaultZone, value)
116
117 status := ds().Get(ResourceProxyLB+"Status", iaas.APIDefaultZone, id).(*iaas.ProxyLBHealth)
118 status.Servers = []*iaas.LoadBalancerServerStatus{}
119 for _, server := range param.Servers {
120 status.Servers = append(status.Servers, &iaas.LoadBalancerServerStatus{
121 ActiveConn: 10,
122 Status: types.ServerInstanceStatuses.Up,
123 IPAddress: server.IPAddress,
124 Port: types.StringNumber(server.Port),
125 CPS: 10,
126 })
127 }
128 ds().Put(ResourceProxyLB+"Status", iaas.APIDefaultZone, id, status)
129
130 return value, nil
131 }
132
133 // UpdateSettings is fake implementation
134 func (o *ProxyLBOp) UpdateSettings(ctx context.Context, id types.ID, param *iaas.ProxyLBUpdateSettingsRequest) (*iaas.ProxyLB, error) {
135 value, err := o.Read(ctx, id)
136 if err != nil {
137 return nil, err
138 }
139 copySameNameField(param, value)
140 fill(value, fillModifiedAt)
141 if value.SorryServer == nil {
142 value.SorryServer = &iaas.ProxyLBSorryServer{}
143 }
144 if value.Timeout == nil {
145 value.Timeout = &iaas.ProxyLBTimeout{}
146 }
147 if value.Timeout.InactiveSec == 0 {
148 value.Timeout.InactiveSec = 10
149 }
150 putProxyLB(iaas.APIDefaultZone, value)
151
152 status := ds().Get(ResourceProxyLB+"Status", iaas.APIDefaultZone, id).(*iaas.ProxyLBHealth)
153 status.Servers = []*iaas.LoadBalancerServerStatus{}
154 for _, server := range param.Servers {
155 status.Servers = append(status.Servers, &iaas.LoadBalancerServerStatus{
156 ActiveConn: 10,
157 Status: types.ServerInstanceStatuses.Up,
158 IPAddress: server.IPAddress,
159 Port: types.StringNumber(server.Port),
160 CPS: 10,
161 })
162 }
163 ds().Put(ResourceProxyLB+"Status", iaas.APIDefaultZone, id, status)
164
165 return value, nil
166 }
167
168 // Delete is fake implementation
169 func (o *ProxyLBOp) Delete(ctx context.Context, id types.ID) error {
170 _, err := o.Read(ctx, id)
171 if err != nil {
172 return err
173 }
174
175 ds().Delete(ResourceProxyLB+"Status", iaas.APIDefaultZone, id)
176 ds().Delete(ResourceProxyLB+"Certs", iaas.APIDefaultZone, id)
177 ds().Delete(o.key, iaas.APIDefaultZone, id)
178
179 return nil
180 }
181
182 // ChangePlan is fake implementation
183 func (o *ProxyLBOp) ChangePlan(ctx context.Context, id types.ID, param *iaas.ProxyLBChangePlanRequest) (*iaas.ProxyLB, error) {
184 value, err := o.Read(ctx, id)
185 if err != nil {
186 return nil, err
187 }
188
189 value.Plan = types.ProxyLBPlanFromServiceClass(param.ServiceClass)
190 putProxyLB(iaas.APIDefaultZone, value)
191
192 return value, err
193 }
194
195 // GetCertificates is fake implementation
196 func (o *ProxyLBOp) GetCertificates(ctx context.Context, id types.ID) (*iaas.ProxyLBCertificates, error) {
197 _, err := o.Read(ctx, id)
198 if err != nil {
199 return nil, err
200 }
201
202 v := ds().Get(ResourceProxyLB+"Certs", iaas.APIDefaultZone, id)
203 if v != nil {
204 return v.(*iaas.ProxyLBCertificates), nil
205 }
206
207 return nil, err
208 }
209
210 // SetCertificates is fake implementation
211 func (o *ProxyLBOp) SetCertificates(ctx context.Context, id types.ID, param *iaas.ProxyLBSetCertificatesRequest) (*iaas.ProxyLBCertificates, error) {
212 _, err := o.Read(ctx, id)
213 if err != nil {
214 return nil, err
215 }
216
217 cert := &iaas.ProxyLBCertificates{}
218 copySameNameField(param, cert)
219 cert.PrimaryCert.CertificateCommonName = "dummy-common-name.org"
220 cert.PrimaryCert.CertificateEndDate = time.Now().Add(365 * 24 * time.Hour)
221
222 ds().Put(ResourceProxyLB+"Certs", iaas.APIDefaultZone, id, cert)
223 return cert, nil
224 }
225
226 // DeleteCertificates is fake implementation
227 func (o *ProxyLBOp) DeleteCertificates(ctx context.Context, id types.ID) error {
228 _, err := o.Read(ctx, id)
229 if err != nil {
230 return err
231 }
232
233 v := ds().Get(ResourceProxyLB+"Certs", iaas.APIDefaultZone, id)
234 if v != nil {
235 ds().Delete(ResourceProxyLB+"Certs", iaas.APIDefaultZone, id)
236 }
237 return nil
238 }
239
240 // RenewLetsEncryptCert is fake implementation
241 func (o *ProxyLBOp) RenewLetsEncryptCert(ctx context.Context, id types.ID) error {
242 return nil
243 }
244
245 // HealthStatus is fake implementation
246 func (o *ProxyLBOp) HealthStatus(ctx context.Context, id types.ID) (*iaas.ProxyLBHealth, error) {
247 _, err := o.Read(ctx, id)
248 if err != nil {
249 return nil, err
250 }
251
252 return ds().Get(ResourceProxyLB+"Status", iaas.APIDefaultZone, id).(*iaas.ProxyLBHealth), nil
253 }
254
255 // MonitorConnection is fake implementation
256 func (o *ProxyLBOp) MonitorConnection(ctx context.Context, id types.ID, condition *iaas.MonitorCondition) (*iaas.ConnectionActivity, error) {
257 _, err := o.Read(ctx, id)
258 if err != nil {
259 return nil, err
260 }
261
262 now := time.Now().Truncate(time.Second)
263 m := now.Minute() % 5
264 if m != 0 {
265 now.Add(time.Duration(m) * time.Minute)
266 }
267
268 res := &iaas.ConnectionActivity{}
269 for i := 0; i < 5; i++ {
270 res.Values = append(res.Values, &iaas.MonitorConnectionValue{
271 Time: now.Add(time.Duration(i*-5) * time.Minute),
272 ConnectionsPerSec: float64(random(1000)),
273 ActiveConnections: float64(random(1000)),
274 })
275 }
276
277 return res, nil
278 }
279