github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/uniter/hook/hook.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // hook provides types that define the hooks known to the Uniter
     5  package hook
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"gopkg.in/juju/charm.v6-unstable/hooks"
    11  	"gopkg.in/juju/names.v2"
    12  )
    13  
    14  // TODO(fwereade): move these definitions to juju/charm/hooks.
    15  const (
    16  	LeaderElected         hooks.Kind = "leader-elected"
    17  	LeaderDeposed         hooks.Kind = "leader-deposed"
    18  	LeaderSettingsChanged hooks.Kind = "leader-settings-changed"
    19  )
    20  
    21  // Info holds details required to execute a hook. Not all fields are
    22  // relevant to all Kind values.
    23  type Info struct {
    24  	Kind hooks.Kind `yaml:"kind"`
    25  
    26  	// RelationId identifies the relation associated with the hook. It is
    27  	// only set when Kind indicates a relation hook.
    28  	RelationId int `yaml:"relation-id,omitempty"`
    29  
    30  	// RemoteUnit is the name of the unit that triggered the hook. It is only
    31  	// set when Kind indicates a relation hook other than relation-broken.
    32  	RemoteUnit string `yaml:"remote-unit,omitempty"`
    33  
    34  	// ChangeVersion identifies the most recent unit settings change
    35  	// associated with RemoteUnit. It is only set when RemoteUnit is set.
    36  	ChangeVersion int64 `yaml:"change-version,omitempty"`
    37  
    38  	// StorageId is the ID of the storage instance relevant to the hook.
    39  	StorageId string `yaml:"storage-id,omitempty"`
    40  }
    41  
    42  // Validate returns an error if the info is not valid.
    43  func (hi Info) Validate() error {
    44  	switch hi.Kind {
    45  	case hooks.RelationJoined, hooks.RelationChanged, hooks.RelationDeparted:
    46  		if hi.RemoteUnit == "" {
    47  			return fmt.Errorf("%q hook requires a remote unit", hi.Kind)
    48  		}
    49  		fallthrough
    50  	case hooks.Install, hooks.Start, hooks.ConfigChanged, hooks.UpgradeCharm, hooks.Stop, hooks.RelationBroken,
    51  		hooks.CollectMetrics, hooks.MeterStatusChanged, hooks.UpdateStatus:
    52  		return nil
    53  	case hooks.Action:
    54  		return fmt.Errorf("hooks.Kind Action is deprecated")
    55  	case hooks.StorageAttached, hooks.StorageDetaching:
    56  		if !names.IsValidStorage(hi.StorageId) {
    57  			return fmt.Errorf("invalid storage ID %q", hi.StorageId)
    58  		}
    59  		return nil
    60  	// TODO(fwereade): define these in charm/hooks...
    61  	case LeaderElected, LeaderDeposed, LeaderSettingsChanged:
    62  		return nil
    63  	}
    64  	return fmt.Errorf("unknown hook kind %q", hi.Kind)
    65  }
    66  
    67  // Committer is an interface that may be used to convey the fact that the
    68  // specified hook has been successfully executed, and committed.
    69  type Committer interface {
    70  	CommitHook(Info) error
    71  }
    72  
    73  // Validator is an interface that may be used to validate a hook execution
    74  // request prior to executing it.
    75  type Validator interface {
    76  	ValidateHook(Info) error
    77  }