// Get returns a single prepared query by ID. func (p *PreparedQuery) Get(args *structs.PreparedQuerySpecificRequest, reply *structs.IndexedPreparedQueries) error { if done, err := p.srv.forward("PreparedQuery.Get", args, args, reply); done { return err } // We will use this in the loop to see if the caller is allowed to see // the query. acl, err := p.srv.resolveToken(args.Token) if err != nil { return err } // Get the requested query. state := p.srv.fsm.State() return p.srv.blockingRPC( &args.QueryOptions, &reply.QueryMeta, state.GetQueryWatch("PreparedQueryGet"), func() error { index, query, err := state.PreparedQueryGet(args.QueryID) if err != nil { return err } if query == nil { return ErrQueryNotFound } if (query.Token != args.Token) && (acl != nil && !acl.QueryList()) { p.srv.logger.Printf("[WARN] consul.prepared_query: Request to get prepared query '%s' denied because ACL didn't match ACL used to create the query, and a management token wasn't supplied", args.QueryID) return permissionDeniedErr } reply.Index = index reply.Queries = structs.PreparedQueries{query} return nil }) return nil }