mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 05:40:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2014 The Kubernetes Authors All rights reserved.
 | |
| 
 | |
| 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 api
 | |
| 
 | |
| import (
 | |
| 	stderrs "errors"
 | |
| 	"time"
 | |
| 
 | |
| 	"golang.org/x/net/context"
 | |
| 	"k8s.io/kubernetes/pkg/auth/user"
 | |
| )
 | |
| 
 | |
| // Context carries values across API boundaries.
 | |
| // This context matches the context.Context interface
 | |
| // (https://blog.golang.org/context), for the purposes
 | |
| // of passing the api.Context through to the storage tier.
 | |
| // TODO: Determine the extent that this abstraction+interface
 | |
| // is used by the api, and whether we can remove.
 | |
| type Context interface {
 | |
| 	// Value returns the value associated with key or nil if none.
 | |
| 	Value(key interface{}) interface{}
 | |
| 
 | |
| 	// Deadline returns the time when this Context will be canceled, if any.
 | |
| 	Deadline() (deadline time.Time, ok bool)
 | |
| 
 | |
| 	// Done returns a channel that is closed when this Context is canceled
 | |
| 	// or times out.
 | |
| 	Done() <-chan struct{}
 | |
| 
 | |
| 	// Err indicates why this context was canceled, after the Done channel
 | |
| 	// is closed.
 | |
| 	Err() error
 | |
| }
 | |
| 
 | |
| // The key type is unexported to prevent collisions
 | |
| type key int
 | |
| 
 | |
| // namespaceKey is the context key for the request namespace.
 | |
| const namespaceKey key = 0
 | |
| 
 | |
| // userKey is the context key for the request user.
 | |
| const userKey key = 1
 | |
| 
 | |
| // NewContext instantiates a base context object for request flows.
 | |
| func NewContext() Context {
 | |
| 	return context.TODO()
 | |
| }
 | |
| 
 | |
| // NewDefaultContext instantiates a base context object for request flows in the default namespace
 | |
| func NewDefaultContext() Context {
 | |
| 	return WithNamespace(NewContext(), NamespaceDefault)
 | |
| }
 | |
| 
 | |
| // WithValue returns a copy of parent in which the value associated with key is val.
 | |
| func WithValue(parent Context, key interface{}, val interface{}) Context {
 | |
| 	internalCtx, ok := parent.(context.Context)
 | |
| 	if !ok {
 | |
| 		panic(stderrs.New("Invalid context type"))
 | |
| 	}
 | |
| 	return context.WithValue(internalCtx, key, val)
 | |
| }
 | |
| 
 | |
| // WithNamespace returns a copy of parent in which the namespace value is set
 | |
| func WithNamespace(parent Context, namespace string) Context {
 | |
| 	return WithValue(parent, namespaceKey, namespace)
 | |
| }
 | |
| 
 | |
| // NamespaceFrom returns the value of the namespace key on the ctx
 | |
| func NamespaceFrom(ctx Context) (string, bool) {
 | |
| 	namespace, ok := ctx.Value(namespaceKey).(string)
 | |
| 	return namespace, ok
 | |
| }
 | |
| 
 | |
| // NamespaceValue returns the value of the namespace key on the ctx, or the empty string if none
 | |
| func NamespaceValue(ctx Context) string {
 | |
| 	namespace, _ := NamespaceFrom(ctx)
 | |
| 	return namespace
 | |
| }
 | |
| 
 | |
| // ValidNamespace returns false if the namespace on the context differs from the resource.  If the resource has no namespace, it is set to the value in the context.
 | |
| func ValidNamespace(ctx Context, resource *ObjectMeta) bool {
 | |
| 	ns, ok := NamespaceFrom(ctx)
 | |
| 	if len(resource.Namespace) == 0 {
 | |
| 		resource.Namespace = ns
 | |
| 	}
 | |
| 	return ns == resource.Namespace && ok
 | |
| }
 | |
| 
 | |
| // WithNamespaceDefaultIfNone returns a context whose namespace is the default if and only if the parent context has no namespace value
 | |
| func WithNamespaceDefaultIfNone(parent Context) Context {
 | |
| 	namespace, ok := NamespaceFrom(parent)
 | |
| 	if !ok || len(namespace) == 0 {
 | |
| 		return WithNamespace(parent, NamespaceDefault)
 | |
| 	}
 | |
| 	return parent
 | |
| }
 | |
| 
 | |
| // WithUser returns a copy of parent in which the user value is set
 | |
| func WithUser(parent Context, user user.Info) Context {
 | |
| 	return WithValue(parent, userKey, user)
 | |
| }
 | |
| 
 | |
| // UserFrom returns the value of the user key on the ctx
 | |
| func UserFrom(ctx Context) (user.Info, bool) {
 | |
| 	user, ok := ctx.Value(userKey).(user.Info)
 | |
| 	return user, ok
 | |
| }
 |