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 }