blob: df923c0e0c55e4595255e6f85bd7f8ab5956f8bd [file] [log] [blame]
// Copyright 2015 The LUCI Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package memory
import (
"context"
"fmt"
"go.chromium.org/luci/gae/impl/dummy"
"go.chromium.org/luci/gae/service/info"
"go.chromium.org/luci/gae/service/info/support"
)
var giContextKey = "holds a *globalInfoData"
var defaultGlobalInfoData = globalInfoData{
// versionID returns X.Y where Y is autogenerated by appengine, and X is
// whatever's in app.yaml.
versionID: "testVersionID.1",
requestID: "test-request-id",
}
type globalInfoData struct {
appID string
fqAppID string
namespace string
versionID string
requestID string
}
func curGID(c context.Context) *globalInfoData {
if gid, ok := c.Value(&giContextKey).(*globalInfoData); ok {
return gid
}
return &defaultGlobalInfoData
}
func useGID(c context.Context, f func(mod *globalInfoData)) context.Context {
cur := curGID(c)
if cur == nil {
cur = &defaultGlobalInfoData
}
clone := *cur
f(&clone)
return context.WithValue(c, &giContextKey, &clone)
}
// useGI adds a gae.GlobalInfo context, accessible
// by gae.GetGI(c)
func useGI(c context.Context) context.Context {
return info.SetFactory(c, func(ic context.Context) info.RawInterface {
return &giImpl{dummy.Info(), curGID(ic), ic}
})
}
type giImpl struct {
info.RawInterface
*globalInfoData
c context.Context
}
var _ = info.RawInterface((*giImpl)(nil))
func (gi *giImpl) GetNamespace() string { return gi.namespace }
func (gi *giImpl) Namespace(ns string) (context.Context, error) {
if err := support.ValidNamespace(ns); err != nil {
return gi.c, err
}
return useGID(gi.c, func(mod *globalInfoData) {
mod.namespace = ns
}), nil
}
func (gi *giImpl) AppID() string {
return gi.appID
}
func (gi *giImpl) FullyQualifiedAppID() string {
return gi.fqAppID
}
func (gi *giImpl) DefaultVersionHostname() string {
return fmt.Sprintf("%s.example.com", gi.appID)
}
func (gi *giImpl) IsDevAppServer() bool {
return true
}
func (gi *giImpl) ServiceAccount() (string, error) {
return "gae_service_account@example.com", nil
}
func (gi *giImpl) VersionID() string {
return curGID(gi.c).versionID
}
func (gi *giImpl) RequestID() string {
return curGID(gi.c).requestID
}
func (gi *giImpl) GetTestable() info.Testable {
return gi
}
func (gi *giImpl) SetVersionID(v string) context.Context {
return useGID(gi.c, func(mod *globalInfoData) {
mod.versionID = v
})
}
func (gi *giImpl) SetRequestID(v string) context.Context {
return useGID(gi.c, func(mod *globalInfoData) {
mod.requestID = v
})
}