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 }