工具箱

等待资源状态

什么时候应该使用它?

等待函数可以等待远程状态达到某一特定的状态,比如:

  • 创建并等待资源创建完成
  • 调用主机开关机并等待开机或关机完成
  • 自定义等待的时间策略

例如:

snippet.go
waiter.StateWaiter{
    Pending: []string{"pending"},
    Target:  []string{"available"},
    Refresh: CustomRefreshFn,
    Timeout: 5 * time.Minute,
}

你可以定义自己的状态刷新函数,函数签名如下:

snippet.go
type RefreshFunc func() (result interface{}, state string, err error)

例如:

snippet.go
func CustomRefreshFn() (interface{}, string, error) {
    inst, err := describeUHostByID(uhostID)
    if err != nil {
        return nil, "", err
    }
 
    if inst == nil || inst.State != "Running" {
        return nil, "pending", nil
    }
 
    return inst, "available", nil
}

高阶选项

超时

Timeout option will wait and refresh until target state or timeout is reached. State waiter use exponential back-off interval.

超时选项用于以指数退避间隔不断刷新状态,直至达到超时时间。

注意,超时时间是必选参数。默认情况下,状态的最大刷新间隔是 10s,如果没有配置其它选项,刷新的间隔类似于:

0 100ms 200ms 400ms 800ms 1.6s 3.2s 6.4s 10s 10s

如果最小刷新间隔 MinTimeout 被设置,刷新间隔将以一个最小刷新时间开始:

0 3s 6s 10s 10s ... (100ms < MinTimeout <= 10s, eg. 3s)

0 11s 10s 10s 10s ... (10s < MinTimeout, eg. 11s)

如果轮询间隔 PollInterval 被设置,指数退避的间隔将不适用,等待函数会简单地使用固定间隔来刷新:

0 3s 3s 3s 3s ... (PollInterval, eg. 3s)

延迟

延迟选项用于在第一次请求前,等待特定的时间.

snippet.go
waiter.StateWaiter{
    Pending: []string{"pending"},
    Target:  []string{"available"},
    Refresh: CustomRefreshFn,
    Timeout: 5 * time.Minute,
    Delay: 30 * time.Second,
}

该选项通常用于在资源创建后等待一小段时间,再开始刷新状态.

Example

可以参考 官方示例 获取完整代码。