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 }