diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 9f85111b1b..d42499fcd0 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -771,7 +771,7 @@ func syncRegionSnapshotPolicies(ctx context.Context, userCred mcclient.TokenCred } result := SnapshotPolicyManager.SyncSnapshotPolicies( - ctx, userCred, provider, localRegion, snapshotPolicies, provider.ProjectId) + ctx, userCred, provider, localRegion, snapshotPolicies, provider.GetOwnerId()) syncResults.Add(SnapshotPolicyManager, result) msg := result.Result() log.Infof("SyncSnapshotPolicies for region %s result: %s", localRegion.Name, msg) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 08f13fb6e2..8482fa8ac9 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -757,7 +757,7 @@ func (self *SDisk) PerformApplySnapshotPolicy( ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject, ) (jsonutils.JSONObject, error) { - spv := validators.NewModelIdOrNameValidator("snapshotpolicy", "snapshotpolicy", userCred.GetProjectId()) + spv := validators.NewModelIdOrNameValidator("snapshotpolicy", "snapshotpolicy", userCred) if err := spv.Validate(data.(*jsonutils.JSONDict)); err != nil { return nil, err } @@ -1198,7 +1198,7 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke extPolicyId := extDisk.GetExtSnapshotPolicyId() if len(extPolicyId) > 0 { - isp, _ := SnapshotPolicyManager.FetchByExternalId(extPolicyId) + isp, _ := db.FetchByExternalId(SnapshotPolicyManager, extPolicyId) if isp != nil { self.SnapshotPolicyId = isp.GetId() } @@ -1253,7 +1253,7 @@ func (manager *SDiskManager) newFromCloudDisk(ctx context.Context, userCred mccl extPolicyId := extDisk.GetExtSnapshotPolicyId() if len(extPolicyId) > 0 { - isp, _ := SnapshotPolicyManager.FetchByExternalId(extPolicyId) + isp, _ := db.FetchByExternalId(SnapshotPolicyManager, extPolicyId) if isp != nil { disk.SnapshotPolicyId = isp.GetId() } diff --git a/pkg/compute/models/snapshotpolicy.go b/pkg/compute/models/snapshotpolicy.go index ec3f9061b4..8d52937239 100644 --- a/pkg/compute/models/snapshotpolicy.go +++ b/pkg/compute/models/snapshotpolicy.go @@ -40,6 +40,8 @@ type SSnapshotPolicyManager struct { type SSnapshotPolicy struct { db.SVirtualResourceBase + db.SExternalizedResourceBase + SManagedResourceBase SCloudregionResourceBase @@ -63,26 +65,26 @@ func init() { } } -func (manager *SSnapshotPolicyManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId string, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { +func (manager *SSnapshotPolicyManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { input := &compute.SSnapshotPolicyCreateInput{} err := data.Unmarshal(input) if err != nil { return nil, httperrors.NewInputParameterError("Unmarshal input failed %s", err) } - input.ProjectId = ownerProjId + input.ProjectId = ownerId.GetProjectId() - err = db.NewNameValidator(manager, ownerProjId, input.Name) + err = db.NewNameValidator(manager, ownerId, input.Name) if err != nil { return nil, err } - managerIdV := validators.NewModelIdOrNameValidator("manager", "cloudprovider", "") + managerIdV := validators.NewModelIdOrNameValidator("manager", "cloudprovider", nil) if err := managerIdV.Validate(data); err != nil { return nil, err } input.ManagerId, _ = data.GetString("manager_id") - cloudregionV := validators.NewModelIdOrNameValidator("cloudregion", "cloudregion", ownerProjId) + cloudregionV := validators.NewModelIdOrNameValidator("cloudregion", "cloudregion", ownerId) err = cloudregionV.Validate(data) if err != nil { return nil, err @@ -98,11 +100,11 @@ func (manager *SSnapshotPolicyManager) ValidateCreateData(ctx context.Context, u return data, nil } -func (self *SSnapshotPolicy) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId string, query jsonutils.JSONObject, data jsonutils.JSONObject) { - self.StartCreateSnapshotPolicy(ctx, userCred, ownerProjId, query, data) +func (self *SSnapshotPolicy) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { + self.StartCreateSnapshotPolicy(ctx, userCred, ownerId, query, data) } -func (self *SSnapshotPolicy) StartCreateSnapshotPolicy(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId string, query jsonutils.JSONObject, data jsonutils.JSONObject) error { +func (self *SSnapshotPolicy) StartCreateSnapshotPolicy(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error { if task, err := taskman.TaskManager.NewTask(ctx, "SnapshotPolicyCreateTask", self, userCred, nil, "", "", nil); err != nil { return err } else { @@ -180,11 +182,9 @@ func (self *SSnapshotPolicy) GenerateCreateSpParams() (*cloudprovider.SnapshotPo }, nil } -func (manager *SSnapshotPolicyManager) SyncSnapshotPolicies(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, region *SCloudregion, snapshots []cloudprovider.ICloudSnapshotPolicy, projectId string) compare.SyncResult { - syncOwnerProjId := projectId - - lockman.LockClass(ctx, manager, syncOwnerProjId) - defer lockman.ReleaseClass(ctx, manager, syncOwnerProjId) +func (manager *SSnapshotPolicyManager) SyncSnapshotPolicies(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, region *SCloudregion, snapshots []cloudprovider.ICloudSnapshotPolicy, syncOwnerId mcclient.IIdentityProvider) compare.SyncResult { + lockman.LockClass(ctx, manager, db.GetLockClassKey(manager, syncOwnerId)) + defer lockman.ReleaseClass(ctx, manager, db.GetLockClassKey(manager, syncOwnerId)) syncResult := compare.SyncResult{} dbSnapshotPolicies, err := manager.getProviderSnapshotPolicies(region, provider) if err != nil { @@ -210,7 +210,7 @@ func (manager *SSnapshotPolicyManager) SyncSnapshotPolicies(ctx context.Context, } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].SyncWithCloudSnapshotPolicy(ctx, userCred, commonext[i], projectId, region) + err = commondb[i].SyncWithCloudSnapshotPolicy(ctx, userCred, commonext[i], syncOwnerId, region) if err != nil { syncResult.UpdateError(err) } else { @@ -219,7 +219,7 @@ func (manager *SSnapshotPolicyManager) SyncSnapshotPolicies(ctx context.Context, } } for i := 0; i < len(added); i += 1 { - local, err := manager.newFromCloudSnapshotPolicy(ctx, userCred, added[i], region, syncOwnerProjId, provider) + local, err := manager.newFromCloudSnapshotPolicy(ctx, userCred, added[i], region, syncOwnerId, provider) if err != nil { syncResult.AddError(err) } else { @@ -260,7 +260,7 @@ func (self *SSnapshotPolicy) RealDelete(ctx context.Context, userCred mcclient.T return db.DeleteModel(ctx, userCred, self) } -func (self *SSnapshotPolicy) SyncWithCloudSnapshotPolicy(ctx context.Context, userCred mcclient.TokenCredential, ext cloudprovider.ICloudSnapshotPolicy, projectId string, region *SCloudregion) error { +func (self *SSnapshotPolicy) SyncWithCloudSnapshotPolicy(ctx context.Context, userCred mcclient.TokenCredential, ext cloudprovider.ICloudSnapshotPolicy, ownerId mcclient.IIdentityProvider, region *SCloudregion) error { diff, err := db.UpdateWithLock(ctx, self, func() error { self.Name = ext.GetName() self.Status = ext.GetStatus() @@ -280,19 +280,19 @@ func (self *SSnapshotPolicy) SyncWithCloudSnapshotPolicy(ctx context.Context, us return nil }) db.OpsLog.LogSyncUpdate(self, diff, userCred) - SyncCloudProject(userCred, self, projectId, ext, self.ManagerId) + SyncCloudProject(userCred, self, ownerId, ext, self.ManagerId) return err } func (manager *SSnapshotPolicyManager) newFromCloudSnapshotPolicy( ctx context.Context, userCred mcclient.TokenCredential, ext cloudprovider.ICloudSnapshotPolicy, region *SCloudregion, - projectId string, provider *SCloudprovider, + syncOwnerId mcclient.IIdentityProvider, provider *SCloudprovider, ) (*SSnapshotPolicy, error) { snapshotPolicy := SSnapshotPolicy{} - snapshotPolicy.SetModelManager(manager) + snapshotPolicy.SetModelManager(manager, &snapshotPolicy) - newName, err := db.GenerateName(manager, projectId, ext.GetName()) + newName, err := db.GenerateName(manager, syncOwnerId, ext.GetName()) if err != nil { return nil, err } @@ -319,7 +319,7 @@ func (manager *SSnapshotPolicyManager) newFromCloudSnapshotPolicy( return nil, err } - SyncCloudProject(userCred, &snapshotPolicy, projectId, ext, snapshotPolicy.ManagerId) + SyncCloudProject(userCred, &snapshotPolicy, syncOwnerId, ext, snapshotPolicy.ManagerId) db.OpsLog.LogEvent(&snapshotPolicy, db.ACT_CREATE, snapshotPolicy.GetShortDesc(ctx), userCred) return &snapshotPolicy, nil } diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index c3de613b52..bcc9a1f29c 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -848,7 +848,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateSnapshotPolicy(ctx if err != nil { return nil, err } - sp.SetExternalId(userCred, policyId) + err = db.SetExternalId(sp, userCred, policyId) if err != nil { return nil, err } diff --git a/pkg/compute/regiondrivers/openstack.go b/pkg/compute/regiondrivers/openstack.go index 44ded2433a..9cdd3d6462 100644 --- a/pkg/compute/regiondrivers/openstack.go +++ b/pkg/compute/regiondrivers/openstack.go @@ -51,7 +51,7 @@ func (self *SOpenStackRegionDriver) ValidateCreateLoadbalancerCertificateData(ct } func (self *SOpenStackRegionDriver) ValidateCreateEipData(ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - networkV := validators.NewModelIdOrNameValidator("network", "network", "") + networkV := validators.NewModelIdOrNameValidator("network", "network", nil) err := networkV.Validate(data) if err != nil { return nil, err diff --git a/pkg/compute/tasks/snapshotpolicy_create_task.go b/pkg/compute/tasks/snapshotpolicy_create_task.go index 20bfe3125a..caebbad2e9 100644 --- a/pkg/compute/tasks/snapshotpolicy_create_task.go +++ b/pkg/compute/tasks/snapshotpolicy_create_task.go @@ -70,11 +70,13 @@ type SnapshotPolicyApplyTask struct { func (self *SnapshotPolicyApplyTask) taskFail(ctx context.Context, sp *models.SSnapshotPolicy, reason string) { stringIds, _ := getDiskIds(self) disks := make([]models.SDisk, 0) - models.DiskManager.Query().In("id", stringIds).All(&disks) - for i := 0; i < len(disks); i++ { - disks[i].SetModelManager(models.DiskManager) - db.OpsLog.LogEvent(&disks[i], db.ACT_APPLY_SNAPSHOT_POLICY_FAILED, reason, self.UserCred) - logclient.AddActionLogWithStartable(self, &disks[i], logclient.ACT_APPLY_SNAPSHOT_POLICY, reason, self.UserCred, false) + q := models.DiskManager.Query().In("id", stringIds) + err := db.FetchModelObjects(models.DiskManager, q, &disks) + if err == nil { + for i := 0; i < len(disks); i++ { + db.OpsLog.LogEvent(&disks[i], db.ACT_APPLY_SNAPSHOT_POLICY_FAILED, reason, self.UserCred) + logclient.AddActionLogWithStartable(self, &disks[i], logclient.ACT_APPLY_SNAPSHOT_POLICY, reason, self.UserCred, false) + } } self.SetStageFailed(ctx, reason) } @@ -129,13 +131,13 @@ func (self *SnapshotPolicyApplyTask) OnInit(ctx context.Context, obj db.IStandal func (self *SnapshotPolicyApplyTask) OnSnapshotPolicyApply(ctx context.Context, sp *models.SSnapshotPolicy, data jsonutils.JSONObject) { stringIds, _ := getDiskIds(self) disks := make([]models.SDisk, 0) - err := models.DiskManager.Query().In("id", stringIds).All(&disks) + q := models.DiskManager.Query().In("id", stringIds) + err := db.FetchModelObjects(models.DiskManager, q, &disks) if err != nil { - self.taskFail(ctx, sp, fmt.Sprintf("Fetch disks failed %s", err)) + self.taskFail(ctx, sp, fmt.Sprintf("Fetch disks failed %s", err)) return } for i := 0; i < len(disks); i++ { - disks[i].SetModelManager(models.DiskManager) disks[i].SetSnapshotPolicy(sp.Id) db.OpsLog.LogEvent(&disks[i], db.ACT_APPLY_SNAPSHOT_POLICY, nil, self.UserCred) logclient.AddActionLogWithStartable(self, &disks[i], logclient.ACT_APPLY_SNAPSHOT_POLICY, nil, self.UserCred, true) diff --git a/pkg/multicloud/doc.go b/pkg/multicloud/doc.go new file mode 100644 index 0000000000..2513ce679b --- /dev/null +++ b/pkg/multicloud/doc.go @@ -0,0 +1 @@ +package multicloud // import "yunion.io/x/onecloud/pkg/multicloud"