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 }