var ( fs *fakesys.FakeFileSystem logger boshlog.Logger registryServerManager biregistry.ServerManager releaseManager birel.Manager mockInstaller *mock_install.MockInstaller mockInstallerFactory *mock_install.MockInstallerFactory mockCloudFactory *mock_cloud.MockFactory mockCloud *mock_cloud.MockCloud mockAgentClient *mock_agentclient.MockAgentClient mockAgentClientFactory *mock_httpagent.MockAgentClientFactory mockReleaseExtractor *mock_release.MockExtractor mockStateBuilderFactory *mock_instance_state.MockBuilderFactory mockStateBuilder *mock_instance_state.MockBuilder mockState *mock_instance_state.MockState mockBlobstoreFactory *mock_blobstore.MockFactory mockBlobstore *mock_blobstore.MockBlobstore fakeStemcellExtractor *fakebistemcell.FakeExtractor fakeUUIDGenerator *fakeuuid.FakeGenerator fakeRegistryUUIDGenerator *fakeuuid.FakeGenerator fakeRepoUUIDGenerator *fakeuuid.FakeGenerator fakeAgentIDGenerator *fakeuuid.FakeGenerator fakeSHA1Calculator *fakebicrypto.FakeSha1Calculator legacyDeploymentStateMigrator biconfig.LegacyDeploymentStateMigrator deploymentStateService biconfig.DeploymentStateService vmRepo biconfig.VMRepo diskRepo biconfig.DiskRepo stemcellRepo biconfig.StemcellRepo deploymentRepo biconfig.DeploymentRepo releaseRepo biconfig.ReleaseRepo sshTunnelFactory bisshtunnel.Factory diskManagerFactory bidisk.ManagerFactory diskDeployer bivm.DiskDeployer stdOut *gbytes.Buffer stdErr *gbytes.Buffer fakeStage *fakebiui.FakeStage stemcellManagerFactory bistemcell.ManagerFactory vmManagerFactory bivm.ManagerFactory applySpec bias.ApplySpec directorID string stemcellTarballPath = "/fake-stemcell-release.tgz" deploymentManifestPath = "/deployment-dir/fake-deployment-manifest.yml" deploymentStatePath = "/deployment-dir/fake-deployment-manifest-state.json" stemcellImagePath = "fake-stemcell-image-path" stemcellCID = "fake-stemcell-cid" stemcellCloudProperties = biproperty.Map{} vmCloudProperties = biproperty.Map{} vmEnv = biproperty.Map{} diskCloudProperties = biproperty.Map{} networkInterfaces = map[string]biproperty.Map{ "network-1": biproperty.Map{ "type": "dynamic", "default": []bideplmanifest.NetworkDefault{"dns", "gateway"}, "cloud_properties": biproperty.Map{}, }, } agentRunningState = biagentclient.AgentState{JobState: "running"} mbusURL = "http://fake-mbus-url" expectHasVM1 *gomock.Call expectDeleteVM1 *gomock.Call sshConfig *SSHConfig )
}) Describe("Delete", func() { var ( logger boshlog.Logger fs boshsys.FileSystem fakeUUIDGenerator *fakeuuid.FakeGenerator fakeRepoUUIDGenerator *fakeuuid.FakeGenerator deploymentStateService biconfig.DeploymentStateService vmRepo biconfig.VMRepo diskRepo biconfig.DiskRepo stemcellRepo biconfig.StemcellRepo mockCloud *mock_cloud.MockCloud mockAgentClient *mock_agentclient.MockAgentClient mockStateBuilderFactory *mock_instance_state.MockBuilderFactory mockStateBuilder *mock_instance_state.MockBuilder mockState *mock_instance_state.MockState mockBlobstore *mock_blobstore.MockBlobstore fakeStage *fakebiui.FakeStage deploymentFactory Factory deployment Deployment ) var expectNormalFlow = func() { gomock.InOrder(
func describeRemotePackageCompiler() { var mockCtrl *gomock.Controller BeforeEach(func() { mockCtrl = gomock.NewController(GinkgoT()) }) AfterEach(func() { mockCtrl.Finish() }) var ( packageRepo bistatepkg.CompiledPackageRepo pkgDependency *birelpkg.Package pkg *birelpkg.Package mockBlobstore *mock_blobstore.MockBlobstore mockAgentClient *mock_agentclient.MockAgentClient archivePath = "fake-archive-path" remotePackageCompiler bistatepkg.Compiler compiledPackages map[bistatepkg.CompiledPackageRecord]*birelpkg.Package expectBlobstoreAdd *gomock.Call expectAgentCompile *gomock.Call ) BeforeEach(func() { mockBlobstore = mock_blobstore.NewMockBlobstore(mockCtrl) mockAgentClient = mock_agentclient.NewMockAgentClient(mockCtrl) index := biindex.NewInMemoryIndex() packageRepo = bistatepkg.NewCompiledPackageRepo(index) remotePackageCompiler = NewRemotePackageCompiler(mockBlobstore, mockAgentClient, packageRepo) pkgDependency = &birelpkg.Package{ Name: "fake-package-name-dep", Fingerprint: "fake-package-fingerprint-dep", } pkg = &birelpkg.Package{ Name: "fake-package-name", Fingerprint: "fake-package-fingerprint", SHA1: "fake-source-package-sha1", ArchivePath: archivePath, Dependencies: []*birelpkg.Package{pkgDependency}, } depRecord1 := bistatepkg.CompiledPackageRecord{ BlobID: "fake-compiled-package-blob-id-dep", BlobSHA1: "fake-compiled-package-sha1-dep", } compiledPackages = map[bistatepkg.CompiledPackageRecord]*birelpkg.Package{ depRecord1: pkgDependency, } }) JustBeforeEach(func() { // add compiled packages to the repo for record, dependency := range compiledPackages { err := packageRepo.Save(*dependency, record) Expect(err).ToNot(HaveOccurred()) } packageSource := biagentclient.BlobRef{ Name: "fake-package-name", Version: "fake-package-fingerprint", BlobstoreID: "fake-source-package-blob-id", SHA1: "fake-source-package-sha1", } packageDependencies := []biagentclient.BlobRef{ { Name: "fake-package-name-dep", Version: "fake-package-fingerprint-dep", BlobstoreID: "fake-compiled-package-blob-id-dep", SHA1: "fake-compiled-package-sha1-dep", }, } compiledPackageRef := biagentclient.BlobRef{ Name: "fake-package-name", Version: "fake-package-version", BlobstoreID: "fake-compiled-package-blob-id", SHA1: "fake-compiled-package-sha1", } expectBlobstoreAdd = mockBlobstore.EXPECT().Add(archivePath).Return("fake-source-package-blob-id", nil).AnyTimes() expectAgentCompile = mockAgentClient.EXPECT().CompilePackage(packageSource, packageDependencies).Return(compiledPackageRef, nil).AnyTimes() }) Describe("Compile", func() { It("uploads the package archive to the blobstore and then compiles the package with the agent", func() { gomock.InOrder( expectBlobstoreAdd.Times(1), expectAgentCompile.Times(1), ) compiledPackageRecord, _, err := remotePackageCompiler.Compile(pkg) Expect(err).ToNot(HaveOccurred()) Expect(compiledPackageRecord).To(Equal(bistatepkg.CompiledPackageRecord{ BlobID: "fake-compiled-package-blob-id", BlobSHA1: "fake-compiled-package-sha1", })) }) It("saves the compiled package ref in the package repo", func() { compiledPackageRecord, _, err := remotePackageCompiler.Compile(pkg) Expect(err).ToNot(HaveOccurred()) record, found, err := packageRepo.Find(*pkg) Expect(err).ToNot(HaveOccurred()) Expect(found).To(BeTrue()) Expect(record).To(Equal(compiledPackageRecord)) }) Context("when the dependencies are not in the repo", func() { BeforeEach(func() { compiledPackages = map[bistatepkg.CompiledPackageRecord]*birelpkg.Package{} }) It("returns an error", func() { _, _, err := remotePackageCompiler.Compile(pkg) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("Remote compilation failure: Package 'fake-package-name/fake-package-fingerprint' requires package 'fake-package-name-dep/fake-package-fingerprint-dep', but it has not been compiled")) }) }) Context("when package belongs to a compiled release", func() { BeforeEach(func() { pkg.Stemcell = "ubuntu/fake" }) AfterEach(func() { pkg.Stemcell = "" }) It("should skip compilation", func() { compiledPackageRecord, isAlreadyCompiled, err := remotePackageCompiler.Compile(pkg) expectAgentCompile.Times(0) Expect(err).ToNot(HaveOccurred()) Expect(isAlreadyCompiled).To(Equal(true)) Expect(compiledPackageRecord.BlobID).To(Equal("fake-source-package-blob-id")) Expect(compiledPackageRecord.BlobSHA1).To(Equal(pkg.SHA1)) }) }) }) }