mirror of
https://github.com/kubevela/kubevela.git
synced 2026-05-16 06:16:52 +00:00
* Feat: add the rbac data model Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: add some api about the project Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: add CRUD about the project and the project user Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: add CRUD about the role and perm check filter function Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: update swagger config Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: add default roles and perm policies Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: add perm check filter for all webservice Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: change the method that find project name Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: query applications and envs by user perm Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: support get login user info Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Fix: change default permissions Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: change PermPolicy to Permission Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Feat: add some unit test and fix the e2e test error Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Fix: change some comment word Signed-off-by: barnettZQG <barnett.zqg@gmail.com> * Fix: e2e api path error Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
232 lines
6.6 KiB
Go
232 lines
6.6 KiB
Go
/*
|
|
Copyright 2022 The KubeVela Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
"github.com/oam-dev/kubevela/pkg/apiserver/datastore"
|
|
"github.com/oam-dev/kubevela/pkg/apiserver/model"
|
|
apisv1 "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1"
|
|
"github.com/oam-dev/kubevela/pkg/apiserver/rest/utils/bcode"
|
|
)
|
|
|
|
var _ = Describe("Test authentication usecase functions", func() {
|
|
var (
|
|
userUsecase *userUsecaseImpl
|
|
ds datastore.DataStore
|
|
db string
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
var err error
|
|
db = "user-test-" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
|
ds, err = NewDatastore(datastore.Config{Type: "kubeapi", Database: db})
|
|
Expect(ds).ToNot(BeNil())
|
|
Expect(err).Should(BeNil())
|
|
rbacUsecase := &rbacUsecaseImpl{ds: ds}
|
|
projectUsecase := &projectUsecaseImpl{k8sClient: k8sClient, ds: ds, rbacUsecase: rbacUsecase}
|
|
sysUsecase := &systemInfoUsecaseImpl{ds: ds}
|
|
userUsecase = &userUsecaseImpl{ds: ds, projectUsecase: projectUsecase, sysUsecase: sysUsecase, rbacUsecase: rbacUsecase}
|
|
})
|
|
AfterEach(func() {
|
|
err := k8sClient.Delete(context.Background(), &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: db}})
|
|
Expect(err).Should(BeNil())
|
|
})
|
|
It("Test create user", func() {
|
|
user, err := userUsecase.CreateUser(context.Background(), apisv1.CreateUserRequest{
|
|
Name: "name",
|
|
Alias: "alias",
|
|
Email: "email@example.com",
|
|
Password: "password",
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
Expect(user.Name).Should(Equal("name"))
|
|
Expect(user.Alias).Should(Equal("alias"))
|
|
Expect(user.Email).Should(Equal("email@example.com"))
|
|
|
|
u := &model.User{
|
|
Name: "name",
|
|
}
|
|
err = ds.Get(context.Background(), u)
|
|
Expect(err).Should(BeNil())
|
|
Expect(u.Name).Should(Equal("name"))
|
|
Expect(u.Alias).Should(Equal("alias"))
|
|
Expect(u.Email).Should(Equal("email@example.com"))
|
|
Expect(u.Disabled).Should(Equal(false))
|
|
Expect(compareHashWithPassword(u.Password, "password")).Should(BeNil())
|
|
})
|
|
|
|
It("Test detail user", func() {
|
|
ctx := context.Background()
|
|
err := ds.Add(ctx, &model.User{
|
|
Name: "name",
|
|
Alias: "alias",
|
|
Email: "email@example.com",
|
|
Password: "password",
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
for i := 0; i < 2; i++ {
|
|
err = ds.Add(ctx, &model.ProjectUser{
|
|
Username: "name",
|
|
ProjectName: fmt.Sprintf("project-%d", i),
|
|
UserRoles: []string{fmt.Sprintf("user-role-%d", i)},
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
err = ds.Add(ctx, &model.Project{
|
|
Name: fmt.Sprintf("project-%d", i),
|
|
Alias: fmt.Sprintf("project-alias-%d", i),
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
}
|
|
|
|
userModel := &model.User{
|
|
Name: "name",
|
|
}
|
|
err = ds.Get(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
user, err := userUsecase.DetailUser(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
Expect(user.Name).Should(Equal("name"))
|
|
Expect(user.Alias).Should(Equal("alias"))
|
|
Expect(user.Email).Should(Equal("email@example.com"))
|
|
Expect(len(user.Projects)).Should(Equal(2))
|
|
})
|
|
|
|
It("Test list users", func() {
|
|
ctx := context.Background()
|
|
for i := 0; i < 2; i++ {
|
|
err := ds.Add(ctx, &model.User{
|
|
Name: fmt.Sprintf("name-%d", i),
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
}
|
|
users, err := userUsecase.ListUsers(ctx, 0, 10, apisv1.ListUserOptions{Name: "1"})
|
|
Expect(err).Should(BeNil())
|
|
Expect(users.Total).Should(Equal(int64(1)))
|
|
|
|
users, err = userUsecase.ListUsers(ctx, 0, 10, apisv1.ListUserOptions{})
|
|
Expect(err).Should(BeNil())
|
|
Expect(users.Total).Should(Equal(int64(2)))
|
|
})
|
|
|
|
It("Test delete user", func() {
|
|
ctx := context.Background()
|
|
err := ds.Add(ctx, &model.User{
|
|
Name: "name",
|
|
Alias: "alias",
|
|
Email: "email@example.com",
|
|
Password: "password",
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
users, err := userUsecase.ListUsers(ctx, 0, 10, apisv1.ListUserOptions{})
|
|
Expect(err).Should(BeNil())
|
|
Expect(users.Total).Should(Equal(int64(1)))
|
|
|
|
err = userUsecase.DeleteUser(ctx, "name")
|
|
Expect(err).Should(BeNil())
|
|
users, err = userUsecase.ListUsers(ctx, 0, 10, apisv1.ListUserOptions{})
|
|
Expect(err).Should(BeNil())
|
|
Expect(users.Total).Should(Equal(int64(0)))
|
|
})
|
|
|
|
It("Test update user", func() {
|
|
ctx := context.Background()
|
|
userModel := &model.User{
|
|
Name: "name",
|
|
Alias: "alias",
|
|
Email: "email@example.com",
|
|
Password: "password",
|
|
}
|
|
err := ds.Add(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
_, err = userUsecase.UpdateUser(ctx, userModel, apisv1.UpdateUserRequest{
|
|
Alias: "new-alias",
|
|
Password: "new-password",
|
|
})
|
|
Expect(err).Should(BeNil())
|
|
newUser := &model.User{
|
|
Name: "name",
|
|
}
|
|
err = ds.Get(ctx, newUser)
|
|
Expect(err).Should(BeNil())
|
|
Expect(newUser.Alias).Should(Equal("new-alias"))
|
|
Expect(compareHashWithPassword(newUser.Password, "new-password")).Should(BeNil())
|
|
})
|
|
|
|
It("Test disable user", func() {
|
|
ctx := context.Background()
|
|
userModel := &model.User{
|
|
Name: "name",
|
|
Disabled: true,
|
|
}
|
|
err := ds.Add(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
err = userUsecase.DisableUser(ctx, userModel)
|
|
Expect(err).Should(Equal(bcode.ErrUserAlreadyDisabled))
|
|
userModel.Disabled = false
|
|
err = ds.Put(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
err = userUsecase.DisableUser(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
newUser := &model.User{
|
|
Name: "name",
|
|
}
|
|
err = ds.Get(ctx, newUser)
|
|
Expect(err).Should(BeNil())
|
|
Expect(newUser.Disabled).Should(Equal(true))
|
|
})
|
|
|
|
It("Test enable user", func() {
|
|
ctx := context.Background()
|
|
userModel := &model.User{
|
|
Name: "name",
|
|
Disabled: false,
|
|
}
|
|
err := ds.Add(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
err = userUsecase.EnableUser(ctx, userModel)
|
|
Expect(err).Should(Equal(bcode.ErrUserAlreadyEnabled))
|
|
userModel.Disabled = true
|
|
err = ds.Put(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
err = userUsecase.EnableUser(ctx, userModel)
|
|
Expect(err).Should(BeNil())
|
|
|
|
newUser := &model.User{
|
|
Name: "name",
|
|
}
|
|
err = ds.Get(ctx, newUser)
|
|
Expect(err).Should(BeNil())
|
|
Expect(newUser.Disabled).Should(Equal(false))
|
|
})
|
|
})
|