grpc.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package namespaces
  2. import (
  3. "golang.org/x/net/context"
  4. "google.golang.org/grpc/metadata"
  5. )
  6. const (
  7. // GRPCHeader defines the header name for specifying a containerd namespace.
  8. GRPCHeader = "containerd-namespace"
  9. )
  10. // NOTE(stevvooe): We can stub this file out if we don't want a grpc dependency here.
  11. func withGRPCNamespaceHeader(ctx context.Context, namespace string) context.Context {
  12. // also store on the grpc headers so it gets picked up by any clients that
  13. // are using this.
  14. nsheader := metadata.Pairs(GRPCHeader, namespace)
  15. md, ok := metadata.FromOutgoingContext(ctx) // merge with outgoing context.
  16. if !ok {
  17. md = nsheader
  18. } else {
  19. // order ensures the latest is first in this list.
  20. md = metadata.Join(nsheader, md)
  21. }
  22. return metadata.NewOutgoingContext(ctx, md)
  23. }
  24. func fromGRPCHeader(ctx context.Context) (string, bool) {
  25. // try to extract for use in grpc servers.
  26. md, ok := metadata.FromIncomingContext(ctx)
  27. if !ok {
  28. // TODO(stevvooe): Check outgoing context?
  29. return "", false
  30. }
  31. values := md[GRPCHeader]
  32. if len(values) == 0 {
  33. return "", false
  34. }
  35. return values[0], true
  36. }