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  }