github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/cmd/jujud/agent/machine/manifolds_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machine_test
     5  
     6  import (
     7  	"sort"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	"github.com/juju/utils/set"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/agent"
    14  	"github.com/juju/juju/cmd/jujud/agent/machine"
    15  	"github.com/juju/juju/testing"
    16  	"github.com/juju/juju/worker"
    17  	"github.com/juju/juju/worker/dependency"
    18  	"github.com/juju/juju/worker/gate"
    19  )
    20  
    21  type ManifoldsSuite struct {
    22  	testing.BaseSuite
    23  }
    24  
    25  var _ = gc.Suite(&ManifoldsSuite{})
    26  
    27  func (*ManifoldsSuite) TestStartFuncs(c *gc.C) {
    28  	manifolds := machine.Manifolds(machine.ManifoldsConfig{
    29  		Agent: fakeAgent{},
    30  	})
    31  	for name, manifold := range manifolds {
    32  		c.Logf("checking %q manifold", name)
    33  		c.Check(manifold.Start, gc.NotNil)
    34  	}
    35  }
    36  
    37  func (*ManifoldsSuite) TestManifoldNames(c *gc.C) {
    38  	manifolds := machine.Manifolds(machine.ManifoldsConfig{})
    39  	keys := make([]string, 0, len(manifolds))
    40  	for k := range manifolds {
    41  		keys = append(keys, k)
    42  	}
    43  	sort.Strings(keys)
    44  	expectedKeys := []string{
    45  		"agent",
    46  		"api-address-updater",
    47  		"api-caller",
    48  		"api-config-watcher",
    49  		"disk-manager",
    50  		"host-key-reporter",
    51  		"log-sender",
    52  		"logging-config-updater",
    53  		"machine-action-runner",
    54  		"machiner",
    55  		"mgo-txn-resumer",
    56  		"migration-fortress",
    57  		"migration-minion",
    58  		"proxy-config-updater",
    59  		"reboot-executor",
    60  		"serving-info-setter",
    61  		"ssh-authkeys-updater",
    62  		"ssh-identity-writer",
    63  		"state",
    64  		"state-config-watcher",
    65  		"storage-provisioner",
    66  		"termination-signal-handler",
    67  		"tools-version-checker",
    68  		"unconverted-api-workers",
    69  		"unconverted-state-workers",
    70  		"unit-agent-deployer",
    71  		"upgrade-check-flag",
    72  		"upgrade-check-gate",
    73  		"upgrade-steps-flag",
    74  		"upgrade-steps-gate",
    75  		"upgrade-steps-runner",
    76  		"upgrader",
    77  	}
    78  	c.Assert(keys, jc.SameContents, expectedKeys)
    79  }
    80  
    81  func (*ManifoldsSuite) TestUpgradeGuardsUsed(c *gc.C) {
    82  	exempt := set.NewStrings(
    83  		"agent",
    84  		"api-caller",
    85  		"api-config-watcher",
    86  		"state",
    87  		"state-config-watcher",
    88  		"termination-signal-handler",
    89  		"unconverted-state-workers",
    90  		"upgrade-check-flag",
    91  		"upgrade-check-gate",
    92  		"upgrade-steps-flag",
    93  		"upgrade-steps-gate",
    94  		"upgrade-steps-runner",
    95  		"upgrader",
    96  	)
    97  	manifolds := machine.Manifolds(machine.ManifoldsConfig{})
    98  	keys := make([]string, 0, len(manifolds))
    99  	for key := range manifolds {
   100  		if !exempt.Contains(key) {
   101  			keys = append(keys, key)
   102  		}
   103  	}
   104  	for _, key := range keys {
   105  		c.Logf("checking %s...", key)
   106  		var sawCheck, sawSteps bool
   107  		for _, name := range manifolds[key].Inputs {
   108  			if name == "upgrade-check-flag" {
   109  				sawCheck = true
   110  			}
   111  			if name == "upgrade-steps-flag" {
   112  				sawSteps = true
   113  			}
   114  		}
   115  		c.Check(sawSteps, jc.IsTrue)
   116  		c.Check(sawCheck, jc.IsTrue)
   117  	}
   118  }
   119  
   120  func (*ManifoldsSuite) TestUpgradeGates(c *gc.C) {
   121  	upgradeStepsLock := gate.NewLock()
   122  	upgradeCheckLock := gate.NewLock()
   123  	manifolds := machine.Manifolds(machine.ManifoldsConfig{
   124  		UpgradeStepsLock: upgradeStepsLock,
   125  		UpgradeCheckLock: upgradeCheckLock,
   126  	})
   127  	assertGate(c, manifolds["upgrade-steps-gate"], upgradeStepsLock)
   128  	assertGate(c, manifolds["upgrade-check-gate"], upgradeCheckLock)
   129  }
   130  
   131  func assertGate(c *gc.C, manifold dependency.Manifold, unlocker gate.Unlocker) {
   132  	w, err := manifold.Start(nil)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	defer worker.Stop(w)
   135  
   136  	var waiter gate.Waiter
   137  	err = manifold.Output(w, &waiter)
   138  	c.Assert(err, jc.ErrorIsNil)
   139  
   140  	select {
   141  	case <-waiter.Unlocked():
   142  		c.Fatalf("expected gate to be locked")
   143  	default:
   144  	}
   145  
   146  	unlocker.Unlock()
   147  
   148  	select {
   149  	case <-waiter.Unlocked():
   150  	default:
   151  		c.Fatalf("expected gate to be unlocked")
   152  	}
   153  }
   154  
   155  type fakeAgent struct {
   156  	agent.Agent
   157  }