github.com/weaviate/weaviate@v1.24.6/adapters/handlers/rest/handlers_nodes.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package rest 13 14 import ( 15 "errors" 16 17 "github.com/go-openapi/runtime/middleware" 18 "github.com/sirupsen/logrus" 19 "github.com/weaviate/weaviate/adapters/handlers/rest/operations" 20 "github.com/weaviate/weaviate/adapters/handlers/rest/operations/nodes" 21 "github.com/weaviate/weaviate/adapters/handlers/rest/state" 22 "github.com/weaviate/weaviate/adapters/repos/db" 23 enterrors "github.com/weaviate/weaviate/entities/errors" 24 "github.com/weaviate/weaviate/entities/models" 25 "github.com/weaviate/weaviate/entities/verbosity" 26 autherrs "github.com/weaviate/weaviate/usecases/auth/authorization/errors" 27 "github.com/weaviate/weaviate/usecases/monitoring" 28 nodesUC "github.com/weaviate/weaviate/usecases/nodes" 29 schemaUC "github.com/weaviate/weaviate/usecases/schema" 30 ) 31 32 type nodesHandlers struct { 33 manager *nodesUC.Manager 34 metricRequestsTotal restApiRequestsTotal 35 } 36 37 func (n *nodesHandlers) getNodesStatus(params nodes.NodesGetParams, principal *models.Principal) middleware.Responder { 38 output, err := verbosity.ParseOutput(params.Output) 39 if err != nil { 40 return nodes.NewNodesGetUnprocessableEntity().WithPayload(errPayloadFromSingleErr(err)) 41 } 42 43 nodeStatuses, err := n.manager.GetNodeStatus(params.HTTPRequest.Context(), principal, "", output) 44 if err != nil { 45 return n.handleGetNodesError(err) 46 } 47 48 status := &models.NodesStatusResponse{ 49 Nodes: nodeStatuses, 50 } 51 52 n.metricRequestsTotal.logOk("") 53 return nodes.NewNodesGetOK().WithPayload(status) 54 } 55 56 func (n *nodesHandlers) getNodesStatusByClass(params nodes.NodesGetClassParams, principal *models.Principal) middleware.Responder { 57 output, err := verbosity.ParseOutput(params.Output) 58 if err != nil { 59 return nodes.NewNodesGetUnprocessableEntity().WithPayload(errPayloadFromSingleErr(err)) 60 } 61 62 nodeStatuses, err := n.manager.GetNodeStatus(params.HTTPRequest.Context(), principal, params.ClassName, output) 63 if err != nil { 64 return n.handleGetNodesError(err) 65 } 66 67 status := &models.NodesStatusResponse{ 68 Nodes: nodeStatuses, 69 } 70 71 n.metricRequestsTotal.logOk("") 72 return nodes.NewNodesGetOK().WithPayload(status) 73 } 74 75 func (n *nodesHandlers) handleGetNodesError(err error) middleware.Responder { 76 n.metricRequestsTotal.logError("", err) 77 if errors.As(err, &enterrors.ErrNotFound{}) { 78 return nodes.NewNodesGetClassNotFound(). 79 WithPayload(errPayloadFromSingleErr(err)) 80 } 81 if errors.As(err, &autherrs.Forbidden{}) { 82 return nodes.NewNodesGetClassForbidden(). 83 WithPayload(errPayloadFromSingleErr(err)) 84 } 85 if errors.As(err, &enterrors.ErrUnprocessable{}) { 86 return nodes.NewNodesGetClassUnprocessableEntity(). 87 WithPayload(errPayloadFromSingleErr(err)) 88 } 89 return nodes.NewNodesGetClassInternalServerError(). 90 WithPayload(errPayloadFromSingleErr(err)) 91 } 92 93 func setupNodesHandlers(api *operations.WeaviateAPI, 94 schemaManger *schemaUC.Manager, repo *db.DB, appState *state.State, 95 ) { 96 nodesManager := nodesUC.NewManager(appState.Logger, appState.Authorizer, 97 repo, schemaManger) 98 99 h := &nodesHandlers{nodesManager, newNodesRequestsTotal(appState.Metrics, appState.Logger)} 100 api.NodesNodesGetHandler = nodes. 101 NodesGetHandlerFunc(h.getNodesStatus) 102 api.NodesNodesGetClassHandler = nodes. 103 NodesGetClassHandlerFunc(h.getNodesStatusByClass) 104 } 105 106 type nodesRequestsTotal struct { 107 *restApiRequestsTotalImpl 108 } 109 110 func newNodesRequestsTotal(metrics *monitoring.PrometheusMetrics, logger logrus.FieldLogger) restApiRequestsTotal { 111 return &nodesRequestsTotal{ 112 restApiRequestsTotalImpl: &restApiRequestsTotalImpl{newRequestsTotalMetric(metrics, "rest"), "rest", "nodes", logger}, 113 } 114 } 115 116 func (e *nodesRequestsTotal) logError(className string, err error) { 117 switch err.(type) { 118 case enterrors.ErrNotFound, enterrors.ErrUnprocessable: 119 e.logUserError(className) 120 case autherrs.Forbidden: 121 e.logUserError(className) 122 default: 123 e.logServerError(className, err) 124 } 125 }