fix: sync resource's share state

This commit is contained in:
Qiu Jian
2020-04-11 06:49:13 +08:00
parent 524ccc5c5f
commit 7a6cdc6e02
6 changed files with 67 additions and 17 deletions
+15
View File
@@ -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")
+10 -3
View File
@@ -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)
}
+9 -4
View File
@@ -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
+9 -4
View File
@@ -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
+12 -6
View File
@@ -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
+12
View File
@@ -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,
},
},
},
{