| Index: impl/cloud/info.go
 | 
| diff --git a/impl/cloud/info.go b/impl/cloud/info.go
 | 
| index ed30700f9138dc7dff73da4e193008b112de88a1..1109c8114f9856025dca80279dfcd4caed8263a7 100644
 | 
| --- a/impl/cloud/info.go
 | 
| +++ b/impl/cloud/info.go
 | 
| @@ -5,10 +5,12 @@
 | 
|  package cloud
 | 
|  
 | 
|  import (
 | 
| -	"errors"
 | 
|  	"time"
 | 
|  
 | 
|  	infoS "github.com/luci/gae/service/info"
 | 
| +	"github.com/luci/gae/service/info/support"
 | 
| +
 | 
| +	"github.com/luci/luci-go/common/errors"
 | 
|  
 | 
|  	"golang.org/x/net/context"
 | 
|  )
 | 
| @@ -43,9 +45,8 @@ func (ci *infoState) derive(mutate func(*infoState)) *infoState {
 | 
|  }
 | 
|  
 | 
|  type infoService struct {
 | 
| +	context.Context
 | 
|  	*infoState
 | 
| -
 | 
| -	ic context.Context
 | 
|  }
 | 
|  
 | 
|  func useInfo(c context.Context) context.Context {
 | 
| @@ -54,51 +55,51 @@ func useInfo(c context.Context) context.Context {
 | 
|  
 | 
|  	return infoS.SetFactory(c, func(ic context.Context) infoS.RawInterface {
 | 
|  		return &infoService{
 | 
| +			Context:   ic,
 | 
|  			infoState: getInfoState(ic),
 | 
| -			ic:        ic,
 | 
|  		}
 | 
|  	})
 | 
|  }
 | 
|  
 | 
| -func (i *infoService) AppID() string                { panic(errNotImplemented) }
 | 
| -func (i *infoService) FullyQualifiedAppID() string  { return "" }
 | 
| -func (i *infoService) GetNamespace() (string, bool) { return i.namespace, (i.namespace != "") }
 | 
| -
 | 
| -func (i *infoService) Datacenter() string             { panic(errNotImplemented) }
 | 
| -func (i *infoService) DefaultVersionHostname() string { panic(errNotImplemented) }
 | 
| -func (i *infoService) InstanceID() string             { panic(errNotImplemented) }
 | 
| -func (i *infoService) IsDevAppServer() bool           { panic(errNotImplemented) }
 | 
| -func (i *infoService) IsOverQuota(err error) bool     { panic(errNotImplemented) }
 | 
| -func (i *infoService) IsTimeoutError(err error) bool  { panic(errNotImplemented) }
 | 
| -func (i *infoService) ModuleHostname(module, version, instance string) (string, error) {
 | 
| +func (*infoService) AppID() string               { panic(errNotImplemented) }
 | 
| +func (*infoService) FullyQualifiedAppID() string { return "" }
 | 
| +func (i *infoService) GetNamespace() string      { return i.namespace }
 | 
| +
 | 
| +func (*infoService) Datacenter() string             { panic(errNotImplemented) }
 | 
| +func (*infoService) DefaultVersionHostname() string { panic(errNotImplemented) }
 | 
| +func (*infoService) InstanceID() string             { panic(errNotImplemented) }
 | 
| +func (*infoService) IsDevAppServer() bool           { panic(errNotImplemented) }
 | 
| +func (*infoService) IsOverQuota(err error) bool     { panic(errNotImplemented) }
 | 
| +func (*infoService) IsTimeoutError(err error) bool  { panic(errNotImplemented) }
 | 
| +func (*infoService) ModuleHostname(module, version, instance string) (string, error) {
 | 
|  	return "", errNotImplemented
 | 
|  }
 | 
| -func (i *infoService) ModuleName() string              { panic(errNotImplemented) }
 | 
| -func (i *infoService) RequestID() string               { panic(errNotImplemented) }
 | 
| -func (i *infoService) ServerSoftware() string          { panic(errNotImplemented) }
 | 
| -func (i *infoService) ServiceAccount() (string, error) { return "", errNotImplemented }
 | 
| -func (i *infoService) VersionID() string               { panic(errNotImplemented) }
 | 
| +func (*infoService) ModuleName() string              { panic(errNotImplemented) }
 | 
| +func (*infoService) RequestID() string               { panic(errNotImplemented) }
 | 
| +func (*infoService) ServerSoftware() string          { panic(errNotImplemented) }
 | 
| +func (*infoService) ServiceAccount() (string, error) { return "", errNotImplemented }
 | 
| +func (*infoService) VersionID() string               { panic(errNotImplemented) }
 | 
|  
 | 
|  func (i *infoService) Namespace(namespace string) (context.Context, error) {
 | 
| -	return i.MustNamespace(namespace), nil
 | 
| -}
 | 
| +	if err := support.ValidNamespace(namespace); err != nil {
 | 
| +		return i, err
 | 
| +	}
 | 
|  
 | 
| -func (i *infoService) MustNamespace(namespace string) context.Context {
 | 
|  	return i.derive(func(ci *infoState) {
 | 
|  		ci.namespace = namespace
 | 
| -	}).use(i.ic)
 | 
| +	}).use(i), nil
 | 
|  }
 | 
|  
 | 
| -func (i *infoService) AccessToken(scopes ...string) (token string, expiry time.Time, err error) {
 | 
| +func (*infoService) AccessToken(scopes ...string) (token string, expiry time.Time, err error) {
 | 
|  	return "", time.Time{}, errNotImplemented
 | 
|  }
 | 
|  
 | 
| -func (i *infoService) PublicCertificates() ([]infoS.Certificate, error) {
 | 
| +func (*infoService) PublicCertificates() ([]infoS.Certificate, error) {
 | 
|  	return nil, errNotImplemented
 | 
|  }
 | 
|  
 | 
| -func (i *infoService) SignBytes(bytes []byte) (keyName string, signature []byte, err error) {
 | 
| +func (*infoService) SignBytes(bytes []byte) (keyName string, signature []byte, err error) {
 | 
|  	return "", nil, errNotImplemented
 | 
|  }
 | 
|  
 | 
| -func (i *infoService) Testable() infoS.Testable { return nil }
 | 
| +func (*infoService) GetTestable() infoS.Testable { return nil }
 | 
| 
 |