github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/payloadshookcontext/unitfacade_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package payloadshookcontext_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/charm.v6"
    12  	"gopkg.in/juju/names.v2"
    13  
    14  	"github.com/juju/juju/apiserver/common"
    15  	unitfacade "github.com/juju/juju/apiserver/facades/agent/payloadshookcontext"
    16  	"github.com/juju/juju/apiserver/params"
    17  	"github.com/juju/juju/payload"
    18  )
    19  
    20  var _ = gc.Suite(&suite{})
    21  
    22  type suite struct {
    23  	testing.IsolationSuite
    24  
    25  	stub  *testing.Stub
    26  	state *FakeState
    27  }
    28  
    29  func (s *suite) SetUpTest(c *gc.C) {
    30  	s.IsolationSuite.SetUpTest(c)
    31  
    32  	s.stub = &testing.Stub{}
    33  	s.state = &FakeState{stub: s.stub}
    34  }
    35  
    36  func (s *suite) TestTrack(c *gc.C) {
    37  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
    38  	s.state.stateIDs = []string{id}
    39  
    40  	a := unitfacade.NewUnitFacade(s.state)
    41  
    42  	args := params.TrackPayloadArgs{
    43  		Payloads: []params.Payload{{
    44  			Class:  "idfoo",
    45  			Type:   "type",
    46  			ID:     "bar",
    47  			Status: payload.StateRunning,
    48  		}},
    49  	}
    50  
    51  	res, err := a.Track(args)
    52  	c.Assert(err, jc.ErrorIsNil)
    53  
    54  	c.Check(res, jc.DeepEquals, params.PayloadResults{
    55  		Results: []params.PayloadResult{{
    56  			Entity: params.Entity{
    57  				Tag: names.NewPayloadTag(id).String(),
    58  			},
    59  			Payload:  nil,
    60  			NotFound: false,
    61  			Error:    nil,
    62  		}},
    63  	})
    64  
    65  	c.Check(s.state.payload, jc.DeepEquals, payload.Payload{
    66  		PayloadClass: charm.PayloadClass{
    67  			Name: "idfoo",
    68  			Type: "type",
    69  		},
    70  		Status: payload.StateRunning,
    71  		Labels: []string{},
    72  		ID:     "bar",
    73  	})
    74  }
    75  
    76  func (s *suite) TestListOne(c *gc.C) {
    77  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
    78  	pl := payload.Payload{
    79  		PayloadClass: charm.PayloadClass{
    80  			Name: "foobar",
    81  			Type: "type",
    82  		},
    83  		ID:     "idfoo",
    84  		Status: payload.StateRunning,
    85  		Unit:   "a-application/0",
    86  	}
    87  	s.state.payloads = []payload.Result{{
    88  		ID: id,
    89  		Payload: &payload.FullPayloadInfo{
    90  			Payload: pl,
    91  			Machine: "1",
    92  		},
    93  	}}
    94  
    95  	a := unitfacade.NewUnitFacade(s.state)
    96  	args := params.Entities{
    97  		Entities: []params.Entity{{
    98  			Tag: names.NewPayloadTag(id).String(),
    99  		}},
   100  	}
   101  	results, err := a.List(args)
   102  	c.Assert(err, jc.ErrorIsNil)
   103  
   104  	expected := params.Payload{
   105  		Class:   "foobar",
   106  		Type:    "type",
   107  		ID:      "idfoo",
   108  		Status:  payload.StateRunning,
   109  		Labels:  []string{},
   110  		Unit:    "unit-a-application-0",
   111  		Machine: "machine-1",
   112  	}
   113  
   114  	c.Check(results, jc.DeepEquals, params.PayloadResults{
   115  		Results: []params.PayloadResult{{
   116  			Entity: params.Entity{
   117  				Tag: names.NewPayloadTag(id).String(),
   118  			},
   119  			Payload:  &expected,
   120  			NotFound: false,
   121  			Error:    nil,
   122  		}},
   123  	})
   124  }
   125  
   126  func (s *suite) TestListAll(c *gc.C) {
   127  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
   128  	s.state.stateIDs = []string{id}
   129  	pl := payload.Payload{
   130  		PayloadClass: charm.PayloadClass{
   131  			Name: "foobar",
   132  			Type: "type",
   133  		},
   134  		ID:     "idfoo",
   135  		Status: payload.StateRunning,
   136  		Unit:   "a-application/0",
   137  	}
   138  	s.state.payloads = []payload.Result{{
   139  		ID: id,
   140  		Payload: &payload.FullPayloadInfo{
   141  			Payload: pl,
   142  			Machine: "1",
   143  		},
   144  	}}
   145  
   146  	a := unitfacade.NewUnitFacade(s.state)
   147  	args := params.Entities{}
   148  	results, err := a.List(args)
   149  	c.Assert(err, jc.ErrorIsNil)
   150  
   151  	expected := params.Payload{
   152  		Class:   "foobar",
   153  		Type:    "type",
   154  		ID:      "idfoo",
   155  		Status:  payload.StateRunning,
   156  		Labels:  []string{},
   157  		Unit:    "unit-a-application-0",
   158  		Machine: "machine-1",
   159  	}
   160  	c.Check(results, jc.DeepEquals, params.PayloadResults{
   161  		Results: []params.PayloadResult{{
   162  			Entity: params.Entity{
   163  				Tag: names.NewPayloadTag(id).String(),
   164  			},
   165  			Payload:  &expected,
   166  			NotFound: false,
   167  			Error:    nil,
   168  		}},
   169  	})
   170  }
   171  
   172  func (s *suite) TestLookUpOkay(c *gc.C) {
   173  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
   174  	s.state.stateIDs = []string{id}
   175  
   176  	a := unitfacade.NewUnitFacade(s.state)
   177  	args := params.LookUpPayloadArgs{
   178  		Args: []params.LookUpPayloadArg{{
   179  			Name: "fooID",
   180  			ID:   "bar",
   181  		}},
   182  	}
   183  	res, err := a.LookUp(args)
   184  	c.Assert(err, jc.ErrorIsNil)
   185  
   186  	s.stub.CheckCalls(c, []testing.StubCall{{
   187  		FuncName: "LookUp",
   188  		Args:     []interface{}{"fooID", "bar"},
   189  	}})
   190  
   191  	c.Check(res, jc.DeepEquals, params.PayloadResults{
   192  		Results: []params.PayloadResult{{
   193  			Entity: params.Entity{
   194  				Tag: names.NewPayloadTag(id).String(),
   195  			},
   196  			NotFound: false,
   197  			Error:    nil,
   198  		}},
   199  	})
   200  }
   201  
   202  func (s *suite) TestLookUpMixed(c *gc.C) {
   203  	s.state.stateIDs = []string{
   204  		"ce5bc2a7-65d8-4800-8199-a7c3356ab309",
   205  		"",
   206  		"ce5bc2a7-65d8-4800-8199-a7c3356ab311",
   207  	}
   208  	notFound := errors.NotFoundf("payload")
   209  	s.stub.SetErrors(nil, notFound, nil)
   210  
   211  	a := unitfacade.NewUnitFacade(s.state)
   212  	args := params.LookUpPayloadArgs{
   213  		Args: []params.LookUpPayloadArg{{
   214  			Name: "fooID",
   215  			ID:   "bar",
   216  		}, {
   217  			Name: "bazID",
   218  			ID:   "bam",
   219  		}, {
   220  			Name: "spam",
   221  			ID:   "eggs",
   222  		}},
   223  	}
   224  	res, err := a.LookUp(args)
   225  	c.Assert(err, jc.ErrorIsNil)
   226  
   227  	s.stub.CheckCallNames(c, "LookUp", "LookUp", "LookUp")
   228  	c.Check(res, jc.DeepEquals, params.PayloadResults{
   229  		Results: []params.PayloadResult{{
   230  			Entity: params.Entity{
   231  				Tag: names.NewPayloadTag("ce5bc2a7-65d8-4800-8199-a7c3356ab309").String(),
   232  			},
   233  			NotFound: false,
   234  			Error:    nil,
   235  		}, {
   236  			Entity: params.Entity{
   237  				Tag: "",
   238  			},
   239  			NotFound: true,
   240  			Error:    common.ServerError(notFound),
   241  		}, {
   242  			Entity: params.Entity{
   243  				Tag: names.NewPayloadTag("ce5bc2a7-65d8-4800-8199-a7c3356ab311").String(),
   244  			},
   245  			NotFound: false,
   246  			Error:    nil,
   247  		}},
   248  	})
   249  }
   250  
   251  func (s *suite) TestSetStatus(c *gc.C) {
   252  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
   253  	s.state.stateIDs = []string{id}
   254  	s.state.stateIDs = []string{"ce5bc2a7-65d8-4800-8199-a7c3356ab309"}
   255  
   256  	a := unitfacade.NewUnitFacade(s.state)
   257  	args := params.SetPayloadStatusArgs{
   258  		Args: []params.SetPayloadStatusArg{{
   259  			Entity: params.Entity{
   260  				Tag: names.NewPayloadTag(id).String(),
   261  			},
   262  			Status: payload.StateRunning,
   263  		}},
   264  	}
   265  	res, err := a.SetStatus(args)
   266  	c.Assert(err, jc.ErrorIsNil)
   267  
   268  	c.Check(s.state.id, gc.Equals, id)
   269  	c.Assert(s.state.status, gc.Equals, payload.StateRunning)
   270  
   271  	expected := params.PayloadResults{
   272  		Results: []params.PayloadResult{{
   273  			Entity: params.Entity{
   274  				Tag: names.NewPayloadTag(id).String(),
   275  			},
   276  			Error: nil,
   277  		}},
   278  	}
   279  	c.Assert(res, gc.DeepEquals, expected)
   280  }
   281  
   282  func (s *suite) TestUntrack(c *gc.C) {
   283  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
   284  	s.state.stateIDs = []string{id}
   285  
   286  	a := unitfacade.NewUnitFacade(s.state)
   287  	args := params.Entities{
   288  		Entities: []params.Entity{{
   289  			Tag: names.NewPayloadTag(id).String(),
   290  		}},
   291  	}
   292  	res, err := a.Untrack(args)
   293  	c.Assert(err, jc.ErrorIsNil)
   294  
   295  	c.Assert(s.state.id, gc.Equals, id)
   296  
   297  	expected := params.PayloadResults{
   298  		Results: []params.PayloadResult{{
   299  			Entity: params.Entity{
   300  				Tag: names.NewPayloadTag(id).String(),
   301  			},
   302  			Error: nil,
   303  		}},
   304  	}
   305  	c.Assert(res, gc.DeepEquals, expected)
   306  }
   307  
   308  func (s *suite) TestUntrackEmptyID(c *gc.C) {
   309  	a := unitfacade.NewUnitFacade(s.state)
   310  	args := params.Entities{
   311  		Entities: []params.Entity{{
   312  			Tag: "",
   313  		}},
   314  	}
   315  	res, err := a.Untrack(args)
   316  	c.Assert(err, jc.ErrorIsNil)
   317  
   318  	c.Assert(s.state.id, gc.Equals, "")
   319  
   320  	expected := params.PayloadResults{
   321  		Results: []params.PayloadResult{{
   322  			Entity: params.Entity{
   323  				Tag: "",
   324  			},
   325  			Error: nil,
   326  		}},
   327  	}
   328  	c.Assert(res, gc.DeepEquals, expected)
   329  }
   330  
   331  func (s *suite) TestUntrackNoIDs(c *gc.C) {
   332  	id := "ce5bc2a7-65d8-4800-8199-a7c3356ab309"
   333  	s.state.id = id
   334  
   335  	a := unitfacade.NewUnitFacade(s.state)
   336  	args := params.Entities{
   337  		Entities: []params.Entity{},
   338  	}
   339  	res, err := a.Untrack(args)
   340  	c.Assert(err, jc.ErrorIsNil)
   341  
   342  	c.Assert(s.state.id, gc.Equals, id)
   343  
   344  	expected := params.PayloadResults{}
   345  	c.Assert(res, gc.DeepEquals, expected)
   346  }
   347  
   348  type FakeState struct {
   349  	stub *testing.Stub
   350  
   351  	// inputs
   352  	id      string
   353  	ids     []string
   354  	status  string
   355  	payload payload.Payload
   356  
   357  	//outputs
   358  	stateIDs []string
   359  	payloads []payload.Result
   360  }
   361  
   362  func (f *FakeState) nextID() string {
   363  	if len(f.stateIDs) == 0 {
   364  		return ""
   365  	}
   366  	id := f.stateIDs[0]
   367  	f.stateIDs = f.stateIDs[1:]
   368  	return id
   369  }
   370  
   371  func (f *FakeState) Track(pl payload.Payload) error {
   372  	f.payload = pl
   373  	if err := f.stub.NextErr(); err != nil {
   374  		return errors.Trace(err)
   375  	}
   376  
   377  	return nil
   378  }
   379  
   380  func (f *FakeState) List(ids ...string) ([]payload.Result, error) {
   381  	f.ids = ids
   382  	if err := f.stub.NextErr(); err != nil {
   383  		return nil, errors.Trace(err)
   384  	}
   385  
   386  	return f.payloads, nil
   387  }
   388  
   389  func (f *FakeState) SetStatus(id, status string) error {
   390  	f.id = id
   391  	f.status = status
   392  	if err := f.stub.NextErr(); err != nil {
   393  		return errors.Trace(err)
   394  	}
   395  
   396  	return nil
   397  }
   398  
   399  func (f *FakeState) LookUp(name, rawID string) (string, error) {
   400  	f.stub.AddCall("LookUp", name, rawID)
   401  	id := f.nextID()
   402  	if err := f.stub.NextErr(); err != nil {
   403  		return "", errors.Trace(err)
   404  	}
   405  
   406  	return id, nil
   407  }
   408  
   409  func (f *FakeState) Untrack(id string) error {
   410  	f.id = id
   411  	if err := f.stub.NextErr(); err != nil {
   412  		return errors.Trace(err)
   413  	}
   414  
   415  	return nil
   416  }