11package namespaces
22
33import (
4+ "os"
5+
46 "github.com/pkg/errors"
57 "golang.org/x/net/context"
68)
79
10+ const (
11+ namespaceEnvVar = "CONTAINERD_NAMESPACE"
12+ defaultNamespace = "default"
13+ )
14+
815var (
916 errNamespaceRequired = errors .New ("namespace is required" )
1017)
1118
1219type namespaceKey struct {}
1320
21+ // WithNamespace sets a given namespace on the context
1422func WithNamespace (ctx context.Context , namespace string ) context.Context {
1523 ctx = context .WithValue (ctx , namespaceKey {}, namespace ) // set our key for namespace
1624
@@ -19,6 +27,17 @@ func WithNamespace(ctx context.Context, namespace string) context.Context {
1927 return withGRPCNamespaceHeader (ctx , namespace )
2028}
2129
30+ // NamespaceFromEnv uses the namespace defined in CONTAINERD_NAMESPACE or
31+ // default
32+ func NamespaceFromEnv (ctx context.Context ) context.Context {
33+ namespace := os .Getenv (namespaceEnvVar )
34+ if namespace == "" {
35+ namespace = defaultNamespace
36+ }
37+ return WithNamespace (ctx , namespace )
38+ }
39+
40+ // Namespace returns the namespace from the context
2241func Namespace (ctx context.Context ) (string , bool ) {
2342 namespace , ok := ctx .Value (namespaceKey {}).(string )
2443 if ! ok {
@@ -28,10 +47,12 @@ func Namespace(ctx context.Context) (string, bool) {
2847 return namespace , ok
2948}
3049
50+ // IsNamespaceRequired returns whether an error is caused by a missing namespace
3151func IsNamespaceRequired (err error ) bool {
3252 return errors .Cause (err ) == errNamespaceRequired
3353}
3454
55+ // NamespaceRequired returns the namespace or an error
3556func NamespaceRequired (ctx context.Context ) (string , error ) {
3657 namespace , ok := Namespace (ctx )
3758 if ! ok || namespace == "" {
0 commit comments