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  }