github.com/sacloud/iaas-api-go@v1.12.0/transformer_test.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 iaas 16 17 import ( 18 "reflect" 19 "testing" 20 21 "github.com/sacloud/iaas-api-go/naked" 22 "github.com/sacloud/iaas-api-go/types" 23 "github.com/stretchr/testify/require" 24 ) 25 26 func TestTransformer_transformLoadBalancerCreateArgs(t *testing.T) { 27 op := &LoadBalancerOp{} 28 29 ret, err := op.transformCreateArgs(&LoadBalancerCreateRequest{ 30 VirtualIPAddresses: LoadBalancerVirtualIPAddresses{ 31 { 32 VirtualIPAddress: "192.168.0.1", 33 Servers: LoadBalancerServers{ 34 { 35 IPAddress: "192.168.0.11", 36 Port: 80, 37 Enabled: true, 38 HealthCheck: &LoadBalancerServerHealthCheck{ 39 Protocol: types.LoadBalancerHealthCheckProtocols.HTTP, 40 Path: "/", 41 ResponseCode: 200, 42 }, 43 }, 44 }, 45 }, 46 }, 47 }) 48 if err != nil { 49 t.Fatal(err) 50 } 51 v := ret.Appliance.Settings.LoadBalancer[0].Servers[0].HealthCheck.Status 52 if v != types.StringNumber(200) { 53 t.Fatal("unexpected value:", v) 54 } 55 } 56 57 func TestTransformer_transformSIMReadResults(t *testing.T) { 58 op := &SIMOp{} 59 data := []string{simJSONWithString, simJSONWithNumber} 60 for _, d := range data { 61 result, err := op.transformReadResults([]byte(d)) 62 require.NoError(t, err) 63 require.Equal(t, int64(10101010), result.SIM.Info.TrafficBytesOfCurrentMonth.UplinkBytes) 64 require.Equal(t, int64(20202020), result.SIM.Info.TrafficBytesOfCurrentMonth.DownlinkBytes) 65 } 66 } 67 68 const simJSONWithString = ` 69 { 70 "CommonServiceItem": { 71 "ID": 123456789012, 72 "Name": "dummy", 73 "Description": "dummy", 74 "Settings": null, 75 "SettingsHash": null, 76 "Status": { 77 "ICCID": "1111111111111111111", 78 "sim": { 79 "iccid": "1111111111111111111", 80 "session_status": "DOWN", 81 "imei_lock": false, 82 "registered": true, 83 "activated": true, 84 "resource_id": "123456789012", 85 "registered_date": "2020-10-01T05:39:17+00:00", 86 "activated_date": "2020-10-01T05:39:17+00:00", 87 "deactivated_date": "2020-10-01T04:48:39+00:00", 88 "traffic_bytes_of_current_month": { 89 "uplink_bytes": "10101010", 90 "downlink_bytes": "20202020" 91 } 92 } 93 }, 94 "ServiceClass": "cloud/sim/1", 95 "Availability": "available", 96 "CreatedAt": "2020-10-01T14:39:17+09:00", 97 "ModifiedAt": "2020-10-01T14:39:17+09:00", 98 "Provider": { 99 "ID": 8000001, 100 "Class": "sim", 101 "Name": "sakura-sim", 102 "ServiceClass": "cloud/sim" 103 }, 104 "Icon": null 105 }, 106 "is_ok": true 107 } 108 ` 109 110 const simJSONWithNumber = ` 111 { 112 "CommonServiceItem": { 113 "ID": 123456789012, 114 "Name": "dummy", 115 "Description": "dummy", 116 "Settings": null, 117 "SettingsHash": null, 118 "Status": { 119 "ICCID": "1111111111111111111", 120 "sim": { 121 "iccid": "1111111111111111111", 122 "session_status": "DOWN", 123 "imei_lock": false, 124 "registered": true, 125 "activated": true, 126 "resource_id": "123456789012", 127 "registered_date": "2020-10-01T05:39:17+00:00", 128 "activated_date": "2020-10-01T05:39:17+00:00", 129 "deactivated_date": "2020-10-01T04:48:39+00:00", 130 "traffic_bytes_of_current_month": { 131 "uplink_bytes": 10101010, 132 "downlink_bytes": 20202020 133 } 134 } 135 }, 136 "ServiceClass": "cloud/sim/1", 137 "Availability": "available", 138 "CreatedAt": "2020-10-01T14:39:17+09:00", 139 "ModifiedAt": "2020-10-01T14:39:17+09:00", 140 "Provider": { 141 "ID": 8000001, 142 "Class": "sim", 143 "Name": "sakura-sim", 144 "ServiceClass": "cloud/sim" 145 }, 146 "Icon": null 147 }, 148 "is_ok": true 149 } 150 ` 151 152 func TestTransformer_transformSetCertificatesArgs(t *testing.T) { 153 op := &ProxyLBOp{} 154 155 cert := &ProxyLBPrimaryCert{ 156 ServerCertificate: "aaa", 157 IntermediateCertificate: "bbb", 158 PrivateKey: "ccc", 159 } 160 161 ret, err := op.transformSetCertificatesArgs(types.ID(1), 162 &ProxyLBSetCertificatesRequest{ 163 PrimaryCerts: cert, 164 AdditionalCerts: []*ProxyLBAdditionalCert{}, 165 }, 166 ) 167 if err != nil { 168 t.Fatal(err) 169 } 170 171 if ret.ProxyLB.PrimaryCert == nil { 172 t.Fatal("ProxyLB.PrimaryCert is nil") 173 } 174 if ret.ProxyLB.PrimaryCert.ServerCertificate != cert.ServerCertificate { 175 t.Fatal("ProxyLB.PrimaryCert has unexpected value: ServerCertificate") 176 } 177 if ret.ProxyLB.PrimaryCert.IntermediateCertificate != cert.IntermediateCertificate { 178 t.Fatal("ProxyLB.PrimaryCert has unexpected value: IntermediateCertificate") 179 } 180 if ret.ProxyLB.PrimaryCert.PrivateKey != cert.PrivateKey { 181 t.Fatal("ProxyLB.PrimaryCert has unexpected value: PrivateKey") 182 } 183 } 184 185 func TestTransformer_transformDatabaseGetParameterResult(t *testing.T) { 186 op := &DatabaseOp{} 187 results, err := op.transformGetParameterResults([]byte(databaseParameterJSON)) 188 if err != nil { 189 t.Fatal(err) 190 } 191 v := results.DatabaseParameter 192 require.EqualValues(t, map[string]interface{}{ 193 "MariaDB/server.cnf/mysqld/event_scheduler": float64(100), 194 }, v.Settings) 195 require.Len(t, v.MetaInfo, 1) 196 require.EqualValues(t, "string", v.MetaInfo[0].Type) 197 require.EqualValues(t, "MariaDB/server.cnf/mysqld/event_scheduler", v.MetaInfo[0].Name) 198 require.EqualValues(t, "event_scheduler", v.MetaInfo[0].Label) 199 require.EqualValues(t, "65536", v.MetaInfo[0].Example) 200 require.EqualValues(t, 1024, v.MetaInfo[0].Min) 201 require.EqualValues(t, 2147483647, v.MetaInfo[0].Max) 202 require.EqualValues(t, 10, v.MetaInfo[0].MaxLen) 203 require.EqualValues(t, "dynamic", v.MetaInfo[0].Reboot) 204 } 205 206 func TestTransformer_transformDatabaseGetParameterResult_minimum(t *testing.T) { 207 op := &DatabaseOp{} 208 results, err := op.transformGetParameterResults([]byte(databaseParameterJSONMinimum)) 209 if err != nil { 210 t.Fatal(err) 211 } 212 v := results.DatabaseParameter 213 require.Empty(t, v.Settings) 214 require.Empty(t, v.MetaInfo) 215 } 216 217 const ( 218 databaseParameterJSON = ` 219 { 220 "Database": { 221 "Parameter": { 222 "NoteID": "123456789012", 223 "Attr": { 224 "MariaDB/server.cnf/mysqld/event_scheduler": 100 225 } 226 }, 227 "Remark": { 228 "Settings": [], 229 "Form": [ 230 { 231 "type": "radios", 232 "name": "MariaDB/server.cnf/mysqld/event_scheduler", 233 "label": "event_scheduler", 234 "options": { 235 "ex": "65536", 236 "min": 1024, 237 "max": 2147483647, 238 "maxlen": 10, 239 "text": "イベントスケジュールの有効無効を設定します。", 240 "reboot": "dynamic", 241 "type": "string" 242 }, 243 "items": [ 244 ["ON","ON"], 245 ["OFF","OFF"] 246 ] 247 } 248 ] 249 } 250 } 251 } 252 ` 253 databaseParameterJSONMinimum = ` 254 { 255 "Database": { 256 "Parameter": { 257 "NoteID": "123456789012", 258 "Attr":[] 259 }, 260 "Remark": { 261 "Settings": [], 262 "Form": [] 263 } 264 } 265 } 266 ` 267 ) 268 269 func TestTransformer_transformDatabaseSetParameterArgs(t *testing.T) { 270 op := &DatabaseOp{} 271 result, err := op.transformSetParameterArgs(types.ID(0), map[string]interface{}{ 272 "foo": "bar", 273 }) 274 if err != nil { 275 t.Fatal(err) 276 } 277 require.NotNil(t, result.Parameter) 278 require.NotEmpty(t, result.Parameter.Attr) 279 require.EqualValues(t, "bar", result.Parameter.Attr["foo"]) 280 } 281 282 func TestServerOp_transformChangePlanArgs(t *testing.T) { 283 type fields struct { 284 Client APICaller 285 PathSuffix string 286 PathName string 287 } 288 type args struct { 289 id types.ID 290 plan *ServerChangePlanRequest 291 } 292 tests := []struct { 293 name string 294 fields fields 295 args args 296 want *serverChangePlanRequestEnvelope 297 wantErr bool 298 }{ 299 { 300 name: "standard", 301 args: args{ 302 id: 1, 303 plan: &ServerChangePlanRequest{ 304 CPU: 2, 305 MemoryMB: 4, 306 }, 307 }, 308 want: &serverChangePlanRequestEnvelope{ 309 CPU: 2, 310 MemoryMB: 4, 311 ServerPlanCommitment: types.Commitments.Standard, 312 }, 313 wantErr: false, 314 }, 315 { 316 name: "dedicated-cpu", 317 args: args{ 318 id: 1, 319 plan: &ServerChangePlanRequest{ 320 CPU: 2, 321 MemoryMB: 4, 322 ServerPlanGeneration: types.PlanGenerations.G200, 323 ServerPlanCommitment: types.Commitments.DedicatedCPU, 324 }, 325 }, 326 want: &serverChangePlanRequestEnvelope{ 327 CPU: 2, 328 MemoryMB: 4, 329 ServerPlanGeneration: types.PlanGenerations.G200, 330 ServerPlanCommitment: types.Commitments.DedicatedCPU, 331 }, 332 wantErr: false, 333 }, 334 } 335 for _, tt := range tests { 336 t.Run(tt.name, func(t *testing.T) { 337 o := &ServerOp{ 338 Client: tt.fields.Client, 339 PathSuffix: tt.fields.PathSuffix, 340 PathName: tt.fields.PathName, 341 } 342 got, err := o.transformChangePlanArgs(tt.args.id, tt.args.plan) 343 if (err != nil) != tt.wantErr { 344 t.Errorf("transformChangePlanArgs() error = %v, wantErr %v", err, tt.wantErr) 345 return 346 } 347 if !reflect.DeepEqual(got, tt.want) { 348 t.Errorf("transformChangePlanArgs() got = %v, want %v", got, tt.want) 349 } 350 }) 351 } 352 } 353 354 func TestVPCRouterOp_transformCreateArgs(t *testing.T) { 355 type args struct { 356 param *VPCRouterCreateRequest 357 } 358 tests := []struct { 359 name string 360 args args 361 want *vPCRouterCreateRequestEnvelope 362 wantErr bool 363 }{ 364 { 365 name: "transform WireGuard Peers", 366 args: args{ 367 param: &VPCRouterCreateRequest{ 368 Settings: &VPCRouterSetting{ 369 WireGuard: &VPCRouterWireGuard{ 370 IPAddress: "192.168.1.1", 371 Peers: []*VPCRouterWireGuardPeer{ 372 { 373 Name: "name", 374 IPAddress: "192.168.11.1", 375 PublicKey: "xxx", 376 }, 377 }, 378 }, 379 WireGuardEnabled: true, 380 }, 381 }, 382 }, 383 want: &vPCRouterCreateRequestEnvelope{ 384 Appliance: &naked.VPCRouter{ 385 Class: "vpcrouter", 386 Plan: &naked.AppliancePlan{ 387 ID: 0, 388 }, 389 Settings: &naked.VPCRouterSettings{ 390 Router: &naked.VPCRouterSetting{ 391 InternetConnection: &naked.VPCRouterInternetConnection{}, 392 PPTPServer: &naked.VPCRouterPPTPServer{}, 393 L2TPIPsecServer: &naked.VPCRouterL2TPIPsecServer{}, 394 WireGuard: &naked.VPCRouterWireGuard{ 395 Config: &naked.VPCRouterWireGuardConfig{ 396 IPAddress: "192.168.1.1", 397 Peers: []*naked.VPCRouterWireGuardPeer{ 398 { 399 Name: "name", 400 IPAddress: "192.168.11.1", 401 PublicKey: "xxx", 402 }, 403 }, 404 }, 405 Enabled: true, 406 }, 407 }, 408 }, 409 Remark: &naked.ApplianceRemark{ 410 Router: &naked.ApplianceRemarkRouter{ 411 VPCRouterVersion: 2, 412 }, 413 }, 414 Icon: &naked.Icon{}, 415 }, 416 }, 417 wantErr: false, 418 }, 419 } 420 for _, tt := range tests { 421 t.Run(tt.name, func(t *testing.T) { 422 o := &VPCRouterOp{} 423 got, err := o.transformCreateArgs(tt.args.param) 424 if (err != nil) != tt.wantErr { 425 t.Errorf("transformCreateArgs() error = %v, wantErr %v", err, tt.wantErr) 426 return 427 } 428 require.EqualValues(t, tt.want, got) 429 }) 430 } 431 }