github.com/Axway/agent-sdk@v1.1.101/pkg/agent/handler/handler.go (about)

     1  package handler
     2  
     3  import (
     4  	"context"
     5  
     6  	v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1"
     7  	corelog "github.com/Axway/agent-sdk/pkg/util/log"
     8  	"github.com/Axway/agent-sdk/pkg/watchmanager/proto"
     9  	"github.com/sirupsen/logrus"
    10  )
    11  
    12  func init() {
    13  	fieldLogger = corelog.NewFieldLogger().WithPackage("sdk.agent.handler")
    14  }
    15  
    16  // Handler interface used by the EventListener to process events.
    17  type Handler interface {
    18  	// Handle receives the type of the event context, event metadata and the API Server resource, if it exists.
    19  	Handle(ctx context.Context, eventMetadata *proto.EventMeta, resource *v1.ResourceInstance) error
    20  }
    21  
    22  // This type is used for values added to context
    23  type ctxKey int
    24  
    25  // The key used for the logger in the context
    26  const (
    27  	ctxLogger ctxKey = iota
    28  	ctxAction
    29  )
    30  
    31  var fieldLogger corelog.FieldLogger
    32  
    33  // logger constants
    34  const (
    35  	handlerField    = "handler"
    36  	sequenceIDField = "sequence"
    37  	actionField     = "action"
    38  	typeField       = "resource"
    39  	nameField       = "name"
    40  )
    41  
    42  // client is an interface that is implemented by the ServiceClient in apic/client.go.
    43  type client interface {
    44  	GetResource(url string) (*v1.ResourceInstance, error)
    45  	UpdateResourceFinalizer(ri *v1.ResourceInstance, finalizer, description string, addAction bool) (*v1.ResourceInstance, error)
    46  	CreateSubResource(rm v1.ResourceMeta, subs map[string]interface{}) error
    47  	UpdateResourceInstance(ri v1.Interface) (*v1.ResourceInstance, error)
    48  }
    49  
    50  func isStatusFound(rs *v1.ResourceStatus) bool {
    51  	if rs == nil || rs.Level == "" {
    52  		return false
    53  	}
    54  	return true
    55  }
    56  
    57  // NewEventContext - create a context for the new event
    58  func NewEventContext(action proto.Event_Type, eventMetadata *proto.EventMeta, kind, name string) context.Context {
    59  	logger := fieldLogger.WithFields(
    60  		logrus.Fields{
    61  			actionField: action.String(),
    62  			typeField:   kind,
    63  			nameField:   name,
    64  		},
    65  	)
    66  	if eventMetadata != nil {
    67  		logger = logger.
    68  			WithField(sequenceIDField, eventMetadata.SequenceID)
    69  	}
    70  	return setActionInContext(setLoggerInContext(context.Background(), logger), action)
    71  }
    72  
    73  func setLoggerInContext(ctx context.Context, logger corelog.FieldLogger) context.Context {
    74  	return context.WithValue(ctx, ctxLogger, logger)
    75  }
    76  
    77  func setActionInContext(ctx context.Context, action proto.Event_Type) context.Context {
    78  	return context.WithValue(ctx, ctxAction, action)
    79  }
    80  
    81  // getLoggerFromContext - returns the field logger that is part of the context
    82  func getLoggerFromContext(ctx context.Context) corelog.FieldLogger {
    83  	return ctx.Value(ctxLogger).(corelog.FieldLogger)
    84  }
    85  
    86  // GetActionFromContext retrieve event type from the context
    87  func GetActionFromContext(ctx context.Context) proto.Event_Type {
    88  	return ctx.Value(ctxAction).(proto.Event_Type)
    89  }