From c0e0806dca687f8d5959df42c9fa66ccb62d3f23 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 1 Jul 2019 16:55:58 +0800 Subject: [PATCH 1/2] fix: 1. idp sync fail to sync group domainId 2. idp delete fail --- pkg/compute/models/networks.go | 4 ++-- pkg/keystone/models/groups.go | 7 +++++-- pkg/keystone/models/identity_provider.go | 4 ++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 7a4dbcb03b..980e958115 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1584,9 +1584,9 @@ func (manager *SNetworkManager) InitializeData() error { } func (self *SNetwork) ValidateUpdateCondition(ctx context.Context) error { - if len(self.ExternalId) > 0 { + /*if len(self.ExternalId) > 0 { return httperrors.NewConflictError("Cannot update external resource") - } + }*/ return self.SSharableVirtualResourceBase.ValidateUpdateCondition(ctx) } diff --git a/pkg/keystone/models/groups.go b/pkg/keystone/models/groups.go index 03330a3a6e..3d7265bb2a 100644 --- a/pkg/keystone/models/groups.go +++ b/pkg/keystone/models/groups.go @@ -176,7 +176,7 @@ func (manager *SGroupManager) RegisterExternalGroup(ctx context.Context, idpId s group := SGroup{} group.SetModelManager(manager, &group) - q := manager.Query().Equals("id", pubId) + q := manager.RawQuery().Equals("id", pubId) err = q.First(&group) if err != nil && err != sql.ErrNoRows { return nil, errors.Wrap(err, "Query") @@ -191,9 +191,12 @@ func (manager *SGroupManager) RegisterExternalGroup(ctx context.Context, idpId s if err != nil { return nil, errors.Wrap(err, "Insert") } - } else if group.Displayname != groupName { + } else { _, err = db.Update(&group, func() error { + group.DomainId = domainId + group.Name = groupName group.Displayname = groupName + group.MarkUnDelete() return nil }) if err != nil { diff --git a/pkg/keystone/models/identity_provider.go b/pkg/keystone/models/identity_provider.go index 579b03a8b7..0d3758e9c5 100644 --- a/pkg/keystone/models/identity_provider.go +++ b/pkg/keystone/models/identity_provider.go @@ -627,6 +627,10 @@ func (self *SIdentityProvider) Purge(ctx context.Context, userCred mcclient.Toke if err != nil { return errors.Wrap(err, "domain.ValidatePurgeCondition") } + err = domains[i].UnlinkIdp(self.Id) + if err != nil { + return errors.Wrap(err, "domains[i].UnlinkIdp") + } err = domains[i].Delete(ctx, userCred) if err != nil { return errors.Wrap(err, "delete domain") From d45e2e797654982902ad0198ba9c77f15ddbf468 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 1 Jul 2019 18:13:46 +0800 Subject: [PATCH 2/2] fix: generate unique name should exclude existing name --- pkg/cloudcommon/db/namevalidator.go | 12 +++++++++++- pkg/keystone/driver/ldap/sync.go | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pkg/cloudcommon/db/namevalidator.go b/pkg/cloudcommon/db/namevalidator.go index 8793226d2c..6ebb6ac9f9 100644 --- a/pkg/cloudcommon/db/namevalidator.go +++ b/pkg/cloudcommon/db/namevalidator.go @@ -80,6 +80,10 @@ func alterNameValidator(model IModel, name string) error { } func GenerateName(manager IModelManager, ownerId mcclient.IIdentityProvider, hint string) (string, error) { + return GenerateName2(manager, ownerId, hint, nil) +} + +func GenerateName2(manager IModelManager, ownerId mcclient.IIdentityProvider, hint string, model IModel) (string, error) { _, pattern, patternLen := stringutils.ParseNamePattern(hint) var name string idx := 1 @@ -90,7 +94,13 @@ func GenerateName(manager IModelManager, ownerId mcclient.IIdentityProvider, hin idx += 1 } for { - uniq, err := isNameUnique(manager, ownerId, name) + var uniq bool + var err error + if model == nil { + uniq, err = isNameUnique(manager, ownerId, name) + } else { + uniq, err = isAlterNameUnique(model, name) + } if err != nil { return "", err } diff --git a/pkg/keystone/driver/ldap/sync.go b/pkg/keystone/driver/ldap/sync.go index 5517e67681..46b577ba98 100644 --- a/pkg/keystone/driver/ldap/sync.go +++ b/pkg/keystone/driver/ldap/sync.go @@ -174,7 +174,7 @@ func (self *SLDAPDriver) syncDomainInfo(ctx context.Context, info SDomainInfo) ( if err == nil { if domain.Name != info.Name { // sync domain name - newName, err := db.GenerateName(models.DomainManager, nil, info.Name) + newName, err := db.GenerateName2(models.DomainManager, nil, info.Name, domain) if err != nil { log.Errorf("sync existing domain name (%s=%s) generate fail %s", domain.Name, info.Name, err) } else {