2023-04-10 15:36:59 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2018-02-05 22:57:29 +00:00
|
|
|
package agent
|
|
|
|
|
|
|
|
// rpcHandlerForAlloc is a helper that given an allocation ID returns whether to
|
|
|
|
// use the local clients RPC, the local clients remote RPC or the server on the
|
|
|
|
// agent.
|
|
|
|
func (s *HTTPServer) rpcHandlerForAlloc(allocID string) (localClient, remoteClient, server bool) {
|
|
|
|
c := s.agent.Client()
|
|
|
|
srv := s.agent.Server()
|
|
|
|
|
|
|
|
// See if the local client can handle the request.
|
|
|
|
localAlloc := false
|
|
|
|
if c != nil {
|
2018-02-08 23:00:22 +00:00
|
|
|
// If there is an error it means that the client doesn't have the
|
|
|
|
// allocation so we can't use the local client
|
2018-09-27 00:08:43 +00:00
|
|
|
_, err := c.GetAllocState(allocID)
|
2018-02-05 22:57:29 +00:00
|
|
|
if err == nil {
|
|
|
|
localAlloc = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Only use the client RPC to server if we don't have a server and the local
|
|
|
|
// client can't handle the call.
|
|
|
|
useClientRPC := c != nil && !localAlloc && srv == nil
|
|
|
|
|
|
|
|
// Use the server as a last case.
|
|
|
|
useServerRPC := !localAlloc && !useClientRPC && srv != nil
|
|
|
|
|
|
|
|
return localAlloc, useClientRPC, useServerRPC
|
|
|
|
}
|
|
|
|
|
|
|
|
// rpcHandlerForNode is a helper that given a node ID returns whether to
|
|
|
|
// use the local clients RPC, the local clients remote RPC or the server on the
|
|
|
|
// agent. If there is a local node and no node id is given, it is assumed the
|
|
|
|
// local node is being targed.
|
|
|
|
func (s *HTTPServer) rpcHandlerForNode(nodeID string) (localClient, remoteClient, server bool) {
|
|
|
|
c := s.agent.Client()
|
|
|
|
srv := s.agent.Server()
|
|
|
|
|
|
|
|
// See if the local client can handle the request.
|
|
|
|
localClient = c != nil && // Must have a client
|
|
|
|
(nodeID == "" || // If no node ID is given
|
|
|
|
nodeID == c.NodeID()) // Requested node is the local node.
|
|
|
|
|
|
|
|
// Only use the client RPC to server if we don't have a server and the local
|
|
|
|
// client can't handle the call.
|
|
|
|
useClientRPC := c != nil && !localClient && srv == nil
|
|
|
|
|
|
|
|
// Use the server as a last case.
|
|
|
|
useServerRPC := !localClient && !useClientRPC && srv != nil && nodeID != ""
|
|
|
|
|
|
|
|
return localClient, useClientRPC, useServerRPC
|
|
|
|
}
|