ops_sim.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  	"errors"
  20  	"strings"
  21  	"time"
  22  
  23  	"github.com/sacloud/iaas-api-go"
  24  	"github.com/sacloud/iaas-api-go/types"
  25  )
  26  
  27  // Find is fake implementation
  28  func (o *SIMOp) Find(ctx context.Context, conditions *iaas.FindCondition) (*iaas.SIMFindResult, error) {
  29  	results, _ := find(o.key, iaas.APIDefaultZone, conditions)
  30  	var values []*iaas.SIM
  31  	for _, res := range results {
  32  		dest := &iaas.SIM{}
  33  		copySameNameField(res, dest)
  34  		values = append(values, dest)
  35  	}
  36  	return &iaas.SIMFindResult{
  37  		Total: len(results),
  38  		Count: len(results),
  39  		From:  0,
  40  		SIMs:  values,
  41  	}, nil
  42  }
  43  
  44  // Create is fake implementation
  45  func (o *SIMOp) Create(ctx context.Context, param *iaas.SIMCreateRequest) (*iaas.SIM, error) {
  46  	result := &iaas.SIM{}
  47  	copySameNameField(param, result)
  48  	fill(result, fillID, fillCreatedAt, fillModifiedAt)
  49  
  50  	result.Class = "sim"
  51  	result.Availability = types.Availabilities.Available
  52  	result.Info = &iaas.SIMInfo{
  53  		ICCID:          param.ICCID,
  54  		RegisteredDate: time.Now(),
  55  		Registered:     true,
  56  		ResourceID:     result.ID.String(),
  57  	}
  58  
  59  	putSIM(iaas.APIDefaultZone, result)
  60  	return result, nil
  61  }
  62  
  63  // Read is fake implementation
  64  func (o *SIMOp) Read(ctx context.Context, id types.ID) (*iaas.SIM, error) {
  65  	value := getSIMByID(iaas.APIDefaultZone, id)
  66  	if value == nil {
  67  		return nil, newErrorNotFound(o.key, id)
  68  	}
  69  	dest := &iaas.SIM{}
  70  	copySameNameField(value, dest)
  71  	return dest, nil
  72  }
  73  
  74  // Update is fake implementation
  75  func (o *SIMOp) Update(ctx context.Context, id types.ID, param *iaas.SIMUpdateRequest) (*iaas.SIM, error) {
  76  	value, err := o.Read(ctx, id)
  77  	if err != nil {
  78  		return nil, err
  79  	}
  80  	copySameNameField(param, value)
  81  	fill(value, fillModifiedAt)
  82  	putSIM(iaas.APIDefaultZone, value)
  83  	return value, nil
  84  }
  85  
  86  // Delete is fake implementation
  87  func (o *SIMOp) Delete(ctx context.Context, id types.ID) error {
  88  	_, err := o.Read(ctx, id)
  89  	if err != nil {
  90  		return err
  91  	}
  92  
  93  	ds().Delete(o.key, iaas.APIDefaultZone, id)
  94  	return nil
  95  }
  96  
  97  // Activate is fake implementation
  98  func (o *SIMOp) Activate(ctx context.Context, id types.ID) error {
  99  	value, err := o.Read(ctx, id)
 100  	if err != nil {
 101  		return err
 102  	}
 103  	if value.Info.Activated {
 104  		return errors.New("SIM[%d] is already activated")
 105  	}
 106  	value.Info.Activated = true
 107  	value.Info.ActivatedDate = time.Now()
 108  	value.Info.DeactivatedDate = time.Time{}
 109  	putSIM(iaas.APIDefaultZone, value)
 110  	return nil
 111  }
 112  
 113  // Deactivate is fake implementation
 114  func (o *SIMOp) Deactivate(ctx context.Context, id types.ID) error {
 115  	value, err := o.Read(ctx, id)
 116  	if err != nil {
 117  		return err
 118  	}
 119  	if !value.Info.Activated {
 120  		return errors.New("SIM[%d] is already deactivated")
 121  	}
 122  	value.Info.Activated = false
 123  	value.Info.ActivatedDate = time.Time{}
 124  	value.Info.DeactivatedDate = time.Now()
 125  	putSIM(iaas.APIDefaultZone, value)
 126  	return nil
 127  }
 128  
 129  // AssignIP is fake implementation
 130  func (o *SIMOp) AssignIP(ctx context.Context, id types.ID, param *iaas.SIMAssignIPRequest) error {
 131  	value, err := o.Read(ctx, id)
 132  	if err != nil {
 133  		return err
 134  	}
 135  	if value.Info.IP != "" {
 136  		return errors.New("SIM[%d] already has IPAddress")
 137  	}
 138  	value.Info.IP = param.IP
 139  	putSIM(iaas.APIDefaultZone, value)
 140  
 141  	return nil
 142  }
 143  
 144  // ClearIP is fake implementation
 145  func (o *SIMOp) ClearIP(ctx context.Context, id types.ID) error {
 146  	value, err := o.Read(ctx, id)
 147  	if err != nil {
 148  		return err
 149  	}
 150  	if value.Info.IP == "" {
 151  		return errors.New("SIM[%d] doesn't have IPAddress")
 152  	}
 153  	value.Info.IP = ""
 154  	putSIM(iaas.APIDefaultZone, value)
 155  	return nil
 156  }
 157  
 158  // IMEILock is fake implementation
 159  func (o *SIMOp) IMEILock(ctx context.Context, id types.ID, param *iaas.SIMIMEILockRequest) error {
 160  	value, err := o.Read(ctx, id)
 161  	if err != nil {
 162  		return err
 163  	}
 164  	if value.Info.IMEILock {
 165  		return errors.New("SIM[%d] is already locked with IMEI")
 166  	}
 167  	value.Info.IMEILock = true
 168  	value.Info.IMEI = param.IMEI
 169  	putSIM(iaas.APIDefaultZone, value)
 170  	return nil
 171  }
 172  
 173  // IMEIUnlock is fake implementation
 174  func (o *SIMOp) IMEIUnlock(ctx context.Context, id types.ID) error {
 175  	value, err := o.Read(ctx, id)
 176  	if err != nil {
 177  		return err
 178  	}
 179  	if !value.Info.IMEILock {
 180  		return errors.New("SIM[%d] is not locked with IMEI")
 181  	}
 182  	value.Info.IMEILock = false
 183  	value.Info.IMEI = ""
 184  	putSIM(iaas.APIDefaultZone, value)
 185  	return nil
 186  }
 187  
 188  // Logs is fake implementation
 189  func (o *SIMOp) Logs(ctx context.Context, id types.ID) (*iaas.SIMLogsResult, error) {
 190  	value, err := o.Read(ctx, id)
 191  	if err != nil {
 192  		return nil, err
 193  	}
 194  
 195  	return &iaas.SIMLogsResult{
 196  		Total: 1,
 197  		From:  0,
 198  		Count: 1,
 199  		Logs: []*iaas.SIMLog{
 200  			{
 201  				Date:          time.Now(),
 202  				SessionStatus: "up",
 203  				ResourceID:    value.ID.String(),
 204  				IMEI:          value.Info.ConnectedIMEI,
 205  				IMSI:          strings.Join(value.Info.IMSI, " "),
 206  			},
 207  		},
 208  	}, nil
 209  }
 210  
 211  // GetNetworkOperator is fake implementation
 212  func (o *SIMOp) GetNetworkOperator(ctx context.Context, id types.ID) ([]*iaas.SIMNetworkOperatorConfig, error) {
 213  	_, err := o.Read(ctx, id)
 214  	if err != nil {
 215  		return nil, err
 216  	}
 217  	v := ds().Get(o.key+"NetworkOperator", iaas.APIDefaultZone, id)
 218  	if v != nil {
 219  		var res []*iaas.SIMNetworkOperatorConfig
 220  		configs := v.(*[]*iaas.SIMNetworkOperatorConfig)
 221  		res = append(res, *configs...)
 222  		return res, nil
 223  	}
 224  
 225  	return []*iaas.SIMNetworkOperatorConfig{}, nil
 226  }
 227  
 228  // SetNetworkOperator is fake implementation
 229  func (o *SIMOp) SetNetworkOperator(ctx context.Context, id types.ID, configs []*iaas.SIMNetworkOperatorConfig) error {
 230  	_, err := o.Read(ctx, id)
 231  	if err != nil {
 232  		return err
 233  	}
 234  
 235  	ds().Put(o.key+"NetworkOperator", iaas.APIDefaultZone, id, &configs)
 236  	return nil
 237  }
 238  
 239  // MonitorSIM is fake implementation
 240  func (o *SIMOp) MonitorSIM(ctx context.Context, id types.ID, condition *iaas.MonitorCondition) (*iaas.LinkActivity, error) {
 241  	_, err := o.Read(ctx, id)
 242  	if err != nil {
 243  		return nil, err
 244  	}
 245  	now := time.Now().Truncate(time.Second)
 246  	m := now.Minute() % 5
 247  	if m != 0 {
 248  		now.Add(time.Duration(m) * time.Minute)
 249  	}
 250  
 251  	res := &iaas.LinkActivity{}
 252  	for i := 0; i < 5; i++ {
 253  		res.Values = append(res.Values, &iaas.MonitorLinkValue{
 254  			Time:        now.Add(time.Duration(i*-5) * time.Minute),
 255  			UplinkBPS:   float64(random(1000)),
 256  			DownlinkBPS: float64(random(1000)),
 257  		})
 258  	}
 259  
 260  	return res, nil
 261  }
 262  
 263  // Status is fake implementation
 264  func (o *SIMOp) Status(ctx context.Context, id types.ID) (*iaas.SIMInfo, error) {
 265  	v, err := o.Read(ctx, id)
 266  	if err != nil {
 267  		return nil, err
 268  	}
 269  	return v.Info, nil
 270  }
 271