func (s *snapshotter) Snapshot() (task.Artifact, error) {
	s.logger.Info("snapshot",
		lager.Data{
			"task":    "create-snapshot",
			"event":   "starting",
			"timeout": s.timeout.String(),
		},
	)

	if err := s.createSnapshot(); err != nil {
		s.logger.Error("snapshot",
			err,
			lager.Data{
				"task":  "create-snapshot",
				"event": "failed",
			},
		)
		return nil, err
	}

	s.logger.Info("snapshot",
		lager.Data{
			"task":    "create-snapshot",
			"event":   "done",
			"timeout": s.timeout.String(),
		},
	)

	s.logger.Info("snapshot",
		lager.Data{
			"task":  "get-rdb-path",
			"event": "starting",
		},
	)

	path, err := s.client.RDBPath()
	if err != nil {
		s.logger.Error("snapshot",
			err,
			lager.Data{
				"task":  "get-rdb-path",
				"event": "failed",
			},
		)
		return nil, err
	}

	s.logger.Info("snapshot",
		lager.Data{
			"task":  "get-rdb-path",
			"event": "done",
			"path":  path,
		},
	)

	return task.NewArtifact(path), nil
}
func (f *fakeTask) Run(artifact task.Artifact) (task.Artifact, error) {
	f.Artifact = artifact
	return task.NewArtifact(f.Name()), f.ExpectedErr
}
	})

	Describe(".Name", func() {
		It("returns the pipeline name", func() {
			pipeline := task.NewPipeline("some-pipeline", logger)

			Expect(pipeline.Name()).To(Equal("some-pipeline"))
		})

	})

	Describe(".Run", func() {
		var (
			task1            *fakeTask
			task2            *fakeTask
			originalArtifact = task.NewArtifact("path/to/artifact")
			finalArtifact    task.Artifact
			runErr           error
		)

		Context("with multiple successful tasks", func() {
			BeforeEach(func() {
				task1 = &fakeTask{TaskName: "task1"}
				task2 = &fakeTask{TaskName: "task2"}

				pipeline := task.NewPipeline("some-name", logger, task1, task2)

				finalArtifact, runErr = pipeline.Run(originalArtifact)
			})

			It("executes all tasks with given artifact", func() {
	})

	Describe(".Run", func() {
		var (
			expectedSourcePath = "path/to/source"
			expectedTargetPath = "path/to/target"
			expectedBucketName = "some-bucket-name"
			artifactOut        task.Artifact
			runErr             error
			client             *fakeS3Client
			bucket             *fakeS3Bucket
			upload             task.Task
		)

		JustBeforeEach(func() {
			artifactOut, runErr = upload.Run(task.NewArtifact(expectedSourcePath))
		})

		BeforeEach(func() {
			bucket = &fakeS3Bucket{
				BucketName: expectedBucketName,
			}

			client = &fakeS3Client{
				GetOrCreateBucketResult: bucket,
			}

			upload = task.NewS3Upload(
				expectedBucketName,
				expectedTargetPath,
				"endpoint",
			renamedDumpPath  string
			redisDir         string
			cleanup          task.Task
			artifactIn       task.Artifact
			artifactOut      task.Artifact
			runErr           error
			log              *gbytes.Buffer
			logger           lager.Logger
		)

		BeforeEach(func() {
			log = gbytes.NewBuffer()
			logger = lager.NewLogger("redis")
			logger.RegisterSink(lager.NewWriterSink(log, lager.INFO))

			artifactIn = task.NewArtifact("path/to/artifact")

			var err error
			redisDir, err = ioutil.TempDir("", "cleanup-test")
			Expect(err).ToNot(HaveOccurred())

			originalDumpPath = filepath.Join(redisDir, "dump.rdb")
			renamedDumpPath = filepath.Join(redisDir, "renamed.rdb")

			cleanup = backup.NewCleanup(originalDumpPath, renamedDumpPath, logger)
		})

		JustBeforeEach(func() {
			artifactOut, runErr = cleanup.Run(artifactIn)
		})
			logger          lager.Logger
			log             *gbytes.Buffer
		)

		BeforeEach(func() {
			tmpDirPath, err := ioutil.TempDir("", "temp")
			Expect(err).ToNot(HaveOccurred())

			finalPath = filepath.Join(tmpDirPath, "newName")
			Expect(finalPath).ToNot(BeAnExistingFile())

			file, err := ioutil.TempFile(tmpDirPath, "artifact")
			Expect(err).ToNot(HaveOccurred())

			originalPath = file.Name()
			artifact := task.NewArtifact(originalPath)

			logger = lager.NewLogger("logger")
			log = gbytes.NewBuffer()
			logger.RegisterSink(lager.NewWriterSink(log, lager.INFO))

			renameTask := task.NewRename(finalPath, logger)
			renamedArtifact, runErr = renameTask.Run(artifact)
		})

		AfterEach(func() {
			os.Remove(tmpDirPath)
		})

		It("renames the artifact on disk", func() {
			Expect(originalPath).ToNot(BeAnExistingFile())
			backuper        backup.RedisBackuper

			expectedTimeout    = 123 * time.Second
			expectedBucketName = "some-bucket-name"
			expectedTargetPath = "some-target-path"
			expectedEndpoint   = "some-endpoint"
			expectedAccessKey  = "some-access-key"
			expectedSecretKey  = "some-secret-key"
		)

		BeforeEach(func() {
			log = gbytes.NewBuffer()
			logger = lager.NewLogger("logger")
			logger.RegisterSink(lager.NewWriterSink(log, lager.INFO))

			initialArtifact = task.NewArtifact("path/to/artifact")

			providerFactory = new(fakes.FakeProviderFactory)

			snapshotter = new(fakes.FakeSnapshotter)
			snapshotter.SnapshotReturns(initialArtifact, nil)
			providerFactory.SnapshotterProviderReturns(snapshotter)

			renameTask = new(fakes.FakeTask)
			renameTask.NameReturns("rename")
			renameTask.RunReturns(task.NewArtifact("rename"), nil)
			providerFactory.RenameTaskProviderReturns(renameTask)

			s3UploadTask = new(fakes.FakeTask)
			s3UploadTask.NameReturns("s3upload")
			s3UploadTask.RunReturns(task.NewArtifact("s3upload"), nil)