This is an automated email from the ASF dual-hosted git repository.

rawlin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 9fa6c29  Skip check for the past dbversion's migration existing if it 
is squashed (#6128)
9fa6c29 is described below

commit 9fa6c299271ef06075eec711ff1ff6805093f92b
Author: Zach Hoffman <[email protected]>
AuthorDate: Mon Aug 23 16:54:37 2021 -0600

    Skip check for the past dbversion's migration existing if it is squashed 
(#6128)
    
    * Make ConnectionString a global
    
    * Get the migration version after migrating from Goose
    
    * Skip check for the past dbversion's migration existing if it is squashed
    
    * Install TO dependencies before installing TO in db-admin dockerfile
    
    * TO DB tests bugfix: Specify the database name with `dropdb`
    
    * Only fail on a non-latest migration being modified/added if that 
migration was changed in the PR or commit the TO DB tests GHA is running on
---
 .github/actions/todb-tests/entrypoint.sh       | 11 ++++-
 traffic_ops/app/db/admin.go                    | 59 ++++++++++++++++++++------
 traffic_ops_db/test/docker/Dockerfile-db-admin | 38 ++++++++++++-----
 traffic_ops_db/test/docker/run-db-test.sh      |  2 +-
 4 files changed, 84 insertions(+), 26 deletions(-)

diff --git a/.github/actions/todb-tests/entrypoint.sh 
b/.github/actions/todb-tests/entrypoint.sh
index 793c2c0..80702eb 100755
--- a/.github/actions/todb-tests/entrypoint.sh
+++ b/.github/actions/todb-tests/entrypoint.sh
@@ -18,6 +18,15 @@
 
 set -e
 
+files_changed_in_pr() {
+       if [[ "$GITHUB_REF" == refs/pull/*/merge ]]; then
+               pr_number="$(<<<"$GITHUB_REF" grep -o '[0-9]\+')"
+               files_changed="$(curl 
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/pulls/${pr_number}/files" | jq -r 
.[].filename)"
+       else
+               files_changed="$(git diff-tree --no-commit-id --name-only -r 
"$GITHUB_SHA")"
+       fi
+}
+
 CODE=0;
 
 migration_dirs=(traffic_ops/app/db/migrations 
traffic_ops/app/db/trafficvault/migrations);
@@ -69,7 +78,7 @@ for migration_dir in ${migration_dirs[@]}; do
        done
        mtime_length=${#mtime_array[@]}
 
-       if [[ $LATEST_FILE_TIME != ${mtime_array[$mtime_length-1]} ]]; then
+       if [[ $LATEST_FILE_TIME != ${mtime_array[$mtime_length-1]} ]] && 
<<<"$(files_changed_in_pr)" grep -q "^${LATEST_FILE}$"; then
                echo "ERROR: latest added/modified file: $LATEST_FILE is not in 
the right order" >&2;
                CODE=1;
        fi
diff --git a/traffic_ops/app/db/admin.go b/traffic_ops/app/db/admin.go
index ce2a883..7f62287 100644
--- a/traffic_ops/app/db/admin.go
+++ b/traffic_ops/app/db/admin.go
@@ -34,7 +34,9 @@ import (
        "github.com/apache/trafficcontrol/lib/go-log"
 
        "github.com/golang-migrate/migrate/v4"
+       "github.com/golang-migrate/migrate/v4/database"
        _ "github.com/golang-migrate/migrate/v4/database/postgres"
+       "github.com/golang-migrate/migrate/v4/source"
        _ "github.com/golang-migrate/migrate/v4/source/file"
        "gopkg.in/yaml.v2"
 )
@@ -129,16 +131,17 @@ var (
        DBVersionDirty bool
 
        // globals that are parsed out of DBConfigFile and used in commands
-       DBDriver      string
-       DBName        string
-       DBSuperUser   = DefaultDBSuperUser
-       DBUser        string
-       DBPassword    string
-       HostIP        string
-       HostPort      string
-       SSLMode       string
-       Migrate       *migrate.Migrate
-       MigrationName string
+       ConnectionString string
+       DBDriver         string
+       DBName           string
+       DBSuperUser      = DefaultDBSuperUser
+       DBUser           string
+       DBPassword       string
+       HostIP           string
+       HostPort         string
+       SSLMode          string
+       Migrate          *migrate.Migrate
+       MigrationName    string
 )
 
 func parseDBConfig() error {
@@ -330,13 +333,41 @@ func maybeMigrateFromGoose() bool {
        if err := Migrate.Steps(1); err != nil {
                die("Error migrating to Migrate from Goose: " + err.Error())
        }
+       DBVersion, DBVersionDirty, _ = Migrate.Version()
        return true
 }
 
+// runFirstMigration is essentially Migrate.Migrate(FirstMigrationTimestamp) 
but without the obligatory Migrate.versionExists() call.
+// If calling Migrate.versionExists() is made optional, runFirstMigration() 
can be replaced.
+func runFirstMigration() error {
+       sourceDriver, sourceDriverErr := source.Open(DBMigrationsSource)
+       if sourceDriverErr != nil {
+               return fmt.Errorf("opening the migration source driver: " + 
sourceDriverErr.Error())
+       }
+       dbDriver, dbDriverErr := database.Open(ConnectionString)
+       if dbDriverErr != nil {
+               return fmt.Errorf("opening the dbdriver: " + 
dbDriverErr.Error())
+       }
+       firstMigration, firstMigrationName, migrationReadErr := 
sourceDriver.ReadUp(FirstMigrationTimestamp)
+       if migrationReadErr != nil {
+               return fmt.Errorf("reading migration %s: %s", 
firstMigrationName, migrationReadErr.Error())
+       }
+       if setDirtyVersionErr := 
dbDriver.SetVersion(int(FirstMigrationTimestamp), true); setDirtyVersionErr != 
nil {
+               return fmt.Errorf("setting the dirty version: %s", 
setDirtyVersionErr.Error())
+       }
+       if migrateErr := dbDriver.Run(firstMigration); migrateErr != nil {
+               return fmt.Errorf("running the migration: %s", 
migrateErr.Error())
+       }
+       if setVersionErr := dbDriver.SetVersion(int(FirstMigrationTimestamp), 
false); setVersionErr != nil {
+               return fmt.Errorf("setting the version after successfully 
running the migration: %s", setVersionErr.Error())
+       }
+       return nil
+}
+
 func runMigrations() {
        migratedFromGoose := initMigrate()
        if !TrafficVault && DBVersion == LastSquashedMigrationTimestamp && 
!DBVersionDirty {
-               if migrateErr := Migrate.Migrate(FirstMigrationTimestamp); 
migrateErr != nil {
+               if migrateErr := runFirstMigration(); migrateErr != nil {
                        die(fmt.Sprintf("Error migrating from DB version %d to 
%d: %s", LastSquashedMigrationTimestamp, FirstMigrationTimestamp, 
migrateErr.Error()))
                }
        }
@@ -569,11 +600,11 @@ func main() {
 
 func initMigrate() bool {
        var err error
-       connectionString := fmt.Sprintf("%s://%s:%s@%s:%s/%s?sslmode=%s", 
DBDriver, DBUser, DBPassword, HostIP, HostPort, DBName, SSLMode)
+       ConnectionString = fmt.Sprintf("%s://%s:%s@%s:%s/%s?sslmode=%s", 
DBDriver, DBUser, DBPassword, HostIP, HostPort, DBName, SSLMode)
        if TrafficVault {
-               Migrate, err = migrate.New(TrafficVaultMigrationsSource, 
connectionString)
+               Migrate, err = migrate.New(TrafficVaultMigrationsSource, 
ConnectionString)
        } else {
-               Migrate, err = migrate.New(DBMigrationsSource, connectionString)
+               Migrate, err = migrate.New(DBMigrationsSource, ConnectionString)
        }
        if err != nil {
                die("Starting Migrate: " + err.Error())
diff --git a/traffic_ops_db/test/docker/Dockerfile-db-admin 
b/traffic_ops_db/test/docker/Dockerfile-db-admin
index 6f60481..03745c9 100644
--- a/traffic_ops_db/test/docker/Dockerfile-db-admin
+++ b/traffic_ops_db/test/docker/Dockerfile-db-admin
@@ -23,25 +23,43 @@ FROM centos:7
 ARG POSTGRES_VERSION=13.2
 ENV POSTGRES_VERSION=$POSTGRES_VERSION
 
-# NOTE: temporary workaround for removal of golang packages from CentOS 7 base 
repo
 RUN yum install -y \
-    epel-release \
-    centos-release-scl-rh \
-    
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
 \
+               epel-release \
+               centos-release-scl-rh \
+               
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
 \
     git && \
-    yum -y install golang
+    yum -y install           \
+        cpanminus            \
+        expat-devel          \
+        libcap               \
+        libcurl-devel        \
+        libidn-devel         \
+        libpcap-devel        \
+        mkisofs              \
+        openssl-devel        \
+        perl-core            \
+        perl-Crypt-ScryptKDF \
+        perl-DBD-Pg          \
+        perl-DBI             \
+        perl-Digest-SHA1     \
+        perl-JSON            \
+        perl-libwww-perl     \
+        perl-TermReadKey     \
+        perl-Test-CPAN-Meta  \
+        perl-WWW-Curl        \
+        postgresql13         \
+        postgresql13-devel &&\
+    yum clean all
 
 # Override TRAFFIC_OPS_RPM arg to use a different one using --build-arg 
TRAFFIC_OPS_RPM=...  Can be local file or http://...
 ARG TRAFFIC_OPS_RPM=traffic_ops.rpm
 ADD $TRAFFIC_OPS_RPM /
-RUN yum install -y \
-        /$(basename $TRAFFIC_OPS_RPM) && \
-        rm /$(basename $TRAFFIC_OPS_RPM) && \
-    yum clean all
+RUN rpm -Uvh $(basename $TRAFFIC_OPS_RPM) && \
+    rm $(basename $TRAFFIC_OPS_RPM)
 
 WORKDIR /opt/traffic_ops/app
 
-ADD run-db-test.sh \
+COPY run-db-test.sh \
     db-config.sh \
     /
 
diff --git a/traffic_ops_db/test/docker/run-db-test.sh 
b/traffic_ops_db/test/docker/run-db-test.sh
index ff476d6..3bbcb59 100755
--- a/traffic_ops_db/test/docker/run-db-test.sh
+++ b/traffic_ops_db/test/docker/run-db-test.sh
@@ -132,7 +132,7 @@ fi
 # test full restoration of the initial DB dump
 for d in $(get_db_dumps); do
     echo "testing restoration of DB dump: $d"
-    dropdb --echo --if-exists < "$d" > /dev/null || echo "Dropping DB 
${DB_NAME} failed: $d"
+    dropdb --echo --if-exists "$DB_NAME" < "$d" > /dev/null || echo "Dropping 
DB ${DB_NAME} failed: $d"
     createdb --echo < "$d" > /dev/null || echo "Creating DB ${DB_NAME} failed: 
$d"
     pg_restore --verbose --clean --if-exists --exit-on-error -d "$DB_NAME" < 
"$d" > /dev/null || { echo "DB restoration failed: $d"; exit 1; }
 done

Reply via email to