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  })