github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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/loggo"
    11  	"launchpad.net/tomb"
    12  
    13  	"github.com/juju/juju/state/api/charmrevisionupdater"
    14  	"github.com/juju/juju/worker"
    15  )
    16  
    17  var logger = loggo.GetLogger("juju.worker.charmrevisionworker")
    18  
    19  // interval sets how often the resuming is called.
    20  var interval = 24 * time.Hour
    21  
    22  var _ worker.Worker = (*RevisionUpdateWorker)(nil)
    23  
    24  // RevisionUpdateWorker is responsible for a periodical retrieval of charm versions
    25  // from the charm store, and recording the revision status for deployed charms.
    26  type RevisionUpdateWorker struct {
    27  	st   *charmrevisionupdater.State
    28  	tomb tomb.Tomb
    29  }
    30  
    31  // NewRevisionUpdateWorker periodically retrieves charm versions from the charm store.
    32  func NewRevisionUpdateWorker(st *charmrevisionupdater.State) *RevisionUpdateWorker {
    33  	ruw := &RevisionUpdateWorker{st: st}
    34  	go func() {
    35  		defer ruw.tomb.Done()
    36  		ruw.tomb.Kill(ruw.loop())
    37  	}()
    38  	return ruw
    39  }
    40  
    41  func (ruw *RevisionUpdateWorker) String() string {
    42  	return fmt.Sprintf("charm version lookup worker")
    43  }
    44  
    45  // Stop stops the worker.
    46  func (ruw *RevisionUpdateWorker) Stop() error {
    47  	ruw.tomb.Kill(nil)
    48  	return ruw.tomb.Wait()
    49  }
    50  
    51  // Kill is defined on the worker.Worker interface.
    52  func (ruw *RevisionUpdateWorker) Kill() {
    53  	ruw.tomb.Kill(nil)
    54  }
    55  
    56  // Wait is defined on the worker.Worker interface.
    57  func (ruw *RevisionUpdateWorker) Wait() error {
    58  	return ruw.tomb.Wait()
    59  }
    60  
    61  func (ruw *RevisionUpdateWorker) loop() error {
    62  	ruw.updateVersions()
    63  	for {
    64  		select {
    65  		case <-ruw.tomb.Dying():
    66  			return tomb.ErrDying
    67  		case <-time.After(interval):
    68  			ruw.updateVersions()
    69  		}
    70  	}
    71  }
    72  
    73  func (ruw *RevisionUpdateWorker) updateVersions() {
    74  	if err := ruw.st.UpdateLatestRevisions(); err != nil {
    75  		logger.Errorf("cannot process charms: %v", err)
    76  	}
    77  }