From 0cf497df61401b06ee29038a5215dc029593d1cb Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Fri, 4 Jan 2019 18:00:29 +0600 Subject: [PATCH 1/3] PMM-3094 Add support for AWS Gov cloud --- services/rds/rds.go | 127 +++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 62 deletions(-) diff --git a/services/rds/rds.go b/services/rds/rds.go index 50ba7f5f78..3ddcd89b6a 100644 --- a/services/rds/rds.go +++ b/services/rds/rds.go @@ -260,74 +260,77 @@ func (svc *Service) Discover(ctx context.Context, accessKey, secretKey string) ( var g errgroup.Group instances := make(chan Instance) - for _, r := range endpoints.AwsPartition().Services()[endpoints.RdsServiceID].Regions() { - region := r.ID() - g.Go(func() error { - // use given credentials, or default credential chain - var creds *credentials.Credentials - if accessKey != "" || secretKey != "" { - creds = credentials.NewCredentials(&credentials.StaticProvider{ - Value: credentials.Value{ - AccessKeyID: accessKey, - SecretAccessKey: secretKey, - }, - }) - } - config := &aws.Config{ - CredentialsChainVerboseErrors: aws.Bool(true), - Credentials: creds, - Region: aws.String(region), - HTTPClient: svc.httpClient, - Logger: aws.LoggerFunc(l.Debug), - } - if l.Level >= logrus.DebugLevel { - config.LogLevel = aws.LogLevel(aws.LogDebug) - } - s, err := session.NewSession(config) - if err != nil { - return errors.WithStack(err) - } + partitions := []endpoints.Partition{endpoints.AwsPartition(), endpoints.AwsUsGovPartition()} + for _, p := range partitions { + for _, r := range p.Services()[endpoints.RdsServiceID].Regions() { + region := r.ID() + g.Go(func() error { + // use given credentials, or default credential chain + var creds *credentials.Credentials + if accessKey != "" || secretKey != "" { + creds = credentials.NewCredentials(&credentials.StaticProvider{ + Value: credentials.Value{ + AccessKeyID: accessKey, + SecretAccessKey: secretKey, + }, + }) + } + config := &aws.Config{ + CredentialsChainVerboseErrors: aws.Bool(true), + Credentials: creds, + Region: aws.String(region), + HTTPClient: svc.httpClient, + Logger: aws.LoggerFunc(l.Debug), + } + if l.Level >= logrus.DebugLevel { + config.LogLevel = aws.LogLevel(aws.LogDebug) + } + s, err := session.NewSession(config) + if err != nil { + return errors.WithStack(err) + } - out, err := rds.New(s).DescribeDBInstancesWithContext(ctx, new(rds.DescribeDBInstancesInput)) - if err != nil { - l.Error(err) + out, err := rds.New(s).DescribeDBInstancesWithContext(ctx, new(rds.DescribeDBInstancesInput)) + if err != nil { + l.Error(err) - if err, ok := err.(awserr.Error); ok { - if err.OrigErr() != nil && err.OrigErr() == ctx.Err() { - // ignore timeout, let other goroutines return partial data - return nil - } - switch err.Code() { - case "InvalidClientTokenId", "EmptyStaticCreds": - return status.Error(codes.InvalidArgument, err.Message()) - default: - return err + if err, ok := err.(awserr.Error); ok { + if err.OrigErr() != nil && err.OrigErr() == ctx.Err() { + // ignore timeout, let other goroutines return partial data + return nil + } + switch err.Code() { + case "InvalidClientTokenId", "EmptyStaticCreds": + return status.Error(codes.InvalidArgument, err.Message()) + default: + return err + } } + return errors.WithStack(err) } - return errors.WithStack(err) - } - l.Debugf("Got %d instances from %s.", len(out.DBInstances), region) - for _, db := range out.DBInstances { - instances <- Instance{ - Node: models.RDSNode{ - Type: models.RDSNodeType, - Name: *db.DBInstanceIdentifier, - - Region: region, - }, - Service: models.RDSService{ - Type: models.RDSServiceType, - - Address: db.Endpoint.Address, - Port: pointer.ToUint16(uint16(*db.Endpoint.Port)), - Engine: db.Engine, - EngineVersion: db.EngineVersion, - }, + l.Debugf("Got %d instances from %s.", len(out.DBInstances), region) + for _, db := range out.DBInstances { + instances <- Instance{ + Node: models.RDSNode{ + Type: models.RDSNodeType, + Name: *db.DBInstanceIdentifier, + + Region: region, + }, + Service: models.RDSService{ + Type: models.RDSServiceType, + + Address: db.Endpoint.Address, + Port: pointer.ToUint16(uint16(*db.Endpoint.Port)), + Engine: db.Engine, + EngineVersion: db.EngineVersion, + }, + } } - } - return nil - }) + return nil + }) + } } go func() { From 84602707be797f9cbf5bd9b6fcc84c2f49fb9245 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Mon, 7 Jan 2019 14:52:43 +0600 Subject: [PATCH 2/3] PMM-3094 fix mysql test --- services/mysql/mysql_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/mysql/mysql_test.go b/services/mysql/mysql_test.go index f6c5a7070e..efa59d7b8a 100644 --- a/services/mysql/mysql_test.go +++ b/services/mysql/mysql_test.go @@ -196,7 +196,7 @@ func TestAddListRemove(t *testing.T) { Address: pointer.ToString("localhost"), Port: pointer.ToUint16(3306), Engine: pointer.ToString("Percona Server"), - EngineVersion: pointer.ToString("5.7.23"), + EngineVersion: pointer.ToString("5.7.24"), }, }} assert.Equal(t, expected, actual) From 3bcb5bad1aae63fa8923ce890bb955c00001c876 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Mon, 7 Jan 2019 15:24:41 +0600 Subject: [PATCH 3/3] PMM-3094 new flag to enable RDS gov cloud --- cmd/pmm-managed/main.go | 4 ++++ services/rds/rds.go | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cmd/pmm-managed/main.go b/cmd/pmm-managed/main.go index eca5cd5d15..6d57235365 100644 --- a/cmd/pmm-managed/main.go +++ b/cmd/pmm-managed/main.go @@ -97,6 +97,8 @@ var ( agentRDSExporterConfigF = flag.String("agent-rds-exporter-config", "/etc/percona-rds-exporter.yml", "rds_exporter configuration file path") agentQANBaseF = flag.String("agent-qan-base", "/usr/local/percona/qan-agent", "qan-agent installation base path") + rdsEnableGovCloud = flag.Bool("rds-enable-gov-cloud", false, "Enable GOV cloud for RDS") + debugF = flag.Bool("debug", false, "Enable debug logging") ) @@ -173,6 +175,8 @@ func makeRDSService(ctx context.Context, deps *serviceDependencies) (*rds.Servic DB: deps.db, PortsRegistry: deps.portsRegistry, QAN: deps.qan, + + RDSEnableGovCloud: *rdsEnableGovCloud, } rdsService, err := rds.NewService(&rdsConfig) if err != nil { diff --git a/services/rds/rds.go b/services/rds/rds.go index 3ddcd89b6a..f97f57dc1f 100644 --- a/services/rds/rds.go +++ b/services/rds/rds.go @@ -72,6 +72,8 @@ type ServiceConfig struct { DB *reform.DB PortsRegistry *ports.Registry QAN *qan.Service + + RDSEnableGovCloud bool } // Service is responsible for interactions with AWS RDS. @@ -260,7 +262,10 @@ func (svc *Service) Discover(ctx context.Context, accessKey, secretKey string) ( var g errgroup.Group instances := make(chan Instance) - partitions := []endpoints.Partition{endpoints.AwsPartition(), endpoints.AwsUsGovPartition()} + partitions := []endpoints.Partition{endpoints.AwsPartition()} + if svc.RDSEnableGovCloud { + partitions = append(partitions, endpoints.AwsUsGovPartition()) + } for _, p := range partitions { for _, r := range p.Services()[endpoints.RdsServiceID].Regions() { region := r.ID()