func New(config *config_package.Config) BlobStore { switch config.ActiveBlobStore() { case config_package.DAVBlobStore: return dav_blob_store.New(config.BlobStore()) case config_package.S3BlobStore: return s3_blob_store.New(config.S3BlobStore()) } return dav_blob_store.New(config.BlobStore()) }
func (Verifier) Verify(config *config_package.Config) (authorized bool, err error) { blobStoreURL := url.URL{ Scheme: "http", Host: fmt.Sprintf("%s:%s", config.BlobStore().Host, config.BlobStore().Port), User: url.UserPassword(config.BlobStore().Username, config.BlobStore().Password), } baseURL := &url.URL{ Scheme: blobStoreURL.Scheme, Host: blobStoreURL.Host, User: blobStoreURL.User, Path: "/blobs/", } req, err := http.NewRequest("PROPFIND", baseURL.String(), nil) if err != nil { return false, err } req.Header.Add("Depth", "1") resp, err := http.DefaultClient.Do(req) if err != nil { return false, err } defer resp.Body.Close() return resp.StatusCode == 207, err }
It("returns an error when the upload fails", func() { fakeBlobStore.UploadReturns(errors.New("some error")) err := dropletRunner.UploadBits("droplet-name", tmpFile.Name()) Expect(err).To(MatchError("some error")) }) }) }) Describe("BuildDroplet", func() { It("does the build droplet task", func() { config.SetBlobStore("blob-host", "7474", "dav-user", "dav-pass") Expect(config.Save()).To(Succeed()) blobURL := fmt.Sprintf("http://%s:%s@%s:%s%s", config.BlobStore().Username, config.BlobStore().Password, config.BlobStore().Host, config.BlobStore().Port, "/blobs/droplet-name") fakeBlobStore.DownloadAppBitsActionReturns(&models.DownloadAction{ From: blobURL + "/bits.zip", To: "/tmp/app", User: "******", }) fakeBlobStore.DeleteAppBitsActionReturns(&models.RunAction{ Path: "/tmp/davtool", Dir: "/", Args: []string{"delete", blobURL + "/bits.zip"},
It("clears out existing saved target credentials", func() { test_helpers.ExecuteCommandWithArgs(targetCommand, []string{"myapi.com"}) Expect(fakeTargetVerifier.VerifyTargetCallCount()).To(Equal(1)) Expect(fakeTargetVerifier.VerifyTargetArgsForCall(0)).To(Equal("http://receptor.myapi.com")) }) It("saves the new blob store target", func() { fakeBlobStoreVerifier.VerifyReturns(true, nil) test_helpers.ExecuteCommandWithArgs(targetCommand, []string{"myapi.com"}) Expect(fakeBlobStoreVerifier.VerifyCallCount()).To(Equal(1)) config := fakeBlobStoreVerifier.VerifyArgsForCall(0) blobStoreConfig := config.BlobStore() Expect(blobStoreConfig).To(Equal(config_package.BlobStoreConfig{ Host: "myapi.com", Port: "8444", })) newConfig := config_package.New(configPersister) Expect(newConfig.Load()).To(Succeed()) Expect(newConfig.BlobStore()).To(Equal(config_package.BlobStoreConfig{ Host: "myapi.com", Port: "8444", })) }) Context("when the blob store requires authorization", func() { It("exits", func() {
Expect(testConfig.Receptor()).To(Equal("http://*****:*****@receptor.mysavedapi.com")) }) It("returns errors from loading the config", func() { testPersister.err = errors.New("Error") err := testConfig.Load() Expect(err).To(MatchError("Error")) }) }) Describe("TargetBlob", func() { It("sets the blob target", func() { testConfig.SetBlobStore("some-host", "7474", "some-username", "some-password") Expect(testConfig.BlobStore()).To(Equal(dav_blob_store.Config{ Host: "some-host", Port: "7474", Username: "******", Password: "******", })) }) }) }) type fakePersister struct { target string username string password string err error }
Describe("ActiveBlobStore", func() { It("defaults to 'dav'", func() { Expect(testConfig.ActiveBlobStore().String()).To(Equal("dav")) }) It("reports the active blobstore", func() { testConfig.SetS3BlobStore("some-access-key", "some-secret-key", "some-bucket-name", "some-s3-region") Expect(testConfig.ActiveBlobStore().String()).To(Equal("s3")) }) }) Describe("TargetBlob", func() { It("sets the blob target", func() { testConfig.SetBlobStore("some-host", "7474", "some-username", "some-password") Expect(testConfig.BlobStore()).To(Equal(config.BlobStoreConfig{ Host: "some-host", Port: "7474", Username: "******", Password: "******", })) }) It("sets the activeBlobStore to 'dav'", func() { testConfig.SetS3BlobStore("some-access-key", "some-secret-key", "some-bucket-name", "some-region") testConfig.SetBlobStore("some-host", "7474", "some-username", "some-password") Expect(testConfig.ActiveBlobStore().String()).To(Equal("dav")) }) }) Describe("TargetS3Blob", func() {
func cliCommands(ltcConfigRoot string, exitHandler exit_handler.ExitHandler, config *config.Config, logger lager.Logger, targetVerifier target_verifier.TargetVerifier, ui terminal.UI) []cli.Command { receptorClient := receptor.NewClient(config.Receptor()) noaaConsumer := noaa.NewConsumer(LoggregatorUrl(config.Loggregator()), nil, nil) appRunner := app_runner.New(receptorClient, config.Target()) clock := clock.NewClock() logReader := logs.NewLogReader(noaaConsumer) tailedLogsOutputter := console_tailed_logs_outputter.NewConsoleTailedLogsOutputter(ui, logReader) taskExaminer := task_examiner.New(receptorClient) taskExaminerCommandFactory := task_examiner_command_factory.NewTaskExaminerCommandFactory(taskExaminer, ui, exitHandler) taskRunner := task_runner.New(receptorClient, taskExaminer) taskRunnerCommandFactory := task_runner_command_factory.NewTaskRunnerCommandFactory(taskRunner, ui, exitHandler) appExaminer := app_examiner.New(receptorClient, app_examiner.NewNoaaConsumer(noaaConsumer)) graphicalVisualizer := graphical.NewGraphicalVisualizer(appExaminer) appExaminerCommandFactory := app_examiner_command_factory.NewAppExaminerCommandFactory(appExaminer, ui, clock, exitHandler, graphicalVisualizer, taskExaminer) appRunnerCommandFactoryConfig := app_runner_command_factory.AppRunnerCommandFactoryConfig{ AppRunner: appRunner, AppExaminer: appExaminer, UI: ui, Domain: config.Target(), Env: os.Environ(), Clock: clock, Logger: logger, TailedLogsOutputter: tailedLogsOutputter, ExitHandler: exitHandler, } appRunnerCommandFactory := app_runner_command_factory.NewAppRunnerCommandFactory(appRunnerCommandFactoryConfig) dockerRunnerCommandFactoryConfig := docker_runner_command_factory.DockerRunnerCommandFactoryConfig{ AppRunner: appRunner, AppExaminer: appExaminer, UI: ui, Domain: config.Target(), Env: os.Environ(), Clock: clock, Logger: logger, ExitHandler: exitHandler, TailedLogsOutputter: tailedLogsOutputter, DockerMetadataFetcher: docker_metadata_fetcher.New(docker_metadata_fetcher.NewDockerSessionFactory()), } dockerRunnerCommandFactory := docker_runner_command_factory.NewDockerRunnerCommandFactory(dockerRunnerCommandFactoryConfig) logsCommandFactory := logs_command_factory.NewLogsCommandFactory(appExaminer, taskExaminer, ui, tailedLogsOutputter, exitHandler) clusterTestRunner := cluster_test.NewClusterTestRunner(config, ltcConfigRoot) clusterTestCommandFactory := cluster_test_command_factory.NewClusterTestCommandFactory(clusterTestRunner) blobStore := dav_blob_store.New(config.BlobStore()) dropletRunner := droplet_runner.New(appRunner, taskRunner, config, blobStore, targetVerifier, appExaminer) cfIgnore := cf_ignore.New() dropletRunnerCommandFactory := droplet_runner_command_factory.NewDropletRunnerCommandFactory(*appRunnerCommandFactory, taskExaminer, dropletRunner, cfIgnore) configCommandFactory := config_command_factory.NewConfigCommandFactory(config, ui, targetVerifier, dav_blob_store.Verifier{}, exitHandler) helpCommand := cli.Command{ Name: "help", Aliases: []string{"h"}, Usage: "Shows a list of commands or help for one command", Description: "ltc help", Action: defaultAction, } return []cli.Command{ appExaminerCommandFactory.MakeCellsCommand(), dockerRunnerCommandFactory.MakeCreateAppCommand(), appRunnerCommandFactory.MakeSubmitLrpCommand(), logsCommandFactory.MakeDebugLogsCommand(), appExaminerCommandFactory.MakeListAppCommand(), logsCommandFactory.MakeLogsCommand(), appRunnerCommandFactory.MakeRemoveAppCommand(), appRunnerCommandFactory.MakeScaleAppCommand(), appExaminerCommandFactory.MakeStatusCommand(), taskRunnerCommandFactory.MakeSubmitTaskCommand(), configCommandFactory.MakeTargetCommand(), taskExaminerCommandFactory.MakeTaskCommand(), taskRunnerCommandFactory.MakeDeleteTaskCommand(), taskRunnerCommandFactory.MakeCancelTaskCommand(), clusterTestCommandFactory.MakeClusterTestCommand(), appRunnerCommandFactory.MakeUpdateRoutesCommand(), appExaminerCommandFactory.MakeVisualizeCommand(), dropletRunnerCommandFactory.MakeBuildDropletCommand(), dropletRunnerCommandFactory.MakeListDropletsCommand(), dropletRunnerCommandFactory.MakeLaunchDropletCommand(), dropletRunnerCommandFactory.MakeRemoveDropletCommand(), dropletRunnerCommandFactory.MakeImportDropletCommand(), dropletRunnerCommandFactory.MakeExportDropletCommand(), helpCommand, } }