github.com/cloudfoundry/postgres-release/src/acceptance-tests@v0.0.0-20240511030151-872bdd2e0dba/upgrade/upgrade_single_node_test.go (about)

     1  package upgrade_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/exec"
     7  
     8  	"github.com/cloudfoundry/postgres-release/src/acceptance-tests/testing/helpers"
     9  
    10  	. "github.com/onsi/ginkgo/v2"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  var _ = Describe("Upgrading postgres-release", func() {
    15  
    16  	var DB helpers.PGData
    17  	var pgprops helpers.Properties
    18  	var version int
    19  	var latestPostgreSQLVersion string
    20  	var pgHost string
    21  	var deploymentPrefix string
    22  	var deployHelper helpers.DeployHelper
    23  
    24  	BeforeEach(func() {
    25  		var err error
    26  		deployHelper, err = helpers.NewDeployHelper(configParams, "upgrade", helpers.DeployLatestVersion)
    27  		Expect(err).NotTo(HaveOccurred())
    28  	})
    29  
    30  	JustBeforeEach(func() {
    31  		var err error
    32  		deployHelper.SetDeploymentName(deploymentPrefix)
    33  		deployHelper.SetPGVersion(version)
    34  		latestPostgreSQLVersion = configParams.PostgreSQLVersion
    35  		if latestPostgreSQLVersion == "current" {
    36  			latestPostgreSQLVersion = versions.GetPostgreSQLVersion(versions.GetLatestVersion())
    37  		}
    38  		deployHelper.InitializeVariables()
    39  
    40  		By("Deploying a single postgres instance")
    41  		err = deployHelper.Deploy()
    42  		Expect(err).NotTo(HaveOccurred())
    43  		deployHelper.EnablePrintDiffs()
    44  
    45  		By("Initializing a postgres client connection")
    46  		pgprops, pgHost, err = deployHelper.GetPGPropsAndHost()
    47  		Expect(err).NotTo(HaveOccurred())
    48  		DB, err = deployHelper.ConnectToPostgres(pgHost, pgprops)
    49  		Expect(err).NotTo(HaveOccurred())
    50  		By("Populating the database")
    51  		err = DB.CreateAndPopulateTables(pgprops.Databases.Databases[0].Name, helpers.SmallLoad)
    52  		Expect(err).NotTo(HaveOccurred())
    53  	})
    54  
    55  	AssertUpgradeSuccessful := func() func() {
    56  		return func() {
    57  			var err error
    58  			By("Validating the database has been deployed as requested")
    59  			pgData, err := DB.GetData()
    60  			Expect(err).NotTo(HaveOccurred())
    61  			validator := helpers.NewValidator(pgprops, pgData, DB, versions.GetPostgreSQLVersion(version))
    62  			err = validator.ValidateAll()
    63  			Expect(err).NotTo(HaveOccurred())
    64  
    65  			By("Upgrading to the new release")
    66  			deployHelper.SetPGVersion(helpers.DeployLatestVersion)
    67  			err = deployHelper.Deploy()
    68  			Expect(err).NotTo(HaveOccurred())
    69  
    70  			By("Validating the database content is still valid after upgrade")
    71  			pgDataAfter, err := DB.GetData()
    72  			Expect(err).NotTo(HaveOccurred())
    73  
    74  			tablesEqual := validator.CompareTablesTo(pgDataAfter)
    75  			Expect(tablesEqual).To(BeTrue())
    76  
    77  			By("Validating the database has been upgraded as requested")
    78  			validator = helpers.NewValidator(pgprops, pgDataAfter, DB, latestPostgreSQLVersion)
    79  			err = validator.ValidateAll()
    80  			Expect(err).NotTo(HaveOccurred())
    81  
    82  			By("Validating the VM can still be restarted")
    83  			err = deployHelper.GetDeployment().Restart("postgres")
    84  			Expect(err).NotTo(HaveOccurred())
    85  
    86  			if deploymentPrefix == "upg-old-nocopy" {
    87  				By("Validating the postgres-previous is not created")
    88  				if !versions.IsMajor(latestPostgreSQLVersion, versions.GetOldVersion()) {
    89  					sshKeyFile, err := deployHelper.WriteSSHKey()
    90  					Expect(err).NotTo(HaveOccurred())
    91  					cmd := exec.Command("ssh", "-i", sshKeyFile, "-o", "BatchMode=yes", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", fmt.Sprintf("%s@%s", deployHelper.GetVariable("testuser_name"), pgHost), "sudo test -d /var/vcap/store/postgres/postgres-previous")
    92  
    93  					stdout, stderr, err := helpers.RunCommand(cmd)
    94  					Expect(err).To(HaveOccurred(), "stderr was: '%v', stdout was: '%v'", stderr, stdout)
    95  					err = os.Remove(sshKeyFile)
    96  					Expect(err).NotTo(HaveOccurred())
    97  				}
    98  			} else if deploymentPrefix == "upg-old" {
    99  				By("Validating the postgres-previous is created")
   100  				sshKeyFile, err := deployHelper.WriteSSHKey()
   101  				Expect(err).NotTo(HaveOccurred())
   102  				cmd := exec.Command("ssh", "-i", sshKeyFile, "-o", "BatchMode=yes", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", fmt.Sprintf("%s@%s", deployHelper.GetVariable("testuser_name"), pgHost), "sudo test -d /var/vcap/store/postgres/postgres-previous")
   103  
   104  				stdout, stderr, err := helpers.RunCommand(cmd)
   105  				Expect(err).NotTo(HaveOccurred(), "stderr was: '%v', stdout was: '%v'", stderr, stdout)
   106  
   107  				err = os.Remove(sshKeyFile)
   108  				Expect(err).NotTo(HaveOccurred())
   109  			}
   110  		}
   111  	}
   112  
   113  	Context("Upgrading from minor-no-copy version", func() {
   114  
   115  		BeforeEach(func() {
   116  			version = versions.GetOldVersion()
   117  			deploymentPrefix = "upg-old-nocopy"
   118  			deployHelper.SetOpDefs(helpers.Define_upgrade_no_copy_ops())
   119  		})
   120  
   121  		It("Successfully upgrades from old with no copy of the data directory", AssertUpgradeSuccessful())
   122  	})
   123  
   124  	Context("Upgrading from old version", func() {
   125  
   126  		BeforeEach(func() {
   127  			version = versions.GetOldVersion()
   128  			deploymentPrefix = "upg-old"
   129  		})
   130  
   131  		It("Successfully upgrades from old", AssertUpgradeSuccessful())
   132  	})
   133  
   134  	Context("Upgrading from master version", func() {
   135  
   136  		BeforeEach(func() {
   137  			version = versions.GetLatestVersion()
   138  			deploymentPrefix = "upg-master"
   139  		})
   140  
   141  		It("Successfully upgrades from master", AssertUpgradeSuccessful())
   142  	})
   143  
   144  	AfterEach(func() {
   145  		var err error
   146  		if DB.Data.SSLRootCert != "" {
   147  			err = os.Remove(DB.Data.SSLRootCert)
   148  			Expect(err).NotTo(HaveOccurred())
   149  		}
   150  		if DB.Data.CertUser.Certificate != "" {
   151  			err = os.Remove(DB.Data.CertUser.Certificate)
   152  			Expect(err).NotTo(HaveOccurred())
   153  		}
   154  		if DB.Data.CertUser.Key != "" {
   155  			err = os.Remove(DB.Data.CertUser.Key)
   156  			Expect(err).NotTo(HaveOccurred())
   157  		}
   158  		err = deployHelper.GetDeployment().DeleteDeployment()
   159  		Expect(err).NotTo(HaveOccurred())
   160  	})
   161  })