github.com/sacloud/iaas-api-go@v1.12.0/fake/ops_local_router.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 "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 }