github.com/sacloud/iaas-api-go@v1.12.0/fake/ops_mobile_gateway.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 "fmt" 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 *MobileGatewayOp) Find(ctx context.Context, zone string, conditions *iaas.FindCondition) (*iaas.MobileGatewayFindResult, error) { 28 results, _ := find(o.key, zone, conditions) 29 var values []*iaas.MobileGateway 30 for _, res := range results { 31 dest := &iaas.MobileGateway{} 32 copySameNameField(res, dest) 33 values = append(values, dest) 34 } 35 return &iaas.MobileGatewayFindResult{ 36 Total: len(results), 37 Count: len(results), 38 From: 0, 39 MobileGateways: values, 40 }, nil 41 } 42 43 // Create is fake implementation 44 func (o *MobileGatewayOp) Create(ctx context.Context, zone string, param *iaas.MobileGatewayCreateRequest) (*iaas.MobileGateway, error) { 45 result := &iaas.MobileGateway{} 46 copySameNameField(param, result) 47 fill(result, fillID, fillCreatedAt) 48 49 result.Availability = types.Availabilities.Available 50 result.Class = "mobilegateway" 51 result.ZoneID = zoneIDs[zone] 52 result.SettingsHash = "" 53 54 // set interface 55 ifOp := NewInterfaceOp() 56 iface, err := ifOp.Create(ctx, zone, &iaas.InterfaceCreateRequest{ServerID: result.ID}) 57 if err != nil { 58 return nil, newErrorConflict(o.key, types.ID(0), err.Error()) 59 } 60 if err := ifOp.ConnectToSharedSegment(ctx, zone, iface.ID); err != nil { 61 return nil, newErrorConflict(o.key, types.ID(0), err.Error()) 62 } 63 iface, err = ifOp.Read(ctx, zone, iface.ID) 64 if err != nil { 65 return nil, newErrorConflict(o.key, types.ID(0), err.Error()) 66 } 67 ifaceView := &iaas.MobileGatewayInterface{} 68 copySameNameField(iface, ifaceView) 69 result.Interfaces = append(result.Interfaces, ifaceView) 70 71 putMobileGateway(zone, result) 72 return result, nil 73 } 74 75 // Read is fake implementation 76 func (o *MobileGatewayOp) Read(ctx context.Context, zone string, id types.ID) (*iaas.MobileGateway, error) { 77 value := getMobileGatewayByID(zone, id) 78 if value == nil { 79 return nil, newErrorNotFound(o.key, id) 80 } 81 dest := &iaas.MobileGateway{} 82 copySameNameField(value, dest) 83 return dest, nil 84 } 85 86 // Update is fake implementation 87 func (o *MobileGatewayOp) Update(ctx context.Context, zone string, id types.ID, param *iaas.MobileGatewayUpdateRequest) (*iaas.MobileGateway, error) { 88 value, err := o.Read(ctx, zone, id) 89 if err != nil { 90 return nil, err 91 } 92 copySameNameField(param, value) 93 fill(value, fillModifiedAt) 94 95 putMobileGateway(zone, value) 96 return value, nil 97 } 98 99 // UpdateSettings is fake implementation 100 func (o *MobileGatewayOp) UpdateSettings(ctx context.Context, zone string, id types.ID, param *iaas.MobileGatewayUpdateSettingsRequest) (*iaas.MobileGateway, error) { 101 value, err := o.Read(ctx, zone, id) 102 if err != nil { 103 return nil, err 104 } 105 copySameNameField(param, value) 106 fill(value, fillModifiedAt) 107 108 putMobileGateway(zone, value) 109 return value, nil 110 } 111 112 // Delete is fake implementation 113 func (o *MobileGatewayOp) Delete(ctx context.Context, zone string, id types.ID) error { 114 _, err := o.Read(ctx, zone, id) 115 if err != nil { 116 return err 117 } 118 119 ds().Delete(o.key, zone, id) 120 return nil 121 } 122 123 // Config is fake implementation 124 func (o *MobileGatewayOp) Config(ctx context.Context, zone string, id types.ID) error { 125 _, err := o.Read(ctx, zone, id) 126 return err 127 } 128 129 // Boot is fake implementation 130 func (o *MobileGatewayOp) Boot(ctx context.Context, zone string, id types.ID) error { 131 value, err := o.Read(ctx, zone, id) 132 if err != nil { 133 return err 134 } 135 if value.InstanceStatus.IsUp() { 136 return newErrorConflict(o.key, id, "Boot is failed") 137 } 138 139 startPowerOn(o.key, zone, func() (interface{}, error) { 140 return o.Read(context.Background(), zone, id) 141 }) 142 143 return err 144 } 145 146 // Shutdown is fake implementation 147 func (o *MobileGatewayOp) Shutdown(ctx context.Context, zone string, id types.ID, shutdownOption *iaas.ShutdownOption) error { 148 value, err := o.Read(ctx, zone, id) 149 if err != nil { 150 return err 151 } 152 if !value.InstanceStatus.IsUp() { 153 return newErrorConflict(o.key, id, "Shutdown is failed") 154 } 155 156 startPowerOff(o.key, zone, func() (interface{}, error) { 157 return o.Read(context.Background(), zone, id) 158 }) 159 160 return err 161 } 162 163 // Reset is fake implementation 164 func (o *MobileGatewayOp) Reset(ctx context.Context, zone string, id types.ID) error { 165 value, err := o.Read(ctx, zone, id) 166 if err != nil { 167 return err 168 } 169 if !value.InstanceStatus.IsUp() { 170 return newErrorConflict(o.key, id, "Reset is failed") 171 } 172 173 startPowerOn(o.key, zone, func() (interface{}, error) { 174 return o.Read(context.Background(), zone, id) 175 }) 176 177 return nil 178 } 179 180 // ConnectToSwitch is fake implementation 181 func (o *MobileGatewayOp) ConnectToSwitch(ctx context.Context, zone string, id types.ID, switchID types.ID) error { 182 value, err := o.Read(ctx, zone, id) 183 if err != nil { 184 return err 185 } 186 187 for _, nic := range value.Interfaces { 188 if nic.Index == 1 { 189 return newErrorBadRequest(o.key, id, fmt.Sprintf("nic[%d] already connected to switch", 1)) 190 } 191 } 192 193 // find switch 194 swOp := NewSwitchOp() 195 _, err = swOp.Read(ctx, zone, switchID) 196 if err != nil { 197 return fmt.Errorf("ConnectToSwitch is failed: %s", err) 198 } 199 200 // create interface 201 ifOp := NewInterfaceOp() 202 iface, err := ifOp.Create(ctx, zone, &iaas.InterfaceCreateRequest{ServerID: id}) 203 if err != nil { 204 return newErrorConflict(o.key, types.ID(0), err.Error()) 205 } 206 207 if err := ifOp.ConnectToSwitch(ctx, zone, iface.ID, switchID); err != nil { 208 return newErrorConflict(o.key, types.ID(0), err.Error()) 209 } 210 211 iface, err = ifOp.Read(ctx, zone, iface.ID) 212 if err != nil { 213 return newErrorConflict(o.key, types.ID(0), err.Error()) 214 } 215 216 mobileGatewayInterface := &iaas.MobileGatewayInterface{} 217 copySameNameField(iface, mobileGatewayInterface) 218 mobileGatewayInterface.Index = 1 // 1固定 219 value.Interfaces = append(value.Interfaces, mobileGatewayInterface) 220 221 putMobileGateway(zone, value) 222 return nil 223 } 224 225 // DisconnectFromSwitch is fake implementation 226 func (o *MobileGatewayOp) DisconnectFromSwitch(ctx context.Context, zone string, id types.ID) error { 227 value, err := o.Read(ctx, zone, id) 228 if err != nil { 229 return err 230 } 231 232 var exists bool 233 var nicID types.ID 234 var interfaces []*iaas.MobileGatewayInterface 235 236 for _, nic := range value.Interfaces { 237 if nic != nil && nic.Index == 1 { 238 exists = true 239 nicID = nic.ID 240 } else { 241 interfaces = append(interfaces, nic) 242 } 243 } 244 if !exists { 245 return newErrorBadRequest(o.key, id, fmt.Sprintf("nic[%d] is not exists", 1)) 246 } 247 248 ifOp := NewInterfaceOp() 249 if err := ifOp.DisconnectFromSwitch(ctx, zone, nicID); err != nil { 250 return newErrorConflict(o.key, types.ID(0), err.Error()) 251 } 252 253 value.Interfaces = interfaces 254 putMobileGateway(zone, value) 255 return nil 256 } 257 258 // GetDNS is fake implementation 259 func (o *MobileGatewayOp) GetDNS(ctx context.Context, zone string, id types.ID) (*iaas.MobileGatewayDNSSetting, error) { 260 _, err := o.Read(ctx, zone, id) 261 if err != nil { 262 return nil, err 263 } 264 265 dns := ds().Get(o.dnsStoreKey(), zone, id) 266 if dns == nil { 267 return &iaas.MobileGatewayDNSSetting{ 268 DNS1: "133.242.0.1", 269 DNS2: "133.242.0.2", 270 }, nil 271 } 272 return dns.(*iaas.MobileGatewayDNSSetting), nil 273 } 274 275 // SetDNS is fake implementation 276 func (o *MobileGatewayOp) SetDNS(ctx context.Context, zone string, id types.ID, param *iaas.MobileGatewayDNSSetting) error { 277 _, err := o.Read(ctx, zone, id) 278 if err != nil { 279 return err 280 } 281 282 ds().Put(o.dnsStoreKey(), zone, id, param) 283 return nil 284 } 285 286 // GetSIMRoutes is fake implementation 287 func (o *MobileGatewayOp) GetSIMRoutes(ctx context.Context, zone string, id types.ID) (iaas.MobileGatewaySIMRoutes, error) { 288 _, err := o.Read(ctx, zone, id) 289 if err != nil { 290 return nil, err 291 } 292 293 routes := ds().Get(o.simRoutesStoreKey(), zone, id) 294 if routes == nil { 295 return nil, nil 296 } 297 298 rs := routes.(*[]*iaas.MobileGatewaySIMRoute) 299 var res []*iaas.MobileGatewaySIMRoute 300 res = append(res, *rs...) 301 return res, nil 302 } 303 304 // SetSIMRoutes is fake implementation 305 func (o *MobileGatewayOp) SetSIMRoutes(ctx context.Context, zone string, id types.ID, param []*iaas.MobileGatewaySIMRouteParam) error { 306 _, err := o.Read(ctx, zone, id) 307 if err != nil { 308 return err 309 } 310 311 simOp := NewSIMOp() 312 var values []*iaas.MobileGatewaySIMRoute 313 for _, p := range param { 314 sim, err := simOp.Read(ctx, types.StringID(p.ResourceID)) 315 if err != nil { 316 return err 317 } 318 values = append(values, &iaas.MobileGatewaySIMRoute{ 319 ResourceID: p.ResourceID, 320 Prefix: p.Prefix, 321 ICCID: sim.ICCID, 322 }) 323 } 324 325 ds().Put(o.simRoutesStoreKey(), zone, id, &values) 326 return nil 327 } 328 329 // ListSIM is fake implementation 330 func (o *MobileGatewayOp) ListSIM(ctx context.Context, zone string, id types.ID) (iaas.MobileGatewaySIMs, error) { 331 _, err := o.Read(ctx, zone, id) 332 if err != nil { 333 return nil, err 334 } 335 336 sims := ds().Get(o.simsStoreKey(), zone, id) 337 if sims == nil { 338 return nil, nil 339 } 340 341 ss := sims.(*[]*iaas.MobileGatewaySIMInfo) 342 var res []*iaas.MobileGatewaySIMInfo 343 res = append(res, *ss...) 344 return res, nil 345 } 346 347 // AddSIM is fake implementation 348 func (o *MobileGatewayOp) AddSIM(ctx context.Context, zone string, id types.ID, param *iaas.MobileGatewayAddSIMRequest) error { 349 _, err := o.Read(ctx, zone, id) 350 if err != nil { 351 return err 352 } 353 354 var sims []*iaas.MobileGatewaySIMInfo 355 rawSIMs := ds().Get(o.simsStoreKey(), zone, id) 356 if rawSIMs != nil { 357 sims = rawSIMs.([]*iaas.MobileGatewaySIMInfo) 358 for _, sim := range sims { 359 if sim.ResourceID == param.SIMID { 360 return newErrorBadRequest(o.key, id, fmt.Sprintf("SIM %s already exists", param.SIMID)) 361 } 362 } 363 } 364 365 simOp := NewSIMOp() 366 simInfo, err := simOp.Status(context.Background(), types.StringID(param.SIMID)) 367 if err != nil { 368 return err 369 } 370 sim := &iaas.MobileGatewaySIMInfo{} 371 copySameNameField(simInfo, sim) 372 373 sims = append(sims, sim) 374 375 ds().Put(o.simsStoreKey(), zone, id, &sims) 376 return nil 377 } 378 379 // DeleteSIM is fake implementation 380 func (o *MobileGatewayOp) DeleteSIM(ctx context.Context, zone string, id types.ID, simID types.ID) error { 381 _, err := o.Read(ctx, zone, id) 382 if err != nil { 383 return err 384 } 385 386 var updSIMs []*iaas.MobileGatewaySIMInfo 387 rawSIMs := ds().Get(o.simsStoreKey(), zone, id) 388 if rawSIMs != nil { 389 ss := rawSIMs.(*[]*iaas.MobileGatewaySIMInfo) 390 for _, sim := range *ss { 391 if sim.ResourceID != simID.String() { 392 updSIMs = append(updSIMs, sim) 393 } 394 } 395 if len(*ss) != len(updSIMs) { 396 ds().Put(o.simsStoreKey(), zone, id, &updSIMs) 397 return nil 398 } 399 } 400 return newErrorBadRequest(o.key, id, fmt.Sprintf("SIM %d is not exists", simID)) 401 } 402 403 // Logs is fake implementation 404 func (o *MobileGatewayOp) Logs(ctx context.Context, zone string, id types.ID) ([]*iaas.MobileGatewaySIMLogs, error) { 405 _, err := o.Read(ctx, zone, id) 406 if err != nil { 407 return nil, err 408 } 409 410 return []*iaas.MobileGatewaySIMLogs{ 411 { 412 Date: time.Now(), 413 SessionStatus: "UP", 414 ResourceID: types.ID(1).String(), 415 }, 416 }, nil 417 } 418 419 // GetTrafficConfig is fake implementation 420 func (o *MobileGatewayOp) GetTrafficConfig(ctx context.Context, zone string, id types.ID) (*iaas.MobileGatewayTrafficControl, error) { 421 _, err := o.Read(ctx, zone, id) 422 if err != nil { 423 return nil, err 424 } 425 426 config := ds().Get(o.trafficConfigStoreKey(), zone, id) 427 if config == nil { 428 return nil, nil 429 } 430 return config.(*iaas.MobileGatewayTrafficControl), nil 431 } 432 433 // SetTrafficConfig is fake implementation 434 func (o *MobileGatewayOp) SetTrafficConfig(ctx context.Context, zone string, id types.ID, param *iaas.MobileGatewayTrafficControl) error { 435 _, err := o.Read(ctx, zone, id) 436 if err != nil { 437 return err 438 } 439 440 ds().Put(o.trafficConfigStoreKey(), zone, id, param) 441 return nil 442 } 443 444 // DeleteTrafficConfig is fake implementation 445 func (o *MobileGatewayOp) DeleteTrafficConfig(ctx context.Context, zone string, id types.ID) error { 446 _, err := o.Read(ctx, zone, id) 447 if err != nil { 448 return err 449 } 450 451 ds().Delete(o.trafficConfigStoreKey(), zone, id) 452 return nil 453 } 454 455 // TrafficStatus is fake implementation 456 func (o *MobileGatewayOp) TrafficStatus(ctx context.Context, zone string, id types.ID) (*iaas.MobileGatewayTrafficStatus, error) { 457 _, err := o.Read(ctx, zone, id) 458 if err != nil { 459 return nil, err 460 } 461 462 return &iaas.MobileGatewayTrafficStatus{ 463 UplinkBytes: 0, 464 DownlinkBytes: 0, 465 TrafficShaping: true, 466 }, nil 467 } 468 469 // MonitorInterface is fake implementation 470 func (o *MobileGatewayOp) MonitorInterface(ctx context.Context, zone string, id types.ID, index int, condition *iaas.MonitorCondition) (*iaas.InterfaceActivity, error) { 471 _, err := o.Read(ctx, zone, id) 472 if err != nil { 473 return nil, err 474 } 475 476 now := time.Now().Truncate(time.Second) 477 m := now.Minute() % 5 478 if m != 0 { 479 now.Add(time.Duration(m) * time.Minute) 480 } 481 482 res := &iaas.InterfaceActivity{} 483 for i := 0; i < 5; i++ { 484 res.Values = append(res.Values, &iaas.MonitorInterfaceValue{ 485 Time: now.Add(time.Duration(i*-5) * time.Minute), 486 Send: float64(random(1000)), 487 Receive: float64(random(1000)), 488 }) 489 } 490 491 return res, nil 492 } 493 494 func (o *MobileGatewayOp) dnsStoreKey() string { 495 return o.key + "DNS" 496 } 497 498 func (o *MobileGatewayOp) simRoutesStoreKey() string { 499 return o.key + "SIMRoutes" 500 } 501 502 func (o *MobileGatewayOp) simsStoreKey() string { 503 return o.key + "SIMs" 504 } 505 506 func (o *MobileGatewayOp) trafficConfigStoreKey() string { 507 return o.key + "TrafficConfig" 508 }