register.go 29.9 KB
Newer Older
H
hongming 已提交
1
/*
H
hongming 已提交
2
Copyright 2019 The KubeSphere Authors.
H
hongming 已提交
3

H
hongming 已提交
4 5 6
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
H
hongming 已提交
7

H
hongming 已提交
8
    http://www.apache.org/licenses/LICENSE-2.0
H
hongming 已提交
9

H
hongming 已提交
10 11 12 13 14
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.
H
hongming 已提交
15
*/
H
hongming 已提交
16

H
hongming 已提交
17 18 19
package v1alpha2

import (
Y
yunkunrao 已提交
20
	"net/http"
R
Rao Yunkun 已提交
21

Y
yunkunrao 已提交
22 23
	"sigs.k8s.io/controller-runtime/pkg/cache"

Z
zryfish 已提交
24 25
	"kubesphere.io/kubesphere/pkg/models/metering"

H
hongming 已提交
26
	"github.com/emicklei/go-restful"
Z
zryfish 已提交
27
	restfulspec "github.com/emicklei/go-restful-openapi"
H
hongming 已提交
28
	corev1 "k8s.io/api/core/v1"
H
hongming 已提交
29
	"k8s.io/apimachinery/pkg/runtime/schema"
H
hongming 已提交
30
	"k8s.io/client-go/kubernetes"
Z
zryfish 已提交
31

H
hongming 已提交
32
	"kubesphere.io/kubesphere/pkg/api"
R
root 已提交
33
	auditingv1alpha1 "kubesphere.io/kubesphere/pkg/api/auditing/v1alpha1"
J
junotx 已提交
34
	eventsv1alpha1 "kubesphere.io/kubesphere/pkg/api/events/v1alpha1"
H
huanggze 已提交
35
	loggingv1alpha2 "kubesphere.io/kubesphere/pkg/api/logging/v1alpha2"
H
hongming 已提交
36
	quotav1alpha2 "kubesphere.io/kubesphere/pkg/apis/quota/v1alpha2"
H
hongming 已提交
37
	tenantv1alpha2 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha2"
H
hongming 已提交
38
	"kubesphere.io/kubesphere/pkg/apiserver/authorization/authorizer"
H
hongming 已提交
39
	"kubesphere.io/kubesphere/pkg/apiserver/runtime"
H
hongming 已提交
40
	kubesphere "kubesphere.io/kubesphere/pkg/client/clientset/versioned"
H
hongming 已提交
41
	"kubesphere.io/kubesphere/pkg/constants"
42
	"kubesphere.io/kubesphere/pkg/informers"
Y
yunkunrao 已提交
43
	monitoringv1alpha3 "kubesphere.io/kubesphere/pkg/kapis/monitoring/v1alpha3"
H
hongming 已提交
44
	"kubesphere.io/kubesphere/pkg/models"
H
hongming 已提交
45
	"kubesphere.io/kubesphere/pkg/models/iam/am"
Y
yunkunrao 已提交
46 47
	"kubesphere.io/kubesphere/pkg/models/monitoring"
	resourcev1alpha3 "kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/resource"
H
hongming 已提交
48
	"kubesphere.io/kubesphere/pkg/server/errors"
R
root 已提交
49
	"kubesphere.io/kubesphere/pkg/simple/client/auditing"
J
junotx 已提交
50
	"kubesphere.io/kubesphere/pkg/simple/client/events"
H
huanggze 已提交
51
	"kubesphere.io/kubesphere/pkg/simple/client/logging"
Y
yunkunrao 已提交
52
	monitoringclient "kubesphere.io/kubesphere/pkg/simple/client/monitoring"
H
hongming 已提交
53 54
)

R
runzexia 已提交
55 56 57
const (
	GroupName = "tenant.kubesphere.io"
)
H
hongming 已提交
58 59 60

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

H
hongming 已提交
61 62 63 64
func Resource(resource string) schema.GroupResource {
	return GroupVersion.WithResource(resource).GroupResource()
}

