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 }