From b3a3d170e25756b37aa85efa4e8528d2edb1940d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 30 Sep 2025 15:09:43 +0800 Subject: [PATCH] fix(region): vendor update (#23459) --- go.mod | 2 +- go.sum | 4 +- pkg/cloudmon/providerdriver/ksyun.go | 35 ++++ pkg/compute/guestdrivers/ksyun.go | 8 + pkg/compute/guestdrivers/managedvirtual.go | 30 ++-- pkg/compute/models/guests.go | 5 + vendor/modules.txt | 2 +- .../pkg/apis/compute/storage_const.go | 12 ++ .../x/cloudmux/pkg/cloudprovider/instance.go | 15 +- .../pkg/multicloud/ksyun/dbinstance.go | 4 +- .../multicloud/ksyun/dbinstance_account.go | 2 +- .../pkg/multicloud/ksyun/dbinstance_backup.go | 2 +- .../multicloud/ksyun/dbinstance_database.go | 2 +- .../x/cloudmux/pkg/multicloud/ksyun/disks.go | 28 +++- .../x/cloudmux/pkg/multicloud/ksyun/eip.go | 26 ++- .../x/cloudmux/pkg/multicloud/ksyun/group.go | 18 +-- .../x/cloudmux/pkg/multicloud/ksyun/host.go | 2 +- .../x/cloudmux/pkg/multicloud/ksyun/image.go | 6 +- .../pkg/multicloud/ksyun/instances.go | 150 +++++++++++++----- .../pkg/multicloud/ksyun/instancetype.go | 2 +- .../cloudmux/pkg/multicloud/ksyun/keypair.go | 4 +- .../x/cloudmux/pkg/multicloud/ksyun/ksyun.go | 115 ++++++++++---- .../cloudmux/pkg/multicloud/ksyun/monitor.go | 114 +++++++++++++ .../cloudmux/pkg/multicloud/ksyun/network.go | 6 +- .../x/cloudmux/pkg/multicloud/ksyun/policy.go | 6 +- .../cloudmux/pkg/multicloud/ksyun/project.go | 2 +- .../x/cloudmux/pkg/multicloud/ksyun/region.go | 12 +- .../pkg/multicloud/ksyun/secgroup_rules.go | 4 +- .../pkg/multicloud/ksyun/securitygroup.go | 8 +- .../cloudmux/pkg/multicloud/ksyun/snapshot.go | 6 +- .../cloudmux/pkg/multicloud/ksyun/storages.go | 20 +-- .../x/cloudmux/pkg/multicloud/ksyun/tag.go | 2 +- .../x/cloudmux/pkg/multicloud/ksyun/user.go | 20 +-- .../x/cloudmux/pkg/multicloud/ksyun/vpc.go | 6 +- .../x/cloudmux/pkg/multicloud/ksyun/zone.go | 18 ++- .../cloudmux/pkg/multicloud/qcloud/monitor.go | 4 +- .../cloudmux/pkg/multicloud/qcloud/qcloud.go | 2 +- 37 files changed, 522 insertions(+), 182 deletions(-) create mode 100644 pkg/cloudmon/providerdriver/ksyun.go create mode 100644 vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/monitor.go diff --git a/go.mod b/go.mod index 7574830a48..237b974d21 100644 --- a/go.mod +++ b/go.mod @@ -95,7 +95,7 @@ require ( k8s.io/cri-api v0.22.17 k8s.io/klog/v2 v2.20.0 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250928091210-170f1881c385 + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250930065037-9f9dbdc79d00 yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0 yunion.io/x/jsonutils v1.0.1-0.20250507052344-1abcf4f443b1 yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91 diff --git a/go.sum b/go.sum index 16d3c678ec..4ab1b820b9 100644 --- a/go.sum +++ b/go.sum @@ -1411,8 +1411,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.20250928091210-170f1881c385 h1:GZpY636vz/2k3l6RUDtoQvJ5qyd+2kFFbbWmyQhyI9s= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250928091210-170f1881c385/go.mod h1:R5iP/4nGCluuekoa30B5hM/49IfPpGHXwFK3yT7m6Vw= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250930065037-9f9dbdc79d00 h1:KTQYNCLB1bLAz9PMlvgxAUmyF5ybsVyBc0XVDDzIVTE= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250930065037-9f9dbdc79d00/go.mod h1:R5iP/4nGCluuekoa30B5hM/49IfPpGHXwFK3yT7m6Vw= yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0 h1:msG4SiDSVU7CrXH06WuHlNEZXIooTcmNbfrIGHuIHBU= yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/pkg/cloudmon/providerdriver/ksyun.go b/pkg/cloudmon/providerdriver/ksyun.go new file mode 100644 index 0000000000..98d5194d58 --- /dev/null +++ b/pkg/cloudmon/providerdriver/ksyun.go @@ -0,0 +1,35 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package providerdriver + +import ( + api "yunion.io/x/onecloud/pkg/apis/compute" +) + +type KsyunCollect struct { + SCollectByResourceIdDriver +} + +func (kc *KsyunCollect) GetProvider() string { + return api.CLOUD_PROVIDER_KSYUN +} + +func (kc *KsyunCollect) IsSupportMetrics() bool { + return true +} + +func init() { + Register(&KsyunCollect{}) +} diff --git a/pkg/compute/guestdrivers/ksyun.go b/pkg/compute/guestdrivers/ksyun.go index 77da77d0a8..f321ace24f 100644 --- a/pkg/compute/guestdrivers/ksyun.go +++ b/pkg/compute/guestdrivers/ksyun.go @@ -76,6 +76,10 @@ func (self *SKsyunGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } +func (self *SKsyunGuestDriver) GetRebuildRootStatus() ([]string, error) { + return []string{api.VM_READY}, nil +} + func (self *SKsyunGuestDriver) IsAllowSaveImageOnRunning() bool { return true } @@ -168,3 +172,7 @@ func (self *SKsyunGuestDriver) IsSupportSetAutoRenew() bool { func (self *SKsyunGuestDriver) IsSupportShutdownMode() bool { return true } + +func (self *SKsyunGuestDriver) IsNeedRestartForResetLoginInfo() bool { + return false +} diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index ceeee9d5e2..5c50e8654f 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -88,7 +88,11 @@ func (drv *SManagedVirtualizedGuestDriver) GetJsonDescAtHost(ctx context.Context config.InstanceType = guest.InstanceType if len(guest.KeypairId) > 0 { - config.PublicKey = guest.GetKeypairPublicKey() + keypair := guest.GetKeypair() + if keypair != nil { + config.PublicKey = keypair.PublicKey + config.KeypairName = keypair.Name + } } nics, _ := guest.GetNetworks("") @@ -784,10 +788,11 @@ func (drv *SManagedVirtualizedGuestDriver) RemoteDeployGuestForDeploy(ctx contex log.Debugf("Deploy VM params %s", params.String()) opts := &cloudprovider.SInstanceDeployOptions{ - Username: desc.Account, - PublicKey: desc.PublicKey, - Password: desc.Password, - UserData: desc.UserData, + Username: desc.Account, + PublicKey: desc.PublicKey, + KeypairName: desc.KeypairName, + Password: desc.Password, + UserData: desc.UserData, } opts.DeleteKeypair = jsonutils.QueryBoolean(params, "__delete_keypair__", false) @@ -850,13 +855,14 @@ func (drv *SManagedVirtualizedGuestDriver) RemoteDeployGuestForRebuildRoot(ctx c defer lockman.ReleaseObject(ctx, guest) conf := cloudprovider.SManagedVMRebuildRootConfig{ - Account: desc.Account, - ImageId: desc.ExternalImageId, - Password: desc.Password, - PublicKey: desc.PublicKey, - SysSizeGB: desc.SysDisk.SizeGB, - OsType: desc.OsType, - UserData: desc.UserData, + Account: desc.Account, + ImageId: desc.ExternalImageId, + Password: desc.Password, + PublicKey: desc.PublicKey, + KeypairName: desc.KeypairName, + SysSizeGB: desc.SysDisk.SizeGB, + OsType: desc.OsType, + UserData: desc.UserData, } return iVM.RebuildRoot(ctx, &conf) }() diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index d3d23a06d8..28efbe4b02 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -5109,6 +5109,7 @@ func (self *SGuest) GetDeployConfigOnHost(ctx context.Context, userCred mcclient keypair := self.getKeypair() if keypair != nil { config.Add(jsonutils.NewString(keypair.PublicKey), "public_key") + config.Add(jsonutils.NewString(keypair.Name), "keypair_name") } deletePubKey, _ := params.GetString("delete_public_key") if len(deletePubKey) > 0 { @@ -5848,6 +5849,10 @@ func (self *SGuest) GetKeypairPublicKey() string { return "" } +func (self *SGuest) GetKeypair() *SKeypair { + return self.getKeypair() +} + func (manager *SGuestManager) GetIpsInProjectWithName(projectId, name string, isExitOnly bool, addrType api.TAddressType) []string { name = strings.TrimSuffix(name, ".") diff --git a/vendor/modules.txt b/vendor/modules.txt index 18408886ad..726b5354fa 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1875,7 +1875,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.20250928091210-170f1881c385 +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250930065037-9f9dbdc79d00 ## explicit; go 1.24 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/apis/compute/storage_const.go b/vendor/yunion.io/x/cloudmux/pkg/apis/compute/storage_const.go index 7d6c09029c..3bba04ce6e 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/apis/compute/storage_const.go +++ b/vendor/yunion.io/x/cloudmux/pkg/apis/compute/storage_const.go @@ -143,6 +143,8 @@ const ( STORAGE_KSYUN_SSD3_0 = "SSD3.0" // 高效云硬盘 STORAGE_KSYUN_EHDD = "EHDD" + // 本地SSD云硬盘 + STORAGE_KSYUN_LOCAL_SSD = "Local_SSD" // cnware storage type STORAGE_CNWARE_FC_SAN = "fc-san" @@ -164,3 +166,13 @@ const ( DISK_TYPE_SSD = "ssd" DISK_TYPE_HYBRID = "hybrid" ) + +var KSYUN_STORAGES = []string{ + STORAGE_KSYUN_ESSD_AUTO_PL, + STORAGE_KSYUN_ESSD_PL1, + STORAGE_KSYUN_ESSD_PL2, + STORAGE_KSYUN_ESSD_PL3, + STORAGE_KSYUN_SSD3_0, + STORAGE_KSYUN_EHDD, + STORAGE_KSYUN_LOCAL_SSD, +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/instance.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/instance.go index 9f8d21f5c4..a7078cae1e 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/instance.go @@ -188,13 +188,14 @@ type SManagedVMChangeConfig struct { } type SManagedVMRebuildRootConfig struct { - Account string - Password string - ImageId string - PublicKey string - SysSizeGB int - OsType string - UserData string + Account string + Password string + ImageId string + KeypairName string + PublicKey string + SysSizeGB int + OsType string + UserData string } func (vmConfig *SManagedVMCreateConfig) GetConfig(config *jsonutils.JSONDict) error { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance.go index 3cf5da8473..b0ca97a287 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance.go @@ -110,7 +110,7 @@ func (region *SRegion) GetDBInstance(id string) (*SDBInstance, error) { } func (region *SRegion) GetDBInstances(id string) ([]SDBInstance, error) { - params := map[string]string{} + params := map[string]interface{}{} if len(id) > 0 { params["DBInstanceIdentifier"] = id } @@ -303,7 +303,7 @@ func (rds *SDBInstance) Delete() error { } func (region *SRegion) DeleteDBInstance(instanceId string) error { - params := map[string]string{} + params := map[string]interface{}{} params["DBInstanceIdentifier"] = instanceId _, err := region.rdsRequest("DeleteDBInstance", params) return err diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_account.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_account.go index 2f9ea4ac3e..31361af2e0 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_account.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_account.go @@ -82,7 +82,7 @@ func (rds *SDBInstance) GetIDBInstanceAccounts() ([]cloudprovider.ICloudDBInstan } func (region *SRegion) GetDBInstanceAccounts(id string) ([]SDBInstanceAccount, error) { - params := map[string]string{ + params := map[string]interface{}{ "DBInstanceIdentifier": id, } body, err := region.rdsRequest("DescribeInstanceAccounts", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_backup.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_backup.go index 05108ee8de..9cbd0ceb22 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_backup.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_backup.go @@ -109,7 +109,7 @@ func (backup *SDBInstanceBackup) GetDBInstanceId() string { } func (region *SRegion) GetDBInstanceBackups(id string) ([]SDBInstanceBackup, error) { - params := map[string]string{ + params := map[string]interface{}{ "DBInstanceIdentifier": id, } ret := []SDBInstanceBackup{} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_database.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_database.go index 449cd0d335..60d2824468 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_database.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/dbinstance_database.go @@ -62,7 +62,7 @@ func (database *SDBInstanceDatabase) GetCharacterSet() string { } func (region *SRegion) GetDBInstanceDatabases(id string) ([]SDBInstanceDatabase, error) { - params := map[string]string{ + params := map[string]interface{}{ "DBInstanceIdentifier": id, } resp, err := region.rdsRequest("DescribeInstanceDatabases", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/disks.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/disks.go index f92f896f77..472f2e4f0f 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/disks.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/disks.go @@ -77,7 +77,7 @@ func (region *SRegion) GetDisk(diskId string) (*SDisk, error) { func (region *SRegion) GetDisks(diskIds []string, storageType, zoneId string) ([]SDisk, error) { disks := []SDisk{} - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", } for i, v := range diskIds { @@ -120,8 +120,7 @@ func (region *SRegion) GetDisks(diskIds []string, storageType, zoneId string) ([ } func (region *SRegion) GetDiskByInstanceId(instanceId string) ([]SDisk, error) { - disks := []SDisk{} - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", } params["InstanceId"] = instanceId @@ -129,7 +128,14 @@ func (region *SRegion) GetDiskByInstanceId(instanceId string) ([]SDisk, error) { if err != nil { return nil, errors.Wrap(err, "DescribeInstanceVolumes") } - return disks, resp.Unmarshal(&disks, "Attachments") + ret := struct { + Attachments []SDisk `json:"Attachments"` + }{} + err = resp.Unmarshal(&ret) + if err != nil { + return nil, errors.Wrap(err, "unmarshal Attachments") + } + return ret.Attachments, nil } func (disk *SDisk) GetIStorage() (cloudprovider.ICloudStorage, error) { @@ -175,6 +181,9 @@ func (disk *SDisk) GetProjectId() string { } func (disk *SDisk) Refresh() error { + if disk.VolumeType == api.STORAGE_KSYUN_LOCAL_SSD { + return nil + } disk, err := disk.storage.zone.region.GetDisk(disk.VolumeId) if err != nil { return err @@ -183,6 +192,9 @@ func (disk *SDisk) Refresh() error { } func (disk *SDisk) GetStatus() string { + if disk.VolumeType == api.STORAGE_KSYUN_LOCAL_SSD { + return api.DISK_READY + } // creating、available、attaching、inuse、detaching、extending、deleting、error switch disk.VolumeStatus { case "available", "inuse", "in-use": @@ -287,7 +299,7 @@ func (disk *SDisk) Rebuild(ctx context.Context) error { } func (region *SRegion) DeleteDisk(id string) error { - _, err := region.ebsRequest("DeleteVolume", map[string]string{ + _, err := region.ebsRequest("DeleteVolume", map[string]interface{}{ "VolumeId": id, "ForceDelete": "true", }) @@ -295,7 +307,7 @@ func (region *SRegion) DeleteDisk(id string) error { } func (region *SRegion) ResizeDisk(id string, newSizeMB int64) error { - _, err := region.ebsRequest("ResizeVolume", map[string]string{ + _, err := region.ebsRequest("ResizeVolume", map[string]interface{}{ "VolumeId": id, "Size": fmt.Sprintf("%d", newSizeMB/1024), }) @@ -303,7 +315,7 @@ func (region *SRegion) ResizeDisk(id string, newSizeMB int64) error { } func (region *SRegion) ResetDisk(id string, snapshotId string) error { - _, err := region.ebsRequest("ResetVolume", map[string]string{ + _, err := region.ebsRequest("ResetVolume", map[string]interface{}{ "VolumeId": id, "SnapshotId": snapshotId, }) @@ -311,7 +323,7 @@ func (region *SRegion) ResetDisk(id string, snapshotId string) error { } func (region *SRegion) CreateDisk(storageType, zoneId string, opts *cloudprovider.DiskCreateConfig) (*SDisk, error) { - params := map[string]string{ + params := map[string]interface{}{ "VolumeName": opts.Name, "VolumeDesc": opts.Desc, "Size": fmt.Sprintf("%d", opts.SizeGb), diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/eip.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/eip.go index 76141f2d45..f1368f16b9 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/eip.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/eip.go @@ -61,7 +61,7 @@ type SEip struct { } func (region *SRegion) GetEips(eipIds []string) ([]SEip, error) { - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", } for i, eipId := range eipIds { @@ -210,7 +210,7 @@ func (eip *SEip) ChangeBandwidth(bw int) error { } func (region *SRegion) DeallocateEIP(eipId string) error { - params := map[string]string{ + params := map[string]interface{}{ "AllocationId": eipId, } _, err := region.eipRequest("ReleaseAddress", params) @@ -218,17 +218,27 @@ func (region *SRegion) DeallocateEIP(eipId string) error { } func (region *SRegion) AssociateEip(eipId string, instanceId string) error { - params := map[string]string{ + params := map[string]interface{}{ "AllocationId": eipId, "InstanceId": instanceId, - "InstanceType": "", + "InstanceType": "Ipfwd", } - _, err := region.eipRequest("AssociateAddress", params) + vm, err := region.GetInstance(instanceId) + if err != nil { + return errors.Wrap(err, "GetInstance") + } + for _, nic := range vm.NetworkInterfaceSet { + if len(nic.AllocationId) == 0 { + params["NetworkInterfaceId"] = nic.NetworkInterfaceId + break + } + } + _, err = region.eipRequest("AssociateAddress", params) return err } func (region *SRegion) DissociateEip(eipId string) error { - params := map[string]string{ + params := map[string]interface{}{ "AllocationId": eipId, } _, err := region.eipRequest("DisassociateAddress", params) @@ -254,7 +264,7 @@ func (region *SRegion) CreateEip(opts *cloudprovider.SEip) (*SEip, error) { if len(lineId) == 0 { return nil, errors.Wrap(errors.ErrNotFound, "No bgp lines found") } - params := map[string]string{ + params := map[string]interface{}{ "LineId": lineId, "BandWidth": fmt.Sprintf("%d", opts.BandwidthMbps), "ChargeType": "DailyPaidByTransfer", @@ -282,7 +292,7 @@ type SLine struct { } func (region *SRegion) GetLines() ([]SLine, error) { - params := map[string]string{} + params := map[string]interface{}{} body, err := region.eipRequest("GetLines", params) if err != nil { return nil, errors.Wrap(err, "GetLines") diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/group.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/group.go index 21449978ed..46f8c9c4d5 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/group.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/group.go @@ -104,7 +104,7 @@ func (client *SKsyunClient) GetICloudgroups() ([]cloudprovider.ICloudgroup, erro } func (client *SKsyunClient) ListGroups() ([]SGroup, error) { - params := map[string]string{ + params := map[string]interface{}{ "MaxItems": "100", } ret := []SGroup{} @@ -133,7 +133,7 @@ func (client *SKsyunClient) ListGroups() ([]SGroup, error) { } func (client *SKsyunClient) ListGroupPolicies(name string) ([]SPolicy, error) { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": name, "MaxItems": "100", } @@ -164,7 +164,7 @@ func (client *SKsyunClient) ListGroupPolicies(name string) ([]SPolicy, error) { } func (client *SKsyunClient) AttachGroupPolicy(name, policy string) error { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": name, "PolicyKrn": policy, } @@ -173,7 +173,7 @@ func (client *SKsyunClient) AttachGroupPolicy(name, policy string) error { } func (client *SKsyunClient) DetachGroupPolicy(name, policy string) error { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": name, "PolicyKrn": policy, } @@ -182,7 +182,7 @@ func (client *SKsyunClient) DetachGroupPolicy(name, policy string) error { } func (client *SKsyunClient) DeleteGroup(name string) error { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": name, } _, err := client.iamRequest("", "DeleteGroup", params) @@ -190,7 +190,7 @@ func (client *SKsyunClient) DeleteGroup(name string) error { } func (client *SKsyunClient) AddUserToGroup(user, group string) error { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": group, "UserName": user, } @@ -199,7 +199,7 @@ func (client *SKsyunClient) AddUserToGroup(user, group string) error { } func (client *SKsyunClient) RemoveUserFromGroup(user, group string) error { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": group, "UserName": user, } @@ -208,7 +208,7 @@ func (client *SKsyunClient) RemoveUserFromGroup(user, group string) error { } func (client *SKsyunClient) CreateGroup(name, desc string) (*SGroup, error) { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": name, "Description": desc, } @@ -233,7 +233,7 @@ func (client *SKsyunClient) GetICloudgroupByName(name string) (cloudprovider.ICl } func (client *SKsyunClient) GetGroup(name string) (*SGroup, error) { - params := map[string]string{ + params := map[string]interface{}{ "GroupName": name, } resp, err := client.iamRequest("", "GetGroup", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/host.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/host.go index 8a2d392fde..1495fcfcfa 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/host.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/host.go @@ -80,7 +80,7 @@ func (region *SRegion) syncKeypair(keyName, publicKey string) (string, error) { } func (region *SRegion) CreateVM(opts *cloudprovider.SManagedVMCreateConfig) (*SInstance, error) { - params := map[string]string{ + params := map[string]interface{}{ "InstanceName": opts.Name, "ImageId": opts.ExternalImageId, "InstanceType": opts.InstanceType, diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/image.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/image.go index a9dba8927e..7fbd8d0a5d 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/image.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/image.go @@ -212,6 +212,8 @@ func (region *SRegion) GetImage(imageId string) (*SImage, error) { return nil, err } for i := range images { + storageCache := region.getStoragecache() + images[i].storageCache = storageCache if images[i].ImageId == imageId { return &images[i], nil } @@ -220,7 +222,7 @@ func (region *SRegion) GetImage(imageId string) (*SImage, error) { } func (region *SRegion) GetImages(id string, imageType string) ([]SImage, error) { - params := map[string]string{} + params := map[string]interface{}{} if len(id) > 0 { params["ImageId"] = id } @@ -243,7 +245,7 @@ func (region *SRegion) GetImages(id string, imageType string) ([]SImage, error) } func (region *SRegion) DeleteImage(imageId string) error { - params := map[string]string{ + params := map[string]interface{}{ "ImageId": imageId, } _, err := region.ecsRequest("DeleteImage", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instances.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instances.go index fad885784d..2335872d8b 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instances.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instances.go @@ -17,6 +17,7 @@ package ksyun import ( "context" "fmt" + "strings" "time" billing_api "yunion.io/x/cloudmux/pkg/apis/billing" @@ -24,6 +25,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/imagetools" "yunion.io/x/pkg/utils" @@ -72,6 +74,7 @@ type NetworkInterfaceSet struct { } type SystemDisk struct { + DiskId string `json:"DiskId"` DiskType string `json:"DiskType"` DiskSize int `json:"DiskSize"` } @@ -121,6 +124,7 @@ type SInstance struct { VncSupport bool `json:"VncSupport"` Platform string `json:"Platform"` ServiceEndTime time.Time `json:"ServiceEndTime"` + BootMode string `json:"BootMode"` } func (region *SRegion) GetInstances(zoneName string, instanceIds []string) ([]SInstance, error) { @@ -141,7 +145,7 @@ func (region *SRegion) GetInstances(zoneName string, instanceIds []string) ([]SI func (region *SRegion) getInstances(zoneName string, instanceIds []string, projectIds []string) ([]SInstance, error) { instances := []SInstance{} - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", "Marker": "0", } @@ -229,7 +233,7 @@ func (ins *SInstance) AttachDisk(ctx context.Context, diskId string) error { } func (region *SRegion) AttachDisk(instanceId, diskId string) error { - params := map[string]string{ + params := map[string]interface{}{ "VolumeId": diskId, "InstanceId": instanceId, "DeleteWithInstance": "true", @@ -243,7 +247,7 @@ func (ins *SInstance) ChangeConfig(ctx context.Context, opts *cloudprovider.SMan } func (region *SRegion) ChangeConfig(instanceId string, opts *cloudprovider.SManagedVMChangeConfig) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId": instanceId, "InstanceType": opts.InstanceType, } @@ -256,7 +260,7 @@ func (ins *SInstance) DeleteVM(ctx context.Context) error { } func (region *SRegion) DeleteVM(instanceId string) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId.1": instanceId, "ForceDelete": "true", } @@ -269,7 +273,7 @@ func (ins *SInstance) DetachDisk(ctx context.Context, diskId string) error { } func (region *SRegion) DetachDisk(instanceId, diskId string) error { - params := map[string]string{ + params := map[string]interface{}{ "VolumeId": diskId, } if len(instanceId) > 0 { @@ -280,7 +284,10 @@ func (region *SRegion) DetachDisk(instanceId, diskId string) error { } func (ins *SInstance) GetBios() cloudprovider.TBiosType { - return "" + if strings.Contains(ins.BootMode, "BIOS") { + return cloudprovider.BIOS + } + return cloudprovider.UEFI } func (ins *SInstance) GetBootOrder() string { @@ -292,7 +299,7 @@ func (ins *SInstance) GetError() error { } func (ins *SInstance) GetFullOsName() string { - return "" + return ins.Platform } func (ins *SInstance) GetGlobalId() string { @@ -320,11 +327,11 @@ func (ins *SInstance) GetName() string { } func (ins *SInstance) GetOsArch() string { - return "" + return imagetools.NormalizeImageInfo(ins.Platform, "", "", "", "").OsArch } func (ins *SInstance) GetOsDist() string { - return "" + return imagetools.NormalizeImageInfo(ins.Platform, "", "", "", "").OsArch } func (ins *SInstance) GetOsLang() string { @@ -337,7 +344,7 @@ func (ins *SInstance) GetOsType() cloudprovider.TOsType { } func (ins *SInstance) GetOsVersion() string { - return "" + return imagetools.NormalizeImageInfo(ins.Platform, "", "", "", "").OsVersion } func (ins *SInstance) GetProjectId() string { @@ -356,7 +363,7 @@ func (ins *SInstance) GetSecurityGroupIds() ([]string, error) { func (ins *SInstance) GetStatus() string { switch ins.InstanceState.Name { - case "block_device_mapping", "scheduling": + case "block_device_mapping", "scheduling", "updating_password", "rebuilding": return api.VM_DEPLOYING case "active": return api.VM_RUNNING @@ -394,13 +401,47 @@ func (ins *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) { } res = append(res, &disks[i]) } + if ins.SystemDisk.DiskType == api.STORAGE_KSYUN_LOCAL_SSD { + disk := &SDisk{ + VolumeId: ins.SystemDisk.DiskId, + VolumeType: ins.SystemDisk.DiskType, + VolumeName: ins.SystemDisk.DiskId, + Size: ins.SystemDisk.DiskSize, + VolumeCategory: "system", + } + storage := &SStorage{ + zone: ins.host.zone, + StorageType: api.STORAGE_KSYUN_LOCAL_SSD, + } + disk.storage = storage + res = append(res, disk) + } + for i := range ins.DataDisks { + if ins.DataDisks[i].DiskType == api.STORAGE_KSYUN_LOCAL_SSD { + disk := &SDisk{ + VolumeId: ins.DataDisks[i].DiskId, + VolumeType: ins.DataDisks[i].DiskType, + VolumeName: ins.DataDisks[i].DiskId, + Size: ins.DataDisks[i].DiskSize, + VolumeCategory: "data", + } + storage := &SStorage{ + zone: ins.host.zone, + StorageType: api.STORAGE_KSYUN_LOCAL_SSD, + } + disk.storage = storage + res = append(res, disk) + } + } return res, nil } func (ins *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) { eipIds := []string{} for _, set := range ins.NetworkInterfaceSet { - eipIds = append(eipIds, set.AllocationId) + if len(set.AllocationId) > 0 { + eipIds = append(eipIds, set.AllocationId) + } } if len(eipIds) == 0 { return nil, cloudprovider.ErrNotFound @@ -459,7 +500,7 @@ func (ins *SInstance) GetVNCInfo(input *cloudprovider.ServerVncInput) (*cloudpro */ func (region *SRegion) GetVNCInfo(instanceId string) (string, error) { - resp, err := region.ecsRequest("DescribeInstanceVncUrl", map[string]string{"InstanceId": instanceId}) + resp, err := region.ecsRequest("DescribeInstanceVncUrl", map[string]interface{}{"InstanceId": instanceId}) if err != nil { return "", errors.Wrap(err, "GetVNCAddress") } @@ -482,11 +523,38 @@ func (ins *SInstance) GetVga() string { return "" } +func (region *SRegion) BindKeypair(instanceId, keyName, publicKey string) error { + keyId, err := region.syncKeypair(keyName, publicKey) + if err != nil { + return errors.Wrapf(err, "syncKeypair %s", keyName) + } + return region.AttachKey(instanceId, keyId) +} + +func (region *SRegion) AttachKey(instanceId, keyId string) error { + params := map[string]interface{}{ + "InstanceId.1": instanceId, + "KeyId.1": keyId, + } + _, err := region.ecsRequest("AttachKey", params) + return err +} + func (ins *SInstance) RebuildRoot(ctx context.Context, opts *cloudprovider.SManagedVMRebuildRootConfig) (string, error) { err := ins.getRegion().RebuildRoot(ins.InstanceId, opts) if err != nil { return "", err } + if len(opts.PublicKey) > 0 { + keyName := opts.KeypairName + if len(keyName) == 0 { + keyName = ins.InstanceName + } + err = ins.getRegion().BindKeypair(ins.InstanceId, keyName, opts.PublicKey) + if err != nil { + log.Errorf("BindKeypair %s error: %v", keyName, err) + } + } disks, err := ins.GetIDisks() if err != nil { return "", err @@ -498,18 +566,14 @@ func (ins *SInstance) RebuildRoot(ctx context.Context, opts *cloudprovider.SMana } func (region *SRegion) RebuildRoot(instanceId string, opts *cloudprovider.SManagedVMRebuildRootConfig) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId": instanceId, "ImageId": opts.ImageId, } if len(opts.Password) > 0 { params["InstancePassword"] = opts.Password } - /* - if len(opts.PublicKey) > 0 { - params["KeyPairName"] = opts.PublicKey - } - */ + if len(opts.UserData) > 0 { params["UserData"] = opts.UserData } @@ -537,7 +601,7 @@ func (ins *SInstance) StopVM(ctx context.Context, opts *cloudprovider.ServerStop } func (region *SRegion) StartVM(instanceId string) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId.1": instanceId, } _, err := region.ecsRequest("StartInstances", params) @@ -548,7 +612,7 @@ func (region *SRegion) StartVM(instanceId string) error { } func (region *SRegion) StopVM(instanceId string, force, stopCharging bool) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId.1": instanceId, "StoppedMode": "KeepCharging", } @@ -574,7 +638,7 @@ func (ins *SInstance) UpdateVM(ctx context.Context, opts cloudprovider.SInstance } func (region *SRegion) UpdateVM(instanceId string, opts cloudprovider.SInstanceUpdateOptions) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId": instanceId, } if len(opts.NAME) > 0 { @@ -592,25 +656,19 @@ func (ins *SInstance) GetIHost() cloudprovider.ICloudHost { } func (ins *SInstance) DeployVM(ctx context.Context, opts *cloudprovider.SInstanceDeployOptions) error { + if len(opts.PublicKey) > 0 { + return ins.getRegion().BindKeypair(ins.InstanceId, opts.KeypairName, opts.PublicKey) + } return ins.getRegion().DeployVM(ins.InstanceId, opts) } func (region *SRegion) DeployVM(instanceId string, opts *cloudprovider.SInstanceDeployOptions) error { - params := map[string]string{ - "InstanceId": instanceId, + params := map[string]interface{}{ + "InstanceId": instanceId, + "InstancePassword": opts.Password, + "RestartMode": "Restart", } - if len(opts.Password) > 0 { - params["InstancePassword"] = opts.Password - params["RestartMode"] = "Restart" - } - /* - if len(opts.PublicKey) > 0 { - params["KeyPairName"] = opts.PublicKey - } - if len(opts.UserData) > 0 { - params["UserData"] = opts.UserData - } - */ + _, err := region.ecsRequest("ModifyInstanceAttribute", params) return err } @@ -629,3 +687,23 @@ func (ins *SInstance) GetCreatedAt() time.Time { func (ins *SInstance) GetExpiredAt() time.Time { return ins.ServiceEndTime } + +func (ins *SInstance) SaveImage(opts *cloudprovider.SaveImageOptions) (cloudprovider.ICloudImage, error) { + return ins.host.zone.region.SaveImage(ins.InstanceId, opts) +} + +func (region *SRegion) SaveImage(instanceId string, opts *cloudprovider.SaveImageOptions) (cloudprovider.ICloudImage, error) { + params := map[string]interface{}{ + "InstanceId": instanceId, + "Name": opts.Name, + } + resp, err := region.ecsRequest("CreateImage", params) + if err != nil { + return nil, errors.Wrapf(err, "CreateImage") + } + imageId, err := resp.GetString("ImageId") + if err != nil { + return nil, errors.Wrapf(err, "get imageId") + } + return region.GetImage(imageId) +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instancetype.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instancetype.go index b7150808b5..167365e854 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instancetype.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/instancetype.go @@ -50,7 +50,7 @@ type SInstanceType struct { } func (region *SRegion) GetInstanceTypes() ([]SInstanceType, error) { - params := make(map[string]string) + params := make(map[string]interface{}) params["Region"] = region.Region zones, err := region.GetZones() if err != nil { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/keypair.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/keypair.go index a111d255c9..860eb55e88 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/keypair.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/keypair.go @@ -25,7 +25,7 @@ type SKeypair struct { } func (cli *SKsyunClient) GetKeypairs() ([]SKeypair, error) { - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", } ret := []SKeypair{} @@ -52,7 +52,7 @@ func (cli *SKsyunClient) GetKeypairs() ([]SKeypair, error) { } func (cli *SKsyunClient) CreateKeypair(name, publicKey string) (*SKeypair, error) { - params := map[string]string{ + params := map[string]interface{}{ "KeyName": name, "PublicKey": publicKey, "IsCheck": "true", diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/ksyun.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/ksyun.go index 37bf0e04e1..6b22e566e3 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/ksyun.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/ksyun.go @@ -22,6 +22,7 @@ import ( "crypto/tls" "encoding/hex" "fmt" + "io" "net/http" "net/url" "sort" @@ -29,6 +30,8 @@ import ( "sync" "time" + "github.com/aws/aws-sdk-go/aws/credentials" + v4 "github.com/aws/aws-sdk-go/aws/signer/v4" "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" @@ -44,6 +47,7 @@ const ( KSYUN_DEFAULT_API_VERSION = "2016-03-04" KSYUN_RDS_API_VERSION = "2016-07-01" KSYUN_SKS_API_VERSION = "2015-11-01" + KSYUN_MONITOR_API_VERSION = "2018-11-14" ) type KsyunClientConfig struct { @@ -132,6 +136,8 @@ func (cli *SKsyunClient) getUrl(service, regionId string) (string, error) { return fmt.Sprintf("http://%s.api.ksyun.com", service), nil case "kec", "tag", "krds": return fmt.Sprintf("https://%s.%s.api.ksyun.com", service, regionId), nil + case "monitor": + return fmt.Sprintf("https://%s.api.ksyun.com", service), nil } return "", errors.Wrapf(cloudprovider.ErrNotSupported, "service %s", service) } @@ -172,9 +178,9 @@ func (cli *SKsyunClient) getDefaultClient() *http.Client { // {"RequestId":"51aee78d-8c35-4778-92fb-a622c40fa5ae","Error":{"Code":"INVALID_ACTION","Message":"Not Found"}} type sKsyunError struct { - Params map[string]string `json:"Params"` - StatusCode int `json:"StatusCode"` - RequestId string `json:"RequestId"` + Params map[string]interface{} `json:"Params"` + StatusCode int `json:"StatusCode"` + RequestId string `json:"RequestId"` ErrorMsg struct { Code string `json:"Code"` Message string `json:"Message"` @@ -225,6 +231,44 @@ func (cli *SKsyunClient) sign(req *http.Request) (string, error) { func (cli *SKsyunClient) Do(req *http.Request) (*http.Response, error) { client := cli.getDefaultClient() + req.Header.Set("Accept", "application/json") + + if req.Method == "POST" || req.Method == "PUT" || req.Method == "DELETE" && req.Body != nil { + cred := credentials.NewStaticCredentials(cli.accessKeyId, cli.accessKeySecret, "") + sig := v4.NewSigner(cred) + var body io.ReadSeeker = nil + bodyBytes, err := io.ReadAll(req.Body) + if err != nil { + return nil, errors.Wrapf(err, "ReadAll") + } + body = bytes.NewReader(bodyBytes) + + v4Req, err := http.NewRequestWithContext(cli.ctx, req.Method, req.URL.String(), body) + if err != nil { + return nil, errors.Wrapf(err, "NewRequestWithContext") + } + v4Req.Header.Set("Accept", "application/json") + v4Req.Header.Set("X-Amz-Date", time.Now().UTC().Format("20060102T150405Z")) + v4Req.Header.Set("Content-Type", req.Header.Get("Content-Type")) + v4Req.Header.Set("Host", req.URL.Host) + v4Req.Header.Set("User-Agent", req.Header.Get("User-Agent")) + v4Req.ContentLength = int64(len(bodyBytes)) + + service, regionId := "", KSYUN_DEFAULT_REGION + urlInfo := strings.Split(req.URL.Host, ".") + if len(urlInfo) < 2 { + return nil, errors.Wrapf(errors.ErrInvalidStatus, "urlInfo") + } + service = urlInfo[0] + if urlInfo[1] != "api" { + regionId = urlInfo[1] + } + _, err = sig.Sign(v4Req, body, service, regionId, time.Now()) + if err != nil { + return nil, errors.Wrapf(err, "sign") + } + return client.Do(v4Req) + } signature, err := cli.sign(req) if err != nil { @@ -238,72 +282,81 @@ func (cli *SKsyunClient) Do(req *http.Request) (*http.Response, error) { query.Set("Signature", signature) req.URL.RawQuery = query.Encode() - req.Header.Set("Accept", "application/json") + return client.Do(req) } -func (cli *SKsyunClient) ec2Request(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) ec2Request(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("kec", regionId, apiName, KSYUN_DEFAULT_API_VERSION, params) } -func (cli *SKsyunClient) iamRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) iamRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("iam", regionId, apiName, "2015-11-01", params) } -func (cli *SKsyunClient) tagRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) tagRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("tag", regionId, apiName, KSYUN_DEFAULT_API_VERSION, params) } -func (cli *SKsyunClient) eipRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) eipRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("eip", regionId, apiName, KSYUN_DEFAULT_API_VERSION, params) } -func (cli *SKsyunClient) ebsRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) ebsRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("ebs", regionId, apiName, KSYUN_DEFAULT_API_VERSION, params) } -func (cli *SKsyunClient) sksRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) sksRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("sks", regionId, apiName, KSYUN_SKS_API_VERSION, params) } -func (cli *SKsyunClient) rdsRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) rdsRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("krds", regionId, apiName, KSYUN_RDS_API_VERSION, params) } -func (cli *SKsyunClient) vpcRequest(regionId, apiName string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) vpcRequest(regionId, apiName string, params map[string]interface{}) (jsonutils.JSONObject, error) { return cli.request("vpc", regionId, apiName, KSYUN_DEFAULT_API_VERSION, params) } -func (cli *SKsyunClient) request(service, regionId, apiName, apiVersion string, params map[string]string) (jsonutils.JSONObject, error) { +func (cli *SKsyunClient) request(service, regionId, apiName, apiVersion string, params map[string]interface{}) (jsonutils.JSONObject, error) { uri, err := cli.getUrl(service, regionId) if err != nil { return nil, errors.Wrapf(err, "getUrl") } if params == nil { - params = map[string]string{} + params = map[string]interface{}{} } - if len(regionId) > 0 { - params["Region"] = regionId - } - params["Action"] = apiName - params["Version"] = apiVersion - params["Accesskey"] = cli.accessKeyId - params["SignatureMethod"] = "HMAC-SHA256" - params["Service"] = service - params["Format"] = "json" - params["SignatureVersion"] = "1.0" - params["Timestamp"] = time.Now().UTC().Format("2006-01-02T15:04:05Z") + values := url.Values{} - for k, v := range params { - values.Set(k, v) - } - uri = fmt.Sprintf("%s?%s", uri, values.Encode()) + values.Set("Action", apiName) + values.Set("Version", apiVersion) + values.Set("Service", service) + method := httputils.GET - if !strings.HasPrefix(apiName, "Describe") && !strings.HasPrefix(apiName, "Get") && service != "sks" { + if apiName == "GetMetricStatisticsBatch" { method = httputils.POST } - req := httputils.NewJsonRequest(method, uri, nil) + + if method == httputils.GET { + values.Set("Accesskey", cli.accessKeyId) + values.Set("SignatureMethod", "HMAC-SHA256") + values.Set("Format", "json") + values.Set("SignatureVersion", "1.0") + values.Set("Timestamp", time.Now().UTC().Format("2006-01-02T15:04:05Z")) + if len(regionId) > 0 { + values.Set("Region", regionId) + } + } + ksErr := &sKsyunError{Params: params} + if method == httputils.GET { + for k, v := range params { + values.Set(k, fmt.Sprintf("%v", v)) + } + params = nil + } + uri = fmt.Sprintf("%s?%s", uri, values.Encode()) + req := httputils.NewJsonRequest(method, uri, params) client := httputils.NewJsonClient(cli) _, resp, err := client.Send(cli.ctx, req, ksErr, cli.debug) if err != nil { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/monitor.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/monitor.go new file mode 100644 index 0000000000..d77d5c99b5 --- /dev/null +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/monitor.go @@ -0,0 +1,114 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ksyun + +import ( + "time" + + "yunion.io/x/cloudmux/pkg/cloudprovider" + "yunion.io/x/jsonutils" + "yunion.io/x/log" + "yunion.io/x/pkg/errors" +) + +func (cli *SKsyunClient) monitorRequest(regionId, action string, params map[string]interface{}) (jsonutils.JSONObject, error) { + return cli.request("monitor", regionId, action, KSYUN_MONITOR_API_VERSION, params) +} + +func (cli *SKsyunClient) GetMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { + switch opts.ResourceType { + case cloudprovider.METRIC_RESOURCE_TYPE_SERVER: + return cli.GetEcsMetrics(opts) + default: + return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "%s", opts.ResourceType) + } +} + +type SMetric struct { + Instance string + Datapoints struct { + Member []struct { + Average float64 + Timestamp time.Time + UnixTimestamp int64 + } + } + Label string +} + +func (cli *SKsyunClient) GetEcsMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { + params := map[string]interface{}{ + "Namespace": "KEC", + "StartTime": opts.StartTime.Format("2006-01-02T15:04:05Z"), + "EndTime": opts.EndTime.Format("2006-01-02T15:04:05Z"), + "Aggregate": []string{"Average"}, + "Metrics": []map[string]interface{}{ + { + "InstanceID": opts.ResourceId, + "MetricName": "cpu.utilizition.total", + }, + { + "InstanceID": opts.ResourceId, + "MetricName": "memory.utilizition.total", + }, + { + "InstanceID": opts.ResourceId, + "MetricName": "vfs.fs.size", + }, + }, + } + + resp, err := cli.monitorRequest(opts.RegionExtId, "GetMetricStatisticsBatch", params) + if err != nil { + return nil, err + } + + metrics := struct { + GetMetricStatisticsBatchResults []SMetric + }{} + + err = resp.Unmarshal(&metrics) + if err != nil { + return nil, err + } + ret := []cloudprovider.MetricValues{} + for _, metric := range metrics.GetMetricStatisticsBatchResults { + values := []cloudprovider.MetricValue{} + for _, value := range metric.Datapoints.Member { + values = append(values, cloudprovider.MetricValue{ + Timestamp: value.Timestamp, + Value: value.Average, + }) + } + metricValue := cloudprovider.MetricValues{ + Id: metric.Instance, + Values: values, + } + switch metric.Label { + case "cpu.utilizition.total": + metricValue.MetricType = cloudprovider.VM_METRIC_TYPE_CPU_USAGE + case "memory.utilizition.total": + metricValue.MetricType = cloudprovider.VM_METRIC_TYPE_MEM_USAGE + case "vfs.fs.size": + metricValue.MetricType = cloudprovider.VM_METRIC_TYPE_DISK_USAGE + default: + log.Errorf("invalid metric label %s", metric.Label) + continue + } + ret = append(ret, metricValue) + } + + return ret, nil +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/network.go index 81ebd66901..9058d3fe50 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/network.go @@ -59,7 +59,7 @@ type SNetwork struct { func (region *SRegion) GetNetworks(vpcIds, networkIds []string, zoneName string) ([]SNetwork, error) { networks := []SNetwork{} - param := map[string]string{} + param := map[string]interface{}{} searchIndex := 1 if len(vpcIds) > 0 { param[fmt.Sprintf("Filter.%d.Name", searchIndex)] = "vpc-id" @@ -203,7 +203,7 @@ func (net *SNetwork) GetDescription() string { } func (region *SRegion) DeleteNetwork(networkId string) error { - params := map[string]string{ + params := map[string]interface{}{ "SubnetId": networkId, } _, err := region.vpcRequest("DeleteSubnet", params) @@ -217,7 +217,7 @@ func (region *SRegion) CreateNetwork(vpcId, zoneId string, opts *cloudprovider.S } startIp := pref.Address.NetAddr(pref.MaskLen) // 0 gateway := startIp.StepUp() // 1 - params := map[string]string{ + params := map[string]interface{}{ "VpcId": vpcId, "SubnetName": opts.Name, "CidrBlock": opts.Cidr, diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/policy.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/policy.go index ceb46ae5fe..5763f4d4ea 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/policy.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/policy.go @@ -102,7 +102,7 @@ func (client *SKsyunClient) GetICloudpolicies() ([]cloudprovider.ICloudpolicy, e } func (client *SKsyunClient) ListPolicies(scope string) ([]SPolicy, error) { - params := map[string]string{ + params := map[string]interface{}{ "MaxItems": "100", } if len(scope) > 0 { @@ -134,7 +134,7 @@ func (client *SKsyunClient) ListPolicies(scope string) ([]SPolicy, error) { } func (client *SKsyunClient) DeletePolicy(krn string) error { - params := map[string]string{ + params := map[string]interface{}{ "PolicyKrn": krn, } _, err := client.iamRequest("", "DeletePolicy", params) @@ -146,7 +146,7 @@ type SPolicyVersion struct { } func (client *SKsyunClient) GetPolicyVersion(krn, version string) (*SPolicyVersion, error) { - params := map[string]string{ + params := map[string]interface{}{ "PolicyKrn": krn, "VersionId": version, } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/project.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/project.go index d50395b0bb..80979433d7 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/project.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/project.go @@ -97,7 +97,7 @@ func (self *SKsyunClient) GetIProjects() ([]cloudprovider.ICloudProject, error) } func (cli *SKsyunClient) CreateProject(name string) (*SProject, error) { - params := map[string]string{ + params := map[string]interface{}{ "ProjectName": name, } _, err := cli.iamRequest("", "CreateProject", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/region.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/region.go index 8b2c7d25e4..f96561a0e7 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/region.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/region.go @@ -260,26 +260,26 @@ func (r *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) { return vm, nil } -func (region *SRegion) ecsRequest(action string, params map[string]string) (jsonutils.JSONObject, error) { +func (region *SRegion) ecsRequest(action string, params map[string]interface{}) (jsonutils.JSONObject, error) { return region.client.ec2Request(region.Region, action, params) } -func (region *SRegion) tagRequest(action string, params map[string]string) (jsonutils.JSONObject, error) { +func (region *SRegion) tagRequest(action string, params map[string]interface{}) (jsonutils.JSONObject, error) { return region.client.tagRequest(region.Region, action, params) } -func (region *SRegion) eipRequest(action string, params map[string]string) (jsonutils.JSONObject, error) { +func (region *SRegion) eipRequest(action string, params map[string]interface{}) (jsonutils.JSONObject, error) { return region.client.eipRequest(region.Region, action, params) } -func (region *SRegion) ebsRequest(action string, params map[string]string) (jsonutils.JSONObject, error) { +func (region *SRegion) ebsRequest(action string, params map[string]interface{}) (jsonutils.JSONObject, error) { return region.client.ebsRequest(region.Region, action, params) } -func (region *SRegion) vpcRequest(action string, params map[string]string) (jsonutils.JSONObject, error) { +func (region *SRegion) vpcRequest(action string, params map[string]interface{}) (jsonutils.JSONObject, error) { return region.client.vpcRequest(region.Region, action, params) } -func (region *SRegion) rdsRequest(action string, params map[string]string) (jsonutils.JSONObject, error) { +func (region *SRegion) rdsRequest(action string, params map[string]interface{}) (jsonutils.JSONObject, error) { return region.client.rdsRequest(region.Region, action, params) } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/secgroup_rules.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/secgroup_rules.go index 286461113c..7be74812d3 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/secgroup_rules.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/secgroup_rules.go @@ -96,7 +96,7 @@ func (rule *SPermission) Delete() error { } func (region *SRegion) DeleteSecurityGroupRule(groupId string, ruleId string) error { - params := map[string]string{ + params := map[string]interface{}{ "SecurityGroupId": groupId, "SecurityGroupEntryId": ruleId, } @@ -113,7 +113,7 @@ func (group *SSecurityGroup) CreateRule(opts *cloudprovider.SecurityGroupRuleCre } func (region *SRegion) CreateSecurityGroupRule(groupId string, opts *cloudprovider.SecurityGroupRuleCreateOptions) (*SPermission, error) { - params := map[string]string{ + params := map[string]interface{}{ "SecurityGroupId": groupId, "CidrBlock": opts.CIDR, "Direction": string(opts.Direction), diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/securitygroup.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/securitygroup.go index ff57cc02ab..25e6deb133 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/securitygroup.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/securitygroup.go @@ -119,7 +119,7 @@ func (secgroup *SSecurityGroup) GetReferences() ([]cloudprovider.SecurityGroupRe func (region *SRegion) GetSecurityGroups(vpcId string, securityGroupIds []string) ([]SSecurityGroup, error) { ret := []SSecurityGroup{} - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", } if len(vpcId) > 0 { @@ -165,7 +165,7 @@ func (region *SRegion) GetSecurityGroup(id string) (*SSecurityGroup, error) { } func (region *SRegion) CreateSecurityGroup(opts *cloudprovider.SecurityGroupCreateInput) (*SSecurityGroup, error) { - params := map[string]string{ + params := map[string]interface{}{ "VpcId": opts.VpcId, "SecurityGroupName": opts.Name, } @@ -185,7 +185,7 @@ func (region *SRegion) CreateSecurityGroup(opts *cloudprovider.SecurityGroupCrea } func (region *SRegion) SetSecurityGroups(secgroupIds []string, instanceId, nicId, subnetId string) error { - params := map[string]string{ + params := map[string]interface{}{ "InstanceId": instanceId, "NetworkInterfaceId": nicId, "SubnetId": subnetId, @@ -209,7 +209,7 @@ func (sg *SSecurityGroup) Delete() error { } func (region *SRegion) DeleteSecurityGroup(secGrpId string) error { - params := map[string]string{ + params := map[string]interface{}{ "SecurityGroupId": secGrpId, } _, err := region.vpcRequest("DeleteSecurityGroup", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/snapshot.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/snapshot.go index 19c10c70cb..1eeca52814 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/snapshot.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/snapshot.go @@ -152,7 +152,7 @@ func (self *SSnapshot) Delete() error { } func (region *SRegion) CreateSnapshot(diskId, name, desc string) (*SSnapshot, error) { - params := map[string]string{ + params := map[string]interface{}{ "VolumeId": diskId, "SnapshotName": name, "SnapshotDesc": desc, @@ -170,7 +170,7 @@ func (region *SRegion) CreateSnapshot(diskId, name, desc string) (*SSnapshot, er } func (region *SRegion) GetSnapshots(snapshotId, volumeId string) ([]SSnapshot, error) { - params := map[string]string{ + params := map[string]interface{}{ "PageSize": "1000", } if len(snapshotId) > 0 { @@ -221,7 +221,7 @@ func (region *SRegion) GetSnapshot(id string) (*SSnapshot, error) { } func (region *SRegion) DeleteSnapshot(snapshotId string) error { - params := map[string]string{ + params := map[string]interface{}{ "SnapshotId": snapshotId, } _, err := region.ebsRequest("DeleteSnapshot", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/storages.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/storages.go index a30cf65490..a10c861dc4 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/storages.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/storages.go @@ -33,15 +33,6 @@ type SStorage struct { StorageType string } -var ksDiskTypes = []string{ - api.STORAGE_KSYUN_ESSD_AUTO_PL, - api.STORAGE_KSYUN_ESSD_PL1, - api.STORAGE_KSYUN_ESSD_PL2, - api.STORAGE_KSYUN_ESSD_PL3, - api.STORAGE_KSYUN_SSD3_0, - api.STORAGE_KSYUN_EHDD, -} - func (storage *SStorage) GetId() string { return fmt.Sprintf("%s-%s-%s", storage.zone.region.client.cpcfg.Id, storage.zone.GetId(), storage.StorageType) } @@ -108,6 +99,15 @@ func (storage *SStorage) CreateIDisk(opts *cloudprovider.DiskCreateConfig) (clou } func (storage *SStorage) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { + if len(strings.Split(id, "-")) >= 4 { // Local SSD + return &SDisk{ + storage: storage, + VolumeId: id, + VolumeType: storage.StorageType, + VolumeName: id, + VolumeCategory: "data", + }, nil + } disks, err := storage.zone.region.GetDisks([]string{id}, "", storage.zone.GetId()) if err != nil { return nil, err @@ -130,7 +130,7 @@ func (storage *SStorage) IsSysDiskStore() bool { } func (storage *SStorage) DisableSync() bool { - return false + return storage.StorageType == api.STORAGE_KSYUN_LOCAL_SSD } func (storage *SStorage) GetIStoragecache() cloudprovider.ICloudStoragecache { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/tag.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/tag.go index 32ea95ee3b..7f57ab13b0 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/tag.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/tag.go @@ -32,7 +32,7 @@ func (vv TagSet) GetTags() map[string]string { } func (self *SRegion) ListTags(resType string, resId string) (*TagSet, error) { - params := map[string]string{ + params := map[string]interface{}{ "MaxResults": "1000", "Filter.1.Name": "resource-type", "Filter.1.Value.1": resType, diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/user.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/user.go index 232aaa8b51..969c96ff94 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/user.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/user.go @@ -103,7 +103,7 @@ func (user *SUser) ResetPassword(password string) error { } func (client *SKsyunClient) UpdateLoginProfile(name, password string) error { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, "Password": password, "ViewAllProject": "true", @@ -119,7 +119,7 @@ type LoginProfile struct { } func (client *SKsyunClient) GetLoginProfile(name string) (*LoginProfile, error) { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, } resp, err := client.iamRequest("", "GetLoginProfile", params) @@ -143,7 +143,7 @@ func (user *SUser) DetachPolicy(policyName string, policyType api.TPolicyType) e } func (client *SKsyunClient) GetUsers() ([]SUser, error) { - params := map[string]string{ + params := map[string]interface{}{ "MaxItems": "100", } ret := []SUser{} @@ -172,7 +172,7 @@ func (client *SKsyunClient) GetUsers() ([]SUser, error) { } func (client *SKsyunClient) DeleteUser(name string) error { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, } _, err := client.iamRequest("", "DeleteUser", params) @@ -201,7 +201,7 @@ func (client *SKsyunClient) CreateIClouduser(opts *cloudprovider.SClouduserCreat } func (client *SKsyunClient) CreateUser(opts *cloudprovider.SClouduserCreateConfig) (*SUser, error) { - params := map[string]string{ + params := map[string]interface{}{ "UserName": opts.Name, "Remark": opts.Desc, "Email": opts.Email, @@ -221,7 +221,7 @@ func (client *SKsyunClient) CreateUser(opts *cloudprovider.SClouduserCreateConfi } func (client *SKsyunClient) ListGroupsForUser(name string) ([]SGroup, error) { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, "MaxItems": "100", } @@ -251,7 +251,7 @@ func (client *SKsyunClient) ListGroupsForUser(name string) ([]SGroup, error) { } func (client *SKsyunClient) ListAttachedUserPolicies(name string) ([]SPolicy, error) { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, "MaxItems": "100", } @@ -281,7 +281,7 @@ func (client *SKsyunClient) ListAttachedUserPolicies(name string) ([]SPolicy, er } func (client *SKsyunClient) AttachUserPolicy(name, policy string) error { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, "PolicyKrn": policy, } @@ -290,7 +290,7 @@ func (client *SKsyunClient) AttachUserPolicy(name, policy string) error { } func (client *SKsyunClient) DetachUserPolicy(name, policy string) error { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, "PolicyKrn": policy, } @@ -307,7 +307,7 @@ func (client *SKsyunClient) GetIClouduserByName(name string) (cloudprovider.IClo } func (client *SKsyunClient) GetUser(name string) (*SUser, error) { - params := map[string]string{ + params := map[string]interface{}{ "UserName": name, } resp, err := client.iamRequest("", "GetUser", params) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/vpc.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/vpc.go index 8db78083ba..8e1c1f6116 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/vpc.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/vpc.go @@ -40,7 +40,7 @@ type SVpc struct { } func (region *SRegion) GetVpcs(ids []string) ([]SVpc, error) { - param := map[string]string{ + param := map[string]interface{}{ "MaxResults": "1000", } for i, vpcId := range ids { @@ -185,7 +185,7 @@ func (vpc *SVpc) GetIWireById(wireId string) (cloudprovider.ICloudWire, error) { } func (vpc *SRegion) DeleteVpc(vpcId string) error { - params := map[string]string{ + params := map[string]interface{}{ "VpcId": vpcId, } _, err := vpc.vpcRequest("DeleteVpc", params) @@ -193,7 +193,7 @@ func (vpc *SRegion) DeleteVpc(vpcId string) error { } func (region *SRegion) CreateVpc(opts *cloudprovider.VpcCreateOptions) (*SVpc, error) { - params := map[string]string{ + params := map[string]interface{}{ "VpcName": opts.NAME, "CidrBlock": opts.CIDR, } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/zone.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/zone.go index 2b6749f213..76c8e75ba2 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/zone.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/ksyun/zone.go @@ -35,9 +35,9 @@ type SZone struct { } func (region *SRegion) GetZones() ([]SZone, error) { - params := map[string]string{} + params := map[string]interface{}{} if len(region.Region) > 0 { - params = map[string]string{"Region": region.Region} + params = map[string]interface{}{"Region": region.Region} } resp, err := region.ecsRequest("DescribeAvailabilityZones", params) if err != nil { @@ -148,13 +148,17 @@ func (zone *SZone) GetDescription() string { func (zone *SZone) GetStorages() ([]SStorage, error) { zoneDiskType := []string{} - for i := range ksDiskTypes { - params := map[string]string{ - "VolumeType": ksDiskTypes[i], + for i := range api.KSYUN_STORAGES { + if api.KSYUN_STORAGES[i] == api.STORAGE_KSYUN_LOCAL_SSD { + zoneDiskType = append(zoneDiskType, api.KSYUN_STORAGES[i]) + continue + } + params := map[string]interface{}{ + "VolumeType": api.KSYUN_STORAGES[i], } resp, err := zone.region.ebsRequest("DescribeAvailabilityZones", params) if err != nil { - return nil, errors.Wrapf(err, "%s:ValidateAttachInstance", ksDiskTypes[i]) + return nil, errors.Wrapf(err, "%s:ValidateAttachInstance", api.KSYUN_STORAGES[i]) } zoneList := []string{} err = resp.Unmarshal(&zoneList, "AvailabilityZones") @@ -162,7 +166,7 @@ func (zone *SZone) GetStorages() ([]SStorage, error) { return nil, errors.Wrap(err, "unmarshal zoneList") } if utils.IsInStringArray(zone.GetName(), zoneList) { - zoneDiskType = append(zoneDiskType, ksDiskTypes[i]) + zoneDiskType = append(zoneDiskType, api.KSYUN_STORAGES[i]) } } storages := []SStorage{} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/monitor.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/monitor.go index 0f6133c109..20ac58c0a6 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/monitor.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/monitor.go @@ -168,7 +168,7 @@ func (self *SQcloudClient) GetEcsMetrics(opts *cloudprovider.MetricListOptions) }, } { for metricName, tag := range metricNames { - metrics, err := self.GetMonitorData("QCE/CVM", metricName, 0, opts.StartTime, opts.EndTime, opts.RegionExtId, "InstanceId", opts.ResourceIds) + metrics, err := self.GetMonitorData("QCE/CVM", metricName, 60, opts.StartTime, opts.EndTime, opts.RegionExtId, "InstanceId", opts.ResourceIds) if err != nil { log.Errorf("GetMonitorData error: %v", err) continue @@ -236,7 +236,7 @@ func (self *SQcloudClient) GetRedisMetrics(opts *cloudprovider.MetricListOptions }, } { for metricName, tag := range metricNames { - metrics, err := self.GetMonitorData("QCE/REDIS_MEM", metricName, 0, opts.StartTime, opts.EndTime, opts.RegionExtId, "instanceid", opts.ResourceIds) + metrics, err := self.GetMonitorData("QCE/REDIS_MEM", metricName, 60, opts.StartTime, opts.EndTime, opts.RegionExtId, "instanceid", opts.ResourceIds) if err != nil { log.Errorf("GetMonitorData error: %v", err) continue diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go index ccb677778a..952ef19558 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/qcloud.go @@ -511,7 +511,7 @@ func (client *SQcloudClient) getSdkClient(regionId string) (*common.Client, erro return nil } if client.cpcfg.ReadOnly { - for _, prefix := range []string{"Get", "List", "Describe"} { + for _, prefix := range []string{"Get", "List", "Describe", "LookUpEvents"} { if strings.HasPrefix(action, prefix) { return respCheck, nil }