github.com/sacloud/iaas-api-go@v1.12.0/test/internet_op_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 test
    16  
    17  import (
    18  	"errors"
    19  	"testing"
    20  
    21  	"github.com/sacloud/iaas-api-go"
    22  	"github.com/sacloud/iaas-api-go/testutil"
    23  	"github.com/sacloud/iaas-api-go/types"
    24  	"github.com/stretchr/testify/assert"
    25  )
    26  
    27  func TestInternetOp_CRUD(t *testing.T) {
    28  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
    29  		Parallel: true,
    30  
    31  		SetupAPICallerFunc: singletonAPICaller,
    32  		Create: &testutil.CRUDTestFunc{
    33  			Func: testInternetCreate,
    34  			CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    35  				ExpectValue:  createInternetExpected,
    36  				IgnoreFields: ignoreInternetFields,
    37  			}),
    38  		},
    39  		Read: &testutil.CRUDTestFunc{
    40  			Func: testInternetRead,
    41  			CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    42  				ExpectValue:  createInternetExpected,
    43  				IgnoreFields: ignoreInternetFields,
    44  			}),
    45  		},
    46  		Updates: []*testutil.CRUDTestFunc{
    47  			{
    48  				Func: testInternetUpdate,
    49  				CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    50  					ExpectValue:  updateInternetExpected,
    51  					IgnoreFields: ignoreInternetFields,
    52  				}),
    53  			},
    54  			{
    55  				Func: testInternetUpdateToMin,
    56  				CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    57  					ExpectValue:  updateInternetToMinExpected,
    58  					IgnoreFields: ignoreInternetFields,
    59  				}),
    60  			},
    61  		},
    62  		Delete: &testutil.CRUDTestDeleteFunc{
    63  			Func: testInternetDelete,
    64  		},
    65  	})
    66  }
    67  
    68  var (
    69  	ignoreInternetFields = []string{
    70  		"ID",
    71  		"CreatedAt",
    72  		"Switch",
    73  	}
    74  	createInternetParam = &iaas.InternetCreateRequest{
    75  		Name:           testutil.ResourceName("internet"),
    76  		Description:    "desc",
    77  		Tags:           []string{"tag1", "tag2"},
    78  		NetworkMaskLen: 28,
    79  		BandWidthMbps:  100,
    80  	}
    81  	createInternetExpected = &iaas.Internet{
    82  		Name:           createInternetParam.Name,
    83  		Description:    createInternetParam.Description,
    84  		Tags:           createInternetParam.Tags,
    85  		NetworkMaskLen: createInternetParam.NetworkMaskLen,
    86  		BandWidthMbps:  createInternetParam.BandWidthMbps,
    87  	}
    88  	updateInternetParam = &iaas.InternetUpdateRequest{
    89  		Name:        testutil.ResourceName("internet-upd"),
    90  		Tags:        []string{"tag1-upd", "tag2-upd"},
    91  		Description: "desc-upd",
    92  		IconID:      testIconID,
    93  	}
    94  	updateInternetExpected = &iaas.Internet{
    95  		Name:           updateInternetParam.Name,
    96  		Description:    updateInternetParam.Description,
    97  		Tags:           updateInternetParam.Tags,
    98  		NetworkMaskLen: createInternetParam.NetworkMaskLen,
    99  		BandWidthMbps:  createInternetParam.BandWidthMbps,
   100  		IconID:         testIconID,
   101  	}
   102  	updateInternetToMinParam = &iaas.InternetUpdateRequest{
   103  		Name: testutil.ResourceName("internet-to-min"),
   104  	}
   105  	updateInternetToMinExpected = &iaas.Internet{
   106  		Name:           updateInternetToMinParam.Name,
   107  		NetworkMaskLen: createInternetParam.NetworkMaskLen,
   108  		BandWidthMbps:  createInternetParam.BandWidthMbps,
   109  	}
   110  )
   111  
   112  func testInternetCreate(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   113  	client := iaas.NewInternetOp(caller)
   114  	return client.Create(ctx, testZone, createInternetParam)
   115  }
   116  
   117  func testInternetRead(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   118  	client := iaas.NewInternetOp(caller)
   119  	return client.Read(ctx, testZone, ctx.ID)
   120  }
   121  
   122  func testInternetUpdate(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   123  	client := iaas.NewInternetOp(caller)
   124  	return client.Update(ctx, testZone, ctx.ID, updateInternetParam)
   125  }
   126  
   127  func testInternetUpdateToMin(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   128  	client := iaas.NewInternetOp(caller)
   129  	return client.Update(ctx, testZone, ctx.ID, updateInternetToMinParam)
   130  }
   131  
   132  func testInternetDelete(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
   133  	client := iaas.NewInternetOp(caller)
   134  	return client.Delete(ctx, testZone, ctx.ID)
   135  }
   136  
   137  func TestInternetOp_Subnet(t *testing.T) {
   138  	client := iaas.NewInternetOp(singletonAPICaller())
   139  	var minIP, maxIP string
   140  	var subnetID types.ID
   141  
   142  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
   143  		Parallel:           true,
   144  		IgnoreStartupWait:  true,
   145  		SetupAPICallerFunc: singletonAPICaller,
   146  		Create: &testutil.CRUDTestFunc{
   147  			Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   148  				var internet *iaas.Internet
   149  				internet, err := client.Create(ctx, testZone, createInternetParam)
   150  				if err != nil {
   151  					return nil, err
   152  				}
   153  				waiter := iaas.WaiterForApplianceUp(func() (interface{}, error) {
   154  					return client.Read(ctx, testZone, internet.ID)
   155  				}, 100)
   156  				if _, err := waiter.WaitForState(ctx); err != nil {
   157  					t.Error("WaitForUp is failed: ", err)
   158  					return nil, err
   159  				}
   160  
   161  				internet, err = client.Read(ctx, testZone, internet.ID)
   162  				if err != nil {
   163  					return nil, err
   164  				}
   165  
   166  				swOp := iaas.NewSwitchOp(singletonAPICaller())
   167  				sw, err := swOp.Read(ctx, testZone, internet.Switch.ID)
   168  				if err != nil {
   169  					return nil, err
   170  				}
   171  				minIP = sw.Subnets[0].AssignedIPAddressMin
   172  				maxIP = sw.Subnets[0].AssignedIPAddressMax
   173  
   174  				return internet, nil
   175  			},
   176  		},
   177  		Read: &testutil.CRUDTestFunc{
   178  			Func: testInternetRead,
   179  		},
   180  		Updates: []*testutil.CRUDTestFunc{
   181  			// add subnet
   182  			{
   183  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   184  					// add subnet
   185  					subnet, err := client.AddSubnet(ctx, testZone, ctx.ID, &iaas.InternetAddSubnetRequest{
   186  						NetworkMaskLen: 28,
   187  						NextHop:        minIP,
   188  					})
   189  					if err != nil {
   190  						return nil, err
   191  					}
   192  
   193  					if !assert.Len(t, subnet.IPAddresses, 16) {
   194  						return nil, errors.New("unexpected state: Subnet.IPAddresses")
   195  					}
   196  					if !assert.Equal(t, minIP, subnet.NextHop) {
   197  						return nil, errors.New("unexpected state: Subnet.NextHop")
   198  					}
   199  					subnetID = subnet.ID
   200  					return subnet, nil
   201  				},
   202  				SkipExtractID: true,
   203  			},
   204  			// update subnet
   205  			{
   206  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   207  					subnet, err := client.UpdateSubnet(ctx, testZone, ctx.ID, subnetID, &iaas.InternetUpdateSubnetRequest{
   208  						NextHop: maxIP,
   209  					})
   210  					if err != nil {
   211  						return nil, err
   212  					}
   213  
   214  					if !assert.Len(t, subnet.IPAddresses, 16) {
   215  						return nil, errors.New("unexpected state: Subnet.IPAddresses")
   216  					}
   217  					if !assert.Equal(t, maxIP, subnet.NextHop) {
   218  						return nil, errors.New("unexpected state: Subnet.NextHop")
   219  					}
   220  					return subnet, nil
   221  				},
   222  				SkipExtractID: true,
   223  			},
   224  			// delete subnet
   225  			{
   226  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   227  					return nil, client.DeleteSubnet(ctx, testZone, ctx.ID, subnetID)
   228  				},
   229  				SkipExtractID: true,
   230  			},
   231  		},
   232  		Delete: &testutil.CRUDTestDeleteFunc{
   233  			Func: testInternetDelete,
   234  		},
   235  	})
   236  }