github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/localstorage/worker.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package localstorage
     5  
     6  import (
     7  	"net"
     8  
     9  	"github.com/juju/loggo"
    10  	"launchpad.net/tomb"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/environs/filestorage"
    14  	"github.com/juju/juju/environs/httpstorage"
    15  	"github.com/juju/juju/worker"
    16  )
    17  
    18  var logger = loggo.GetLogger("juju.worker.localstorage")
    19  
    20  type storageWorker struct {
    21  	config agent.Config
    22  	tomb   tomb.Tomb
    23  }
    24  
    25  func NewWorker(config agent.Config) worker.Worker {
    26  	w := &storageWorker{config: config}
    27  	go func() {
    28  		defer w.tomb.Done()
    29  		w.tomb.Kill(w.waitForDeath())
    30  	}()
    31  	return w
    32  }
    33  
    34  // Kill implements worker.Worker.Kill.
    35  func (s *storageWorker) Kill() {
    36  	s.tomb.Kill(nil)
    37  }
    38  
    39  // Wait implements worker.Worker.Wait.
    40  func (s *storageWorker) Wait() error {
    41  	return s.tomb.Wait()
    42  }
    43  
    44  func (s *storageWorker) serveStorage(storageAddr, storageDir string, config *config) (net.Listener, error) {
    45  	authenticated := len(config.caCertPEM) > 0 && len(config.caKeyPEM) > 0
    46  	scheme := "http://"
    47  	if authenticated {
    48  		scheme = "https://"
    49  	}
    50  	logger.Infof("serving storage from %s to %s%s", storageDir, scheme, storageAddr)
    51  	storage, err := filestorage.NewFileStorageWriter(storageDir)
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  	if authenticated {
    56  		return httpstorage.ServeTLS(
    57  			storageAddr,
    58  			storage,
    59  			config.caCertPEM,
    60  			config.caKeyPEM,
    61  			config.hostnames,
    62  			config.authkey,
    63  		)
    64  	}
    65  	return httpstorage.Serve(storageAddr, storage)
    66  }
    67  
    68  func (s *storageWorker) waitForDeath() error {
    69  	config, err := loadConfig(s.config)
    70  	if err != nil {
    71  		logger.Errorf("error loading config: %v", err)
    72  		return err
    73  	}
    74  
    75  	storageListener, err := s.serveStorage(config.storageAddr, config.storageDir, config)
    76  	if err != nil {
    77  		logger.Errorf("error with local storage: %v", err)
    78  		return err
    79  	}
    80  	defer storageListener.Close()
    81  
    82  	logger.Infof("storage routines started, awaiting death")
    83  
    84  	<-s.tomb.Dying()
    85  
    86  	logger.Infof("dying, closing storage listeners")
    87  	return tomb.ErrDying
    88  }