Files
cloudpods/pkg/cloudcommon/db/namevalidator.go
2019-01-05 22:37:21 +08:00

69 lines
1.6 KiB
Go

package db
import (
"fmt"
"yunion.io/x/onecloud/pkg/cloudcommon/consts"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/pkg/util/stringutils"
)
func isNameUnique(manager IModelManager, owner string, name string) bool {
q := manager.Query()
q = manager.FilterByName(q, name)
if !consts.IsGlobalVirtualResourceNamespace() {
q = manager.FilterByOwner(q, owner)
}
return q.Count() == 0
}
func NewNameValidator(manager IModelManager, ownerProjId string, name string) error {
err := manager.ValidateName(name)
if err != nil {
return err
}
if !isNameUnique(manager, ownerProjId, name) {
return httperrors.NewDuplicateNameError("name", name)
}
return nil
}
func isAlterNameUnique(model IModel, name string) bool {
manager := model.GetModelManager()
q := manager.Query()
q = manager.FilterByName(q, name)
if !consts.IsGlobalVirtualResourceNamespace() {
q = manager.FilterByOwner(q, model.GetOwnerProjectId())
}
q = manager.FilterByNotId(q, model.GetId())
return q.Count() == 0
}
func alterNameValidator(model IModel, name string) error {
err := model.GetModelManager().ValidateName(name)
if err != nil {
return err
}
if !isAlterNameUnique(model, name) {
return httperrors.NewDuplicateNameError("name", name)
}
return nil
}
func GenerateName(manager IModelManager, ownerProjId string, hint string) string {
_, pattern, patternLen := stringutils.ParseNamePattern(hint)
var name string
idx := 1
if patternLen == 0 {
name = hint
} else {
name = fmt.Sprintf(pattern, idx)
idx += 1
}
for !isNameUnique(manager, ownerProjId, name) {
name = fmt.Sprintf(pattern, idx)
idx += 1
}
return name
}