From 60cdc3fdda415cb94fbaeb62196f9a919cce8413 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 23 Jun 2020 16:51:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E5=90=8C=E6=AD=A5proj?= =?UTF-8?q?ect=E6=A0=87=E7=AD=BE=E5=88=B0=E6=9C=AC=E5=9C=B0=E8=B5=84?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/hostdrivers/managedvirtual.go | 2 +- pkg/compute/models/cloudaccounts.go | 8 +++- pkg/compute/models/cloudsync.go | 2 +- pkg/compute/models/dbinstances.go | 4 +- pkg/compute/models/disks.go | 12 +++++- pkg/compute/models/elasticcache_instances.go | 4 +- pkg/compute/models/elasticips.go | 4 +- pkg/compute/models/external_projects.go | 18 ++++---- pkg/compute/models/guests.go | 8 ++++ pkg/compute/models/loadbalancerbackends.go | 8 ++++ .../models/loadbalancerlistenerresource.go | 8 ++++ pkg/compute/models/loadbalancers.go | 8 +++- pkg/compute/models/managedresource.go | 4 ++ pkg/compute/models/natdtable.go | 8 ++++ pkg/compute/models/natstable.go | 8 ++++ pkg/compute/models/networks.go | 4 +- pkg/compute/models/snapshotpolicy.go | 6 ++- pkg/compute/models/snapshots.go | 4 +- pkg/compute/models/syncutils.go | 41 ++++++++++++++++++- pkg/compute/models/wireresource.go | 8 ++++ pkg/compute/models/zones.go | 4 ++ 21 files changed, 141 insertions(+), 32 deletions(-) diff --git a/pkg/compute/hostdrivers/managedvirtual.go b/pkg/compute/hostdrivers/managedvirtual.go index 8f8bdcf420..f3e421b548 100644 --- a/pkg/compute/hostdrivers/managedvirtual.go +++ b/pkg/compute/hostdrivers/managedvirtual.go @@ -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") diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 8276dbda44..9915aae1c4 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -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") } diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 01bddb1849..09162c9241 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -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) diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index b9f78f974b..7a28f6ac7d 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -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() diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index ad37463784..90eaf72ed1 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -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() diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index eb3d091620..57410e0a84 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -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() diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index e87573fb24..d72abe9e65 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -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() } } diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index 7ea8a13a61..671684eec3 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -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 diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 250647b4a3..979c7f7710 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -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) diff --git a/pkg/compute/models/loadbalancerbackends.go b/pkg/compute/models/loadbalancerbackends.go index 55c644886c..29c5387b32 100644 --- a/pkg/compute/models/loadbalancerbackends.go +++ b/pkg/compute/models/loadbalancerbackends.go @@ -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 { diff --git a/pkg/compute/models/loadbalancerlistenerresource.go b/pkg/compute/models/loadbalancerlistenerresource.go index 8b75c4524b..64db0166af 100644 --- a/pkg/compute/models/loadbalancerlistenerresource.go +++ b/pkg/compute/models/loadbalancerlistenerresource.go @@ -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 { diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index a46c8b0dc9..e9dfc5e0b7 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -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() diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index 6129d9d57e..7a6d7f39cf 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -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 { diff --git a/pkg/compute/models/natdtable.go b/pkg/compute/models/natdtable.go index 4a159537ce..3294f74583 100644 --- a/pkg/compute/models/natdtable.go +++ b/pkg/compute/models/natdtable.go @@ -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) diff --git a/pkg/compute/models/natstable.go b/pkg/compute/models/natstable.go index 26ebaa5d29..0ad34d9825 100644 --- a/pkg/compute/models/natstable.go +++ b/pkg/compute/models/natstable.go @@ -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 diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 4012f43819..8c0c89c482 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -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() diff --git a/pkg/compute/models/snapshotpolicy.go b/pkg/compute/models/snapshotpolicy.go index 044934cfec..b3e2d729d2 100644 --- a/pkg/compute/models/snapshotpolicy.go +++ b/pkg/compute/models/snapshotpolicy.go @@ -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() } } diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index e6a886a7cf..d2ed35a76f 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -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() } } diff --git a/pkg/compute/models/syncutils.go b/pkg/compute/models/syncutils.go index 5acba7e123..17cc8dbfe2 100644 --- a/pkg/compute/models/syncutils.go +++ b/pkg/compute/models/syncutils.go @@ -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) +} diff --git a/pkg/compute/models/wireresource.go b/pkg/compute/models/wireresource.go index 895d7c666e..627fa9b5c7 100644 --- a/pkg/compute/models/wireresource.go +++ b/pkg/compute/models/wireresource.go @@ -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 { diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index b320a1d007..1ffcb3040d 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -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"