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  }