github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/iaas_cli/iaas_clients/vcenter_govmomi_contract_test.go (about) 1 package iaas_clients 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "github.com/cloudfoundry-incubator/stembuild/iaas_cli/iaas_clients/guest_manager" 9 10 "io/ioutil" 11 "os" 12 "path/filepath" 13 14 vcenter_client_factory "github.com/cloudfoundry-incubator/stembuild/iaas_cli/iaas_clients/factory" 15 16 . "github.com/onsi/ginkgo" 17 . "github.com/onsi/gomega" 18 "github.com/onsi/gomega/gbytes" 19 ) 20 21 func envMustExist(variableName string) string { 22 result := os.Getenv(variableName) 23 if result == "" { 24 Fail(fmt.Sprintf("%s must be set", variableName)) 25 } 26 27 return result 28 } 29 30 var _ = Describe("VcenterClient", func() { 31 Describe("StartProgram", func() { 32 33 var ( 34 managerFactory *vcenter_client_factory.ManagerFactory 35 factoryConfig *vcenter_client_factory.FactoryConfig 36 ) 37 38 BeforeEach(func() { 39 40 factoryConfig = &vcenter_client_factory.FactoryConfig{ 41 VCenterServer: envMustExist(VcenterUrl), 42 Username: envMustExist(VcenterUsername), 43 Password: envMustExist(VcenterPassword), 44 ClientCreator: &vcenter_client_factory.ClientCreator{}, 45 FinderCreator: &vcenter_client_factory.GovmomiFinderCreator{}, 46 } 47 48 managerFactory = &vcenter_client_factory.ManagerFactory{} 49 }) 50 51 ExpectProgramToStartAndExitSuccessfully := func() { 52 53 ctx := context.TODO() 54 55 vCenterManager, err := managerFactory.VCenterManager(ctx) 56 Expect(err).ToNot(HaveOccurred()) 57 58 err = vCenterManager.Login(ctx) 59 Expect(err).ToNot(HaveOccurred()) 60 61 vm, err := vCenterManager.FindVM(ctx, TestVmPath) 62 Expect(err).ToNot(HaveOccurred()) 63 64 opsManager := vCenterManager.OperationsManager(ctx, vm) 65 guestManager, err := vCenterManager.GuestManager(ctx, opsManager, envMustExist(TestVmUsername), envMustExist(TestVmPassword)) 66 Expect(err).ToNot(HaveOccurred()) 67 68 time.Sleep(10 * time.Second) 69 70 powershell := "C:\\Windows\\System32\\WindowsPowerShell\\V1.0\\powershell.exe" 71 pid, err := guestManager.StartProgramInGuest(ctx, powershell, "Exit 59") 72 Expect(err).ToNot(HaveOccurred()) 73 74 exitCode, err := guestManager.ExitCodeForProgramInGuest(ctx, pid) 75 Expect(err).ToNot(HaveOccurred()) 76 Expect(exitCode).To(Equal(int32(59))) 77 } 78 79 Context("Use root cert implicitly", func() { 80 It("Starts a program and returns its exit code", func() { 81 factoryConfig.RootCACertPath = "" 82 managerFactory.SetConfig(*factoryConfig) 83 ExpectProgramToStartAndExitSuccessfully() 84 }) 85 }) 86 87 Context("A factory is given a proper CA cert", func() { 88 It("Starts a program and returns its exit code", func() { 89 cert := os.Getenv(VcenterCACert) 90 if cert == "" { 91 Skip(fmt.Sprintf("export VCENTER_CA_CERT=<a valid ca cert> to run this test")) 92 } 93 94 tmpDir, err := ioutil.TempDir("", "vcenter-client-contract-tests") 95 defer os.RemoveAll(tmpDir) 96 Expect(err).ToNot(HaveOccurred()) 97 f, err := ioutil.TempFile(tmpDir, "valid-cert") 98 Expect(err).ToNot(HaveOccurred()) 99 100 _, err = f.WriteString(cert) 101 Expect(err).ToNot(HaveOccurred()) 102 103 err = f.Close() 104 Expect(err).ToNot(HaveOccurred()) 105 106 factoryConfig.RootCACertPath = f.Name() 107 managerFactory.SetConfig(*factoryConfig) 108 109 ExpectProgramToStartAndExitSuccessfully() 110 }) 111 }) 112 113 Context("A factory is given an improper CA cert", func() { 114 It("fails to create a vcenter manager", func() { 115 workingDir, err := os.Getwd() 116 Expect(err).NotTo(HaveOccurred()) 117 fakeCertPath := filepath.Join(workingDir, "fixtures", "fakecert") 118 119 factoryConfig.RootCACertPath = fakeCertPath 120 managerFactory.SetConfig(*factoryConfig) 121 122 ctx := context.TODO() 123 _, err = managerFactory.VCenterManager(ctx) 124 Expect(err).To(HaveOccurred()) 125 Expect(err.Error()).To(ContainSubstring("cannot be used as a trusted CA certificate")) 126 }) 127 }) 128 }) 129 130 Describe("DownloadFileFromGuest", func() { 131 var ( 132 managerFactory *vcenter_client_factory.ManagerFactory 133 factoryConfig *vcenter_client_factory.FactoryConfig 134 fileToDownload string 135 expectedContents string 136 guestManager *guest_manager.GuestManager 137 ) 138 139 BeforeEach(func() { 140 factoryConfig = &vcenter_client_factory.FactoryConfig{ 141 VCenterServer: envMustExist(VcenterUrl), 142 Username: envMustExist(VcenterUsername), 143 Password: envMustExist(VcenterPassword), 144 ClientCreator: &vcenter_client_factory.ClientCreator{}, 145 FinderCreator: &vcenter_client_factory.GovmomiFinderCreator{}, 146 } 147 managerFactory = &vcenter_client_factory.ManagerFactory{} 148 factoryConfig.RootCACertPath = "" 149 managerFactory.SetConfig(*factoryConfig) 150 151 fileToDownload = "C:\\Windows\\dummy.txt" 152 expectedContents = "infinite content" 153 154 ctx := context.TODO() 155 vCenterManager, err := managerFactory.VCenterManager(ctx) 156 Expect(err).ToNot(HaveOccurred()) 157 158 err = vCenterManager.Login(ctx) 159 Expect(err).ToNot(HaveOccurred()) 160 161 vm, err := vCenterManager.FindVM(ctx, TestVmPath) 162 Expect(err).ToNot(HaveOccurred()) 163 164 opsManager := vCenterManager.OperationsManager(ctx, vm) 165 guestManager, err = vCenterManager.GuestManager(ctx, opsManager, envMustExist(TestVmUsername), envMustExist(TestVmPassword)) 166 Expect(err).ToNot(HaveOccurred()) 167 168 time.Sleep(10 * time.Second) 169 }) 170 171 Context("specified file exists", func() { 172 BeforeEach(func() { 173 ctx := context.TODO() 174 175 powershell := "C:\\Windows\\System32\\WindowsPowerShell\\V1.0\\powershell.exe" 176 pid, err := guestManager.StartProgramInGuest(ctx, powershell, fmt.Sprintf("'%s' | Set-Content %s", expectedContents, fileToDownload)) 177 Expect(err).ToNot(HaveOccurred()) 178 179 exitCode, err := guestManager.ExitCodeForProgramInGuest(ctx, pid) 180 Expect(err).ToNot(HaveOccurred()) 181 Expect(exitCode).To(Equal(int32(0))) 182 }) 183 184 It("downloads the file", func() { 185 ctx := context.TODO() 186 fileContents, _, err := guestManager.DownloadFileInGuest(ctx, fileToDownload) 187 Expect(err).NotTo(HaveOccurred()) 188 189 Eventually(gbytes.BufferReader(fileContents)).Should(gbytes.Say(expectedContents)) 190 191 }) 192 193 AfterEach(func() { 194 ctx := context.TODO() 195 196 powershell := "C:\\Windows\\System32\\WindowsPowerShell\\V1.0\\powershell.exe" 197 pid, err := guestManager.StartProgramInGuest(ctx, powershell, fmt.Sprintf("rm %s", fileToDownload)) 198 Expect(err).ToNot(HaveOccurred()) 199 200 exitCode, err := guestManager.ExitCodeForProgramInGuest(ctx, pid) 201 Expect(err).ToNot(HaveOccurred()) 202 Expect(exitCode).To(Equal(int32(0))) 203 }) 204 }) 205 206 Context("specified file does not exist", func() { 207 It("returns an error", func() { 208 ctx := context.TODO() 209 _, _, err := guestManager.DownloadFileInGuest(ctx, fileToDownload) 210 Expect(err.Error()).To(ContainSubstring("vcenter_client - unable to download file")) 211 }) 212 }) 213 }) 214 })