github.com/sacloud/iaas-api-go@v1.12.0/fake/ops_proxy_lb.go (about) 1 // Copyright 2022-2023 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 }