agent/context/context.go (54 lines of code) (raw):
// Copyright 2016 Amazon.com, Inc. or its affiliates. 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. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file 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 context defines a type that carries context specific data such as the logger.
// Inspired by Google's http://godoc.org/golang.org/x/net/context
package context
import (
"github.com/aws/amazon-ssm-agent/agent/appconfig"
"github.com/aws/amazon-ssm-agent/agent/log"
"github.com/aws/amazon-ssm-agent/common/identity"
)
// T transfers context specific data across different execution boundaries.
// Instead of adding the context to specific structs, we pass Context as the first
// parameter to the methods themselves.
type T interface {
Log() log.T
AppConfig() appconfig.SsmagentConfig
With(context string) T
CurrentContext() []string
AppConstants() *appconfig.AppConstants
Identity() identity.IAgentIdentity
}
// Default returns an empty context that use the default logger and appconfig.
func Default(logger log.T, ssmAppconfig appconfig.SsmagentConfig, agentIdentity identity.IAgentIdentity, contextList ...string) T {
// Loading the maximum & minimum frequency minutes for healthcheck
appconst := appconfig.AppConstants{
MinHealthFrequencyMinutes: appconfig.DefaultSsmHealthFrequencyMinutesMin,
MaxHealthFrequencyMinutes: appconfig.DefaultSsmHealthFrequencyMinutesMax,
}
return &defaultContext{context: contextList, log: logger.WithContext(contextList...), appconfig: ssmAppconfig, appconst: appconst, identity: agentIdentity}
}
type defaultContext struct {
context []string
log log.T
appconfig appconfig.SsmagentConfig
appconst appconfig.AppConstants
identity identity.IAgentIdentity
}
func (c *defaultContext) With(logContext string) T {
contextSlice := append(c.context, logContext)
newContext := &defaultContext{
context: contextSlice,
log: c.log.WithContext(contextSlice...),
appconfig: c.appconfig,
appconst: c.appconst,
identity: c.identity,
}
return newContext
}
func (c *defaultContext) Log() log.T {
return c.log
}
func (c *defaultContext) AppConfig() appconfig.SsmagentConfig {
return c.appconfig
}
func (c *defaultContext) CurrentContext() []string {
return c.context
}
func (c *defaultContext) AppConstants() *appconfig.AppConstants {
return &c.appconst
}
func (c *defaultContext) Identity() identity.IAgentIdentity {
return c.identity
}