Merge pull request #5938 from ioito/automated-cherry-pick-of-#5915-upstream-release-3.2

Automated cherry pick of #5915: fix: 自动创建项目
This commit is contained in:
yunion-ci-robot
2020-04-23 13:40:53 +08:00
committed by GitHub
2 changed files with 56 additions and 45 deletions
+43 -39
View File
@@ -322,56 +322,60 @@ func (self *SCloudprovider) getPassword() (string, error) {
return utils.DescryptAESBase64(self.Id, self.Secret)
}
func (self *SCloudprovider) syncProject(ctx context.Context, userCred mcclient.TokenCredential) error {
if len(self.ProjectId) > 0 {
_, err := db.TenantCacheManager.FetchTenantById(ctx, self.ProjectId)
if err != nil && err != sql.ErrNoRows {
log.Errorf("fetch existing tenant by id fail %s", err)
return errors.Wrap(err, "db.TenantCacheManager.FetchTenantById")
} else if err == nil {
return nil // find the project, skip sync
func getTenant(ctx context.Context, projectId string, name string) (*db.STenant, error) {
if len(projectId) > 0 {
tenant, err := db.TenantCacheManager.FetchTenantById(ctx, projectId)
if err != nil {
return nil, errors.Wrap(err, "TenantCacheManager.FetchTenantById")
}
return tenant, nil
}
if len(self.Name) == 0 {
log.Errorf("syncProject: provider name is empty???")
return errors.Error("cannot syncProject for empty name")
if len(name) == 0 {
return nil, errors.Error("cannot syncProject for empty name")
}
return db.TenantCacheManager.FetchTenantByName(ctx, name)
}
tenant, err := db.TenantCacheManager.FetchTenantByIdOrName(ctx, self.Name)
if err != nil && err != sql.ErrNoRows {
log.Errorf("fetchTenantByIdorName error %s: %s", self.Name, err)
return errors.Wrap(err, "db.TenantCacheManager.FetchTenantByIdOrName")
func createTenant(ctx context.Context, name, domainId, desc string) (string, string, error) {
s := auth.GetAdminSession(ctx, options.Options.Region, "")
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(name), "generate_name")
params.Add(jsonutils.NewString(domainId), "domain_id")
params.Add(jsonutils.NewString(desc), "description")
resp, err := modules.Projects.Create(s, params)
if err != nil {
return "", "", errors.Wrap(err, "Projects.Create")
}
projectId, err := resp.GetString("id")
if err != nil {
return "", "", errors.Wrap(err, "resp.GetString")
}
return domainId, projectId, nil
}
func getOrCreateTenant(ctx context.Context, name, domainId, projectId, desc string) (string, string, error) {
tenant, err := getTenant(ctx, projectId, name)
if err != nil && errors.Cause(err) != sql.ErrNoRows {
return "", "", err
}
if err == sql.ErrNoRows || tenant.DomainId != domainId {
return createTenant(ctx, name, domainId, desc)
}
return tenant.DomainId, tenant.Id, nil
}
func (self *SCloudprovider) syncProject(ctx context.Context, userCred mcclient.TokenCredential) error {
account := self.GetCloudaccount()
if account == nil {
return errors.Error("no valid cloudaccount???")
}
var projectId, domainId string
if err == sql.ErrNoRows || tenant.DomainId != account.DomainId { // create one
s := auth.GetAdminSession(ctx, options.Options.Region, "")
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(self.Name), "generate_name")
domainId = account.DomainId
params.Add(jsonutils.NewString(domainId), "domain_id")
params.Add(jsonutils.NewString(fmt.Sprintf("auto create from cloud provider %s (%s)", self.Name, self.Id)), "description")
project, err := modules.Projects.Create(s, params)
if err != nil {
log.Errorf("create project fail %s", err)
return err
}
projectId, err = project.GetString("id")
if err != nil {
return err
}
} else {
domainId = tenant.DomainId
projectId = tenant.Id
desc := fmt.Sprintf("auto create from cloud provider %s (%s)", self.Name, self.Id)
domainId, projectId, err := getOrCreateTenant(ctx, self.Name, account.DomainId, self.ProjectId, desc)
if err != nil {
return errors.Wrap(err, "getOrCreateTenant")
}
return self.saveProject(userCred, domainId, projectId)
+13 -6
View File
@@ -214,18 +214,25 @@ func (manager *SExternalProjectManager) newFromCloudProject(ctx context.Context,
project := SExternalProject{}
project.SetModelManager(manager, &project)
newName, err := db.GenerateName(manager, userCred, extProject.GetName())
if err != nil {
return nil, err
}
project.Name = newName
project.Name = extProject.GetName()
project.ExternalId = extProject.GetGlobalId()
project.IsEmulated = extProject.IsEmulated()
project.ManagerId = provider.Id
project.DomainId = provider.DomainId
project.ProjectId = provider.ProjectId
account := provider.GetCloudaccount()
if account != nil && account.AutoCreateProject {
desc := fmt.Sprintf("auto create from cloud project %s (%s)", project.Name, project.ExternalId)
domainId, projectId, err := getOrCreateTenant(ctx, project.Name, provider.DomainId, "", desc)
if err != nil {
log.Errorf("failed to get or create tenant %s(%s) %v", project.Name, project.ExternalId, err)
} else {
project.DomainId = domainId
project.ProjectId = projectId
}
}
err = manager.TableSpec().Insert(&project)
err := manager.TableSpec().Insert(&project)
if err != nil {
log.Errorf("newFromCloudProject fail %s", err)
return nil, err