func (b *backuper) Backup(client redis.Client, s3TargetPath string) error {
	localLogger := b.logger.WithData(lager.Data{
		"redis_address": client.Address(),
	})

	localLogger.Info("backup", lager.Data{"event": "starting"})

	snapshotter := b.snapshotterProvider(client, b.snapshotTimeout, b.logger)
	artifact, err := snapshotter.Snapshot()
	if err != nil {
		localLogger.Error("backup", err, lager.Data{"event": "failed"})
		return err
	}

	originalPath := artifact.Path()

	tmpSnapshotPath := filepath.Join(b.tmpDir, uuid.New())

	renameTask := b.renameTaskProvider(tmpSnapshotPath, b.logger)

	uploadTask := b.s3UploadTaskProvider(
		b.s3BucketName,
		s3TargetPath,
		b.s3Endpoint,
		b.awsAccessKey,
		b.awsSecretKey,
		b.logger,
	)

	cleanupTask := b.cleanupTaskProvider(
		originalPath,
		tmpSnapshotPath,
		b.logger,
	)

	artifact, err = task.NewPipeline(
		"redis-backup",
		b.logger,
		renameTask,
		uploadTask,
	).Run(artifact)

	if err != nil {
		localLogger.Error("backup", err, lager.Data{"event": "failed"})
	}

	task.NewPipeline(
		"cleanup",
		b.logger,
		cleanupTask,
	).Run(artifact)

	localLogger.Info("backup", lager.Data{"event": "done"})

	return err
}
var _ = Describe("Pipeline", func() {
	var (
		logger lager.Logger
		log    *gbytes.Buffer
	)

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

	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
		)