register.go 12.3 KB
Newer Older
H
hongming 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*

 Copyright 2019 The KubeSphere 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 v1alpha2

import (
	"github.com/emicklei/go-restful"
	"github.com/emicklei/go-restful-openapi"
H
hongming 已提交
23
	"k8s.io/api/core/v1"
H
hongming 已提交
24
	"k8s.io/apimachinery/pkg/runtime/schema"
H
hongming 已提交
25
	"kubesphere.io/kubesphere/pkg/api"
J
Jeff 已提交
26
	devopsv1alpha2 "kubesphere.io/kubesphere/pkg/api/devops/v1alpha2"
H
hongming 已提交
27
	"kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1"
H
hongming 已提交
28
	"kubesphere.io/kubesphere/pkg/apiserver/runtime"
H
hongming 已提交
29
	"kubesphere.io/kubesphere/pkg/constants"
H
hongming 已提交
30
	"kubesphere.io/kubesphere/pkg/models"
H
hongming 已提交
31
	"kubesphere.io/kubesphere/pkg/models/iam/policy"
J
Jeff 已提交
32
	"kubesphere.io/kubesphere/pkg/server/errors"
J
Jeff 已提交
33
	"kubesphere.io/kubesphere/pkg/server/params"
H
hongming 已提交
34 35
	"kubesphere.io/kubesphere/pkg/simple/client/k8s"
	"kubesphere.io/kubesphere/pkg/simple/client/mysql"
36

R
runzexia 已提交
37
	"net/http"
H
hongming 已提交
38 39
)

R
runzexia 已提交
40 41 42
const (
	GroupName = "tenant.kubesphere.io"
)
H
hongming 已提交
43 44 45

var GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha2"}

