mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Merge pull request #37374 from haikuoliu/branch_endpoint
Pass endpoint to the CloudWatch Logs logging driver
This commit is contained in:
		
						commit
						8d1b280a25
					
				
					 2 changed files with 47 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -29,6 +29,7 @@ import (
 | 
			
		|||
const (
 | 
			
		||||
	name                   = "awslogs"
 | 
			
		||||
	regionKey              = "awslogs-region"
 | 
			
		||||
	endpointKey            = "awslogs-endpoint"
 | 
			
		||||
	regionEnvKey           = "AWS_REGION"
 | 
			
		||||
	logGroupKey            = "awslogs-group"
 | 
			
		||||
	logStreamKey           = "awslogs-stream"
 | 
			
		||||
| 
						 | 
				
			
			@ -111,11 +112,11 @@ type eventBatch struct {
 | 
			
		|||
 | 
			
		||||
// New creates an awslogs logger using the configuration passed in on the
 | 
			
		||||
// context.  Supported context configuration variables are awslogs-region,
 | 
			
		||||
// awslogs-group, awslogs-stream, awslogs-create-group, awslogs-multiline-pattern
 | 
			
		||||
// and awslogs-datetime-format.  When available, configuration is
 | 
			
		||||
// also taken from environment variables AWS_REGION, AWS_ACCESS_KEY_ID,
 | 
			
		||||
// AWS_SECRET_ACCESS_KEY, the shared credentials file (~/.aws/credentials), and
 | 
			
		||||
// the EC2 Instance Metadata Service.
 | 
			
		||||
// awslogs-endpoint, awslogs-group, awslogs-stream, awslogs-create-group,
 | 
			
		||||
// awslogs-multiline-pattern and awslogs-datetime-format.
 | 
			
		||||
// When available, configuration is also taken from environment variables
 | 
			
		||||
// AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, the shared credentials
 | 
			
		||||
// file (~/.aws/credentials), and the EC2 Instance Metadata Service.
 | 
			
		||||
func New(info logger.Info) (logger.Logger, error) {
 | 
			
		||||
	logGroupName := info.Config[logGroupKey]
 | 
			
		||||
	logStreamName, err := loggerutils.ParseLogTag(info, "{{.FullID}}")
 | 
			
		||||
| 
						 | 
				
			
			@ -262,13 +263,16 @@ var newSDKEndpoint = credentialsEndpoint
 | 
			
		|||
// User-Agent string and automatic region detection using the EC2 Instance
 | 
			
		||||
// Metadata Service when region is otherwise unspecified.
 | 
			
		||||
func newAWSLogsClient(info logger.Info) (api, error) {
 | 
			
		||||
	var region *string
 | 
			
		||||
	var region, endpoint *string
 | 
			
		||||
	if os.Getenv(regionEnvKey) != "" {
 | 
			
		||||
		region = aws.String(os.Getenv(regionEnvKey))
 | 
			
		||||
	}
 | 
			
		||||
	if info.Config[regionKey] != "" {
 | 
			
		||||
		region = aws.String(info.Config[regionKey])
 | 
			
		||||
	}
 | 
			
		||||
	if info.Config[endpointKey] != "" {
 | 
			
		||||
		endpoint = aws.String(info.Config[endpointKey])
 | 
			
		||||
	}
 | 
			
		||||
	if region == nil || *region == "" {
 | 
			
		||||
		logrus.Info("Trying to get region from EC2 Metadata")
 | 
			
		||||
		ec2MetadataClient := newRegionFinder()
 | 
			
		||||
| 
						 | 
				
			
			@ -290,6 +294,11 @@ func newAWSLogsClient(info logger.Info) (api, error) {
 | 
			
		|||
	// attach region to cloudwatchlogs config
 | 
			
		||||
	sess.Config.Region = region
 | 
			
		||||
 | 
			
		||||
	// attach endpoint to cloudwatchlogs config
 | 
			
		||||
	if endpoint != nil {
 | 
			
		||||
		sess.Config.Endpoint = endpoint
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if uri, ok := info.Config[credentialsEndpointKey]; ok {
 | 
			
		||||
		logrus.Debugf("Trying to get credentials from awslogs-credentials-endpoint")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -606,7 +615,7 @@ func (l *logStream) putLogEvents(events []*cloudwatchlogs.InputLogEvent, sequenc
 | 
			
		|||
	return resp.NextSequenceToken, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateLogOpt looks for awslogs-specific log options awslogs-region,
 | 
			
		||||
// ValidateLogOpt looks for awslogs-specific log options awslogs-region, awslogs-endpoint
 | 
			
		||||
// awslogs-group, awslogs-stream, awslogs-create-group, awslogs-datetime-format,
 | 
			
		||||
// awslogs-multiline-pattern
 | 
			
		||||
func ValidateLogOpt(cfg map[string]string) error {
 | 
			
		||||
| 
						 | 
				
			
			@ -616,6 +625,7 @@ func ValidateLogOpt(cfg map[string]string) error {
 | 
			
		|||
		case logStreamKey:
 | 
			
		||||
		case logCreateGroupKey:
 | 
			
		||||
		case regionKey:
 | 
			
		||||
		case endpointKey:
 | 
			
		||||
		case tagKey:
 | 
			
		||||
		case datetimeFormatKey:
 | 
			
		||||
		case multilinePatternKey:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,13 +67,11 @@ func TestNewAWSLogsClientUserAgentHandler(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	client, err := newAWSLogsClient(info)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
 | 
			
		||||
	realClient, ok := client.(*cloudwatchlogs.CloudWatchLogs)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		t.Fatal("Could not cast client to cloudwatchlogs.CloudWatchLogs")
 | 
			
		||||
	}
 | 
			
		||||
	assert.Check(t, ok, "Could not cast client to cloudwatchlogs.CloudWatchLogs")
 | 
			
		||||
 | 
			
		||||
	buildHandlerList := realClient.Handlers.Build
 | 
			
		||||
	request := &request.Request{
 | 
			
		||||
		HTTPRequest: &http.Request{
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +88,26 @@ func TestNewAWSLogsClientUserAgentHandler(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNewAWSLogsClientAWSLogsEndpoint(t *testing.T) {
 | 
			
		||||
	endpoint := "mock-endpoint"
 | 
			
		||||
	info := logger.Info{
 | 
			
		||||
		Config: map[string]string{
 | 
			
		||||
			regionKey:   "us-east-1",
 | 
			
		||||
			endpointKey: endpoint,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	client, err := newAWSLogsClient(info)
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
 | 
			
		||||
	realClient, ok := client.(*cloudwatchlogs.CloudWatchLogs)
 | 
			
		||||
	assert.Check(t, ok, "Could not cast client to cloudwatchlogs.CloudWatchLogs")
 | 
			
		||||
 | 
			
		||||
	endpointWithScheme := realClient.Endpoint
 | 
			
		||||
	expectedEndpointWithScheme := "https://" + endpoint
 | 
			
		||||
	assert.Equal(t, endpointWithScheme, expectedEndpointWithScheme, "Wrong endpoint")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNewAWSLogsClientRegionDetect(t *testing.T) {
 | 
			
		||||
	info := logger.Info{
 | 
			
		||||
		Config: map[string]string{},
 | 
			
		||||
| 
						 | 
				
			
			@ -104,9 +122,7 @@ func TestNewAWSLogsClientRegionDetect(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	_, err := newAWSLogsClient(info)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCreateSuccess(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			@ -196,9 +212,7 @@ func TestCreateAlreadyExists(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	err := stream.create()
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Expected nil err")
 | 
			
		||||
	}
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestLogClosed(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			@ -242,9 +256,8 @@ func TestLogBlocking(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
	select {
 | 
			
		||||
	case err := <-errorCh:
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		assert.NilError(t, err)
 | 
			
		||||
 | 
			
		||||
	case <-time.After(30 * time.Second):
 | 
			
		||||
		t.Fatal("timed out waiting for read")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -258,9 +271,7 @@ func TestLogNonBlockingBufferEmpty(t *testing.T) {
 | 
			
		|||
		logNonBlocking: true,
 | 
			
		||||
	}
 | 
			
		||||
	err := stream.Log(&logger.Message{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestLogNonBlockingBufferFull(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1246,9 +1257,7 @@ func TestCreateTagSuccess(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	err := stream.create()
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("Received unexpected err: %v\n", err)
 | 
			
		||||
	}
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
	argument := <-mockClient.createLogStreamArgument
 | 
			
		||||
 | 
			
		||||
	if *argument.LogStreamName != "test-container/container-abcdefghijklmnopqrstuvwxyz01234567890" {
 | 
			
		||||
| 
						 | 
				
			
			@ -1340,7 +1349,6 @@ func TestNewAWSLogsClientCredentialEnvironmentVariable(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	assert.Check(t, is.Equal(expectedAccessKeyID, creds.AccessKeyID))
 | 
			
		||||
	assert.Check(t, is.Equal(expectedSecretAccessKey, creds.SecretAccessKey))
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNewAWSLogsClientCredentialSharedFile(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue