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

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charmrevisionworker
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  
    10  	"github.com/juju/errors"
    11  	"github.com/juju/loggo"
    12  	"launchpad.net/tomb"
    13  
    14  	"github.com/juju/juju/api/charmrevisionupdater"
    15  	"github.com/juju/juju/worker"
    16  )
    17  
    18  var logger = loggo.GetLogger("juju.worker.charmrevisionworker")
    19  
    20  // interval sets how often the resuming is called.
    21  var interval = 24 * time.Hour
    22  
    23  var _ worker.Worker = (*RevisionUpdateWorker)(nil)
    24  
    25  // RevisionUpdateWorker is responsible for a periodical retrieval of charm versions
    26  // from the charm store, and recording the revision status for deployed charms.
    27  type RevisionUpdateWorker struct {
    28  	st   *charmrevisionupdater.State
    29  	tomb tomb.Tomb
    30  }
    31  
    32  // NewRevisionUpdateWorker periodically retrieves charm versions from the charm store.
    33  func NewRevisionUpdateWorker(st *charmrevisionupdater.State) *RevisionUpdateWorker {
    34  	ruw := &RevisionUpdateWorker{st: st}
    35  	go func() {
    36  		defer ruw.tomb.Done()
    37  		ruw.tomb.Kill(ruw.loop())
    38  	}()
    39  	return ruw
    40  }
    41  
    42  func (ruw *RevisionUpdateWorker) String() string {
    43  	return fmt.Sprintf("charm version lookup worker")
    44  }
    45  
    46  // Stop stops the worker.
    47  func (ruw *RevisionUpdateWorker) Stop() error {
    48  	ruw.tomb.Kill(nil)
    49  	return ruw.tomb.Wait()
    50  }
    51  
    52  // Kill is defined on the worker.Worker interface.
    53  func (ruw *RevisionUpdateWorker) Kill() {
    54  	ruw.tomb.Kill(nil)
    55  }
    56  
    57  // Wait is defined on the worker.Worker interface.
    58  func (ruw *RevisionUpdateWorker) Wait() error {
    59  	return ruw.tomb.Wait()
    60  }
    61  
    62  func (ruw *RevisionUpdateWorker) loop() error {
    63  	err := ruw.updateVersions()
    64  	if err != nil {
    65  		return err
    66  	}
    67  	for {
    68  		select {
    69  		case <-ruw.tomb.Dying():
    70  			return tomb.ErrDying
    71  		case <-time.After(interval):
    72  			err := ruw.updateVersions()
    73  			if err != nil {
    74  				return err
    75  			}
    76  		}
    77  	}
    78  }
    79  
    80  func (ruw *RevisionUpdateWorker) updateVersions() error {
    81  	return UpdateVersions(ruw)
    82  }
    83  
    84  var UpdateVersions = func(ruw *RevisionUpdateWorker) error {
    85  	if err := ruw.st.UpdateLatestRevisions(); err != nil {
    86  		logger.Errorf("cannot process charms: %v", err)
    87  		return errors.Annotatef(err, "failed updating charms")
    88  	}
    89  	return nil
    90  }