fix: 支持同步project标签到本地资源

This commit is contained in:
Qu Xuan
2020-06-23 16:51:15 +08:00
parent 6bed7639b0
commit 60cdc3fdda
21 changed files with 141 additions and 32 deletions
+1 -1
View File
@@ -275,7 +275,7 @@ func (self *SManagedVirtualizationHostDriver) RequestAllocateDiskOnStorage(ctx c
cloudprovider.WaitStatus(iDisk, api.DISK_READY, time.Second*5, time.Minute*5)
models.SyncMetadata(ctx, task.GetUserCred(), disk, iDisk)
models.SyncVirtualResourceMetadata(ctx, task.GetUserCred(), disk, iDisk)
data := jsonutils.NewDict()
data.Add(jsonutils.NewInt(int64(iDisk.GetDiskSizeMB())), "disk_size")
+6 -2
View File
@@ -2427,7 +2427,7 @@ func (self *SCloudaccount) SyncProject(ctx context.Context, userCred mcclient.To
lockman.LockRawObject(ctx, self.Id, id)
defer lockman.ReleaseRawObject(ctx, self.Id, id)
project, _, err := self.GetExternalProject(ctx, userCred, id)
project, projectName, err := self.GetExternalProject(ctx, userCred, id)
if err == nil {
return project.ExternalId, nil
}
@@ -2435,11 +2435,15 @@ func (self *SCloudaccount) SyncProject(ctx context.Context, userCred mcclient.To
return "", err
}
if len(projectName) == 0 {
return "", fmt.Errorf("empty project name")
}
provider, err := self.GetProvider()
if err != nil {
return "", errors.Wrap(err, "GetProvider")
}
iProject, err := provider.CreateIProject(project.GetName())
iProject, err := provider.CreateIProject(projectName)
if err != nil {
return "", errors.Wrap(err, "CreateIProject")
}
+1 -1
View File
@@ -636,7 +636,7 @@ func syncHostVMs(ctx context.Context, userCred mcclient.TokenCredential, syncRes
}
func syncVMPeripherals(ctx context.Context, userCred mcclient.TokenCredential, local *SGuest, remote cloudprovider.ICloudVM, host *SHost, provider *SCloudprovider, driver cloudprovider.ICloudProvider) {
syncMetadata(ctx, userCred, local, remote)
syncVirtualResourceMetadata(ctx, userCred, local, remote)
err := syncVMNics(ctx, userCred, provider, host, local, remote)
if err != nil {
log.Errorf("syncVMNics error %s", err)
+2 -2
View File
@@ -1296,7 +1296,7 @@ func (manager *SDBInstanceManager) SyncDBInstances(ctx context.Context, userCred
syncResult.UpdateError(err)
continue
}
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
localDBInstances = append(localDBInstances, commondb[i])
remoteDBInstances = append(remoteDBInstances, commonext[i])
syncResult.Update()
@@ -1308,7 +1308,7 @@ func (manager *SDBInstanceManager) SyncDBInstances(ctx context.Context, userCred
syncResult.AddError(err)
continue
}
syncMetadata(ctx, userCred, instance, added[i])
syncVirtualResourceMetadata(ctx, userCred, instance, added[i])
localDBInstances = append(localDBInstances, *instance)
remoteDBInstances = append(remoteDBInstances, added[i])
syncResult.Add()
+10 -2
View File
@@ -1138,6 +1138,14 @@ func (self *SDisk) IsLocal() bool {
return false
}
func (self *SDisk) GetCloudproviderId() string {
storage := self.GetStorage()
if storage != nil {
return storage.GetCloudproviderId()
}
return ""
}
func (self *SDisk) GetStorage() *SStorage {
store, _ := StorageManager.FetchById(self.StorageId)
if store != nil {
@@ -1284,7 +1292,7 @@ func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.To
if err != nil {
syncResult.UpdateError(err)
} else {
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
localDisks = append(localDisks, commondb[i])
remoteDisks = append(remoteDisks, commonext[i])
syncResult.Update()
@@ -1314,7 +1322,7 @@ func (manager *SDiskManager) SyncDisks(ctx context.Context, userCred mcclient.To
if err != nil {
syncResult.AddError(err)
} else {
syncMetadata(ctx, userCred, new, added[i])
syncVirtualResourceMetadata(ctx, userCred, new, added[i])
localDisks = append(localDisks, *new)
remoteDisks = append(remoteDisks, added[i])
syncResult.Add()
+2 -2
View File
@@ -472,7 +472,7 @@ func (manager *SElasticcacheManager) SyncElasticcaches(ctx context.Context, user
syncResult.UpdateError(err)
continue
}
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
localElasticcaches = append(localElasticcaches, commondb[i])
remoteElasticcaches = append(remoteElasticcaches, commonext[i])
syncResult.Update()
@@ -484,7 +484,7 @@ func (manager *SElasticcacheManager) SyncElasticcaches(ctx context.Context, user
syncResult.AddError(err)
continue
}
syncMetadata(ctx, userCred, instance, added[i])
syncVirtualResourceMetadata(ctx, userCred, instance, added[i])
localElasticcaches = append(localElasticcaches, *instance)
remoteElasticcaches = append(remoteElasticcaches, added[i])
syncResult.Add()
+2 -2
View File
@@ -358,7 +358,7 @@ func (manager *SElasticipManager) SyncEips(ctx context.Context, userCred mcclien
if err != nil {
syncResult.UpdateError(err)
} else {
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
syncResult.Update()
}
}
@@ -367,7 +367,7 @@ func (manager *SElasticipManager) SyncEips(ctx context.Context, userCred mcclien
if err != nil {
syncResult.AddError(err)
} else {
syncMetadata(ctx, userCred, new, added[i])
syncVirtualResourceMetadata(ctx, userCred, new, added[i])
syncResult.Add()
}
}
+7 -11
View File
@@ -322,22 +322,18 @@ func (manager *SExternalProjectManager) ListItemFilter(
return nil, httperrors.NewGeneralError(err)
}
provider := p.(*SCloudprovider)
query.Cloudaccount = []string{provider.CloudaccountId}
query.Cloudaccount = provider.CloudaccountId
}
if len(query.Cloudaccount) > 0 {
accountIds := []string{}
for _, _account := range query.Cloudaccount {
account, err := CloudaccountManager.FetchByIdOrName(userCred, _account)
if err != nil {
if errors.Cause(err) == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2("cloudaccount", _account)
}
return nil, httperrors.NewGeneralError(err)
account, err := CloudaccountManager.FetchByIdOrName(userCred, query.Cloudaccount)
if err != nil {
if errors.Cause(err) == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2("cloudaccount", query.Cloudaccount)
}
accountIds = append(accountIds, account.GetId())
return nil, httperrors.NewGeneralError(err)
}
q = q.In("cloudaccount_id", accountIds)
q = q.Equals("cloudaccount_id", account.GetId())
}
return q, nil
+8
View File
@@ -771,6 +771,14 @@ func (guest *SGuest) CustomizeCreate(ctx context.Context, userCred mcclient.Toke
return guest.SVirtualResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
}
func (guest *SGuest) GetCloudproviderId() string {
host := guest.GetHost()
if host != nil {
return host.GetCloudproviderId()
}
return ""
}
func (guest *SGuest) GetHost() *SHost {
if len(guest.HostId) > 0 && regutils.MatchUUID(guest.HostId) {
host, _ := HostManager.FetchById(guest.HostId)
@@ -264,6 +264,14 @@ func (lbb *SLoadbalancerBackend) AllowPerformStatus(ctx context.Context, userCre
return false
}
func (lbb *SLoadbalancerBackend) GetCloudproviderId() string {
lbbg := lbb.GetLoadbalancerBackendGroup()
if lbbg != nil {
return lbbg.GetCloudproviderId()
}
return ""
}
func (lbb *SLoadbalancerBackend) GetLoadbalancerBackendGroup() *SLoadbalancerBackendGroup {
backendgroup, err := LoadbalancerBackendGroupManager.FetchById(lbb.BackendGroupId)
if err != nil {
@@ -62,6 +62,14 @@ func (self *SLoadbalancerListenerResourceBase) GetLoadbalancerListener() *SLoadb
return listener.(*SLoadbalancerListener)
}
func (self *SLoadbalancerListenerResourceBase) GetCloudproviderId() string {
cloudprovider := self.GetCloudprovider()
if cloudprovider != nil {
return cloudprovider.Id
}
return ""
}
func (self *SLoadbalancerListenerResourceBase) GetCloudprovider() *SCloudprovider {
listener := self.GetLoadbalancerListener()
if listener != nil {
+6 -2
View File
@@ -385,6 +385,10 @@ func (lb *SLoadbalancer) GetRegion() *SCloudregion {
return lb.SCloudregionResourceBase.GetRegion()
}
func (lb *SLoadbalancer) GetCloudproviderId() string {
return lb.SManagedResourceBase.GetCloudproviderId()
}
func (lb *SLoadbalancer) GetZone() *SZone {
return lb.SZoneResourceBase.GetZone()
}
@@ -726,7 +730,7 @@ func (man *SLoadbalancerManager) SyncLoadbalancers(ctx context.Context, userCred
if err != nil {
syncResult.UpdateError(err)
} else {
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
localLbs = append(localLbs, commondb[i])
remoteLbs = append(remoteLbs, commonext[i])
syncResult.Update()
@@ -737,7 +741,7 @@ func (man *SLoadbalancerManager) SyncLoadbalancers(ctx context.Context, userCred
if err != nil {
syncResult.AddError(err)
} else {
syncMetadata(ctx, userCred, new, added[i])
syncVirtualResourceMetadata(ctx, userCred, new, added[i])
localLbs = append(localLbs, *new)
remoteLbs = append(remoteLbs, added[i])
syncResult.Add()
+4
View File
@@ -46,6 +46,10 @@ type SManagedResourceBaseManager struct {
managerIdFieldName string
}
func (self *SManagedResourceBase) GetCloudproviderId() string {
return self.ManagerId
}
func ValidateCloudproviderResourceInput(userCred mcclient.TokenCredential, query api.CloudproviderResourceInput) (*SCloudprovider, api.CloudproviderResourceInput, error) {
managerObj, err := CloudproviderManager.FetchByIdOrName(userCred, query.Cloudprovider)
if err != nil {
+8
View File
@@ -237,6 +237,14 @@ func (manager *SNatDEntryManager) SyncNatDTable(ctx context.Context, userCred mc
return result
}
func (self *SNatDEntry) GetCloudproviderId() string {
nat, _ := self.GetNatgateway()
if nat != nil {
return nat.GetCloudproviderId()
}
return ""
}
func (self *SNatDEntry) syncRemoveCloudNatDTable(ctx context.Context, userCred mcclient.TokenCredential) error {
lockman.LockObject(ctx, self)
defer lockman.ReleaseObject(ctx, self)
+8
View File
@@ -63,6 +63,14 @@ type SNatSEntry struct {
SourceCIDR string `width:"22" charset:"ascii" list:"user" create:"required"`
}
func (self *SNatSEntry) GetCloudproviderId() string {
network, err := self.GetNetwork()
if err == nil {
return network.GetCloudproviderId()
}
return ""
}
func (self *SNatSEntry) GetNetwork() (*SNetwork, error) {
if len(self.NetworkId) == 0 {
return nil, nil
+2 -2
View File
@@ -631,7 +631,7 @@ func (manager *SNetworkManager) SyncNetworks(ctx context.Context, userCred mccli
if err != nil {
syncResult.UpdateError(err)
} else {
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
localNets = append(localNets, commondb[i])
remoteNets = append(remoteNets, commonext[i])
syncResult.Update()
@@ -642,7 +642,7 @@ func (manager *SNetworkManager) SyncNetworks(ctx context.Context, userCred mccli
if err != nil {
syncResult.AddError(err)
} else {
syncMetadata(ctx, userCred, new, added[i])
syncVirtualResourceMetadata(ctx, userCred, new, added[i])
localNets = append(localNets, *new)
remoteNets = append(remoteNets, added[i])
syncResult.Add()
+5 -1
View File
@@ -371,6 +371,10 @@ func (sp *SSnapshotPolicy) getMoreDetails(out api.SnapshotPolicyDetails) api.Sna
return out
}
func (sp *SSnapshotPolicy) GetCloudproviderId() string {
return ""
}
// ==================================================== sync ===========================================================
func (manager *SSnapshotPolicyManager) SyncSnapshotPolicies(ctx context.Context, userCred mcclient.TokenCredential,
provider *SCloudprovider, region *SCloudregion, cloudSPs []cloudprovider.ICloudSnapshotPolicy,
@@ -507,7 +511,7 @@ func (manager *SSnapshotPolicyManager) allNewFromCloudSnapshotPolicy(
if err != nil {
syncResult.AddError(err)
} else {
syncMetadata(ctx, userCred, local, added[i])
syncVirtualResourceMetadata(ctx, userCred, local, added[i])
syncResult.Add()
}
}
+2 -2
View File
@@ -955,7 +955,7 @@ func (manager *SSnapshotManager) SyncSnapshots(ctx context.Context, userCred mcc
if err != nil {
syncResult.UpdateError(err)
} else {
syncMetadata(ctx, userCred, &commondb[i], commonext[i])
syncVirtualResourceMetadata(ctx, userCred, &commondb[i], commonext[i])
syncResult.Update()
}
}
@@ -964,7 +964,7 @@ func (manager *SSnapshotManager) SyncSnapshots(ctx context.Context, userCred mcc
if err != nil {
syncResult.AddError(err)
} else {
syncMetadata(ctx, userCred, local, added[i])
syncVirtualResourceMetadata(ctx, userCred, local, added[i])
syncResult.Add()
}
}
+39 -2
View File
@@ -25,9 +25,10 @@ import (
)
type IMetadataSetter interface {
// SetAllMetadata(ctx context.Context, meta map[string]interface{}, userCred mcclient.TokenCredential) error
// SetMetadata(ctx context.Context, key string, value interface{}, userCred mcclient.TokenCredential) error
SetCloudMetadataAll(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 {
@@ -50,6 +51,42 @@ func syncMetadata(ctx context.Context, userCred mcclient.TokenCredential, model
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
}
}
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
}
}
if len(store) > 0 {
model.SetCloudMetadataAll(ctx, store, userCred)
}
return nil
}
func SyncMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IMetadataSetter, remote cloudprovider.ICloudResource) error {
return syncMetadata(ctx, userCred, model, remote)
}
func SyncVirtualResourceMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IMetadataSetter, remote cloudprovider.IVirtualResource) error {
return syncVirtualResourceMetadata(ctx, userCred, model, remote)
}
+8
View File
@@ -63,6 +63,14 @@ func (self *SWireResourceBase) GetWire() *SWire {
return nil
}
func (self *SWireResourceBase) GetCloudproviderId() string {
vpc := self.GetVpc()
if vpc != nil {
return vpc.ManagerId
}
return ""
}
func (self *SWireResourceBase) GetVpc() *SVpc {
wire := self.GetWire()
if wire != nil {
+4
View File
@@ -171,6 +171,10 @@ func (zone *SZone) GetExtraDetails(ctx context.Context, userCred mcclient.TokenC
return api.ZoneDetails{}, nil
}
func (zone *SZone) GetCloudproviderId() string {
return ""
}
func (zone *SZone) GetCloudRegionId() string {
if len(zone.CloudregionId) == 0 {
return "default"