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

     1  package helpers_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  
     9  	"github.com/cloudfoundry/postgres-release/src/acceptance-tests/testing/helpers"
    10  
    11  	. "github.com/onsi/ginkgo/v2"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  func writeConfigFile(data string) (string, error) {
    16  	tempFile, err := ioutil.TempFile("", "config")
    17  	if err != nil {
    18  		return "", err
    19  	}
    20  
    21  	err = ioutil.WriteFile(tempFile.Name(), []byte(data), os.ModePerm)
    22  	if err != nil {
    23  		return "", err
    24  	}
    25  
    26  	return tempFile.Name(), nil
    27  }
    28  
    29  var _ = Describe("Configuration", func() {
    30  	Describe("Load configuration", func() {
    31  		Context("With a valid config file", func() {
    32  			var configFilePath string
    33  
    34  			AfterEach(func() {
    35  				err := os.Remove(configFilePath)
    36  				Expect(err).NotTo(HaveOccurred())
    37  			})
    38  
    39  			Context("With uaa authentication", func() {
    40  
    41  				It("Load the yaml content from the provided path without defaults", func() {
    42  					var err error
    43  					var data = `
    44  postgres_release_version: "some-version"
    45  postgresql_version: "some-version"
    46  versions_file: "some-path"
    47  bosh:
    48    target: some-target
    49    use_uaa: true
    50    credentials:
    51      client: some-username-uaa
    52      client_secret: some-password-uaa
    53      ca_cert: some-ca-cert-uaa
    54  cloud_configs:
    55    default_azs: ["some-az1", "some-az2"]
    56    default_networks:
    57    - name: some-net1
    58    - name: some-net2
    59      static_ips:
    60      - some-ip1
    61      - some-ip2
    62      default: [some-default1, some-default2]
    63    default_persistent_disk_type: some-type
    64    default_vm_type: some-vm-type
    65    default_stemcell_os: some-os
    66    default_stemcell_version: some-version
    67  `
    68  					configFilePath, err = writeConfigFile(data)
    69  					Expect(err).NotTo(HaveOccurred())
    70  					config, err := helpers.LoadConfig(configFilePath)
    71  					Expect(err).NotTo(HaveOccurred())
    72  					Expect(config).To(Equal(helpers.PgatsConfig{
    73  						PGReleaseVersion:  "some-version",
    74  						PostgreSQLVersion: "some-version",
    75  						VersionsFile:      "some-path",
    76  						Bosh: helpers.BOSHConfig{
    77  							Target: "some-target",
    78  							UseUaa: true,
    79  							Credentials: helpers.BOSHCredentials{
    80  								Client:       "some-username-uaa",
    81  								ClientSecret: "some-password-uaa",
    82  								CACert:       "some-ca-cert-uaa",
    83  							},
    84  						},
    85  						BoshCC: helpers.BOSHCloudConfig{
    86  							AZs: []string{"some-az1", "some-az2"},
    87  							Networks: []helpers.BOSHJobNetwork{
    88  								helpers.BOSHJobNetwork{
    89  									Name: "some-net1",
    90  								},
    91  								helpers.BOSHJobNetwork{
    92  									Name:      "some-net2",
    93  									StaticIPs: []string{"some-ip1", "some-ip2"},
    94  									Default:   []string{"some-default1", "some-default2"},
    95  								},
    96  							},
    97  							PersistentDiskType: "some-type",
    98  							VmType:             "some-vm-type",
    99  							StemcellOs:         "some-os",
   100  							StemcellVersion:    "some-version",
   101  						},
   102  					}))
   103  				})
   104  
   105  			})
   106  
   107  			Context("Without uaa authentication", func() {
   108  
   109  				It("Load the yaml content from the provided path without defaults", func() {
   110  					var err error
   111  					var data = `
   112  postgres_release_version: "some-version"
   113  postgresql_version: "some-version"
   114  versions_file: "some-path"
   115  bosh:
   116    target: some-target
   117    credentials:
   118      client: some-username
   119      client_secret: some-password
   120      ca_cert: some-ca-cert
   121  cloud_configs:
   122    default_azs: ["some-az1", "some-az2"]
   123    default_networks:
   124    - name: some-net1
   125    - name: some-net2
   126      static_ips:
   127      - some-ip1
   128      - some-ip2
   129      default: [some-default1, some-default2]
   130    default_persistent_disk_type: some-type
   131    default_vm_type: some-vm-type
   132    default_stemcell_os: some-os
   133    default_stemcell_version: some-version
   134  `
   135  					configFilePath, err = writeConfigFile(data)
   136  					Expect(err).NotTo(HaveOccurred())
   137  					config, err := helpers.LoadConfig(configFilePath)
   138  					Expect(err).NotTo(HaveOccurred())
   139  					Expect(config).To(Equal(helpers.PgatsConfig{
   140  						PGReleaseVersion:  "some-version",
   141  						PostgreSQLVersion: "some-version",
   142  						VersionsFile:      "some-path",
   143  						Bosh: helpers.BOSHConfig{
   144  							Target: "some-target",
   145  							Credentials: helpers.BOSHCredentials{
   146  								Client:       "some-username",
   147  								ClientSecret: "some-password",
   148  								CACert:       "some-ca-cert",
   149  							},
   150  							UseUaa: false,
   151  						},
   152  						BoshCC: helpers.BOSHCloudConfig{
   153  							AZs: []string{"some-az1", "some-az2"},
   154  							Networks: []helpers.BOSHJobNetwork{
   155  								helpers.BOSHJobNetwork{
   156  									Name: "some-net1",
   157  								},
   158  								helpers.BOSHJobNetwork{
   159  									Name:      "some-net2",
   160  									StaticIPs: []string{"some-ip1", "some-ip2"},
   161  									Default:   []string{"some-default1", "some-default2"},
   162  								},
   163  							},
   164  							PersistentDiskType: "some-type",
   165  							VmType:             "some-vm-type",
   166  							StemcellOs:         "some-os",
   167  							StemcellVersion:    "some-version",
   168  						},
   169  					}))
   170  				})
   171  
   172  				It("Load the yaml content from the provided path with defaults", func() {
   173  					var err error
   174  					var data = `
   175  bosh:
   176    credentials:
   177      ca_cert: some-ca-cert
   178  `
   179  					configFilePath, err = writeConfigFile(data)
   180  					Expect(err).NotTo(HaveOccurred())
   181  					config, err := helpers.LoadConfig(configFilePath)
   182  					Expect(err).NotTo(HaveOccurred())
   183  					result := helpers.DefaultPgatsConfig
   184  					result.Bosh.Credentials.CACert = "some-ca-cert"
   185  					Expect(config).To(Equal(result))
   186  				})
   187  			})
   188  		})
   189  
   190  		Context("With an invalid config yaml location", func() {
   191  			It("Should return an error that the file does not exist", func() {
   192  				_, err := helpers.LoadConfig("notExistentPath")
   193  				Expect(err).To(MatchError(ContainSubstring("no such file or directory")))
   194  			})
   195  		})
   196  
   197  		Context("With an incorrect config yaml content", func() {
   198  			var configFilePath string
   199  
   200  			AfterEach(func() {
   201  				err := os.Remove(configFilePath)
   202  				Expect(err).NotTo(HaveOccurred())
   203  			})
   204  
   205  			It("Should return an error if not a valid yaml", func() {
   206  				var err error
   207  				configFilePath, err = writeConfigFile("%%%")
   208  				Expect(err).NotTo(HaveOccurred())
   209  
   210  				_, err = helpers.LoadConfig(configFilePath)
   211  				Expect(err).To(MatchError(ContainSubstring("yaml: could not find expected directive name")))
   212  			})
   213  
   214  			It("Should return an error if BOSH CA Cert missing", func() {
   215  				var err error
   216  				configFilePath, err = writeConfigFile("---")
   217  				Expect(err).NotTo(HaveOccurred())
   218  
   219  				_, err = helpers.LoadConfig(configFilePath)
   220  				Expect(err).To(MatchError(errors.New(helpers.MissingCertificateMsg)))
   221  			})
   222  		})
   223  	})
   224  
   225  	Describe("ConfigPath", func() {
   226  		var configPath string
   227  
   228  		BeforeEach(func() {
   229  			configPath = os.Getenv("PGATS_CONFIG")
   230  		})
   231  
   232  		AfterEach(func() {
   233  			os.Setenv("PGATS_CONFIG", configPath)
   234  		})
   235  
   236  		Context("when a valid path is set", func() {
   237  			It("returns the path", func() {
   238  				os.Setenv("PGATS_CONFIG", "/tmp/some-config.json")
   239  				path, err := helpers.ConfigPath()
   240  				Expect(err).NotTo(HaveOccurred())
   241  				Expect(path).To(Equal("/tmp/some-config.json"))
   242  			})
   243  		})
   244  
   245  		Context("when path is not set", func() {
   246  			It("returns an error", func() {
   247  				os.Setenv("PGATS_CONFIG", "")
   248  				_, err := helpers.ConfigPath()
   249  				Expect(err).To(MatchError(fmt.Errorf(helpers.IncorrectEnvMsg, "")))
   250  			})
   251  		})
   252  
   253  		Context("when the path is not absolute", func() {
   254  			It("returns an error", func() {
   255  				os.Setenv("PGATS_CONFIG", "some/path.json")
   256  				_, err := helpers.ConfigPath()
   257  				Expect(err).To(MatchError(fmt.Errorf(helpers.IncorrectEnvMsg, "some/path.json")))
   258  			})
   259  		})
   260  	})
   261  })