H
hongming 已提交
65
func AddToContainer(c *restful.Container, factory informers.InformerFactory, k8sclient kubernetes.Interface,
66
	ksclient kubesphere.Interface, evtsClient events.Client, loggingClient logging.Client,
Y
yunkunrao 已提交
67
	auditingclient auditing.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer,
L
LiHui 已提交
68
	monitoringclient monitoringclient.Interface, cache cache.Cache) error {
H
hongming 已提交
69 70
	mimePatch := []string{restful.MIME_JSON, runtime.MimeMergePatchJson, runtime.MimeJsonPatchJson}

H
hongming 已提交
71
	ws := runtime.NewWebService(GroupVersion)
L
LiHui 已提交
72
	handler := newTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache))
H
hongming 已提交
73

74 75 76 77
	ws.Route(ws.GET("/clusters").
		To(handler.ListClusters).
		Doc("List clusters available to users").
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
78
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.UserResourceTag}))
Z
zryfish 已提交
79

H
hongming 已提交
80 81 82 83 84
	ws.Route(ws.POST("/workspaces").
		To(handler.CreateWorkspace).
		Reads(tenantv1alpha2.WorkspaceTemplate{}).
		Returns(http.StatusOK, api.StatusOK, tenantv1alpha2.WorkspaceTemplate{}).
		Doc("Create workspace.").
H
hongming 已提交
85
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Z
zryfish 已提交
86

H
hongming 已提交
87 88
	ws.Route(ws.DELETE("/workspaces/{workspace}").
		To(handler.DeleteWorkspace).
Z
zryfish 已提交
89
		Param(ws.PathParameter("workspace", "workspace name")).
H
hongming 已提交
90 91
		Returns(http.StatusOK, api.StatusOK, errors.None).
		Doc("Delete workspace.").
H
hongming 已提交
92
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Z
zryfish 已提交
93

H
hongming 已提交
94 95
	ws.Route(ws.PUT("/workspaces/{workspace}").
		To(handler.UpdateWorkspace).
Z
zryfish 已提交
96
		Param(ws.PathParameter("workspace", "workspace name")).
H
hongming 已提交
97 98 99
		Reads(tenantv1alpha2.WorkspaceTemplate{}).
		Returns(http.StatusOK, api.StatusOK, tenantv1alpha2.WorkspaceTemplate{}).
		Doc("Update workspace.").
H
hongming 已提交
100
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Z
zryfish 已提交
101

H
hongming 已提交
102 103
	ws.Route(ws.PATCH("/workspaces/{workspace}").
		To(handler.PatchWorkspace).
Z
zryfish 已提交
104
		Param(ws.PathParameter("workspace", "workspace name")).
H
hongming 已提交
105 106 107 108
		Consumes(mimePatch...).
		Reads(tenantv1alpha2.WorkspaceTemplate{}).
		Returns(http.StatusOK, api.StatusOK, tenantv1alpha2.WorkspaceTemplate{}).
		Doc("Update workspace.").
H
hongming 已提交
109
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Z
zryfish 已提交
110

H
hongming 已提交
111
	ws.Route(ws.GET("/workspaces").
H
hongming 已提交
112 113
		To(handler.ListWorkspaces).
		Returns(http.StatusOK, api.StatusOK, models.PageableResponse{}).
R
Ray Zhou 已提交
114
		Doc("List all workspaces that belongs to the current user").
H
hongming 已提交
115
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Z
zryfish 已提交
116

H
hongming 已提交
117 118
	ws.Route(ws.GET("/workspaces/{workspace}").
		To(handler.DescribeWorkspace).
Z
zryfish 已提交
119
		Param(ws.PathParameter("workspace", "workspace name")).
120
		Returns(http.StatusOK, api.StatusOK, tenantv1alpha2.WorkspaceTemplate{}).
H
hongming 已提交
121
		Doc("Describe workspace.").
H
hongming 已提交
122
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Z
zryfish 已提交
123

H
hongming 已提交
124 125
	ws.Route(ws.GET("/workspaces/{workspace}/clusters").
		To(handler.ListWorkspaceClusters).
Z
zryfish 已提交
126
		Param(ws.PathParameter("workspace", "workspace name")).
127
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
128
		Doc("List clusters authorized to the specified workspace.").
H
hongming 已提交
129
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
H
hongming 已提交
130

H
hongming 已提交
131 132 133
	ws.Route(ws.GET("/namespaces").
		To(handler.ListNamespaces).
		Doc("List the namespaces for the current user").
H
hongming 已提交
134
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
135
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
136

H
hongming 已提交
137 138 139
	ws.Route(ws.GET("/federatednamespaces").
		To(handler.ListFederatedNamespaces).
		Doc("List the federated namespaces for the current user").
H
hongming 已提交
140
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
141
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
142

H
hongming 已提交
143 144 145 146
	ws.Route(ws.GET("/workspaces/{workspace}/federatednamespaces").
		To(handler.ListFederatedNamespaces).
		Param(ws.PathParameter("workspace", "workspace name")).
		Doc("List the federated namespaces of the specified workspace for the current user").
H
hongming 已提交
147
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
148
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
149

H
hongming 已提交
150
	ws.Route(ws.GET("/workspaces/{workspace}/namespaces").
H
hongming 已提交
151
		To(handler.ListNamespaces).
H
hongming 已提交
152
		Param(ws.PathParameter("workspace", "workspace name")).
R
Ray Zhou 已提交
153
		Doc("List the namespaces of the specified workspace for the current user").
H
hongming 已提交
154
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
155
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
156

H
hongming 已提交
157 158 159 160 161
	ws.Route(ws.GET("/workspaces/{workspace}/devops").
		To(handler.ListDevOpsProjects).
		Param(ws.PathParameter("workspace", "workspace name")).
		Doc("List the devops projects of the specified workspace for the current user").
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
162
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsProjectTag}))
Z
zryfish 已提交
163

H
hongming 已提交
164 165 166 167 168 169 170
	ws.Route(ws.GET("/workspaces/{workspace}/workspacemembers/{workspacemember}/devops").
		To(handler.ListDevOpsProjects).
		Param(ws.PathParameter("workspace", "workspace name")).
		Param(ws.PathParameter("workspacemember", "workspacemember username")).
		Doc("List the devops projects of specified workspace for the workspace member").
		Reads(corev1.Namespace{}).
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
171
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsProjectTag}))
Z
zryfish 已提交
172

H
hongming 已提交
173 174 175
	ws.Route(ws.GET("/workspaces/{workspace}/namespaces/{namespace}").
		To(handler.DescribeNamespace).
		Param(ws.PathParameter("workspace", "workspace name")).
Z
zryfish 已提交
176
		Param(ws.PathParameter("namespace", "project name")).
H
hongming 已提交
177
		Doc("Retrieve namespace details.").
H
hongming 已提交
178
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
179
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
180

H
hongming 已提交
181 182 183
	ws.Route(ws.DELETE("/workspaces/{workspace}/namespaces/{namespace}").
		To(handler.DeleteNamespace).
		Param(ws.PathParameter("workspace", "workspace name")).
Z
zryfish 已提交
184
		Param(ws.PathParameter("namespace", "project name")).
H
hongming 已提交
185 186
		Doc("Delete namespace.").
		Returns(http.StatusOK, api.StatusOK, errors.None).
H
hongming 已提交
187
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
188

H
hongming 已提交
189 190 191 192 193
	ws.Route(ws.POST("/workspaces/{workspace}/namespaces").
		To(handler.CreateNamespace).
		Param(ws.PathParameter("workspace", "workspace name")).
		Doc("List the namespaces of the specified workspace for the current user").
		Reads(corev1.Namespace{}).
H
hongming 已提交
194
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
195
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
196

H
hongming 已提交
197 198 199 200 201 202 203
	ws.Route(ws.GET("/workspaces/{workspace}/workspacemembers/{workspacemember}/namespaces").
		To(handler.ListNamespaces).
		Param(ws.PathParameter("workspace", "workspace name")).
		Param(ws.PathParameter("workspacemember", "workspacemember username")).
		Doc("List the namespaces of the specified workspace for the workspace member").
		Reads(corev1.Namespace{}).
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
204
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
205

H
hongming 已提交
206 207 208
	ws.Route(ws.PUT("/workspaces/{workspace}/namespaces/{namespace}").
		To(handler.UpdateNamespace).
		Param(ws.PathParameter("workspace", "workspace name")).
Z
zryfish 已提交
209
		Param(ws.PathParameter("namespace", "project name")).
H
hongming 已提交
210
		Reads(corev1.Namespace{}).
H
hongming 已提交
211
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
212
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
213

H
hongming 已提交
214 215 216 217
	ws.Route(ws.PATCH("/workspaces/{workspace}/namespaces/{namespace}").
		To(handler.PatchNamespace).
		Consumes(mimePatch...).
		Param(ws.PathParameter("workspace", "workspace name")).
Z
zryfish 已提交
218
		Param(ws.PathParameter("namespace", "project name")).
H
hongming 已提交
219
		Reads(corev1.Namespace{}).
H
hongming 已提交
220
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
221
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
H
hongming 已提交
222

J
junotx 已提交
223 224 225
	ws.Route(ws.GET("/events").
		To(handler.Events).
		Doc("Query events against the cluster").
H
huanggze 已提交
226
		Param(ws.QueryParameter("operation", "Operation type. This can be one of three types: `query` (for querying events), `statistics` (for retrieving statistical data), `histogram` (for displaying events count by time interval). Defaults to query.").DefaultValue("query")).
J
junotx 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
		Param(ws.QueryParameter("workspace_filter", "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`.")).
		Param(ws.QueryParameter("workspace_search", "A comma-separated list of keywords. Differing from **workspace_filter**, 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`.")).
		Param(ws.QueryParameter("involved_object_namespace_filter", "A comma-separated list of namespaces. This field restricts the query to specified `involvedObject.namespace`.")).
		Param(ws.QueryParameter("involved_object_namespace_search", "A comma-separated list of keywords. Differing from **involved_object_namespace_filter**, this field performs fuzzy matching on `involvedObject.namespace`")).
		Param(ws.QueryParameter("involved_object_name_filter", "A comma-separated list of names. This field restricts the query to specified `involvedObject.name`.")).
		Param(ws.QueryParameter("involved_object_name_search", "A comma-separated list of keywords. Differing from **involved_object_name_filter**, this field performs fuzzy matching on `involvedObject.name`.")).
		Param(ws.QueryParameter("involved_object_kind_filter", "A comma-separated list of kinds. This field restricts the query to specified `involvedObject.kind`.")).
		Param(ws.QueryParameter("reason_filter", "A comma-separated list of reasons. This field restricts the query to specified `reason`.")).
		Param(ws.QueryParameter("reason_search", "A comma-separated list of keywords. Differing from **reason_filter**, this field performs fuzzy matching on `reason`.")).
		Param(ws.QueryParameter("message_search", "A comma-separated list of keywords. This field performs fuzzy matching on `message`.")).
		Param(ws.QueryParameter("type_filter", "Type of event matching on `type`. This can be one of two types: `Warning`, `Normal`")).
		Param(ws.QueryParameter("start_time", "Start time of query (limits `lastTimestamp`). The format is a string representing seconds since the epoch, eg. 1136214245.")).
		Param(ws.QueryParameter("end_time", "End time of query (limits `lastTimestamp`). The format is a string representing seconds since the epoch, eg. 1136214245.")).
		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")).
		Param(ws.QueryParameter("sort", "Sort order. One of asc, desc. This field sorts events by `lastTimestamp`.").DataType("string").DefaultValue("desc")).
		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 set to return. It requires **operation** is set to `query`. Defaults to 10 (i.e. 10 event records).").DataType("integer").DefaultValue("10").Required(false)).
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.EventsQueryTag}).
		Writes(eventsv1alpha1.APIResponse{}).
		Returns(http.StatusOK, api.StatusOK, eventsv1alpha1.APIResponse{}))

H
huanggze 已提交
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
	ws.Route(ws.GET("/logs").
		To(handler.QueryLogs).
		Doc("Query logs against the cluster.").
		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("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 seconds since the epoch, eg. 1559664000.").DataType("string").Required(false)).
		Param(ws.QueryParameter("end_time", "End time of query. Default to now. The format is a string representing seconds since the epoch, eg. 1559664000.").DataType("string").Required(false)).
		Param(ws.QueryParameter("sort", "Sort order. One of asc, 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.LogQueryTag}).
		Writes(loggingv1alpha2.APIResponse{}).
		Returns(http.StatusOK, api.StatusOK, loggingv1alpha2.APIResponse{})).
		Consumes(restful.MIME_JSON, restful.MIME_XML).
		Produces(restful.MIME_JSON, "text/plain")

R
root 已提交
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
	ws.Route(ws.GET("/auditing/events").
		To(handler.Auditing).
		Doc("Query auditing events against the cluster").
		Param(ws.QueryParameter("operation", "Operation type. This can be one of three types: `query` (for querying events), `statistics` (for retrieving statistical data), `histogram` (for displaying events count by time interval). Defaults to query.").DefaultValue("query")).
		Param(ws.QueryParameter("workspace_filter", "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`.")).
		Param(ws.QueryParameter("workspace_search", "A comma-separated list of keywords. Differing from **workspace_filter**, 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`.")).
		Param(ws.QueryParameter("objectref_namespace_filter", "A comma-separated list of namespaces. This field restricts the query to specified `ObjectRef.Namespace`.")).
		Param(ws.QueryParameter("objectref_namespace_search", "A comma-separated list of keywords. Differing from **objectref_namespace_filter**, this field performs fuzzy matching on `ObjectRef.Namespace`.")).
		Param(ws.QueryParameter("objectref_name_filter", "A comma-separated list of names. This field restricts the query to specified `ObjectRef.Name`.")).
		Param(ws.QueryParameter("objectref_name_search", "A comma-separated list of keywords. Differing from **objectref_name_filter**, this field performs fuzzy matching on `ObjectRef.Name`.")).
		Param(ws.QueryParameter("level_filter", "A comma-separated list of levels. This know values are Metadata, Request, RequestResponse.")).
		Param(ws.QueryParameter("verb_filter", "A comma-separated list of verbs. This field restricts the query to specified verb. This field restricts the query to specified `Verb`.")).
		Param(ws.QueryParameter("user_filter", "A comma-separated list of user. This field restricts the query to specified user. For example, the following filter matches the user user1 and user2: `user1,user2`.")).
		Param(ws.QueryParameter("user_search", "A comma-separated list of keywords. Differing from **user_filter**, this field performs fuzzy matching on 'User.username'. For example, the following value limits the query to user whose name contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.")).
		Param(ws.QueryParameter("group_search", "A comma-separated list of keywords. This field performs fuzzy matching on 'User.Groups'. For example, the following value limits the query to group which contains the word my(My,MY,...) *OR* demo(Demo,DemO,...): `my,demo`.")).
		Param(ws.QueryParameter("source_ip_search", "A comma-separated list of keywords. This field performs fuzzy matching on 'SourceIPs'. For example, the following value limits the query to SourceIPs which contains 127.0 *OR* 192.168.: `127.0,192.168.`.")).
		Param(ws.QueryParameter("objectref_resource_filter", "A comma-separated list of resource. This field restricts the query to specified ip. This field restricts the query to specified `ObjectRef.Resource`.")).
		Param(ws.QueryParameter("objectref_subresource_filter", "A comma-separated list of subresource. This field restricts the query to specified subresource. This field restricts the query to specified `ObjectRef.Subresource`.")).
291 292
		Param(ws.QueryParameter("response_code_filter", "A comma-separated list of response status code. This field restricts the query to specified response status code. This field restricts the query to specified `ResponseStatus.code`.")).
		Param(ws.QueryParameter("response_status_filter", "A comma-separated list of response status. This field restricts the query to specified response status. This field restricts the query to specified `ResponseStatus.status`.")).
R
root 已提交
293 294 295 296 297 298 299 300 301 302
		Param(ws.QueryParameter("start_time", "Start time of query (limits `RequestReceivedTimestamp`). The format is a string representing seconds since the epoch, eg. 1136214245.")).
		Param(ws.QueryParameter("end_time", "End time of query (limits `RequestReceivedTimestamp`). The format is a string representing seconds since the epoch, eg. 1136214245.")).
		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")).
		Param(ws.QueryParameter("sort", "Sort order. One of asc, desc. This field sorts events by `RequestReceivedTimestamp`.").DataType("string").DefaultValue("desc")).
		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 set to return. It requires **operation** is set to `query`. Defaults to 10 (i.e. 10 event records).").DataType("integer").DefaultValue("10").Required(false)).
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.AuditingQueryTag}).
		Writes(auditingv1alpha1.APIResponse{}).
		Returns(http.StatusOK, api.StatusOK, auditingv1alpha1.APIResponse{}))

R
Rao Yunkun 已提交
303
	ws.Route(ws.GET("/metering").
Y
yunkunrao 已提交
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
		To(handler.QueryMeterings).
		Doc("Get meterings against the cluster.").
		Param(ws.QueryParameter("level", "Metering level.").DataType("string").Required(true)).
		Param(ws.QueryParameter("operation", "Metering operation.").DataType("string").Required(false).DefaultValue(monitoringv1alpha3.OperationQuery)).
		Param(ws.QueryParameter("node", "Node name.").DataType("string").Required(false)).
		Param(ws.QueryParameter("workspace", "Workspace name.").DataType("string").Required(false)).
		Param(ws.QueryParameter("namespace", "Namespace name.").DataType("string").Required(false)).
		Param(ws.QueryParameter("kind", "Workload kind. One of deployment, daemonset, statefulset.").DataType("string").Required(false)).
		Param(ws.QueryParameter("workload", "Workload name.").DataType("string").Required(false)).
		Param(ws.QueryParameter("pod", "Pod name.").DataType("string").Required(false)).
		Param(ws.QueryParameter("applications", "Appliction names, format app_name[:app_version](such as nginx:v1, nignx) which are joined by \"|\" ").DataType("string").Required(false)).
		Param(ws.QueryParameter("services", "Services which are joined by \"|\".").DataType("string").Required(false)).
		Param(ws.QueryParameter("metrics_filter", "The metric name filter consists of a regexp pattern. It specifies which metric data to return. For example, the following filter matches both workspace CPU usage and memory usage: `meter_workspace_cpu_usage|meter_workspace_memory_usage`.").DataType("string").Required(false)).
		Param(ws.QueryParameter("resources_filter", "The workspace filter consists of a regexp pattern. It specifies which workspace data to return.").DataType("string").Required(false)).
		Param(ws.QueryParameter("start", "Start time of query. Use **start** and **end** to retrieve metric data over a time span. It is a string with Unix time format, eg. 1559347200. ").DataType("string").Required(false)).
		Param(ws.QueryParameter("end", "End time of query. Use **start** and **end** to retrieve metric data over a time span. It is a string with Unix time format, eg. 1561939200. ").DataType("string").Required(false)).
		Param(ws.QueryParameter("step", "Time interval. Retrieve metric data at a fixed interval within the time range of start and end. It requires both **start** and **end** are provided. The format is [0-9]+[smhdwy]. Defaults to 10m (i.e. 10 min).").DataType("string").DefaultValue("10m").Required(false)).
		Param(ws.QueryParameter("time", "A timestamp in Unix time format. Retrieve metric data at a single point in time. Defaults to now. Time and the combination of start, end, step are mutually exclusive.").DataType("string").Required(false)).
		Param(ws.QueryParameter("sort_metric", "Sort workspaces by the specified metric. Not applicable if **start** and **end** are provided.").DataType("string").Required(false)).
		Param(ws.QueryParameter("sort_type", "Sort order. One of asc, desc.").DefaultValue("desc.").DataType("string").Required(false)).
		Param(ws.QueryParameter("page", "The page number. This field paginates result data of each metric, then returns a specific page. For example, setting **page** to 2 returns the second page. It only applies to sorted metric data.").DataType("integer").Required(false)).
		Param(ws.QueryParameter("limit", "Page size, the maximum number of results in a single page. Defaults to 5.").DataType("integer").Required(false).DefaultValue("5")).
		Param(ws.QueryParameter("storageclass", "The name of the storageclass.").DataType("string").Required(false)).
		Param(ws.QueryParameter("pvc_filter", "The PVC filter consists of a regexp pattern. It specifies which PVC data to return.").DataType("string").Required(false)).
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceMetersTag}).
		Writes(monitoring.Metrics{}).
		Returns(http.StatusOK, api.StatusOK, monitoring.Metrics{}))

R
Rao Yunkun 已提交
332
	ws.Route(ws.GET("/namespaces/{namespace}/metering/hierarchy").
Y
yunkunrao 已提交
333 334 335 336
		To(handler.QueryMeteringsHierarchy).
		Param(ws.PathParameter("namespace", "Namespace name.").DataType("string").Required(false)).
		Param(ws.QueryParameter("metrics_filter", "The metric name filter consists of a regexp pattern. It specifies which metric data to return. For example, the following filter matches both workspace CPU usage and memory usage: `meter_pod_cpu_usage|meter_pod_memory_usage_wo_cache`.").DataType("string").Required(false)).
		Param(ws.QueryParameter("time", "A timestamp in Unix time format. Retrieve metric data at a single point in time. Defaults to now. Time and the combination of start, end, step are mutually exclusive.").DataType("string").Required(false)).
337
		Param(ws.QueryParameter("cluster", "Cluster name").DataType("string").Required(false)).
Y
yunkunrao 已提交
338 339 340 341
		Doc("get current metering hierarchies info in last one hour").
		Writes(metering.ResourceStatistic{}).
		Returns(http.StatusOK, api.StatusOK, metering.ResourceStatistic{}))

R
Rao Yunkun 已提交
342
	ws.Route(ws.GET("/metering/price").
Y
yunkunrao 已提交
343
		To(handler.HandlePriceInfoQuery).
R
Rao Yunkun 已提交
344
		Doc("Get resoure price.").
Y
yunkunrao 已提交
345 346
		Writes(metering.PriceInfo{}).
		Returns(http.StatusOK, api.StatusOK, metering.PriceInfo{}))
H
hongming 已提交
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
	ws.Route(ws.POST("/workspaces/{workspace}/resourcequotas").
		To(handler.CreateWorkspaceResourceQuota).
		Reads(quotav1alpha2.ResourceQuota{}).
		Returns(http.StatusOK, api.StatusOK, quotav1alpha2.ResourceQuota{}).
		Doc("Create resource quota.").
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))

	ws.Route(ws.DELETE("/workspaces/{workspace}/resourcequotas/{resourcequota}").
		To(handler.DeleteWorkspaceResourceQuota).
		Param(ws.PathParameter("workspace", "workspace name")).
		Param(ws.PathParameter("resourcequota", "resource quota name")).
		Returns(http.StatusOK, api.StatusOK, errors.None).
		Doc("Delete resource quota.").
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))

	ws.Route(ws.PUT("/workspaces/{workspace}/resourcequotas/{resourcequota}").
		To(handler.UpdateWorkspaceResourceQuota).
		Param(ws.PathParameter("workspace", "workspace name")).
		Param(ws.PathParameter("resourcequota", "resource quota name")).
		Reads(quotav1alpha2.ResourceQuota{}).
		Returns(http.StatusOK, api.StatusOK, quotav1alpha2.ResourceQuota{}).
		Doc("Update resource quota.").
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))

	ws.Route(ws.GET("/workspaces/{workspace}/resourcequotas/{resourcequota}").
		To(handler.DescribeWorkspaceResourceQuota).
		Param(ws.PathParameter("workspace", "workspace name")).
		Param(ws.PathParameter("resourcequota", "resource quota name")).
		Returns(http.StatusOK, api.StatusOK, quotav1alpha2.ResourceQuota{}).
		Doc("Describe resource quota.").
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.WorkspaceTag}))
Y
yunkunrao 已提交
378

H
hongming 已提交
379 380 381
	c.Add(ws)
	return nil
}