github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/payloads_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 "gopkg.in/juju/charm.v6-unstable" 11 12 "github.com/juju/juju/component/all" 13 "github.com/juju/juju/payload" 14 "github.com/juju/juju/state" 15 ) 16 17 func init() { 18 if err := all.RegisterForServer(); err != nil { 19 panic(err) 20 } 21 } 22 23 var ( 24 _ = gc.Suite(&envPayloadsSuite{}) 25 _ = gc.Suite(&unitPayloadsSuite{}) 26 ) 27 28 type envPayloadsSuite struct { 29 ConnSuite 30 } 31 32 func (s *envPayloadsSuite) TestFunctional(c *gc.C) { 33 machine := "0" 34 unit := addUnit(c, s.ConnSuite, unitArgs{ 35 charm: "dummy", 36 service: "a-service", 37 metadata: payloadsMetaYAML, 38 machine: machine, 39 }) 40 41 ust, err := s.State.UnitPayloads(unit) 42 c.Assert(err, jc.ErrorIsNil) 43 44 st, err := s.State.EnvPayloads() 45 c.Assert(err, jc.ErrorIsNil) 46 47 payloads, err := st.ListAll() 48 c.Assert(err, jc.ErrorIsNil) 49 c.Check(payloads, gc.HasLen, 0) 50 51 err = ust.Track(payload.Payload{ 52 PayloadClass: charm.PayloadClass{ 53 Name: "payloadA", 54 Type: "docker", 55 }, 56 Status: payload.StateRunning, 57 ID: "xyz", 58 Unit: "a-service/0", 59 }) 60 c.Assert(err, jc.ErrorIsNil) 61 62 unitPayloads, err := ust.List() 63 c.Assert(err, jc.ErrorIsNil) 64 c.Assert(unitPayloads, gc.HasLen, 1) 65 66 payloads, err = st.ListAll() 67 c.Assert(err, jc.ErrorIsNil) 68 c.Check(payloads, jc.DeepEquals, []payload.FullPayloadInfo{{ 69 Payload: payload.Payload{ 70 PayloadClass: charm.PayloadClass{ 71 Name: "payloadA", 72 Type: "docker", 73 }, 74 ID: "xyz", 75 Status: payload.StateRunning, 76 Labels: []string{}, 77 Unit: "a-service/0", 78 }, 79 Machine: machine, 80 }}) 81 82 id, err := ust.LookUp("payloadA", "xyz") 83 c.Assert(err, jc.ErrorIsNil) 84 85 err = ust.Untrack(id) 86 c.Assert(err, jc.ErrorIsNil) 87 88 payloads, err = st.ListAll() 89 c.Assert(err, jc.ErrorIsNil) 90 c.Check(payloads, gc.HasLen, 0) 91 } 92 93 type unitPayloadsSuite struct { 94 ConnSuite 95 } 96 97 func (s *unitPayloadsSuite) TestFunctional(c *gc.C) { 98 machine := "0" 99 unit := addUnit(c, s.ConnSuite, unitArgs{ 100 charm: "dummy", 101 service: "a-service", 102 metadata: payloadsMetaYAML, 103 machine: machine, 104 }) 105 106 st, err := s.State.UnitPayloads(unit) 107 c.Assert(err, jc.ErrorIsNil) 108 109 results, err := st.List() 110 c.Assert(err, jc.ErrorIsNil) 111 c.Check(results, gc.HasLen, 0) 112 113 pl := payload.Payload{ 114 PayloadClass: charm.PayloadClass{ 115 Name: "payloadA", 116 Type: "docker", 117 }, 118 ID: "xyz", 119 Status: payload.StateRunning, 120 Unit: "a-service/0", 121 } 122 err = st.Track(pl) 123 c.Assert(err, jc.ErrorIsNil) 124 125 results, err = st.List() 126 c.Assert(err, jc.ErrorIsNil) 127 // TODO(ericsnow) Once Track returns the new ID we can drop 128 // the following two lines. 129 c.Assert(results, gc.HasLen, 1) 130 id := results[0].ID 131 c.Check(results, jc.DeepEquals, []payload.Result{{ 132 ID: id, 133 Payload: &payload.FullPayloadInfo{ 134 Payload: pl, 135 Machine: machine, 136 }, 137 }}) 138 139 lookedUpID, err := st.LookUp("payloadA", "xyz") 140 c.Assert(err, jc.ErrorIsNil) 141 c.Check(lookedUpID, gc.Equals, id) 142 143 c.Logf("using ID %q", id) 144 results, err = st.List(id) 145 c.Assert(err, jc.ErrorIsNil) 146 c.Check(results, jc.DeepEquals, []payload.Result{{ 147 ID: id, 148 Payload: &payload.FullPayloadInfo{ 149 Payload: pl, 150 Machine: machine, 151 }, 152 }}) 153 154 err = st.SetStatus(id, "running") 155 c.Assert(err, jc.ErrorIsNil) 156 157 results, err = st.List(id) 158 c.Assert(err, jc.ErrorIsNil) 159 c.Check(results, jc.DeepEquals, []payload.Result{{ 160 ID: id, 161 Payload: &payload.FullPayloadInfo{ 162 Payload: pl, 163 Machine: machine, 164 }, 165 }}) 166 167 // Ensure duplicates are not allowed. 168 err = st.Track(pl) 169 c.Check(err, jc.Satisfies, errors.IsAlreadyExists) 170 results, err = st.List() 171 c.Assert(err, jc.ErrorIsNil) 172 c.Check(results, gc.HasLen, 1) 173 174 err = st.Untrack(id) 175 c.Assert(err, jc.ErrorIsNil) 176 177 results, err = st.List() 178 c.Assert(err, jc.ErrorIsNil) 179 c.Check(results, gc.HasLen, 0) 180 } 181 182 const payloadsMetaYAML = ` 183 name: a-charm 184 summary: a charm... 185 description: a charm... 186 payloads: 187 payloadA: 188 type: docker 189 ` 190 191 type unitArgs struct { 192 charm string 193 service string 194 metadata string 195 machine string 196 } 197 198 func addUnit(c *gc.C, s ConnSuite, args unitArgs) *state.Unit { 199 ch := s.AddTestingCharm(c, args.charm) 200 ch = s.AddMetaCharm(c, args.charm, args.metadata, 2) 201 202 svc := s.AddTestingService(c, args.service, ch) 203 unit, err := svc.AddUnit() 204 c.Assert(err, jc.ErrorIsNil) 205 206 // TODO(ericsnow) Explicitly: call unit.AssignToMachine(m)? 207 c.Assert(args.machine, gc.Equals, "0") 208 err = unit.AssignToNewMachine() // machine "0" 209 c.Assert(err, jc.ErrorIsNil) 210 211 return unit 212 }