github.com/sacloud/libsacloud/v2@v2.32.3/helper/builder/vpcrouter/builder_test.go (about)

     1  // Copyright 2016-2022 The Libsacloud 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 vpcrouter
    16  
    17  import (
    18  	"testing"
    19  	"time"
    20  
    21  	"github.com/sacloud/libsacloud/v2/helper/builder"
    22  	"github.com/sacloud/libsacloud/v2/helper/builder/internet"
    23  	"github.com/sacloud/libsacloud/v2/sacloud"
    24  	"github.com/sacloud/libsacloud/v2/sacloud/testutil"
    25  	"github.com/sacloud/libsacloud/v2/sacloud/types"
    26  )
    27  
    28  func getSetupOption() *builder.RetryableSetupParameter {
    29  	if testutil.IsAccTest() {
    30  		return nil
    31  	}
    32  	return &builder.RetryableSetupParameter{
    33  		DeleteRetryInterval:       10 * time.Millisecond,
    34  		ProvisioningRetryInterval: 10 * time.Millisecond,
    35  		PollingInterval:           10 * time.Millisecond,
    36  		NICUpdateWaitDuration:     10 * time.Millisecond,
    37  	}
    38  }
    39  
    40  func TestBuilder_Build(t *testing.T) {
    41  	var switchID types.ID
    42  	var testZone = testutil.TestZone()
    43  
    44  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
    45  		SetupAPICallerFunc: func() sacloud.APICaller {
    46  			return testutil.SingletonAPICaller()
    47  		},
    48  		Parallel:          true,
    49  		IgnoreStartupWait: true,
    50  		Setup: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) error {
    51  			swOp := sacloud.NewSwitchOp(caller)
    52  
    53  			sw, err := swOp.Create(ctx, testZone, &sacloud.SwitchCreateRequest{
    54  				Name: testutil.ResourceName("vpc-router-builder"),
    55  			})
    56  			if err != nil {
    57  				return err
    58  			}
    59  			switchID = sw.ID
    60  			return nil
    61  		},
    62  		Create: &testutil.CRUDTestFunc{
    63  			Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) (interface{}, error) {
    64  				builder := &Builder{
    65  					Name:        testutil.ResourceName("vpc-router-builder"),
    66  					Description: "description",
    67  					Tags:        types.Tags{"tag1", "tag2"},
    68  					PlanID:      types.VPCRouterPlans.Standard,
    69  					Version:     1,
    70  					NICSetting:  &StandardNICSetting{},
    71  					AdditionalNICSettings: []AdditionalNICSettingHolder{
    72  						&AdditionalStandardNICSetting{
    73  							SwitchID:       switchID,
    74  							IPAddress:      "192.168.0.1",
    75  							NetworkMaskLen: 24,
    76  							Index:          2,
    77  						},
    78  					},
    79  					RouterSetting: &RouterSetting{
    80  						InternetConnectionEnabled: types.StringTrue,
    81  					},
    82  					SetupOptions: getSetupOption(),
    83  					Client:       sacloud.NewVPCRouterOp(caller),
    84  				}
    85  				return builder.Build(ctx, testZone)
    86  			},
    87  		},
    88  		Read: &testutil.CRUDTestFunc{
    89  			Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) (interface{}, error) {
    90  				vpcRouterOp := sacloud.NewVPCRouterOp(caller)
    91  				return vpcRouterOp.Read(ctx, testZone, ctx.ID)
    92  			},
    93  			CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, value interface{}) error {
    94  				vpcRouter := value.(*sacloud.VPCRouter)
    95  				return testutil.DoAsserts(
    96  					testutil.AssertNotNilFunc(t, vpcRouter, "VPCRouter"),
    97  					testutil.AssertNotNilFunc(t, vpcRouter.Settings, "VPCRouter.Settings"),
    98  					testutil.AssertLenFunc(t, vpcRouter.Settings.Interfaces, 1, "VPCRouter.Settings.Interfaces"),
    99  				)
   100  			},
   101  		},
   102  		Delete: &testutil.CRUDTestDeleteFunc{
   103  			Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) error {
   104  				vpcRouterOp := sacloud.NewVPCRouterOp(caller)
   105  				return vpcRouterOp.Delete(ctx, testZone, ctx.ID)
   106  			},
   107  		},
   108  		Cleanup: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) error {
   109  			swOp := sacloud.NewSwitchOp(caller)
   110  			return swOp.Delete(ctx, testZone, switchID)
   111  		},
   112  	})
   113  }
   114  
   115  func TestBuilder_BuildWithRouter(t *testing.T) {
   116  	var routerID, routerSwitchID, switchID, updSwitchID types.ID
   117  	var addresses []string
   118  	var testZone = testutil.TestZone()
   119  
   120  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
   121  		SetupAPICallerFunc: func() sacloud.APICaller {
   122  			return testutil.SingletonAPICaller()
   123  		},
   124  		Parallel:          true,
   125  		IgnoreStartupWait: true,
   126  		Setup: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) error {
   127  			routerBuilder := &internet.Builder{
   128  				Name:           testutil.ResourceName("vpc-router-builder"),
   129  				NetworkMaskLen: 28,
   130  				BandWidthMbps:  100,
   131  				Client:         internet.NewAPIClient(caller),
   132  			}
   133  
   134  			created, err := routerBuilder.Build(ctx, testZone)
   135  			if err != nil {
   136  				return err
   137  			}
   138  
   139  			routerID = created.ID
   140  			routerSwitchID = created.Switch.ID
   141  
   142  			swOp := sacloud.NewSwitchOp(caller)
   143  			sw, err := swOp.Create(ctx, testZone, &sacloud.SwitchCreateRequest{
   144  				Name: testutil.ResourceName("vpc-router-builder"),
   145  			})
   146  			if err != nil {
   147  				return err
   148  			}
   149  			switchID = sw.ID
   150  
   151  			updSwitch, err := swOp.Create(ctx, testZone, &sacloud.SwitchCreateRequest{
   152  				Name: testutil.ResourceName("vpc-router-builder-upd"),
   153  			})
   154  			if err != nil {
   155  				return err
   156  			}
   157  			updSwitchID = updSwitch.ID
   158  
   159  			routerSwitch, err := swOp.Read(ctx, testZone, created.Switch.ID)
   160  			if err != nil {
   161  				return err
   162  			}
   163  			addresses = routerSwitch.Subnets[0].GetAssignedIPAddresses()
   164  			return nil
   165  		},
   166  		Create: &testutil.CRUDTestFunc{
   167  			Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) (interface{}, error) {
   168  				builder := &Builder{
   169  					Name:        testutil.ResourceName("vpc-router-builder"),
   170  					Description: "description",
   171  					Tags:        types.Tags{"tag1", "tag2"},
   172  					PlanID:      types.VPCRouterPlans.Premium,
   173  					NICSetting: &PremiumNICSetting{
   174  						SwitchID:         routerSwitchID,
   175  						VirtualIPAddress: addresses[0],
   176  						IPAddresses:      []string{addresses[1], addresses[2]},
   177  						IPAliases:        []string{addresses[3], addresses[4]},
   178  					},
   179  					AdditionalNICSettings: []AdditionalNICSettingHolder{
   180  						&AdditionalPremiumNICSetting{
   181  							SwitchID:         switchID,
   182  							IPAddresses:      []string{"192.168.0.11", "192.168.0.12"},
   183  							VirtualIPAddress: "192.168.0.1",
   184  							NetworkMaskLen:   24,
   185  							Index:            2,
   186  						},
   187  					},
   188  					RouterSetting: &RouterSetting{
   189  						VRID:                      1,
   190  						InternetConnectionEnabled: types.StringTrue,
   191  					},
   192  					SetupOptions: getSetupOption(),
   193  					Client:       sacloud.NewVPCRouterOp(caller),
   194  				}
   195  				return builder.Build(ctx, testZone)
   196  			},
   197  			CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, value interface{}) error {
   198  				vpcRouter := value.(*sacloud.VPCRouter)
   199  				found := false
   200  				for _, iface := range vpcRouter.Interfaces {
   201  					if iface.Index == 2 {
   202  						found = true
   203  						if err := testutil.AssertEqual(t, switchID, iface.SwitchID, "VPCRouter.Interfaces[index=2].SwitchID"); err != nil {
   204  							return err
   205  						}
   206  					}
   207  				}
   208  				return testutil.AssertTrue(t, found, "VPCRouter.Interfaces[index=2]")
   209  			},
   210  		},
   211  		Read: &testutil.CRUDTestFunc{
   212  			Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) (interface{}, error) {
   213  				vpcRouterOp := sacloud.NewVPCRouterOp(caller)
   214  				return vpcRouterOp.Read(ctx, testZone, ctx.ID)
   215  			},
   216  			CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, value interface{}) error {
   217  				vpcRouter := value.(*sacloud.VPCRouter)
   218  				return testutil.DoAsserts(
   219  					testutil.AssertNotNilFunc(t, vpcRouter, "VPCRouter"),
   220  					testutil.AssertNotNilFunc(t, vpcRouter.Settings, "VPCRouter.Settings"),
   221  					testutil.AssertLenFunc(t, vpcRouter.Settings.Interfaces, 2, "VPCRouter.Settings.Interfaces"),
   222  				)
   223  			},
   224  		},
   225  		Updates: []*testutil.CRUDTestFunc{
   226  			{
   227  				Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) (interface{}, error) {
   228  					builder := &Builder{
   229  						Name:        testutil.ResourceName("vpc-router-builder"),
   230  						Description: "description",
   231  						Tags:        types.Tags{"tag1", "tag2"},
   232  						PlanID:      types.VPCRouterPlans.Premium,
   233  						NICSetting: &PremiumNICSetting{
   234  							SwitchID:         routerSwitchID,
   235  							VirtualIPAddress: addresses[0],
   236  							IPAddresses:      []string{addresses[1], addresses[2]},
   237  							IPAliases:        []string{addresses[3], addresses[4]},
   238  						},
   239  						AdditionalNICSettings: []AdditionalNICSettingHolder{
   240  							&AdditionalPremiumNICSetting{
   241  								SwitchID:         updSwitchID,
   242  								VirtualIPAddress: "192.168.0.5",
   243  								IPAddresses:      []string{"192.168.0.6", "192.168.0.7"},
   244  								NetworkMaskLen:   28,
   245  								Index:            3,
   246  							},
   247  						},
   248  						RouterSetting: &RouterSetting{
   249  							VRID:                      1,
   250  							InternetConnectionEnabled: types.StringTrue,
   251  						},
   252  						SetupOptions: getSetupOption(),
   253  						Client:       sacloud.NewVPCRouterOp(caller),
   254  					}
   255  					return builder.Update(ctx, testZone, ctx.ID)
   256  				},
   257  				CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, value interface{}) error {
   258  					vpcRouter := value.(*sacloud.VPCRouter)
   259  					found := false
   260  					for _, iface := range vpcRouter.Interfaces {
   261  						if iface.Index == 3 {
   262  							found = true
   263  							if err := testutil.AssertEqual(t, updSwitchID, iface.SwitchID, "VPCRouter.Interfaces[index=2].SwitchID"); err != nil {
   264  								return err
   265  							}
   266  						}
   267  					}
   268  					if err := testutil.AssertTrue(t, found, "VPCRouter.Interfaces[index=2]"); err != nil {
   269  						return err
   270  					}
   271  
   272  					found = false
   273  					for _, nicSetting := range vpcRouter.Settings.Interfaces {
   274  						if nicSetting.Index == 3 {
   275  							found = true
   276  							err := testutil.DoAsserts(
   277  								testutil.AssertEqualFunc(t, "192.168.0.5", nicSetting.VirtualIPAddress, "VPCRouter.Settings.Interfaces.VirtualIPAddress"),
   278  								testutil.AssertEqualFunc(t, []string{"192.168.0.6", "192.168.0.7"}, nicSetting.IPAddress, "VPCRouter.Settings.Interfaces.IPAddress"),
   279  								testutil.AssertEqualFunc(t, 28, nicSetting.NetworkMaskLen, "VPCRouter.Settings.Interfaces.NetworkMaskLen"),
   280  							)
   281  							if err != nil {
   282  								return err
   283  							}
   284  						}
   285  					}
   286  					return testutil.AssertTrue(t, found, "VPCRouter.Setting.Interfaces[index=2]")
   287  				},
   288  			},
   289  		},
   290  		Delete: &testutil.CRUDTestDeleteFunc{
   291  			Func: func(ctx *testutil.CRUDTestContext, caller sacloud.APICaller) error {
   292  				vpcRouterOp := sacloud.NewVPCRouterOp(caller)
   293  				if err := vpcRouterOp.Delete(ctx, testZone, ctx.ID); err != nil {
   294  					return err
   295  				}
   296  
   297  				internetOp := sacloud.NewInternetOp(caller)
   298  				if err := internetOp.Delete(ctx, testZone, routerID); err != nil {
   299  					return err
   300  				}
   301  				swOp := sacloud.NewSwitchOp(caller)
   302  				if err := swOp.Delete(ctx, testZone, switchID); err != nil {
   303  					return err
   304  				}
   305  				return swOp.Delete(ctx, testZone, updSwitchID)
   306  			},
   307  		},
   308  	})
   309  }