github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgThirdCloud/SDK.go (about)

     1  package kmgThirdCloud
     2  
     3  func handleErr(err error) {
     4  	if err != nil {
     5  		panic(err)
     6  	}
     7  }
     8  
     9  type Instance struct {
    10  	Ip          string
    11  	Id          string //第三方只认他们自己产生的ID
    12  	Name        string
    13  	BelongToSDK SDK
    14  }
    15  
    16  //检查是否满足 interface
    17  var _ SDK = (*RackspaceSDK)(nil)
    18  var _ SDK = (*AliyunSDK)(nil)
    19  
    20  //本接口中,为降低调用者复杂度,不提供机器「状态」,因为状态较为复杂,而调用者其实只关心正在可用的,即正在运行的机器
    21  type SDK interface {
    22  	//Field
    23  	//Region       string //实例所在地区
    24  	//InstanceName string
    25  	//ImageName    string //操作系统
    26  	//FlavorName   string //实例配置,如 4 CPU / 4GB RAM
    27  
    28  	//以实例外网 Ip 为主键的方法,通常用这些已经够了
    29  	//创建一个新实例,保证实例可用,出现错误 panic
    30  	CreateInstance() (ip string)
    31  	DeleteInstance(ip string)
    32  	RenameInstanceByIp(name, ip string)
    33  	ListAllRunningInstance() (ipInstanceMap map[string]Instance)
    34  
    35  	//向云服务提供商申请分配新实例,http 请求后,立即返回实例ID,不要求实例当时可用
    36  	AllocateNewInstance() (id string)
    37  	//让一台实例变为可用状态
    38  	//不断重试,彻底失败,会返回空字符串
    39  	MakeInstanceAvailable(id string) (ip string)
    40  
    41  	//以实例 Id 为主键的方法,一般不使用,当没有实例没有 ip 时可以使用
    42  	ListAllInstance() (idInstanceMap map[string]Instance)
    43  	DeleteInstanceById(id string)
    44  }
    45  
    46  type SDKCache struct {
    47  	cache SDK
    48  	Init  func() SDK
    49  }
    50  
    51  //Lazy Getter
    52  func (sdkCache SDKCache) Get() SDK {
    53  	if sdkCache.cache == nil {
    54  		sdkCache.cache = sdkCache.Init()
    55  	}
    56  	return sdkCache.cache
    57  }