github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/core/description/unit_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package description 5 6 import ( 7 "github.com/juju/names" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 "gopkg.in/yaml.v2" 11 ) 12 13 type UnitSerializationSuite struct { 14 SliceSerializationSuite 15 } 16 17 var _ = gc.Suite(&UnitSerializationSuite{}) 18 19 func (s *UnitSerializationSuite) SetUpTest(c *gc.C) { 20 s.SliceSerializationSuite.SetUpTest(c) 21 s.importName = "units" 22 s.sliceName = "units" 23 s.importFunc = func(m map[string]interface{}) (interface{}, error) { 24 return importUnits(m) 25 } 26 s.testFields = func(m map[string]interface{}) { 27 m["units"] = []interface{}{} 28 } 29 } 30 31 func minimalUnitMap() map[interface{}]interface{} { 32 return map[interface{}]interface{}{ 33 "name": "ubuntu/0", 34 "machine": "0", 35 "agent-status": minimalStatusMap(), 36 "agent-status-history": emptyStatusHistoryMap(), 37 "workload-status": minimalStatusMap(), 38 "workload-status-history": emptyStatusHistoryMap(), 39 "password-hash": "secure-hash", 40 "tools": minimalAgentToolsMap(), 41 } 42 } 43 44 func minimalUnit() *unit { 45 u := newUnit(minimalUnitArgs()) 46 u.SetAgentStatus(minimalStatusArgs()) 47 u.SetWorkloadStatus(minimalStatusArgs()) 48 u.SetTools(minimalAgentToolsArgs()) 49 return u 50 } 51 52 func minimalUnitArgs() UnitArgs { 53 return UnitArgs{ 54 Tag: names.NewUnitTag("ubuntu/0"), 55 Machine: names.NewMachineTag("0"), 56 PasswordHash: "secure-hash", 57 } 58 } 59 60 func (s *UnitSerializationSuite) completeUnit() *unit { 61 // This unit is about completeness, not reasonableness. That is why the 62 // unit has a principle (normally only for subordinates), and also a list 63 // of subordinates. 64 args := UnitArgs{ 65 Tag: names.NewUnitTag("ubuntu/0"), 66 Machine: names.NewMachineTag("0"), 67 PasswordHash: "secure-hash", 68 Principal: names.NewUnitTag("principal/0"), 69 Subordinates: []names.UnitTag{ 70 names.NewUnitTag("sub1/0"), 71 names.NewUnitTag("sub2/0"), 72 }, 73 MeterStatusCode: "meter code", 74 MeterStatusInfo: "meter info", 75 } 76 unit := newUnit(args) 77 unit.SetAgentStatus(minimalStatusArgs()) 78 unit.SetWorkloadStatus(minimalStatusArgs()) 79 unit.SetTools(minimalAgentToolsArgs()) 80 return unit 81 } 82 83 func (s *UnitSerializationSuite) TestNewUnit(c *gc.C) { 84 unit := s.completeUnit() 85 86 c.Assert(unit.Tag(), gc.Equals, names.NewUnitTag("ubuntu/0")) 87 c.Assert(unit.Name(), gc.Equals, "ubuntu/0") 88 c.Assert(unit.Machine(), gc.Equals, names.NewMachineTag("0")) 89 c.Assert(unit.PasswordHash(), gc.Equals, "secure-hash") 90 c.Assert(unit.Principal(), gc.Equals, names.NewUnitTag("principal/0")) 91 c.Assert(unit.Subordinates(), jc.DeepEquals, []names.UnitTag{ 92 names.NewUnitTag("sub1/0"), 93 names.NewUnitTag("sub2/0"), 94 }) 95 c.Assert(unit.MeterStatusCode(), gc.Equals, "meter code") 96 c.Assert(unit.MeterStatusInfo(), gc.Equals, "meter info") 97 c.Assert(unit.Tools(), gc.NotNil) 98 c.Assert(unit.WorkloadStatus(), gc.NotNil) 99 c.Assert(unit.AgentStatus(), gc.NotNil) 100 } 101 102 func (s *UnitSerializationSuite) TestMinimalUnitValid(c *gc.C) { 103 unit := minimalUnit() 104 c.Assert(unit.Validate(), jc.ErrorIsNil) 105 } 106 107 func (s *UnitSerializationSuite) TestMinimalMatches(c *gc.C) { 108 bytes, err := yaml.Marshal(minimalUnit()) 109 c.Assert(err, jc.ErrorIsNil) 110 111 var source map[interface{}]interface{} 112 err = yaml.Unmarshal(bytes, &source) 113 c.Assert(err, jc.ErrorIsNil) 114 c.Assert(source, jc.DeepEquals, minimalUnitMap()) 115 } 116 117 func (s *UnitSerializationSuite) exportImport(c *gc.C, unit_ *unit) *unit { 118 initial := units{ 119 Version: 1, 120 Units_: []*unit{unit_}, 121 } 122 123 bytes, err := yaml.Marshal(initial) 124 c.Assert(err, jc.ErrorIsNil) 125 126 var source map[string]interface{} 127 err = yaml.Unmarshal(bytes, &source) 128 c.Assert(err, jc.ErrorIsNil) 129 130 units, err := importUnits(source) 131 c.Assert(err, jc.ErrorIsNil) 132 c.Assert(units, gc.HasLen, 1) 133 return units[0] 134 } 135 136 func (s *UnitSerializationSuite) TestParsingSerializedData(c *gc.C) { 137 initial := s.completeUnit() 138 unit := s.exportImport(c, initial) 139 c.Assert(unit, jc.DeepEquals, initial) 140 } 141 142 func (s *UnitSerializationSuite) TestAnnotations(c *gc.C) { 143 initial := minimalUnit() 144 annotations := map[string]string{ 145 "string": "value", 146 "another": "one", 147 } 148 initial.SetAnnotations(annotations) 149 150 unit := s.exportImport(c, initial) 151 c.Assert(unit.Annotations(), jc.DeepEquals, annotations) 152 } 153 154 func (s *UnitSerializationSuite) TestConstraints(c *gc.C) { 155 initial := minimalUnit() 156 args := ConstraintsArgs{ 157 Architecture: "amd64", 158 Memory: 8 * gig, 159 RootDisk: 40 * gig, 160 } 161 initial.SetConstraints(args) 162 163 unit := s.exportImport(c, initial) 164 c.Assert(unit.Constraints(), jc.DeepEquals, newConstraints(args)) 165 } 166 167 func (s *UnitSerializationSuite) TestAgentStatusHistory(c *gc.C) { 168 initial := minimalUnit() 169 args := testStatusHistoryArgs() 170 initial.SetAgentStatusHistory(args) 171 172 unit := s.exportImport(c, initial) 173 for i, point := range unit.AgentStatusHistory() { 174 c.Check(point.Value(), gc.Equals, args[i].Value) 175 c.Check(point.Message(), gc.Equals, args[i].Message) 176 c.Check(point.Data(), jc.DeepEquals, args[i].Data) 177 c.Check(point.Updated(), gc.Equals, args[i].Updated) 178 } 179 } 180 181 func (s *UnitSerializationSuite) TestWorkloadStatusHistory(c *gc.C) { 182 initial := minimalUnit() 183 args := testStatusHistoryArgs() 184 initial.SetWorkloadStatusHistory(args) 185 186 unit := s.exportImport(c, initial) 187 for i, point := range unit.WorkloadStatusHistory() { 188 c.Check(point.Value(), gc.Equals, args[i].Value) 189 c.Check(point.Message(), gc.Equals, args[i].Message) 190 c.Check(point.Data(), jc.DeepEquals, args[i].Data) 191 c.Check(point.Updated(), gc.Equals, args[i].Updated) 192 } 193 }