func NewScheduler(config config.Scheduler, patroni interfaces.Patroni, logger lager.Logger) (*Scheduler, error) {
	s := &Scheduler{
		config:  config,
		logger:  logger,
		patroni: patroni,
	}

	clusterLoader, err := state.NewStateEtcd(config.Etcd, s.logger)
	if err != nil {
		return nil, err
	}
	s.cells = cells.NewCells(config.Cells, clusterLoader)

	return s, nil
}
// NewBroker is a constructor for a Broker webapp struct
func NewBroker(config *config.Config) (*Broker, error) {
	bkr := &Broker{
		config:  config.Broker,
		catalog: config.Catalog,
		backups: config.Backups,
		cells:   config.Scheduler.Cells,
	}

	bkr.logger = bkr.setupLogger()
	bkr.callbacks = NewCallbacks(config.Callbacks, bkr.logger)
	var err error
	bkr.state, err = state.NewStateEtcd(config.Etcd, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-state.error", err)
		return nil, err
	}

	bkr.patroni, err = patroni.NewPatroni(config.Etcd, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-patroni.error", err)
		return nil, err
	}

	bkr.scheduler, err = scheduler.NewScheduler(config.Scheduler, bkr.patroni, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-scheduler.error", err)
		return nil, err
	}

	bkr.router, err = routing.NewRouter(config.Etcd, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-router.error", err)
		return nil, err
	}

	// Optionally, provisioned services can asynchronously look up service name
	// to aide disaster recovery/undo-delete/recreate-from-backup by users
	// that only recall the service instance name they provided Cloud Foundry
	bkr.cf, err = NewCloudFoundryFromConfig(config.CloudFoundry, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-cf.error", err)
	} else {
		bkr.logger.Info("new-broker.new-cf.success", lager.Data{"api-url": config.CloudFoundry.ApiAddress})
	}

	return bkr, nil
}
// NewBroker is a constructor for a Broker webapp struct
func NewBroker(config *config.Config) (*Broker, error) {
	bkr := &Broker{
		config:     config.Broker,
		catalog:    config.Catalog,
		etcdConfig: config.Etcd,
		cells:      config.Scheduler.Cells,
	}

	bkr.logger = bkr.setupLogger()
	bkr.callbacks = NewCallbacks(config.Callbacks, bkr.logger)
	var err error
	bkr.scheduler, err = scheduler.NewScheduler(config.Scheduler, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-scheduler.error", err)
		return nil, err
	}
	bkr.state, err = state.NewStateEtcd(config.Etcd, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-state.error", err)
		return nil, err
	}

	bkr.patroni, err = patroni.NewPatroni(config.Etcd, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-patroni.error", err)
		return nil, err
	}

	bkr.router, err = routing.NewRouter(config.Etcd, bkr.logger)
	if err != nil {
		bkr.logger.Error("new-broker.new-router.error", err)
		return nil, err
	}

	return bkr, nil
}