Skip to content

Commit c90ef9d

Browse files
committed
stembuild: use vcsim as library
instead of building from source, this should allow testing on windows
1 parent da4f3e1 commit c90ef9d

File tree

122 files changed

+100705
-95
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+100705
-95
lines changed

ci/pipelines/stemcells-windows.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,6 @@ resources:
165165
type: git
166166
source:
167167
uri: https://github.com/cloudfoundry/windows-utilities-release.git
168-
- name: govmomi
169-
type: git
170-
source:
171-
uri: https://github.com/vmware/govmomi.git
172168

173169
# type: docker-image
174170
- name: bosh-windows-stemcell-builder-ci-docker-image
@@ -931,7 +927,6 @@ jobs:
931927
- get: blobstore-gcs-cli
932928
- get: windows-bsdtar
933929
- get: windows-winsw
934-
- get: govmomi
935930
- put: version
936931
inputs: detect
937932
resource: stembuild-linux-build-number

ci/tasks/test-integration-stembuild-linux/run.sh

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ echo '---> Install VMWare OVF Tools'
1515
chmod +x "${ROOT_DIR}/ovftool/VMware-ovftool-4.2.0-5965791-lin.x86_64.bundle"
1616
"${ROOT_DIR}/ovftool/VMware-ovftool-4.2.0-5965791-lin.x86_64.bundle" --eulas-agreed --required
1717

18-
echo "---> Install github.com/vmware/govmomi/vcsim"
19-
go install -C "${ROOT_DIR}/govmomi/vcsim"
20-
2118
export TARGET_VM_IP
2219
TARGET_VM_IP=$(cat nimbus-ips/name)
2320
export VM_NAME

