github.com/sacloud/libsacloud/v2@v2.32.3/helper/service/loadbalancer/builder.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 loadbalancer 16 17 import ( 18 "context" 19 "errors" 20 21 "github.com/sacloud/libsacloud/v2/helper/wait" 22 "github.com/sacloud/libsacloud/v2/pkg/util" 23 "github.com/sacloud/libsacloud/v2/sacloud" 24 "github.com/sacloud/libsacloud/v2/sacloud/types" 25 ) 26 27 type Builder struct { 28 ID types.ID 29 Zone string 30 31 Name string 32 Description string 33 Tags types.Tags 34 IconID types.ID 35 SwitchID types.ID 36 PlanID types.ID 37 VRID int 38 IPAddresses []string 39 NetworkMaskLen int 40 DefaultRoute string 41 VirtualIPAddresses sacloud.LoadBalancerVirtualIPAddresses 42 43 NoWait bool 44 SettingsHash string // for update 45 Client sacloud.LoadBalancerAPI 46 } 47 48 func (b *Builder) Build(ctx context.Context) (*sacloud.LoadBalancer, error) { 49 if b.ID.IsEmpty() { 50 return b.create(ctx) 51 } 52 return b.update(ctx) 53 } 54 55 func (b *Builder) create(ctx context.Context) (*sacloud.LoadBalancer, error) { 56 created, err := b.Client.Create(ctx, b.Zone, &sacloud.LoadBalancerCreateRequest{ 57 SwitchID: b.SwitchID, 58 PlanID: b.PlanID, 59 VRID: b.VRID, 60 IPAddresses: b.IPAddresses, 61 NetworkMaskLen: b.NetworkMaskLen, 62 DefaultRoute: b.DefaultRoute, 63 Name: b.Name, 64 Description: b.Description, 65 Tags: b.Tags, 66 IconID: b.IconID, 67 VirtualIPAddresses: b.VirtualIPAddresses, 68 }) 69 if err != nil { 70 return nil, err 71 } 72 if b.NoWait { 73 return created, nil 74 } 75 return wait.UntilLoadBalancerIsUp(ctx, b.Client, b.Zone, created.ID) 76 } 77 78 func (b *Builder) validateForUpdate(current *sacloud.LoadBalancer) error { 79 if current.SwitchID != b.SwitchID { 80 return errors.New("SwitchID cannot be changed") 81 } 82 if current.PlanID != b.PlanID { 83 return errors.New("PlanID cannot be changed") 84 } 85 if current.VRID != b.VRID { 86 return errors.New("VRID cannot be changed") 87 } 88 if !util.DeepEqual(current.IPAddresses, b.IPAddresses) { 89 return errors.New("IPAddresses cannot be changed") 90 } 91 if current.NetworkMaskLen != b.NetworkMaskLen { 92 return errors.New("NetworkMaskLen cannot be changed") 93 } 94 if current.DefaultRoute != b.DefaultRoute { 95 return errors.New("DefaultRoute cannot be changed") 96 } 97 return nil 98 } 99 100 func (b *Builder) update(ctx context.Context) (*sacloud.LoadBalancer, error) { 101 current, err := b.Client.Read(ctx, b.Zone, b.ID) 102 if err != nil { 103 return nil, err 104 } 105 if err := b.validateForUpdate(current); err != nil { 106 return nil, err 107 } 108 109 updated, err := b.Client.Update(ctx, b.Zone, b.ID, &sacloud.LoadBalancerUpdateRequest{ 110 Name: b.Name, 111 Description: b.Description, 112 Tags: b.Tags, 113 IconID: b.IconID, 114 VirtualIPAddresses: b.VirtualIPAddresses, 115 SettingsHash: b.SettingsHash, 116 }) 117 if err != nil { 118 return nil, err 119 } 120 return updated, b.Client.Config(ctx, b.Zone, b.ID) 121 }