mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
864b0c2e47
This fix tries to address the issue raised in 29344 where it was not possible to create log group for awslogs (CloudWatch) on-demand. Log group has to be created explicitly before container is running. This behavior is inconsistent with AWS logs agent where log groups are always created as needed. There were several concerns previously (See comments in 19617 and 29344): 1. There is a limit of 500 log groups/account/region so resource might be exhausted if there is any typo or incorrect region. 2. Logs are generated for every container so CreateLogGroup (or equally, DescribeLogGroups) might be called every time, which is redundant and potentially surprising. 3. CreateLogStream and CreateLogGroup have different IAM policies. This fix addresses the issue by add `--log-opt awslogs-create-group` which by default is `false`. It requires user to explicitly request that log groups be created as needed. Related unit test has been updated. And tests have also been done manually in AWS. This fix fixes 29334. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
92 lines
3.1 KiB
Go
92 lines
3.1 KiB
Go
package awslogs
|
|
|
|
import "github.com/aws/aws-sdk-go/service/cloudwatchlogs"
|
|
|
|
type mockcwlogsclient struct {
|
|
createLogGroupArgument chan *cloudwatchlogs.CreateLogGroupInput
|
|
createLogGroupResult chan *createLogGroupResult
|
|
createLogStreamArgument chan *cloudwatchlogs.CreateLogStreamInput
|
|
createLogStreamResult chan *createLogStreamResult
|
|
putLogEventsArgument chan *cloudwatchlogs.PutLogEventsInput
|
|
putLogEventsResult chan *putLogEventsResult
|
|
}
|
|
|
|
type createLogGroupResult struct {
|
|
successResult *cloudwatchlogs.CreateLogGroupOutput
|
|
errorResult error
|
|
}
|
|
|
|
type createLogStreamResult struct {
|
|
successResult *cloudwatchlogs.CreateLogStreamOutput
|
|
errorResult error
|
|
}
|
|
|
|
type putLogEventsResult struct {
|
|
successResult *cloudwatchlogs.PutLogEventsOutput
|
|
errorResult error
|
|
}
|
|
|
|
func newMockClient() *mockcwlogsclient {
|
|
return &mockcwlogsclient{
|
|
createLogGroupArgument: make(chan *cloudwatchlogs.CreateLogGroupInput, 1),
|
|
createLogGroupResult: make(chan *createLogGroupResult, 1),
|
|
createLogStreamArgument: make(chan *cloudwatchlogs.CreateLogStreamInput, 1),
|
|
createLogStreamResult: make(chan *createLogStreamResult, 1),
|
|
putLogEventsArgument: make(chan *cloudwatchlogs.PutLogEventsInput, 1),
|
|
putLogEventsResult: make(chan *putLogEventsResult, 1),
|
|
}
|
|
}
|
|
|
|
func newMockClientBuffered(buflen int) *mockcwlogsclient {
|
|
return &mockcwlogsclient{
|
|
createLogStreamArgument: make(chan *cloudwatchlogs.CreateLogStreamInput, buflen),
|
|
createLogStreamResult: make(chan *createLogStreamResult, buflen),
|
|
putLogEventsArgument: make(chan *cloudwatchlogs.PutLogEventsInput, buflen),
|
|
putLogEventsResult: make(chan *putLogEventsResult, buflen),
|
|
}
|
|
}
|
|
|
|
func (m *mockcwlogsclient) CreateLogGroup(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
|
|
m.createLogGroupArgument <- input
|
|
output := <-m.createLogGroupResult
|
|
return output.successResult, output.errorResult
|
|
}
|
|
|
|
func (m *mockcwlogsclient) CreateLogStream(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
|
|
m.createLogStreamArgument <- input
|
|
output := <-m.createLogStreamResult
|
|
return output.successResult, output.errorResult
|
|
}
|
|
|
|
func (m *mockcwlogsclient) PutLogEvents(input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) {
|
|
events := make([]*cloudwatchlogs.InputLogEvent, len(input.LogEvents))
|
|
copy(events, input.LogEvents)
|
|
m.putLogEventsArgument <- &cloudwatchlogs.PutLogEventsInput{
|
|
LogEvents: events,
|
|
SequenceToken: input.SequenceToken,
|
|
LogGroupName: input.LogGroupName,
|
|
LogStreamName: input.LogStreamName,
|
|
}
|
|
output := <-m.putLogEventsResult
|
|
return output.successResult, output.errorResult
|
|
}
|
|
|
|
type mockmetadataclient struct {
|
|
regionResult chan *regionResult
|
|
}
|
|
|
|
type regionResult struct {
|
|
successResult string
|
|
errorResult error
|
|
}
|
|
|
|
func newMockMetadataClient() *mockmetadataclient {
|
|
return &mockmetadataclient{
|
|
regionResult: make(chan *regionResult, 1),
|
|
}
|
|
}
|
|
|
|
func (m *mockmetadataclient) Region() (string, error) {
|
|
output := <-m.regionResult
|
|
return output.successResult, output.errorResult
|
|
}
|