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