instance.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. package cucloud
  2. import (
  3. "context"
  4. "fmt"
  5. "net/url"
  6. "strings"
  7. api "yunion.io/x/cloudmux/pkg/apis/compute"
  8. "yunion.io/x/cloudmux/pkg/cloudprovider"
  9. "yunion.io/x/cloudmux/pkg/multicloud"
  10. "yunion.io/x/jsonutils"
  11. "yunion.io/x/pkg/errors"
  12. )
  13. type SInstance struct {
  14. multicloud.SInstanceBase
  15. multicloud.STagBase
  16. host *SHost
  17. ExtraSpecs string
  18. FlavorGroupTypeCn string
  19. NetworkName string
  20. BigRegionName string
  21. CPUUnit string
  22. ImageStatus string
  23. CloudBrandCN string
  24. ServerId string
  25. //FloatingIps []interface{}
  26. FlavorType string
  27. RegionUUID string
  28. FlavorUUID string
  29. HostUUID string
  30. //SuspendHistory []interface{}
  31. VirtualMachineIp string
  32. CloudId string
  33. AzId string
  34. ZoneId string
  35. NetworkID string
  36. ImageUUID string
  37. RAM int
  38. NetCards []SInstanceNic
  39. FlavorName string
  40. ImageId string
  41. ImageName string
  42. ResourceArchitecture string
  43. Volumes []struct {
  44. VolumeType string
  45. VirtualMachineId string
  46. IsDefault string
  47. VolumeUuid string
  48. VolumeName string
  49. VolumeId string
  50. VolumeStatus string
  51. VaultStatus string
  52. VolumeSize string
  53. SysDiskSource string
  54. }
  55. CPU int
  56. FlavorGroupType string
  57. SecurityGroup []struct {
  58. SecurityGroupId string
  59. VirtualMachineId string
  60. NetCardName string
  61. NetCardId string
  62. }
  63. ProdcutName string
  64. Flavor string
  65. AccountId string
  66. ImageLabel string
  67. ExpirationTime string
  68. RegionOssCode string
  69. ServerType string
  70. OperStatus string
  71. SubNetworkName string
  72. ProvinceName string
  73. ZoneCode string
  74. VirtualMachineUUID string
  75. Status string
  76. StatusFlag string
  77. HostName string
  78. VirtualMachineName string
  79. CloudRegionId string
  80. V4SubNetworkName string
  81. AccountName string
  82. TagId []struct {
  83. Key string
  84. Value string
  85. }
  86. RegionName string
  87. FlavorId string
  88. FlavorCode string
  89. SiteName string
  90. NewNetCards []SInstanceNic
  91. NcSecurityStatus string
  92. VaultStatus string
  93. PaymentType string
  94. CloudBrand string
  95. InstanceId string
  96. ResourceGroupId string
  97. ZoneName string
  98. SubNetworkId string
  99. ProductNo string
  100. V4SubNetworkId string
  101. CloudRegionName string
  102. Architecture string
  103. ImageVersion string
  104. InNetIP string
  105. VirtualMachineId string
  106. ResourceGroupName string
  107. RegionOssName string
  108. NatForwardRule string
  109. VaultBindStatus string
  110. ProvinceCode string
  111. ImageOs string
  112. UserID string
  113. CloudRegionCode string
  114. CreateTime string
  115. RegionId string
  116. CloudName string
  117. RAMUnit string
  118. VaultBindId string
  119. VaultBindType string
  120. }
  121. /*
  122. {"code":200,"message":"获取云主机实例列表成功","result":{"total":1,"pageSize":100,"currentSystemTime":1753103116761,"list":[{"extraSpecs":"{\"trait:CUSTOM_S1\":\"required\"}","flavorGroupTypeCn":"通用型1代-S1","networkName":"test","bigRegionName":"华北地区","cpuUnit":"核","imageStatus":"available","cloudBrandCN":"联通云-行业云","serverId":"8004166212734550016","floatingIps":[],"flavorType":"通用型","regionUuid":"","flavorUuid":"6f547294-f320-40c3-9cb2-3dd25d4800bf","hostUuid":"0178ca1d-e841-41d5-a535-a74c5047c1ae","suspendHistory":[],"virtualMachineIp":"192.168.23.87","cloudId":"7961122105171574784","azId":"7961158477647380480","zoneId":"7961158857508716544","networkId":"8619623900411052032","imageUuid":"73d31dbe-5483-4629-9988-b8de5171e918","ram":"1","netCards":[{"securityGroupId":"8635578403548631040","fixIpAddress":"192.168.23.87","virtualMachineId":"8635622412987052032","netCardName":"netCard_OBP7","netCardDefault":"true","innerFloatingIp":"100.127.24.142","netCardId":"8635622413214871552","networkId":"8619623900411052032","subNetworkId":"8635575140815560704"}],"flavorName":"1C1G","imageId":"8598144440476790784","imageName":"AnolisOS 8.8 64位(标准版)","resourceArchitecture":"x86_x86","volumes":[{"volumeType":"sysDisk","virtualMachineId":"8635622412987052032","isDefault":"true","volumeUuid":"25cb9cd9-eb5c-41d4-b6bc-f198b572fb07","volumeName":"574dc7d4b5114d19","volumeId":"8635622605270724608","volumeStatus":"running","vaultStatus":"unbind","volumeSize":"50","sysDiskSource":"console"}],"cpu":"1","flavorGroupType":"s1.medium1","securityGroup":[{"securityGroupId":"8635578403548631040","virtualMachineId":"8635622412987052032","netCardName":"netCard_OBP7","netCardId":"8635622413214871552"}],"prodcutName":"弹性计算弹性云主机","flavor":"通用型 1CPU 1GB","accountId":"679094","imageLabel":"3","expirationTime":"2025-07-21 23:59:59","regionOssCode":"cn-langfang-2","serverType":"云服务器ECS(x86架构)","operStatus":"create-success","subNetworkName":"test333","provinceName":"河北省","zoneCode":"cn-langfang-2a","virtualMachineUuid":"4fd14a3b-fd7f-4310-9ec2-7af2e043f709","status":"running","statusFlag":"200","hostName":"ecm0035.a.cn-langfang-2","virtualMachineName":"test-vm","cloudRegionId":"7961132062134697984","v4SubNetworkName":"test333","accountName":"马鸿飞","tagId":[],"regionName":"廊坊骨干云池","flavorId":"7961207537586601984","flavorCode":"cpu1ram1","siteName":"中国","newNetCards":[{"fixIpAddress":"192.168.23.87","virtualMachineId":"8635622412987052032","netCardName":"netCard_OBP7","netCardDefault":"true","innerFloatingIp":"100.127.24.142","netCardId":"8635622413214871552","networkId":"8619623900411052032","subNetworkId":"8635575140815560704"}],"ncSecurityStatus":"bind-success","vaultStatus":"unbind","paymentType":"按量付费","cloudBrand":"wocloud-industry","instanceId":"8635622412987052033","resourceGroupId":"8020935097949384704","zoneName":"通用专区1","subNetworkId":"8635575140815560704","productNo":"100-1001","v4SubNetworkId":"8635575140815560704","cloudRegionName":"廊坊二区","architecture":"x86","imageVersion":"8.8","inNetIp":"172.19.186.35","virtualMachineId":"8635622412987052032","resourceGroupName":"默认资源组","regionOssName":"廊坊二区","natForwardRule":"empty","vaultBindStatus":"","provinceCode":"18","imageOs":"AnolisOS","userId":"679094","cloudRegionCode":"cn-langfang-2","createTime":"2025-07-21 21:03:59","regionId":"7961131233390559232","cloudName":"联通云","ramUnit":"G","vaultBindId":"","vaultBindType":""}],"pageNum":1}}
  123. */
  124. func (region *SRegion) GetInstances(zoneId string, id string) ([]SInstance, error) {
  125. params := url.Values{}
  126. params.Set("cloudRegionCode", region.CloudRegionCode)
  127. if len(zoneId) > 0 {
  128. params.Set("zoneCode", zoneId)
  129. }
  130. if len(id) > 0 {
  131. params.Set("virtualMachineId", id)
  132. }
  133. resp, err := region.list("/instance/v1/product/ecs", params)
  134. if err != nil {
  135. return nil, err
  136. }
  137. ret := []SInstance{}
  138. err = resp.Unmarshal(&ret)
  139. if err != nil {
  140. return nil, err
  141. }
  142. return ret, nil
  143. }
  144. func (region *SRegion) GetInstance(id string) (*SInstance, error) {
  145. vms, err := region.GetInstances("", id)
  146. if err != nil {
  147. return nil, err
  148. }
  149. for i := range vms {
  150. if vms[i].VirtualMachineId == id {
  151. return &vms[i], nil
  152. }
  153. }
  154. return nil, errors.Wrap(cloudprovider.ErrNotFound, "GetInstance")
  155. }
  156. func (ins *SInstance) AssignSecurityGroup(secgroupId string) error {
  157. return cloudprovider.ErrNotImplemented
  158. }
  159. func (ins *SInstance) AttachDisk(ctx context.Context, diskId string) error {
  160. return cloudprovider.ErrNotImplemented
  161. }
  162. func (ins *SInstance) ChangeConfig(ctx context.Context, opts *cloudprovider.SManagedVMChangeConfig) error {
  163. return cloudprovider.ErrNotImplemented
  164. }
  165. func (ins *SInstance) DeleteVM(ctx context.Context) error {
  166. return cloudprovider.ErrNotImplemented
  167. }
  168. func (ins *SInstance) Refresh() error {
  169. vm, err := ins.host.zone.region.GetInstance(ins.InstanceId)
  170. if err != nil {
  171. return err
  172. }
  173. return jsonutils.Update(ins, vm)
  174. }
  175. func (ins *SInstance) DetachDisk(ctx context.Context, diskId string) error {
  176. return cloudprovider.ErrNotImplemented
  177. }
  178. func (ins *SInstance) GetBios() cloudprovider.TBiosType {
  179. return ""
  180. }
  181. func (ins *SInstance) GetBootOrder() string {
  182. return "bcd"
  183. }
  184. func (ins *SInstance) GetError() error {
  185. return nil
  186. }
  187. func (ins *SInstance) GetFullOsName() string {
  188. return ""
  189. }
  190. func (ins *SInstance) GetGlobalId() string {
  191. return ins.VirtualMachineId
  192. }
  193. func (ins *SInstance) GetId() string {
  194. return ins.VirtualMachineId
  195. }
  196. func (ins *SInstance) GetInstanceType() string {
  197. return ins.FlavorName
  198. }
  199. func (ins *SInstance) GetMachine() string {
  200. return "pc"
  201. }
  202. func (ins *SInstance) GetHostname() string {
  203. return ins.HostName
  204. }
  205. func (ins *SInstance) GetName() string {
  206. return ins.VirtualMachineName
  207. }
  208. func (ins *SInstance) GetOsArch() string {
  209. return ins.Architecture
  210. }
  211. func (ins *SInstance) GetOsDist() string {
  212. return ins.ImageOs
  213. }
  214. func (ins *SInstance) GetOsLang() string {
  215. return ""
  216. }
  217. func (ins *SInstance) GetOsType() cloudprovider.TOsType {
  218. if strings.Contains(strings.ToLower(ins.ImageOs), "windows") {
  219. return cloudprovider.OsTypeWindows
  220. }
  221. return cloudprovider.OsTypeLinux
  222. }
  223. func (ins *SInstance) GetOsVersion() string {
  224. return ins.ImageVersion
  225. }
  226. func (ins *SInstance) GetProjectId() string {
  227. return ""
  228. }
  229. func (ins *SInstance) GetSecurityGroupIds() ([]string, error) {
  230. ret := []string{}
  231. for i := range ins.SecurityGroup {
  232. ret = append(ret, ins.SecurityGroup[i].SecurityGroupId)
  233. }
  234. return ret, nil
  235. }
  236. func (ins *SInstance) GetStatus() string {
  237. switch ins.Status {
  238. case "running":
  239. return api.VM_RUNNING
  240. case "stop":
  241. return api.VM_READY
  242. case "stop-ing":
  243. return api.VM_STOPPING
  244. case "start-ing":
  245. return api.VM_STARTING
  246. default:
  247. return strings.ToLower(ins.Status)
  248. }
  249. }
  250. func (ins *SInstance) GetHypervisor() string {
  251. return api.HYPERVISOR_CUCLOUD
  252. }
  253. func (ins *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) {
  254. return nil, cloudprovider.ErrNotImplemented
  255. }
  256. func (ins *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) {
  257. return nil, cloudprovider.ErrNotImplemented
  258. }
  259. func (ins *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
  260. ret := []cloudprovider.ICloudNic{}
  261. for i := range ins.NetCards {
  262. ret = append(ret, &ins.NetCards[i])
  263. }
  264. return ret, nil
  265. }
  266. func (ins *SInstance) GetVNCInfo(input *cloudprovider.ServerVncInput) (*cloudprovider.ServerVncOutput, error) {
  267. return nil, cloudprovider.ErrNotImplemented
  268. }
  269. func (ins *SInstance) GetVcpuCount() int {
  270. return ins.CPU
  271. }
  272. func (ins *SInstance) GetVmemSizeMB() int {
  273. return ins.RAM * 1024
  274. }
  275. func (ins *SInstance) GetVdi() string {
  276. return ""
  277. }
  278. func (ins *SInstance) GetVga() string {
  279. return ""
  280. }
  281. func (ins *SInstance) RebuildRoot(ctx context.Context, opts *cloudprovider.SManagedVMRebuildRootConfig) (string, error) {
  282. return "", cloudprovider.ErrNotImplemented
  283. }
  284. func (ins *SInstance) SetSecurityGroups(secgroupIds []string) error {
  285. return cloudprovider.ErrNotImplemented
  286. }
  287. func (ins *SInstance) StartVM(ctx context.Context) error {
  288. return cloudprovider.ErrNotImplemented
  289. }
  290. func (region *SRegion) StartVM(instanceId string) error {
  291. _, err := region.post(fmt.Sprintf("/instance/v1/product/ecs/%s/start", instanceId), map[string]interface{}{
  292. "cloudRegionCode": region.CloudRegionCode,
  293. })
  294. if err != nil {
  295. return err
  296. }
  297. return nil
  298. }
  299. func (ins *SInstance) StopVM(ctx context.Context, opts *cloudprovider.ServerStopOptions) error {
  300. return ins.host.zone.region.StopVM(ins.InstanceId)
  301. }
  302. func (region *SRegion) StopVM(instanceId string) error {
  303. _, err := region.post(fmt.Sprintf("/instance/v1/product/ecs/%s/stop", instanceId), map[string]interface{}{
  304. "cloudRegionCode": region.CloudRegionCode,
  305. })
  306. if err != nil {
  307. return err
  308. }
  309. return nil
  310. }
  311. func (ins *SInstance) UpdateUserData(userData string) error {
  312. return cloudprovider.ErrNotImplemented
  313. }
  314. func (ins *SInstance) UpdateVM(ctx context.Context, input cloudprovider.SInstanceUpdateOptions) error {
  315. return cloudprovider.ErrNotImplemented
  316. }
  317. func (ins *SInstance) GetIHost() cloudprovider.ICloudHost {
  318. return ins.host
  319. }
  320. func (ins *SInstance) DeployVM(ctx context.Context, opts *cloudprovider.SInstanceDeployOptions) error {
  321. return cloudprovider.ErrNotImplemented
  322. }