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