// Get is used to retrieve a single session func (s *Session) Get(args *structs.SessionSpecificRequest, reply *structs.IndexedSessions) error { if done, err := s.srv.forward("Session.Get", args, args, reply); done { return err } // Get the local state state := s.srv.fsm.State() return s.srv.blockingRPC( &args.QueryOptions, &reply.QueryMeta, state.GetQueryWatch("SessionGet"), func() error { index, session, err := state.SessionGet(args.Session) if err != nil { return err } reply.Index = index if session != nil { reply.Sessions = structs.Sessions{session} } else { reply.Sessions = nil } if err := s.srv.filterACL(args.Token, reply); err != nil { return err } return nil }) }
// SessionsForNode returns all the nodes belonging to a node func (s *HTTPServer) SessionsForNode(resp http.ResponseWriter, req *http.Request) (interface{}, error) { args := structs.NodeSpecificRequest{} if done := s.parse(resp, req, &args.Datacenter, &args.QueryOptions); done { return nil, nil } // Pull out the node name args.Node = strings.TrimPrefix(req.URL.Path, "/v1/session/node/") if args.Node == "" { resp.WriteHeader(400) resp.Write([]byte("Missing node name")) return nil, nil } var out structs.IndexedSessions defer setMeta(resp, &out.QueryMeta) if err := s.agent.RPC("Session.NodeSessions", &args, &out); err != nil { return nil, err } // Use empty list instead of nil if out.Sessions == nil { out.Sessions = make(structs.Sessions, 0) } return out.Sessions, nil }
// Renew is used to renew the TTL on a single session func (s *Session) Renew(args *structs.SessionSpecificRequest, reply *structs.IndexedSessions) error { if done, err := s.srv.forward("Session.Renew", args, args, reply); done { return err } defer metrics.MeasureSince([]string{"consul", "session", "renew"}, time.Now()) // Get the session, from local state state := s.srv.fsm.State() index, session, err := state.SessionGet(args.Session) if err != nil { return err } // Reset the session TTL timer reply.Index = index if session != nil { reply.Sessions = structs.Sessions{session} if err := s.srv.resetSessionTimer(args.Session, session); err != nil { s.srv.logger.Printf("[ERR] consul.session: Session renew failed: %v", err) return err } } return nil }
// SessionList is used to list all the sessions func (s *HTTPServer) SessionList(resp http.ResponseWriter, req *http.Request) (interface{}, error) { args := structs.DCSpecificRequest{} if done := s.parse(resp, req, &args.Datacenter, &args.QueryOptions); done { return nil, nil } var out structs.IndexedSessions defer setMeta(resp, &out.QueryMeta) if err := s.agent.RPC("Session.List", &args, &out); err != nil { return nil, err } // Use empty list instead of nil if out.Sessions == nil { out.Sessions = make(structs.Sessions, 0) } return out.Sessions, nil }
// Get is used to retrieve a single session func (s *Session) Get(args *structs.SessionSpecificRequest, reply *structs.IndexedSessions) error { if done, err := s.srv.forward("Session.Get", args, args, reply); done { return err } // Get the local state state := s.srv.fsm.State() return s.srv.blockingRPC(&args.QueryOptions, &reply.QueryMeta, state.QueryTables("SessionGet"), func() error { index, session, err := state.SessionGet(args.Session) reply.Index = index if session != nil { reply.Sessions = structs.Sessions{session} } return err }) }
// Renew is used to renew the TTL on a single session func (s *Session) Renew(args *structs.SessionSpecificRequest, reply *structs.IndexedSessions) error { if done, err := s.srv.forward("Session.Renew", args, args, reply); done { return err } defer metrics.MeasureSince([]string{"consul", "session", "renew"}, time.Now()) // Get the session, from local state. state := s.srv.fsm.State() index, session, err := state.SessionGet(args.Session) if err != nil { return err } reply.Index = index if session == nil { return nil } // Fetch the ACL token, if any, and apply the policy. acl, err := s.srv.resolveToken(args.Token) if err != nil { return err } if acl != nil && s.srv.config.ACLEnforceVersion8 { if !acl.SessionWrite(session.Node) { return permissionDeniedErr } } // Reset the session TTL timer. reply.Sessions = structs.Sessions{session} if err := s.srv.resetSessionTimer(args.Session, session); err != nil { s.srv.logger.Printf("[ERR] consul.session: Session renew failed: %v", err) return err } return nil }