diff --git a/go.mod b/go.mod
index f03e83d356..5250863fc3 100644
--- a/go.mod
+++ b/go.mod
@@ -83,7 +83,7 @@ require (
k8s.io/client-go v0.19.3
k8s.io/cluster-bootstrap v0.19.3
moul.io/http2curl/v2 v2.3.0
- yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027025551-a53fc39099d0
+ yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027072226-b82b6cc2b7d2
yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32
yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19
yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361
diff --git a/go.sum b/go.sum
index c792e0106f..aac813391f 100644
--- a/go.sum
+++ b/go.sum
@@ -1179,8 +1179,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
-yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027025551-a53fc39099d0 h1:vIfj2xB25ZhXF8HQgsUfUIzos81nkz+n+RCMvxeDqe8=
-yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027025551-a53fc39099d0/go.mod h1:McRjoG2gaOUisB+Qa41kLCNZhr0lsCu4apEjTiphXVY=
+yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027072226-b82b6cc2b7d2 h1:767uclY/nlFXrd4LN6WRtkphTZHT+KYHDaH2PdhZnAI=
+yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027072226-b82b6cc2b7d2/go.mod h1:McRjoG2gaOUisB+Qa41kLCNZhr0lsCu4apEjTiphXVY=
yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug=
yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
diff --git a/pkg/apis/webconsole/consts.go b/pkg/apis/webconsole/consts.go
index 740c1e3ac5..1f6c940c2d 100644
--- a/pkg/apis/webconsole/consts.go
+++ b/pkg/apis/webconsole/consts.go
@@ -20,20 +20,21 @@ const (
)
const (
- VNC = "vnc"
- ALIYUN = "aliyun"
- QCLOUD = "qcloud"
- OPENSTACK = "openstack"
- SPICE = "spice"
- WMKS = "wmks"
- WS = "websocket"
- VMRC = "vmrc"
- ZSTACK = "zstack"
- CTYUN = "ctyun"
- HUAWEI = "huawei"
- HCS = "hcs"
- APSARA = "apsara"
- JDCLOUD = "jdcloud"
- CLOUDPODS = "cloudpods"
- PROXMOX = "proxmox"
+ VNC = "vnc"
+ ALIYUN = "aliyun"
+ QCLOUD = "qcloud"
+ OPENSTACK = "openstack"
+ SPICE = "spice"
+ WMKS = "wmks"
+ WS = "websocket"
+ VMRC = "vmrc"
+ ZSTACK = "zstack"
+ CTYUN = "ctyun"
+ HUAWEI = "huawei"
+ HCS = "hcs"
+ APSARA = "apsara"
+ JDCLOUD = "jdcloud"
+ CLOUDPODS = "cloudpods"
+ PROXMOX = "proxmox"
+ VOLC_ENGINE = "volcengine"
)
diff --git a/pkg/webconsole/handlers.go b/pkg/webconsole/handlers.go
index 9c3c2de091..82b891f907 100644
--- a/pkg/webconsole/handlers.go
+++ b/pkg/webconsole/handlers.go
@@ -245,7 +245,8 @@ func handleServerRemoteConsole(ctx context.Context, w http.ResponseWriter, r *ht
case session.ALIYUN, session.QCLOUD, session.OPENSTACK,
session.VMRC, session.ZSTACK, session.CTYUN,
session.HUAWEI, session.HCS, session.APSARA,
- session.JDCLOUD, session.CLOUDPODS, session.PROXMOX:
+ session.JDCLOUD, session.CLOUDPODS, session.PROXMOX,
+ session.VOLCENGINE:
responsePublicCloudConsole(ctx, info, w)
case session.VNC, session.SPICE, session.WMKS:
handleDataSession(ctx, info, w, url.Values{"password": {info.GetPassword()}}, true)
diff --git a/pkg/webconsole/server/server.go b/pkg/webconsole/server/server.go
index 08b3a2ae51..3c1e8d966c 100644
--- a/pkg/webconsole/server/server.go
+++ b/pkg/webconsole/server/server.go
@@ -21,6 +21,7 @@ import (
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/appctx"
+ "yunion.io/x/pkg/utils"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/httperrors"
@@ -58,7 +59,12 @@ func (s *ConnectionServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
switch protocol {
case session.VNC, session.SPICE:
info := sessionObj.ISessionData.(*session.RemoteConsoleInfo)
- if info.Hypervisor == api.HYPERVISOR_OPENSTACK || info.Hypervisor == api.HYPERVISOR_PROXMOX || info.Hypervisor == api.HYPERVISOR_CTYUN {
+ if utils.IsInStringArray(info.Hypervisor, []string{
+ api.HYPERVISOR_OPENSTACK,
+ api.HYPERVISOR_PROXMOX,
+ api.HYPERVISOR_CTYUN,
+ api.HYPERVISOR_VOLCENGINE,
+ }) {
srv, err = NewWebsocketProxyServer(sessionObj)
} else {
srv, err = NewWebsockifyServer(sessionObj)
diff --git a/pkg/webconsole/session/remote_console.go b/pkg/webconsole/session/remote_console.go
index c8da4dbc23..0e074614c7 100644
--- a/pkg/webconsole/session/remote_console.go
+++ b/pkg/webconsole/session/remote_console.go
@@ -30,22 +30,23 @@ import (
)
const (
- VNC = api.VNC
- ALIYUN = api.ALIYUN
- QCLOUD = api.QCLOUD
- OPENSTACK = api.OPENSTACK
- SPICE = api.SPICE
- WMKS = api.WMKS
- WS = api.WS
- VMRC = api.VMRC
- ZSTACK = api.ZSTACK
- CTYUN = api.CTYUN
- HUAWEI = api.HUAWEI
- HCS = api.HCS
- APSARA = api.APSARA
- JDCLOUD = api.JDCLOUD
- CLOUDPODS = api.CLOUDPODS
- PROXMOX = api.PROXMOX
+ VNC = api.VNC
+ ALIYUN = api.ALIYUN
+ QCLOUD = api.QCLOUD
+ OPENSTACK = api.OPENSTACK
+ SPICE = api.SPICE
+ WMKS = api.WMKS
+ WS = api.WS
+ VMRC = api.VMRC
+ ZSTACK = api.ZSTACK
+ CTYUN = api.CTYUN
+ HUAWEI = api.HUAWEI
+ HCS = api.HCS
+ APSARA = api.APSARA
+ JDCLOUD = api.JDCLOUD
+ CLOUDPODS = api.CLOUDPODS
+ PROXMOX = api.PROXMOX
+ VOLCENGINE = api.VOLC_ENGINE
)
type RemoteConsoleInfo struct {
@@ -124,7 +125,7 @@ func (info *RemoteConsoleInfo) GetConnectParams() (string, error) {
return info.getQcloudURL()
case CLOUDPODS:
return info.getCloudpodsURL()
- case OPENSTACK, VMRC, ZSTACK, CTYUN, HUAWEI, HCS, JDCLOUD, PROXMOX:
+ case OPENSTACK, VMRC, ZSTACK, CTYUN, HUAWEI, HCS, JDCLOUD, PROXMOX, VOLCENGINE:
return info.Url, nil
default:
return "", fmt.Errorf("Can't convert protocol %s to connect params", info.Protocol)
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 26cad499ac..6fdba9b442 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1438,7 +1438,7 @@ sigs.k8s.io/structured-merge-diff/v4/value
# sigs.k8s.io/yaml v1.2.0
## explicit; go 1.12
sigs.k8s.io/yaml
-# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027025551-a53fc39099d0
+# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231027072226-b82b6cc2b7d2
## explicit; go 1.18
yunion.io/x/cloudmux/pkg/apis
yunion.io/x/cloudmux/pkg/apis/billing
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/instance_base.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/instance_base.go
index 85da6f3cfb..60ed93aff1 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/instance_base.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/instance_base.go
@@ -86,3 +86,7 @@ func (self *SInstanceBase) GetInternetMaxBandwidthOut() int {
func (ins *SInstanceBase) GetPowerStates() string {
return ""
}
+
+func (instance *SInstanceBase) GetError() error {
+ return nil
+}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/charge.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/charge.go
index e4ab58987e..6559cb90ca 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/charge.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/charge.go
@@ -16,27 +16,8 @@ package volcengine
import (
"time"
-
- api "yunion.io/x/cloudmux/pkg/apis/billing"
)
-const (
- PrePaidInstanceChargeType TChargeType = "PrePaid"
- PostPaidInstanceChargeType TChargeType = "PostPaid"
- DefaultInstanceChargeType = PostPaidInstanceChargeType
-)
-
-func convertChargeType(ct TChargeType) string {
- switch ct {
- case PrePaidInstanceChargeType:
- return api.BILLING_TYPE_PREPAID
- case PostPaidInstanceChargeType:
- return api.BILLING_TYPE_POSTPAID
- default:
- return ""
- }
-}
-
func convertExpiredAt(expired time.Time) time.Time {
if !expired.IsZero() {
now := time.Now()
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/disk.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/disk.go
index 1219805b0f..ebf400b12e 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/disk.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/disk.go
@@ -20,10 +20,10 @@ import (
"time"
"yunion.io/x/jsonutils"
- "yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/utils"
+ billing_api "yunion.io/x/cloudmux/pkg/apis/billing"
api "yunion.io/x/cloudmux/pkg/apis/compute"
"yunion.io/x/cloudmux/pkg/cloudprovider"
"yunion.io/x/cloudmux/pkg/multicloud"
@@ -46,10 +46,11 @@ type SDisk struct {
Kind string
CreatedAt time.Time
UpdatedAt time.Time
- BillingType TChargeType
+ BillingType string
PayType string
TradeStatus int
ExpiredTime time.Time
+ ProjectName string
DeleteWithInstance bool
}
@@ -58,28 +59,7 @@ func (disk *SDisk) GetId() string {
}
func (disk *SDisk) Delete(ctx context.Context) error {
- _, err := disk.storage.zone.region.getDisk(disk.VolumeId)
- if err != nil {
- if errors.Cause(err) == cloudprovider.ErrNotFound {
- return nil
- }
- return errors.Wrapf(err, "Failed to find disk %s when delete", disk.VolumeId)
- }
-
- for {
- err := disk.storage.zone.region.DeleteDisk(disk.VolumeId)
- if err != nil {
- if isError(err, "IncorrectDiskStatus") {
- log.Infof("The disk is initializing, try later ...")
- time.Sleep(10 * time.Second)
- } else {
- return errors.Wrapf(err, "DeleteDisk fail")
- }
- } else {
- break
- }
- }
- return cloudprovider.WaitDeleted(disk, 10*time.Second, 300*time.Second) // 5minutes
+ return disk.storage.zone.region.DeleteDisk(disk.VolumeId)
}
func (disk *SDisk) Resize(ctx context.Context, sizeMb int64) error {
@@ -111,17 +91,11 @@ func (disk *SDisk) GetStatus() string {
}
func (disk *SDisk) Refresh() error {
- new, err := disk.storage.zone.region.getDisk(disk.VolumeId)
+ _disk, err := disk.storage.zone.region.getDisk(disk.VolumeId)
if err != nil {
return err
}
- return jsonutils.Update(disk, new)
-}
-
-func (disk *SDisk) ResizeDisk(newSize int64) error {
- // newSize 单位为 GB. 只能扩容,不能缩减。范围参考下面链接。
- // https://www.volcengine.com/docs/6396/76561
- return disk.storage.zone.region.ResizeDisk(disk.VolumeId, newSize)
+ return jsonutils.Update(disk, _disk)
}
func (disk *SDisk) GetDiskFormat() string {
@@ -180,11 +154,14 @@ func (disk *SDisk) GetISnapshots() ([]cloudprovider.ICloudSnapshot, error) {
}
func (disk *SDisk) Reset(ctx context.Context, snapshotId string) (string, error) {
- return "", disk.storage.zone.region.resetDisk(disk.VolumeId, snapshotId)
+ return "", cloudprovider.ErrNotSupported
}
func (disk *SDisk) GetBillingType() string {
- return convertChargeType(disk.BillingType)
+ if disk.BillingType == "post" {
+ return billing_api.BILLING_TYPE_POSTPAID
+ }
+ return billing_api.BILLING_TYPE_PREPAID
}
func (disk *SDisk) GetCreatedAt() time.Time {
@@ -209,25 +186,13 @@ func (disk *SDisk) Rebuild(ctx context.Context) error {
}
func (disk *SDisk) GetProjectId() string {
- return ""
+ return disk.ProjectName
}
// Snapshot API is not supported, refer to
// https://www.volcengine.com/docs/6460/195549
func (disk *SDisk) CreateISnapshot(ctx context.Context, name, desc string) (cloudprovider.ICloudSnapshot, error) {
- snapshotId, err := disk.storage.zone.region.CreateSnapshot(disk.VolumeId, name, desc)
- if err != nil {
- return nil, errors.Wrapf(err, "CreateSnapshot")
- }
- snapshot, err := disk.storage.zone.region.GetISnapshotById(snapshotId)
- if err != nil {
- return nil, errors.Wrapf(err, "getSnapshot(%s)", snapshotId)
- }
- err = cloudprovider.WaitStatus(snapshot, api.SNAPSHOT_READY, 15*time.Second, 3600*time.Second)
- if err != nil {
- return nil, errors.Wrapf(err, "cloudprovider.WaitStatus")
- }
- return snapshot, nil
+ return nil, cloudprovider.ErrNotSupported
}
// region
@@ -248,11 +213,9 @@ func (region *SRegion) GetDisks(instanceId string, zoneId string, category strin
if len(category) > 0 {
params["VolumeType"] = category
}
- if len(diskIds) > 0 {
- for index, id := range diskIds {
- key := fmt.Sprintf("VolumeIds.%d", index+1)
- params[key] = id
- }
+ for index, id := range diskIds {
+ key := fmt.Sprintf("VolumeIds.%d", index+1)
+ params[key] = id
}
body, err := region.storageRequest("DescribeVolumes", params)
@@ -261,11 +224,11 @@ func (region *SRegion) GetDisks(instanceId string, zoneId string, category strin
}
disks := make([]SDisk, 0)
- err = body.Unmarshal(&disks, "Result", "Volumes")
+ err = body.Unmarshal(&disks, "Volumes")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal disk details fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return disks, int(total), nil
}
@@ -287,7 +250,7 @@ func (region *SRegion) CreateDisk(zoneId string, category string, name string, s
if err != nil {
return "", err
}
- return body.GetString("Result", "VolumeId")
+ return body.GetString("VolumeId")
}
func (region *SRegion) getDisk(diskId string) (*SDisk, error) {
@@ -306,7 +269,6 @@ func (region *SRegion) getDisk(diskId string) (*SDisk, error) {
func (region *SRegion) DeleteDisk(diskId string) error {
params := make(map[string]string)
params["VolumeId"] = diskId
-
_, err := region.storageRequest("DeleteVolume", params)
return err
}
@@ -323,12 +285,3 @@ func (region *SRegion) ResizeDisk(diskId string, sizeGb int64) error {
return nil
}
-
-func (region *SRegion) resetDisk(diskId, snapshotId string) error {
- // not supported API
- return errors.Wrapf(cloudprovider.ErrNotImplemented, "resetDisk")
-}
-
-func (region *SRegion) CreateSnapshot(diskId, name, desc string) (string, error) {
- return "", errors.Wrapf(cloudprovider.ErrNotImplemented, "CreateSnapshot")
-}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/eip.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/eip.go
index b410afb462..dd70265386 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/eip.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/eip.go
@@ -252,7 +252,7 @@ func (region *SRegion) GetEips(eipIds []string, associatedId string, addresses [
}
eips := make([]SEipAddress, 0)
- err = body.Unmarshal(&eips, "Result", "EipAddresses")
+ err = body.Unmarshal(&eips, "EipAddresses")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal EipAddress details fail")
}
@@ -308,7 +308,7 @@ func (region *SRegion) AllocateEIP(opts *cloudprovider.SEip) (*SEipAddress, erro
return nil, errors.Wrapf(err, "AllocateEipAddress fail")
}
- eipId, err := body.GetString("Result", "AllocationId")
+ eipId, err := body.GetString("AllocationId")
if err != nil {
return nil, errors.Wrapf(err, "get AllocationId after created fail")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/host.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/host.go
index f7325fc02b..e76167a22c 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/host.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/host.go
@@ -7,9 +7,7 @@ import (
"yunion.io/x/cloudmux/pkg/cloudprovider"
"yunion.io/x/cloudmux/pkg/multicloud"
"yunion.io/x/jsonutils"
- "yunion.io/x/log"
"yunion.io/x/pkg/errors"
- "yunion.io/x/pkg/util/billing"
)
type SHost struct {
@@ -174,11 +172,8 @@ func (host *SHost) GetInstanceById(instanceId string) (*SInstance, error) {
return inst, nil
}
-func (host *SHost) CreateVM(desc *cloudprovider.SManagedVMCreateConfig) (cloudprovider.ICloudVM, error) {
- vmId, err := host._createVM(desc.Name, desc.Hostname, desc.ExternalImageId, desc.SysDisk, desc.Cpu, desc.MemoryMB,
- desc.InstanceType, desc.ExternalNetworkId, desc.IpAddr, desc.Description, desc.Password,
- desc.DataDisks, desc.PublicKey, desc.ExternalSecgroupIds, desc.UserData, desc.BillingCycle,
- desc.ProjectId, desc.Tags, desc.SPublicIpInfo)
+func (host *SHost) CreateVM(opts *cloudprovider.SManagedVMCreateConfig) (cloudprovider.ICloudVM, error) {
+ vmId, err := host._createVM(opts)
if err != nil {
return nil, err
}
@@ -189,57 +184,21 @@ func (host *SHost) CreateVM(desc *cloudprovider.SManagedVMCreateConfig) (cloudpr
return vm, nil
}
-func (host *SHost) _createVM(name string, hostname string, imgId string,
- sysDisk cloudprovider.SDiskInfo, cpu int, memMB int, instanceType string,
- networkID string, ipAddr string, desc string, passwd string,
- dataDisks []cloudprovider.SDiskInfo, publicKey string, secgroupIds []string,
- userData string, bc *billing.SBillingCycle, projectId string,
- tags map[string]string, publicIp cloudprovider.SPublicIpInfo,
-) (string, error) {
+func (host *SHost) _createVM(opts *cloudprovider.SManagedVMCreateConfig) (string, error) {
var err error
- keypair := ""
- if len(publicKey) > 0 {
- keypair, err = host.zone.region.syncKeypair(publicKey)
+ if len(opts.PublicKey) > 0 {
+ opts.KeypairName, err = host.zone.region.syncKeypair(opts.PublicKey)
if err != nil {
return "", err
}
}
- img, err := host.zone.region.GetImage(imgId)
- if err != nil {
- return "", errors.Wrapf(err, "GetImage fail")
- }
- if img.Status != ImageStatusAvailable {
- log.Errorf("image %s status %s", imgId, img.Status)
- return "", fmt.Errorf("image not ready")
- }
-
- disks := make([]SDisk, len(dataDisks)+1)
- disks[0].Size = img.Size
- if sysDisk.SizeGB > 0 && sysDisk.SizeGB > img.Size {
- disks[0].Size = sysDisk.SizeGB
- }
- storage, err := host.zone.getStorageByCategory(sysDisk.StorageType)
- if err != nil {
- return "", fmt.Errorf("storage %s not avaiable: %s", sysDisk.StorageType, err)
- }
- disks[0].VolumeType = storage.storageType
-
- for i, dataDisk := range dataDisks {
- disks[i+1].Size = dataDisk.SizeGB
- storage, err := host.zone.getStorageByCategory(dataDisk.StorageType)
- if err != nil {
- return "", fmt.Errorf("storage %s not avaiable: %s", dataDisk.StorageType, err)
- }
- disks[i+1].VolumeType = storage.storageType
- }
-
- if len(instanceType) == 0 {
+ if len(opts.InstanceType) == 0 {
return "", fmt.Errorf("instance type must be specified")
}
- vmId, err := host.zone.region.CreateInstance(name, hostname, imgId, instanceType, secgroupIds, host.zone.ZoneId, desc, passwd, disks, networkID, ipAddr, keypair, userData, bc, projectId, tags)
+ vmId, err := host.zone.region.CreateInstance(host.zone.ZoneId, opts)
if err != nil {
- return "", errors.Wrapf(err, "Failed to create %s", instanceType)
+ return "", errors.Wrapf(err, "Failed to create %s", opts.InstanceType)
}
return vmId, nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/image.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/image.go
index a4573ec531..be526e7996 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/image.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/image.go
@@ -120,7 +120,7 @@ func (region *SRegion) ImportImage(name string, osArch string, osType string, pl
if err != nil {
return "", errors.Wrapf(err, "ImportImage")
}
- imageId, err := body.GetString("Result", "ImageId")
+ imageId, err := body.GetString("ImageId")
if err != nil {
return "", errors.Wrap(err, "Unmarsh imageId failed")
}
@@ -138,7 +138,7 @@ func (region *SRegion) ExportImage(imageId, bucketName string) (string, error) {
if err != nil {
return "", errors.Wrapf(err, "ExportImage")
}
- taskId, err := body.GetString("Result", "TaskId")
+ taskId, err := body.GetString("TaskId")
if err != nil {
return "", errors.Wrapf(err, "Unmarshal")
}
@@ -298,11 +298,11 @@ func (region *SRegion) getImages(params map[string]string) ([]SImage, string, er
}
images := make([]SImage, 0)
- err = body.Unmarshal(&images, "Result", "Images")
+ err = body.Unmarshal(&images, "Images")
if err != nil {
return nil, "", errors.Wrapf(err, "Unmarshal images fail")
}
- nextToken, _ := body.GetString("Result", "NextToken")
+ nextToken, _ := body.GetString("NextToken")
return images, nextToken, nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go
index 57f813a8a9..fba3a8475f 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instance.go
@@ -16,19 +16,17 @@ package volcengine
import (
"context"
- "encoding/base64"
"fmt"
"strings"
"time"
+ billing_api "yunion.io/x/cloudmux/pkg/apis/billing"
api "yunion.io/x/cloudmux/pkg/apis/compute"
"yunion.io/x/cloudmux/pkg/cloudprovider"
"yunion.io/x/cloudmux/pkg/multicloud"
"yunion.io/x/jsonutils"
- "yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/util/billing"
- "yunion.io/x/pkg/util/cloudinit"
"yunion.io/x/pkg/util/imagetools"
"yunion.io/x/pkg/util/osprofile"
"yunion.io/x/pkg/utils"
@@ -47,8 +45,6 @@ const (
InstanceStatusDeleting = "DELETING"
)
-type TChargeType string
-
type SSecurityGroupIds []string
type SRdmaIPAddress []string
@@ -80,7 +76,7 @@ type SInstance struct {
RdmaIpAddress SRdmaIPAddress
KeyPairName string
KeyPairId string
- InstanceChargeType TChargeType
+ InstanceChargeType string
StoppedMode string
SpotStrategy string
DeploymentSetId string
@@ -124,7 +120,7 @@ func (instance *SInstance) GetUserData() (string, error) {
if err != nil {
return "", errors.Wrapf(err, "GetUserData")
}
- userData, err := body.GetString("Result", "UserData")
+ userData, err := body.GetString("UserData")
if err != nil {
return "", errors.Wrapf(err, "GetUserData")
}
@@ -136,10 +132,12 @@ func (region *SRegion) GetInstance(instanceId string) (*SInstance, error) {
if err != nil {
return nil, err
}
- if len(instances) == 0 {
- return nil, cloudprovider.ErrNotFound
+ for i := range instances {
+ if instances[i].InstanceId == instanceId {
+ return &instances[i], nil
+ }
}
- return &instances[0], nil
+ return nil, errors.Wrapf(cloudprovider.ErrNotFound, instanceId)
}
func (region *SRegion) GetInstances(zoneId string, ids []string, limit int, token string) ([]SInstance, string, error) {
@@ -165,11 +163,11 @@ func (region *SRegion) GetInstances(zoneId string, ids []string, limit int, toke
return nil, "", errors.Wrapf(err, "GetInstances fail")
}
instances := make([]SInstance, 0)
- err = body.Unmarshal(&instances, "Result", "Instances")
+ err = body.Unmarshal(&instances, "Instances")
if err != nil {
return nil, "", errors.Wrapf(err, "Unmarshal details fail")
}
- nextToken, _ := body.GetString("Result", "NextToken")
+ nextToken, _ := body.GetString("NextToken")
return instances, nextToken, nil
}
@@ -198,11 +196,8 @@ func (instance *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) {
idisks := make([]cloudprovider.ICloudDisk, len(disks))
for i := 0; i < len(disks); i += 1 {
- store, err := instance.host.zone.getStorageByCategory(disks[i].VolumeType)
- if err != nil {
- return nil, errors.Wrap(err, "getStorageByCategory")
- }
- disks[i].storage = store
+ storage := &SStorage{zone: instance.host.zone, storageType: disks[i].VolumeType}
+ disks[i].storage = storage
idisks[i] = &disks[i]
}
return idisks, nil
@@ -226,18 +221,12 @@ func (instance *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) {
}
func (instance *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
- networkInterfaces := instance.NetworkInterfaces
- nics := make([]cloudprovider.ICloudNic, 0)
- for _, ni := range networkInterfaces {
- nic := SInstanceNic{
- instance: instance,
- id: ni.NetworkInterfaceId,
- ipAddr: ni.PrimaryIpAddress,
- macAddr: ni.MacAddress,
- }
- nics = append(nics, &nic)
+ ret := []cloudprovider.ICloudNic{}
+ for i := range instance.NetworkInterfaces {
+ instance.NetworkInterfaces[i].region = instance.host.zone.region
+ ret = append(ret, &instance.NetworkInterfaces[i])
}
- return nics, nil
+ return ret, nil
}
func (instance *SInstance) GetId() string {
@@ -264,11 +253,16 @@ func (instance *SInstance) GetInstanceType() string {
}
func (instance *SInstance) GetSecurityGroupIds() ([]string, error) {
- ret := []string{}
- for _, net := range instance.NetworkInterfaces {
- ret = append(ret, net.SecurityGroupIds...)
+ nics, _, err := instance.host.zone.region.GetNetworkInterfaces(instance.InstanceId, 1, 10)
+ if err != nil {
+ return nil, err
}
- return ret, nil
+ for _, nic := range nics {
+ if len(nic.SecurityGroupIds) > 0 {
+ return nic.SecurityGroupIds, nil
+ }
+ }
+ return []string{}, nil
}
func (instance *SInstance) GetVcpuCount() int {
@@ -365,18 +359,37 @@ func (instance *SInstance) GetCreatedAt() time.Time {
}
func (instance *SInstance) GetExpiredAt() time.Time {
- // return instance.ExpiredAt
+ if instance.InstanceChargeType != "PostPaid" {
+ return instance.ExpiredAt
+ }
return time.Time{}
}
-func (instance *SInstance) SetSecurityGroups(secgroupIds []string) error {
- return errors.Wrapf(cloudprovider.ErrNotImplemented, "SetSecurityGroups")
+func (instance *SInstance) GetBillingType() string {
+ if instance.InstanceChargeType == "PostPaid" {
+ return billing_api.BILLING_TYPE_POSTPAID
+ }
+ return billing_api.BILLING_TYPE_PREPAID
}
-func (instance *SInstance) GetError() error {
+func (instance *SInstance) SetSecurityGroups(secgroupIds []string) error {
+ for _, nic := range instance.NetworkInterfaces {
+ return instance.host.zone.region.ModifyNetworkInterfaceAttributes(nic.NetworkInterfaceId, secgroupIds)
+ }
return nil
}
+func (self *SRegion) ModifyNetworkInterfaceAttributes(id string, secgroupIds []string) error {
+ params := map[string]string{
+ "NetworkInterfaceId": id,
+ }
+ for i, id := range secgroupIds {
+ params[fmt.Sprintf("SecurityGroupIds.%d", i+1)] = id
+ }
+ _, err := self.vpcRequest("ModifyNetworkInterfaceAttributes", params)
+ return err
+}
+
func (instance *SInstance) ChangeConfig(ctx context.Context, config *cloudprovider.SManagedVMChangeConfig) error {
if config.InstanceType == "nil" {
return errors.Wrapf(cloudprovider.ErrInputParameter, "InstanceType")
@@ -385,7 +398,32 @@ func (instance *SInstance) ChangeConfig(ctx context.Context, config *cloudprovid
}
func (instance *SInstance) GetVNCInfo(input *cloudprovider.ServerVncInput) (*cloudprovider.ServerVncOutput, error) {
- return nil, cloudprovider.ErrNotSupported
+ url, err := instance.host.zone.region.DescribeInstanceVncUrl(instance.InstanceId)
+ if err != nil {
+ return nil, err
+ }
+ protocol := api.HYPERVISOR_VOLCENGINE
+ if strings.HasPrefix(url, "wss") {
+ protocol = "vnc"
+ }
+ ret := &cloudprovider.ServerVncOutput{
+ Url: url,
+ Protocol: protocol,
+ InstanceId: instance.InstanceId,
+ Hypervisor: api.HYPERVISOR_VOLCENGINE,
+ }
+ return ret, nil
+}
+
+func (self *SRegion) DescribeInstanceVncUrl(id string) (string, error) {
+ params := map[string]string{
+ "InstanceId": id,
+ }
+ resp, err := self.ecsRequest("DescribeInstanceVncUrl", params)
+ if err != nil {
+ return "", err
+ }
+ return resp.GetString("VncUrl")
}
func (instance *SInstance) StartVM(ctx context.Context) error {
@@ -402,20 +440,7 @@ func (instance *SInstance) StopVM(ctx context.Context, opts *cloudprovider.Serve
}
func (instance *SInstance) DeleteVM(ctx context.Context) error {
- for {
- err := instance.host.zone.region.DeleteVM(instance.InstanceId)
- if err != nil {
- if isError(err, "IncorrectInstanceStatus.Initializing") {
- log.Infof("The instance is initializing, try later ...")
- time.Sleep(10 * time.Second)
- } else {
- return errors.Wrapf(err, "DeleteVM fail")
- }
- } else {
- break
- }
- }
- return cloudprovider.WaitDeleted(instance, 10*time.Second, 300*time.Second)
+ return instance.host.zone.region.DeleteVM(instance.InstanceId)
}
func (instance *SInstance) UpdateVM(ctx context.Context, input cloudprovider.SInstanceUpdateOptions) error {
@@ -455,78 +480,7 @@ func (instance *SInstance) GetProjectId() string {
}
func (instance *SInstance) RebuildRoot(ctx context.Context, desc *cloudprovider.SManagedVMRebuildRootConfig) (string, error) {
- udata, err := instance.GetUserData()
- if err != nil {
- return "", err
- }
-
- image, err := instance.host.zone.region.GetImage(desc.ImageId)
- if err != nil {
- return "", errors.Wrapf(err, "GetImage fail")
- }
-
- keypairName := instance.KeyPairName
- if len(desc.PublicKey) > 0 {
- keypairName, err = instance.host.zone.region.syncKeypair(desc.PublicKey)
- if err != nil {
- return "", fmt.Errorf("RebuildRoot.syncKeypair %s", err)
- }
- }
-
- userdata := ""
- srcOsType := strings.ToLower(string(instance.GetOsType()))
- destOsType := strings.ToLower(string(image.GetOsType()))
- winOS := strings.ToLower(osprofile.OS_TYPE_WINDOWS)
-
- cloudconfig := &cloudinit.SCloudConfig{}
- if srcOsType != winOS && len(udata) > 0 {
- _cloudconfig, err := cloudinit.ParseUserDataBase64(udata)
- if err != nil {
- log.Debugf("RebuildRoot invalid instance user data %s", udata)
- } else {
- cloudconfig = _cloudconfig
- }
- }
-
- if (srcOsType != winOS && destOsType != winOS) || (srcOsType == winOS && destOsType != winOS) {
- // linux/windows to linux
- loginUser := cloudinit.NewUser(api.VM_AWS_DEFAULT_LOGIN_USER)
- loginUser.SudoPolicy(cloudinit.USER_SUDO_NOPASSWD)
- if len(desc.PublicKey) > 0 {
- loginUser.SshKey(desc.PublicKey)
- cloudconfig.MergeUser(loginUser)
- } else if len(desc.Password) > 0 {
- cloudconfig.SshPwauth = cloudinit.SSH_PASSWORD_AUTH_ON
- loginUser.Password(desc.Password)
- cloudconfig.MergeUser(loginUser)
- }
-
- userdata = cloudconfig.UserDataBase64()
- } else {
- // linux/windows to windows
- data := ""
- if len(desc.Password) > 0 {
- cloudconfig.SshPwauth = cloudinit.SSH_PASSWORD_AUTH_ON
- loginUser := cloudinit.NewUser(api.VM_AWS_DEFAULT_WINDOWS_LOGIN_USER)
- loginUser.SudoPolicy(cloudinit.USER_SUDO_NOPASSWD)
- loginUser.Password(desc.Password)
- cloudconfig.MergeUser(loginUser)
- data = fmt.Sprintf("%s", cloudconfig.UserDataPowerShell())
- } else {
- if len(udata) > 0 {
- data = fmt.Sprintf("%s", udata)
- }
- }
-
- userdata = base64.StdEncoding.EncodeToString([]byte(data))
- }
-
- diskId, err := instance.host.zone.region.ReplaceSystemDisk(ctx, instance.InstanceId, desc.ImageId, desc.Password, keypairName, userdata)
- if err != nil {
- return "", err
- }
-
- return diskId, nil
+ return "", cloudprovider.ErrNotSupported
}
func (instance *SInstance) SaveImage(opts *cloudprovider.SaveImageOptions) (cloudprovider.ICloudImage, error) {
@@ -538,96 +492,87 @@ func (instance *SInstance) SaveImage(opts *cloudprovider.SaveImageOptions) (clou
}
// region
-func (region *SRegion) CreateInstance(
- name string,
- hostname string,
- imageId string,
- instanceType string,
- securityGroupIds []string,
- zoneId string,
- desc string,
- passwd string,
- disks []SDisk,
- networkID string,
- ipAddr string,
- keypair string,
- userData string,
- bc *billing.SBillingCycle,
- projectId string,
- tags map[string]string,
-) (string, error) {
+func (region *SRegion) CreateInstance(zoneId string, opts *cloudprovider.SManagedVMCreateConfig) (string, error) {
params := make(map[string]string)
params["RegionId"] = region.RegionId
- params["ImageId"] = imageId
- params["InstanceType"] = instanceType
+ params["ImageId"] = opts.ExternalImageId
+ params["InstanceType"] = opts.InstanceType
params["ZoneId"] = zoneId
- params["InstanceName"] = name
- params["ProjectName"] = projectId
- if len(hostname) > 0 {
- params["HostName"] = hostname
+ params["InstanceName"] = opts.Name
+ if len(opts.ProjectId) > 0 {
+ params["ProjectName"] = opts.ProjectId
}
- params["Description"] = desc
- if len(passwd) > 0 {
- params["Password"] = passwd
- } else {
+ if len(opts.Hostname) > 0 {
+ params["HostName"] = opts.Hostname
+ }
+ params["Description"] = opts.Description
+ if len(opts.Password) > 0 {
+ params["Password"] = opts.Password
+ }
+ if len(opts.KeypairName) > 0 {
+ params["KeyPairName"] = opts.KeypairName
+ }
+ if len(opts.Password) == 0 && len(opts.KeypairName) == 0 {
params["KeepImageCredential"] = "True"
}
- if len(keypair) > 0 {
- params["KeyPairName"] = keypair
+
+ if len(opts.UserData) > 0 {
+ params["UserData"] = opts.UserData
}
- if len(userData) > 0 {
- params["UserData"] = userData
+ tagIdx := 1
+ for k, v := range opts.Tags {
+ params[fmt.Sprintf("Tags.%d.Key", tagIdx)] = k
+ params[fmt.Sprintf("Tags.%d.Value", tagIdx)] = v
+ tagIdx += 1
}
- if len(tags) > 0 {
- tagIdx := 1
- for k, v := range tags {
- params[fmt.Sprintf("Tag.%d.Key", tagIdx)] = k
- params[fmt.Sprintf("Tag.%d.Value", tagIdx)] = v
- tagIdx += 1
- }
+ params["Volumes.1.Size"] = fmt.Sprintf("%d", opts.SysDisk.SizeGB)
+ params["Volumes.1.VolumeType"] = opts.SysDisk.StorageType
+
+ for idx, disk := range opts.DataDisks {
+ params[fmt.Sprintf("Volumes.%d.Size", idx+2)] = fmt.Sprintf("%d", disk.SizeGB)
+ params[fmt.Sprintf("Volumes.%d.VolumeType", idx+2)] = disk.StorageType
}
- if len(disks) > 0 {
- for idx, disk := range disks {
- diskIdx := idx + 1
- params[fmt.Sprintf("Volumes.%d.Size", diskIdx)] = fmt.Sprintf("%d", disk.Size)
- params[fmt.Sprintf("Volumes.%d.VolumeType", diskIdx)] = disk.VolumeType
- }
+ params["NetworkInterfaces.1.SubnetId"] = opts.ExternalNetworkId
+ if len(opts.IpAddr) > 0 {
+ //params["NetworkInterfaces.1.IpAddr"] = opts.IpAddr
}
-
- params["NetworkInterfaces.1.SubnetId"] = ipAddr
- // currently only support binding the first NetworkInterface securitygroup
- for idx, id := range securityGroupIds {
+ for idx, id := range opts.ExternalSecgroupIds {
params[fmt.Sprintf("NetworkInterfaces.1.SecurityGroupIds.%d", idx+1)] = id
}
- if bc != nil {
+ params["InstanceChargeType"] = "PostPaid"
+ params["SpotStrategy"] = "NoSpot"
+ if opts.BillingCycle != nil {
params["InstanceChargeType"] = "PrePaid"
- err := billingCycle2Params(bc, params)
+ err := billingCycle2Params(opts.BillingCycle, params)
if err != nil {
return "", err
}
- if bc.AutoRenew {
+ params["AutoRenew"] = "False"
+ if opts.BillingCycle.AutoRenew {
params["AutoRenew"] = "true"
params["AutoRenewPeriod"] = "1"
- } else {
- params["AutoRenew"] = "False"
}
- } else {
- params["InstanceChargeType"] = "PostPaid"
- params["SpotStrategy"] = "NoSpot"
}
params["ClientToken"] = utils.GenRequestId(20)
- body, err := region.ecsRequest("CreateInstance", params)
+ resp, err := region.ecsRequest("RunInstances", params)
if err != nil {
- return "", errors.Wrapf(err, "CreateInstance fail")
+ return "", errors.Wrapf(err, "RunInstances")
}
- instanceId, _ := body.GetString("InstanceId")
- return instanceId, nil
+ ids := []string{}
+ err = resp.Unmarshal(&ids, "InstanceIds")
+ if err != nil {
+ return "", err
+ }
+ for _, id := range ids {
+ return id, nil
+ }
+ return "", errors.Wrapf(cloudprovider.ErrNotFound, "after created")
}
func (region *SRegion) RenewInstance(instanceId string, bc billing.SBillingCycle) error {
@@ -677,15 +622,7 @@ func (region *SRegion) StopVM(instanceId string, isForce, stopCharging bool) err
}
func (region *SRegion) DeleteVM(instanceId string) error {
- status, err := region.GetInstanceStatus(instanceId)
- if err != nil {
- return errors.Wrapf(err, "Fail to get instance status on DeleteVM")
- }
- log.Debugf("Instance status on delete is %s", status)
- if status != InstanceStatusStopped {
- log.Warningf("DeleteVM: vm status is %s expect %s", status, InstanceStatusStopped)
- }
- return region.doDeleteVM(instanceId)
+ return region.instanceOperation(instanceId, "DeleteInstance", nil)
}
func (region *SRegion) doStartVM(instanceId string) error {
@@ -706,10 +643,6 @@ func (region *SRegion) doStopVM(instanceId string, isForce, stopCharging bool) e
return region.instanceOperation(instanceId, "StopInstance", params)
}
-func (region *SRegion) doDeleteVM(instanceId string) error {
- return region.instanceOperation(instanceId, "DeleteInstance", nil)
-}
-
func (region *SRegion) modifyInstanceAttribute(instanceId string, params map[string]string) error {
return region.instanceOperation(instanceId, "ModifyInstanceAttribute", params)
}
@@ -757,21 +690,18 @@ func (region *SRegion) DeployVM(instanceId string, name string, password string,
if len(params) > 0 {
return region.modifyInstanceAttribute(instanceId, params)
- } else {
- return nil
}
+ return nil
}
func (region *SRegion) DetachDisk(instanceId string, diskId string) error {
params := make(map[string]string)
params["InstanceId"] = instanceId
params["VolumeId"] = diskId
- log.Infof("Detach instance %s disk %s", instanceId, diskId)
_, err := region.storageRequest("DetachVolume", params)
if err != nil {
return errors.Wrap(err, "DetachDisk")
}
-
return nil
}
@@ -783,30 +713,9 @@ func (region *SRegion) AttachDisk(instanceId string, diskId string) error {
if err != nil {
return errors.Wrapf(err, "AttachDisk %s to %s fail", diskId, instanceId)
}
-
return nil
}
-func (region *SRegion) ReplaceSystemDisk(ctx context.Context, instanceId string, imageId string, passwd string, keypairName string, userdata string) (string, error) {
- params := make(map[string]string)
- params["InstanceId"] = instanceId
- params["ImageId"] = imageId
- if len(passwd) > 0 {
- params["Password"] = passwd
- } else {
- params["KeepImageCredential"] = "True"
- }
- if len(keypairName) > 0 {
- params["KeyPairName"] = keypairName
- }
- _, err := region.ecsRequest("ReplaceSystemVolume", params)
- if err != nil {
- return "", err
- }
- // volcengine does not return volumeId
- return "", nil
-}
-
func (region *SRegion) SaveImage(instanceId string, opts *cloudprovider.SaveImageOptions) (*SImage, error) {
params := map[string]string{
"InstanceId": instanceId,
@@ -818,7 +727,7 @@ func (region *SRegion) SaveImage(instanceId string, opts *cloudprovider.SaveImag
if err != nil {
return nil, errors.Wrapf(err, "CreateImage")
}
- imageId, err := body.GetString("Result", "IamgeId")
+ imageId, err := body.GetString("IamgeId")
if err != nil {
return nil, errors.Wrapf(err, "Unmarshal")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go
index 590e0bef4f..f73b67365b 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/instancenic.go
@@ -16,14 +16,14 @@ package volcengine
import (
"fmt"
+ "time"
- "github.com/golang-plus/errors"
"yunion.io/x/cloudmux/pkg/cloudprovider"
+ "yunion.io/x/cloudmux/pkg/multicloud"
+ "yunion.io/x/pkg/errors"
)
type SInstanceNic struct {
- cloudprovider.DummyICloudNic
-
instance *SInstance
id string
@@ -31,40 +31,60 @@ type SInstanceNic struct {
macAddr string
}
-func (nic *SInstanceNic) GetId() string {
- return nic.id
+type SNetworkInterface struct {
+ cloudprovider.DummyICloudNic
+ multicloud.SNetworkInterfaceBase
+ VolcEngineTags
+ region *SRegion
+
+ InstanceId string
+ NetworkInterfaceId string
+ VpcId string
+ SubnetId string
+ PrimaryIpAddress string
+ Type string
+ MacAddress string
+ CreationTime time.Time
+ NetworkInterfaceName string
+ PrivateIpSets SPrivateIpSets
+ ResourceGroupId string
+ SecurityGroupIds SSecurityGroupIds
+ Status string
+ ZoneId string
+ PrivateIpAddresses []string
+ AssociatedElasticIp SAssociatedElasticIp
}
-func (nic *SInstanceNic) GetIP() string {
- return nic.ipAddr
+func (nic *SNetworkInterface) GetIP() string {
+ return nic.PrimaryIpAddress
}
-func (nic *SInstanceNic) GetMAC() string {
- return nic.macAddr
+func (nic *SNetworkInterface) GetMAC() string {
+ return nic.MacAddress
}
-func (nic *SInstanceNic) InClassicNetwork() bool {
+func (nic *SNetworkInterface) InClassicNetwork() bool {
return false
}
-func (nic *SInstanceNic) GetDriver() string {
+func (nic *SNetworkInterface) GetDriver() string {
return "virtio"
}
-func (nic *SInstanceNic) GetINetworkId() string {
- return nic.instance.NetworkInterfaces[0].SubnetId
+func (nic *SNetworkInterface) GetINetworkId() string {
+ return nic.SubnetId
}
-func (nic *SInstanceNic) GetSubAddress() ([]string, error) {
- return nic.instance.host.zone.region.GetSubAddress(nic.id)
+func (nic *SNetworkInterface) GetSubAddress() ([]string, error) {
+ return nic.region.GetSubAddress(nic.NetworkInterfaceId)
}
-func (nic *SInstanceNic) AssignAddress(ipAddrs []string) error {
- return nic.instance.host.zone.region.AssignAddres(nic.id, ipAddrs)
+func (nic *SNetworkInterface) AssignAddress(ipAddrs []string) error {
+ return nic.region.AssignAddres(nic.NetworkInterfaceId, ipAddrs)
}
-func (nic *SInstanceNic) UnassignAddress(ipAddrs []string) error {
- return nic.instance.host.zone.region.UnassignAddress(nic.id, ipAddrs)
+func (nic *SNetworkInterface) UnassignAddress(ipAddrs []string) error {
+ return nic.region.UnassignAddress(nic.NetworkInterfaceId, ipAddrs)
}
func (region *SRegion) GetSubAddress(nicId string) ([]string, error) {
@@ -77,7 +97,7 @@ func (region *SRegion) GetSubAddress(nicId string) ([]string, error) {
}
interfaces := []SNetworkInterface{}
- err = body.Unmarshal(&interfaces, "Result", "NetworkInterfaceSets")
+ err = body.Unmarshal(&interfaces, "NetworkInterfaceSets")
if err != nil {
return nil, errors.Wrapf(err, "Unmarshal")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/keypairs.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/keypairs.go
index ae3acfc97d..52621ba72d 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/keypairs.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/keypairs.go
@@ -23,7 +23,6 @@ import (
"github.com/aokoli/goutils"
"golang.org/x/crypto/ssh"
- "yunion.io/x/log"
"yunion.io/x/pkg/errors"
)
@@ -54,11 +53,11 @@ func (region *SRegion) GetKeypairs(finger string, name string, limit int, token
}
keypairs := make([]SKeypair, 0)
- err = body.Unmarshal(&keypairs, "Result", "KeyPairs")
+ err = body.Unmarshal(&keypairs, "KeyPairs")
if err != nil {
return nil, "", errors.Wrapf(err, "Unmarshal keypair fail")
}
- nextToken, _ := body.GetString("Result", "NextToken")
+ nextToken, _ := body.GetString("NextToken")
return keypairs, nextToken, nil
}
@@ -72,9 +71,8 @@ func (region *SRegion) ImportKeypair(name string, pubKey string) (*SKeypair, err
return nil, errors.Wrapf(err, "ImportKeypair fail")
}
- log.Debugf("%s", body)
keypair := SKeypair{}
- err = body.Unmarshal(&keypair, "Result")
+ err = body.Unmarshal(&keypair)
if err != nil {
return nil, errors.Wrapf(err, "Unmarshal keypair fail")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natdtable.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natdtable.go
index 5d3fd120ed..8f6c4f6690 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natdtable.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natdtable.go
@@ -125,11 +125,11 @@ func (region *SRegion) GetDnatEntries(natGatewayId string, pageNumber int, pageS
return nil, 0, errors.Wrapf(err, "DescribeDnatEntries fail")
}
entries := make([]SDNATEntry, 0)
- err = body.Unmarshal(&entries, "Result", "DnatEntries")
+ err = body.Unmarshal(&entries, "DnatEntries")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal entries fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return entries, int(total), nil
}
@@ -142,7 +142,7 @@ func (region *SRegion) GetDnatEntry(natGatewayId string, dnatEntryID string) (SD
return SDNATEntry{}, errors.Wrapf(err, "DescribeDnatEntries fail")
}
entries := make([]SDNATEntry, 0)
- err = body.Unmarshal(&entries, "Result", "DnatEntries")
+ err = body.Unmarshal(&entries, "DnatEntries")
if err != nil {
return SDNATEntry{}, errors.Wrapf(err, "Unmarshal entries fail")
}
@@ -164,7 +164,7 @@ func (region *SRegion) CreateDnatEntry(rule cloudprovider.SNatDRule, natGatewayI
if err != nil {
return "", err
}
- entryID, _ := body.GetString("Result", "DnatEntryId")
+ entryID, _ := body.GetString("DnatEntryId")
return entryID, nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natgateway.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natgateway.go
index 28cc044777..5692c45482 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natgateway.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natgateway.go
@@ -220,11 +220,11 @@ func (region *SRegion) GetNatGateways(vpcId string, natGatewayId string, pageNum
return nil, 0, errors.Wrapf(err, "DescribeNatGateways")
}
gateways := make([]SNatGateway, 0)
- err = body.Unmarshal(&gateways, "Result", "NatGateways")
+ err = body.Unmarshal(&gateways, "NatGateways")
if err != nil {
return nil, 0, errors.Wrapf(err, "body.Unmarshal")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return gateways, int(total), nil
}
@@ -257,7 +257,7 @@ func (region *SRegion) CreateNatGateway(opts *cloudprovider.NatGatewayCreateOpti
if err != nil {
return nil, errors.Wrapf(err, "CreateNatGateway")
}
- natId, err := resp.GetString("Result", "NatGatewayId")
+ natId, err := resp.GetString("NatGatewayId")
if err != nil {
return nil, errors.Wrapf(err, "resp.Get(NatGatewayId)")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natstable.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natstable.go
index c5a8f5d8d8..4d80869279 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natstable.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/natstable.go
@@ -138,11 +138,11 @@ func (region *SRegion) GetSnatEntries(natGatewayId string, pageNumber int, pageS
return nil, 0, errors.Wrapf(err, "DescribeSNATEntries fail")
}
entries := make([]SSNATEntry, 0)
- err = body.Unmarshal(&entries, "Result", "SnatEntries")
+ err = body.Unmarshal(&entries, "SnatEntries")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal entries fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return entries, int(total), nil
}
@@ -155,7 +155,7 @@ func (region *SRegion) GetSnatEntry(natGatewayId string, snatEntryID string) (SS
return SSNATEntry{}, errors.Wrapf(err, "DescribeSnatEntries fail")
}
entries := make([]SSNATEntry, 0)
- err = body.Unmarshal(&entries, "Result", "SnatEntries")
+ err = body.Unmarshal(&entries, "SnatEntries")
if err != nil {
return SSNATEntry{}, errors.Wrapf(err, "Unmarshal entries fail")
}
@@ -182,7 +182,7 @@ func (region *SRegion) CreateSnatEntry(rule cloudprovider.SNatSRule, natGatewayI
return "", err
}
- entryID, _ := body.GetString("Result", "SnatEntryId")
+ entryID, _ := body.GetString("SnatEntryId")
return entryID, nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go
index e2756981d7..770d2f600d 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/network.go
@@ -144,7 +144,7 @@ func (region *SRegion) CreateSubnet(zoneId string, vpcId string, name string, ci
if err != nil {
return "", err
}
- return body.GetString("Result", "SubnetId")
+ return body.GetString("SubnetId")
}
func (region *SRegion) DeleteSubnet(SubnetId string) error {
@@ -228,11 +228,11 @@ func (region *SRegion) GetSubnets(ids []string, zoneId string, vpcId string, pag
}
subnets := make([]SNetwork, 0)
- err = body.Unmarshal(&subnets, "Result", "Subnets")
+ err = body.Unmarshal(&subnets, "Subnets")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal subnets fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return subnets, int(total), nil
}
@@ -247,7 +247,7 @@ func (region *SRegion) GetSubnetAttributes(SubnetId string) (*SNetwork, error) {
log.Debugf("%s", body.PrettyString())
}
subnet := SNetwork{}
- err = body.Unmarshal(&subnet, "Result")
+ err = body.Unmarshal(&subnet)
if err != nil {
return nil, errors.Wrapf(err, "Unmarshal subnet fail")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go
index 46bd176ad9..8ac3c8388f 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/networkinterfaces.go
@@ -16,13 +16,11 @@ package volcengine
import (
"fmt"
- "time"
"yunion.io/x/pkg/errors"
api "yunion.io/x/cloudmux/pkg/apis/compute"
"yunion.io/x/cloudmux/pkg/cloudprovider"
- "yunion.io/x/cloudmux/pkg/multicloud"
)
type SPrivateIp struct {
@@ -56,29 +54,6 @@ type SPrivateIpSets struct {
PrivateIpSet []SPrivateIp
}
-type SNetworkInterface struct {
- multicloud.SNetworkInterfaceBase
- VolcEngineTags
- region *SRegion
-
- InstanceId string
- NetworkInterfaceId string
- VpcId string
- SubnetId string
- PrimaryIpAddress string
- Type string
- MacAddress string
- CreationTime time.Time
- NetworkInterfaceName string
- PrivateIpSets SPrivateIpSets
- ResourceGroupId string
- SecurityGroupIds SSecurityGroupIds
- Status string
- ZoneId string
- PrivateIpAddresses []string
- AssociatedElasticIp SAssociatedElasticIp
-}
-
func (nic *SNetworkInterface) GetName() string {
return nic.NetworkInterfaceName
}
@@ -165,10 +140,10 @@ func (region *SRegion) GetNetworkInterfaces(instanceId string, pageNumber int, p
}
interfaces := []SNetworkInterface{}
- err = body.Unmarshal(&interfaces, "Result", "NetworkInterfaceSets")
+ err = body.Unmarshal(&interfaces, "NetworkInterfaceSets")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return interfaces, int(total), nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/project.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/project.go
index 2110229535..c93c2af782 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/project.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/project.go
@@ -82,7 +82,7 @@ func (client *SVolcEngineClient) GetProject(name string) (*SProject, error) {
return nil, err
}
project := &SProject{client: client}
- err = body.Unmarshal(project, "Result")
+ err = body.Unmarshal(project)
if err != nil {
return nil, errors.Wrap(err, "resp.Unmarshal")
}
@@ -102,11 +102,11 @@ func (client *SVolcEngineClient) ListProjects(limit int, offset int) ([]SProject
return nil, 0, errors.Wrap(err, "iamRequest.ListProjects")
}
projects := []SProject{}
- err = resp.Unmarshal(&projects, "Result", "Projects")
+ err = resp.Unmarshal(&projects, "Projects")
if err != nil {
return nil, 0, errors.Wrap(err, "resp.Unmarshal")
}
- total, _ := resp.Int("Result", "Total")
+ total, _ := resp.Int("Total")
return projects, int(total), nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/region.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/region.go
index 8b2b2313cc..70788a17d1 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/region.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/region.go
@@ -49,6 +49,11 @@ var RegionEndpoint = map[string]string{
"cn-guangzhou": "cn-beijing.volces.com",
}
+type sStorageType struct {
+ Id string
+ Zones []string
+}
+
type SRegion struct {
multicloud.SRegion
multicloud.SNoLbRegion
@@ -59,6 +64,7 @@ type SRegion struct {
ivpcs []cloudprovider.ICloudVpc
+ storageTypes []sStorageType
storageCache *SStoragecache
}
@@ -135,7 +141,7 @@ func (region *SRegion) GetZones(id string) ([]SZone, error) {
return nil, err
}
ret := []SZone{}
- err = body.Unmarshal(&ret, "Result", "AvailableZones")
+ err = body.Unmarshal(&ret, "AvailableZones")
if err != nil {
return nil, err
}
@@ -195,7 +201,7 @@ func (region *SRegion) CreateVpc(opts *cloudprovider.VpcCreateOptions) (*SVpc, e
if err != nil {
return nil, err
}
- vpcId, err := body.GetString("Result", "VpcId")
+ vpcId, err := body.GetString("VpcId")
if err != nil {
return nil, err
}
@@ -250,11 +256,11 @@ func (region *SRegion) GetVpcs(vpcIds []string, pageNumber int, pageSize int) ([
return nil, 0, errors.Wrapf(err, "GetVpcs fail")
}
vpcs := make([]SVpc, 0)
- err = body.Unmarshal(&vpcs, "Result", "Vpcs")
+ err = body.Unmarshal(&vpcs, "Vpcs")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal vpcs fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return vpcs, int(total), nil
}
@@ -572,7 +578,7 @@ func (region *SRegion) GetRouteTables(ids []string, pageNumber int, pageSize int
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal routetables fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return routetables, int(total), nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/routetable.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/routetable.go
index 765b36829a..97e43dd187 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/routetable.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/routetable.go
@@ -182,11 +182,11 @@ func (table *SRouteTable) RemoteGetRoutes(pageNumber int, pageSize int) ([]*SRou
}
entries := SRouteEntrys{}
- err = body.Unmarshal(&entries, "Result", "RouteEntries")
+ err = body.Unmarshal(&entries, "RouteEntries")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal routeEntrys fail")
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return entries, int(total), nil
}
@@ -262,14 +262,14 @@ func (vpc *SVpc) RemoteGetRouteTableList(pageNumber int, pageSize int) ([]*SRout
}
routeTables := make([]*SRouteTable, 0)
- err = body.Unmarshal(&routeTables, "Result", "RouterTableList")
+ err = body.Unmarshal(&routeTables, "RouterTableList")
if err != nil {
return nil, 0, errors.Wrapf(err, "Unmarshal routeTables fail")
}
for _, routeTable := range routeTables {
routeTable.region = vpc.region
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return routeTables, int(total), nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/securitygroup.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/securitygroup.go
index cc2ef8cf24..bc4cae6805 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/securitygroup.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/securitygroup.go
@@ -70,7 +70,7 @@ func (region *SRegion) CreateSecurityGroup(opts *cloudprovider.SecurityGroupCrea
if err != nil {
return "", errors.Wrap(err, "CreateSecurityGroup")
}
- return body.GetString("Result", "SecurityGroupId")
+ return body.GetString("SecurityGroupId")
}
func (region *SRegion) GetSecurityGroup(secGroupId string) (*SSecurityGroup, error) {
@@ -95,7 +95,7 @@ func (region *SRegion) GetSecurityGroupRules(secGroupId string) ([]SSecurityGrou
return nil, err
}
ret := []SSecurityGroupRule{}
- err = body.Unmarshal(&ret, "Result", "Permissions")
+ err = body.Unmarshal(&ret, "Permissions")
if err != nil {
return nil, errors.Wrapf(err, "Unmarshal security group details fail")
}
@@ -198,12 +198,12 @@ func (region *SRegion) GetSecurityGroups(vpcId, name string, securityGroupIds []
}
secgrps := make([]SSecurityGroup, 0)
- err = body.Unmarshal(&secgrps, "Result", "SecurityGroups")
+ err = body.Unmarshal(&secgrps, "SecurityGroups")
if err != nil {
log.Errorf("Unmarshal security groups fail %s", err)
return nil, 0, err
}
- total, _ := body.Int("Result", "TotalCount")
+ total, _ := body.Int("TotalCount")
return secgrps, int(total), nil
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/storage.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/storage.go
index 8a9a3ab545..3ad6819350 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/storage.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/storage.go
@@ -98,13 +98,12 @@ func (storage *SStorage) GetStorageConf() jsonutils.JSONObject {
}
func (storage *SStorage) GetStatus() string {
+ if storage.storageType == api.STORAGE_VOLCENGINE_PTSSD {
+ return api.STORAGE_OFFLINE
+ }
return api.STORAGE_ONLINE
}
-func (storage *SStorage) Refresh() error {
- return nil
-}
-
func (storage *SStorage) GetEnabled() bool {
return true
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/user.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/user.go
index b3adca797e..62b9dce45c 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/user.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/user.go
@@ -54,7 +54,7 @@ func (client *SVolcEngineClient) GetCallerIdentity() (*SCallerIdentity, error) {
}
id := &SCallerIdentity{}
users := []SUser{}
- err = body.Unmarshal(&users, "Result", "UserMetadata")
+ err = body.Unmarshal(&users, "UserMetadata")
if err != nil {
return nil, errors.Wrap(err, "resp.Unmarshal")
}
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/volcengine.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/volcengine.go
index 3eed994484..13b4b87990 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/volcengine.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/volcengine.go
@@ -123,7 +123,7 @@ func (client *SVolcEngineClient) fetchRegions() error {
return errors.Wrapf(err, "DescribeRegions")
}
regions := make([]SRegion, 0)
- err = body.Unmarshal(®ions, "Result", "Regions")
+ err = body.Unmarshal(®ions, "Regions")
if err != nil {
return errors.Wrapf(err, "resp.Unmarshal")
}
@@ -310,7 +310,13 @@ func (client *SVolcEngineClient) jsonRequest(cred sdk.Credentials, domain string
}
cli := httputils.NewJsonClient(_cli)
_, resp, err := cli.Send(context.Background(), req, vErr, client.debug)
- return resp, err
+ if err != nil {
+ return nil, errors.Wrapf(err, apiName)
+ }
+ if resp.Contains("Result") {
+ return resp.Get("Result")
+ }
+ return resp, nil
}
func (client *SVolcEngineClient) getSdkCredential(region string, service string, token string) sdk.Credentials {
diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/zone.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/zone.go
index 24fda14578..7326c713af 100644
--- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/zone.go
+++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/volcengine/zone.go
@@ -21,14 +21,9 @@ import (
"yunion.io/x/cloudmux/pkg/cloudprovider"
"yunion.io/x/cloudmux/pkg/multicloud"
"yunion.io/x/pkg/errors"
+ "yunion.io/x/pkg/utils"
)
-var StorageTypes = []string{
- api.STORAGE_VOLCENGINE_FlexPL,
- api.STORAGE_VOLCENGINE_PL0,
- api.STORAGE_VOLCENGINE_PTSSD,
-}
-
type SSupportedResource struct {
Status string
Value string
@@ -46,12 +41,9 @@ type SZone struct {
host *SHost
- istorages []cloudprovider.ICloudStorage
Status string
AvailableResources []SAvailableResource
- storageTypes []string
-
ZoneId string
RegionId string
LocalName string
@@ -92,10 +84,6 @@ func (zone *SZone) GetStatus() string {
return api.ZONE_ENABLE
}
-func (zone *SZone) Refresh() error {
- return nil
-}
-
func (zone *SZone) GetIRegion() cloudprovider.ICloudRegion {
return zone.region
}
@@ -125,24 +113,6 @@ func (zone *SZone) GetIHostById(id string) (cloudprovider.ICloudHost, error) {
return nil, errors.Wrap(cloudprovider.ErrNotFound, "GetIHostById")
}
-// Storage
-func (zone *SZone) getStorageType() {
- if len(zone.storageTypes) == 0 {
- zone.storageTypes = StorageTypes
- }
-}
-
-func (zone *SZone) fetchStorages() error {
- zone.getStorageType()
- zone.istorages = make([]cloudprovider.ICloudStorage, len(zone.storageTypes))
-
- for i, sc := range zone.storageTypes {
- storage := SStorage{zone: zone, storageType: sc}
- zone.istorages[i] = &storage
- }
- return nil
-}
-
func (zone *SZone) getStorageByCategory(category string) (*SStorage, error) {
storages, err := zone.GetIStorages()
if err != nil {
@@ -154,30 +124,67 @@ func (zone *SZone) getStorageByCategory(category string) (*SStorage, error) {
return storage, nil
}
}
- return nil, fmt.Errorf("no such storage %s", category)
+ return nil, errors.Wrapf(cloudprovider.ErrNotFound, "getStorageByCategory %s", category)
+}
+
+func (zone *SZone) GetStorages() ([]SStorage, error) {
+ storages, err := zone.region.GetStorageTypes("")
+ if err != nil {
+ return nil, err
+ }
+ ret := []SStorage{}
+ for i := range storages {
+ if utils.IsInStringArray(zone.ZoneId, storages[i].Zones) {
+ ret = append(ret, SStorage{storageType: storages[i].Id, zone: zone})
+ }
+ }
+ ret = append(ret, SStorage{storageType: api.STORAGE_VOLCENGINE_PTSSD, zone: zone})
+ return ret, nil
}
func (zone *SZone) GetIStorages() ([]cloudprovider.ICloudStorage, error) {
- if zone.istorages == nil {
- err := zone.fetchStorages()
- if err != nil {
- return nil, errors.Wrapf(err, "fetchStorages")
- }
+ storages, err := zone.GetStorages()
+ if err != nil {
+ return nil, err
}
- return zone.istorages, nil
+ ret := []cloudprovider.ICloudStorage{}
+ for i := range storages {
+ ret = append(ret, &storages[i])
+ }
+ return ret, nil
}
func (zone *SZone) GetIStorageById(id string) (cloudprovider.ICloudStorage, error) {
- if zone.istorages == nil {
- err := zone.fetchStorages()
- if err != nil {
- return nil, errors.Wrapf(err, "fetchStorages")
+ storages, err := zone.GetIStorages()
+ if err != nil {
+ return nil, err
+ }
+ for i := range storages {
+ if storages[i].GetGlobalId() == id {
+ return storages[i], nil
}
}
- for i := 0; i < len(zone.istorages); i += 1 {
- if zone.istorages[i].GetGlobalId() == id {
- return zone.istorages[i], nil
- }
- }
- return nil, cloudprovider.ErrNotFound
+ return nil, errors.Wrapf(cloudprovider.ErrNotFound, id)
+}
+
+func (self *SRegion) GetStorageTypes(zoneId string) ([]sStorageType, error) {
+ if len(self.storageTypes) > 0 {
+ return self.storageTypes, nil
+ }
+ params := map[string]string{
+ "PageSize": "100",
+ }
+ if len(zoneId) > 0 {
+ params["ZoneId"] = zoneId
+ }
+ resp, err := self.storageRequest("DescribeVolumeType", params)
+ if err != nil {
+ return nil, err
+ }
+ self.storageTypes = []sStorageType{}
+ err = resp.Unmarshal(&self.storageTypes, "VolumeTypes")
+ if err != nil {
+ return nil, errors.Wrapf(err, "Unmarshal VolumeTypes")
+ }
+ return self.storageTypes, nil
}