H
hongming 已提交
46
func AddToContainer(c *restful.Container, k8sClient k8s.Client, db *mysql.Database) error {
H
hongming 已提交
47
	ws := runtime.NewWebService(GroupVersion)
H
hongming 已提交
48
	handler := newTenantHandler(k8sClient, db)
H
hongming 已提交
49 50

	ws.Route(ws.GET("/workspaces").
H
hongming 已提交
51 52
		To(handler.ListWorkspaces).
		Returns(http.StatusOK, api.StatusOK, models.PageableResponse{}).
R
Ray Zhou 已提交
53
		Doc("List all workspaces that belongs to the current user").
H
hongming 已提交
54
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
55
	ws.Route(ws.GET("/workspaces/{workspace}").
H
hongming 已提交
56
		To(handler.DescribeWorkspace).
R
Ray Zhou 已提交
57
		Doc("Describe the specified workspace").
H
hongming 已提交
58
		Param(ws.PathParameter("workspace", "workspace name")).
H
hongming 已提交
59
		Returns(http.StatusOK, api.StatusOK, v1alpha1.Workspace{}).
H
hongming 已提交
60
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
61
	ws.Route(ws.GET("/workspaces/{workspace}/rules").
H
hongming 已提交
62
		To(handler.ListWorkspaceRules).
H
hongming 已提交
63
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
64
		Doc("List the rules of the specified workspace for the current user").
H
hongming 已提交
65
		Returns(http.StatusOK, api.StatusOK, policy.SimpleRule{}).
H
hongming 已提交
66
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
67
	ws.Route(ws.GET("/namespaces/{namespace}/rules").
H
hongming 已提交
68
		To(handler.ListNamespaceRules).
R
Ray Zhou 已提交
69 70
		Param(ws.PathParameter("namespace", "the name of the namespace")).
		Doc("List the rules of the specified namespace for the current user").
H
hongming 已提交
71
		Returns(http.StatusOK, api.StatusOK, policy.SimpleRule{}).
H
hongming 已提交
72
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
73
	ws.Route(ws.GET("/devops/{devops}/rules").
H
hongming 已提交
74
		To(handler.ListDevopsRules).
R
Ray Zhou 已提交
75 76
		Param(ws.PathParameter("devops", "devops project ID")).
		Doc("List the rules of the specified DevOps project for the current user").
H
hongming 已提交
77
		Returns(http.StatusOK, api.StatusOK, policy.SimpleRule{}).
H
hongming 已提交
78
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
79
	ws.Route(ws.GET("/workspaces/{workspace}/namespaces").
H
hongming 已提交
80
		To(handler.ListNamespaces).
H
hongming 已提交
81
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
82
		Doc("List the namespaces of the specified workspace for the current user").
H
hongming 已提交
83
		Returns(http.StatusOK, api.StatusOK, []v1.Namespace{}).
H
hongming 已提交
84
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
85
	ws.Route(ws.GET("/workspaces/{workspace}/members/{member}/namespaces").
H
hongming 已提交
86
		To(handler.ListNamespaces).
H
hongming 已提交
87
		Param(ws.PathParameter("workspace", "workspace name")).
H
hongming 已提交
88
		Param(ws.PathParameter("member", "workspace member's username")).
H
hongming 已提交
89
		Doc("List the namespaces for the workspace member").
H
hongming 已提交
90
		Returns(http.StatusOK, api.StatusOK, []v1.Namespace{}).
H
hongming 已提交
91
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
92
	ws.Route(ws.POST("/workspaces/{workspace}/namespaces").
H
hongming 已提交
93
		To(handler.CreateNamespace).
H
hongming 已提交
94
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
95
		Doc("Create a namespace in the specified workspace").
H
hongming 已提交
96
		Returns(http.StatusOK, api.StatusOK, []v1.Namespace{}).
H
hongming 已提交
97
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
98
	ws.Route(ws.DELETE("/workspaces/{workspace}/namespaces/{namespace}").
H
hongming 已提交
99
		To(handler.DeleteNamespace).
H
hongming 已提交
100
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
101 102
		Param(ws.PathParameter("namespace", "the name of the namespace")).
		Doc("Delete the specified namespace from the workspace").
H
hongming 已提交
103
		Returns(http.StatusOK, api.StatusOK, errors.Error{}).
H
hongming 已提交
104
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
105 106

	ws.Route(ws.GET("/workspaces/{workspace}/devops").
H
hongming 已提交
107
		To(handler.ListDevopsProjects).
H
hongming 已提交
108
		Param(ws.PathParameter("workspace", "workspace name")).
R
runzexia 已提交
109 110 111 112 113 114 115
		Param(ws.QueryParameter(params.PagingParam, "page").
			Required(false).
			DataFormat("limit=%d,page=%d").
			DefaultValue("limit=10,page=1")).
		Param(ws.QueryParameter(params.ConditionsParam, "query conditions").
			Required(false).
			DataFormat("key=%s,key~%s")).
H
hongming 已提交
116
		Doc("List devops projects for the current user").
H
hongming 已提交
117
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
118
	ws.Route(ws.GET("/workspaces/{workspace}/members/{member}/devops").
H
hongming 已提交
119
		To(handler.ListDevopsProjects).
H
hongming 已提交
120
		Param(ws.PathParameter("workspace", "workspace name")).
H
hongming 已提交
121
		Param(ws.PathParameter("member", "workspace member's username")).
R
runzexia 已提交
122 123 124 125 126 127 128
		Param(ws.QueryParameter(params.PagingParam, "page").
			Required(false).
			DataFormat("limit=%d,page=%d").
			DefaultValue("limit=10,page=1")).
		Param(ws.QueryParameter(params.ConditionsParam, "query conditions").
			Required(false).
			DataFormat("key=%s,key~%s")).
H
hongming 已提交
129
		Returns(http.StatusOK, api.StatusOK, models.PageableResponse{}).
H
hongming 已提交
130
		Doc("List the devops projects for the workspace member").
H
hongming 已提交
131
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
R
runzexia 已提交
132
	ws.Route(ws.GET("/devopscount").
H
hongming 已提交
133
		To(handler.GetDevOpsProjectsCount).
H
hongming 已提交
134
		Returns(http.StatusOK, api.StatusOK, struct {
R
runzexia 已提交
135 136 137 138
			Count uint32 `json:"count"`
		}{}).
		Doc("Get the devops projects count for the member").
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
139
	ws.Route(ws.POST("/workspaces/{workspace}/devops").
H
hongming 已提交
140
		To(handler.CreateDevopsProject).
H
hongming 已提交
141
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
142
		Doc("Create a devops project in the specified workspace").
J
Jeff 已提交
143
		Reads(devopsv1alpha2.DevOpsProject{}).
H
hongming 已提交
144
		Returns(http.StatusOK, api.StatusOK, devopsv1alpha2.DevOpsProject{}).
H
hongming 已提交
145
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
H
hongming 已提交
146
	ws.Route(ws.DELETE("/workspaces/{workspace}/devops/{devops}").
H
hongming 已提交
147
		To(handler.DeleteDevopsProject).
H
hongming 已提交
148
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
149 150
		Param(ws.PathParameter("devops", "devops project ID")).
		Doc("Delete the specified devops project from the workspace").
H
hongming 已提交
151
		Returns(http.StatusOK, api.StatusOK, devopsv1alpha2.DevOpsProject{}).
H
hongming 已提交
152
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}))
G
Guangzhe Huang 已提交
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
	//ws.Route(ws.GET("/logs").
	//	To(handler.LogQuery).
	//	Doc("Query cluster-level logs in a multi-tenants environment").
	//	Param(ws.QueryParameter("operation", "Operation type. This can be one of four types: query (for querying logs), statistics (for retrieving statistical data), histogram (for displaying log count by time interval) and export (for exporting logs). Defaults to query.").DefaultValue("query").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("workspaces", "A comma-separated list of workspaces. This field restricts the query to specified workspaces. For example, the following filter matches the workspace my-ws and demo-ws: `my-ws,demo-ws`").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("workspace_query", "A comma-separated list of keywords. Differing from **workspaces**, this field performs fuzzy matching on workspaces. For example, the following value limits the query to workspaces whose name contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("namespaces", "A comma-separated list of namespaces. This field restricts the query to specified namespaces. For example, the following filter matches the namespace my-ns and demo-ns: `my-ns,demo-ns`").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("namespace_query", "A comma-separated list of keywords. Differing from **namespaces**, this field performs fuzzy matching on namespaces. For example, the following value limits the query to namespaces whose name contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("workloads", "A comma-separated list of workloads. This field restricts the query to specified workloads. For example, the following filter matches the workload my-wl and demo-wl: `my-wl,demo-wl`").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("workload_query", "A comma-separated list of keywords. Differing from **workloads**, this field performs fuzzy matching on workloads. For example, the following value limits the query to workloads whose name contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("pods", "A comma-separated list of pods. This field restricts the query to specified pods. For example, the following filter matches the pod my-po and demo-po: `my-po,demo-po`").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("pod_query", "A comma-separated list of keywords. Differing from **pods**, this field performs fuzzy matching on pods. For example, the following value limits the query to pods whose name contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("containers", "A comma-separated list of containers. This field restricts the query to specified containers. For example, the following filter matches the container my-cont and demo-cont: `my-cont,demo-cont`").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("container_query", "A comma-separated list of keywords. Differing from **containers**, this field performs fuzzy matching on containers. For example, the following value limits the query to containers whose name contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("log_query", "A comma-separated list of keywords. The query returns logs which contain at least one keyword. Case-insensitive matching. For example, if the field is set to `err,INFO`, the query returns any log containing err(ERR,Err,...) *OR* INFO(info,InFo,...).").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("interval", "Time interval. It requires **operation** is set to histogram. The format is [0-9]+[smhdwMqy]. Defaults to 15m (i.e. 15 min).").DefaultValue("15m").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("start_time", "Start time of query. Default to 0. The format is a string representing milliseconds since the epoch, eg. 1559664000000.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("end_time", "End time of query. Default to now. The format is a string representing milliseconds since the epoch, eg. 1559664000000.").DataType("string").Required(false)).
	//	Param(ws.QueryParameter("sort", "Sort order. One of acs, desc. This field sorts logs by timestamp.").DataType("string").DefaultValue("desc").Required(false)).
	//	Param(ws.QueryParameter("from", "The offset from the result set. This field returns query results from the specified offset. It requires **operation** is set to query. Defaults to 0 (i.e. from the beginning of the result set).").DataType("integer").DefaultValue("0").Required(false)).
	//	Param(ws.QueryParameter("size", "Size of result to return. It requires **operation** is set to query. Defaults to 10 (i.e. 10 log records).").DataType("integer").DefaultValue("10").Required(false)).
	//	Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag}).
	//	Writes(v1alpha2.Response{}).
	//	Returns(http.StatusOK, api.StatusOK, v1alpha2.Response{})).
	//	Consumes(restful.MIME_JSON, restful.MIME_XML).
	//	Produces(restful.MIME_JSON, "text/plain")
H
hongming 已提交
179 180 181 182

	c.Add(ws)
	return nil
}