1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-07-17 01:42:36 +02:00

devops:schema - when no db credentails skip instead of error to ensure

when deploying to a fresh account, deploy runs first to create the
database.
This commit is contained in:
Lee Brown
2019-07-14 16:16:25 -08:00
parent e1b3377e88
commit 55a4664bde
3 changed files with 59 additions and 28 deletions

View File

@ -3,19 +3,20 @@ package cicd
import (
"encoding/json"
"fmt"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3"
"io/ioutil"
"net/url"
"path/filepath"
"sort"
"strconv"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/ec2metadata"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ecr"
"github.com/aws/aws-sdk-go/service/ecs"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/secretsmanager"
"github.com/pkg/errors"
"gopkg.in/go-playground/validator.v9"
@ -93,6 +94,31 @@ type DB struct {
DisableTLS bool
}
// URL returns the URL to connect to a database.
func (db DB) URL() string {
// Query parameters.
var q url.Values = make(map[string][]string)
// Handle SSL Mode
if db.DisableTLS {
q.Set("sslmode", "disable")
} else {
q.Set("sslmode", "require")
}
// Construct url.
dbUrl := url.URL{
Scheme: db.Driver,
User: url.UserPassword(db.User, db.Pass),
Host: db.Host,
Path: db.Database,
RawQuery: q.Encode(),
}
return dbUrl.String()
}
// GetAwsCredentials loads the AWS Access Keys from env variables unless a role is used.
func GetAwsCredentials(targetEnv string) (awsCredentials, error) {
var creds awsCredentials

View File

@ -3,7 +3,6 @@ package cicd
import (
"encoding/json"
"log"
"net/url"
"path/filepath"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/tests"
@ -166,6 +165,12 @@ func Migrate(log *log.Logger, req *migrateRequest) error {
if err != nil {
if aerr, ok := err.(awserr.Error); !ok || aerr.Code() != secretsmanager.ErrCodeResourceNotFoundException {
return errors.Wrapf(err, "Failed to get value for secret id %s", dbSecretId)
} else {
// This should only happen when the deploy script first runs and no resources exist in the
// AWS account. To create a database, need the VPC and need to come up with a better strategy for
// defining resources that can be shared between deployment steps.
log.Printf("\t%s\tDatabase credentials not found.", tests.Failed)
return nil
}
} else {
err = json.Unmarshal([]byte(*res.SecretString), &db)
@ -182,34 +187,12 @@ func Migrate(log *log.Logger, req *migrateRequest) error {
{
log.Println("Proceed with schema migration")
var dbUrl url.URL
{
// Query parameters.
var q url.Values = make(map[string][]string)
// Handle SSL Mode
if db.DisableTLS {
q.Set("sslmode", "disable")
} else {
q.Set("sslmode", "require")
}
// Construct url.
dbUrl = url.URL{
Scheme: db.Driver,
User: url.UserPassword(db.User, db.Pass),
Host: db.Host,
Path: db.Database,
RawQuery: q.Encode(),
}
}
log.Printf("\t\tOpen database connection")
// Register informs the sqlxtrace package of the driver that we will be using in our program.
// It uses a default service name, in the below case "postgres.db". To use a custom service
// name use RegisterWithServiceName.
sqltrace.Register(db.Driver, &pq.Driver{}, sqltrace.WithServiceName("devops:migrate"))
masterDb, err := sqlxtrace.Open(db.Driver, dbUrl.String())
masterDb, err := sqlxtrace.Open(db.Driver, db.URL())
if err != nil {
return errors.WithStack(err)
}

View File

@ -18,6 +18,7 @@ import (
"time"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/tests"
"geeks-accelerator/oss/saas-starter-kit/internal/schema"
"geeks-accelerator/oss/saas-starter-kit/tools/devops/internal/retry"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
@ -36,9 +37,12 @@ import (
"github.com/aws/aws-sdk-go/service/servicediscovery"
"github.com/bobesa/go-domain-util/domainutil"
"github.com/iancoleman/strcase"
"github.com/lib/pq"
"github.com/pborman/uuid"
"github.com/pkg/errors"
"github.com/urfave/cli"
sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql"
sqlxtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/jmoiron/sqlx"
"gopkg.in/go-playground/validator.v9"
)
@ -1317,8 +1321,26 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
if err != nil {
return errors.Wrap(err, "Failed to update secret with db credentials")
}
log.Printf("\t\tUpdate Secret\n")
// Ensure the newly created database is seeded.
log.Printf("\t\tOpen database connection")
// Register informs the sqlxtrace package of the driver that we will be using in our program.
// It uses a default service name, in the below case "postgres.db". To use a custom service
// name use RegisterWithServiceName.
sqltrace.Register(db.Driver, &pq.Driver{}, sqltrace.WithServiceName("devops:migrate"))
masterDb, err := sqlxtrace.Open(db.Driver, db.URL())
if err != nil {
return errors.WithStack(err)
}
defer masterDb.Close()
// Start the database migrations.
log.Printf("\t\tStart migrations.")
if err = schema.Migrate(masterDb, log); err != nil {
return errors.WithStack(err)
}
log.Printf("\t\tFinished migrations.")
}
log.Printf("\t%s\tUsing DB Instance '%s'.\n", tests.Success, *dbInstance.DBInstanceIdentifier)
@ -3099,7 +3121,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// If tags aren't enabled for the account, try the request again without them.
// https://aws.amazon.com/blogs/compute/migrating-your-amazon-ecs-deployment-to-the-new-arn-and-resource-id-format-2/
if err != nil && strings.Contains(err.Error(), "New ARN and resource ID format must be enabled") {
if err != nil && strings.Contains(err.Error(), "ARN and resource ID format must be enabled") {
serviceInput.Tags = nil
createRes, err = svc.CreateService(serviceInput)
}