ops_local_router.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 "fmt"
20 "net"
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 *LocalRouterOp) Find(ctx context.Context, conditions *iaas.FindCondition) (*iaas.LocalRouterFindResult, error) {
29 results, _ := find(o.key, iaas.APIDefaultZone, conditions)
30 var values []*iaas.LocalRouter
31 for _, res := range results {
32 dest := &iaas.LocalRouter{}
33 copySameNameField(res, dest)
34 values = append(values, dest)
35 }
36 return &iaas.LocalRouterFindResult{
37 Total: len(results),
38 Count: len(results),
39 From: 0,
40 LocalRouters: values,
41 }, nil
42 }
43
44 // Create is fake implementation
45 func (o *LocalRouterOp) Create(ctx context.Context, param *iaas.LocalRouterCreateRequest) (*iaas.LocalRouter, error) {
46 result := &iaas.LocalRouter{}
47 copySameNameField(param, result)
48 fill(result, fillID, fillCreatedAt)
49
50 result.Availability = types.Availabilities.Available
51 result.SecretKeys = []string{"dummy"}
52
53 status := &iaas.LocalRouterHealth{
54 Peers: []*iaas.LocalRouterHealthPeer{},
55 }
56 ds().Put(ResourceLocalRouter+"Status", iaas.APIDefaultZone, result.ID, status)
57
58 putLocalRouter(iaas.APIDefaultZone, result)
59 return result, nil
60 }
61
62 // Read is fake implementation
63 func (o *LocalRouterOp) Read(ctx context.Context, id types.ID) (*iaas.LocalRouter, error) {
64 value := getLocalRouterByID(iaas.APIDefaultZone, id)
65 if value == nil {
66 return nil, newErrorNotFound(o.key, id)
67 }
68 dest := &iaas.LocalRouter{}
69 copySameNameField(value, dest)
70 return dest, nil
71 }
72
73 // Update is fake implementation
74 func (o *LocalRouterOp) Update(ctx context.Context, id types.ID, param *iaas.LocalRouterUpdateRequest) (*iaas.LocalRouter, error) {
75 value, err := o.Read(ctx, id)
76 if err != nil {
77 return nil, err
78 }
79 copySameNameField(param, value)
80 fill(value, fillModifiedAt)
81
82 status := &iaas.LocalRouterHealth{
83 Peers: []*iaas.LocalRouterHealthPeer{},
84 }
85 for _, peer := range value.Peers {
86 p, err := o.Read(ctx, peer.ID)
87 if err != nil {
88 return nil, err
89 }
90 var routes []string
91 if p.Interface != nil {
92 _, ipNet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", p.Interface.VirtualIPAddress, p.Interface.NetworkMaskLen))
93 if err != nil {
94 return nil, err
95 }
96 if ipNet != nil {
97 routes = append(routes, ipNet.String())
98 }
99
100 for _, sr := range p.StaticRoutes {
101 routes = append(routes, sr.Prefix)
102 }
103 }
104
105 status.Peers = append(status.Peers, &iaas.LocalRouterHealthPeer{
106 ID: peer.ID,
107 Status: types.ServerInstanceStatuses.Up,
108 Routes: routes,
109 })
110 }
111
112 ds().Put(ResourceLocalRouter+"Status", iaas.APIDefaultZone, value.ID, status)
113
114 putLocalRouter(iaas.APIDefaultZone, value)
115 return value, nil
116 }
117
118 // UpdateSettings is fake implementation
119 func (o *LocalRouterOp) UpdateSettings(ctx context.Context, id types.ID, param *iaas.LocalRouterUpdateSettingsRequest) (*iaas.LocalRouter, error) {
120 value, err := o.Read(ctx, id)
121 if err != nil {
122 return nil, err
123 }
124 copySameNameField(param, value)
125 fill(value, fillModifiedAt)
126
127 status := &iaas.LocalRouterHealth{
128 Peers: []*iaas.LocalRouterHealthPeer{},
129 }
130 for _, peer := range value.Peers {
131 p, err := o.Read(ctx, peer.ID)
132 if err != nil {
133 return nil, err
134 }
135 var routes []string
136 if p.Interface != nil {
137 _, ipNet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", p.Interface.VirtualIPAddress, p.Interface.NetworkMaskLen))
138 if err != nil {
139 return nil, err
140 }
141 if ipNet != nil {
142 routes = append(routes, ipNet.String())
143 }
144
145 for _, sr := range p.StaticRoutes {
146 routes = append(routes, sr.Prefix)
147 }
148 }
149
150 status.Peers = append(status.Peers, &iaas.LocalRouterHealthPeer{
151 ID: peer.ID,
152 Status: types.ServerInstanceStatuses.Up,
153 Routes: routes,
154 })
155 }
156
157 ds().Put(ResourceLocalRouter+"Status", iaas.APIDefaultZone, value.ID, status)
158
159 putLocalRouter(iaas.APIDefaultZone, value)
160 return value, nil
161 }
162
163 // Delete is fake implementation
164 func (o *LocalRouterOp) Delete(ctx context.Context, id types.ID) error {
165 _, err := o.Read(ctx, id)
166 if err != nil {
167 return err
168 }
169
170 ds().Delete(o.key, iaas.APIDefaultZone, id)
171 return nil
172 }
173
174 // HealthStatus is fake implementation
175 func (o *LocalRouterOp) HealthStatus(ctx context.Context, id types.ID) (*iaas.LocalRouterHealth, error) {
176 _, err := o.Read(ctx, id)
177 if err != nil {
178 return nil, err
179 }
180
181 result := ds().Get(ResourceLocalRouter+"Status", iaas.APIDefaultZone, id)
182 if result == nil {
183 return nil, newErrorNotFound(o.key, id)
184 }
185 return result.(*iaas.LocalRouterHealth), nil
186 }
187
188 // MonitorLocalRouter is fake implementation
189 func (o *LocalRouterOp) MonitorLocalRouter(ctx context.Context, id types.ID, condition *iaas.MonitorCondition) (*iaas.LocalRouterActivity, error) {
190 _, err := o.Read(ctx, id)
191 if err != nil {
192 return nil, err
193 }
194
195 now := time.Now().Truncate(time.Second)
196 m := now.Minute() % 5
197 if m != 0 {
198 now.Add(time.Duration(m) * time.Minute)
199 }
200
201 res := &iaas.LocalRouterActivity{}
202 for i := 0; i < 5; i++ {
203 res.Values = append(res.Values, &iaas.MonitorLocalRouterValue{
204 Time: now.Add(time.Duration(i*-5) * time.Minute),
205 ReceiveBytesPerSec: float64(random(1000)),
206 SendBytesPerSec: float64(random(1000)),
207 })
208 }
209
210 return res, nil
211 }
212