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  }