func (m mysqlTimeWriter) Now(b builder, cl clockwork.Clock) { if cl == nil { b.Build("NOW()") } else { b.Build("?", cl.Now()) } }
func nextSyncAfter(exp time.Time, clock clockwork.Clock) time.Duration { if exp.IsZero() { return MaximumProviderConfigSyncInterval } t := exp.Sub(clock.Now()) / 2 if t > MaximumProviderConfigSyncInterval { t = MaximumProviderConfigSyncInterval } else if t < minimumProviderConfigSyncInterval { t = minimumProviderConfigSyncInterval } return t }
func nextSyncAfter(exp time.Time, clock clockwork.Clock) time.Duration { if exp.IsZero() { return MaximumTokenRefreshInterval } t := exp.Sub(clock.Now()) / 2 if t > MaximumTokenRefreshInterval { t = MaximumTokenRefreshInterval } else if t < MinimumTokenRefreshInterval { t = MinimumTokenRefreshInterval } return t }
func (n *node) expirationAndTTL(clock clockwork.Clock) (*time.Time, int64) { if !n.IsPermanent() { /* compute ttl as: ceiling( (expireTime - timeNow) / nanosecondsPerSecond ) which ranges from 1..n rather than as: ( (expireTime - timeNow) / nanosecondsPerSecond ) + 1 which ranges 1..n+1 */ ttlN := n.ExpireTime.Sub(clock.Now()) ttl := ttlN / time.Second if (ttlN % time.Second) > 0 { ttl++ } t := n.ExpireTime.UTC() return &t, int64(ttl) } return nil, 0 }
// sync copies the keyset from r to the KeySet at w and returns the duration in which the KeySet will expire. // If keyset has already expired, returns a zero duration. func sync(r ReadableKeySetRepo, w WritableKeySetRepo, clock clockwork.Clock) (exp time.Duration, err error) { var ks KeySet ks, err = r.Get() if err != nil { return } if ks == nil { err = errors.New("no source KeySet") return } if err = w.Set(ks); err != nil { return } now := clock.Now() if ks.ExpiresAt().After(now) { exp = ks.ExpiresAt().Sub(now) } return }
func handleKeysFunc(km key.PrivateKeyManager, clock clockwork.Clock) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.Header().Set("Allow", "GET") phttp.WriteError(w, http.StatusMethodNotAllowed, "GET only acceptable method") return } jwks, err := km.JWKs() if err != nil { log.Errorf("Failed to get JWKs while serving HTTP request: %v", err) phttp.WriteError(w, http.StatusInternalServerError, "") return } keys := struct { Keys []jose.JWK `json:"keys"` }{ Keys: jwks, } b, err := json.Marshal(keys) if err != nil { log.Errorf("Unable to marshal signing key to JSON: %v", err) } exp := km.ExpiresAt() w.Header().Set("Expires", exp.Format(time.RFC1123)) ttl := int(exp.Sub(clock.Now()).Seconds()) w.Header().Set("Cache-Control", fmt.Sprintf("public, max-age=%d", ttl)) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write(b) } }
// parseKeyRequest converts a received http.Request on keysPrefix to // a server Request, performing validation of supplied fields as appropriate. // If any validation fails, an empty Request and non-nil error is returned. func parseKeyRequest(r *http.Request, clock clockwork.Clock) (etcdserverpb.Request, error) { emptyReq := etcdserverpb.Request{} err := r.ParseForm() if err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidForm, err.Error(), ) } if !strings.HasPrefix(r.URL.Path, keysPrefix) { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidForm, "incorrect key prefix", ) } p := path.Join(etcdserver.StoreKeysPrefix, r.URL.Path[len(keysPrefix):]) var pIdx, wIdx uint64 if pIdx, err = getUint64(r.Form, "prevIndex"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeIndexNaN, `invalid value for "prevIndex"`, ) } if wIdx, err = getUint64(r.Form, "waitIndex"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeIndexNaN, `invalid value for "waitIndex"`, ) } var rec, sort, wait, dir, quorum, stream bool if rec, err = getBool(r.Form, "recursive"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `invalid value for "recursive"`, ) } if sort, err = getBool(r.Form, "sorted"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `invalid value for "sorted"`, ) } if wait, err = getBool(r.Form, "wait"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `invalid value for "wait"`, ) } // TODO(jonboulle): define what parameters dir is/isn't compatible with? if dir, err = getBool(r.Form, "dir"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `invalid value for "dir"`, ) } if quorum, err = getBool(r.Form, "quorum"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `invalid value for "quorum"`, ) } if stream, err = getBool(r.Form, "stream"); err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `invalid value for "stream"`, ) } if wait && r.Method != "GET" { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, `"wait" can only be used with GET requests`, ) } pV := r.FormValue("prevValue") if _, ok := r.Form["prevValue"]; ok && pV == "" { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodePrevValueRequired, `"prevValue" cannot be empty`, ) } // TTL is nullable, so leave it null if not specified // or an empty string var ttl *uint64 if len(r.FormValue("ttl")) > 0 { i, err := getUint64(r.Form, "ttl") if err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeTTLNaN, `invalid value for "ttl"`, ) } ttl = &i } // prevExist is nullable, so leave it null if not specified var pe *bool if _, ok := r.Form["prevExist"]; ok { bv, err := getBool(r.Form, "prevExist") if err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, "invalid value for prevExist", ) } pe = &bv } // refresh is nullable, so leave it null if not specified var refresh *bool if _, ok := r.Form["refresh"]; ok { bv, err := getBool(r.Form, "refresh") if err != nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeInvalidField, "invalid value for refresh", ) } refresh = &bv if refresh != nil && *refresh { val := r.FormValue("value") if _, ok := r.Form["value"]; ok && val != "" { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeRefreshValue, `A value was provided on a refresh`, ) } if ttl == nil { return emptyReq, etcdErr.NewRequestError( etcdErr.EcodeRefreshTTLRequired, `No TTL value set`, ) } } } rr := etcdserverpb.Request{ Method: r.Method, Path: p, Val: r.FormValue("value"), Dir: dir, PrevValue: pV, PrevIndex: pIdx, PrevExist: pe, Wait: wait, Since: wIdx, Recursive: rec, Sorted: sort, Quorum: quorum, Stream: stream, } if pe != nil { rr.PrevExist = pe } if refresh != nil { rr.Refresh = refresh } // Null TTL is equivalent to unset Expiration if ttl != nil { expr := time.Duration(*ttl) * time.Second rr.Expiration = clock.Now().Add(expr).UnixNano() } return rr, nil }
func nowTime(cl clockwork.Clock) time.Time { if cl == nil { return time.Now() } return cl.Now() }