Skip to content

Commit

Permalink
fix: 修正项目映射同步
Browse files Browse the repository at this point in the history
  • Loading branch information
Qu Xuan committed Jun 30, 2020
1 parent 5de04eb commit b25295b
Show file tree
Hide file tree
Showing 23 changed files with 609 additions and 174 deletions.
10 changes: 9 additions & 1 deletion pkg/apis/compute/externalproject.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,16 @@ package compute

import "yunion.io/x/onecloud/pkg/apis"

const (
EXTERNAL_PROJECT_STATUS_AVAILABLE = "available" // 可用
EXTERNAL_PROJECT_STATUS_UNAVAILABLE = "unavailable" // 不可用
EXTERNAL_PROJECT_STATUS_CREATING = "creating" // 创建中
EXTERNAL_PROJECT_STATUS_DELETING = "deleting" // 删除中
EXTERNAL_PROJECT_STATUS_UNKNOWN = "unknown" // 未知
)

type ExternalProjectDetails struct {
apis.StandaloneResourceDetails
apis.StatusStandaloneResourceDetails
apis.ProjectizedResourceInfo
ManagedResourceInfo

Expand Down
2 changes: 1 addition & 1 deletion pkg/apis/compute/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ type CachedimageListInput struct {
}

type ExternalProjectListInput struct {
apis.StandaloneResourceListInput
apis.StatusStandaloneResourceListInput
apis.ProjectizedResourceListInput
apis.ExternalizedResourceBaseListInput

Expand Down
18 changes: 17 additions & 1 deletion pkg/compute/guestdrivers/esxi.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,10 +234,26 @@ func (self *SESXiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gues
}
config.Add(jsonutils.NewString(extId), "guest_ext_id")

accessInfo, err := host.GetCloudaccount().GetVCenterAccessInfo(storage.ExternalId)
account := host.GetCloudaccount()
accessInfo, err := account.GetVCenterAccessInfo(storage.ExternalId)
if err != nil {
return err
}

action, _ := config.GetString("action")
if action == "create" {
extProj, name, err := account.GetExternalProject(ctx, task.GetUserCred(), guest.ProjectId)
if err != nil {
log.Errorf("failed to get external project %s from account %s(%s) error: %v", guest.ProjectId, account.Name, account.Id, err)
}
if extProj != nil {
config.Add(jsonutils.NewString(extProj.ExternalId), "desc", "group_id")
}
if len(name) > 0 {
config.Add(jsonutils.NewString(name), "desc", "resource_pool")
}
}

config.Add(jsonutils.Marshal(accessInfo), "datastore")

url := "/disks/agent/deploy"
Expand Down
74 changes: 74 additions & 0 deletions pkg/compute/models/cloudaccounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -2426,6 +2426,16 @@ func (self *SCloudaccount) Delete(ctx context.Context, userCred mcclient.TokenCr

func (self *SCloudaccount) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
self.SetStatus(userCred, api.CLOUD_PROVIDER_DELETED, "real delete")
projects, err := self.GetExternalProjects()
if err != nil {
return errors.Wrap(err, "GetExternalProjects")
}
for i := range projects {
err = projects[i].Delete(ctx, userCred)
if err != nil {
return errors.Wrapf(err, "project %s Delete", projects[i].Id)
}
}
return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
}

Expand Down Expand Up @@ -2756,6 +2766,16 @@ func (account *SCloudaccount) PerformSyncSkus(ctx context.Context, userCred mccl
return nil, nil
}

func (self *SCloudaccount) GetExternalProjects() ([]SExternalProject, error) {
projects := []SExternalProject{}
q := ExternalProjectManager.Query().Equals("cloudaccount_id", self.Id)
err := db.FetchModelObjects(ExternalProjectManager, q, &projects)
if err != nil {
return nil, errors.Wrap(err, "db.FetchModelObjects")
}
return projects, nil
}

func (manager *SCloudaccountManager) queryCloudAccountByCapability(region *SCloudregion, zone *SZone, domainId string, enabled tristate.TriState, capability string) *sqlchemy.SQuery {
providers := CloudproviderManager.Query().SubQuery()
q := manager.Query()
Expand Down Expand Up @@ -2847,3 +2867,57 @@ func (account *SCloudaccount) GetUsages() []db.IUsage {
&usage,
}
}

func (self *SCloudaccount) GetExternalProject(ctx context.Context, userCred mcclient.TokenCredential, id string) (*SExternalProject, string, error) {
projects, err := self.GetExternalProjects()
if err != nil {
return nil, "", errors.Wrap(err, "GetExternalProjects")
}
for i := range projects {
if projects[i].ProjectId == id && projects[i].Status == api.EXTERNAL_PROJECT_STATUS_AVAILABLE {
return &projects[i], projects[i].Name, nil
}
}

project, err := db.TenantCacheManager.FetchById(id)
if err != nil {
return nil, "", errors.Wrap(err, "TenantCacheManager.FetchById")
}

for i := range projects {
if projects[i].Name == project.GetName() {
if projects[i].Status != api.EXTERNAL_PROJECT_STATUS_AVAILABLE {
return nil, "", fmt.Errorf("external project %s not available", projects[i].Name)
}
return &projects[i], project.GetName(), nil
}
}
return nil, project.GetName(), cloudprovider.ErrNotFound
}

func (self *SCloudaccount) SyncProject(ctx context.Context, userCred mcclient.TokenCredential, id string) (string, error) {
lockman.LockRawObject(ctx, self.Id, id)
defer lockman.ReleaseRawObject(ctx, self.Id, id)

project, _, err := self.GetExternalProject(ctx, userCred, id)
if err == nil {
return project.ExternalId, nil
}
if err != cloudprovider.ErrNotFound {
return "", err
}

provider, err := self.GetProvider()
if err != nil {
return "", errors.Wrap(err, "GetProvider")
}
iProject, err := provider.CreateIProject(project.GetName())
if err != nil {
return "", errors.Wrap(err, "CreateIProject")
}
extProj, err := ExternalProjectManager.newFromCloudProject(ctx, userCred, self, iProject)
if err != nil {
return "", errors.Wrap(err, "newFromCloudProject")
}
return extProj.ExternalId, nil
}
50 changes: 4 additions & 46 deletions pkg/compute/models/cloudproviders.go
Original file line number Diff line number Diff line change
Expand Up @@ -1369,7 +1369,6 @@ func (self *SCloudprovider) RealDelete(ctx context.Context, userCred mcclient.To
ElasticipManager,
NetworkInterfaceManager,
CloudproviderRegionManager,
ExternalProjectManager,
CloudregionManager,
CloudproviderQuotaManager,
} {
Expand Down Expand Up @@ -1625,51 +1624,10 @@ func (provider *SCloudprovider) GetChangeOwnerCandidateDomainIds() []string {
return []string{}
}

func (self *SCloudprovider) GetExternalProjects() ([]SExternalProject, error) {
q := ExternalProjectManager.Query().Equals("manager_id", self.Id)
projects := []SExternalProject{}
err := db.FetchModelObjects(ExternalProjectManager, q, &projects)
if err != nil {
return nil, errors.Wrap(err, "FetchModelObjects")
}
return projects, nil
}

func (self *SCloudprovider) SyncProject(ctx context.Context, userCred mcclient.TokenCredential, id string) (string, error) {
lockman.LockRawObject(ctx, self.Id, id)
defer lockman.ReleaseRawObject(ctx, self.Id, id)

projects, err := self.GetExternalProjects()
if err != nil {
return "", errors.Wrap(err, "GetExternalProjects")
}
for _, project := range projects {
if project.ProjectId == id {
return project.ExternalId, nil
}
}

project, err := db.TenantCacheManager.FetchById(id)
if err != nil {
return "", errors.Wrap(err, "TenantCacheManager.FetchById")
}

for _, extProj := range projects {
if extProj.Name == project.GetName() {
return extProj.ExternalId, nil
}
}
provider, err := self.GetProvider()
if err != nil {
return "", errors.Wrap(err, "GetProvider")
}
iProject, err := provider.CreateIProject(project.GetName())
if err != nil {
return "", errors.Wrap(err, "CreateIProject")
}
extProj, err := ExternalProjectManager.newFromCloudProject(ctx, userCred, self, iProject)
if err != nil {
return "", errors.Wrap(err, "newFromCloudProject")
account := self.GetCloudaccount()
if account == nil {
return "", fmt.Errorf("failed to get cloudprovider %s account", self.Name)
}
return extProj.ExternalId, nil
return account.SyncProject(ctx, userCred, id)
}
32 changes: 1 addition & 31 deletions pkg/compute/models/cloudsync.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,28 +172,6 @@ func syncRegionSkus(ctx context.Context, userCred mcclient.TokenCredential, loca
}
}

func syncProjects(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, driver cloudprovider.ICloudProvider, provider *SCloudprovider) {
projects, err := driver.GetIProjects()
if err != nil {
msg := fmt.Sprintf("GetIProjects for provider %s failed %s", provider.GetName(), err)
log.Errorf(msg)
// logSyncFailed(provider, task, msg)
return
}

result := ExternalProjectManager.SyncProjects(ctx, userCred, provider, projects)

syncResults.Add(ExternalProjectManager, result)

msg := result.Result()
log.Infof("SyncProjects for provider %s result: %s", provider.Name, msg)
if result.IsError() {
// logSyncFailed(provider, task, msg)
return
}
// db.OpsLog.LogEvent(provider, db.ACT_SYNC_PROJECT_COMPLETE, msg, task.UserCred)
}

func syncRegionEips(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion, syncRange *SSyncRange) {
eips, err := remoteRegion.GetIEips()
if err != nil {
Expand Down Expand Up @@ -1027,10 +1005,6 @@ func syncPublicCloudProviderInfo(

storageCachePairs := make([]sStoragecacheSyncPair, 0)

if cloudprovider.IsSupportProject(driver) {
syncProjects(ctx, userCred, syncResults, driver, provider)
}

syncRegionQuotas(ctx, userCred, syncResults, driver, provider, localRegion, remoteRegion)

localZones, remoteZones, _ := syncRegionZones(ctx, userCred, syncResults, provider, localRegion, remoteRegion)
Expand Down Expand Up @@ -1124,10 +1098,6 @@ func syncOnPremiseCloudProviderInfo(
) error {
log.Debugf("Start sync on-premise provider %s(%s)", provider.Name, provider.Provider)

if cloudprovider.IsSupportProject(driver) {
syncProjects(ctx, userCred, syncResults, driver, provider)
}

iregion, err := driver.GetOnPremiseIRegion()
if err != nil {
msg := fmt.Sprintf("GetOnPremiseIRegion for provider %s failed %s", provider.GetName(), err)
Expand Down Expand Up @@ -1221,7 +1191,7 @@ func SyncCloudProject(userCred mcclient.TokenCredential, model db.IVirtualModel,
if extProjectId := extModel.GetProjectId(); len(extProjectId) > 0 {
extProject, err := ExternalProjectManager.GetProject(extProjectId, managerId)
if err != nil {
log.Errorln(err)
log.Errorf("sync project for %s %s error: %v", model.Keyword(), model.GetName(), err)
} else {
newOwnerId = extProject.GetOwnerId()
}
Expand Down

0 comments on commit b25295b

Please sign in to comment.