github.com/sacloud/iaas-api-go@v1.12.0/test/disk_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/search"
    23  	"github.com/sacloud/iaas-api-go/testutil"
    24  	"github.com/sacloud/iaas-api-go/types"
    25  	"github.com/sacloud/packages-go/size"
    26  	"github.com/stretchr/testify/assert"
    27  )
    28  
    29  func TestDiskOp_BlankDiskCRUD(t *testing.T) {
    30  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
    31  		Parallel: true,
    32  
    33  		SetupAPICallerFunc: singletonAPICaller,
    34  
    35  		Create: &testutil.CRUDTestFunc{
    36  			Func: testDiskCreate,
    37  			CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    38  				ExpectValue:  createDiskExpected,
    39  				IgnoreFields: ignoreDiskFields,
    40  			}),
    41  		},
    42  
    43  		Read: &testutil.CRUDTestFunc{
    44  			Func: testDiskRead,
    45  			CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    46  				ExpectValue:  createDiskExpected,
    47  				IgnoreFields: ignoreDiskFields,
    48  			}),
    49  		},
    50  
    51  		Updates: []*testutil.CRUDTestFunc{
    52  			{
    53  				Func: testDiskUpdate,
    54  				CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    55  					ExpectValue:  updateDiskExpected,
    56  					IgnoreFields: ignoreDiskFields,
    57  				}),
    58  			},
    59  			{
    60  				Func: testDiskUpdateToMin,
    61  				CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    62  					ExpectValue:  updateDiskToMinExpected,
    63  					IgnoreFields: ignoreDiskFields,
    64  				}),
    65  			},
    66  		},
    67  
    68  		Delete: &testutil.CRUDTestDeleteFunc{
    69  			Func: testDiskDelete,
    70  		},
    71  	})
    72  }
    73  
    74  var (
    75  	ignoreDiskFields = []string{
    76  		"ID",
    77  		"DisplayOrder",
    78  		"Availability",
    79  		"DiskPlanName",
    80  		"DiskPlanStorageClass",
    81  		"SizeMB",
    82  		"MigratedMB",
    83  		"SourceDiskID",
    84  		"SourceDiskAvailability",
    85  		"SourceArchiveID",
    86  		"SourceArchiveAvailability",
    87  		"BundleInfo",
    88  		"Server",
    89  		"Storage",
    90  		"CreatedAt",
    91  		"ModifiedAt",
    92  	}
    93  
    94  	createDiskParam = &iaas.DiskCreateRequest{
    95  		DiskPlanID:          types.DiskPlans.SSD,
    96  		Connection:          types.DiskConnections.VirtIO,
    97  		EncryptionAlgorithm: types.DiskEncryptionAlgorithms.AES256XTS,
    98  		Name:                testutil.ResourceName("disk"),
    99  		Description:         "desc",
   100  		Tags:                []string{"tag1", "tag2"},
   101  		SizeMB:              20 * size.GiB,
   102  	}
   103  	createDiskExpected = &iaas.Disk{
   104  		Name:                createDiskParam.Name,
   105  		Description:         createDiskParam.Description,
   106  		Tags:                createDiskParam.Tags,
   107  		DiskPlanID:          createDiskParam.DiskPlanID,
   108  		Connection:          createDiskParam.Connection,
   109  		EncryptionAlgorithm: createDiskParam.EncryptionAlgorithm,
   110  	}
   111  	updateDiskParam = &iaas.DiskUpdateRequest{
   112  		Name:        testutil.ResourceName("disk-upd"),
   113  		Description: "desc-upd",
   114  		Tags:        []string{"tag1-upd", "tag2-upd"},
   115  		IconID:      testIconID,
   116  	}
   117  	updateDiskExpected = &iaas.Disk{
   118  		Name:                updateDiskParam.Name,
   119  		Description:         updateDiskParam.Description,
   120  		Tags:                updateDiskParam.Tags,
   121  		DiskPlanID:          createDiskParam.DiskPlanID,
   122  		Connection:          createDiskParam.Connection,
   123  		EncryptionAlgorithm: createDiskParam.EncryptionAlgorithm,
   124  		IconID:              updateDiskParam.IconID,
   125  	}
   126  	updateDiskToMinParam = &iaas.DiskUpdateRequest{
   127  		Name: testutil.ResourceName("disk-to-min"),
   128  	}
   129  	updateDiskToMinExpected = &iaas.Disk{
   130  		Name:                updateDiskToMinParam.Name,
   131  		DiskPlanID:          createDiskParam.DiskPlanID,
   132  		Connection:          createDiskParam.Connection,
   133  		EncryptionAlgorithm: createDiskParam.EncryptionAlgorithm,
   134  	}
   135  )
   136  
   137  func testDiskCreate(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   138  	client := iaas.NewDiskOp(caller)
   139  	return client.Create(ctx, testZone, createDiskParam, nil)
   140  }
   141  
   142  func testDiskRead(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   143  	client := iaas.NewDiskOp(caller)
   144  	return client.Read(ctx, testZone, ctx.ID)
   145  }
   146  
   147  func testDiskUpdate(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   148  	client := iaas.NewDiskOp(caller)
   149  	return client.Update(ctx, testZone, ctx.ID, updateDiskParam)
   150  }
   151  
   152  func testDiskUpdateToMin(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   153  	client := iaas.NewDiskOp(caller)
   154  	return client.Update(ctx, testZone, ctx.ID, updateDiskToMinParam)
   155  }
   156  
   157  func testDiskDelete(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
   158  	client := iaas.NewDiskOp(caller)
   159  	return client.Delete(ctx, testZone, ctx.ID)
   160  }
   161  
   162  func TestDiskOp_Config(t *testing.T) {
   163  	// source archive
   164  	var archiveID types.ID
   165  
   166  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
   167  		Parallel:           true,
   168  		SetupAPICallerFunc: singletonAPICaller,
   169  		Setup: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
   170  			client := iaas.NewArchiveOp(singletonAPICaller())
   171  			searched, err := client.Find(ctx, testZone, &iaas.FindCondition{
   172  				Filter: search.Filter{
   173  					search.Key("Tags.Name"): search.TagsAndEqual("current-stable", "distro-ubuntu"),
   174  				},
   175  			})
   176  			if !assert.NoError(t, err) {
   177  				return err
   178  			}
   179  			if searched.Count == 0 {
   180  				return errors.New("archive is not found")
   181  			}
   182  			archiveID = searched.Archives[0].ID
   183  			return nil
   184  		},
   185  		Create: &testutil.CRUDTestFunc{
   186  			Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   187  				client := iaas.NewDiskOp(singletonAPICaller())
   188  				disk, err := client.Create(ctx, testZone, &iaas.DiskCreateRequest{
   189  					Name:            testutil.ResourceName("disk-edit"),
   190  					DiskPlanID:      types.DiskPlans.SSD,
   191  					SizeMB:          20 * size.GiB,
   192  					SourceArchiveID: archiveID,
   193  				}, nil)
   194  				if err != nil {
   195  					return nil, err
   196  				}
   197  				if _, err = iaas.WaiterForReady(func() (interface{}, error) {
   198  					return client.Read(ctx, testZone, disk.ID)
   199  				}).WaitForState(ctx); err != nil {
   200  					return disk, err
   201  				}
   202  
   203  				return disk, nil
   204  			},
   205  		},
   206  		Read: &testutil.CRUDTestFunc{
   207  			Func: testDiskRead,
   208  		},
   209  		Updates: []*testutil.CRUDTestFunc{
   210  			{
   211  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   212  					// edit disk
   213  					client := iaas.NewDiskOp(singletonAPICaller())
   214  					err := client.Config(ctx, testZone, ctx.ID, &iaas.DiskEditRequest{
   215  						Background: true,
   216  						Password:   "password",
   217  						SSHKeys: []*iaas.DiskEditSSHKey{
   218  							{
   219  								PublicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4LDQuDiKecOJDPY9InS7EswZ2fPnoRZXc48T1EqyRLyJhgEYGSDWaBiMDs2R/lWgA81Hp37qhrNqZPjFHUkBr93FOXxt9W0m1TNlkNepK0Uyi+14B2n0pdoeqsKEkb3sTevWF0ztxxWrwUd7Mems2hf+wFODITHYye9RlDAKLKPCFRvlQ9xQj4bBWOogQwoaXMSK1znMPjudcm1tRry4KIifLdXmwVKU4qDPGxoXfqs44Dgsikk43UVBStQ7IFoqPgAqcJFSGHLoMS7tPKdTvY9+GME5QidWK84gl69piAkgIdwd+JTMUOc/J+9DXAt220HqZ6l3yhWG5nIgi0x8n",
   220  							},
   221  						},
   222  						DisablePWAuth: true,
   223  						EnableDHCP:    true,
   224  						HostName:      "hostname",
   225  						UserIPAddress: "192.2.0.11",
   226  						UserSubnet: &iaas.DiskEditUserSubnet{
   227  							DefaultRoute:   "192.2.0.1",
   228  							NetworkMaskLen: 24,
   229  						},
   230  					})
   231  					if err != nil {
   232  						return nil, err
   233  					}
   234  					// wait
   235  					_, err = iaas.WaiterForReady(func() (interface{}, error) {
   236  						return client.Read(ctx, testZone, ctx.ID)
   237  					}).WaitForState(ctx)
   238  					return nil, err
   239  				},
   240  			},
   241  		},
   242  		Delete: &testutil.CRUDTestDeleteFunc{
   243  			Func: testDiskDelete,
   244  		},
   245  	})
   246  }