From 7a6cdc6e02739bdb0d06aa21d16aadd8af8f5468 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 10 Apr 2020 00:58:59 +0800 Subject: [PATCH] fix: sync resource's share state --- pkg/compute/models/cloudaccounts.go | 15 +++++++++++++++ pkg/compute/models/hosts.go | 13 ++++++++++--- pkg/compute/models/storages.go | 13 +++++++++---- pkg/compute/models/vpcs.go | 13 +++++++++---- pkg/compute/models/wires.go | 18 ++++++++++++------ pkg/compute/policy/defaults.go | 12 ++++++++++++ 6 files changed, 67 insertions(+), 17 deletions(-) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 2cbfc79a25..51c7bdd29b 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -1956,6 +1956,10 @@ func (account *SCloudaccount) AllowPerformPublic(ctx context.Context, userCred m } func (account *SCloudaccount) PerformPublic(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.CloudaccountPerformPublicInput) (jsonutils.JSONObject, error) { + if !account.CanSync() { + return nil, errors.Wrap(httperrors.ErrInvalidStatus, "cannot public in sync") + } + if input.ShareMode != api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN && input.ShareMode != api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM { return nil, errors.Wrap(httperrors.ErrInputParameter, "share_mode cannot be account_domain") } @@ -1984,6 +1988,9 @@ func (account *SCloudaccount) PerformPublic(ctx context.Context, userCred mcclie return nil, errors.Wrap(err, "account.setShareMode") } + syncRange := &SSyncRange{FullSync: true} + account.StartSyncCloudProviderInfoTask(ctx, userCred, syncRange, "") + return nil, nil } @@ -1992,6 +1999,10 @@ func (account *SCloudaccount) AllowPerformPrivate(ctx context.Context, userCred } func (account *SCloudaccount) PerformPrivate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformPrivateInput) (jsonutils.JSONObject, error) { + if !account.CanSync() { + return nil, errors.Wrap(httperrors.ErrInvalidStatus, "cannot private in sync") + } + providers := account.GetCloudproviders() for i := range providers { if providers[i].DomainId != account.DomainId { @@ -2012,6 +2023,9 @@ func (account *SCloudaccount) PerformPrivate(ctx context.Context, userCred mccli return nil, errors.Wrap(err, "account.setShareMode") } + syncRange := &SSyncRange{FullSync: true} + account.StartSyncCloudProviderInfoTask(ctx, userCred, syncRange, "") + return nil, nil } @@ -2022,6 +2036,7 @@ func (account *SCloudaccount) AllowPerformShareMode(ctx context.Context, userCre // Deprecated func (account *SCloudaccount) PerformShareMode(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.CloudaccountShareModeInput) (jsonutils.JSONObject, error) { + err := input.Validate() if err != nil { return nil, errors.Wrap(err, "CloudaccountShareModeInput.Validate") diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 38b37954d9..9e584be506 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -1520,7 +1520,7 @@ func (manager *SHostManager) SyncHosts(ctx context.Context, userCred mcclient.To } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].syncWithCloudHost(ctx, userCred, commonext[i], provider.GetOwnerId()) + err = commondb[i].syncWithCloudHost(ctx, userCred, commonext[i], provider) if err != nil { syncResult.UpdateError(err) } else { @@ -1566,7 +1566,7 @@ func (self *SHost) syncRemoveCloudHost(ctx context.Context, userCred mcclient.To return err } -func (self *SHost) syncWithCloudHost(ctx context.Context, userCred mcclient.TokenCredential, extHost cloudprovider.ICloudHost, syncOwnerId mcclient.IIdentityProvider) error { +func (self *SHost) syncWithCloudHost(ctx context.Context, userCred mcclient.TokenCredential, extHost cloudprovider.ICloudHost, provider *SCloudprovider) error { diff, err := db.UpdateWithLock(ctx, self, func() error { // self.Name = extHost.GetName() @@ -1612,7 +1612,10 @@ func (self *SHost) syncWithCloudHost(ctx context.Context, userCred mcclient.Toke db.OpsLog.LogSyncUpdate(self, diff, userCred) - SyncCloudDomain(userCred, self, syncOwnerId) + if provider != nil { + SyncCloudDomain(userCred, self, provider.GetOwnerId()) + self.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) + } if err := HostManager.ClearSchedDescCache(self.Id); err != nil { log.Errorf("ClearSchedDescCache for host %s error %v", self.Name, err) @@ -1723,6 +1726,10 @@ func (manager *SHostManager) newFromCloudHost(ctx context.Context, userCred mccl SyncCloudDomain(userCred, &host, provider.GetOwnerId()) + if provider != nil { + host.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) + } + if err := manager.ClearSchedDescCache(host.Id); err != nil { log.Errorf("ClearSchedDescCache for host %s error %v", host.Name, err) } diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 982640b08c..e26dcd336e 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -716,7 +716,7 @@ func (manager *SStorageManager) SyncStorages(ctx context.Context, userCred mccli } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].syncWithCloudStorage(ctx, userCred, commonext[i], provider.GetOwnerId()) + err = commondb[i].syncWithCloudStorage(ctx, userCred, commonext[i], provider) if err != nil { syncResult.UpdateError(err) } else { @@ -757,7 +757,7 @@ func (self *SStorage) syncRemoveCloudStorage(ctx context.Context, userCred mccli return err } -func (self *SStorage) syncWithCloudStorage(ctx context.Context, userCred mcclient.TokenCredential, extStorage cloudprovider.ICloudStorage, syncOwnerId mcclient.IIdentityProvider) error { +func (self *SStorage) syncWithCloudStorage(ctx context.Context, userCred mcclient.TokenCredential, extStorage cloudprovider.ICloudStorage, provider *SCloudprovider) error { diff, err := db.UpdateWithLock(ctx, self, func() error { // self.Name = extStorage.GetName() self.Status = extStorage.GetStatus() @@ -780,8 +780,9 @@ func (self *SStorage) syncWithCloudStorage(ctx context.Context, userCred mcclien log.Errorf("syncWithCloudZone error %s", err) } - if syncOwnerId != nil { - SyncCloudDomain(userCred, self, syncOwnerId) + if provider != nil { + SyncCloudDomain(userCred, self, provider.GetOwnerId()) + self.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) } db.OpsLog.LogSyncUpdate(self, diff, userCred) @@ -821,6 +822,10 @@ func (manager *SStorageManager) newFromCloudStorage(ctx context.Context, userCre SyncCloudDomain(userCred, &storage, provider.GetOwnerId()) + if provider != nil { + storage.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) + } + db.OpsLog.LogEvent(&storage, db.ACT_CREATE, storage.GetShortDesc(ctx), userCred) return &storage, nil diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index f210c5c577..26f977a1c9 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -378,7 +378,7 @@ func (manager *SVpcManager) SyncVPCs(ctx context.Context, userCred mcclient.Toke } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].SyncWithCloudVpc(ctx, userCred, commonext[i], provider.GetOwnerId()) + err = commondb[i].SyncWithCloudVpc(ctx, userCred, commonext[i], provider) if err != nil { syncResult.UpdateError(err) continue @@ -490,7 +490,7 @@ func (self *SVpc) SyncGlobalVpc(ctx context.Context, userCred mcclient.TokenCred return nil } -func (self *SVpc) SyncWithCloudVpc(ctx context.Context, userCred mcclient.TokenCredential, extVPC cloudprovider.ICloudVpc, syncOwnerId mcclient.IIdentityProvider) error { +func (self *SVpc) SyncWithCloudVpc(ctx context.Context, userCred mcclient.TokenCredential, extVPC cloudprovider.ICloudVpc, provider *SCloudprovider) error { diff, err := db.UpdateWithLock(ctx, self, func() error { extVPC.Refresh() // self.Name = extVPC.GetName() @@ -507,8 +507,9 @@ func (self *SVpc) SyncWithCloudVpc(ctx context.Context, userCred mcclient.TokenC return err } - if syncOwnerId != nil { - SyncCloudDomain(userCred, self, syncOwnerId) + if provider != nil { + SyncCloudDomain(userCred, self, provider.GetOwnerId()) + self.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) } db.OpsLog.LogSyncUpdate(self, diff, userCred) @@ -542,6 +543,10 @@ func (manager *SVpcManager) newFromCloudVpc(ctx context.Context, userCred mcclie SyncCloudDomain(userCred, &vpc, provider.GetOwnerId()) + if provider != nil { + vpc.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) + } + db.OpsLog.LogEvent(&vpc, db.ACT_CREATE, vpc.GetShortDesc(ctx), userCred) return &vpc, nil diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index ff4ab79a4d..616429c154 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -306,7 +306,7 @@ func (manager *SWireManager) SyncWires(ctx context.Context, userCred mcclient.To } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].syncWithCloudWire(ctx, userCred, commonext[i], provider.GetOwnerId()) + err = commondb[i].syncWithCloudWire(ctx, userCred, commonext[i], provider) if err != nil { syncResult.UpdateError(err) } else { @@ -317,7 +317,7 @@ func (manager *SWireManager) SyncWires(ctx context.Context, userCred mcclient.To } } for i := 0; i < len(added); i += 1 { - new, err := manager.newFromCloudWire(ctx, userCred, added[i], vpc, provider.GetOwnerId()) + new, err := manager.newFromCloudWire(ctx, userCred, added[i], vpc, provider) if err != nil { syncResult.AddError(err) } else { @@ -350,7 +350,7 @@ func (self *SWire) syncRemoveCloudWire(ctx context.Context, userCred mcclient.To return err } -func (self *SWire) syncWithCloudWire(ctx context.Context, userCred mcclient.TokenCredential, extWire cloudprovider.ICloudWire, syncOwnerId mcclient.IIdentityProvider) error { +func (self *SWire) syncWithCloudWire(ctx context.Context, userCred mcclient.TokenCredential, extWire cloudprovider.ICloudWire, provider *SCloudprovider) error { diff, err := db.UpdateWithLock(ctx, self, func() error { // self.Name = extWire.GetName() self.Bandwidth = extWire.GetBandwidth() // 10G @@ -363,7 +363,10 @@ func (self *SWire) syncWithCloudWire(ctx context.Context, userCred mcclient.Toke log.Errorf("syncWithCloudWire error %s", err) } - SyncCloudDomain(userCred, self, syncOwnerId) + if provider != nil { + SyncCloudDomain(userCred, self, provider.GetOwnerId()) + self.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) + } db.OpsLog.LogSyncUpdate(self, diff, userCred) return err @@ -380,7 +383,7 @@ func (self *SWire) markNetworkUnknown(userCred mcclient.TokenCredential) error { return nil } -func (manager *SWireManager) newFromCloudWire(ctx context.Context, userCred mcclient.TokenCredential, extWire cloudprovider.ICloudWire, vpc *SVpc, syncOwnerId mcclient.IIdentityProvider) (*SWire, error) { +func (manager *SWireManager) newFromCloudWire(ctx context.Context, userCred mcclient.TokenCredential, extWire cloudprovider.ICloudWire, vpc *SVpc, provider *SCloudprovider) (*SWire, error) { wire := SWire{} wire.SetModelManager(manager, &wire) @@ -409,7 +412,10 @@ func (manager *SWireManager) newFromCloudWire(ctx context.Context, userCred mccl return nil, err } - SyncCloudDomain(userCred, &wire, syncOwnerId) + if provider != nil { + SyncCloudDomain(userCred, &wire, provider.GetOwnerId()) + wire.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) + } db.OpsLog.LogEvent(&wire, db.ACT_CREATE, wire.GetShortDesc(ctx), userCred) return &wire, nil diff --git a/pkg/compute/policy/defaults.go b/pkg/compute/policy/defaults.go index 0dc21c1f7a..83e9a95223 100644 --- a/pkg/compute/policy/defaults.go +++ b/pkg/compute/policy/defaults.go @@ -269,6 +269,18 @@ var ( Action: PolicyActionGet, Result: rbacutils.Allow, }, + { + Service: api.SERVICE_TYPE, + Resource: "proxysettings", + Action: PolicyActionList, + Result: rbacutils.Allow, + }, + { + Service: api.SERVICE_TYPE, + Resource: "proxysettings", + Action: PolicyActionGet, + Result: rbacutils.Allow, + }, }, }, {