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  }