提交 49d40f48 编写于 作者: H hongming

fix bug:db init failed,clusterrolebinding sync error

上级 7f780bd3
...@@ -15,6 +15,8 @@ import ( ...@@ -15,6 +15,8 @@ import (
"regexp" "regexp"
"sort"
"kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/constants"
"kubesphere.io/kubesphere/pkg/models/iam" "kubesphere.io/kubesphere/pkg/models/iam"
"kubesphere.io/kubesphere/pkg/models/metrics" "kubesphere.io/kubesphere/pkg/models/metrics"
...@@ -452,14 +454,26 @@ func UserWorkspaceListHandler(req *restful.Request, resp *restful.Response) { ...@@ -452,14 +454,26 @@ func UserWorkspaceListHandler(req *restful.Request, resp *restful.Response) {
keyword := req.QueryParameter("keyword") keyword := req.QueryParameter("keyword")
username := req.HeaderParameter(UserNameHeader) username := req.HeaderParameter(UserNameHeader)
list, err := workspaces.ListWorkspaceByUser(username, keyword) ws, err := workspaces.ListWorkspaceByUser(username, keyword)
if err != nil { if err != nil {
resp.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()}) resp.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
return return
} }
resp.WriteEntity(list) sort.Slice(ws, func(i, j int) bool {
t1, err := ws[i].GetCreateTime()
if err != nil {
return false
}
t2, err := ws[j].GetCreateTime()
if err != nil {
return true
}
return t1.After(t2)
})
resp.WriteEntity(ws)
} }
func UserNamespaceListHandler(req *restful.Request, resp *restful.Response) { func UserNamespaceListHandler(req *restful.Request, resp *restful.Response) {
......
...@@ -22,7 +22,6 @@ import ( ...@@ -22,7 +22,6 @@ import (
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/api/core/v1"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"net" "net"
...@@ -38,6 +37,8 @@ import ( ...@@ -38,6 +37,8 @@ import (
"sync" "sync"
"syscall" "syscall"
"k8s.io/api/core/v1"
_ "kubesphere.io/kubesphere/pkg/apis/v1alpha" _ "kubesphere.io/kubesphere/pkg/apis/v1alpha"
"kubesphere.io/kubesphere/pkg/client" "kubesphere.io/kubesphere/pkg/client"
"kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/constants"
...@@ -74,36 +75,42 @@ func newKubeSphereServer(options *options.ServerRunOptions) *kubeSphereServer { ...@@ -74,36 +75,42 @@ func newKubeSphereServer(options *options.ServerRunOptions) *kubeSphereServer {
func preCheck() error { func preCheck() error {
k8sClient := client.NewK8sClient() k8sClient := client.NewK8sClient()
_, err := k8sClient.CoreV1().Namespaces().Get(constants.KubeSphereControlNamespace, metaV1.GetOptions{}) _, err := k8sClient.CoreV1().Namespaces().Get(constants.KubeSphereControlNamespace, metaV1.GetOptions{})
if err != nil && !errors.IsNotFound(err) { if err != nil {
return err if errors.IsNotFound(err) {
} _, err = k8sClient.CoreV1().Namespaces().Create(&v1.Namespace{ObjectMeta: metaV1.ObjectMeta{Name: constants.KubeSphereControlNamespace}})
if err != nil {
if errors.IsNotFound(err) { return err
namespace := v1.Namespace{ObjectMeta: metaV1.ObjectMeta{Name: constants.KubeSphereControlNamespace}} }
_, err = k8sClient.CoreV1().Namespaces().Create(&namespace) } else {
if err != nil {
return err return err
} }
} }
_, err = k8sClient.AppsV1().Deployments(constants.KubeSphereControlNamespace).Get(constants.AdminUserName, metaV1.GetOptions{}) _, err = k8sClient.AppsV1().Deployments(constants.KubeSphereControlNamespace).Get(constants.AdminUserName, metaV1.GetOptions{})
if errors.IsNotFound(err) { if err != nil {
models.CreateKubeConfig(constants.AdminUserName) if errors.IsNotFound(err) {
models.CreateKubectlDeploy(constants.AdminUserName) if err = models.CreateKubeConfig(constants.AdminUserName); err != nil {
return nil return err
}
if err = models.CreateKubectlDeploy(constants.AdminUserName); err != nil {
return err
}
} else {
return err
}
} }
db := client.NewSharedDBClient() db := client.NewSharedDBClient()
defer db.Close() defer db.Close()
if !db.HasTable(&workspaces.WorkspaceNSBinding{}) {
db.CreateTable(&workspaces.WorkspaceNSBinding{})
}
if !db.HasTable(&workspaces.WorkspaceDPBinding{}) { if !db.HasTable(&workspaces.WorkspaceDPBinding{}) {
db.CreateTable(&workspaces.WorkspaceDPBinding{}) if err := db.CreateTable(&workspaces.WorkspaceDPBinding{}).Error; err != nil {
return err
}
} }
return err
return nil
} }
func registerSwagger() { func registerSwagger() {
......
...@@ -50,7 +50,7 @@ func (ctl *ClusterRoleBindingCtl) total() int { ...@@ -50,7 +50,7 @@ func (ctl *ClusterRoleBindingCtl) total() int {
} }
func (ctl *ClusterRoleBindingCtl) handleWorkspaceRoleChange(clusterRole *rbac.ClusterRoleBinding) { func (ctl *ClusterRoleBindingCtl) handleWorkspaceRoleChange(clusterRole *rbac.ClusterRoleBinding) {
if groups := regexp.MustCompile("^system:(\\w+):(admin|operator|viewer)$").FindStringSubmatch(clusterRole.Name); len(groups) == 3 { if groups := regexp.MustCompile(`^system:(\S+):(admin|operator|viewer)$`).FindStringSubmatch(clusterRole.Name); len(groups) == 3 {
workspace := groups[1] workspace := groups[1]
go ctl.restNamespaceRoleBinding(workspace) go ctl.restNamespaceRoleBinding(workspace)
} }
......
...@@ -26,9 +26,8 @@ type Group struct { ...@@ -26,9 +26,8 @@ type Group struct {
Description string `json:"description"` Description string `json:"description"`
} }
type WorkspaceNSBinding struct { func (g Group) GetCreateTime() (time.Time, error) {
Workspace string `gorm:"primary_key"` return time.Parse("2006-01-02T15:04:05Z", g.CreateTime)
Namespace string `gorm:"primary_key"`
} }
type WorkspaceDPBinding struct { type WorkspaceDPBinding struct {
......
...@@ -119,7 +119,7 @@ func createDefaultDevopsRoleBinding(workspace string, project DevopsProject) { ...@@ -119,7 +119,7 @@ func createDefaultDevopsRoleBinding(workspace string, project DevopsProject) {
admins := iam.GetWorkspaceUsers(workspace, "admin") admins := iam.GetWorkspaceUsers(workspace, "admin")
for _, admin := range admins { for _, admin := range admins {
createDevopsRoleBinding(workspace, *project.ProjectId, admin, "maintainer") createDevopsRoleBinding(workspace, *project.ProjectId, admin, "owner")
} }
viewers := iam.GetWorkspaceUsers(workspace, "viewer") viewers := iam.GetWorkspaceUsers(workspace, "viewer")
...@@ -402,7 +402,11 @@ func Create(workspace *Workspace) (*Workspace, error) { ...@@ -402,7 +402,11 @@ func Create(workspace *Workspace) (*Workspace, error) {
created.Namespaces = make([]string, 0) created.Namespaces = make([]string, 0)
created.DevopsProjects = make([]string, 0) created.DevopsProjects = make([]string, 0)
go WorkspaceRoleInit(workspace) err = WorkspaceRoleInit(workspace)
if err != nil {
return nil, err
}
return &created, nil return &created, nil
} }
...@@ -512,7 +516,7 @@ func ListWorkspaceByUser(username string, keyword string) ([]*Workspace, error) ...@@ -512,7 +516,7 @@ func ListWorkspaceByUser(username string, keyword string) ([]*Workspace, error)
} else { } else {
workspaceNames := make([]string, 0) workspaceNames := make([]string, 0)
for _, clusterRole := range clusterRoles { for _, clusterRole := range clusterRoles {
if groups := regexp.MustCompile(`^system:(\w+):(admin|operator|viewer)$`).FindStringSubmatch(clusterRole.Name); len(groups) == 3 { if groups := regexp.MustCompile(`^system:(\S+):(admin|operator|viewer)$`).FindStringSubmatch(clusterRole.Name); len(groups) == 3 {
if !slice.ContainsString(workspaceNames, groups[1], nil) { if !slice.ContainsString(workspaceNames, groups[1], nil) {
workspaceNames = append(workspaceNames, groups[1]) workspaceNames = append(workspaceNames, groups[1])
} }
...@@ -710,7 +714,14 @@ func convertGroupToWorkspace(db *gorm.DB, group Group) (*Workspace, error) { ...@@ -710,7 +714,14 @@ func convertGroupToWorkspace(db *gorm.DB, group Group) (*Workspace, error) {
} }
func CreateNamespace(namespace *core.Namespace) (*core.Namespace, error) { func CreateNamespace(namespace *core.Namespace) (*core.Namespace, error) {
return client.NewK8sClient().CoreV1().Namespaces().Create(namespace)
ns, err := client.NewK8sClient().CoreV1().Namespaces().Create(namespace)
if err != nil {
return nil, err
}
return ns, nil
} }
func Invite(workspaceName string, users []UserInvite) error { func Invite(workspaceName string, users []UserInvite) error {
...@@ -1157,7 +1168,7 @@ func CreateWorkspaceRoleBinding(workspace *Workspace, username string, role stri ...@@ -1157,7 +1168,7 @@ func CreateWorkspaceRoleBinding(workspace *Workspace, username string, role stri
modify = true modify = true
roleBinding.Subjects = append(roleBinding.Subjects, v1.Subject{Kind: v1.UserKind, Name: username}) roleBinding.Subjects = append(roleBinding.Subjects, v1.Subject{Kind: v1.UserKind, Name: username})
if roleName == "admin" { if roleName == "admin" {
go createDevopsRoleBinding(workspace.Name, "", username, "maintainer") go createDevopsRoleBinding(workspace.Name, "", username, "owner")
} else if roleName == "viewer" { } else if roleName == "viewer" {
go createDevopsRoleBinding(workspace.Name, "", username, "reporter") go createDevopsRoleBinding(workspace.Name, "", username, "reporter")
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册