diff --git a/pkg/cloudcommon/db/metadata.go b/pkg/cloudcommon/db/metadata.go index a560dfae11..0228dfb7d5 100644 --- a/pkg/cloudcommon/db/metadata.go +++ b/pkg/cloudcommon/db/metadata.go @@ -39,10 +39,11 @@ import ( ) const ( - SYSTEM_ADMIN_PREFIX = "__sys_" - SYS_TAG_PREFIX = "__" - CLOUD_TAG_PREFIX = "ext:" - USER_TAG_PREFIX = "user:" + SYSTEM_ADMIN_PREFIX = "__sys_" + SYS_TAG_PREFIX = "__" + CLOUD_TAG_PREFIX = "ext:" + USER_TAG_PREFIX = "user:" + SYS_CLOUD_TAG_PREFIX = "sys:" // TAG_DELETE_RANGE_USER = "user" // TAG_DELETE_RANGE_CLOUD = CLOUD_TAG_PREFIX // "cloud" @@ -568,6 +569,8 @@ func (manager *SMetadataManager) SetAll(ctx context.Context, obj IModel, store m q = q.Like("key", USER_TAG_PREFIX+"%") case CLOUD_TAG_PREFIX: q = q.Like("key", CLOUD_TAG_PREFIX+"%") + case SYS_CLOUD_TAG_PREFIX: + q = q.Like("key", SYS_CLOUD_TAG_PREFIX+"%") } q = q.Filter(sqlchemy.NOT(sqlchemy.In(q.Field("key"), keys))) if err := FetchModelObjects(manager, q, &records); err != nil { diff --git a/pkg/cloudcommon/db/standalone_anon.go b/pkg/cloudcommon/db/standalone_anon.go index ae77a55a59..594edbada8 100644 --- a/pkg/cloudcommon/db/standalone_anon.go +++ b/pkg/cloudcommon/db/standalone_anon.go @@ -293,6 +293,14 @@ func (model *SStandaloneAnonResourceBase) SetCloudMetadataAll(ctx context.Contex return nil } +func (model *SStandaloneAnonResourceBase) SetSysCloudMetadataAll(ctx context.Context, dictstore map[string]interface{}, userCred mcclient.TokenCredential) error { + err := Metadata.SetAll(ctx, model, dictstore, userCred, SYS_CLOUD_TAG_PREFIX) + if err != nil { + return errors.Wrap(err, "SetAll") + } + return nil +} + func (model *SStandaloneAnonResourceBase) RemoveMetadata(ctx context.Context, key string, userCred mcclient.TokenCredential) error { err := Metadata.SetValue(ctx, model, key, "", userCred) if err != nil { diff --git a/pkg/cloudprovider/fakeregion.go b/pkg/cloudprovider/fakeregion.go index e9936ae97a..2165755c78 100644 --- a/pkg/cloudprovider/fakeregion.go +++ b/pkg/cloudprovider/fakeregion.go @@ -14,10 +14,6 @@ package cloudprovider -import ( - "yunion.io/x/jsonutils" -) - type SFakeOnPremiseRegion struct { } @@ -53,10 +49,18 @@ func (region *SFakeOnPremiseRegion) IsEmulated() bool { return true } -func (region *SFakeOnPremiseRegion) GetMetadata() *jsonutils.JSONDict { +func (region *SFakeOnPremiseRegion) GetSysTags() map[string]string { return nil } +func (region *SFakeOnPremiseRegion) GetTags() (map[string]string, error) { + return nil, nil +} + +func (region *SFakeOnPremiseRegion) SetTags(tags map[string]string, replace bool) error { + return ErrNotImplemented +} + func (region *SFakeOnPremiseRegion) GetGeographicInfo() SGeographicInfo { return SGeographicInfo{} } diff --git a/pkg/cloudprovider/objectstore.go b/pkg/cloudprovider/objectstore.go index d6553690c4..71427b4ae5 100644 --- a/pkg/cloudprovider/objectstore.go +++ b/pkg/cloudprovider/objectstore.go @@ -271,8 +271,6 @@ type ICloudBucket interface { SetPolicy(policy SBucketPolicyStatementInput) error DeletePolicy(id []string) ([]SBucketPolicyStatement, error) - GetTags() (map[string]string, error) - SetTags(tags map[string]string) error DeleteTags() error ListMultipartUploads() ([]SBucketMultipartUploads, error) @@ -861,7 +859,7 @@ func SetBucketMetadata(ibucket ICloudBucket, tags map[string]string, replace boo return errors.Wrap(err, "b.DeleteTags()") } } else { - err := ibucket.SetTags(newTags) + err := ibucket.SetTags(newTags, true) if err != nil { return errors.Wrapf(err, "b.setTags(%s)", jsonutils.Marshal(newTags).String()) } diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index b172c09144..10d748e184 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -38,7 +38,11 @@ type ICloudResource interface { Refresh() error IsEmulated() bool - GetMetadata() *jsonutils.JSONDict + // GetMetadata() *jsonutils.JSONDict + + GetSysTags() map[string]string + GetTags() (map[string]string, error) + SetTags(tags map[string]string, replace bool) error } type IVirtualResource interface { @@ -325,8 +329,6 @@ type ICloudVM interface { GetError() error - SetMetadata(tags map[string]string, replace bool) error - CreateInstanceSnapshot(ctx context.Context, name string, desc string) (ICloudInstanceSnapshot, error) GetInstanceSnapshot(idStr string) (ICloudInstanceSnapshot, error) GetInstanceSnapshots() ([]ICloudInstanceSnapshot, error) @@ -604,8 +606,6 @@ type ICloudLoadbalancer interface { CreateILoadBalancerListener(ctx context.Context, listener *SLoadbalancerListener) (ICloudLoadbalancerListener, error) GetILoadBalancerListenerById(listenerId string) (ICloudLoadbalancerListener, error) - - SetMetadata(tags map[string]string, replace bool) error } type ICloudLoadbalancerListener interface { @@ -879,8 +879,6 @@ type ICloudDBInstance interface { RecoveryFromBackup(conf *SDBInstanceRecoveryConfig) error Delete() error - - SetMetadata(tags map[string]string, replace bool) error } type ICloudDBInstanceParameter interface { @@ -991,7 +989,6 @@ type ICloudElasticcache interface { UpdateBackupPolicy(config SCloudElasticCacheBackupPolicyUpdateInput) error Renew(bc billing.SBillingCycle) error - SetMetadata(tags map[string]string, replace bool) error UpdateSecurityGroups(secgroupIds []string) error } diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index f2a25d288f..b8e7bb5462 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -1271,11 +1271,12 @@ func (self *SManagedVirtualizedGuestDriver) RequestRemoteUpdate(ctx context.Cont if err != nil { log.Errorf("GetAllUserMetadata fail %s", err) } else { - err := iVM.SetMetadata(tags, replaceTags) + err := iVM.SetTags(tags, replaceTags) if err != nil { return errors.Wrap(err, "iVM.SetMetadata") } // sync back cloud metadata + iVM.Refresh() err = models.SyncVirtualResourceMetadata(ctx, userCred, guest, iVM) if err != nil { return errors.Wrap(err, "syncVirtualResourceMetadata") diff --git a/pkg/compute/guestdrivers/utils.go b/pkg/compute/guestdrivers/utils.go index 01eb98ae42..03635b0931 100644 --- a/pkg/compute/guestdrivers/utils.go +++ b/pkg/compute/guestdrivers/utils.go @@ -22,6 +22,7 @@ import ( "yunion.io/x/pkg/utils" billing_api "yunion.io/x/onecloud/pkg/apis/billing" + "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/util/seclib2" ) @@ -97,15 +98,15 @@ func fetchIVMinfo(desc cloudprovider.SManagedVMCreateConfig, iVM cloudprovider.I dinfo.FsFromat = idisks[i].GetFsFormat() dinfo.ExpiredAt = idisks[i].GetExpiredAt() dinfo.StorageExternalId = idisks[i].GetIStorageId() - if metaData := idisks[i].GetMetadata(); metaData != nil { + diskSysTags := idisks[i].GetSysTags() + diskTags, _ := idisks[i].GetTags() + if diskSysTags != nil || diskTags != nil { dinfo.Metadata = make(map[string]string, 0) - metadata := map[string]string{} - if err := metaData.Unmarshal(&metadata); err != nil { - log.Errorf("Get disk %s metadata info error: %v", idisks[i].GetName(), err) - } else { - for k, v := range metadata { - dinfo.Metadata["ext:"+k] = v - } + for k, v := range diskSysTags { + dinfo.Metadata[db.SYS_CLOUD_TAG_PREFIX+k] = v + } + for k, v := range diskTags { + dinfo.Metadata[db.CLOUD_TAG_PREFIX+k] = v } } diskInfo[i] = dinfo @@ -114,13 +115,14 @@ func fetchIVMinfo(desc cloudprovider.SManagedVMCreateConfig, iVM cloudprovider.I } data.Add(jsonutils.NewString(iVM.GetGlobalId()), "uuid") - metadata := map[string]string{} - if _metadata := iVM.GetMetadata(); _metadata != nil { - _metadata.Unmarshal(&metadata) - } + sysTags := iVM.GetSysTags() + tags, _ := iVM.GetTags() metadataDict := jsonutils.NewDict() - for k, v := range metadata { - metadataDict.Add(jsonutils.NewString(v), "ext:"+k) + for k, v := range sysTags { + metadataDict.Add(jsonutils.NewString(v), db.SYS_CLOUD_TAG_PREFIX+k) + } + for k, v := range tags { + metadataDict.Add(jsonutils.NewString(v), db.CLOUD_TAG_PREFIX+k) } data.Add(metadataDict, "metadata") diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index bc2f646f56..bae54ab8e8 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -3206,7 +3206,7 @@ func (manager *SGuestManager) getUserMetadata(data jsonutils.JSONObject) (map[st } dictStore := map[string]interface{}{} for k, v := range metadata { - dictStore["user:"+k], _ = v.GetString() + dictStore[db.USER_TAG_PREFIX+k], _ = v.GetString() } return dictStore, nil } diff --git a/pkg/compute/models/loadbalancerawscachedlbbg.go b/pkg/compute/models/loadbalancerawscachedlbbg.go index 660d43aa85..d37075de32 100644 --- a/pkg/compute/models/loadbalancerawscachedlbbg.go +++ b/pkg/compute/models/loadbalancerawscachedlbbg.go @@ -359,15 +359,21 @@ func (lbbg *SAwsCachedLbbg) SyncWithCloudLoadbalancerBackendgroup(ctx context.Co diff, err := db.UpdateWithLock(ctx, lbbg, func() error { lbbg.Status = extLoadbalancerBackendgroup.GetStatus() - metadata := extLoadbalancerBackendgroup.GetMetadata() - if port, _ := metadata.Int("port"); port > 0 { - lbbg.Port = int(port) + metadata := extLoadbalancerBackendgroup.GetSysTags() + if port, ok := metadata["port"]; ok { + portNum, err := strconv.Atoi(port) + if err == nil { + lbbg.Port = portNum + } } - if protocol, _ := metadata.GetString("health_check_protocol"); len(protocol) > 0 { + if protocol, ok := metadata["health_check_protocol"]; ok { lbbg.HealthCheckProtocol = protocol } - if interval, _ := metadata.Int("health_check_interval"); interval > 0 { - lbbg.HealthCheckInterval = int(interval) + if interval, ok := metadata["health_check_interval"]; ok { + intervalNum, err := strconv.Atoi(interval) + if err == nil { + lbbg.HealthCheckInterval = intervalNum + } } if newLocalLbbg != nil { lbbg.BackendGroupId = newLocalLbbg.GetId() @@ -399,21 +405,27 @@ func (man *SAwsCachedLbbgManager) newFromCloudLoadbalancerBackendgroup(ctx conte lbbg.ExternalId = extLoadbalancerBackendgroup.GetGlobalId() lbbg.ProtocolType = extLoadbalancerBackendgroup.GetProtocolType() - metadata := extLoadbalancerBackendgroup.GetMetadata() - if t, _ := metadata.GetString("target_type"); len(t) > 0 { + metadata := extLoadbalancerBackendgroup.GetSysTags() + if t, ok := metadata["target_type"]; ok { lbbg.TargetType = t } - if p, _ := metadata.Int("port"); p > 0 { - lbbg.Port = int(p) + if p, ok := metadata["port"]; ok { + portNum, err := strconv.Atoi(p) + if err == nil { + lbbg.Port = portNum + } } - if protocol, _ := metadata.GetString("health_check_protocol"); len(protocol) > 0 { + if protocol, ok := metadata["health_check_protocol"]; ok { lbbg.HealthCheckProtocol = protocol } - if interval, _ := metadata.Int("health_check_interval"); interval > 0 { - lbbg.HealthCheckInterval = int(interval) + if interval, ok := metadata["health_check_interval"]; ok { + intervalNum, err := strconv.Atoi(interval) + if err == nil { + lbbg.HealthCheckInterval = intervalNum + } } newName, err := db.GenerateName(man, syncOwnerId, LocalLbbg.GetName()) if err != nil { diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 125a217f7a..d0ffc29694 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -986,8 +986,8 @@ func (man *SLoadbalancerManager) newFromCloudLoadbalancer(ctx context.Context, u } } - if extLb.GetMetadata() != nil { - lb.LBInfo = extLb.GetMetadata() + if extLb.GetSysTags() != nil { + lb.LBInfo = jsonutils.Marshal(extLb.GetSysTags()) } if err := man.TableSpec().Insert(ctx, &lb); err != nil { @@ -1150,8 +1150,8 @@ func (lb *SLoadbalancer) SyncWithCloudLoadbalancer(ctx context.Context, userCred lb.ManagerId = provider.Id lbNetworkIds := getExtLbNetworkIds(extLb, lb.ManagerId) lb.NetworkId = strings.Join(lbNetworkIds, ",") - if extLb.GetMetadata() != nil { - lb.LBInfo = extLb.GetMetadata() + if extLb.GetSysTags() != nil { + lb.LBInfo = jsonutils.Marshal(extLb.GetSysTags()) } syncVirtualResourceMetadata(ctx, userCred, lb, extLb) diff --git a/pkg/compute/models/syncutils.go b/pkg/compute/models/syncutils.go index 17cc8dbfe2..beac0c7d48 100644 --- a/pkg/compute/models/syncutils.go +++ b/pkg/compute/models/syncutils.go @@ -18,6 +18,7 @@ import ( "context" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudprovider" @@ -26,58 +27,55 @@ import ( type IMetadataSetter interface { SetCloudMetadataAll(ctx context.Context, meta map[string]interface{}, userCred mcclient.TokenCredential) error + SetSysCloudMetadataAll(ctx context.Context, meta map[string]interface{}, userCred mcclient.TokenCredential) error Keyword() string GetName() string GetCloudproviderId() string } func syncMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IMetadataSetter, remote cloudprovider.ICloudResource) error { - metaData := remote.GetMetadata() - if metaData != nil { - meta := make(map[string]interface{}, 0) - err := metaData.Unmarshal(meta) - if err != nil { - log.Errorf("Get VM Metadata error: %v", err) - return err - } + sysTags := remote.GetSysTags() + sysStore := make(map[string]interface{}, 0) + for key, value := range sysTags { + sysStore[db.SYS_CLOUD_TAG_PREFIX+key] = value + } + model.SetSysCloudMetadataAll(ctx, sysStore, userCred) + + tags, err := remote.GetTags() + if err == nil || errors.Cause(err) == cloudprovider.ErrNotFound { store := make(map[string]interface{}, 0) - for key, value := range meta { + for key, value := range tags { store[db.CLOUD_TAG_PREFIX+key] = value } - // model.SetMetadata(ctx, "ext:"+key, value, userCred) - // replace all ext keys model.SetCloudMetadataAll(ctx, store, userCred) } return nil } func syncVirtualResourceMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IMetadataSetter, remote cloudprovider.IVirtualResource) error { - metaData := remote.GetMetadata() - store := make(map[string]interface{}, 0) - if metaData != nil { - meta := make(map[string]interface{}, 0) - err := metaData.Unmarshal(meta) - if err != nil { - log.Errorf("Get VM Metadata error: %v", err) - return err - } - for key, value := range meta { - store[db.CLOUD_TAG_PREFIX+key] = value - } - + sysTags := remote.GetSysTags() + sysStore := make(map[string]interface{}, 0) + for key, value := range sysTags { + sysStore[db.SYS_CLOUD_TAG_PREFIX+key] = value } - extProjectId := remote.GetProjectId() if len(extProjectId) > 0 { extProject, err := ExternalProjectManager.GetProject(extProjectId, model.GetCloudproviderId()) if err != nil { log.Errorf("sync project metadata for %s %s error: %v", model.Keyword(), model.GetName(), err) } else { - store[db.CLOUD_TAG_PREFIX+"project"] = extProject.Name + sysStore[db.SYS_CLOUD_TAG_PREFIX+"project"] = extProject.Name } } - if len(store) > 0 { + model.SetSysCloudMetadataAll(ctx, sysStore, userCred) + + tags, err := remote.GetTags() + if err == nil || errors.Cause(err) == cloudprovider.ErrNotFound { + store := make(map[string]interface{}, 0) + for key, value := range tags { + store[db.CLOUD_TAG_PREFIX+key] = value + } model.SetCloudMetadataAll(ctx, store, userCred) } return nil diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index 8e62e1b89c..5656ef7942 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -335,11 +335,12 @@ func (self *SManagedVirtualizationRegionDriver) RequestRemoteUpdateLoadbalancer( if err != nil { log.Errorf("GetAllUserMetadata fail %s", err) } else { - err := iLoadbalancer.SetMetadata(tags, replaceTags) + err := iLoadbalancer.SetTags(tags, replaceTags) if err != nil { return nil, errors.Wrap(err, "iLoadbalancer.SetMetadata") } // sync back cloud metadata + iLoadbalancer.Refresh() err = models.SyncVirtualResourceMetadata(ctx, userCred, lb, iLoadbalancer) if err != nil { return nil, errors.Wrap(err, "syncVirtualResourceMetadata") @@ -2729,11 +2730,12 @@ func (self *SManagedVirtualizationRegionDriver) RequestRemoteUpdateDBInstance(ct if err != nil { log.Errorf("GetAllUserMetadata fail %s", err) } else { - err := iRds.SetMetadata(tags, replaceTags) + err := iRds.SetTags(tags, replaceTags) if err != nil { return nil, errors.Wrap(err, "iRds.SetMetadata") } // sync back cloud metadata + iRds.Refresh() err = models.SyncVirtualResourceMetadata(ctx, userCred, instance, iRds) if err != nil { return nil, errors.Wrap(err, "syncVirtualResourceMetadata") @@ -3127,11 +3129,12 @@ func (self *SManagedVirtualizationRegionDriver) RequestRemoteUpdateElasticcache( if err != nil { log.Errorf("GetAllUserMetadata fail %s", err) } else { - err := iElasticcache.SetMetadata(tags, replaceTags) + err := iElasticcache.SetTags(tags, replaceTags) if err != nil { return nil, errors.Wrap(err, "iElasticcache.SetMetadata") } // sync back cloud metadata + iElasticcache.Refresh() err = models.SyncVirtualResourceMetadata(ctx, userCred, elasticcache, iElasticcache) if err != nil { return nil, errors.Wrap(err, "syncVirtualResourceMetadata") diff --git a/pkg/compute/regiondrivers/qcloud.go b/pkg/compute/regiondrivers/qcloud.go index cb8da3b043..b8ac335c69 100644 --- a/pkg/compute/regiondrivers/qcloud.go +++ b/pkg/compute/regiondrivers/qcloud.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "regexp" + "strconv" "time" "yunion.io/x/jsonutils" @@ -1261,19 +1262,23 @@ func (self *SQcloudRegionDriver) RequestPullRegionLoadbalancerBackendGroup(ctx c } func (self *SQcloudRegionDriver) RequestPullLoadbalancerBackendGroup(ctx context.Context, userCred mcclient.TokenCredential, syncResults models.SSyncResultSet, provider *models.SCloudprovider, localLoadbalancer *models.SLoadbalancer, remoteLoadbalancer cloudprovider.ICloudLoadbalancer, syncRange *models.SSyncRange) error { - meta := remoteLoadbalancer.GetMetadata() + meta := remoteLoadbalancer.GetSysTags() if meta == nil { return fmt.Errorf("") } // 经典型负载均衡只有一个后端服务器组,全局共享 - if forward, _ := meta.Int("Forward"); forward == 1 { - models.SyncQcloudLoadbalancerBackendgroups(ctx, userCred, syncResults, provider, localLoadbalancer, remoteLoadbalancer, syncRange) - return nil - } else { - return self.SManagedVirtualizationRegionDriver.RequestPullLoadbalancerBackendGroup(ctx, userCred, syncResults, provider, localLoadbalancer, remoteLoadbalancer, syncRange) + + if forward, ok := meta["Forward"]; ok { + forwardNum, err := strconv.Atoi(forward) + if err == nil && forwardNum == 1 { + models.SyncQcloudLoadbalancerBackendgroups(ctx, userCred, syncResults, provider, localLoadbalancer, remoteLoadbalancer, syncRange) + return nil + } } + + return self.SManagedVirtualizationRegionDriver.RequestPullLoadbalancerBackendGroup(ctx, userCred, syncResults, provider, localLoadbalancer, remoteLoadbalancer, syncRange) } func (self *SQcloudRegionDriver) RequestPreSnapshotPolicyApply(ctx context.Context, userCred mcclient. diff --git a/pkg/mcclient/options/base.go b/pkg/mcclient/options/base.go index 90b581af23..d7d365a15d 100644 --- a/pkg/mcclient/options/base.go +++ b/pkg/mcclient/options/base.go @@ -23,6 +23,8 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/util/reflectutils" + + "yunion.io/x/onecloud/pkg/cloudcommon/db" ) // Int returns a pointer to int type with the same value as the argument. This @@ -286,14 +288,14 @@ func (opts *BaseListOptions) Params() (*jsonutils.JSONDict, error) { tagIdx++ } for _, tag := range opts.UserTags { - err = opts.addTag("user:", tag, tagIdx, params) + err = opts.addTag(db.USER_TAG_PREFIX, tag, tagIdx, params) if err != nil { return nil, err } tagIdx++ } for _, tag := range opts.CloudTags { - err = opts.addTag("ext:", tag, tagIdx, params) + err = opts.addTag(db.CLOUD_TAG_PREFIX, tag, tagIdx, params) if err != nil { return nil, err } diff --git a/pkg/multicloud/aliyun/bucket.go b/pkg/multicloud/aliyun/bucket.go index 1b1d2b284b..44437bd276 100644 --- a/pkg/multicloud/aliyun/bucket.go +++ b/pkg/multicloud/aliyun/bucket.go @@ -736,7 +736,10 @@ func (b *SBucket) GetTags() (map[string]string, error) { return result, nil } -func (b *SBucket) SetTags(tags map[string]string) error { +func (b *SBucket) SetTags(tags map[string]string, replace bool) error { + if !replace { + return cloudprovider.ErrNotSupported + } osscli, err := b.region.GetOssClient() if err != nil { return errors.Wrap(err, "GetOssClient") diff --git a/pkg/multicloud/aliyun/cloud_enterprise_network_route.go b/pkg/multicloud/aliyun/cloud_enterprise_network_route.go index ee293486c9..459d1e0334 100644 --- a/pkg/multicloud/aliyun/cloud_enterprise_network_route.go +++ b/pkg/multicloud/aliyun/cloud_enterprise_network_route.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SCenRouteEntries struct { @@ -56,6 +57,7 @@ type Conflict struct { } type SCenRouteEntry struct { + multicloud.SResourceBase ChildInstance *SCenChildInstance NextHopInstanceID string `json:"NextHopInstanceId,omitempty"` Status string `json:"Status"` @@ -172,10 +174,6 @@ func (self *SCenRouteEntry) IsEmulated() bool { return false } -func (self *SCenRouteEntry) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SCenRouteEntry) GetCidr() string { return self.DestinationCidrBlock } diff --git a/pkg/multicloud/aliyun/dbinstance.go b/pkg/multicloud/aliyun/dbinstance.go index 029cfd4ab4..c7fe466454 100644 --- a/pkg/multicloud/aliyun/dbinstance.go +++ b/pkg/multicloud/aliyun/dbinstance.go @@ -861,6 +861,17 @@ func (rds *SDBInstance) GetMetadata() *jsonutils.JSONDict { return data } -func (rds *SDBInstance) SetMetadata(tags map[string]string, replace bool) error { +func (rds *SDBInstance) GetTags() (map[string]string, error) { + tags, err := rds.region.ListResourceTags("rds", "INSTANCE", []string{rds.GetId()}) + if err != nil { + return nil, errors.Wrap(err, `rds.region.ListResourceTags`) + } + if _, ok := tags[rds.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[rds.GetId()], nil +} + +func (rds *SDBInstance) SetTags(tags map[string]string, replace bool) error { return rds.region.SetResourceTags("rds", "INSTANCE", []string{rds.GetId()}, tags, replace) } diff --git a/pkg/multicloud/aliyun/disk.go b/pkg/multicloud/aliyun/disk.go index c514c8f443..4380d09e83 100644 --- a/pkg/multicloud/aliyun/disk.go +++ b/pkg/multicloud/aliyun/disk.go @@ -86,6 +86,14 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + priceKey := fmt.Sprintf("%s::%s::%s", self.RegionId, self.Category, self.Type) + data := map[string]string{} + data["price_key"] = priceKey + data["hypervisor"] = api.HYPERVISOR_ALIYUN + return data +} + func (self *SRegion) GetDisks(instanceId string, zoneId string, category string, diskIds []string, offset int, limit int) ([]SDisk, int, error) { if limit > 50 || limit <= 0 { limit = 50 diff --git a/pkg/multicloud/aliyun/eip.go b/pkg/multicloud/aliyun/eip.go index b6956c483a..c44889f958 100644 --- a/pkg/multicloud/aliyun/eip.go +++ b/pkg/multicloud/aliyun/eip.go @@ -147,10 +147,6 @@ func (self *SEipAddress) IsEmulated() bool { } } -func (self *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEipAddress) GetIpAddr() string { return self.IpAddress } diff --git a/pkg/multicloud/aliyun/elasticcache_instance.go b/pkg/multicloud/aliyun/elasticcache_instance.go index f49f614c75..22a3b87ff3 100644 --- a/pkg/multicloud/aliyun/elasticcache_instance.go +++ b/pkg/multicloud/aliyun/elasticcache_instance.go @@ -939,7 +939,18 @@ func (instance *SElasticcache) GetMetadata() *jsonutils.JSONDict { return data } -func (instance *SElasticcache) SetMetadata(tags map[string]string, replace bool) error { +func (instance *SElasticcache) GetTags() (map[string]string, error) { + tags, err := instance.region.ListResourceTags("kvs", "INSTANCE", []string{instance.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "instance.region.ListResourceTags") + } + if _, ok := tags[instance.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[instance.GetId()], nil +} + +func (instance *SElasticcache) SetTags(tags map[string]string, replace bool) error { return instance.region.SetResourceTags("kvs", "INSTANCE", []string{instance.GetId()}, tags, replace) } diff --git a/pkg/multicloud/aliyun/host.go b/pkg/multicloud/aliyun/host.go index 724a9d4bb3..c45b321472 100644 --- a/pkg/multicloud/aliyun/host.go +++ b/pkg/multicloud/aliyun/host.go @@ -31,10 +31,6 @@ type SHost struct { zone *SZone } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetIWires() ([]cloudprovider.ICloudWire, error) { return self.zone.GetIWires() } diff --git a/pkg/multicloud/aliyun/image.go b/pkg/multicloud/aliyun/image.go index b73fa85419..b31da1a41f 100644 --- a/pkg/multicloud/aliyun/image.go +++ b/pkg/multicloud/aliyun/image.go @@ -98,6 +98,15 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SImage) GetSysTags() map[string]string { + data := map[string]string{} + data["os_arch"] = self.Architecture + data["os_name"] = self.GetOsType() + data["os_distribution"] = self.Platform + data["os_version"] = self.OSName + return data +} + func (self *SImage) GetId() string { return self.ImageId } diff --git a/pkg/multicloud/aliyun/instance.go b/pkg/multicloud/aliyun/instance.go index 97a57aab64..beeeb4244c 100644 --- a/pkg/multicloud/aliyun/instance.go +++ b/pkg/multicloud/aliyun/instance.go @@ -250,6 +250,42 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + // The pricingInfo key structure is 'RegionId::InstanceType::NetworkType::OSType::IoOptimized' + optimized := "optimized" + if !self.IoOptimized { + optimized = "none" + } + priceKey := fmt.Sprintf("%s::%s::%s::%s::%s", self.RegionId, self.InstanceType, self.InstanceNetworkType, self.OSType, optimized) + data["price_key"] = priceKey + data["zone_ext_id"] = self.host.zone.GetGlobalId() + if len(self.ImageId) > 0 { + if image, err := self.host.zone.region.GetImage(self.ImageId); err != nil { + log.Errorf("Failed to find image %s for instance %s", self.ImageId, self.GetName()) + } else { + imageSysTags := image.GetSysTags() + for k, v := range imageSysTags { + data[k] = v + } + } + } + return data +} + +func (self *SInstance) GetTags() (map[string]string, error) { + tags, err := self.host.zone.region.fetchTags("instance", self.InstanceId) + if err != nil { + return nil, errors.Wrap(err, "self.host.zone.region.fetchTags") + } + data := map[string]string{} + err = tags.Unmarshal(&data) + if err != nil { + return nil, errors.Wrap(err, "tags.Unmarshal") + } + return data, nil +} + func (self *SInstance) GetIHost() cloudprovider.ICloudHost { return self.host } @@ -1087,7 +1123,7 @@ func (self *SInstance) SetAutoRenew(autoRenew bool) error { return self.host.zone.region.SetInstanceAutoRenew(self.InstanceId, autoRenew) } -func (self *SInstance) SetMetadata(tags map[string]string, replace bool) error { +func (self *SInstance) SetTags(tags map[string]string, replace bool) error { return self.host.zone.region.SetResourceTags("ecs", "instance", []string{self.InstanceId}, tags, replace) } diff --git a/pkg/multicloud/aliyun/loadbalancer.go b/pkg/multicloud/aliyun/loadbalancer.go index 1731de41b5..43c702cdb9 100644 --- a/pkg/multicloud/aliyun/loadbalancer.go +++ b/pkg/multicloud/aliyun/loadbalancer.go @@ -117,6 +117,17 @@ func (lb *SLoadbalancer) GetMetadata() *jsonutils.JSONDict { return data } +func (lb *SLoadbalancer) GetTags() (map[string]string, error) { + tags, err := lb.region.ListResourceTags("slb", "instance", []string{lb.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "lb.region.ListResourceTags") + } + if _, ok := tags[lb.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[lb.GetId()], nil +} + func (lb *SLoadbalancer) GetAddress() string { return lb.Address } @@ -412,7 +423,7 @@ func (lb *SLoadbalancer) GetProjectId() string { return lb.ResourceGroupId } -func (lb *SLoadbalancer) SetMetadata(tags map[string]string, replace bool) error { +func (lb *SLoadbalancer) SetTags(tags map[string]string, replace bool) error { return lb.region.SetResourceTags("slb", "instance", []string{lb.LoadBalancerId}, tags, replace) } diff --git a/pkg/multicloud/aliyun/loadbalanceracl.go b/pkg/multicloud/aliyun/loadbalanceracl.go index de5d5a2051..58b80347fa 100644 --- a/pkg/multicloud/aliyun/loadbalanceracl.go +++ b/pkg/multicloud/aliyun/loadbalanceracl.go @@ -19,6 +19,7 @@ import ( "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type AclEntrys struct { @@ -31,6 +32,7 @@ type AclEntry struct { } type SLoadbalancerAcl struct { + multicloud.SResourceBase region *SRegion AclId string @@ -59,10 +61,6 @@ func (acl *SLoadbalancerAcl) GetStatus() string { return "" } -func (acl *SLoadbalancerAcl) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (acl *SLoadbalancerAcl) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerbackend.go b/pkg/multicloud/aliyun/loadbalancerbackend.go index 7ba22a0e34..81dba2875c 100644 --- a/pkg/multicloud/aliyun/loadbalancerbackend.go +++ b/pkg/multicloud/aliyun/loadbalancerbackend.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerBackend struct { + multicloud.SResourceBase lbbg *SLoadbalancerBackendGroup ServerId string @@ -48,10 +50,6 @@ func (backend *SLoadbalancerBackend) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backend *SLoadbalancerBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backend *SLoadbalancerBackend) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerbackendgroup.go b/pkg/multicloud/aliyun/loadbalancerbackendgroup.go index 4755647689..d8e73e9764 100644 --- a/pkg/multicloud/aliyun/loadbalancerbackendgroup.go +++ b/pkg/multicloud/aliyun/loadbalancerbackendgroup.go @@ -22,6 +22,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type Rule struct { @@ -50,6 +51,7 @@ type AssociatedObjects struct { } type SLoadbalancerBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer VServerGroupId string @@ -105,10 +107,6 @@ func (backendgroup *SLoadbalancerBackendGroup) GetType() string { return api.LB_BACKENDGROUP_TYPE_NORMAL } -func (backendgroup *SLoadbalancerBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backendgroup *SLoadbalancerBackendGroup) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerdefaultbackend.go b/pkg/multicloud/aliyun/loadbalancerdefaultbackend.go index 02eef55e45..d9a9d50b38 100644 --- a/pkg/multicloud/aliyun/loadbalancerdefaultbackend.go +++ b/pkg/multicloud/aliyun/loadbalancerdefaultbackend.go @@ -21,9 +21,11 @@ import ( "yunion.io/x/jsonutils" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerDefaultBackend struct { + multicloud.SResourceBase lbbg *SLoadbalancerDefaultBackendGroup ServerId string @@ -46,10 +48,6 @@ func (backend *SLoadbalancerDefaultBackend) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backend *SLoadbalancerDefaultBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backend *SLoadbalancerDefaultBackend) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerdefaultbackendgroup.go b/pkg/multicloud/aliyun/loadbalancerdefaultbackendgroup.go index 11a12b89e2..4965dfa0fa 100644 --- a/pkg/multicloud/aliyun/loadbalancerdefaultbackendgroup.go +++ b/pkg/multicloud/aliyun/loadbalancerdefaultbackendgroup.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerDefaultBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer } @@ -76,10 +78,6 @@ func (backendgroup *SLoadbalancerDefaultBackendGroup) GetType() string { return api.LB_BACKENDGROUP_TYPE_DEFAULT } -func (backendgroup *SLoadbalancerDefaultBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backendgroup *SLoadbalancerDefaultBackendGroup) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerhttplistener.go b/pkg/multicloud/aliyun/loadbalancerhttplistener.go index e57398988b..1fdc2c2edc 100644 --- a/pkg/multicloud/aliyun/loadbalancerhttplistener.go +++ b/pkg/multicloud/aliyun/loadbalancerhttplistener.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerHTTPListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -102,10 +104,6 @@ func (listerner *SLoadbalancerHTTPListener) GetStatus() string { } } -func (listerner *SLoadbalancerHTTPListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerHTTPListener) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerhttpslistener.go b/pkg/multicloud/aliyun/loadbalancerhttpslistener.go index ec8e1c6f90..874671edeb 100644 --- a/pkg/multicloud/aliyun/loadbalancerhttpslistener.go +++ b/pkg/multicloud/aliyun/loadbalancerhttpslistener.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerHTTPSListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -97,10 +99,6 @@ func (listerner *SLoadbalancerHTTPSListener) GetStatus() string { } } -func (listerner *SLoadbalancerHTTPSListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerHTTPSListener) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerlistenerrule.go b/pkg/multicloud/aliyun/loadbalancerlistenerrule.go index f113c6c515..24552b76e3 100644 --- a/pkg/multicloud/aliyun/loadbalancerlistenerrule.go +++ b/pkg/multicloud/aliyun/loadbalancerlistenerrule.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerListenerRule struct { + multicloud.SResourceBase httpListener *SLoadbalancerHTTPListener httpsListener *SLoadbalancerHTTPSListener @@ -52,10 +54,6 @@ func (lbr *SLoadbalancerListenerRule) GetStatus() string { return api.LB_STATUS_ENABLED } -func (lbr *SLoadbalancerListenerRule) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLoadbalancerListenerRule) IsDefault() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancermasterslavebackend.go b/pkg/multicloud/aliyun/loadbalancermasterslavebackend.go index f32c3d807d..5c98f46ddb 100644 --- a/pkg/multicloud/aliyun/loadbalancermasterslavebackend.go +++ b/pkg/multicloud/aliyun/loadbalancermasterslavebackend.go @@ -19,13 +19,13 @@ import ( "fmt" "strings" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerMasterSlaveBackend struct { + multicloud.SResourceBase lbbg *SLoadbalancerMasterSlaveBackendGroup ServerId string @@ -50,10 +50,6 @@ func (backend *SLoadbalancerMasterSlaveBackend) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backend *SLoadbalancerMasterSlaveBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backend *SLoadbalancerMasterSlaveBackend) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancermasterslavebackendgroup.go b/pkg/multicloud/aliyun/loadbalancermasterslavebackendgroup.go index b52ce993ac..6c5d296627 100644 --- a/pkg/multicloud/aliyun/loadbalancermasterslavebackendgroup.go +++ b/pkg/multicloud/aliyun/loadbalancermasterslavebackendgroup.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerMasterSlaveBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer MasterSlaveServerGroupId string @@ -67,10 +69,6 @@ func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancerservercertificate.go b/pkg/multicloud/aliyun/loadbalancerservercertificate.go index a2b08c63f8..bfa7d7726f 100644 --- a/pkg/multicloud/aliyun/loadbalancerservercertificate.go +++ b/pkg/multicloud/aliyun/loadbalancerservercertificate.go @@ -19,7 +19,7 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/multicloud" ) type SubjectAlternativeNames struct { @@ -27,6 +27,7 @@ type SubjectAlternativeNames struct { } type SLoadbalancerServerCertificate struct { + multicloud.SResourceBase region *SRegion ServerCertificateId string // 服务器证书ID。 @@ -69,10 +70,6 @@ func (certificate *SLoadbalancerServerCertificate) GetStatus() string { return "" } -func (certificate *SLoadbalancerServerCertificate) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (certificate *SLoadbalancerServerCertificate) IsEmulated() bool { return false } diff --git a/pkg/multicloud/aliyun/loadbalancertcplistener.go b/pkg/multicloud/aliyun/loadbalancertcplistener.go index 05124b02c7..d0e60e30a9 100644 --- a/pkg/multicloud/aliyun/loadbalancertcplistener.go +++ b/pkg/multicloud/aliyun/loadbalancertcplistener.go @@ -23,9 +23,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerTCPListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -82,10 +84,6 @@ func (listerner *SLoadbalancerTCPListener) GetStatus() string { } } -func (listerner *SLoadbalancerTCPListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerTCPListener) GetEgressMbps() int { if listerner.Bandwidth < 1 { return 0 diff --git a/pkg/multicloud/aliyun/loadbalancerudplistener.go b/pkg/multicloud/aliyun/loadbalancerudplistener.go index f4f2479fdd..3f254f4e8e 100644 --- a/pkg/multicloud/aliyun/loadbalancerudplistener.go +++ b/pkg/multicloud/aliyun/loadbalancerudplistener.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerUDPListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -82,10 +84,6 @@ func (listerner *SLoadbalancerUDPListener) GetStatus() string { } } -func (listerner *SLoadbalancerUDPListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerUDPListener) GetEgressMbps() int { if listerner.Bandwidth < 1 { return 0 diff --git a/pkg/multicloud/aliyun/region.go b/pkg/multicloud/aliyun/region.go index 1434be3e05..f5fe48a530 100644 --- a/pkg/multicloud/aliyun/region.go +++ b/pkg/multicloud/aliyun/region.go @@ -69,10 +69,6 @@ func (self *SRegion) GetClient() *SAliyunClient { return self.client } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) getSdkClient() (*sdk.Client, error) { if self.sdkClient == nil { cli, err := self.client.getSdkClient(self.RegionId) diff --git a/pkg/multicloud/aliyun/routetable.go b/pkg/multicloud/aliyun/routetable.go index 76da554d4a..71c8f950d5 100644 --- a/pkg/multicloud/aliyun/routetable.go +++ b/pkg/multicloud/aliyun/routetable.go @@ -19,11 +19,11 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/log" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // {"CreationTime":"2017-03-19T13:37:40Z","RouteEntrys":{"RouteEntry":[{"DestinationCidrBlock":"172.31.32.0/20","InstanceId":"","NextHopType":"local","NextHops":{"NextHop":[]},"RouteTableId":"vtb-j6c60lectdi80rk5xz43g","Status":"Available","Type":"System"},{"DestinationCidrBlock":"100.64.0.0/10","InstanceId":"","NextHopType":"service","NextHops":{"NextHop":[]},"RouteTableId":"vtb-j6c60lectdi80rk5xz43g","Status":"Available","Type":"System"}]},"RouteTableId":"vtb-j6c60lectdi80rk5xz43g","RouteTableType":"System","VRouterId":"vrt-j6c00qrol733dg36iq4qj"} @@ -33,6 +33,7 @@ type SNextHops struct { } type SRouteEntry struct { + multicloud.SResourceBase routeTable *SRouteTable RouteTableId string @@ -69,10 +70,6 @@ func (route *SRouteEntry) IsEmulated() bool { return false } -func (route *SRouteEntry) GetMetadata() *jsonutils.JSONDict { - return nil -} - // Custom:自定义路由。 System:系统路由。 func (route *SRouteEntry) GetType() string { return route.Type @@ -116,6 +113,7 @@ type SRouteEntrys struct { } type SRouteTable struct { + multicloud.SResourceBase region *SRegion vpc *SVpc routes []cloudprovider.ICloudRoute @@ -163,10 +161,6 @@ func (self *SRouteTable) GetName() string { return self.RouteTableName } -func (self *SRouteTable) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteTable) GetRegionId() string { return self.region.RegionId } diff --git a/pkg/multicloud/aliyun/securitygroup.go b/pkg/multicloud/aliyun/securitygroup.go index 1cef6d894b..b76a239e80 100644 --- a/pkg/multicloud/aliyun/securitygroup.go +++ b/pkg/multicloud/aliyun/securitygroup.go @@ -101,6 +101,17 @@ func (self *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SSecurityGroup) GetTags() (map[string]string, error) { + if len(self.Tags.Tag) == 0 { + return nil, nil + } + tags := map[string]string{} + for _, value := range self.Tags.Tag { + tags[value.TagKey] = value.TagValue + } + return tags, nil +} + func (self *SSecurityGroup) GetId() string { return self.SecurityGroupId } diff --git a/pkg/multicloud/aliyun/snapshot.go b/pkg/multicloud/aliyun/snapshot.go index da7844785a..0febf52eb0 100644 --- a/pkg/multicloud/aliyun/snapshot.go +++ b/pkg/multicloud/aliyun/snapshot.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SnapshotStatusType string @@ -38,6 +39,7 @@ const ( ) type SSnapshot struct { + multicloud.SResourceBase region *SRegion Progress string @@ -136,10 +138,6 @@ func (self *SSnapshot) Delete() error { return self.region.DeleteSnapshot(self.SnapshotId) } -func (self *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetSnapshots(instanceId string, diskId string, snapshotName string, snapshotIds []string, offset int, limit int) ([]SSnapshot, int, error) { if limit > 50 || limit <= 0 { limit = 50 diff --git a/pkg/multicloud/aliyun/snapshot_policy.go b/pkg/multicloud/aliyun/snapshot_policy.go index 5c369aecac..71c25b807f 100644 --- a/pkg/multicloud/aliyun/snapshot_policy.go +++ b/pkg/multicloud/aliyun/snapshot_policy.go @@ -23,6 +23,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SSnapshotPolicyType string @@ -34,6 +35,7 @@ const ( ) type SSnapshotPolicy struct { + multicloud.SResourceBase region *SRegion AutoSnapshotPolicyName string @@ -78,10 +80,6 @@ func (self *SSnapshotPolicy) IsEmulated() bool { return false } -func (self *SSnapshotPolicy) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshotPolicy) GetGlobalId() string { return self.AutoSnapshotPolicyId } diff --git a/pkg/multicloud/aliyun/storage.go b/pkg/multicloud/aliyun/storage.go index cbc589d292..5c88d38128 100644 --- a/pkg/multicloud/aliyun/storage.go +++ b/pkg/multicloud/aliyun/storage.go @@ -37,17 +37,15 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStorage struct { + multicloud.SResourceBase zone *SZone storageType string } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetId() string { return fmt.Sprintf("%s-%s-%s", self.zone.region.client.cpcfg.Id, self.zone.GetId(), self.storageType) } diff --git a/pkg/multicloud/aliyun/storagecache.go b/pkg/multicloud/aliyun/storagecache.go index 09e1848778..8a6065ffb3 100644 --- a/pkg/multicloud/aliyun/storagecache.go +++ b/pkg/multicloud/aliyun/storagecache.go @@ -33,17 +33,15 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetId() string { return fmt.Sprintf("%s-%s", self.region.client.cpcfg.Id, self.region.GetId()) } diff --git a/pkg/multicloud/aliyun/vpc.go b/pkg/multicloud/aliyun/vpc.go index 23f1e8bd83..97f456047a 100644 --- a/pkg/multicloud/aliyun/vpc.go +++ b/pkg/multicloud/aliyun/vpc.go @@ -64,10 +64,6 @@ type SVpc struct { VpcName string } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetId() string { return self.VpcId } diff --git a/pkg/multicloud/aliyun/vswitch.go b/pkg/multicloud/aliyun/vswitch.go index 877066dd56..cc11caa1a5 100644 --- a/pkg/multicloud/aliyun/vswitch.go +++ b/pkg/multicloud/aliyun/vswitch.go @@ -26,6 +26,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -41,6 +42,7 @@ type SCloudResources struct { } type SVSwitch struct { + multicloud.SResourceBase wire *SWire AvailableIpAddressCount int @@ -61,10 +63,6 @@ type SVSwitch struct { RouteTable SRouteTable } -func (self *SVSwitch) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVSwitch) GetId() string { return self.VSwitchId } diff --git a/pkg/multicloud/aliyun/wire.go b/pkg/multicloud/aliyun/wire.go index d775ee103a..ee8ec7d189 100644 --- a/pkg/multicloud/aliyun/wire.go +++ b/pkg/multicloud/aliyun/wire.go @@ -17,23 +17,20 @@ package aliyun import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase zone *SZone vpc *SVpc inetworks []cloudprovider.ICloudNetwork } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SWire) GetId() string { return fmt.Sprintf("%s-%s", self.vpc.GetId(), self.zone.GetId()) } diff --git a/pkg/multicloud/aliyun/zone.go b/pkg/multicloud/aliyun/zone.go index 43a1b039bf..05e460a35a 100644 --- a/pkg/multicloud/aliyun/zone.go +++ b/pkg/multicloud/aliyun/zone.go @@ -18,13 +18,13 @@ import ( "fmt" "strings" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type TChargeType string @@ -108,6 +108,7 @@ type SDedicatedHostTypes struct { } type SZone struct { + multicloud.SResourceBase region *SRegion iwires []cloudprovider.ICloudWire @@ -131,10 +132,6 @@ type SZone struct { AvailableDedicatedHostTypes SDedicatedHostTypes } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetId() string { return self.ZoneId } diff --git a/pkg/multicloud/apsara/dbinstance.go b/pkg/multicloud/apsara/dbinstance.go index fb5640bf82..2dde8a5f0e 100644 --- a/pkg/multicloud/apsara/dbinstance.go +++ b/pkg/multicloud/apsara/dbinstance.go @@ -792,6 +792,17 @@ func (rds *SDBInstance) GetMetadata() *jsonutils.JSONDict { return data } -func (rds *SDBInstance) SetMetadata(tags map[string]string, replace bool) error { +func (rds *SDBInstance) GetTags() (map[string]string, error) { + tags, err := rds.region.ListResourceTags("rds", "INSTANCE", []string{rds.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "rds.region.ListResourceTags") + } + if _, ok := tags[rds.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[rds.GetId()], nil +} + +func (rds *SDBInstance) SetTags(tags map[string]string, replace bool) error { return rds.region.SetResourceTags("rds", "INSTANCE", []string{rds.GetId()}, tags, replace) } diff --git a/pkg/multicloud/apsara/disk.go b/pkg/multicloud/apsara/disk.go index 504b24a3b3..61dea2fae7 100644 --- a/pkg/multicloud/apsara/disk.go +++ b/pkg/multicloud/apsara/disk.go @@ -38,6 +38,7 @@ type STags struct { } type SDisk struct { + multicloud.SResourceBase storage *SStorage multicloud.SDisk @@ -86,6 +87,16 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + // The pricingInfo key structure is 'RegionId::DiskCategory::DiskType + priceKey := fmt.Sprintf("%s::%s::%s", self.RegionId, self.Category, self.Type) + data["price_key"] = priceKey + data["hypervisor"] = api.HYPERVISOR_APSARA + + return data +} + func (self *SRegion) GetDisks(instanceId string, zoneId string, category string, diskIds []string, offset int, limit int) ([]SDisk, int, error) { if limit > 50 || limit <= 0 { limit = 50 diff --git a/pkg/multicloud/apsara/eip.go b/pkg/multicloud/apsara/eip.go index e0e7ac2cc0..4df36e9958 100644 --- a/pkg/multicloud/apsara/eip.go +++ b/pkg/multicloud/apsara/eip.go @@ -137,10 +137,6 @@ func (self *SEipAddress) IsEmulated() bool { } } -func (self *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEipAddress) GetIpAddr() string { return self.IpAddress } diff --git a/pkg/multicloud/apsara/elasticcache_instance.go b/pkg/multicloud/apsara/elasticcache_instance.go index a953257e23..a92752ab84 100644 --- a/pkg/multicloud/apsara/elasticcache_instance.go +++ b/pkg/multicloud/apsara/elasticcache_instance.go @@ -937,7 +937,18 @@ func (instance *SElasticcache) GetMetadata() *jsonutils.JSONDict { return data } -func (instance *SElasticcache) SetMetadata(tags map[string]string, replace bool) error { +func (instance *SElasticcache) GetTags() (map[string]string, error) { + tags, err := instance.region.ListResourceTags("kvs", "INSTANCE", []string{instance.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "instance.region.ListResourceTags") + } + if _, ok := tags[instance.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[instance.GetId()], nil +} + +func (instance *SElasticcache) SetTags(tags map[string]string, replace bool) error { return instance.region.SetResourceTags(APSARA_PRODUCT_KVSTORE, "INSTANCE", []string{instance.GetId()}, tags, replace) } diff --git a/pkg/multicloud/apsara/host.go b/pkg/multicloud/apsara/host.go index 8bf219c3dd..512cc04fff 100644 --- a/pkg/multicloud/apsara/host.go +++ b/pkg/multicloud/apsara/host.go @@ -31,10 +31,6 @@ type SHost struct { zone *SZone } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetIWires() ([]cloudprovider.ICloudWire, error) { return self.zone.GetIWires() } diff --git a/pkg/multicloud/apsara/image.go b/pkg/multicloud/apsara/image.go index bce9327e03..e211f9b558 100644 --- a/pkg/multicloud/apsara/image.go +++ b/pkg/multicloud/apsara/image.go @@ -98,6 +98,15 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SImage) GetSysTags() map[string]string { + data := map[string]string{} + data["os_arch"] = self.Architecture + data["os_name"] = self.GetOsType() + data["os_distribution"] = self.Platform + data["os_version"] = self.OSName + return data +} + func (self *SImage) GetId() string { return self.ImageId } diff --git a/pkg/multicloud/apsara/instance.go b/pkg/multicloud/apsara/instance.go index aa6b7b9fb7..fd6301545f 100644 --- a/pkg/multicloud/apsara/instance.go +++ b/pkg/multicloud/apsara/instance.go @@ -250,6 +250,42 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + // The pricingInfo key structure is 'RegionId::InstanceType::NetworkType::OSType::IoOptimized' + optimized := "optimized" + if !self.IoOptimized { + optimized = "none" + } + priceKey := fmt.Sprintf("%s::%s::%s::%s::%s", self.RegionId, self.InstanceType, self.InstanceNetworkType, self.OSType, optimized) + data["price_key"] = priceKey + data["zone_ext_id"] = self.host.zone.GetGlobalId() + if len(self.ImageId) > 0 { + if image, err := self.host.zone.region.GetImage(self.ImageId); err != nil { + log.Errorf("Failed to find image %s for instance %s", self.ImageId, self.GetName()) + } else { + imageSysTags := image.GetSysTags() + for k, v := range imageSysTags { + data[k] = v + } + } + } + return data +} + +func (self *SInstance) GetTags() (map[string]string, error) { + tags, err := self.host.zone.region.fetchTags("instance", self.InstanceId) + if err != nil { + return nil, errors.Wrap(err, "self.host.zone.region.fetchTags") + } + data := map[string]string{} + err = tags.Unmarshal(&data) + if err != nil { + return nil, errors.Wrap(err, "tags.Unmarshal") + } + return data, nil +} + func (self *SInstance) GetIHost() cloudprovider.ICloudHost { return self.host } @@ -1084,6 +1120,6 @@ func (self *SInstance) SetAutoRenew(autoRenew bool) error { return self.host.zone.region.SetInstanceAutoRenew(self.InstanceId, autoRenew) } -func (self *SInstance) SetMetadata(tags map[string]string, replace bool) error { +func (self *SInstance) SetTags(tags map[string]string, replace bool) error { return self.host.zone.region.SetResourceTags("ecs", "instance", []string{self.InstanceId}, tags, replace) } diff --git a/pkg/multicloud/apsara/loadbalancer.go b/pkg/multicloud/apsara/loadbalancer.go index 5ac7c806c6..3d7fc6bbee 100644 --- a/pkg/multicloud/apsara/loadbalancer.go +++ b/pkg/multicloud/apsara/loadbalancer.go @@ -116,6 +116,17 @@ func (lb *SLoadbalancer) GetMetadata() *jsonutils.JSONDict { return data } +func (lb *SLoadbalancer) GetTags() (map[string]string, error) { + tags, err := lb.region.ListResourceTags("slb", "instance", []string{lb.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "lb.region.ListResourceTags") + } + if _, ok := tags[lb.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[lb.GetId()], nil +} + func (lb *SLoadbalancer) GetAddress() string { return lb.Address } @@ -411,6 +422,6 @@ func (lb *SLoadbalancer) GetProjectId() string { return lb.ResourceGroupId } -func (lb *SLoadbalancer) SetMetadata(tags map[string]string, replace bool) error { +func (lb *SLoadbalancer) SetTags(tags map[string]string, replace bool) error { return lb.region.SetResourceTags("slb", "instance", []string{lb.LoadBalancerId}, tags, replace) } diff --git a/pkg/multicloud/apsara/loadbalanceracl.go b/pkg/multicloud/apsara/loadbalanceracl.go index 271686a89a..fdaa6a4911 100644 --- a/pkg/multicloud/apsara/loadbalanceracl.go +++ b/pkg/multicloud/apsara/loadbalanceracl.go @@ -19,6 +19,7 @@ import ( "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type AclEntrys struct { @@ -31,6 +32,7 @@ type AclEntry struct { } type SLoadbalancerAcl struct { + multicloud.SResourceBase region *SRegion AclId string @@ -59,10 +61,6 @@ func (acl *SLoadbalancerAcl) GetStatus() string { return "" } -func (acl *SLoadbalancerAcl) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (acl *SLoadbalancerAcl) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerbackend.go b/pkg/multicloud/apsara/loadbalancerbackend.go index 1d6f76b902..73183924d1 100644 --- a/pkg/multicloud/apsara/loadbalancerbackend.go +++ b/pkg/multicloud/apsara/loadbalancerbackend.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerBackend struct { + multicloud.SResourceBase lbbg *SLoadbalancerBackendGroup ServerId string @@ -48,10 +50,6 @@ func (backend *SLoadbalancerBackend) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backend *SLoadbalancerBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backend *SLoadbalancerBackend) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerbackendgroup.go b/pkg/multicloud/apsara/loadbalancerbackendgroup.go index 1aefd7a719..1a1478c067 100644 --- a/pkg/multicloud/apsara/loadbalancerbackendgroup.go +++ b/pkg/multicloud/apsara/loadbalancerbackendgroup.go @@ -22,6 +22,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type Rule struct { @@ -50,6 +51,7 @@ type AssociatedObjects struct { } type SLoadbalancerBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer VServerGroupId string @@ -105,10 +107,6 @@ func (backendgroup *SLoadbalancerBackendGroup) GetType() string { return api.LB_BACKENDGROUP_TYPE_NORMAL } -func (backendgroup *SLoadbalancerBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backendgroup *SLoadbalancerBackendGroup) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerdefaultbackend.go b/pkg/multicloud/apsara/loadbalancerdefaultbackend.go index fc9947ccf7..8ffc00dd3a 100644 --- a/pkg/multicloud/apsara/loadbalancerdefaultbackend.go +++ b/pkg/multicloud/apsara/loadbalancerdefaultbackend.go @@ -21,9 +21,11 @@ import ( "yunion.io/x/jsonutils" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerDefaultBackend struct { + multicloud.SResourceBase lbbg *SLoadbalancerDefaultBackendGroup ServerId string @@ -46,10 +48,6 @@ func (backend *SLoadbalancerDefaultBackend) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backend *SLoadbalancerDefaultBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backend *SLoadbalancerDefaultBackend) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerdefaultbackendgroup.go b/pkg/multicloud/apsara/loadbalancerdefaultbackendgroup.go index 56a3c20ff8..664eb0d6eb 100644 --- a/pkg/multicloud/apsara/loadbalancerdefaultbackendgroup.go +++ b/pkg/multicloud/apsara/loadbalancerdefaultbackendgroup.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerDefaultBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer } @@ -76,10 +78,6 @@ func (backendgroup *SLoadbalancerDefaultBackendGroup) GetType() string { return api.LB_BACKENDGROUP_TYPE_DEFAULT } -func (backendgroup *SLoadbalancerDefaultBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backendgroup *SLoadbalancerDefaultBackendGroup) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerhttplistener.go b/pkg/multicloud/apsara/loadbalancerhttplistener.go index 38251b4027..2546bed462 100644 --- a/pkg/multicloud/apsara/loadbalancerhttplistener.go +++ b/pkg/multicloud/apsara/loadbalancerhttplistener.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerHTTPListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -102,10 +104,6 @@ func (listerner *SLoadbalancerHTTPListener) GetStatus() string { } } -func (listerner *SLoadbalancerHTTPListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerHTTPListener) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerhttpslistener.go b/pkg/multicloud/apsara/loadbalancerhttpslistener.go index 7958036ba7..2258283569 100644 --- a/pkg/multicloud/apsara/loadbalancerhttpslistener.go +++ b/pkg/multicloud/apsara/loadbalancerhttpslistener.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerHTTPSListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -97,10 +99,6 @@ func (listerner *SLoadbalancerHTTPSListener) GetStatus() string { } } -func (listerner *SLoadbalancerHTTPSListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerHTTPSListener) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerlistenerrule.go b/pkg/multicloud/apsara/loadbalancerlistenerrule.go index ce304ce2eb..a7ad38886e 100644 --- a/pkg/multicloud/apsara/loadbalancerlistenerrule.go +++ b/pkg/multicloud/apsara/loadbalancerlistenerrule.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerListenerRule struct { + multicloud.SResourceBase httpListener *SLoadbalancerHTTPListener httpsListener *SLoadbalancerHTTPSListener @@ -52,10 +54,6 @@ func (lbr *SLoadbalancerListenerRule) GetStatus() string { return api.LB_STATUS_ENABLED } -func (lbr *SLoadbalancerListenerRule) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLoadbalancerListenerRule) IsDefault() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancermasterslavebackend.go b/pkg/multicloud/apsara/loadbalancermasterslavebackend.go index bfa3f20455..d1c61cc755 100644 --- a/pkg/multicloud/apsara/loadbalancermasterslavebackend.go +++ b/pkg/multicloud/apsara/loadbalancermasterslavebackend.go @@ -19,13 +19,13 @@ import ( "fmt" "strings" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerMasterSlaveBackend struct { + multicloud.SResourceBase lbbg *SLoadbalancerMasterSlaveBackendGroup ServerId string @@ -50,10 +50,6 @@ func (backend *SLoadbalancerMasterSlaveBackend) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backend *SLoadbalancerMasterSlaveBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backend *SLoadbalancerMasterSlaveBackend) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancermasterslavebackendgroup.go b/pkg/multicloud/apsara/loadbalancermasterslavebackendgroup.go index 0bc41452ab..c87b6c1dca 100644 --- a/pkg/multicloud/apsara/loadbalancermasterslavebackendgroup.go +++ b/pkg/multicloud/apsara/loadbalancermasterslavebackendgroup.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerMasterSlaveBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer MasterSlaveServerGroupId string @@ -67,10 +69,6 @@ func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetStatus() string { return api.LB_STATUS_ENABLED } -func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancerservercertificate.go b/pkg/multicloud/apsara/loadbalancerservercertificate.go index 09526e5f57..c2851e15e3 100644 --- a/pkg/multicloud/apsara/loadbalancerservercertificate.go +++ b/pkg/multicloud/apsara/loadbalancerservercertificate.go @@ -19,7 +19,7 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/multicloud" ) type SubjectAlternativeNames struct { @@ -27,6 +27,7 @@ type SubjectAlternativeNames struct { } type SLoadbalancerServerCertificate struct { + multicloud.SResourceBase region *SRegion ServerCertificateId string // 服务器证书ID。 @@ -69,10 +70,6 @@ func (certificate *SLoadbalancerServerCertificate) GetStatus() string { return "" } -func (certificate *SLoadbalancerServerCertificate) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (certificate *SLoadbalancerServerCertificate) IsEmulated() bool { return false } diff --git a/pkg/multicloud/apsara/loadbalancertcplistener.go b/pkg/multicloud/apsara/loadbalancertcplistener.go index c89c115593..cce5617974 100644 --- a/pkg/multicloud/apsara/loadbalancertcplistener.go +++ b/pkg/multicloud/apsara/loadbalancertcplistener.go @@ -23,9 +23,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerTCPListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -82,10 +84,6 @@ func (listerner *SLoadbalancerTCPListener) GetStatus() string { } } -func (listerner *SLoadbalancerTCPListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerTCPListener) GetEgressMbps() int { if listerner.Bandwidth < 1 { return 0 diff --git a/pkg/multicloud/apsara/loadbalancerudplistener.go b/pkg/multicloud/apsara/loadbalancerudplistener.go index bb62f5f15b..6ed474ce8b 100644 --- a/pkg/multicloud/apsara/loadbalancerudplistener.go +++ b/pkg/multicloud/apsara/loadbalancerudplistener.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerUDPListener struct { + multicloud.SResourceBase lb *SLoadbalancer ListenerPort int // 负载均衡实例前端使用的端口。 @@ -82,10 +84,6 @@ func (listerner *SLoadbalancerUDPListener) GetStatus() string { } } -func (listerner *SLoadbalancerUDPListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listerner *SLoadbalancerUDPListener) GetEgressMbps() int { if listerner.Bandwidth < 1 { return 0 diff --git a/pkg/multicloud/apsara/region.go b/pkg/multicloud/apsara/region.go index f2d6b210ab..c7cf6c2305 100644 --- a/pkg/multicloud/apsara/region.go +++ b/pkg/multicloud/apsara/region.go @@ -68,10 +68,6 @@ func (self *SRegion) GetClient() *SApsaraClient { return self.client } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) getSdkClient() (*sdk.Client, error) { if self.sdkClient == nil { cli, err := sdk.NewClientWithAccessKey(self.RegionId, self.client.accessKey, self.client.accessSecret) diff --git a/pkg/multicloud/apsara/routetable.go b/pkg/multicloud/apsara/routetable.go index 7df58d3e5d..1bed093bf8 100644 --- a/pkg/multicloud/apsara/routetable.go +++ b/pkg/multicloud/apsara/routetable.go @@ -19,10 +19,10 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // {"CreationTime":"2017-03-19T13:37:40Z","RouteEntrys":{"RouteEntry":[{"DestinationCidrBlock":"172.31.32.0/20","InstanceId":"","NextHopType":"local","NextHops":{"NextHop":[]},"RouteTableId":"vtb-j6c60lectdi80rk5xz43g","Status":"Available","Type":"System"},{"DestinationCidrBlock":"100.64.0.0/10","InstanceId":"","NextHopType":"service","NextHops":{"NextHop":[]},"RouteTableId":"vtb-j6c60lectdi80rk5xz43g","Status":"Available","Type":"System"}]},"RouteTableId":"vtb-j6c60lectdi80rk5xz43g","RouteTableType":"System","VRouterId":"vrt-j6c00qrol733dg36iq4qj"} @@ -32,6 +32,7 @@ type SNextHops struct { } type SRouteEntry struct { + multicloud.SResourceBase routeTable *SRouteTable RouteTableId string @@ -68,10 +69,6 @@ func (route *SRouteEntry) IsEmulated() bool { return false } -func (route *SRouteEntry) GetMetadata() *jsonutils.JSONDict { - return nil -} - // Custom:自定义路由。 System:系统路由。 func (route *SRouteEntry) GetType() string { return route.Type @@ -94,6 +91,7 @@ type SRouteEntrys struct { } type SRouteTable struct { + multicloud.SResourceBase region *SRegion vpc *SVpc routes []cloudprovider.ICloudRoute @@ -141,10 +139,6 @@ func (self *SRouteTable) GetName() string { return self.RouteTableName } -func (self *SRouteTable) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteTable) GetRegionId() string { return self.region.RegionId } diff --git a/pkg/multicloud/apsara/securitygroup.go b/pkg/multicloud/apsara/securitygroup.go index 0c31fd0417..82472ae42f 100644 --- a/pkg/multicloud/apsara/securitygroup.go +++ b/pkg/multicloud/apsara/securitygroup.go @@ -101,6 +101,17 @@ func (self *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SSecurityGroup) GetTags() (map[string]string, error) { + if len(self.Tags.Tag) == 0 { + return nil, nil + } + tags := map[string]string{} + for _, value := range self.Tags.Tag { + tags[value.TagKey] = value.TagValue + } + return tags, nil +} + func (self *SSecurityGroup) GetId() string { return self.SecurityGroupId } diff --git a/pkg/multicloud/apsara/snapshot.go b/pkg/multicloud/apsara/snapshot.go index 8e5124d4ef..2765bf3bd9 100644 --- a/pkg/multicloud/apsara/snapshot.go +++ b/pkg/multicloud/apsara/snapshot.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SnapshotStatusType string @@ -38,6 +39,7 @@ const ( ) type SSnapshot struct { + multicloud.SResourceBase region *SRegion Progress string @@ -136,10 +138,6 @@ func (self *SSnapshot) Delete() error { return self.region.DeleteSnapshot(self.SnapshotId) } -func (self *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetSnapshots(instanceId string, diskId string, snapshotName string, snapshotIds []string, offset int, limit int) ([]SSnapshot, int, error) { if limit > 50 || limit <= 0 { limit = 50 diff --git a/pkg/multicloud/apsara/snapshot_policy.go b/pkg/multicloud/apsara/snapshot_policy.go index f819db33e4..6960d46842 100644 --- a/pkg/multicloud/apsara/snapshot_policy.go +++ b/pkg/multicloud/apsara/snapshot_policy.go @@ -23,6 +23,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SSnapshotPolicyType string @@ -34,6 +35,7 @@ const ( ) type SSnapshotPolicy struct { + multicloud.SResourceBase region *SRegion AutoSnapshotPolicyName string @@ -78,10 +80,6 @@ func (self *SSnapshotPolicy) IsEmulated() bool { return false } -func (self *SSnapshotPolicy) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshotPolicy) GetGlobalId() string { return self.AutoSnapshotPolicyId } diff --git a/pkg/multicloud/apsara/storage.go b/pkg/multicloud/apsara/storage.go index 4310c2781d..1735d599dc 100644 --- a/pkg/multicloud/apsara/storage.go +++ b/pkg/multicloud/apsara/storage.go @@ -37,17 +37,15 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStorage struct { + multicloud.SResourceBase zone *SZone storageType string } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetId() string { return fmt.Sprintf("%s-%s-%s", self.zone.region.client.cpcfg.Id, self.zone.GetId(), self.storageType) } diff --git a/pkg/multicloud/apsara/storagecache.go b/pkg/multicloud/apsara/storagecache.go index eae8c91c09..72e74fa864 100644 --- a/pkg/multicloud/apsara/storagecache.go +++ b/pkg/multicloud/apsara/storagecache.go @@ -33,19 +33,17 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion iimages []cloudprovider.ICloudImage } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetId() string { return fmt.Sprintf("%s-%s", self.region.client.cpcfg.Id, self.region.GetId()) } diff --git a/pkg/multicloud/apsara/vpc.go b/pkg/multicloud/apsara/vpc.go index 949ad76444..e5c30aedcc 100644 --- a/pkg/multicloud/apsara/vpc.go +++ b/pkg/multicloud/apsara/vpc.go @@ -63,10 +63,6 @@ type SVpc struct { VpcName string } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetId() string { return self.VpcId } diff --git a/pkg/multicloud/apsara/vswitch.go b/pkg/multicloud/apsara/vswitch.go index d7ec7ec20e..4305e7fd14 100644 --- a/pkg/multicloud/apsara/vswitch.go +++ b/pkg/multicloud/apsara/vswitch.go @@ -26,6 +26,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -41,6 +42,7 @@ type SCloudResources struct { } type SVSwitch struct { + multicloud.SResourceBase wire *SWire AvailableIpAddressCount int @@ -61,10 +63,6 @@ type SVSwitch struct { RouteTable SRouteTable } -func (self *SVSwitch) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVSwitch) GetId() string { return self.VSwitchId } diff --git a/pkg/multicloud/apsara/wire.go b/pkg/multicloud/apsara/wire.go index 25f9cf58ec..aa2a99a692 100644 --- a/pkg/multicloud/apsara/wire.go +++ b/pkg/multicloud/apsara/wire.go @@ -17,23 +17,20 @@ package apsara import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase zone *SZone vpc *SVpc inetworks []cloudprovider.ICloudNetwork } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SWire) GetId() string { return fmt.Sprintf("%s-%s", self.vpc.GetId(), self.zone.GetId()) } diff --git a/pkg/multicloud/apsara/zone.go b/pkg/multicloud/apsara/zone.go index 034860c5e4..e8dfcb2f70 100644 --- a/pkg/multicloud/apsara/zone.go +++ b/pkg/multicloud/apsara/zone.go @@ -17,13 +17,13 @@ package apsara import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type TChargeType string @@ -107,6 +107,7 @@ type SDedicatedHostTypes struct { } type SZone struct { + multicloud.SResourceBase region *SRegion iwires []cloudprovider.ICloudWire @@ -130,10 +131,6 @@ type SZone struct { AvailableDedicatedHostTypes SDedicatedHostTypes } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetId() string { return self.ZoneId } diff --git a/pkg/multicloud/aws/bucket.go b/pkg/multicloud/aws/bucket.go index fe2da89797..2f0cec6017 100644 --- a/pkg/multicloud/aws/bucket.go +++ b/pkg/multicloud/aws/bucket.go @@ -704,7 +704,10 @@ func (b *SBucket) GetTags() (map[string]string, error) { return result, nil } -func (b *SBucket) SetTags(tags map[string]string) error { +func (b *SBucket) SetTags(tags map[string]string, replace bool) error { + if !replace { + return cloudprovider.ErrNotSupported + } s3cli, err := b.region.GetS3Client() if err != nil { return errors.Wrap(err, "GetS3Client") diff --git a/pkg/multicloud/aws/disk.go b/pkg/multicloud/aws/disk.go index 01995ecf13..62f835c0c6 100644 --- a/pkg/multicloud/aws/disk.go +++ b/pkg/multicloud/aws/disk.go @@ -131,6 +131,12 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_AWS + return data +} + func (self *SDisk) GetBillingType() string { // todo: implement me return billing.BILLING_TYPE_POSTPAID diff --git a/pkg/multicloud/aws/eip.go b/pkg/multicloud/aws/eip.go index 653119bec7..d14584aa34 100644 --- a/pkg/multicloud/aws/eip.go +++ b/pkg/multicloud/aws/eip.go @@ -97,10 +97,6 @@ func (self *SEipAddress) IsEmulated() bool { return false } -func (self *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEipAddress) GetIpAddr() string { return self.IpAddress } diff --git a/pkg/multicloud/aws/host.go b/pkg/multicloud/aws/host.go index 40a2744135..19e1596abb 100644 --- a/pkg/multicloud/aws/host.go +++ b/pkg/multicloud/aws/host.go @@ -54,10 +54,6 @@ func (self *SHost) IsEmulated() bool { return true } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetIVMs() ([]cloudprovider.ICloudVM, error) { vms := make([]SInstance, 0) vms, _, err := self.zone.region.GetInstances(self.zone.ZoneId, nil, len(vms), 50) diff --git a/pkg/multicloud/aws/image.go b/pkg/multicloud/aws/image.go index bf8fde0cbd..019bf21683 100644 --- a/pkg/multicloud/aws/image.go +++ b/pkg/multicloud/aws/image.go @@ -60,6 +60,7 @@ var ( ) type ImageImportTask struct { + multicloud.SResourceBase region *SRegion ImageId string @@ -148,10 +149,6 @@ func (self *ImageImportTask) IsEmulated() bool { return true } -func (self *ImageImportTask) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *ImageImportTask) GetStatus() string { self.Refresh() if self.Status == "completed" { @@ -274,6 +271,15 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SImage) GetSysTags() map[string]string { + data := map[string]string{} + data["os_arch"] = self.Architecture + data["os_name"] = self.OSType + data["os_distribution"] = self.OSDist + data["os_version"] = self.OSVersion + return data +} + func (self *SImage) Delete(ctx context.Context) error { // todo: implement me return self.storageCache.region.DeleteImage(self.ImageId) diff --git a/pkg/multicloud/aws/instance.go b/pkg/multicloud/aws/instance.go index 51732226ce..fa69195895 100644 --- a/pkg/multicloud/aws/instance.go +++ b/pkg/multicloud/aws/instance.go @@ -240,6 +240,41 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + priceKey := fmt.Sprintf("%s::%s::%s::NA::NA::shared::boxusage", self.RegionId, self.InstanceType, strings.ToLower(self.OSType)) + data["price_key"] = priceKey + data["zone_ext_id"] = self.host.zone.GetGlobalId() + if strings.Contains(strings.ToLower(self.OSType), "window") { + if loginKey, err := self.host.zone.region.getPasswordData(self.GetId()); err == nil { + data["login_key"] = loginKey + } + } + // Name tag + tags, err := FetchTags(self.host.zone.region.ec2Client, self.InstanceId) + if err == nil { + name, err := tags.GetString("Name") + if err == nil { + data["Name"] = name + } + } + return data +} + +func (self *SInstance) GetTags() (map[string]string, error) { + tags, err := FetchTags(self.host.zone.region.ec2Client, self.InstanceId) + if err != nil { + return nil, errors.Wrap(err, "FetchTags(self.host.zone.region.ec2Client, self.InstanceId)") + } + data := map[string]string{} + err = tags.Unmarshal(&data) + if err != nil { + return nil, errors.Wrap(err, "tags.Unmarshal") + } + delete(data, "Name") + return data, nil +} + func (self *SInstance) GetBillingType() string { // todo: implement me return billing_api.BILLING_TYPE_POSTPAID @@ -1169,7 +1204,8 @@ func (self *SInstance) GetError() error { return nil } -func (self *SInstance) SetMetadata(tags map[string]string, replace bool) error { +func (self *SInstance) SetTags(tags map[string]string, replace bool) error { + delete(tags, "Name") oldTagsJson, err := FetchTags(self.host.zone.region.ec2Client, self.InstanceId) if err != nil { return errors.Wrapf(err, "FetchTags(self.host.zone.region.ec2Client, %s)", self.InstanceId) diff --git a/pkg/multicloud/aws/internetgateway.go b/pkg/multicloud/aws/internetgateway.go index 5854af0a7d..4f7f53fa89 100644 --- a/pkg/multicloud/aws/internetgateway.go +++ b/pkg/multicloud/aws/internetgateway.go @@ -3,12 +3,12 @@ package aws import ( "github.com/pkg/errors" - "yunion.io/x/jsonutils" - "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SInternetGateway struct { + multicloud.SResourceBase region *SRegion Attachments []InternetGatewayAttachment `json:"Attachments"` @@ -45,7 +45,3 @@ func (i *SInternetGateway) Refresh() error { func (i *SInternetGateway) IsEmulated() bool { return false } - -func (i *SInternetGateway) GetMetadata() *jsonutils.JSONDict { - return nil -} diff --git a/pkg/multicloud/aws/loadbalancer.go b/pkg/multicloud/aws/loadbalancer.go index a7ff6cec43..37f303b933 100644 --- a/pkg/multicloud/aws/loadbalancer.go +++ b/pkg/multicloud/aws/loadbalancer.go @@ -30,6 +30,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) /* @@ -37,6 +38,7 @@ https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/Welcome.htm */ type SElb struct { + multicloud.SResourceBase region *SRegion Type string `json:"Type"` @@ -137,6 +139,29 @@ func (self *SElb) GetMetadata() *jsonutils.JSONDict { return metadata } +func (self *SElb) GetSysTags() map[string]string { + data := map[string]string{} + data["loadbalance_type"] = self.Type + attrs, err := self.region.getElbAttributesById(self.GetId()) + if err != nil { + log.Errorf("SElb GetSysTags %s", err) + return data + } + + for k, v := range attrs { + data[k] = v + } + return data +} + +func (self *SElb) GetTags() (map[string]string, error) { + tags, err := self.region.FetchElbTags(self.LoadBalancerArn) + if err != nil { + return nil, errors.Wrap(err, "self.region.FetchElbTags") + } + return tags, nil +} + func (self *SElb) GetProjectId() string { return "" } @@ -479,7 +504,7 @@ func (self *SRegion) CreateElbBackendgroup(group *cloudprovider.SLoadbalancerBac return nil, fmt.Errorf("CreateElbBackendgroup error: %#v", backendgroups) } -func (self *SElb) SetMetadata(tags map[string]string, replace bool) error { +func (self *SElb) SetTags(tags map[string]string, replace bool) error { oldTags, err := self.region.FetchElbTags(self.LoadBalancerArn) if err != nil { return errors.Wrapf(err, "self.region.FetchElbTags(%s)", self.LoadBalancerArn) diff --git a/pkg/multicloud/aws/loadbalancerbackend.go b/pkg/multicloud/aws/loadbalancerbackend.go index 9bfd05a8d3..b666270a58 100644 --- a/pkg/multicloud/aws/loadbalancerbackend.go +++ b/pkg/multicloud/aws/loadbalancerbackend.go @@ -21,9 +21,11 @@ import ( "yunion.io/x/jsonutils" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbBackend struct { + multicloud.SResourceBase region *SRegion group *SElbBackendGroup diff --git a/pkg/multicloud/aws/loadbalancerbackendgroup.go b/pkg/multicloud/aws/loadbalancerbackendgroup.go index d04eb543fc..a8e8345aac 100644 --- a/pkg/multicloud/aws/loadbalancerbackendgroup.go +++ b/pkg/multicloud/aws/loadbalancerbackendgroup.go @@ -27,9 +27,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbBackendGroup struct { + multicloud.SResourceBase region *SRegion lb *SElb @@ -109,6 +111,15 @@ func (self *SElbBackendGroup) GetMetadata() *jsonutils.JSONDict { return metadata } +func (self *SElbBackendGroup) GetSysTags() map[string]string { + data := map[string]string{} + data["port"] = strconv.FormatInt(self.Port, 10) + data["target_type"] = self.TargetType + data["health_check_protocol"] = strings.ToLower(self.HealthCheckProtocol) + data["health_check_interval"] = strconv.Itoa(self.HealthCheckIntervalSeconds) + return data +} + func (self *SElbBackendGroup) GetProjectId() string { return "" } diff --git a/pkg/multicloud/aws/loadbalancercert.go b/pkg/multicloud/aws/loadbalancercert.go index 1cc143de19..8e16d347d8 100644 --- a/pkg/multicloud/aws/loadbalancercert.go +++ b/pkg/multicloud/aws/loadbalancercert.go @@ -29,9 +29,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbCertificate struct { + multicloud.SResourceBase region *SRegion cert *x509.Certificate diff --git a/pkg/multicloud/aws/loadbalancerlistener.go b/pkg/multicloud/aws/loadbalancerlistener.go index 4192500ea3..e43c6dfc36 100644 --- a/pkg/multicloud/aws/loadbalancerlistener.go +++ b/pkg/multicloud/aws/loadbalancerlistener.go @@ -30,9 +30,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbListener struct { + multicloud.SResourceBase region *SRegion lb *SElb group *SElbBackendGroup diff --git a/pkg/multicloud/aws/loadbalancerlistenerrule.go b/pkg/multicloud/aws/loadbalancerlistenerrule.go index fddac0f8c5..ac41afde4f 100644 --- a/pkg/multicloud/aws/loadbalancerlistenerrule.go +++ b/pkg/multicloud/aws/loadbalancerlistenerrule.go @@ -28,9 +28,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbListenerRule struct { + multicloud.SResourceBase listener *SElbListener region *SRegion diff --git a/pkg/multicloud/aws/network.go b/pkg/multicloud/aws/network.go index b2be4a6774..662ff197de 100644 --- a/pkg/multicloud/aws/network.go +++ b/pkg/multicloud/aws/network.go @@ -16,6 +16,7 @@ package aws import ( "fmt" + "strconv" "strings" "time" @@ -27,10 +28,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) type SNetwork struct { + multicloud.SResourceBase wire *SWire AvailableIpAddressCount int @@ -103,6 +106,26 @@ func (self *SNetwork) GetMetadata() *jsonutils.JSONDict { return meta } +func (self *SNetwork) GetSysTags() map[string]string { + data := map[string]string{} + routes, _ := self.wire.vpc.region.GetRouteTablesByNetworkId(self.GetId()) + if len(routes) == 0 { + routes, _ = self.wire.vpc.region.GetRouteTables(self.VpcId, true) + } + + support_eip := false + if len(routes) >= 1 { + for i := range routes[0].Routes { + route := routes[0].Routes[i] + if route.GetNextHopType() == api.Next_HOP_TYPE_INTERNET { + support_eip = true + } + } + } + data["support_eip"] = strconv.FormatBool(support_eip) + return data +} + func (self *SNetwork) GetIWire() cloudprovider.ICloudWire { return self.wire } diff --git a/pkg/multicloud/aws/region.go b/pkg/multicloud/aws/region.go index d76c6ac9c4..a355d86282 100644 --- a/pkg/multicloud/aws/region.go +++ b/pkg/multicloud/aws/region.go @@ -39,7 +39,6 @@ import ( "github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi" "github.com/aws/aws-sdk-go/service/s3" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" @@ -437,10 +436,6 @@ func (self *SRegion) IsEmulated() bool { return false } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo { if info, ok := LatitudeAndLongitude[self.RegionId]; ok { return info diff --git a/pkg/multicloud/aws/route.go b/pkg/multicloud/aws/route.go index e2c6ea89a1..c4bfd15e88 100644 --- a/pkg/multicloud/aws/route.go +++ b/pkg/multicloud/aws/route.go @@ -17,12 +17,12 @@ package aws import ( "strings" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SRoute struct { + multicloud.SResourceBase routetable *SRouteTable DestinationCIDRBlock string `json:"DestinationCidrBlock"` @@ -65,10 +65,6 @@ func (self *SRoute) IsEmulated() bool { return false } -func (self *SRoute) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRoute) GetType() string { switch self.Origin { case "CreateRouteTable": diff --git a/pkg/multicloud/aws/routetable.go b/pkg/multicloud/aws/routetable.go index 53ae955f52..6d65e61b41 100644 --- a/pkg/multicloud/aws/routetable.go +++ b/pkg/multicloud/aws/routetable.go @@ -25,9 +25,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SRouteTable struct { + multicloud.SResourceBase region *SRegion vpc *SVpc @@ -81,10 +83,6 @@ func (self *SRouteTable) IsEmulated() bool { return false } -func (self *SRouteTable) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteTable) GetDescription() string { return "" } diff --git a/pkg/multicloud/aws/securitygroup.go b/pkg/multicloud/aws/securitygroup.go index 0abbb9bd44..e48e098627 100644 --- a/pkg/multicloud/aws/securitygroup.go +++ b/pkg/multicloud/aws/securitygroup.go @@ -113,6 +113,17 @@ func (self *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SSecurityGroup) GetSysTags() map[string]string { + if len(self.Tags.Tag) == 0 { + return nil + } + data := map[string]string{} + for _, value := range self.Tags.Tag { + data[value.TagKey] = value.TagValue + } + return data +} + func (self *SSecurityGroup) GetDescription() string { return self.Description } diff --git a/pkg/multicloud/aws/snapshot.go b/pkg/multicloud/aws/snapshot.go index c264b5163a..d7540685d4 100644 --- a/pkg/multicloud/aws/snapshot.go +++ b/pkg/multicloud/aws/snapshot.go @@ -25,6 +25,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SnapshotStatusType string @@ -36,6 +37,7 @@ const ( ) type SSnapshot struct { + multicloud.SResourceBase region *SRegion Progress string @@ -95,10 +97,6 @@ func (self *SSnapshot) IsEmulated() bool { return false } -func (self *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshot) GetSizeMb() int32 { return self.SourceDiskSize * 1024 } diff --git a/pkg/multicloud/aws/storage.go b/pkg/multicloud/aws/storage.go index b5bff5010f..fa59a1d16d 100644 --- a/pkg/multicloud/aws/storage.go +++ b/pkg/multicloud/aws/storage.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStorage struct { + multicloud.SResourceBase zone *SZone storageType string } @@ -53,10 +55,6 @@ func (self *SStorage) IsEmulated() bool { return true } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetIStoragecache() cloudprovider.ICloudStoragecache { return self.zone.region.getStoragecache() } diff --git a/pkg/multicloud/aws/storagecache.go b/pkg/multicloud/aws/storagecache.go index 1e97e6b435..41a13efb7e 100644 --- a/pkg/multicloud/aws/storagecache.go +++ b/pkg/multicloud/aws/storagecache.go @@ -33,10 +33,12 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } @@ -64,10 +66,6 @@ func (self *SStoragecache) IsEmulated() bool { return false } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetICustomizedCloudImages() ([]cloudprovider.ICloudImage, error) { images, err := self.region.GetImages("", ImageOwnerSelf, nil, "", "hvm", nil, "", true) if err != nil { diff --git a/pkg/multicloud/aws/vpc.go b/pkg/multicloud/aws/vpc.go index 16c9a4dd49..0389f28764 100644 --- a/pkg/multicloud/aws/vpc.go +++ b/pkg/multicloud/aws/vpc.go @@ -95,10 +95,6 @@ func (self *SVpc) IsEmulated() bool { return false } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/aws/wire.go b/pkg/multicloud/aws/wire.go index 46952d6d76..076b98fdc7 100644 --- a/pkg/multicloud/aws/wire.go +++ b/pkg/multicloud/aws/wire.go @@ -17,13 +17,14 @@ package aws import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase zone *SZone vpc *SVpc @@ -54,10 +55,6 @@ func (self *SWire) IsEmulated() bool { return true } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SWire) GetIVpc() cloudprovider.ICloudVpc { return self.vpc } diff --git a/pkg/multicloud/aws/zone.go b/pkg/multicloud/aws/zone.go index 7be6238883..c5017c8e3a 100644 --- a/pkg/multicloud/aws/zone.go +++ b/pkg/multicloud/aws/zone.go @@ -17,13 +17,13 @@ package aws import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) var StorageTypes = []string{ @@ -35,6 +35,7 @@ var StorageTypes = []string{ } type SZone struct { + multicloud.SResourceBase region *SRegion host *SHost @@ -132,10 +133,6 @@ func (self *SZone) IsEmulated() bool { return false } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetIRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/azure/classic_disk.go b/pkg/multicloud/azure/classic_disk.go index dd4d262d3c..5200e9e8a6 100644 --- a/pkg/multicloud/azure/classic_disk.go +++ b/pkg/multicloud/azure/classic_disk.go @@ -59,6 +59,12 @@ func (self *SClassicDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SClassicDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_AZURE + return data +} + func (self *SClassicDisk) CreateISnapshot(ctx context.Context, name, desc string) (cloudprovider.ICloudSnapshot, error) { return nil, cloudprovider.ErrNotSupported } diff --git a/pkg/multicloud/azure/classic_eip.go b/pkg/multicloud/azure/classic_eip.go index 9173ef2dc8..0d14960f8a 100644 --- a/pkg/multicloud/azure/classic_eip.go +++ b/pkg/multicloud/azure/classic_eip.go @@ -100,10 +100,6 @@ func (self *SClassicEipAddress) GetIpAddr() string { return self.Properties.IpAddress } -func (self *SClassicEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SClassicEipAddress) GetMode() string { // TODO if self.instanceId == self.ID { diff --git a/pkg/multicloud/azure/classic_host.go b/pkg/multicloud/azure/classic_host.go index ad9a5769cd..bd4eab8abd 100644 --- a/pkg/multicloud/azure/classic_host.go +++ b/pkg/multicloud/azure/classic_host.go @@ -30,10 +30,6 @@ type SClassicHost struct { zone *SZone } -func (self *SClassicHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SClassicHost) GetId() string { return fmt.Sprintf("%s-%s-classic", self.zone.region.client.cpcfg.Id, self.zone.GetId()) } diff --git a/pkg/multicloud/azure/classic_instance.go b/pkg/multicloud/azure/classic_instance.go index 4bbe5bbb65..698c7b46a0 100644 --- a/pkg/multicloud/azure/classic_instance.go +++ b/pkg/multicloud/azure/classic_instance.go @@ -163,6 +163,14 @@ func (self *SClassicInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SClassicInstance) GetSysTags() map[string]string { + data := map[string]string{} + priceKey := fmt.Sprintf("%s::%s", self.Properties.HardwareProfile.Size, self.host.zone.region.Name) + data["price_key"] = priceKey + data["zone_ext_id"] = self.host.zone.GetGlobalId() + return data +} + func (self *SClassicInstance) GetHypervisor() string { return api.HYPERVISOR_AZURE } diff --git a/pkg/multicloud/azure/classic_network.go b/pkg/multicloud/azure/classic_network.go index efacf66c94..bf042610a4 100644 --- a/pkg/multicloud/azure/classic_network.go +++ b/pkg/multicloud/azure/classic_network.go @@ -22,10 +22,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) type SClassicNetwork struct { + multicloud.SResourceBase wire *SClassicWire id string @@ -33,10 +35,6 @@ type SClassicNetwork struct { AddressPrefix string `json:"addressPrefix,omitempty"` } -func (self *SClassicNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SClassicNetwork) GetId() string { return strings.ToLower(self.id) } diff --git a/pkg/multicloud/azure/classic_secruitygroup.go b/pkg/multicloud/azure/classic_secruitygroup.go index 6e53c6f325..c1c78624d2 100644 --- a/pkg/multicloud/azure/classic_secruitygroup.go +++ b/pkg/multicloud/azure/classic_secruitygroup.go @@ -128,6 +128,10 @@ func (self *SClassicSecurityGroup) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SClassicSecurityGroup) GetTags() (map[string]string, error) { + return self.Tags, nil +} + func (self *SClassicSecurityGroup) GetId() string { return self.ID } diff --git a/pkg/multicloud/azure/classic_snapshot.go b/pkg/multicloud/azure/classic_snapshot.go index 24c7651f23..f5fb53c710 100644 --- a/pkg/multicloud/azure/classic_snapshot.go +++ b/pkg/multicloud/azure/classic_snapshot.go @@ -17,13 +17,13 @@ package azure import ( "fmt" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SClassicSnapshot struct { + multicloud.SResourceBase region *SRegion Name string @@ -40,10 +40,6 @@ func (self *SClassicSnapshot) GetGlobalId() string { return self.GetId() } -func (self *SClassicSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SClassicSnapshot) GetName() string { return fmt.Sprintf("%s-%s", self.diskName, self.Name) } diff --git a/pkg/multicloud/azure/eip.go b/pkg/multicloud/azure/eip.go index 06b67e86f1..0700e87c51 100644 --- a/pkg/multicloud/azure/eip.go +++ b/pkg/multicloud/azure/eip.go @@ -209,10 +209,6 @@ func (self *SEipAddress) GetIpAddr() string { return self.Properties.IPAddress } -func (self *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEipAddress) GetMode() string { if self.IsEmulated() { return api.EIP_MODE_INSTANCE_PUBLICIP diff --git a/pkg/multicloud/azure/host.go b/pkg/multicloud/azure/host.go index ce87d7f5ff..6ba08a9116 100644 --- a/pkg/multicloud/azure/host.go +++ b/pkg/multicloud/azure/host.go @@ -36,10 +36,6 @@ type SHost struct { zone *SZone } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetId() string { return fmt.Sprintf("%s-%s", self.zone.region.client.cpcfg.Id, self.zone.GetId()) } diff --git a/pkg/multicloud/azure/image.go b/pkg/multicloud/azure/image.go index 9c475cae33..be3ffe2f8c 100644 --- a/pkg/multicloud/azure/image.go +++ b/pkg/multicloud/azure/image.go @@ -109,7 +109,16 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { if len(osType) > 0 { data.Add(jsonutils.NewString(osType), "os_name") } - return nil + return data +} + +func (self *SImage) GetSysTags() map[string]string { + data := map[string]string{} + osType := string(self.Properties.StorageProfile.OsDisk.OsType) + if len(osType) > 0 { + data["os_name"] = osType + } + return data } func (self *SImage) GetId() string { diff --git a/pkg/multicloud/azure/instance.go b/pkg/multicloud/azure/instance.go index 3b1ef102bd..28855d1b05 100644 --- a/pkg/multicloud/azure/instance.go +++ b/pkg/multicloud/azure/instance.go @@ -229,6 +229,27 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + if osDistribution := self.Properties.StorageProfile.ImageReference.Publisher; len(osDistribution) > 0 { + data["os_distribution"] = osDistribution + } + if loginAccount := self.Properties.OsProfile.AdminUsername; len(loginAccount) > 0 { + data["login_account"] = loginAccount + } + if loginKey := self.Properties.OsProfile.AdminPassword; len(loginKey) > 0 { + data["login_key"] = loginKey + } + data["zone_ext_id"] = self.host.zone.GetGlobalId() + priceKey := fmt.Sprintf("%s::%s", self.Properties.HardwareProfile.VMSize, self.host.zone.region.Name) + data["price_key"] = priceKey + return data +} + +func (self *SInstance) GetTags() (map[string]string, error) { + return self.Tags, nil +} + func (self *SInstance) GetHypervisor() string { return api.HYPERVISOR_AZURE } @@ -996,7 +1017,7 @@ func (self *SInstance) SaveImage(opts *cloudprovider.SaveImageOptions) (cloudpro return image, nil } -func (self *SInstance) SetMetadata(tags map[string]string, replace bool) error { +func (self *SInstance) SetTags(tags map[string]string, replace bool) error { if !replace { for k, v := range self.Tags { if _, ok := tags[k]; !ok { diff --git a/pkg/multicloud/azure/region.go b/pkg/multicloud/azure/region.go index 52c05709ab..9816fd998c 100644 --- a/pkg/multicloud/azure/region.go +++ b/pkg/multicloud/azure/region.go @@ -98,10 +98,6 @@ func (self *SRegion) getVMSize(name string) (*SVMSize, error) { return nil, errors.Wrapf(cloudprovider.ErrNotFound, name) } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetId() string { return self.Name } diff --git a/pkg/multicloud/azure/securitygroup.go b/pkg/multicloud/azure/securitygroup.go index 14e457be32..05455661a2 100644 --- a/pkg/multicloud/azure/securitygroup.go +++ b/pkg/multicloud/azure/securitygroup.go @@ -86,6 +86,10 @@ func (self *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SSecurityGroup) GetTags() (map[string]string, error) { + return self.Tags, nil +} + func parseCIDR(cidr string) (*net.IPNet, error) { if cidr == "*" || strings.ToLower(cidr) == "internet" { cidr = "0.0.0.0/0" diff --git a/pkg/multicloud/azure/storagecache.go b/pkg/multicloud/azure/storagecache.go index 2a4cba8fe6..c4a5205bf1 100644 --- a/pkg/multicloud/azure/storagecache.go +++ b/pkg/multicloud/azure/storagecache.go @@ -32,6 +32,7 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/fileutils2" "yunion.io/x/onecloud/pkg/util/qemuimg" ) @@ -44,13 +45,10 @@ const ( ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetId() string { return fmt.Sprintf("%s-%s", self.region.client.cpcfg.Id, self.region.GetId()) } diff --git a/pkg/multicloud/azure/vpc.go b/pkg/multicloud/azure/vpc.go index a04287f899..1c8071e1e8 100644 --- a/pkg/multicloud/azure/vpc.go +++ b/pkg/multicloud/azure/vpc.go @@ -55,10 +55,6 @@ type SVpc struct { Properties VirtualNetworkPropertiesFormat `json:"properties,omitempty"` } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetId() string { return self.ID } diff --git a/pkg/multicloud/bucket_base.go b/pkg/multicloud/bucket_base.go index 2df30926f0..bae8fbf43f 100644 --- a/pkg/multicloud/bucket_base.go +++ b/pkg/multicloud/bucket_base.go @@ -15,13 +15,13 @@ package multicloud import ( - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" ) -type SBaseBucket struct{} +type SBaseBucket struct { + SResourceBase +} func (b *SBaseBucket) MaxPartCount() int { return 10000 @@ -55,10 +55,6 @@ func (b *SBaseBucket) IsEmulated() bool { return false } -func (b *SBaseBucket) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (b *SBaseBucket) LimitSupport() cloudprovider.SBucketStats { return cloudprovider.SBucketStats{ SizeBytes: -1, @@ -122,14 +118,6 @@ func (b *SBaseBucket) DeletePolicy(id []string) ([]cloudprovider.SBucketPolicySt return nil, cloudprovider.ErrNotImplemented } -func (b *SBaseBucket) GetTags() (map[string]string, error) { - return nil, cloudprovider.ErrNotImplemented -} - -func (b *SBaseBucket) SetTags(tags map[string]string) error { - return cloudprovider.ErrNotImplemented -} - func (b *SBaseBucket) DeleteTags() error { return cloudprovider.ErrNotImplemented } diff --git a/pkg/multicloud/ctyun/disk.go b/pkg/multicloud/ctyun/disk.go index 33e83c7d85..b7f2e4a510 100644 --- a/pkg/multicloud/ctyun/disk.go +++ b/pkg/multicloud/ctyun/disk.go @@ -193,6 +193,12 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_CTYUN + return data +} + func (self *SDisk) GetProjectId() string { return "" } diff --git a/pkg/multicloud/ctyun/diskbackup.go b/pkg/multicloud/ctyun/diskbackup.go index ab448c5f60..53e9a365f5 100644 --- a/pkg/multicloud/ctyun/diskbackup.go +++ b/pkg/multicloud/ctyun/diskbackup.go @@ -22,9 +22,11 @@ import ( "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SDiskBackup struct { + multicloud.SResourceBase region *SRegion Status string `json:"status"` @@ -85,10 +87,6 @@ func (self *SDiskBackup) IsEmulated() bool { return false } -func (self *SDiskBackup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SDiskBackup) GetProjectId() string { return "" } diff --git a/pkg/multicloud/ctyun/diskbackup_policy.go b/pkg/multicloud/ctyun/diskbackup_policy.go index bccd44f47c..f8b6b8f459 100644 --- a/pkg/multicloud/ctyun/diskbackup_policy.go +++ b/pkg/multicloud/ctyun/diskbackup_policy.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SDiskBacupPolicy struct { + multicloud.SResourceBase region *SRegion PolicyResourceCount int64 `json:"policy_resource_count"` @@ -78,10 +80,6 @@ func (self *SDiskBacupPolicy) IsEmulated() bool { return false } -func (self *SDiskBacupPolicy) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SDiskBacupPolicy) GetProjectId() string { return "" } diff --git a/pkg/multicloud/ctyun/eip.go b/pkg/multicloud/ctyun/eip.go index ea13116476..4f1a508b78 100644 --- a/pkg/multicloud/ctyun/eip.go +++ b/pkg/multicloud/ctyun/eip.go @@ -113,10 +113,6 @@ func (self *SEip) IsEmulated() bool { return false } -func (self *SEip) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEip) GetProjectId() string { return "" } diff --git a/pkg/multicloud/ctyun/host.go b/pkg/multicloud/ctyun/host.go index 3bbaf1eb1d..9d1c4e70ab 100644 --- a/pkg/multicloud/ctyun/host.go +++ b/pkg/multicloud/ctyun/host.go @@ -58,10 +58,6 @@ func (self *SHost) IsEmulated() bool { return true } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - // http://ctyun-api-url/apiproxy/v3/ondemand/queryVMs func (self *SHost) GetIVMs() ([]cloudprovider.ICloudVM, error) { vms, err := self.zone.region.GetVMs() diff --git a/pkg/multicloud/ctyun/image.go b/pkg/multicloud/ctyun/image.go index e378f1546f..7b92712963 100644 --- a/pkg/multicloud/ctyun/image.go +++ b/pkg/multicloud/ctyun/image.go @@ -100,6 +100,23 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SImage) GetSysTags() map[string]string { + data := map[string]string{} + if self.OSBit > 0 { + data["os_arch"] = self.GetOsArch() + } + if len(self.OSType) > 0 { + data["os_name"] = self.GetOsType() + } + if len(self.Platform) > 0 { + data["os_distribution"] = self.GetOsDist() + } + + data["os_version"] = self.GetOsVersion() + + return data +} + func (self *SImage) Delete(ctx context.Context) error { return cloudprovider.ErrNotSupported } diff --git a/pkg/multicloud/ctyun/instance.go b/pkg/multicloud/ctyun/instance.go index 7edf59d6f3..8f66fad0bf 100644 --- a/pkg/multicloud/ctyun/instance.go +++ b/pkg/multicloud/ctyun/instance.go @@ -201,6 +201,27 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + lowerOs := self.GetOSType() + if strings.HasPrefix(lowerOs, "win") { + lowerOs = "win" + } + priceKey := fmt.Sprintf("%s::%s::%s", self.host.zone.region.GetId(), self.GetInstanceType(), lowerOs) + data["price_key"] = priceKey + data["zone_ext_id"] = self.host.zone.GetGlobalId() + + image, _ := self.GetImage() + if image != nil { + meta := image.GetSysTags() + for k, v := range meta { + data[k] = v + } + } + + return data +} + func (self *SInstance) GetProjectId() string { return "" } diff --git a/pkg/multicloud/ctyun/network.go b/pkg/multicloud/ctyun/network.go index a798c77203..3b7a36cc3a 100644 --- a/pkg/multicloud/ctyun/network.go +++ b/pkg/multicloud/ctyun/network.go @@ -26,10 +26,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) type SNetwork struct { + multicloud.SResourceBase vpc *SVpc wire *SWire @@ -83,10 +85,6 @@ func (self *SNetwork) IsEmulated() bool { return false } -func (self *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SNetwork) GetProjectId() string { return "" } diff --git a/pkg/multicloud/ctyun/region.go b/pkg/multicloud/ctyun/region.go index 1da74c1583..f27e1e9815 100644 --- a/pkg/multicloud/ctyun/region.go +++ b/pkg/multicloud/ctyun/region.go @@ -179,10 +179,6 @@ func (self *SRegion) IsEmulated() bool { return false } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo { if info, ok := LatitudeAndLongitude[self.ID]; ok { return info diff --git a/pkg/multicloud/ctyun/storage.go b/pkg/multicloud/ctyun/storage.go index ec38234e0b..a0d5c552b1 100644 --- a/pkg/multicloud/ctyun/storage.go +++ b/pkg/multicloud/ctyun/storage.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) var StorageTypes = []string{ @@ -33,6 +34,7 @@ var StorageTypes = []string{ } type SStorage struct { + multicloud.SResourceBase zone *SZone storageType string } @@ -61,10 +63,6 @@ func (self *SStorage) IsEmulated() bool { return true } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetIStoragecache() cloudprovider.ICloudStoragecache { return self.zone.region.getStoragecache() } diff --git a/pkg/multicloud/ctyun/storagecache.go b/pkg/multicloud/ctyun/storagecache.go index 2c31d9bb55..1f7d9c7335 100644 --- a/pkg/multicloud/ctyun/storagecache.go +++ b/pkg/multicloud/ctyun/storagecache.go @@ -24,9 +24,11 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } @@ -75,10 +77,6 @@ func (self *SStoragecache) IsEmulated() bool { return false } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetICloudImages() ([]cloudprovider.ICloudImage, error) { return nil, cloudprovider.ErrNotImplemented } diff --git a/pkg/multicloud/ctyun/vpc.go b/pkg/multicloud/ctyun/vpc.go index cfcbdb90d9..e1e55c0049 100644 --- a/pkg/multicloud/ctyun/vpc.go +++ b/pkg/multicloud/ctyun/vpc.go @@ -79,10 +79,6 @@ func (self *SVpc) IsEmulated() bool { return false } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/ctyun/wire.go b/pkg/multicloud/ctyun/wire.go index 80255135f1..ccf46848b6 100644 --- a/pkg/multicloud/ctyun/wire.go +++ b/pkg/multicloud/ctyun/wire.go @@ -17,14 +17,15 @@ package ctyun import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/netutils" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase region *SRegion vpc *SVpc @@ -55,10 +56,6 @@ func (self *SWire) IsEmulated() bool { return true } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - // http://ctyun-api-url/apiproxy/v3/queryVPCDetail func (self *SWire) GetIVpc() cloudprovider.ICloudVpc { return self.vpc diff --git a/pkg/multicloud/ctyun/zone.go b/pkg/multicloud/ctyun/zone.go index f73d8bc043..c742a45e56 100644 --- a/pkg/multicloud/ctyun/zone.go +++ b/pkg/multicloud/ctyun/zone.go @@ -17,13 +17,14 @@ package ctyun import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SZone struct { + multicloud.SResourceBase region *SRegion host *SHost @@ -73,10 +74,6 @@ func (self *SZone) IsEmulated() bool { return false } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetIRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/dbinstance_base.go b/pkg/multicloud/dbinstance_base.go index b398dbd883..5642d736df 100644 --- a/pkg/multicloud/dbinstance_base.go +++ b/pkg/multicloud/dbinstance_base.go @@ -68,10 +68,6 @@ func (instance *SDBInstanceBase) Delete() error { return errors.Wrapf(cloudprovider.ErrNotImplemented, "Delete") } -func (instance *SDBInstanceBase) SetMetadata(tags map[string]string, replace bool) error { - return cloudprovider.ErrNotImplemented -} - func (instance *SDBInstanceBase) GetMasterInstanceId() string { return "" } diff --git a/pkg/multicloud/eip_base.go b/pkg/multicloud/eip_base.go index 76c4e975e9..0e2ad43a71 100644 --- a/pkg/multicloud/eip_base.go +++ b/pkg/multicloud/eip_base.go @@ -15,5 +15,6 @@ package multicloud type SEipBase struct { + SResourceBase SBillingBase } diff --git a/pkg/multicloud/esxi/host.go b/pkg/multicloud/esxi/host.go index db95225550..8dcfe46920 100644 --- a/pkg/multicloud/esxi/host.go +++ b/pkg/multicloud/esxi/host.go @@ -123,10 +123,6 @@ func (self *SHost) GetName() string { return formatName(self.SManagedObject.GetName()) } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetSchedtags() ([]string, error) { clusters, err := self.datacenter.listClusters() if err != nil { diff --git a/pkg/multicloud/esxi/image.go b/pkg/multicloud/esxi/image.go index 0ff414d47d..0530f3d402 100644 --- a/pkg/multicloud/esxi/image.go +++ b/pkg/multicloud/esxi/image.go @@ -22,8 +22,6 @@ import ( "github.com/vmware/govmomi/object" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud" @@ -95,10 +93,6 @@ func (self *SImage) IsEmulated() bool { return false } -func (self *SImage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SImage) Delete(ctx context.Context) error { return self.cache.datastore.DeleteVmdk(ctx, self.filename) } diff --git a/pkg/multicloud/esxi/snapshot.go b/pkg/multicloud/esxi/snapshot.go index feff3b4f02..c049ec16a7 100644 --- a/pkg/multicloud/esxi/snapshot.go +++ b/pkg/multicloud/esxi/snapshot.go @@ -21,13 +21,14 @@ import ( "github.com/vmware/govmomi/vim25/methods" "github.com/vmware/govmomi/vim25/types" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SVirtualMachineSnapshot struct { + multicloud.SResourceBase snapshotTree types.VirtualMachineSnapshotTree vm *SVirtualMachine } @@ -66,10 +67,6 @@ func (s *SVirtualMachineSnapshot) IsEmulated() bool { return false } -func (s *SVirtualMachineSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (s *SVirtualMachineSnapshot) GetProjectId() string { return s.vm.GetProjectId() } diff --git a/pkg/multicloud/esxi/storage.go b/pkg/multicloud/esxi/storage.go index 7e7cc9358a..61570c6edc 100644 --- a/pkg/multicloud/esxi/storage.go +++ b/pkg/multicloud/esxi/storage.go @@ -48,12 +48,14 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/vmdkutils" ) var DATASTORE_PROPS = []string{"name", "parent", "info", "summary", "host", "vm"} type SDatastore struct { + multicloud.SResourceBase SManagedObject // vms []cloudprovider.ICloudVM @@ -67,10 +69,6 @@ func NewDatastore(manager *SESXiClient, ds *mo.Datastore, dc *SDatacenter) *SDat return &SDatastore{SManagedObject: newManagedObject(manager, ds, dc)} } -func (self *SDatastore) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SDatastore) getDatastore() *mo.Datastore { return self.object.(*mo.Datastore) } diff --git a/pkg/multicloud/esxi/storagecache.go b/pkg/multicloud/esxi/storagecache.go index cb8f916d75..065aebad2b 100644 --- a/pkg/multicloud/esxi/storagecache.go +++ b/pkg/multicloud/esxi/storagecache.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/multicloud" ) const ( @@ -33,6 +34,7 @@ const ( ) type SDatastoreImageCache struct { + multicloud.SResourceBase datastore *SDatastore host *SHost } @@ -87,10 +89,6 @@ func (self *SDatastoreImageCache) IsEmulated() bool { return false } -func (self *SDatastoreImageCache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SDatastoreImageCache) GetPath() string { return path.Join(self.datastore.GetMountPoint(), IMAGE_CACHE_DIR_NAME) } diff --git a/pkg/multicloud/esxi/template.go b/pkg/multicloud/esxi/template.go index e1cb185704..c9e6c33a57 100644 --- a/pkg/multicloud/esxi/template.go +++ b/pkg/multicloud/esxi/template.go @@ -20,7 +20,6 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" @@ -110,10 +109,6 @@ func (t *SVMTemplate) IsEmulated() bool { return false } -func (t *SVMTemplate) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (t *SVMTemplate) Delete(ctx context.Context) error { vm, err := t.cache.host.GetTemplateVMById(t.uuid) if errors.Cause(err) == cloudprovider.ErrNotFound { diff --git a/pkg/multicloud/esxi/vdisk.go b/pkg/multicloud/esxi/vdisk.go index b2bc300a84..644ad5c016 100644 --- a/pkg/multicloud/esxi/vdisk.go +++ b/pkg/multicloud/esxi/vdisk.go @@ -24,7 +24,6 @@ import ( "github.com/vmware/govmomi/vim25/types" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" @@ -330,10 +329,6 @@ func (disk *SVirtualDisk) IsEmulated() bool { return false } -func (disk *SVirtualDisk) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (disk *SVirtualDisk) GetDiskSizeMB() int { capa := disk.getVirtualDisk().CapacityInBytes if capa == 0 { diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index 32e32f25ea..3b390c1c65 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -118,6 +118,27 @@ func (self *SVirtualMachine) GetMetadata() *jsonutils.JSONDict { return meta } +func (self *SVirtualMachine) GetSysTags() map[string]string { + meta := map[string]string{} + meta["datacenter"] = self.GetDatacenterPathString() + rp, _ := self.getResourcePool() + if rp != nil { + rpPath := rp.GetPath() + rpOffset := -1 + for i := range rpPath { + if rpPath[i] == "Resources" { + if i > 0 { + meta["cluster"] = rpPath[i-1] + rpOffset = i + } + } else if rpOffset >= 0 && i > rpOffset { + meta[fmt.Sprintf("pool%d", i-rpOffset-1)] = rpPath[i] + } + } + } + return meta +} + func (self *SVirtualMachine) getVirtualMachine() *mo.VirtualMachine { return self.object.(*mo.VirtualMachine) } diff --git a/pkg/multicloud/google/dbinstance.go b/pkg/multicloud/google/dbinstance.go index 1f833eeb4f..dd9dd34b3b 100644 --- a/pkg/multicloud/google/dbinstance.go +++ b/pkg/multicloud/google/dbinstance.go @@ -178,10 +178,6 @@ func (region *SRegion) GetDBInstance(instanceId string) (*SDBInstance, error) { return &instance, nil } -func (self *SDBInstance) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (rds *SDBInstance) GetName() string { return rds.Name } diff --git a/pkg/multicloud/google/dbinstance_backup.go b/pkg/multicloud/google/dbinstance_backup.go index 9af5c191dc..a98ca1eaa9 100644 --- a/pkg/multicloud/google/dbinstance_backup.go +++ b/pkg/multicloud/google/dbinstance_backup.go @@ -76,10 +76,6 @@ func (region *SRegion) GetDBInstanceBackup(backupId string) (*SDBInstanceBackup, return &backup, nil } -func (backup *SDBInstanceBackup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (backup *SDBInstanceBackup) GetName() string { return backup.Id } diff --git a/pkg/multicloud/google/dbinstance_database.go b/pkg/multicloud/google/dbinstance_database.go index e927cf8a15..3b2266df06 100644 --- a/pkg/multicloud/google/dbinstance_database.go +++ b/pkg/multicloud/google/dbinstance_database.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SSqlserverDatabaseDetails struct { @@ -29,6 +30,7 @@ type SSqlserverDatabaseDetails struct { } type SDBInstanceDatabase struct { + multicloud.SResourceBase rds *SDBInstance Kind string Collation string @@ -72,10 +74,6 @@ func (database *SDBInstanceDatabase) GetId() string { return database.SelfLink } -func (database *SDBInstanceDatabase) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (database *SDBInstanceDatabase) GetName() string { return database.Name } diff --git a/pkg/multicloud/google/disk.go b/pkg/multicloud/google/disk.go index 4d88192908..c5efcef346 100644 --- a/pkg/multicloud/google/disk.go +++ b/pkg/multicloud/google/disk.go @@ -98,10 +98,6 @@ func (disk *SDisk) Refresh() error { return jsonutils.Update(disk, _disk) } -func (disk *SDisk) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (disk *SDisk) GetIStorage() (cloudprovider.ICloudStorage, error) { return disk.storage, nil } diff --git a/pkg/multicloud/google/eip.go b/pkg/multicloud/google/eip.go index 618847e12c..7ad70d411c 100644 --- a/pkg/multicloud/google/eip.go +++ b/pkg/multicloud/google/eip.go @@ -79,10 +79,6 @@ func (addr *SAddress) GetProjectId() string { return addr.region.GetProjectId() } -func (addr *SAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (addr *SAddress) IsEmulated() bool { if addr.Id == addr.SelfLink { return true diff --git a/pkg/multicloud/google/host.go b/pkg/multicloud/google/host.go index 39bfab1495..8b623f5363 100644 --- a/pkg/multicloud/google/host.go +++ b/pkg/multicloud/google/host.go @@ -31,10 +31,6 @@ type SHost struct { zone *SZone } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (host *SHost) GetId() string { return host.zone.GetGlobalId() } diff --git a/pkg/multicloud/google/image.go b/pkg/multicloud/google/image.go index d0383e1b95..0140f74002 100644 --- a/pkg/multicloud/google/image.go +++ b/pkg/multicloud/google/image.go @@ -111,10 +111,6 @@ func (region *SRegion) GetImage(id string) (*SImage, error) { return image, region.Get(id, image) } -func (image *SImage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (image *SImage) GetMinRamSizeMb() int { return 0 } diff --git a/pkg/multicloud/google/instance.go b/pkg/multicloud/google/instance.go index 646a2665ee..16f5a539c4 100644 --- a/pkg/multicloud/google/instance.go +++ b/pkg/multicloud/google/instance.go @@ -333,7 +333,7 @@ func (instance *SInstance) AssignSecurityGroup(id string) error { tag := strings.ToLower(secgroup) if !utils.IsInStringArray(tag, instance.Tags.Items) { instance.Tags.Items = append(instance.Tags.Items, tag) - return instance.host.zone.region.SetTags(instance.SelfLink, instance.Tags) + return instance.host.zone.region.SetResourceTags(instance.SelfLink, instance.Tags) } case SECGROUP_TYPE_SERVICE_ACCOUNT: if len(instance.ServiceAccounts) > 0 { @@ -408,7 +408,7 @@ func (instance *SInstance) SetSecurityGroups(ids []string) error { instance.Tags.Items = append(instance.Tags.Items, tag) } } - err := instance.host.zone.region.SetTags(instance.SelfLink, instance.Tags) + err := instance.host.zone.region.SetResourceTags(instance.SelfLink, instance.Tags) if err != nil { return errors.Wrap(err, "SetTags") } @@ -801,7 +801,7 @@ func (region *SRegion) SetMetadata(id string, metadata SMetadata) error { return region.Do(id, "setMetadata", nil, jsonutils.Marshal(metadata)) } -func (region *SRegion) SetTags(id string, tags SInstanceTag) error { +func (region *SRegion) SetResourceTags(id string, tags SInstanceTag) error { return region.Do(id, "setTags", nil, jsonutils.Marshal(tags)) } diff --git a/pkg/multicloud/google/network.go b/pkg/multicloud/google/network.go index 85a78dfad0..a43c363af6 100644 --- a/pkg/multicloud/google/network.go +++ b/pkg/multicloud/google/network.go @@ -59,10 +59,6 @@ func (region *SRegion) GetNetwork(id string) (*SNetwork, error) { return network, region.Get(id, network) } -func (network *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (network *SNetwork) GetProjectId() string { return network.wire.vpc.region.GetProjectId() } diff --git a/pkg/multicloud/google/project.go b/pkg/multicloud/google/project.go index 8cc944513f..2e9e3b558d 100644 --- a/pkg/multicloud/google/project.go +++ b/pkg/multicloud/google/project.go @@ -17,13 +17,14 @@ package google import ( "time" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SProject struct { + multicloud.SResourceBase Name string CreateTime time.Time LifecycleState string @@ -95,7 +96,3 @@ func (p *SProject) Refresh() error { func (p *SProject) IsEmulated() bool { return false } - -func (p *SProject) GetMetadata() *jsonutils.JSONDict { - return nil -} diff --git a/pkg/multicloud/google/region.go b/pkg/multicloud/google/region.go index 5e0c6bbbd5..7397cc1a15 100644 --- a/pkg/multicloud/google/region.go +++ b/pkg/multicloud/google/region.go @@ -50,10 +50,6 @@ func (region *SRegion) GetClient() *SGoogleClient { return region.client } -func (region *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (region *SRegion) GetName() string { if name, ok := RegionNames[region.Name]; ok { return fmt.Sprintf("%s %s", CLOUD_PROVIDER_GOOGLE_CN, name) diff --git a/pkg/multicloud/google/resourcebase.go b/pkg/multicloud/google/resourcebase.go index 647db66f13..051783210d 100644 --- a/pkg/multicloud/google/resourcebase.go +++ b/pkg/multicloud/google/resourcebase.go @@ -17,6 +17,8 @@ package google import ( "fmt" "strings" + + "yunion.io/x/onecloud/pkg/cloudprovider" ) type SResourceBase struct { @@ -35,3 +37,15 @@ func (r *SResourceBase) GetGlobalId() string { func (r *SResourceBase) GetName() string { return r.Name } + +func (r *SResourceBase) GetSysTags() map[string]string { + return nil +} + +func (r *SResourceBase) GetTags() (map[string]string, error) { + return nil, cloudprovider.ErrNotImplemented +} + +func (r *SResourceBase) SetTags(tags map[string]string, replace bool) error { + return cloudprovider.ErrNotImplemented +} diff --git a/pkg/multicloud/google/resourcepolicy.go b/pkg/multicloud/google/resourcepolicy.go index 136bb49545..2c9d585c7c 100644 --- a/pkg/multicloud/google/resourcepolicy.go +++ b/pkg/multicloud/google/resourcepolicy.go @@ -118,10 +118,6 @@ func (policy *SResourcePolicy) IsEmulated() bool { return false } -func (policy *SResourcePolicy) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (policy *SResourcePolicy) GetProjectId() string { return policy.region.GetProjectId() } diff --git a/pkg/multicloud/google/securitygroup.go b/pkg/multicloud/google/securitygroup.go index 47a64cf401..1297db7187 100644 --- a/pkg/multicloud/google/securitygroup.go +++ b/pkg/multicloud/google/securitygroup.go @@ -190,10 +190,6 @@ func (secgroup *SSecurityGroup) GetName() string { return secgroup.vpc.globalnetwork.Name } -func (secgroup *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (secgroup *SSecurityGroup) GetStatus() string { return "" } diff --git a/pkg/multicloud/google/snapshot.go b/pkg/multicloud/google/snapshot.go index b89f61aa46..6b49bbc719 100644 --- a/pkg/multicloud/google/snapshot.go +++ b/pkg/multicloud/google/snapshot.go @@ -73,10 +73,6 @@ func (snapshot *SSnapshot) GetStatus() string { } } -func (snapshot *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (snapshot *SSnapshot) IsEmulated() bool { return false } diff --git a/pkg/multicloud/google/storage.go b/pkg/multicloud/google/storage.go index 090b4dd4f5..c55c7f079c 100644 --- a/pkg/multicloud/google/storage.go +++ b/pkg/multicloud/google/storage.go @@ -63,10 +63,6 @@ func (storage *SStorage) IsEmulated() bool { return true } -func (storage *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (storage *SStorage) Refresh() error { _storage, err := storage.zone.region.GetStorage(storage.SelfLink) if err != nil { diff --git a/pkg/multicloud/google/storagecache.go b/pkg/multicloud/google/storagecache.go index a134bef76d..d6f0b7bde2 100644 --- a/pkg/multicloud/google/storagecache.go +++ b/pkg/multicloud/google/storagecache.go @@ -32,19 +32,17 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion iimages []cloudprovider.ICloudImage } -func (cache *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (cache *SStoragecache) GetId() string { return cache.region.client.cpcfg.Id } diff --git a/pkg/multicloud/google/wire.go b/pkg/multicloud/google/wire.go index 1d75438427..1a94e0ffad 100644 --- a/pkg/multicloud/google/wire.go +++ b/pkg/multicloud/google/wire.go @@ -17,12 +17,12 @@ package google import ( "fmt" - "yunion.io/x/jsonutils" - "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase vpc *SVpc } @@ -84,10 +84,6 @@ func (wire *SWire) GetBandwidth() int { return 0 } -func (wire *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (wire *SWire) GetStatus() string { return "available" } diff --git a/pkg/multicloud/google/zone.go b/pkg/multicloud/google/zone.go index a51b62bca4..143b404d5d 100644 --- a/pkg/multicloud/google/zone.go +++ b/pkg/multicloud/google/zone.go @@ -17,13 +17,13 @@ package google import ( "fmt" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SZone struct { + multicloud.SResourceBase region *SRegion Description string @@ -105,10 +105,6 @@ func (zone *SZone) GetIStorages() ([]cloudprovider.ICloudStorage, error) { return istorages, nil } -func (zone *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (zone *SZone) IsEmulated() bool { return false } diff --git a/pkg/multicloud/huawei/bucket.go b/pkg/multicloud/huawei/bucket.go index 6077ab9370..ea50456e4b 100644 --- a/pkg/multicloud/huawei/bucket.go +++ b/pkg/multicloud/huawei/bucket.go @@ -694,7 +694,10 @@ func (b *SBucket) GetTags() (map[string]string, error) { return result, nil } -func (b *SBucket) SetTags(tags map[string]string) error { +func (b *SBucket) SetTags(tags map[string]string, replace bool) error { + if !replace { + return cloudprovider.ErrNotSupported + } obscli, err := b.region.getOBSClient() if err != nil { return errors.Wrap(err, "GetOBSClient") diff --git a/pkg/multicloud/huawei/disk.go b/pkg/multicloud/huawei/disk.go index a4bf6c55c8..8655224f62 100644 --- a/pkg/multicloud/huawei/disk.go +++ b/pkg/multicloud/huawei/disk.go @@ -192,6 +192,13 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_HUAWEI + + return data +} + func (self *SDisk) getResourceDetails() *SResourceDetail { if self.details != nil { return self.details diff --git a/pkg/multicloud/huawei/eip.go b/pkg/multicloud/huawei/eip.go index 58b2f67834..2d73bcdc9e 100644 --- a/pkg/multicloud/huawei/eip.go +++ b/pkg/multicloud/huawei/eip.go @@ -135,10 +135,6 @@ func (self *SEipAddress) IsEmulated() bool { return false } -func (self *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEipAddress) GetIpAddr() string { return self.PublicIPAddress } diff --git a/pkg/multicloud/huawei/elasticcache_instance.go b/pkg/multicloud/huawei/elasticcache_instance.go index 4565255c40..998d166fcf 100644 --- a/pkg/multicloud/huawei/elasticcache_instance.go +++ b/pkg/multicloud/huawei/elasticcache_instance.go @@ -742,7 +742,7 @@ func (self *SElasticcache) GetICloudElasticcacheBackup(backupId string) (cloudpr return nil, cloudprovider.ErrNotFound } -func (instance *SElasticcache) SetMetadata(tags map[string]string, replace bool) error { +func (instance *SElasticcache) SetTags(tags map[string]string, replace bool) error { return cloudprovider.ErrNotImplemented } diff --git a/pkg/multicloud/huawei/host.go b/pkg/multicloud/huawei/host.go index 419f7d5ba6..065ea9479b 100644 --- a/pkg/multicloud/huawei/host.go +++ b/pkg/multicloud/huawei/host.go @@ -60,10 +60,6 @@ func (self *SHost) IsEmulated() bool { return true } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetIVMs() ([]cloudprovider.ICloudVM, error) { vms, err := self.zone.region.GetInstances() if err != nil { diff --git a/pkg/multicloud/huawei/image.go b/pkg/multicloud/huawei/image.go index e00f96a6d4..4f66ed9b3d 100644 --- a/pkg/multicloud/huawei/image.go +++ b/pkg/multicloud/huawei/image.go @@ -213,6 +213,23 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SImage) GetSysTags() map[string]string { + data := map[string]string{} + if len(self.OSBit) > 0 { + data["os_arch"] = self.GetOsArch() + } + if len(self.OSType) > 0 { + data["os_name"] = self.GetOsType() + } + if len(self.Platform) > 0 { + data["os_distribution"] = self.GetOsDist() + } + if len(self.OSVersion) > 0 { + data["os_version"] = self.GetOsVersion() + } + return data +} + func (self *SImage) Delete(ctx context.Context) error { return self.storageCache.region.DeleteImage(self.GetId()) } diff --git a/pkg/multicloud/huawei/instance.go b/pkg/multicloud/huawei/instance.go index 59c29587c0..88cd8f0b05 100644 --- a/pkg/multicloud/huawei/instance.go +++ b/pkg/multicloud/huawei/instance.go @@ -268,6 +268,29 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + // cn-north-1::et2.2xlarge.16::win + lowerOs := self.GetOSType() + if strings.HasPrefix(lowerOs, "win") { + lowerOs = "win" + } + priceKey := fmt.Sprintf("%s::%s::%s", self.host.zone.region.GetId(), self.GetInstanceType(), lowerOs) + data["price_key"] = priceKey + data["zone_ext_id"] = self.host.zone.GetGlobalId() + if len(self.Metadata.MeteringImageID) > 0 { + if image, err := self.host.zone.region.GetImage(self.Metadata.MeteringImageID); err != nil { + log.Errorf("Failed to find image %s for instance %s zone %s", self.Metadata.MeteringImageID, self.GetId(), self.OSEXTAZAvailabilityZone) + } else { + meta := image.GetSysTags() + for k, v := range meta { + data[k] = v + } + } + } + return data +} + func (self *SInstance) GetBillingType() string { // https://support.huaweicloud.com/api-ecs/zh-cn_topic_0094148849.html // charging_mode “0”:按需计费 “1”:按包年包月计费 diff --git a/pkg/multicloud/huawei/loadbalancer.go b/pkg/multicloud/huawei/loadbalancer.go index bb4cf03b06..9445122efe 100644 --- a/pkg/multicloud/huawei/loadbalancer.go +++ b/pkg/multicloud/huawei/loadbalancer.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) var LB_ALGORITHM_MAP = map[string]string{ @@ -58,6 +59,7 @@ var LB_HEALTHCHECK_TYPE_MAP = map[string]string{ } type SLoadbalancer struct { + multicloud.SResourceBase region *SRegion subnet *SNetwork eip *SEipAddress @@ -551,6 +553,6 @@ func (self *SRegion) DeleteLoadbalancerHealthCheck(healthCheckID string) error { return DoDelete(self.ecsClient.ElbHealthCheck.Delete, healthCheckID, nil, nil) } -func (self *SLoadbalancer) SetMetadata(tags map[string]string, replace bool) error { +func (self *SLoadbalancer) SetTags(tags map[string]string, replace bool) error { return cloudprovider.ErrNotSupported } diff --git a/pkg/multicloud/huawei/loadbalancer_acl.go b/pkg/multicloud/huawei/loadbalancer_acl.go index 1aa8a330d8..289492fea7 100644 --- a/pkg/multicloud/huawei/loadbalancer_acl.go +++ b/pkg/multicloud/huawei/loadbalancer_acl.go @@ -21,9 +21,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbACL struct { + multicloud.SResourceBase region *SRegion ID string `json:"id"` @@ -75,10 +77,6 @@ func (self *SElbACL) IsEmulated() bool { return false } -func (self *SElbACL) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SElbACL) GetProjectId() string { return "" } diff --git a/pkg/multicloud/huawei/loadbalancer_backend.go b/pkg/multicloud/huawei/loadbalancer_backend.go index 56651a87df..2e13d2fdb1 100644 --- a/pkg/multicloud/huawei/loadbalancer_backend.go +++ b/pkg/multicloud/huawei/loadbalancer_backend.go @@ -23,9 +23,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbBackend struct { + multicloud.SResourceBase region *SRegion lb *SLoadbalancer backendGroup *SElbBackendGroup @@ -85,10 +87,6 @@ func (self *SElbBackend) IsEmulated() bool { return false } -func (self *SElbBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SElbBackend) GetProjectId() string { return "" } diff --git a/pkg/multicloud/huawei/loadbalancer_backendgroup.go b/pkg/multicloud/huawei/loadbalancer_backendgroup.go index 47f34b5636..881fe120c9 100644 --- a/pkg/multicloud/huawei/loadbalancer_backendgroup.go +++ b/pkg/multicloud/huawei/loadbalancer_backendgroup.go @@ -25,9 +25,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer region *SRegion @@ -208,10 +210,6 @@ func (self *SElbBackendGroup) IsEmulated() bool { return false } -func (self *SElbBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SElbBackendGroup) GetProjectId() string { return self.ProjectID } diff --git a/pkg/multicloud/huawei/loadbalancer_cert.go b/pkg/multicloud/huawei/loadbalancer_cert.go index b2096b8632..f27bb9cfa2 100644 --- a/pkg/multicloud/huawei/loadbalancer_cert.go +++ b/pkg/multicloud/huawei/loadbalancer_cert.go @@ -23,9 +23,11 @@ import ( "yunion.io/x/jsonutils" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbCert struct { + multicloud.SResourceBase region *SRegion Certificate string `json:"certificate"` @@ -85,10 +87,6 @@ func (self *SElbCert) IsEmulated() bool { return false } -func (self *SElbCert) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SElbCert) GetProjectId() string { return "" } diff --git a/pkg/multicloud/huawei/loadbalancer_listener.go b/pkg/multicloud/huawei/loadbalancer_listener.go index 191cc33f97..9dc0748924 100644 --- a/pkg/multicloud/huawei/loadbalancer_listener.go +++ b/pkg/multicloud/huawei/loadbalancer_listener.go @@ -23,6 +23,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type InsertHeaders struct { @@ -34,6 +35,7 @@ type Loadbalancer struct { } type SElbListener struct { + multicloud.SResourceBase lb *SLoadbalancer acl *SElbACL backendgroup *SElbBackendGroup @@ -92,10 +94,6 @@ func (self *SElbListener) IsEmulated() bool { return false } -func (self *SElbListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SElbListener) GetProjectId() string { return self.ProjectID } diff --git a/pkg/multicloud/huawei/loadbalancer_listener_rule.go b/pkg/multicloud/huawei/loadbalancer_listener_rule.go index b132d0fc02..8d4144140f 100644 --- a/pkg/multicloud/huawei/loadbalancer_listener_rule.go +++ b/pkg/multicloud/huawei/loadbalancer_listener_rule.go @@ -21,9 +21,11 @@ import ( "yunion.io/x/log" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SElbListenerPolicy struct { + multicloud.SResourceBase region *SRegion lb *SLoadbalancer listener *SElbListener @@ -104,10 +106,6 @@ func (self *SElbListenerPolicy) IsEmulated() bool { return false } -func (self *SElbListenerPolicy) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SElbListenerPolicy) GetProjectId() string { return "" } diff --git a/pkg/multicloud/huawei/network.go b/pkg/multicloud/huawei/network.go index 721c95b7af..50a5ab8560 100644 --- a/pkg/multicloud/huawei/network.go +++ b/pkg/multicloud/huawei/network.go @@ -21,6 +21,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/multicloud/huawei/client/modules" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -31,6 +32,7 @@ Subnets // https://support.huaweicloud.com/api-vpc/zh-cn_topic_0020090590.html type SNetwork struct { + multicloud.SResourceBase wire *SWire AvailabilityZone string `json:"availability_zone"` @@ -90,10 +92,6 @@ func (self *SNetwork) IsEmulated() bool { return false } -func (self *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SNetwork) GetIWire() cloudprovider.ICloudWire { return self.wire } diff --git a/pkg/multicloud/huawei/region.go b/pkg/multicloud/huawei/region.go index a32f203991..aeae4a076f 100644 --- a/pkg/multicloud/huawei/region.go +++ b/pkg/multicloud/huawei/region.go @@ -371,10 +371,6 @@ func (self *SRegion) IsEmulated() bool { return false } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetLatitude() float32 { if locationInfo, ok := LatitudeAndLongitude[self.ID]; ok { return locationInfo.Latitude diff --git a/pkg/multicloud/huawei/routetable.go b/pkg/multicloud/huawei/routetable.go index 5e160f2c1a..4c520659f1 100644 --- a/pkg/multicloud/huawei/routetable.go +++ b/pkg/multicloud/huawei/routetable.go @@ -22,6 +22,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // date: 2019.07.15 @@ -37,6 +38,7 @@ const ( ) type SRouteEntry struct { + multicloud.SResourceBase routeTable *SRouteTable ID string // route ID @@ -72,10 +74,6 @@ func (route *SRouteEntry) IsEmulated() bool { return false } -func (route *SRouteEntry) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (route *SRouteEntry) GetType() string { if route.Type == ROUTE_TYPE_PEER { return api.ROUTE_ENTRY_TYPE_CUSTOM @@ -104,6 +102,7 @@ func (route *SRouteEntry) GetNextHop() string { // SRouteTable has no ID and Name because there is no id or name of route table in huawei cloud. // And some method such as GetId and GetName of ICloudRouteTable has no practical meaning type SRouteTable struct { + multicloud.SResourceBase region *SRegion vpc *SVpc @@ -147,10 +146,6 @@ func (self *SRouteTable) IsEmulated() bool { return false } -func (self *SRouteTable) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteTable) GetDescription() string { return self.Description } diff --git a/pkg/multicloud/huawei/snapshot.go b/pkg/multicloud/huawei/snapshot.go index bdc1290149..921e83ac81 100644 --- a/pkg/multicloud/huawei/snapshot.go +++ b/pkg/multicloud/huawei/snapshot.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) /* @@ -47,6 +48,7 @@ type Metadata struct { // https://support.huaweicloud.com/api-evs/zh-cn_topic_0051408624.html type SSnapshot struct { + multicloud.SResourceBase region *SRegion Metadata Metadata `json:"metadata"` @@ -108,10 +110,6 @@ func (self *SSnapshot) IsEmulated() bool { return false } -func (self *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshot) GetSizeMb() int32 { return self.Size * 1024 } diff --git a/pkg/multicloud/huawei/storage.go b/pkg/multicloud/huawei/storage.go index 214cd8aa1c..c78ba0ab56 100644 --- a/pkg/multicloud/huawei/storage.go +++ b/pkg/multicloud/huawei/storage.go @@ -23,10 +23,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStorage struct { - zone *SZone + zone *SZone + multicloud.SResourceBase storageType string // volume_type 目前支持“SSD”,“SAS”和“SATA”三种 } @@ -54,10 +56,6 @@ func (self *SStorage) IsEmulated() bool { return true } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetIStoragecache() cloudprovider.ICloudStoragecache { return self.zone.region.getStoragecache() } diff --git a/pkg/multicloud/huawei/storagecache.go b/pkg/multicloud/huawei/storagecache.go index 18cccde3c1..6aaede9293 100644 --- a/pkg/multicloud/huawei/storagecache.go +++ b/pkg/multicloud/huawei/storagecache.go @@ -31,10 +31,12 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } @@ -66,10 +68,6 @@ func (self *SStoragecache) IsEmulated() bool { return false } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetICloudImages() ([]cloudprovider.ICloudImage, error) { return nil, cloudprovider.ErrNotImplemented } diff --git a/pkg/multicloud/huawei/vpc.go b/pkg/multicloud/huawei/vpc.go index 5f0d128802..c2c727be57 100644 --- a/pkg/multicloud/huawei/vpc.go +++ b/pkg/multicloud/huawei/vpc.go @@ -130,10 +130,6 @@ func (self *SVpc) IsEmulated() bool { return false } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/huawei/wire.go b/pkg/multicloud/huawei/wire.go index e6a2de4d0b..5389239dfc 100644 --- a/pkg/multicloud/huawei/wire.go +++ b/pkg/multicloud/huawei/wire.go @@ -24,10 +24,12 @@ import ( "yunion.io/x/pkg/util/netutils" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // 华为云的子网有点特殊。子网在整个region可用。 type SWire struct { + multicloud.SResourceBase region *SRegion vpc *SVpc @@ -58,10 +60,6 @@ func (self *SWire) IsEmulated() bool { return true } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SWire) GetIVpc() cloudprovider.ICloudVpc { return self.vpc } diff --git a/pkg/multicloud/huawei/zone.go b/pkg/multicloud/huawei/zone.go index 50f0d0c412..3fc071b58b 100644 --- a/pkg/multicloud/huawei/zone.go +++ b/pkg/multicloud/huawei/zone.go @@ -17,12 +17,12 @@ package huawei import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) var StorageTypes = []string{ @@ -37,6 +37,7 @@ type ZoneState struct { // https://support.huaweicloud.com/api-ecs/zh-cn_topic_0065817728.html type SZone struct { + multicloud.SResourceBase region *SRegion host *SHost @@ -110,10 +111,6 @@ func (self *SZone) IsEmulated() bool { return false } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetIRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/instance_base.go b/pkg/multicloud/instance_base.go index 5d2c7cf5e2..808ab8d0fd 100644 --- a/pkg/multicloud/instance_base.go +++ b/pkg/multicloud/instance_base.go @@ -47,10 +47,6 @@ func (instance *SInstanceBase) LiveMigrateVM(hostId string) error { return cloudprovider.ErrNotImplemented } -func (instance *SInstanceBase) SetMetadata(tags map[string]string, replace bool) error { - return cloudprovider.ErrNotImplemented -} - func (instance *SInstanceBase) GetInstanceSnapshot(idStr string) (cloudprovider.ICloudInstanceSnapshot, error) { return nil, cloudprovider.ErrNotImplemented } diff --git a/pkg/multicloud/objectstore/buckets.go b/pkg/multicloud/objectstore/buckets.go index e190d1e954..53b26683cc 100644 --- a/pkg/multicloud/objectstore/buckets.go +++ b/pkg/multicloud/objectstore/buckets.go @@ -22,7 +22,6 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" "yunion.io/x/s3cli" @@ -55,10 +54,6 @@ func (bucket *SBucket) GetStatus() string { return api.BUCKET_STATUS_READY } -func (bucket *SBucket) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (bucket *SBucket) GetProjectId() string { return "" } diff --git a/pkg/multicloud/objectstore/shell.go b/pkg/multicloud/objectstore/shell.go index d8ec993fed..1f885969d1 100644 --- a/pkg/multicloud/objectstore/shell.go +++ b/pkg/multicloud/objectstore/shell.go @@ -639,7 +639,7 @@ func S3Shell() { if err != nil { return err } - meta := bucket.GetMetadata() + meta, _ := bucket.GetTags() printObject(meta) return nil }) diff --git a/pkg/multicloud/openstack/disk.go b/pkg/multicloud/openstack/disk.go index 34259e30b4..fdabbe8d34 100644 --- a/pkg/multicloud/openstack/disk.go +++ b/pkg/multicloud/openstack/disk.go @@ -127,6 +127,12 @@ func (disk *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (disk *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_OPENSTACK + return data +} + func (region *SRegion) GetDisks() ([]SDisk, error) { disks := []SDisk{} resource := "/volumes/detail" diff --git a/pkg/multicloud/openstack/eip.go b/pkg/multicloud/openstack/eip.go index facb1dc8a6..6a9b3e7dc0 100644 --- a/pkg/multicloud/openstack/eip.go +++ b/pkg/multicloud/openstack/eip.go @@ -157,10 +157,6 @@ func (eip *SEipAddress) IsEmulated() bool { return false } -func (eip *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (eip *SEipAddress) GetIpAddr() string { return eip.FloatingIPAddress } diff --git a/pkg/multicloud/openstack/flavor.go b/pkg/multicloud/openstack/flavor.go index 07887a45b7..9d583c1951 100644 --- a/pkg/multicloud/openstack/flavor.go +++ b/pkg/multicloud/openstack/flavor.go @@ -164,10 +164,6 @@ func (flavor *SFlavor) Delete() error { return flavor.region.DeleteFlavor(flavor.Id) } -func (flavor *SFlavor) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (flavor *SFlavor) IsEmulated() bool { return false } diff --git a/pkg/multicloud/openstack/image.go b/pkg/multicloud/openstack/image.go index 39f158ef08..a5ee0c1a55 100644 --- a/pkg/multicloud/openstack/image.go +++ b/pkg/multicloud/openstack/image.go @@ -131,10 +131,6 @@ func (region *SRegion) GetImages(name string, status string, imageId string) ([] return images, nil } -func (image *SImage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (image *SImage) GetId() string { return image.Id } diff --git a/pkg/multicloud/openstack/loadbalabcerpool.go b/pkg/multicloud/openstack/loadbalabcerpool.go index 846b584293..89917e5243 100644 --- a/pkg/multicloud/openstack/loadbalabcerpool.go +++ b/pkg/multicloud/openstack/loadbalabcerpool.go @@ -26,6 +26,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerPoolCreateParams struct { @@ -67,6 +68,7 @@ type SSessionPersistence struct { } type SLoadbalancerPool struct { + multicloud.SResourceBase region *SRegion members []SLoadbalancerMember healthmonitor *SLoadbalancerHealthmonitor @@ -255,10 +257,6 @@ func (pool *SLoadbalancerPool) GetType() string { return api.LB_BACKENDGROUP_TYPE_NORMAL } -func (pool *SLoadbalancerPool) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (pool *SLoadbalancerPool) IsEmulated() bool { return false } diff --git a/pkg/multicloud/openstack/loadbalanceracl.go b/pkg/multicloud/openstack/loadbalanceracl.go index 3d096e778a..bb5fd65080 100644 --- a/pkg/multicloud/openstack/loadbalanceracl.go +++ b/pkg/multicloud/openstack/loadbalanceracl.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type AclEntrys struct { @@ -35,6 +36,7 @@ type AclEntry struct { } type SLoadbalancerAcl struct { + multicloud.SResourceBase listener *SLoadbalancerListener } @@ -58,10 +60,6 @@ func (acl *SLoadbalancerAcl) GetStatus() string { return "" } -func (acl *SLoadbalancerAcl) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (acl *SLoadbalancerAcl) IsEmulated() bool { return false } diff --git a/pkg/multicloud/openstack/loadbalancerl7policy.go b/pkg/multicloud/openstack/loadbalancerl7policy.go index df92e59f89..1b1de095b8 100644 --- a/pkg/multicloud/openstack/loadbalancerl7policy.go +++ b/pkg/multicloud/openstack/loadbalancerl7policy.go @@ -22,6 +22,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerL7PolicyCreateParams struct { @@ -39,6 +40,7 @@ type SLoadbalancerL7PolicyCreateParams struct { } type SLoadbalancerL7Policy struct { + multicloud.SResourceBase region *SRegion l7rules []SLoadbalancerL7Rule ListenerID string `json:"listener_id"` @@ -164,6 +166,3 @@ func (L7policy *SLoadbalancerL7Policy) Refresh() error { func (L7policy *SLoadbalancerL7Policy) IsEmulated() bool { return false } -func (L7policy *SLoadbalancerL7Policy) GetMetadata() *jsonutils.JSONDict { - return nil -} diff --git a/pkg/multicloud/openstack/loadbalancerl7rule.go b/pkg/multicloud/openstack/loadbalancerl7rule.go index ecdf8035e0..a95ce0e20f 100644 --- a/pkg/multicloud/openstack/loadbalancerl7rule.go +++ b/pkg/multicloud/openstack/loadbalancerl7rule.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerL7RuleCreateParams struct { @@ -36,6 +37,7 @@ type SLoadbalancerL7RuleCreateParams struct { } type SLoadbalancerL7Rule struct { + multicloud.SResourceBase policy *SLoadbalancerL7Policy CreatedAt string `json:"created_at"` CompareType string `json:"compare_type"` @@ -151,10 +153,6 @@ func (l7r *SLoadbalancerL7Rule) GetStatus() string { } } -func (l7r *SLoadbalancerL7Rule) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLoadbalancerL7Rule) IsDefault() bool { return false } diff --git a/pkg/multicloud/openstack/loadbalancerlistener.go b/pkg/multicloud/openstack/loadbalancerlistener.go index 18b4806668..0d7b60b06f 100644 --- a/pkg/multicloud/openstack/loadbalancerlistener.go +++ b/pkg/multicloud/openstack/loadbalancerlistener.go @@ -28,6 +28,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerListenerCreateParams struct { @@ -83,6 +84,7 @@ type SInsertHeaders struct { } type SLoadbalancerListener struct { + multicloud.SResourceBase region *SRegion l7policies []SLoadbalancerL7Policy pools []SLoadbalancerPool @@ -151,10 +153,6 @@ func (listener *SLoadbalancerListener) GetStatus() string { } } -func (listener *SLoadbalancerListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (listener *SLoadbalancerListener) IsEmulated() bool { return false } diff --git a/pkg/multicloud/openstack/loadbalancermember.go b/pkg/multicloud/openstack/loadbalancermember.go index 8c10147999..6df1e04514 100644 --- a/pkg/multicloud/openstack/loadbalancermember.go +++ b/pkg/multicloud/openstack/loadbalancermember.go @@ -25,6 +25,7 @@ import ( "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerMemberCreateParams struct { @@ -40,6 +41,7 @@ type SLoadbalancerMemberCreateParams struct { } type SLoadbalancerMember struct { + multicloud.SResourceBase poolID string region *SRegion MonitorPort int `json:"monitor_port"` @@ -89,10 +91,6 @@ func (member *SLoadbalancerMember) GetStatus() string { } } -func (member *SLoadbalancerMember) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (member *SLoadbalancerMember) IsEmulated() bool { return false } diff --git a/pkg/multicloud/openstack/loadbalbacer.go b/pkg/multicloud/openstack/loadbalbacer.go index 5719ad1e66..205072785a 100644 --- a/pkg/multicloud/openstack/loadbalbacer.go +++ b/pkg/multicloud/openstack/loadbalbacer.go @@ -162,10 +162,6 @@ func (lb *SLoadbalancer) GetStatus() string { } } -func (lb *SLoadbalancer) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (lb *SLoadbalancer) GetAddress() string { return lb.VipAddress } @@ -492,6 +488,6 @@ func (lb *SLoadbalancer) GetProjectId() string { return lb.ProjectID } -func (self *SLoadbalancer) SetMetadata(tags map[string]string, replace bool) error { +func (self *SLoadbalancer) SetTags(tags map[string]string, replace bool) error { return cloudprovider.ErrNotSupported } diff --git a/pkg/multicloud/openstack/loadbalbancerhealthmonitor.go b/pkg/multicloud/openstack/loadbalbancerhealthmonitor.go index dfffc00f20..fa33c59bf9 100644 --- a/pkg/multicloud/openstack/loadbalbancerhealthmonitor.go +++ b/pkg/multicloud/openstack/loadbalbancerhealthmonitor.go @@ -22,6 +22,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLoadbalancerHealthmonitorCreateParams struct { @@ -57,6 +58,7 @@ type SLoadbalancerHealthmonitorUpdateParams struct { } type SLoadbalancerHealthmonitor struct { + multicloud.SResourceBase region *SRegion ProjectID string `json:"project_id"` Name string `json:"name"` @@ -221,6 +223,3 @@ func (healthmonitor *SLoadbalancerHealthmonitor) Refresh() error { func (healthmonitor *SLoadbalancerHealthmonitor) IsEmulated() bool { return false } -func (healthmonitor *SLoadbalancerHealthmonitor) GetMetadata() *jsonutils.JSONDict { - return nil -} diff --git a/pkg/multicloud/openstack/network.go b/pkg/multicloud/openstack/network.go index 4844f97910..dcbd723e9e 100644 --- a/pkg/multicloud/openstack/network.go +++ b/pkg/multicloud/openstack/network.go @@ -28,6 +28,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -91,6 +92,7 @@ type SNextLink struct { } type SNetwork struct { + multicloud.SResourceBase wire *SWire Name string @@ -117,10 +119,6 @@ type SNetwork struct { UpdatedAt time.Time } -func (network *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (network *SNetwork) GetId() string { return network.Id } diff --git a/pkg/multicloud/openstack/nova_disk.go b/pkg/multicloud/openstack/nova_disk.go index b9bbd6557b..292fed4987 100644 --- a/pkg/multicloud/openstack/nova_disk.go +++ b/pkg/multicloud/openstack/nova_disk.go @@ -19,8 +19,6 @@ import ( "fmt" "time" - "yunion.io/x/jsonutils" - billing_api "yunion.io/x/onecloud/pkg/apis/billing" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" @@ -35,10 +33,6 @@ type SNovaDisk struct { instanceId string } -func (disk *SNovaDisk) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (disk *SNovaDisk) GetId() string { return disk.instanceId } diff --git a/pkg/multicloud/openstack/novastorage.go b/pkg/multicloud/openstack/novastorage.go index 876b6e2b13..a4128f2f47 100644 --- a/pkg/multicloud/openstack/novastorage.go +++ b/pkg/multicloud/openstack/novastorage.go @@ -21,17 +21,15 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SNovaStorage struct { + multicloud.SResourceBase host *SHypervisor zone *SZone } -func (storage *SNovaStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (storage *SNovaStorage) GetId() string { return fmt.Sprintf("%s-%s-%s", storage.zone.GetGlobalId(), storage.host.GetId(), storage.GetName()) } diff --git a/pkg/multicloud/openstack/project.go b/pkg/multicloud/openstack/project.go index 800671531a..8ea2ef3322 100644 --- a/pkg/multicloud/openstack/project.go +++ b/pkg/multicloud/openstack/project.go @@ -18,16 +18,17 @@ import ( "fmt" "net/url" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/httputils" ) type SProject struct { + multicloud.SResourceBase client *SOpenStackClient Description string Enabled bool @@ -43,10 +44,6 @@ func (p *SProject) GetGlobalId() string { return p.GetId() } -func (p *SProject) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (p *SProject) GetName() string { return p.Name } diff --git a/pkg/multicloud/openstack/region.go b/pkg/multicloud/openstack/region.go index 1a783ce5f6..fb86772aa9 100644 --- a/pkg/multicloud/openstack/region.go +++ b/pkg/multicloud/openstack/region.go @@ -59,10 +59,6 @@ func (region *SRegion) GetClient() *SOpenStackClient { return region.client } -func (region *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (region *SRegion) GetId() string { return region.Name } diff --git a/pkg/multicloud/openstack/routetable.go b/pkg/multicloud/openstack/routetable.go index cd9fc08d8b..a14f00b28e 100644 --- a/pkg/multicloud/openstack/routetable.go +++ b/pkg/multicloud/openstack/routetable.go @@ -15,13 +15,13 @@ package openstack import ( - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SRouteEntry struct { + multicloud.SResourceBase Destination string `json:"destination"` Nexthop string `json:"nexthop"` } @@ -48,10 +48,6 @@ func (route *SRouteEntry) IsEmulated() bool { return false } -func (route *SRouteEntry) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (route *SRouteEntry) GetType() string { return api.ROUTE_ENTRY_TYPE_CUSTOM } @@ -69,6 +65,7 @@ func (route *SRouteEntry) GetNextHop() string { } type SRouteTable struct { + multicloud.SResourceBase vpc *SVpc entries []SRouteEntry router *SRouter @@ -90,10 +87,6 @@ func (self *SRouteTable) GetName() string { return self.router.Name } -func (self *SRouteTable) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteTable) GetRegionId() string { return self.vpc.region.GetId() } diff --git a/pkg/multicloud/openstack/securitygroup.go b/pkg/multicloud/openstack/securitygroup.go index 466e0c6319..a928da5afe 100644 --- a/pkg/multicloud/openstack/securitygroup.go +++ b/pkg/multicloud/openstack/securitygroup.go @@ -117,10 +117,6 @@ func (region *SRegion) GetSecurityGroups(projectId, name string) ([]SSecurityGro return secgroups, nil } -func (secgroup *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (secgroup *SSecurityGroup) GetVpcId() string { return "normal" } diff --git a/pkg/multicloud/openstack/snapshot.go b/pkg/multicloud/openstack/snapshot.go index 4164f73bd2..fb43e2241c 100644 --- a/pkg/multicloud/openstack/snapshot.go +++ b/pkg/multicloud/openstack/snapshot.go @@ -23,6 +23,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) const ( @@ -38,6 +39,7 @@ const ( ) type SSnapshot struct { + multicloud.SResourceBase region *SRegion Id string @@ -143,10 +145,6 @@ func (region *SRegion) GetISnapshots() ([]cloudprovider.ICloudSnapshot, error) { return isnapshots, nil } -func (snapshot *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (snapshot *SSnapshot) GetSizeMb() int32 { return snapshot.Size * 1024 } diff --git a/pkg/multicloud/openstack/storage.go b/pkg/multicloud/openstack/storage.go index 276019cd92..f2ad101f81 100644 --- a/pkg/multicloud/openstack/storage.go +++ b/pkg/multicloud/openstack/storage.go @@ -26,6 +26,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) const ( @@ -37,16 +38,13 @@ type SExtraSpecs struct { } type SStorage struct { + multicloud.SResourceBase zone *SZone Name string ExtraSpecs SExtraSpecs ID string } -func (storage *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (storage *SStorage) GetId() string { return storage.ID } diff --git a/pkg/multicloud/openstack/storagecache.go b/pkg/multicloud/openstack/storagecache.go index c5bfde30b4..d4d6544550 100644 --- a/pkg/multicloud/openstack/storagecache.go +++ b/pkg/multicloud/openstack/storagecache.go @@ -29,17 +29,15 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } -func (cache *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (cache *SStoragecache) GetId() string { return fmt.Sprintf("%s-%s", cache.region.client.cpcfg.Id, cache.region.GetId()) } diff --git a/pkg/multicloud/openstack/wire.go b/pkg/multicloud/openstack/wire.go index 4eec8e38b0..a3660af402 100644 --- a/pkg/multicloud/openstack/wire.go +++ b/pkg/multicloud/openstack/wire.go @@ -17,21 +17,18 @@ package openstack import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase zone *SZone vpc *SVpc } -func (wire *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (wire *SWire) GetId() string { return fmt.Sprintf("%s-%s", wire.vpc.GetId(), wire.zone.GetId()) } diff --git a/pkg/multicloud/openstack/zone.go b/pkg/multicloud/openstack/zone.go index a264823aa8..a55f0e5f2d 100644 --- a/pkg/multicloud/openstack/zone.go +++ b/pkg/multicloud/openstack/zone.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type ZoneState struct { @@ -37,6 +38,7 @@ type HostState struct { } type SZone struct { + multicloud.SResourceBase region *SRegion ZoneName string @@ -47,10 +49,6 @@ type SZone struct { hosts []SHypervisor } -func (zone *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (zone *SZone) GetId() string { return zone.ZoneName } diff --git a/pkg/multicloud/qcloud/bucket.go b/pkg/multicloud/qcloud/bucket.go index 602a7c66ce..a0d4a3b096 100644 --- a/pkg/multicloud/qcloud/bucket.go +++ b/pkg/multicloud/qcloud/bucket.go @@ -1091,7 +1091,10 @@ func (b *SBucket) GetTags() (map[string]string, error) { return result, nil } -func (b *SBucket) SetTags(tags map[string]string) error { +func (b *SBucket) SetTags(tags map[string]string, replace bool) error { + if !replace { + return cloudprovider.ErrNotSupported + } coscli, err := b.region.GetCosClient(b) if err != nil { log.Errorf("GetCosClient fail %s", err) diff --git a/pkg/multicloud/qcloud/certificate.go b/pkg/multicloud/qcloud/certificate.go index cf9a65a9fa..a3d8d994cd 100644 --- a/pkg/multicloud/qcloud/certificate.go +++ b/pkg/multicloud/qcloud/certificate.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type projectInfo struct { @@ -39,6 +40,7 @@ type projectInfo struct { // https://cloud.tencent.com/document/api/400/13675 type SCertificate struct { + multicloud.SResourceBase region *SRegion CertificateID string `json:"CertificateId"` @@ -134,10 +136,6 @@ func (self *SCertificate) IsEmulated() bool { return false } -func (self *SCertificate) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SCertificate) GetCommonName() string { return self.Domain } diff --git a/pkg/multicloud/qcloud/cloud_connect_network_route.go b/pkg/multicloud/qcloud/cloud_connect_network_route.go index e7558c751d..32c5c7f04f 100644 --- a/pkg/multicloud/qcloud/cloud_connect_network_route.go +++ b/pkg/multicloud/qcloud/cloud_connect_network_route.go @@ -22,9 +22,11 @@ import ( "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SCcnRouteSet struct { + multicloud.SResourceBase RouteID string `json:"RouteId"` DestinationCidrBlock string `json:"DestinationCidrBlock"` InstanceType string `json:"InstanceType"` @@ -132,10 +134,6 @@ func (self *SCcnRouteSet) IsEmulated() bool { return false } -func (self *SCcnRouteSet) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SCcnRouteSet) GetInstanceId() string { return self.InstanceID } diff --git a/pkg/multicloud/qcloud/disk.go b/pkg/multicloud/qcloud/disk.go index a4b12a6340..7ea7b52000 100644 --- a/pkg/multicloud/qcloud/disk.go +++ b/pkg/multicloud/qcloud/disk.go @@ -95,6 +95,17 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + + // // The pricingInfo key structure is 'RegionId::DiskCategory::DiskType + // priceKey := fmt.Sprintf("%s::%s::%s", self.RegionId, self.Category, self.Type) + // data.Add(jsonutils.NewString(priceKey), "price_key") + + data["hypervisor"] = api.HYPERVISOR_QCLOUD + return data +} + func (self *SRegion) GetDisks(instanceId string, zoneId string, category string, diskIds []string, offset int, limit int) ([]SDisk, int, error) { if limit > 50 || limit <= 0 { limit = 50 diff --git a/pkg/multicloud/qcloud/eip.go b/pkg/multicloud/qcloud/eip.go index 149d0efaca..b37b463f09 100644 --- a/pkg/multicloud/qcloud/eip.go +++ b/pkg/multicloud/qcloud/eip.go @@ -124,10 +124,6 @@ func (self *SEipAddress) IsEmulated() bool { } } -func (self *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SEipAddress) GetIpAddr() string { return self.AddressIp } diff --git a/pkg/multicloud/qcloud/elasticcache_instance.go b/pkg/multicloud/qcloud/elasticcache_instance.go index 97b67e189e..95836651d1 100644 --- a/pkg/multicloud/qcloud/elasticcache_instance.go +++ b/pkg/multicloud/qcloud/elasticcache_instance.go @@ -14,10 +14,12 @@ import ( billing_api "yunion.io/x/onecloud/pkg/apis/billing" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/billing" ) type SElasticcache struct { + multicloud.SResourceBase region *SRegion MaintenanceTime *MaintenanceTime `json:"maintenance_time"` @@ -59,7 +61,7 @@ type SElasticcache struct { ZoneID int `json:"ZoneId"` } -func (self *SElasticcache) SetMetadata(tags map[string]string, replace bool) error { +func (self *SElasticcache) SetTags(tags map[string]string, replace bool) error { return self.region.SetResourceTags("redis", "instance", []string{self.InstanceID}, tags, replace) } @@ -239,6 +241,17 @@ func (self *SElasticcache) GetMetadata() *jsonutils.JSONDict { return meta } +func (self *SElasticcache) GetTags() (map[string]string, error) { + tags, err := self.region.FetchResourceTags("redis", "instance", []string{self.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "self.region.FetchResourceTags") + } + if _, ok := tags[self.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[self.GetId()], nil +} + func (self *SElasticcache) GetProjectId() string { return strconv.Itoa(self.ProjectID) } diff --git a/pkg/multicloud/qcloud/host.go b/pkg/multicloud/qcloud/host.go index 0767ebf913..22583e12e3 100644 --- a/pkg/multicloud/qcloud/host.go +++ b/pkg/multicloud/qcloud/host.go @@ -33,10 +33,6 @@ type SHost struct { zone *SZone } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetId() string { return fmt.Sprintf("%s-%s", self.zone.region.client.cpcfg.Id, self.zone.GetId()) } diff --git a/pkg/multicloud/qcloud/image.go b/pkg/multicloud/qcloud/image.go index 0220e26e24..6498e386ad 100644 --- a/pkg/multicloud/qcloud/image.go +++ b/pkg/multicloud/qcloud/image.go @@ -115,10 +115,6 @@ func (self *SRegion) GetImages(status string, owner string, imageIds []string, n return images, int(total), nil } -func (self *SImage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SImage) GetId() string { return self.ImageId } diff --git a/pkg/multicloud/qcloud/instance.go b/pkg/multicloud/qcloud/instance.go index cd51f1355e..3e71e08b77 100644 --- a/pkg/multicloud/qcloud/instance.go +++ b/pkg/multicloud/qcloud/instance.go @@ -192,6 +192,37 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + if self.image == nil { + image, err := self.host.zone.region.GetImage(self.ImageId) + if err == nil { + self.image = image + } + } + + if self.image != nil { + data["os_distribution"] = self.image.OsName + } + + priceKey := fmt.Sprintf("%s::%s", self.host.zone.Zone, self.InstanceType) + data["price_key"] = priceKey + + data["zone_ext_id"] = self.host.zone.GetGlobalId() + return data +} + +func (self *SInstance) GetTags() (map[string]string, error) { + mtags, err := self.host.zone.region.FetchResourceTags("cvm", "instance", []string{self.InstanceId}) + if err != nil { + return nil, errors.Wrap(err, "self.host.zone.region.FetchResourceTags") + } + if tags, ok := mtags[self.InstanceId]; ok { + return *tags, nil + } + return nil, cloudprovider.ErrNotFound +} + func (self *SInstance) getCloudMetadata() (map[string]string, error) { mtags, err := self.host.zone.region.FetchResourceTags("cvm", "instance", []string{self.InstanceId}) if err != nil { @@ -1012,7 +1043,7 @@ func (self *SInstance) SetAutoRenew(autoRenew bool) error { return self.host.zone.region.SetInstanceAutoRenew(self.InstanceId, autoRenew) } -func (self *SInstance) SetMetadata(tags map[string]string, replace bool) error { +func (self *SInstance) SetTags(tags map[string]string, replace bool) error { return self.host.zone.region.SetResourceTags("cvm", "instance", []string{self.InstanceId}, tags, replace) } diff --git a/pkg/multicloud/qcloud/loadbalancer.go b/pkg/multicloud/qcloud/loadbalancer.go index 1223aa0586..92ad2152e5 100644 --- a/pkg/multicloud/qcloud/loadbalancer.go +++ b/pkg/multicloud/qcloud/loadbalancer.go @@ -295,6 +295,15 @@ func (self *SLoadbalancer) GetMetadata() *jsonutils.JSONDict { return meta } +func (self *SLoadbalancer) GetSysTags() map[string]string { + meta := map[string]string{} + meta["Forward"] = strconv.FormatInt(int64(self.Forward), 10) + meta["OpenBGP"] = strconv.FormatInt(self.OpenBGP, 10) + meta["Domain"] = self.Domain + meta["ProjectID"] = strconv.FormatInt(self.ProjectID, 10) + return meta +} + // 腾讯云当前不支持一个LB绑定多个ip,每个LB只支持绑定一个ip func (self *SLoadbalancer) GetAddress() string { return self.LoadBalancerVips[0] @@ -716,6 +725,6 @@ func (self *SLoadbalancer) GetProjectId() string { return strconv.Itoa(int(self.ProjectID)) } -func (self *SLoadbalancer) SetMetadata(tags map[string]string, replace bool) error { +func (self *SLoadbalancer) SetTags(tags map[string]string, replace bool) error { return self.region.SetResourceTags("clb", "clb", []string{self.LoadBalancerID}, tags, replace) } diff --git a/pkg/multicloud/qcloud/loadbalancer_acl.go b/pkg/multicloud/qcloud/loadbalancer_acl.go index aba679f229..518e47eba8 100644 --- a/pkg/multicloud/qcloud/loadbalancer_acl.go +++ b/pkg/multicloud/qcloud/loadbalancer_acl.go @@ -19,10 +19,13 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // 腾讯云没有LB ACL -type SLBACL struct{} +type SLBACL struct { + multicloud.SResourceBase +} func (self *SLBACL) GetAclListenerID() string { return "" @@ -60,10 +63,6 @@ func (self *SLBACL) IsEmulated() bool { return false } -func (self *SLBACL) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLBACL) GetAclEntries() *jsonutils.JSONArray { return nil } diff --git a/pkg/multicloud/qcloud/loadbalancer_backend.go b/pkg/multicloud/qcloud/loadbalancer_backend.go index b4af8af80a..e2a55dd0ca 100644 --- a/pkg/multicloud/qcloud/loadbalancer_backend.go +++ b/pkg/multicloud/qcloud/loadbalancer_backend.go @@ -23,9 +23,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLBBackend struct { + multicloud.SResourceBase group *SLBBackendGroup PublicIPAddresses []string `json:"PublicIpAddresses"` @@ -92,10 +94,6 @@ func (self *SLBBackend) IsEmulated() bool { return false } -func (self *SLBBackend) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLBBackend) GetWeight() int { return self.Weight } diff --git a/pkg/multicloud/qcloud/loadbalancer_backendgroup.go b/pkg/multicloud/qcloud/loadbalancer_backendgroup.go index cc03ba6c13..c2ef8f98e0 100644 --- a/pkg/multicloud/qcloud/loadbalancer_backendgroup.go +++ b/pkg/multicloud/qcloud/loadbalancer_backendgroup.go @@ -21,14 +21,15 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLBBackendGroup struct { + multicloud.SResourceBase lb *SLoadbalancer // 必须不能为nil listener *SLBListener // 可能为nil rule *SLBListenerRule // tcp、udp、tcp_ssl监听rule 为nil @@ -355,10 +356,6 @@ func (self *SLBBackendGroup) IsEmulated() bool { return true } -func (self *SLBBackendGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLBBackendGroup) IsDefault() bool { return false } diff --git a/pkg/multicloud/qcloud/loadbalancer_listener.go b/pkg/multicloud/qcloud/loadbalancer_listener.go index 8259192ee1..90e6c7589e 100644 --- a/pkg/multicloud/qcloud/loadbalancer_listener.go +++ b/pkg/multicloud/qcloud/loadbalancer_listener.go @@ -26,6 +26,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) var HTTP_CODES = []string{ @@ -68,6 +69,7 @@ type healthCheck struct { } type SLBListener struct { + multicloud.SResourceBase lb *SLoadbalancer Protocol string `json:"Protocol"` // 监听器协议类型,取值 TCP | UDP | HTTP | HTTPS | TCP_SSL @@ -278,10 +280,6 @@ func (self *SLBListener) GetEgressMbps() int { return 0 } -func (self *SLBListener) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLBListener) GetListenerType() string { switch self.Protocol { case PROTOCOL_TCP: diff --git a/pkg/multicloud/qcloud/loadbalancer_listenerrule.go b/pkg/multicloud/qcloud/loadbalancer_listenerrule.go index 44e1ffe317..4ec289237c 100644 --- a/pkg/multicloud/qcloud/loadbalancer_listenerrule.go +++ b/pkg/multicloud/qcloud/loadbalancer_listenerrule.go @@ -24,9 +24,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLBListenerRule struct { + multicloud.SResourceBase listener *SLBListener Domain string `json:"Domain"` @@ -91,10 +93,6 @@ func (self *SLBListenerRule) IsEmulated() bool { return false } -func (self *SLBListenerRule) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLBListenerRule) GetDomain() string { return self.Domain } diff --git a/pkg/multicloud/qcloud/localdisk.go b/pkg/multicloud/qcloud/localdisk.go index eaa8e31c17..5ebccc9dc1 100644 --- a/pkg/multicloud/qcloud/localdisk.go +++ b/pkg/multicloud/qcloud/localdisk.go @@ -41,6 +41,12 @@ func (self *SLocalDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SLocalDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_QCLOUD + return data +} + func (self *SLocalDisk) CreateISnapshot(ctx context.Context, name, desc string) (cloudprovider.ICloudSnapshot, error) { return nil, cloudprovider.ErrNotSupported } diff --git a/pkg/multicloud/qcloud/localstorage.go b/pkg/multicloud/qcloud/localstorage.go index a00a0387da..4c2eba96c2 100644 --- a/pkg/multicloud/qcloud/localstorage.go +++ b/pkg/multicloud/qcloud/localstorage.go @@ -22,6 +22,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) var QCLOUD_LOCAL_STORAGE_TYPES = []string{ @@ -32,15 +33,12 @@ var QCLOUD_LOCAL_STORAGE_TYPES = []string{ } type SLocalStorage struct { + multicloud.SResourceBase zone *SZone storageType string available bool } -func (self *SLocalStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SLocalStorage) GetId() string { return fmt.Sprintf("%s-%s-%s", self.zone.region.client.cpcfg.Id, self.zone.GetId(), self.storageType) } diff --git a/pkg/multicloud/qcloud/network.go b/pkg/multicloud/qcloud/network.go index 39290d8dfd..4f40bd84c6 100644 --- a/pkg/multicloud/qcloud/network.go +++ b/pkg/multicloud/qcloud/network.go @@ -25,10 +25,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) type SNetwork struct { + multicloud.SResourceBase wire *SWire CidrBlock string @@ -43,10 +45,6 @@ type SNetwork struct { RouteTableId string } -func (self *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SNetwork) GetId() string { return self.SubnetId } diff --git a/pkg/multicloud/qcloud/project.go b/pkg/multicloud/qcloud/project.go index 13b98f230a..622d844d02 100644 --- a/pkg/multicloud/qcloud/project.go +++ b/pkg/multicloud/qcloud/project.go @@ -19,14 +19,15 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SProject struct { + multicloud.SResourceBase client *SQcloudClient ProjectName string `json:"projectName"` @@ -51,10 +52,6 @@ func (p *SProject) GetGlobalId() string { return p.GetId() } -func (p *SProject) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (p *SProject) GetName() string { return p.ProjectName } diff --git a/pkg/multicloud/qcloud/rds_mysql.go b/pkg/multicloud/qcloud/rds_mysql.go index 3138ea827d..4930d38eb8 100644 --- a/pkg/multicloud/qcloud/rds_mysql.go +++ b/pkg/multicloud/qcloud/rds_mysql.go @@ -897,6 +897,17 @@ func (self *SMySQLInstance) GetMetadata() *jsonutils.JSONDict { return meta } -func (self *SMySQLInstance) SetMetadata(tags map[string]string, replace bool) error { +func (self *SMySQLInstance) GetTags() (map[string]string, error) { + tags, err := self.region.FetchResourceTags("cdb", "instanceId", []string{self.GetId()}) + if err != nil { + return nil, errors.Wrap(err, "self.region.FetchResourceTags") + } + if _, ok := tags[self.GetId()]; !ok { + return nil, cloudprovider.ErrNotFound + } + return *tags[self.GetId()], nil +} + +func (self *SMySQLInstance) SetTags(tags map[string]string, replace bool) error { return self.region.SetResourceTags("cdb", "instanceId", []string{self.InstanceId}, tags, replace) } diff --git a/pkg/multicloud/qcloud/region.go b/pkg/multicloud/qcloud/region.go index d21d74f583..25610c868f 100644 --- a/pkg/multicloud/qcloud/region.go +++ b/pkg/multicloud/qcloud/region.go @@ -594,10 +594,6 @@ func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo { return cloudprovider.SGeographicInfo{} } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetStatus() string { if self.RegionState == "AVAILABLE" { return api.CLOUD_REGION_STATUS_INSERVER diff --git a/pkg/multicloud/qcloud/route_table.go b/pkg/multicloud/qcloud/route_table.go index 9b184d3ac3..3f70504f23 100644 --- a/pkg/multicloud/qcloud/route_table.go +++ b/pkg/multicloud/qcloud/route_table.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SRouteSet struct { + multicloud.SResourceBase RouteID int `json:"RouteId"` RouteItemID string `json:"RouteItemId"` DestinationIpv6CidrBlock string `json:"DestinationIpv6CidrBlock,omitempty"` @@ -35,6 +37,7 @@ type SRouteSet struct { RouteType string `json:"RouteType"` } type SRouteTableSet struct { + multicloud.SResourceBase vpc *SVpc VpcID string `json:"VpcId"` RouteTableID string `json:"RouteTableId"` @@ -118,10 +121,6 @@ func (self *SRouteTableSet) IsEmulated() bool { return false } -func (self *SRouteTableSet) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteTableSet) GetAssociations() []cloudprovider.RouteTableAssociation { result := []cloudprovider.RouteTableAssociation{} for i := range self.AssociationSet { @@ -197,10 +196,6 @@ func (self *SRouteSet) IsEmulated() bool { return false } -func (self *SRouteSet) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRouteSet) GetType() string { switch self.RouteType { case "USER": diff --git a/pkg/multicloud/qcloud/securitygroup.go b/pkg/multicloud/qcloud/securitygroup.go index 494e5be4b2..55a5cda4c6 100644 --- a/pkg/multicloud/qcloud/securitygroup.go +++ b/pkg/multicloud/qcloud/securitygroup.go @@ -103,10 +103,6 @@ func (self *SRegion) GetSecurityGroups(ids []string, vpcId string, name string, return secgrps, int(total), nil } -func (self *SSecurityGroup) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSecurityGroup) GetVpcId() string { //腾讯云安全组未与vpc关联,统一使用normal return "normal" diff --git a/pkg/multicloud/qcloud/snapshot.go b/pkg/multicloud/qcloud/snapshot.go index 5567343316..9ba2e83b19 100644 --- a/pkg/multicloud/qcloud/snapshot.go +++ b/pkg/multicloud/qcloud/snapshot.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SnapshotStatusType string @@ -35,6 +36,7 @@ const ( ) type SSnapshot struct { + multicloud.SResourceBase region *SRegion SnapshotId string // 快照ID。 @@ -165,10 +167,6 @@ func (self *SRegion) GetISnapshots() ([]cloudprovider.ICloudSnapshot, error) { return ret, nil } -func (self *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshot) GetRegionId() string { return self.region.GetId() } diff --git a/pkg/multicloud/qcloud/snapshot_policy.go b/pkg/multicloud/qcloud/snapshot_policy.go index bcbe196057..6ce7652159 100644 --- a/pkg/multicloud/qcloud/snapshot_policy.go +++ b/pkg/multicloud/qcloud/snapshot_policy.go @@ -23,6 +23,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) const ( @@ -36,6 +37,7 @@ type SSnapshotDatePolicy struct { } type SSnapshotPolicy struct { + multicloud.SResourceBase region *SRegion AutoSnapshotPolicyName string @@ -81,10 +83,6 @@ func (self *SSnapshotPolicy) IsEmulated() bool { return false } -func (self *SSnapshotPolicy) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshotPolicy) GetProjectId() string { return "" } diff --git a/pkg/multicloud/qcloud/storage.go b/pkg/multicloud/qcloud/storage.go index de2e0cf2ae..e9415c12ea 100644 --- a/pkg/multicloud/qcloud/storage.go +++ b/pkg/multicloud/qcloud/storage.go @@ -24,18 +24,16 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStorage struct { + multicloud.SResourceBase zone *SZone storageType string available bool } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetId() string { return fmt.Sprintf("%s-%s-%s", self.zone.region.client.cpcfg.Id, self.zone.GetId(), strings.ToLower(self.storageType)) } diff --git a/pkg/multicloud/qcloud/storagecache.go b/pkg/multicloud/qcloud/storagecache.go index 5f167568ba..edb1f814de 100644 --- a/pkg/multicloud/qcloud/storagecache.go +++ b/pkg/multicloud/qcloud/storagecache.go @@ -30,17 +30,15 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetId() string { return fmt.Sprintf("%s-%s", self.region.client.cpcfg.Id, self.region.GetId()) } diff --git a/pkg/multicloud/qcloud/vpc.go b/pkg/multicloud/qcloud/vpc.go index 2d98fbff25..2aff7af80b 100644 --- a/pkg/multicloud/qcloud/vpc.go +++ b/pkg/multicloud/qcloud/vpc.go @@ -46,10 +46,6 @@ type SVpc struct { VpcName string } -func (self *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVpc) GetId() string { return self.VpcId } diff --git a/pkg/multicloud/qcloud/wire.go b/pkg/multicloud/qcloud/wire.go index 8407a9623d..f1fc0ba19d 100644 --- a/pkg/multicloud/qcloud/wire.go +++ b/pkg/multicloud/qcloud/wire.go @@ -17,23 +17,20 @@ package qcloud import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase zone *SZone vpc *SVpc inetworks []cloudprovider.ICloudNetwork } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SWire) GetId() string { return fmt.Sprintf("%s-%s", self.vpc.GetId(), self.zone.GetId()) } diff --git a/pkg/multicloud/qcloud/zone.go b/pkg/multicloud/qcloud/zone.go index b5b56286c6..64a7381189 100644 --- a/pkg/multicloud/qcloud/zone.go +++ b/pkg/multicloud/qcloud/zone.go @@ -19,13 +19,13 @@ import ( "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type InstanceChargeType string @@ -38,6 +38,7 @@ const ( ) type SZone struct { + multicloud.SResourceBase region *SRegion iwires []cloudprovider.ICloudWire @@ -56,10 +57,6 @@ type SZone struct { ZoneState string } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetId() string { return self.Zone } diff --git a/pkg/multicloud/region_base.go b/pkg/multicloud/region_base.go index cf9091ebdb..a919540545 100644 --- a/pkg/multicloud/region_base.go +++ b/pkg/multicloud/region_base.go @@ -22,7 +22,9 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" ) -type SRegion struct{} +type SRegion struct { + SResourceBase +} func (r *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) { return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetIDiskById") diff --git a/pkg/multicloud/resource_base.go b/pkg/multicloud/resource_base.go index 1ecd145b59..cbc177d28e 100644 --- a/pkg/multicloud/resource_base.go +++ b/pkg/multicloud/resource_base.go @@ -14,7 +14,7 @@ package multicloud -import "yunion.io/x/jsonutils" +import "yunion.io/x/onecloud/pkg/cloudprovider" type SResourceBase struct{} @@ -22,10 +22,18 @@ func (self *SResourceBase) IsEmulated() bool { return false } -func (self *SResourceBase) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SResourceBase) Refresh() error { return nil } + +func (self *SResourceBase) GetSysTags() map[string]string { + return nil +} + +func (self *SResourceBase) GetTags() (map[string]string, error) { + return nil, nil +} + +func (self *SResourceBase) SetTags(tags map[string]string, replace bool) error { + return cloudprovider.ErrNotImplemented +} diff --git a/pkg/multicloud/serversku_base.go b/pkg/multicloud/serversku_base.go index e7063c2a5d..3e29758dac 100644 --- a/pkg/multicloud/serversku_base.go +++ b/pkg/multicloud/serversku_base.go @@ -18,7 +18,9 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" ) -type SServerSku struct{} +type SServerSku struct { + SResourceBase +} func (self *SServerSku) GetStatus() string { return api.SkuStatusReady diff --git a/pkg/multicloud/ucloud/disk.go b/pkg/multicloud/ucloud/disk.go index 23d98a15ef..99014d375b 100644 --- a/pkg/multicloud/ucloud/disk.go +++ b/pkg/multicloud/ucloud/disk.go @@ -123,6 +123,13 @@ func (self *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_UCLOUD + + return data +} + // Year,Month,Dynamic,Trial func (self *SDisk) GetBillingType() string { switch self.ChargeType { diff --git a/pkg/multicloud/ucloud/eip.go b/pkg/multicloud/ucloud/eip.go index 7972aed6f5..fc5eeaf404 100644 --- a/pkg/multicloud/ucloud/eip.go +++ b/pkg/multicloud/ucloud/eip.go @@ -123,10 +123,6 @@ func (self *SEip) IsEmulated() bool { return false } -func (self *SEip) GetMetadata() *jsonutils.JSONDict { - return nil -} - // 付费方式, 枚举值为: Year, 按年付费; Month, 按月付费; Dynamic, 按小时付费; Trial, 试用. 按小时付费和试用这两种付费模式需要开通权限. func (self *SEip) GetBillingType() string { switch self.ChargeType { diff --git a/pkg/multicloud/ucloud/host.go b/pkg/multicloud/ucloud/host.go index 799195b75d..02981c72ee 100644 --- a/pkg/multicloud/ucloud/host.go +++ b/pkg/multicloud/ucloud/host.go @@ -60,10 +60,6 @@ func (self *SHost) IsEmulated() bool { return true } -func (self *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SHost) GetIVMs() ([]cloudprovider.ICloudVM, error) { vms, err := self.zone.GetInstances() if err != nil { diff --git a/pkg/multicloud/ucloud/image.go b/pkg/multicloud/ucloud/image.go index d3a4b68fd4..5e650a5a24 100644 --- a/pkg/multicloud/ucloud/image.go +++ b/pkg/multicloud/ucloud/image.go @@ -107,6 +107,24 @@ func (self *SImage) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SImage) GetSysTags() map[string]string { + imageInfo := imagetools.NormalizeImageInfo(self.ImageName, "", "", "", "") + data := map[string]string{} + if len(imageInfo.OsArch) > 0 { + data["os_arch"] = imageInfo.OsArch + } + if len(imageInfo.OsType) > 0 { + data["os_name"] = imageInfo.OsType + } + if len(imageInfo.OsDistro) > 0 { + data["os_distribution"] = imageInfo.OsDistro + } + if len(imageInfo.OsVersion) > 0 { + data["os_version"] = imageInfo.OsVersion + } + return data +} + func (self *SImage) Delete(ctx context.Context) error { return self.storageCache.region.DeleteImage(self.GetId()) } diff --git a/pkg/multicloud/ucloud/instance.go b/pkg/multicloud/ucloud/instance.go index f84758f766..71390249bb 100644 --- a/pkg/multicloud/ucloud/instance.go +++ b/pkg/multicloud/ucloud/instance.go @@ -197,6 +197,24 @@ func (self *SInstance) GetMetadata() *jsonutils.JSONDict { return data } +func (self *SInstance) GetSysTags() map[string]string { + data := map[string]string{} + // todo: add price key here + data["zone_ext_id"] = self.host.zone.GetGlobalId() + if len(self.BasicImageID) > 0 { + if image, err := self.host.zone.region.GetImage(self.BasicImageID); err != nil { + log.Errorf("Failed to find image %s for instance %s", self.BasicImageID, self.GetName()) + } else { + meta := image.GetSysTags() + for k, v := range meta { + data[k] = v + } + } + } + + return data +} + // 计费模式,枚举值为: Year,按年付费; Month,按月付费; Dynamic,按需付费(需开启权限); func (self *SInstance) GetBillingType() string { switch self.ChargeType { diff --git a/pkg/multicloud/ucloud/network.go b/pkg/multicloud/ucloud/network.go index 4db2e90654..4cb7cf01d4 100644 --- a/pkg/multicloud/ucloud/network.go +++ b/pkg/multicloud/ucloud/network.go @@ -23,11 +23,13 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) // https://docs.ucloud.cn/api/vpc2.0-api/describe_subnet type SNetwork struct { + multicloud.SResourceBase wire *SWire CreateTime int64 `json:"CreateTime"` @@ -85,10 +87,6 @@ func (self *SNetwork) IsEmulated() bool { return false } -func (self *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SNetwork) GetIWire() cloudprovider.ICloudWire { return self.wire } diff --git a/pkg/multicloud/ucloud/project.go b/pkg/multicloud/ucloud/project.go index a138853ea0..36ed7a66f9 100644 --- a/pkg/multicloud/ucloud/project.go +++ b/pkg/multicloud/ucloud/project.go @@ -14,10 +14,15 @@ package ucloud -import "yunion.io/x/jsonutils" +import ( + "yunion.io/x/jsonutils" + + "yunion.io/x/onecloud/pkg/multicloud" +) // https://docs.ucloud.cn/api/summary/get_project_list type SProject struct { + multicloud.SResourceBase ProjectID string `json:"ProjectId"` ProjectName string `json:"ProjectName"` ParentID string `json:"ParentId"` diff --git a/pkg/multicloud/ucloud/region.go b/pkg/multicloud/ucloud/region.go index d6eaa97fbb..680ed40ecc 100644 --- a/pkg/multicloud/ucloud/region.go +++ b/pkg/multicloud/ucloud/region.go @@ -18,7 +18,6 @@ import ( "fmt" "strings" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/secrules" @@ -75,10 +74,6 @@ func (self *SRegion) IsEmulated() bool { return false } -func (self *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo { if info, ok := LatitudeAndLongitude[self.GetId()]; ok { return info diff --git a/pkg/multicloud/ucloud/snapshot.go b/pkg/multicloud/ucloud/snapshot.go index 1359524871..4fcb80404d 100644 --- a/pkg/multicloud/ucloud/snapshot.go +++ b/pkg/multicloud/ucloud/snapshot.go @@ -22,10 +22,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // https://docs.ucloud.cn/api/udisk-api/describe_udisk_snapshot type SSnapshot struct { + multicloud.SResourceBase region *SRegion Comment string `json:"Comment"` @@ -100,10 +102,6 @@ func (self *SSnapshot) IsEmulated() bool { return false } -func (self *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SSnapshot) GetSizeMb() int32 { return self.SizeGB * 1024 } diff --git a/pkg/multicloud/ucloud/storage.go b/pkg/multicloud/ucloud/storage.go index c32d4bf0d6..c337e80733 100644 --- a/pkg/multicloud/ucloud/storage.go +++ b/pkg/multicloud/ucloud/storage.go @@ -22,9 +22,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SStorage struct { + multicloud.SResourceBase zone *SZone storageType string } @@ -53,10 +55,6 @@ func (self *SStorage) IsEmulated() bool { return true } -func (self *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStorage) GetIStoragecache() cloudprovider.ICloudStoragecache { return self.zone.region.getStoragecache() } diff --git a/pkg/multicloud/ucloud/storagecache.go b/pkg/multicloud/ucloud/storagecache.go index f0f161f00e..6e4caae5ee 100644 --- a/pkg/multicloud/ucloud/storagecache.go +++ b/pkg/multicloud/ucloud/storagecache.go @@ -32,10 +32,12 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase region *SRegion } @@ -67,10 +69,6 @@ func (self *SStoragecache) IsEmulated() bool { return false } -func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SStoragecache) GetICloudImages() ([]cloudprovider.ICloudImage, error) { return nil, cloudprovider.ErrNotImplemented } diff --git a/pkg/multicloud/ucloud/vpc.go b/pkg/multicloud/ucloud/vpc.go index 407048fe51..8114599b1a 100644 --- a/pkg/multicloud/ucloud/vpc.go +++ b/pkg/multicloud/ucloud/vpc.go @@ -86,10 +86,6 @@ func (self *SVPC) IsEmulated() bool { return false } -func (self *SVPC) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SVPC) GetRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/ucloud/wire.go b/pkg/multicloud/ucloud/wire.go index 43cd735066..848e12bce9 100644 --- a/pkg/multicloud/ucloud/wire.go +++ b/pkg/multicloud/ucloud/wire.go @@ -17,13 +17,13 @@ package ucloud import ( "fmt" - "yunion.io/x/jsonutils" - "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // 子网在整个region可用 type SWire struct { + multicloud.SResourceBase region *SRegion vpc *SVPC @@ -54,10 +54,6 @@ func (self *SWire) IsEmulated() bool { return true } -func (self *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SWire) GetIVpc() cloudprovider.ICloudVpc { return self.vpc } diff --git a/pkg/multicloud/ucloud/zone.go b/pkg/multicloud/ucloud/zone.go index 82478f5f3e..b069a8542e 100644 --- a/pkg/multicloud/ucloud/zone.go +++ b/pkg/multicloud/ucloud/zone.go @@ -17,11 +17,11 @@ package ucloud import ( "fmt" - "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) // https://docs.ucloud.cn/api/udisk-api/create_udisk @@ -34,6 +34,7 @@ var StorageTypes = []string{ } type SZone struct { + multicloud.SResourceBase region *SRegion host *SHost @@ -106,10 +107,6 @@ func (self *SZone) IsEmulated() bool { return false } -func (self *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (self *SZone) GetIRegion() cloudprovider.ICloudRegion { return self.region } diff --git a/pkg/multicloud/zstack/disk.go b/pkg/multicloud/zstack/disk.go index dad3ed3d69..1f57ec51ae 100644 --- a/pkg/multicloud/zstack/disk.go +++ b/pkg/multicloud/zstack/disk.go @@ -90,7 +90,7 @@ func (region *SRegion) GetDiskWithStorage(diskId string) (*SDisk, error) { disk.localStorage = &SLocalStorage{region: region, primaryStorageID: storage.UUID, HostUUID: hostId} return disk, nil } - tags, err := region.GetSysTags("", "VolumeVO", disk.UUID, "") + tags, err := region.GetResourceSysTags("", "VolumeVO", disk.UUID, "") if err != nil { log.Errorf("get disk tag error: %v", err) return nil, err @@ -142,6 +142,12 @@ func (disk *SDisk) GetMetadata() *jsonutils.JSONDict { return data } +func (disk *SDisk) GetSysTags() map[string]string { + data := map[string]string{} + data["hypervisor"] = api.HYPERVISOR_ZSTACK + return data +} + func (disk *SDisk) GetId() string { return disk.UUID } diff --git a/pkg/multicloud/zstack/eip.go b/pkg/multicloud/zstack/eip.go index 90772a3530..ee33863e7f 100644 --- a/pkg/multicloud/zstack/eip.go +++ b/pkg/multicloud/zstack/eip.go @@ -91,10 +91,6 @@ func (eip *SEipAddress) IsEmulated() bool { return false } -func (eip *SEipAddress) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (eip *SEipAddress) GetIpAddr() string { return eip.VipIP } diff --git a/pkg/multicloud/zstack/host.go b/pkg/multicloud/zstack/host.go index 52cfe3a40e..d38015e636 100644 --- a/pkg/multicloud/zstack/host.go +++ b/pkg/multicloud/zstack/host.go @@ -80,10 +80,6 @@ func (region *SRegion) GetHost(hostId string) (*SHost, error) { return host, nil } -func (host *SHost) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (host *SHost) GetIWires() ([]cloudprovider.ICloudWire, error) { wires, err := host.zone.region.GetWires(host.ZoneUUID, "", host.ClusterUUID) if err != nil { diff --git a/pkg/multicloud/zstack/network.go b/pkg/multicloud/zstack/network.go index 9021c8279a..eb0937881c 100644 --- a/pkg/multicloud/zstack/network.go +++ b/pkg/multicloud/zstack/network.go @@ -23,10 +23,12 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/rbacutils" ) type SNetwork struct { + multicloud.SResourceBase wire *SWire ZStackBasic @@ -117,10 +119,6 @@ func (region *SRegion) GetNetworks(zoneId string, wireId string, l3Id string, ne return networks, nil } -func (network *SNetwork) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (network *SNetwork) GetId() string { return network.UUID } diff --git a/pkg/multicloud/zstack/offering.go b/pkg/multicloud/zstack/offering.go index 7360ff01dc..9237a48689 100644 --- a/pkg/multicloud/zstack/offering.go +++ b/pkg/multicloud/zstack/offering.go @@ -113,10 +113,6 @@ func (region *SRegion) GetInstanceOfferings(offerId string, name string, cpu int return offerings, nil } -func (offering *SInstanceOffering) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (offering *SInstanceOffering) IsEmulated() bool { return false } diff --git a/pkg/multicloud/zstack/region.go b/pkg/multicloud/zstack/region.go index ea08900e22..1a72320734 100644 --- a/pkg/multicloud/zstack/region.go +++ b/pkg/multicloud/zstack/region.go @@ -19,7 +19,6 @@ import ( "net/url" "strings" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" @@ -48,10 +47,6 @@ func (region *SRegion) GetClient() *SZStackClient { return region.client } -func (region *SRegion) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (region *SRegion) GetId() string { return region.Name } diff --git a/pkg/multicloud/zstack/shell/tag.go b/pkg/multicloud/zstack/shell/tag.go index ec8f2197f0..00a0d6d6c6 100644 --- a/pkg/multicloud/zstack/shell/tag.go +++ b/pkg/multicloud/zstack/shell/tag.go @@ -27,7 +27,7 @@ func init() { Tag string } shellutils.R(&TagListOptions{}, "system-tag-list", "List system tags", func(cli *zstack.SRegion, args *TagListOptions) error { - tags, err := cli.GetSysTags(args.TagId, args.ResourceType, args.ResourceId, args.Tag) + tags, err := cli.GetResourceSysTags(args.TagId, args.ResourceType, args.ResourceId, args.Tag) if err != nil { return err } diff --git a/pkg/multicloud/zstack/snapshot.go b/pkg/multicloud/zstack/snapshot.go index 460cda8b81..3d4c21cbff 100644 --- a/pkg/multicloud/zstack/snapshot.go +++ b/pkg/multicloud/zstack/snapshot.go @@ -22,9 +22,11 @@ import ( "yunion.io/x/log" api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/multicloud" ) type SSnapshot struct { + multicloud.SResourceBase region *SRegion ZStackBasic @@ -116,10 +118,6 @@ func (snapshot *SSnapshot) Delete() error { return snapshot.region.DeleteSnapshot(snapshot.UUID) } -func (snapshot *SSnapshot) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (region *SRegion) DeleteSnapshot(snapshotId string) error { return region.client.delete("volume-snapshots", snapshotId, "Enforcing") } diff --git a/pkg/multicloud/zstack/storage.go b/pkg/multicloud/zstack/storage.go index aeab0688b4..c0416cc8ac 100644 --- a/pkg/multicloud/zstack/storage.go +++ b/pkg/multicloud/zstack/storage.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type TStorageType string @@ -53,6 +54,7 @@ type SPool struct { } type SStorage struct { + multicloud.SResourceBase region *SRegion ZStackBasic @@ -142,10 +144,6 @@ func (storage *SStorage) GetStatus() string { return api.STORAGE_OFFLINE } -func (storage *SStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (storage *SStorage) GetId() string { return storage.UUID } diff --git a/pkg/multicloud/zstack/storage_local.go b/pkg/multicloud/zstack/storage_local.go index 903dcf488c..b7de5898b9 100644 --- a/pkg/multicloud/zstack/storage_local.go +++ b/pkg/multicloud/zstack/storage_local.go @@ -24,9 +24,11 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SLocalStorage struct { + multicloud.SResourceBase region *SRegion primaryStorageID string @@ -83,10 +85,6 @@ func (region *SRegion) getILocalStorages(storageId, hostId string) ([]cloudprovi return istorage, nil } -func (storage *SLocalStorage) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (storage *SLocalStorage) GetId() string { return storage.primaryStorageID } @@ -125,7 +123,7 @@ func (storage *SLocalStorage) GetIZone() cloudprovider.ICloudZone { } func (storage *SLocalStorage) GetIDisks() ([]cloudprovider.ICloudDisk, error) { - tags, err := storage.region.GetSysTags("", "VolumeVO", "", "localStorage::hostUuid::"+storage.HostUUID) + tags, err := storage.region.GetResourceSysTags("", "VolumeVO", "", "localStorage::hostUuid::"+storage.HostUUID) if err != nil { return nil, err } diff --git a/pkg/multicloud/zstack/storagecache.go b/pkg/multicloud/zstack/storagecache.go index e341117639..475b3ee781 100644 --- a/pkg/multicloud/zstack/storagecache.go +++ b/pkg/multicloud/zstack/storagecache.go @@ -28,18 +28,16 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/multicloud" "yunion.io/x/onecloud/pkg/util/qemuimg" ) type SStoragecache struct { + multicloud.SResourceBase ZoneId string region *SRegion } -func (scache *SStoragecache) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (scache *SStoragecache) GetId() string { return fmt.Sprintf("%s-%s/%s", scache.region.client.cpcfg.Id, scache.region.GetId(), scache.ZoneId) } diff --git a/pkg/multicloud/zstack/systag.go b/pkg/multicloud/zstack/systag.go index 99f8106771..73ac5336ea 100644 --- a/pkg/multicloud/zstack/systag.go +++ b/pkg/multicloud/zstack/systag.go @@ -26,7 +26,7 @@ type SSysTag struct { UUID string `json:"uuid"` } -func (region *SRegion) GetSysTags(tagId string, resourceType string, resourceId string, tag string) ([]SSysTag, error) { +func (region *SRegion) GetResourceSysTags(tagId string, resourceType string, resourceId string, tag string) ([]SSysTag, error) { tags := []SSysTag{} params := url.Values{} if len(tagId) > 0 { diff --git a/pkg/multicloud/zstack/vpc.go b/pkg/multicloud/zstack/vpc.go index 529cf50a4b..0db0876375 100644 --- a/pkg/multicloud/zstack/vpc.go +++ b/pkg/multicloud/zstack/vpc.go @@ -17,8 +17,6 @@ package zstack import ( "fmt" - "yunion.io/x/jsonutils" - api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud" @@ -32,10 +30,6 @@ type SVpc struct { iwires []cloudprovider.ICloudWire } -func (vpc *SVpc) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (vpc *SVpc) GetId() string { return fmt.Sprintf("%s/vpc", vpc.region.GetGlobalId()) } diff --git a/pkg/multicloud/zstack/wire.go b/pkg/multicloud/zstack/wire.go index cf5a843392..5e0558bfd8 100644 --- a/pkg/multicloud/zstack/wire.go +++ b/pkg/multicloud/zstack/wire.go @@ -19,12 +19,12 @@ import ( "net/url" "strings" - "yunion.io/x/jsonutils" - "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SWire struct { + multicloud.SResourceBase vpc *SVpc inetworks []cloudprovider.ICloudNetwork @@ -70,10 +70,6 @@ func (region *SRegion) GetWires(zoneId string, wireId string, clusterId string) return wires, nil } -func (wire *SWire) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (wire *SWire) GetId() string { return wire.UUID } diff --git a/pkg/multicloud/zstack/zone.go b/pkg/multicloud/zstack/zone.go index e0f3204d2f..b74817e9d0 100644 --- a/pkg/multicloud/zstack/zone.go +++ b/pkg/multicloud/zstack/zone.go @@ -17,15 +17,16 @@ package zstack import ( "strconv" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/util/fileutils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/onecloud/pkg/multicloud" ) type SZone struct { + multicloud.SResourceBase region *SRegion ZStackBasic @@ -41,10 +42,6 @@ type SZone struct { ihosts []cloudprovider.ICloudHost } -func (zone *SZone) GetMetadata() *jsonutils.JSONDict { - return nil -} - func (zone *SZone) GetId() string { return zone.Name }