github.com/sacloud/iaas-api-go@v1.12.0/helper/wait/wait.go (about) 1 // Copyright 2016-2022 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 wait 16 17 import ( 18 "context" 19 20 "github.com/sacloud/iaas-api-go" 21 "github.com/sacloud/iaas-api-go/defaults" 22 "github.com/sacloud/iaas-api-go/types" 23 ) 24 25 var ( 26 // ApplianceNotFoundRetryCount アプライアンスの待ち処理時に404エラーとなった場合のリトライ回数 27 ApplianceNotFoundRetryCount = 30 28 // InternetNotFoundRetryCount ルータの作成待ち処理時に404エラーとなった場合のリトライ回数 29 InternetNotFoundRetryCount = 360 30 ) 31 32 // UntilArchiveIsReady コピー完了まで待機 33 func UntilArchiveIsReady(ctx context.Context, client iaas.ArchiveAPI, zone string, id types.ID) (*iaas.Archive, error) { 34 lastState, err := iaas.WaiterForReady(func() (interface{}, error) { 35 return client.Read(ctx, zone, id) 36 }).WaitForState(ctx) 37 if lastState != nil { 38 return lastState.(*iaas.Archive), err 39 } 40 return nil, err 41 } 42 43 // UntilDatabaseIsUp 起動まで待機 44 func UntilDatabaseIsUp(ctx context.Context, client iaas.DatabaseAPI, zone string, id types.ID) (*iaas.Database, error) { 45 var database *iaas.Database 46 lastState, err := iaas.WaiterForApplianceUp(func() (interface{}, error) { 47 return client.Read(ctx, zone, id) 48 }, ApplianceNotFoundRetryCount).WaitForState(ctx) 49 if lastState != nil { 50 database = lastState.(*iaas.Database) 51 } 52 if err != nil { 53 return nil, err 54 } 55 // [HACK] データベースアプライアンス場合のみ/appliance/:id/statusも考慮する 56 waiter := iaas.WaiterForUp(func() (interface{}, error) { 57 return client.Status(ctx, zone, id) 58 }) 59 waiter.(*iaas.StatePollingWaiter).Interval = defaults.DefaultDBStatusPollingInterval // HACK 現状は決め打ち、ユースケースが出たら修正する 60 61 _, err = waiter.WaitForState(ctx) 62 return database, err 63 } 64 65 // UntilDatabaseIsDown シャットダウンまで待機 66 func UntilDatabaseIsDown(ctx context.Context, client iaas.DatabaseAPI, zone string, id types.ID) (*iaas.Database, error) { 67 lastState, err := iaas.WaiterForDown(func() (interface{}, error) { 68 return client.Read(ctx, zone, id) 69 }).WaitForState(ctx) 70 if lastState != nil { 71 return lastState.(*iaas.Database), err 72 } 73 return nil, err 74 } 75 76 // UntilDiskIsReady コピー完了/ディスク修正完了まで待機 77 func UntilDiskIsReady(ctx context.Context, client iaas.DiskAPI, zone string, id types.ID) (*iaas.Disk, error) { 78 lastState, err := iaas.WaiterForReady(func() (interface{}, error) { 79 return client.Read(ctx, zone, id) 80 }).WaitForState(ctx) 81 if lastState != nil { 82 return lastState.(*iaas.Disk), err 83 } 84 return nil, err 85 } 86 87 // UntilInternetIsReady 準備完了まで待機 88 func UntilInternetIsReady(ctx context.Context, client iaas.InternetAPI, zone string, id types.ID) (*iaas.Internet, error) { 89 lastState, err := iaas.WaiterForApplianceUp(func() (interface{}, error) { 90 return client.Read(ctx, zone, id) 91 }, InternetNotFoundRetryCount).WaitForState(ctx) 92 if lastState != nil { 93 return lastState.(*iaas.Internet), err 94 } 95 return nil, err 96 } 97 98 // UntilLoadBalancerIsUp 起動完了まで待機 99 func UntilLoadBalancerIsUp(ctx context.Context, client iaas.LoadBalancerAPI, zone string, id types.ID) (*iaas.LoadBalancer, error) { 100 lastState, err := iaas.WaiterForApplianceUp(func() (interface{}, error) { 101 return client.Read(ctx, zone, id) 102 }, ApplianceNotFoundRetryCount).WaitForState(ctx) 103 if lastState != nil { 104 return lastState.(*iaas.LoadBalancer), err 105 } 106 return nil, err 107 } 108 109 // UntilLoadBalancerIsDown シャットダウンまで待機 110 func UntilLoadBalancerIsDown(ctx context.Context, client iaas.LoadBalancerAPI, zone string, id types.ID) (*iaas.LoadBalancer, error) { 111 lastState, err := iaas.WaiterForDown(func() (interface{}, error) { 112 return client.Read(ctx, zone, id) 113 }).WaitForState(ctx) 114 if lastState != nil { 115 return lastState.(*iaas.LoadBalancer), err 116 } 117 return nil, err 118 } 119 120 // UntilMobileGatewayIsReady コピー完了まで待機 121 func UntilMobileGatewayIsReady(ctx context.Context, client iaas.MobileGatewayAPI, zone string, id types.ID) (*iaas.MobileGateway, error) { 122 lastState, err := iaas.WaiterForReady(func() (interface{}, error) { 123 return client.Read(ctx, zone, id) 124 }).WaitForState(ctx) 125 if lastState != nil { 126 return lastState.(*iaas.MobileGateway), err 127 } 128 return nil, err 129 } 130 131 // UntilMobileGatewayIsUp 起動まで待機 132 func UntilMobileGatewayIsUp(ctx context.Context, client iaas.MobileGatewayAPI, zone string, id types.ID) (*iaas.MobileGateway, error) { 133 lastState, err := iaas.WaiterForApplianceUp(func() (interface{}, error) { 134 return client.Read(ctx, zone, id) 135 }, ApplianceNotFoundRetryCount).WaitForState(ctx) 136 if lastState != nil { 137 return lastState.(*iaas.MobileGateway), err 138 } 139 return nil, err 140 } 141 142 // UntilMobileGatewayIsDown シャットダウンまで待機 143 func UntilMobileGatewayIsDown(ctx context.Context, client iaas.MobileGatewayAPI, zone string, id types.ID) (*iaas.MobileGateway, error) { 144 lastState, err := iaas.WaiterForDown(func() (interface{}, error) { 145 return client.Read(ctx, zone, id) 146 }).WaitForState(ctx) 147 if lastState != nil { 148 return lastState.(*iaas.MobileGateway), err 149 } 150 return nil, err 151 } 152 153 // UntilNFSIsUp 起動まで待機 154 func UntilNFSIsUp(ctx context.Context, client iaas.NFSAPI, zone string, id types.ID) (*iaas.NFS, error) { 155 lastState, err := iaas.WaiterForApplianceUp(func() (interface{}, error) { 156 return client.Read(ctx, zone, id) 157 }, ApplianceNotFoundRetryCount).WaitForState(ctx) 158 if lastState != nil { 159 return lastState.(*iaas.NFS), err 160 } 161 return nil, err 162 } 163 164 // UntilNFSIsDown シャットダウンまで待機 165 func UntilNFSIsDown(ctx context.Context, client iaas.NFSAPI, zone string, id types.ID) (*iaas.NFS, error) { 166 lastState, err := iaas.WaiterForDown(func() (interface{}, error) { 167 return client.Read(ctx, zone, id) 168 }).WaitForState(ctx) 169 if lastState != nil { 170 return lastState.(*iaas.NFS), err 171 } 172 return nil, err 173 } 174 175 // UntilServerIsUp 起動まで待機 176 func UntilServerIsUp(ctx context.Context, client iaas.ServerAPI, zone string, id types.ID) (*iaas.Server, error) { 177 lastState, err := iaas.WaiterForUp(func() (interface{}, error) { 178 return client.Read(ctx, zone, id) 179 }).WaitForState(ctx) 180 if lastState != nil { 181 return lastState.(*iaas.Server), err 182 } 183 return nil, err 184 } 185 186 // UntilServerIsDown シャットダウンまで待機 187 func UntilServerIsDown(ctx context.Context, client iaas.ServerAPI, zone string, id types.ID) (*iaas.Server, error) { 188 lastState, err := iaas.WaiterForDown(func() (interface{}, error) { 189 return client.Read(ctx, zone, id) 190 }).WaitForState(ctx) 191 if lastState != nil { 192 return lastState.(*iaas.Server), err 193 } 194 return nil, err 195 } 196 197 // UntilVPCRouterIsReady コピー完了まで待機 198 func UntilVPCRouterIsReady(ctx context.Context, client iaas.VPCRouterAPI, zone string, id types.ID) (*iaas.VPCRouter, error) { 199 lastState, err := iaas.WaiterForReady(func() (interface{}, error) { 200 return client.Read(ctx, zone, id) 201 }).WaitForState(ctx) 202 if lastState != nil { 203 return lastState.(*iaas.VPCRouter), err 204 } 205 return nil, err 206 } 207 208 // UntilVPCRouterIsUp 起動まで待機 209 func UntilVPCRouterIsUp(ctx context.Context, client iaas.VPCRouterAPI, zone string, id types.ID) (*iaas.VPCRouter, error) { 210 lastState, err := iaas.WaiterForApplianceUp(func() (interface{}, error) { 211 return client.Read(ctx, zone, id) 212 }, ApplianceNotFoundRetryCount).WaitForState(ctx) 213 if lastState != nil { 214 return lastState.(*iaas.VPCRouter), err 215 } 216 return nil, err 217 } 218 219 // UntilVPCRouterIsDown シャットダウンまで待機 220 func UntilVPCRouterIsDown(ctx context.Context, client iaas.VPCRouterAPI, zone string, id types.ID) (*iaas.VPCRouter, error) { 221 lastState, err := iaas.WaiterForDown(func() (interface{}, error) { 222 return client.Read(ctx, zone, id) 223 }).WaitForState(ctx) 224 if lastState != nil { 225 return lastState.(*iaas.VPCRouter), err 226 } 227 return nil, err 228 }