github.com/sacloud/libsacloud/v2@v2.32.3/helper/service/server/apply_request.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 server 16 17 import ( 18 "errors" 19 20 diskBuilder "github.com/sacloud/libsacloud/v2/helper/builder/disk" 21 serverBuilder "github.com/sacloud/libsacloud/v2/helper/builder/server" 22 diskService "github.com/sacloud/libsacloud/v2/helper/service/disk" 23 24 "github.com/sacloud/libsacloud/v2/helper/validate" 25 "github.com/sacloud/libsacloud/v2/sacloud" 26 "github.com/sacloud/libsacloud/v2/sacloud/types" 27 ) 28 29 type ApplyRequest struct { 30 Zone string `validate:"required"` 31 ID types.ID 32 33 Name string `validate:"required"` 34 Description string `validate:"min=0,max=512"` 35 Tags types.Tags 36 IconID types.ID 37 CPU int 38 MemoryGB int 39 GPU int 40 Commitment types.ECommitment 41 Generation types.EPlanGeneration 42 InterfaceDriver types.EInterfaceDriver 43 44 BootAfterCreate bool 45 CDROMID types.ID 46 PrivateHostID types.ID 47 48 NetworkInterfaces []*NetworkInterface 49 Disks []*diskService.ApplyRequest 50 NoWait bool 51 52 ForceShutdown bool 53 } 54 55 func (req *ApplyRequest) Validate() error { 56 if err := validate.Struct(req); err != nil { 57 return err 58 } 59 // nic 60 for i, nic := range req.NetworkInterfaces { 61 if err := nic.Validate(); err != nil { 62 return err 63 } 64 if i != 0 && nic.Upstream == "shared" { 65 return errors.New("upstream=shared is not supported for additional NICs") 66 } 67 } 68 return nil 69 } 70 71 func (req *ApplyRequest) nicSetting() serverBuilder.NICSettingHolder { 72 if len(req.NetworkInterfaces) == 0 { 73 return nil 74 } 75 return req.NetworkInterfaces[0].NICSettingHolder() 76 } 77 78 func (req *ApplyRequest) additionalNICSetting() []serverBuilder.AdditionalNICSettingHolder { 79 var results []serverBuilder.AdditionalNICSettingHolder 80 for i, s := range req.NetworkInterfaces { 81 if i == 0 { 82 continue 83 } 84 results = append(results, s.AdditionalNICSettingHolder()) 85 } 86 return results 87 } 88 89 func (req *ApplyRequest) Builder(caller sacloud.APICaller) (*serverBuilder.Builder, error) { 90 var diskBuilders []diskBuilder.Builder 91 for _, d := range req.Disks { 92 b, err := d.Builder(caller) 93 if err != nil { 94 return nil, err 95 } 96 diskBuilders = append(diskBuilders, b) 97 } 98 99 return &serverBuilder.Builder{ 100 Name: req.Name, 101 CPU: req.CPU, 102 MemoryGB: req.MemoryGB, 103 GPU: req.GPU, 104 Commitment: req.Commitment, 105 Generation: req.Generation, 106 InterfaceDriver: req.InterfaceDriver, 107 Description: req.Description, 108 IconID: req.IconID, 109 Tags: req.Tags, 110 BootAfterCreate: req.BootAfterCreate, 111 CDROMID: req.CDROMID, 112 PrivateHostID: req.PrivateHostID, 113 NIC: req.nicSetting(), 114 AdditionalNICs: req.additionalNICSetting(), 115 DiskBuilders: diskBuilders, 116 Client: serverBuilder.NewBuildersAPIClient(caller), 117 ServerID: req.ID, 118 ForceShutdown: req.ForceShutdown, 119 NoWait: req.NoWait, 120 }, nil 121 }