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  }