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