stembuild/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.23.0
55
require (
66
github.com/concourse/pool-resource v1.1.1
77
github.com/google/subcommands v1.2.0
8-
github.com/google/uuid v1.6.0
98
github.com/masterzen/winrm v0.0.0-20240702205601-3fad6e106085
109
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3
1110
github.com/onsi/ginkgo/v2 v2.23.4
@@ -29,6 +28,7 @@ require (
2928
github.com/gofrs/uuid v4.4.0+incompatible // indirect
3029
github.com/google/go-cmp v0.7.0 // indirect
3130
github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 // indirect
31+
github.com/google/uuid v1.6.0 // indirect
3232
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
3333
github.com/hashicorp/go-uuid v1.0.3 // indirect
3434
github.com/jcmturner/aescts/v2 v2.0.0 // indirect

stembuild/integration/iaas_cli/iaas_clients/fixtures/dummycert renamed to stembuild/integration/iaas_cli/iaas_clients/fixtures/dummy-cert

File renamed without changes.

stembuild/integration/iaas_cli/iaas_clients/fixtures/dummykey renamed to stembuild/integration/iaas_cli/iaas_clients/fixtures/dummy-cert.key

File renamed without changes.

stembuild/integration/iaas_cli/iaas_clients/fixtures/fakecert renamed to stembuild/integration/iaas_cli/iaas_clients/fixtures/fake-cert

File renamed without changes.

stembuild/integration/iaas_cli/iaas_clients/iaas_clients_suite_test.go

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ import (
77
"testing"
88
"time"
99

10-
"github.com/google/uuid"
1110
. "github.com/onsi/ginkgo/v2"
1211
. "github.com/onsi/gomega"
1312
"github.com/vmware/govmomi/object"
1413

15-
vcenterclientfactory "github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli/iaas_clients/vcenter_manager"
14+
"github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli/iaas_clients/vcenter_manager"
1615
)
1716

1817
func TestIaasClients(t *testing.T) {
@@ -31,9 +30,13 @@ const (
3130
TestVmUsername = "CONTRACT_TEST_VM_USERNAME"
3231
)
3332

34-
var TestVmPath string
35-
var VM *object.VirtualMachine
36-
var CTX context.Context
33+
var (
34+
ctx = context.TODO()
35+
36+
clonedVmPath string
37+
clonedVm *object.VirtualMachine
38+
)
39+
3740
var _ = BeforeSuite(func() {
3841
vcenterCaCert := envMustExist("VCENTER_CA_CERT")
3942
vcenterCaCertFile, err := os.CreateTemp("", "vcenter-ca")
@@ -42,55 +45,51 @@ var _ = BeforeSuite(func() {
4245
err = os.WriteFile(vcenterCaCertFile.Name(), []byte(vcenterCaCert), 0644)
4346
Expect(err).NotTo(HaveOccurred())
4447

45-
managerFactory := &vcenterclientfactory.ManagerFactory{
46-
Config: vcenterclientfactory.FactoryConfig{
48+
managerFactory := &vcenter_manager.ManagerFactory{
49+
Config: vcenter_manager.FactoryConfig{
4750
VCenterServer: envMustExist(VcenterUrl),
4851
Username: envMustExist(VcenterUsername),
4952
Password: envMustExist(VcenterPassword),
50-
ClientCreator: &vcenterclientfactory.ClientCreator{},
51-
FinderCreator: &vcenterclientfactory.GovmomiFinderCreator{},
53+
ClientCreator: &vcenter_manager.ClientCreator{},
54+
FinderCreator: &vcenter_manager.GovmomiFinderCreator{},
5255
RootCACertPath: vcenterCaCertFile.Name(),
5356
},
5457
}
5558

56-
CTX = context.TODO()
57-
58-
vCenterManager, err := managerFactory.VCenterManager(CTX)
59+
vCenterManager, err := managerFactory.VCenterManager(ctx)
5960
Expect(err).ToNot(HaveOccurred())
6061

61-
err = vCenterManager.Login(CTX)
62+
err = vCenterManager.Login(ctx)
6263
Expect(err).ToNot(HaveOccurred())
6364

6465
vmFolder := envMustExist(VmFolder)
6566
testVmName := envMustExist(TestVmName)
6667
testVmPath := fmt.Sprintf("%s/%s", vmFolder, testVmName)
6768

68-
vmToClone, err := vCenterManager.FindVM(CTX, testVmPath)
69+
vmToClone, err := vCenterManager.FindVM(ctx, testVmPath)
6970
Expect(err).ToNot(HaveOccurred())
7071

71-
TestVmPath = testVmPath + fmt.Sprintf("%s", uuid.New())[0:8] //nolint:staticcheck
72+
clonedVmPath = fmt.Sprintf("%s-%s", testVmPath, time.Now().Format("2006-01-02T15h04s05"))
7273

73-
err = vCenterManager.CloneVM(CTX, vmToClone, TestVmPath)
74+
err = vCenterManager.CloneVM(ctx, vmToClone, clonedVmPath)
7475
Expect(err).ToNot(HaveOccurred())
7576

7677
time.Sleep(30 * time.Second)
7778

78-
VM, err = vCenterManager.FindVM(CTX, TestVmPath)
79+
clonedVm, err = vCenterManager.FindVM(ctx, clonedVmPath)
7980
Expect(err).ToNot(HaveOccurred())
80-
8181
})
8282

8383
var _ = AfterSuite(func() {
84-
85-
if VM != nil {
86-
task, err := VM.PowerOff(CTX)
84+
if clonedVm != nil {
85+
task, err := clonedVm.PowerOff(ctx)
8786
Expect(err).ToNot(HaveOccurred())
88-
err = task.WaitEx(CTX)
87+
err = task.WaitEx(ctx)
8988
Expect(err).ToNot(HaveOccurred())
9089

91-
task, err = VM.Destroy(CTX)
90+
task, err = clonedVm.Destroy(ctx)
9291
Expect(err).ToNot(HaveOccurred())
93-
err = task.WaitEx(CTX)
92+
err = task.WaitEx(ctx)
9493
Expect(err).ToNot(HaveOccurred())
9594
}
9695
})

stembuild/integration/iaas_cli/iaas_clients/vcenter_client_contract_test.go

Lines changed: 59 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,28 @@ package iaas_clients
22

33
import (
44
"context"
5+
"crypto/tls"
6+
"fmt"
7+
"net/url"
58
"os"
6-
"os/exec"
79
"path/filepath"
8-
"runtime"
910
"time"
1011

11-
"github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli"
12-
"github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli/iaas_clients"
13-
vcenterclientfactory "github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli/iaas_clients/vcenter_manager"
14-
1512
. "github.com/onsi/ginkgo/v2"
1613
. "github.com/onsi/gomega"
14+
"github.com/vmware/govmomi/simulator"
15+
16+
"github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli"
17+
"github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli/iaas_clients"
18+
"github.com/cloudfoundry/bosh-windows-stemcell-builder/stembuild/iaas_cli/iaas_clients/vcenter_manager"
1719
)
1820

1921
var _ = Describe("VcenterManager", func() {
20-
BeforeEach(func() {
21-
if runtime.GOOS == "windows" {
22-
Skip("windows cannot run a vcsim server")
23-
}
24-
})
25-
26-
Context("vcsim server with special character credentials", func() {
22+
Context("using a vcsim server when username and password have special characters", func() {
2723
var (
28-
cmd *exec.Cmd
24+
vcsimModel *simulator.Model
25+
vcsimServer *simulator.Server
26+
2927
vCenterUsername string
3028
vCenterPassword string
3129
vCenterUrl string
@@ -36,59 +34,79 @@ var _ = Describe("VcenterManager", func() {
3634
BeforeEach(func() {
3735
workingDir, err := os.Getwd()
3836
Expect(err).NotTo(HaveOccurred())
39-
certPath = filepath.Join(workingDir, "fixtures", "dummycert")
40-
keyPath = filepath.Join(workingDir, "fixtures", "dummykey")
41-
42-
vcsimBinary := filepath.Join(os.Getenv("GOPATH"), "bin", "vcsim")
37+
certPath = filepath.Join(workingDir, "fixtures", "dummy-cert")
38+
keyPath = filepath.Join(workingDir, "fixtures", "dummy-cert.key")
4339

4440
vCenterUsername = `user\name!#`
4541
vCenterPassword = `password\!#!`
46-
vCenterUrl = "127.0.0.1:8989/sdk"
47-
cmd = exec.Command(vcsimBinary, "-username", vCenterUsername, "-password", vCenterPassword, "-tlscert", certPath, "-tlskey", keyPath)
4842

49-
err = cmd.Start()
43+
vcsimModel = simulator.VPX()
44+
err = vcsimModel.Create()
5045
Expect(err).ToNot(HaveOccurred())
5146

47+
vcsimModel.Service.RegisterEndpoints = true
48+
vcsimModel.Service.Listen = &url.URL{
49+
User: url.UserPassword(vCenterUsername, vCenterPassword),
50+
}
51+
52+
serverCert, err := tls.LoadX509KeyPair(certPath, keyPath)
53+
Expect(err).ToNot(HaveOccurred())
54+
vcsimModel.Service.TLS = &tls.Config{
55+
Certificates: []tls.Certificate{serverCert},
56+
}
57+
58+
vcsimServer = vcsimModel.Service.NewServer()
59+
60+
vCenterUrl = fmt.Sprintf("%s/sdk", vcsimServer.URL.Host)
61+
By(fmt.Sprintf("Using VCsim server at '%s'", vCenterUrl))
62+
5263
time.Sleep(3 * time.Second) // the vcsim server needs a moment to come up
5364
})
5465

5566
AfterEach(func() {
56-
if runtime.GOOS != "windows" && cmd != nil {
57-
err := cmd.Process.Kill()
58-
Expect(err).ToNot(HaveOccurred())
67+
if vcsimServer != nil {
68+
vcsimServer.Close()
69+
}
70+
if vcsimModel != nil {
71+
vcsimModel.Remove()
5972
}
6073
})
6174

62-
Context("VCenterManager.Login", func() {
63-
It("succeeds", func() {
64-
factoryConfig := &vcenterclientfactory.FactoryConfig{
65-
VCenterServer: vCenterUrl,
66-
Username: vCenterUsername,
67-
Password: vCenterPassword,
68-
ClientCreator: &vcenterclientfactory.ClientCreator{},
69-
FinderCreator: &vcenterclientfactory.GovmomiFinderCreator{},
70-
RootCACertPath: certPath,
71-
}
72-
73-
managerFactory := &vcenterclientfactory.ManagerFactory{
74-
Config: *factoryConfig,
75+
Describe("VCenterManager.Login()", func() {
76+
var managerFactory *vcenter_manager.ManagerFactory
77+
BeforeEach(func() {
78+
managerFactory = &vcenter_manager.ManagerFactory{
79+
Config: vcenter_manager.FactoryConfig{
80+
VCenterServer: vCenterUrl,
81+
Username: vCenterUsername,
82+
Password: vCenterPassword,
83+
ClientCreator: &vcenter_manager.ClientCreator{},
84+
FinderCreator: &vcenter_manager.GovmomiFinderCreator{},
85+
RootCACertPath: certPath,
86+
},
7587
}
88+
})
7689

90+
It("succeeds", func() {
7791
ctx := context.TODO()
7892

7993
vCenterManager, err := managerFactory.VCenterManager(ctx)
8094
Expect(err).ToNot(HaveOccurred())
8195

8296
err = vCenterManager.Login(ctx)
8397
Expect(err).ToNot(HaveOccurred())
84-
8598
})
8699
})
87100

88-
Context("govc_cli client login", func() {
101+
Describe("VcenterClient.ValidateCredentials()", func() {
89102
It("Succeeds", func() {
90-
runner := &iaas_cli.GovcRunner{}
91-
client := iaas_clients.NewVcenterClient(vCenterUsername, vCenterPassword, vCenterUrl, certPath, runner)
103+
client := iaas_clients.NewVcenterClient(
104+
vCenterUsername,
105+
vCenterPassword,
106+
vCenterUrl,
107+
certPath,
108+
&iaas_cli.GovcRunner{},
109+
)
92110

93111
err := client.ValidateCredentials()
94112
Expect(err).NotTo(HaveOccurred())

0 commit comments

Comments
 (0)