diff --git a/cmd/climc/shell/compute/disks.go b/cmd/climc/shell/compute/disks.go index b79299243e..3e05095f06 100644 --- a/cmd/climc/shell/compute/disks.go +++ b/cmd/climc/shell/compute/disks.go @@ -291,4 +291,14 @@ func init() { printObject(srv) return nil }) + + R(&DiskDetailOptions{}, "disk-change-owner-candidate-domains", "Get change owner candidate domain list", func(s *mcclient.ClientSession, args *DiskDetailOptions) error { + result, err := modules.Disks.GetSpecific(s, args.ID, "change-owner-candidate-domains", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) + } diff --git a/cmd/climc/shell/compute/loadbalancers.go b/cmd/climc/shell/compute/loadbalancers.go index 88765d11ae..478fd09cef 100644 --- a/cmd/climc/shell/compute/loadbalancers.go +++ b/cmd/climc/shell/compute/loadbalancers.go @@ -99,4 +99,13 @@ func init() { return nil }) + R(&options.LoadbalancerGetOptions{}, "lb-change-owner-candidate-domains", "Get change owner candidate domain list", func(s *mcclient.ClientSession, args *options.LoadbalancerGetOptions) error { + result, err := modules.Loadbalancers.GetSpecific(s, args.ID, "change-owner-candidate-domains", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) + } diff --git a/cmd/climc/shell/compute/servers.go b/cmd/climc/shell/compute/servers.go index c19e00ef80..1c7c517c69 100644 --- a/cmd/climc/shell/compute/servers.go +++ b/cmd/climc/shell/compute/servers.go @@ -1350,4 +1350,14 @@ func init() { printObject(result) return nil }) + + R(&options.ServerShowOptions{}, "server-change-owner-candidate-domains", "Get change owner candidate domain list", func(s *mcclient.ClientSession, args *options.ServerShowOptions) error { + result, err := modules.Servers.GetSpecific(s, args.ID, "change-owner-candidate-domains", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) + } diff --git a/pkg/cloudcommon/db/sharablebase.go b/pkg/cloudcommon/db/sharablebase.go index 25a9086853..8c4e67c036 100644 --- a/pkg/cloudcommon/db/sharablebase.go +++ b/pkg/cloudcommon/db/sharablebase.go @@ -168,7 +168,9 @@ func SharableManagerValidateCreateData( input.IsPublic = &isPublic reqScope = rbacutils.ScopeDomain } else if input.IsPublic != nil && *input.IsPublic { - return input, errors.Wrap(httperrors.ErrNotSupported, "domain level resource can be shared to system ONLY") + // return input, errors.Wrap(httperrors.ErrNotSupported, "project level resource can be shared to domain or system ONLY") + input.IsPublic = nil + input.PublicScope = string(rbacutils.ScopeNone) } else { input.IsPublic = nil input.PublicScope = string(rbacutils.ScopeNone) @@ -178,7 +180,9 @@ func SharableManagerValidateCreateData( input.IsPublic = &isPublic reqScope = rbacutils.ScopeSystem } else if input.IsPublic != nil && *input.IsPublic { - return input, errors.Wrap(httperrors.ErrNotSupported, "domain level resource can be shared to system ONLY") + // return input, errors.Wrap(httperrors.ErrNotSupported, "domain level resource can be shared to system ONLY") + input.IsPublic = nil + input.PublicScope = string(rbacutils.ScopeNone) } else { input.IsPublic = nil input.PublicScope = string(rbacutils.ScopeNone) diff --git a/pkg/compute/models/dbinstance_backups.go b/pkg/compute/models/dbinstance_backups.go index bb4a67eae4..bb17a5f699 100644 --- a/pkg/compute/models/dbinstance_backups.go +++ b/pkg/compute/models/dbinstance_backups.go @@ -578,3 +578,7 @@ func (manager *SDBInstanceBackupManager) ListItemExportKeys(ctx context.Context, } return q, nil } + +func (self *SDBInstanceBackup) GetChangeOwnerCandidateDomainIds() []string { + return self.SManagedResourceBase.GetChangeOwnerCandidateDomainIds() +} diff --git a/pkg/compute/models/dbinstanceresource.go b/pkg/compute/models/dbinstanceresource.go index 074e43b531..c6cecc64fb 100644 --- a/pkg/compute/models/dbinstanceresource.go +++ b/pkg/compute/models/dbinstanceresource.go @@ -264,3 +264,11 @@ func (manager *SDBInstanceResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SVpcResourceBaseManager.GetExportKeys()...) return keys } + +func (self *SDBInstanceResourceBase) GetChangeOwnerCandidateDomainIds() []string { + dbinst, _ := self.GetDBInstance() + if dbinst != nil { + return dbinst.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/diskresource.go b/pkg/compute/models/diskresource.go index 67613804c9..b87a9be064 100644 --- a/pkg/compute/models/diskresource.go +++ b/pkg/compute/models/diskresource.go @@ -252,3 +252,11 @@ func (manager *SDiskResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SStorageResourceBaseManager.GetExportKeys()...) return keys } + +func (self *SDiskResourceBase) GetChangeOwnerCandidateDomainIds() []string { + disk := self.GetDisk() + if disk != nil { + return disk.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/elasticcacheresource.go b/pkg/compute/models/elasticcacheresource.go index 812dfb4ac6..a3d50083b0 100644 --- a/pkg/compute/models/elasticcacheresource.go +++ b/pkg/compute/models/elasticcacheresource.go @@ -302,3 +302,11 @@ func (manager *SElasticcacheResourceBaseManager) GetExportKeys() []string { keys = append(keys, "zone") return keys } + +func (self *SElasticcacheResourceBase) GetChangeOwnerCandidateDomainIds() []string { + cache, _ := self.GetElasticcache() + if cache != nil { + return cache.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/guestresource.go b/pkg/compute/models/guestresource.go index 8ebafcb152..7959483923 100644 --- a/pkg/compute/models/guestresource.go +++ b/pkg/compute/models/guestresource.go @@ -251,3 +251,11 @@ func (manager *SGuestResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SHostResourceBaseManager.GetExportKeys()...) return keys } + +func (self *SGuestResourceBase) GetChangeOwnerCandidateDomainIds() []string { + guest := self.GetGuest() + if guest != nil { + return guest.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/hostresource.go b/pkg/compute/models/hostresource.go index 2e83775827..8350fbaa45 100644 --- a/pkg/compute/models/hostresource.go +++ b/pkg/compute/models/hostresource.go @@ -54,6 +54,15 @@ func ValidateHostResourceInput(userCred mcclient.TokenCredential, input api.Host return hostObj.(*SHost), input, nil } +func (self *SHostResourceBase) GetHost() *SHost { + obj, err := HostManager.FetchById(self.HostId) + if err != nil { + log.Errorf("fail to get host by id %s: %s", self.HostId, err) + return nil + } + return obj.(*SHost) +} + func (manager *SHostResourceBaseManager) getHostIdFieldName() string { if len(manager.hostIdFieldName) > 0 { return manager.hostIdFieldName @@ -279,3 +288,11 @@ func (manager *SHostResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SManagedResourceBaseManager.GetExportKeys()...) return keys } + +func (model *SHostResourceBase) GetChangeOwnerCandidateDomainIds() []string { + host := model.GetHost() + if host != nil { + return host.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/loadbalancerresource.go b/pkg/compute/models/loadbalancerresource.go index ee444706a9..67f0a2746e 100644 --- a/pkg/compute/models/loadbalancerresource.go +++ b/pkg/compute/models/loadbalancerresource.go @@ -344,3 +344,11 @@ func (manager *SLoadbalancerResourceBaseManager) GetExportKeys() []string { keys = append(keys, "vpc") return keys } + +func (self *SLoadbalancerResourceBase) GetChangeOwnerCandidateDomainIds() []string { + lb := self.GetLoadbalancer() + if lb != nil { + return lb.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 566ee00558..e62ef14180 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -1137,3 +1137,7 @@ func (manager *SLoadbalancerManager) ListItemExportKeys(ctx context.Context, } return q, nil } + +func (self *SLoadbalancer) GetChangeOwnerCandidateDomainIds() []string { + return self.SManagedResourceBase.GetChangeOwnerCandidateDomainIds() +} diff --git a/pkg/compute/models/natgatewayresource.go b/pkg/compute/models/natgatewayresource.go index 305a6077a8..1b1467e50e 100644 --- a/pkg/compute/models/natgatewayresource.go +++ b/pkg/compute/models/natgatewayresource.go @@ -220,3 +220,11 @@ func (manager *SNatgatewayResourceBaseManager) FilterByParentId(q *sqlchemy.SQue return q } */ + +func (self *SNatgatewayResourceBase) GetChangeOwnerCandidateDomainIds() []string { + nat, _ := self.GetNatgateway() + if nat != nil { + return nat.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/networkresource.go b/pkg/compute/models/networkresource.go index 1515e18ba9..3fc2e5ba8b 100644 --- a/pkg/compute/models/networkresource.go +++ b/pkg/compute/models/networkresource.go @@ -260,3 +260,11 @@ func (manager *SNetworkResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SWireResourceBaseManager.GetExportKeys()...) return keys } + +func (self *SNetworkResourceBase) GetChangeOwnerCandidateDomainIds() []string { + network := self.GetNetwork() + if network != nil { + return network.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/storageresource.go b/pkg/compute/models/storageresource.go index 7999681d88..c4c6c173f6 100644 --- a/pkg/compute/models/storageresource.go +++ b/pkg/compute/models/storageresource.go @@ -53,6 +53,15 @@ func ValidateStorageResourceInput(userCred mcclient.TokenCredential, query api.S return storageObj.(*SStorage), query, nil } +func (self *SStorageResourceBase) GetStorage() *SStorage { + obj, err := StorageManager.FetchById(self.StorageId) + if err != nil { + log.Errorf("fail to fetch storage by id: %s: %s", self.StorageId, err) + return nil + } + return obj.(*SStorage) +} + func (self *SStorageResourceBase) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) api.StorageResourceInfo { return api.StorageResourceInfo{} } @@ -268,3 +277,11 @@ func (manager *SStorageResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SManagedResourceBaseManager.GetExportKeys()...) return keys } + +func (model *SStorageResourceBase) GetChangeOwnerCandidateDomainIds() []string { + storage := model.GetStorage() + if storage != nil { + return storage.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/vpcresource.go b/pkg/compute/models/vpcresource.go index bd9c88a03a..a6e38d0686 100644 --- a/pkg/compute/models/vpcresource.go +++ b/pkg/compute/models/vpcresource.go @@ -310,3 +310,11 @@ func (manager *SVpcResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SCloudregionResourceBaseManager.GetExportKeys()...) return keys } + +func (self *SVpcResourceBase) GetChangeOwnerCandidateDomainIds() []string { + vpc := self.GetVpc() + if vpc != nil { + return vpc.GetChangeOwnerCandidateDomainIds() + } + return nil +} diff --git a/pkg/compute/models/wireresource.go b/pkg/compute/models/wireresource.go index 8d4e7c0510..a7d9deb22b 100644 --- a/pkg/compute/models/wireresource.go +++ b/pkg/compute/models/wireresource.go @@ -305,3 +305,11 @@ func (manager *SWireResourceBaseManager) GetExportKeys() []string { keys = append(keys, manager.SVpcResourceBaseManager.GetExportKeys()...) return keys } + +func (self *SWireResourceBase) GetChangeOwnerCandidateDomainIds() []string { + wire := self.GetWire() + if wire != nil { + return wire.GetChangeOwnerCandidateDomainIds() + } + return nil +}