* Update UI, code comment, and README links to docs, tutorials * fix typo in ephemeral disks learn more link url * feedback on typo Co-authored-by: Tim Gross <tgross@hashicorp.com> --------- Co-authored-by: Tim Gross <tgross@hashicorp.com>
3.2 KiB
New/Updated RPC Endpoint Checklist
Prefer adding a new message to changing any existing RPC messages.
Code
-
Requeststruct and*RequestTypeconstant innomad/structs/structs.go. Append the constant, old constant values must remain unchanged. Just add the request type to this file, all other resource definitions must be on their own separate file. -
In
nomad/fsm.go, add a dispatch case to the switch statement in(n *nomadFSM) Apply*nomadFSMmethod to decode the request and call the state method
-
State method for modifying objects in a
Txnin thestatepackage, located innomad/state/. Every new resource should have its own file and test file, named using the conventionnomad/state/state_store_[resource].goandnomad/state/state_store_[resource]_test.go -
Handler for the request in
nomad/foo_endpoint.go- RPCs are resolved by matching the method name for bound structs net/rpc
- Register any new RPC structs in
nomad/server.go - Authentication:
- For RPCs that support HTTP APIs, call
Authenticatebefore forwarding. Return any error after frowarding, and callResolveACLto get an ACL to check. - For RPCs that support client-to-server RPCs only, use
AuthenticateClientOnlybefore forwarding. Check theAllowClientOpACL after forwarding. - For RPCs that support server-to-server RPCs only, use
AuthenticateServerOnlybefore forwarding. Check theAllowServerOpACL before forwarding.
- For RPCs that support HTTP APIs, call
- Authorization:
- Use
ResolveACLto turn the authenticated request into an ACL to check. - For Update/Get/Delete RPCs, check ACLs before hitting the state store.
- For List RPCs, use ACLs as a filter on the query.
- Never check that the ACL object is
nilto bypass authorization. The authorization methods inacl/acl.goshould already handlenilACL objects correctly (by rejecting them).
- Use
-
Wrapper for the HTTP request in
command/agent/foo_endpoint.go- Backwards compatibility requires a new endpoint, an upgraded client or server may be forwarding this request to an old server, without support for the new RPC
- RPCs triggered by an internal process may not need support
- Check ACLs as an optimization
-
nomad/core_sched.gosends many RPCsServersMeetMinimumVersionasserts that the server cluster is upgraded, so use this to guard sending the new RPC, else send the old RPC- Version must match the actual release version!
-
If implementing a Client RPC...
- Use
QueryOptionsinstead ofWriteRequestin the Request struct asWriteRequestis only for Raft writes. - Set
QueryOptions.AllowStale = truein the Server RPC forwarder to avoid an infinite loop between leaders and followers when a Client RPC is forwarded through a follower. See https://github.com/hashicorp/nomad/issues/16517
- Use