register.go 28.3 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 21 22 23
	"kubesphere.io/kubesphere/pkg/models/metering"
	"net/http"
	"sigs.k8s.io/controller-runtime/pkg/cache"

H
hongming 已提交
24 25
	"github.com/emicklei/go-restful"
	"github.com/emicklei/go-restful-openapi"
H
hongming 已提交
26
	corev1 "k8s.io/api/core/v1"
H
hongming 已提交
27
	"k8s.io/apimachinery/pkg/runtime/schema"
H
hongming 已提交
28
	"k8s.io/client-go/kubernetes"
H
hongming 已提交
29
	"kubesphere.io/kubesphere/pkg/api"
R
root 已提交
30
	auditingv1alpha1 "kubesphere.io/kubesphere/pkg/api/auditing/v1alpha1"
J
junotx 已提交
31
	eventsv1alpha1 "kubesphere.io/kubesphere/pkg/api/events/v1alpha1"
H
huanggze 已提交
32
	loggingv1alpha2 "kubesphere.io/kubesphere/pkg/api/logging/v1alpha2"
H
hongming 已提交
33
	tenantv1alpha2 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha2"
H
hongming 已提交
34
	"kubesphere.io/kubesphere/pkg/apiserver/authorization/authorizer"
H
hongming 已提交
35
	"kubesphere.io/kubesphere/pkg/apiserver/runtime"
H
hongming 已提交
36
	kubesphere "kubesphere.io/kubesphere/pkg/client/clientset/versioned"
H
hongming 已提交
37
	"kubesphere.io/kubesphere/pkg/constants"
38
	"kubesphere.io/kubesphere/pkg/informers"
Y
yunkunrao 已提交
39
	monitoringv1alpha3 "kubesphere.io/kubesphere/pkg/kapis/monitoring/v1alpha3"
H
hongming 已提交
40
	"kubesphere.io/kubesphere/pkg/models"
H
hongming 已提交
41
	"kubesphere.io/kubesphere/pkg/models/iam/am"
Y
yunkunrao 已提交
42 43
	"kubesphere.io/kubesphere/pkg/models/monitoring"
	resourcev1alpha3 "kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/resource"
H
hongming 已提交
44
	"kubesphere.io/kubesphere/pkg/server/errors"
R
root 已提交
45
	"kubesphere.io/kubesphere/pkg/simple/client/auditing"
J
junotx 已提交
46
	"kubesphere.io/kubesphere/pkg/simple/client/events"
H
huanggze 已提交
47
	"kubesphere.io/kubesphere/pkg/simple/client/logging"
Y
yunkunrao 已提交
48 49
	monitoringclient "kubesphere.io/kubesphere/pkg/simple/client/monitoring"
	opclient "kubesphere.io/kubesphere/pkg/simple/client/openpitrix"
H
hongming 已提交
50 51
)

R
runzexia 已提交
52 53 54
const (
	GroupName = "tenant.kubesphere.io"
)
H
hongming 已提交
55 56 57

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

H
hongming 已提交
58 59 60 61
func Resource(resource string) schema.GroupResource {
	return GroupVersion.WithResource(resource).GroupResource()
}

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

H
hongming 已提交
68
	ws := runtime.NewWebService(GroupVersion)
Y
yunkunrao 已提交
69
	handler := newTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, opClient, resourcev1alpha3.NewResourceGetter(factory, cache))
H
hongming 已提交
70

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

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

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

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

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

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

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

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

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

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

H
hongming 已提交
140 141 142 143
	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 已提交
144
		Returns(http.StatusOK, api.StatusOK, api.ListResult{}).
H
hongming 已提交
145
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
146

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

H
hongming 已提交
154 155 156 157 158
	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 已提交
159
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsProjectTag}))
Z
zryfish 已提交
160

H
hongming 已提交
161 162 163 164 165 166 167
	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 已提交
168
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsProjectTag}))
Z
zryfish 已提交
169

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

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

H
hongming 已提交
186 187 188 189 190
	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 已提交
191
		Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}).
H
hongming 已提交
192
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
193

H
hongming 已提交
194 195 196 197 198 199 200
	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 已提交
201
		Metadata(restfulspec.KeyOpenAPITags, []string{constants.NamespaceTag}))
Z
zryfish 已提交
202

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

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

J
junotx 已提交
220 221 222
	ws.Route(ws.GET("/events").
		To(handler.Events).
		Doc("Query events against the cluster").
H
huanggze 已提交
223
		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 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
		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 已提交
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
	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 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
	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`.")).
288 289
		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 已提交
290 291 292 293 294 295 296 297 298 299
		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 已提交
300
	ws.Route(ws.GET("/metering").
Y
yunkunrao 已提交
301 302 303 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
		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 已提交
329
	ws.Route(ws.GET("/namespaces/{namespace}/metering/hierarchy").
Y
yunkunrao 已提交
330 331 332 333 334 335 336 337
		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)).
		Doc("get current metering hierarchies info in last one hour").
		Writes(metering.ResourceStatistic{}).
		Returns(http.StatusOK, api.StatusOK, metering.ResourceStatistic{}))

R
Rao Yunkun 已提交
338
	ws.Route(ws.GET("/metering/price").
Y
yunkunrao 已提交
339
		To(handler.HandlePriceInfoQuery).
R
Rao Yunkun 已提交
340
		Doc("Get resoure price.").
Y
yunkunrao 已提交
341 342 343
		Writes(metering.PriceInfo{}).
		Returns(http.StatusOK, api.StatusOK, metering.PriceInfo{}))

H
hongming 已提交
344 345 346
	c.Add(ws)
	return nil
}