coredns: github.com/coredns/coredns/plugin/metadata Index | Files

package metadata

import "github.com/coredns/coredns/plugin/metadata"

Package metadata provides an API that allows plugins to add metadata to the context. Each metadata is stored under a label that has the form <plugin>/<name>. Each metadata is returned as a Func. When Func is called the metadata is returned. If Func is expensive to execute it is its responsibility to provide some form of caching. During the handling of a query it is expected the metadata stays constant.

Basic example:

Implement the Provider interface for a plugin p:

   func (p P) Metadata(ctx context.Context, state request.Request) context.Context {
      metadata.SetValueFunc(ctx, "test/something", func() string { return "myvalue" })
	 return ctx
   }

Basic example with caching:

   func (p P) Metadata(ctx context.Context, state request.Request) context.Context {
      cached := ""
      f := func() string {
		if cached != "" {
                return cached
            }
            cached = expensiveFunc()
            return cached
      }
      metadata.SetValueFunc(ctx, "test/something", f)
	 return ctx
   }

If you need access to this metadata from another plugin:

// ...
valueFunc := metadata.ValueFunc(ctx, "test/something")
value := valueFunc()
// use 'value'

Index

Package Files

metadata.go provider.go setup.go

func ContextWithMetadata Uses

func ContextWithMetadata(ctx context.Context) context.Context

ContextWithMetadata is exported for use by provider tests

func IsLabel Uses

func IsLabel(label string) bool

IsLabel checks that the provided name is a valid label name, i.e. two words separated by a slash.

func Labels Uses

func Labels(ctx context.Context) []string

Labels returns all metadata keys stored in the context. These label names should be named as: plugin/NAME, where NAME is something descriptive.

func SetValueFunc Uses

func SetValueFunc(ctx context.Context, label string, f Func) bool

SetValueFunc set the metadata label to the value function. If no metadata can be found this is a noop and false is returned. Any existing value is overwritten.

func ValueFuncs Uses

func ValueFuncs(ctx context.Context) map[string]Func

ValueFuncs returns the map[string]Func from the context, or nil if it does not exist.

type Func Uses

type Func func() string

Func is the type of function in the metadata, when called they return the value of the label.

func ValueFunc Uses

func ValueFunc(ctx context.Context, label string) Func

ValueFunc returns the value function of label. If none can be found nil is returned. Calling the function returns the value of the label.

type Metadata Uses

type Metadata struct {
    Zones     []string
    Providers []Provider
    Next      plugin.Handler
}

Metadata implements collecting metadata information from all plugins that implement the Provider interface.

func (*Metadata) Name Uses

func (m *Metadata) Name() string

Name implements the Handler interface.

func (*Metadata) ServeDNS Uses

func (m *Metadata) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error)

ServeDNS implements the plugin.Handler interface.

type Provider Uses

type Provider interface {
    // Metadata adds metadata to the context and returns a (potentially) new context.
    // Note: this method should work quickly, because it is called for every request
    // from the metadata plugin.
    Metadata(ctx context.Context, state request.Request) context.Context
}

Provider interface needs to be implemented by each plugin willing to provide metadata information for other plugins.

Package metadata imports 7 packages (graph) and is imported by 41 packages. Updated 2020-11-02. Refresh now. Tools for package owners.