github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/package_stemcell/packagers/vcenter_packager.go (about) 1 package packagers 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path" 9 "path/filepath" 10 "regexp" 11 12 "github.com/cloudfoundry-incubator/stembuild/filesystem" 13 14 "github.com/cloudfoundry-incubator/stembuild/package_stemcell/config" 15 ) 16 17 //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . IaasClient 18 type IaasClient interface { 19 ValidateUrl() error 20 ValidateCredentials() error 21 FindVM(vmInventoryPath string) error 22 ExportVM(vmInventoryPath string, destination string) error 23 ListDevices(vmInventoryPath string) ([]string, error) 24 RemoveDevice(vmInventoryPath string, deviceName string) error 25 EjectCDRom(vmInventoryPath string, deviceName string) error 26 } 27 28 type VCenterPackager struct { 29 SourceConfig config.SourceConfig 30 OutputConfig config.OutputConfig 31 Client IaasClient 32 } 33 34 func (v VCenterPackager) Package() error { 35 err := v.executeOnMatchingDevice(v.Client.RemoveDevice, "^(floppy-|ethernet-)") 36 if err != nil { 37 return err 38 } 39 err = v.executeOnMatchingDevice(v.Client.EjectCDRom, "^(cdrom-)") 40 if err != nil { 41 return err 42 } 43 44 workingDir, err := ioutil.TempDir(os.TempDir(), "vcenter-packager-working-directory") 45 46 if err != nil { 47 return errors.New("failed to create working directory") 48 } 49 50 stemcellDir, err := ioutil.TempDir(os.TempDir(), "vcenter-packager-stemcell-directory") 51 if err != nil { 52 return errors.New("failed to create stemcell directory") 53 } 54 err = v.Client.ExportVM(v.SourceConfig.VmInventoryPath, workingDir) 55 56 if err != nil { 57 return errors.New("failed to export the prepared VM") 58 } 59 60 fmt.Println("Converting VMDK into stemcell") 61 vmName := path.Base(v.SourceConfig.VmInventoryPath) 62 shaSum, err := TarGenerator(filepath.Join(stemcellDir, "image"), filepath.Join(workingDir, vmName)) 63 manifestContents := CreateManifest(v.OutputConfig.Os, v.OutputConfig.StemcellVersion, shaSum) 64 err = WriteManifest(manifestContents, stemcellDir) 65 66 if err != nil { 67 return errors.New("failed to create stemcell.MF file") 68 } 69 70 stemcellFilename := StemcellFilename(v.OutputConfig.StemcellVersion, v.OutputConfig.Os) 71 _, err = TarGenerator(filepath.Join(v.OutputConfig.OutputDir, stemcellFilename), stemcellDir) 72 73 fmt.Printf("Stemcell successfully created: %s\n", stemcellFilename) 74 return nil 75 } 76 77 func (v VCenterPackager) executeOnMatchingDevice(action func(a, b string) error, devicePattern string) error { 78 deviceList, err := v.Client.ListDevices(v.SourceConfig.VmInventoryPath) 79 if err != nil { 80 return err 81 } 82 83 for _, deviceName := range deviceList { 84 matched, _ := regexp.MatchString(devicePattern, deviceName) 85 if matched { 86 err = action(v.SourceConfig.VmInventoryPath, deviceName) 87 if err != nil { 88 return err 89 } 90 } 91 } 92 return nil 93 } 94 95 func (v VCenterPackager) ValidateFreeSpaceForPackage(fs filesystem.FileSystem) error { 96 return nil 97 } 98 99 func (v VCenterPackager) ValidateSourceParameters() error { 100 err := v.Client.ValidateUrl() 101 if err != nil { 102 return err 103 } 104 105 err = v.Client.ValidateCredentials() 106 if err != nil { 107 return err 108 } 109 err = v.Client.FindVM(v.SourceConfig.VmInventoryPath) 110 if err != nil { 111 return err 112 } 113 return nil 114 }