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