github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/service/client_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package service_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  	"gopkg.in/juju/charm.v6-unstable"
    10  
    11  	"github.com/juju/juju/api/service"
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/params"
    14  	"github.com/juju/juju/charmstore"
    15  	"github.com/juju/juju/constraints"
    16  	"github.com/juju/juju/instance"
    17  	jujutesting "github.com/juju/juju/juju/testing"
    18  	"github.com/juju/juju/storage"
    19  )
    20  
    21  type serviceSuite struct {
    22  	jujutesting.JujuConnSuite
    23  
    24  	client *service.Client
    25  }
    26  
    27  var _ = gc.Suite(&serviceSuite{})
    28  
    29  func (s *serviceSuite) SetUpTest(c *gc.C) {
    30  	s.JujuConnSuite.SetUpTest(c)
    31  	s.client = service.NewClient(s.APIState)
    32  	c.Assert(s.client, gc.NotNil)
    33  }
    34  
    35  func (s *serviceSuite) TestSetServiceMetricCredentials(c *gc.C) {
    36  	var called bool
    37  	service.PatchFacadeCall(s, s.client, func(request string, a, response interface{}) error {
    38  		called = true
    39  		c.Assert(request, gc.Equals, "SetMetricCredentials")
    40  		args, ok := a.(params.ServiceMetricCredentials)
    41  		c.Assert(ok, jc.IsTrue)
    42  		c.Assert(args.Creds, gc.HasLen, 1)
    43  		c.Assert(args.Creds[0].ServiceName, gc.Equals, "serviceA")
    44  		c.Assert(args.Creds[0].MetricCredentials, gc.DeepEquals, []byte("creds 1"))
    45  
    46  		result := response.(*params.ErrorResults)
    47  		result.Results = make([]params.ErrorResult, 1)
    48  		return nil
    49  	})
    50  	err := s.client.SetMetricCredentials("serviceA", []byte("creds 1"))
    51  	c.Assert(err, jc.ErrorIsNil)
    52  	c.Assert(called, jc.IsTrue)
    53  }
    54  
    55  func (s *serviceSuite) TestSetServiceMetricCredentialsFails(c *gc.C) {
    56  	var called bool
    57  	service.PatchFacadeCall(s, s.client, func(request string, args, response interface{}) error {
    58  		called = true
    59  		c.Assert(request, gc.Equals, "SetMetricCredentials")
    60  		result := response.(*params.ErrorResults)
    61  		result.Results = make([]params.ErrorResult, 1)
    62  		result.Results[0].Error = common.ServerError(common.ErrPerm)
    63  		return result.OneError()
    64  	})
    65  	err := s.client.SetMetricCredentials("service", []byte("creds"))
    66  	c.Assert(err, gc.ErrorMatches, "permission denied")
    67  	c.Assert(called, jc.IsTrue)
    68  }
    69  
    70  func (s *serviceSuite) TestSetServiceMetricCredentialsNoMocks(c *gc.C) {
    71  	service := s.Factory.MakeService(c, nil)
    72  	err := s.client.SetMetricCredentials(service.Name(), []byte("creds"))
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	err = service.Refresh()
    75  	c.Assert(err, jc.ErrorIsNil)
    76  	c.Assert(service.MetricCredentials(), gc.DeepEquals, []byte("creds"))
    77  }
    78  
    79  func (s *serviceSuite) TestSetServiceDeploy(c *gc.C) {
    80  	var called bool
    81  	service.PatchFacadeCall(s, s.client, func(request string, a, response interface{}) error {
    82  		called = true
    83  		c.Assert(request, gc.Equals, "Deploy")
    84  		args, ok := a.(params.ServicesDeploy)
    85  		c.Assert(ok, jc.IsTrue)
    86  		c.Assert(args.Services, gc.HasLen, 1)
    87  		c.Assert(args.Services[0].CharmUrl, gc.Equals, "cs:trusty/a-charm-1")
    88  		c.Assert(args.Services[0].ServiceName, gc.Equals, "serviceA")
    89  		c.Assert(args.Services[0].Series, gc.Equals, "series")
    90  		c.Assert(args.Services[0].NumUnits, gc.Equals, 2)
    91  		c.Assert(args.Services[0].ConfigYAML, gc.Equals, "configYAML")
    92  		c.Assert(args.Services[0].Constraints, gc.DeepEquals, constraints.MustParse("mem=4G"))
    93  		c.Assert(args.Services[0].Placement, gc.DeepEquals, []*instance.Placement{{"scope", "directive"}})
    94  		c.Assert(args.Services[0].EndpointBindings, gc.DeepEquals, map[string]string{"foo": "bar"})
    95  		c.Assert(args.Services[0].Storage, gc.DeepEquals, map[string]storage.Constraints{"data": storage.Constraints{Pool: "pool"}})
    96  		c.Assert(args.Services[0].Resources, gc.DeepEquals, map[string]string{"foo": "bar"})
    97  
    98  		result := response.(*params.ErrorResults)
    99  		result.Results = make([]params.ErrorResult, 1)
   100  		return nil
   101  	})
   102  
   103  	args := service.DeployArgs{
   104  		CharmID: charmstore.CharmID{
   105  			URL: charm.MustParseURL("trusty/a-charm-1"),
   106  		},
   107  		ServiceName:      "serviceA",
   108  		Series:           "series",
   109  		NumUnits:         2,
   110  		ConfigYAML:       "configYAML",
   111  		Cons:             constraints.MustParse("mem=4G"),
   112  		Placement:        []*instance.Placement{{"scope", "directive"}},
   113  		Storage:          map[string]storage.Constraints{"data": storage.Constraints{Pool: "pool"}},
   114  		Resources:        map[string]string{"foo": "bar"},
   115  		EndpointBindings: map[string]string{"foo": "bar"},
   116  	}
   117  	err := s.client.Deploy(args)
   118  	c.Assert(err, jc.ErrorIsNil)
   119  	c.Assert(called, jc.IsTrue)
   120  }
   121  
   122  func (s *serviceSuite) TestServiceGetCharmURL(c *gc.C) {
   123  	var called bool
   124  	service.PatchFacadeCall(s, s.client, func(request string, a, response interface{}) error {
   125  		called = true
   126  		c.Assert(request, gc.Equals, "GetCharmURL")
   127  		args, ok := a.(params.ServiceGet)
   128  		c.Assert(ok, jc.IsTrue)
   129  		c.Assert(args.ServiceName, gc.Equals, "service")
   130  
   131  		result := response.(*params.StringResult)
   132  		result.Result = "curl"
   133  		return nil
   134  	})
   135  	curl, err := s.client.GetCharmURL("service")
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	c.Assert(curl, gc.DeepEquals, charm.MustParseURL("curl"))
   138  	c.Assert(called, jc.IsTrue)
   139  }
   140  
   141  func (s *serviceSuite) TestServiceSetCharm(c *gc.C) {
   142  	var called bool
   143  	service.PatchFacadeCall(s, s.client, func(request string, a, response interface{}) error {
   144  		called = true
   145  		c.Assert(request, gc.Equals, "SetCharm")
   146  		args, ok := a.(params.ServiceSetCharm)
   147  		c.Assert(ok, jc.IsTrue)
   148  		c.Assert(args.ServiceName, gc.Equals, "service")
   149  		c.Assert(args.CharmUrl, gc.Equals, "cs:trusty/service-1")
   150  		c.Assert(args.ForceSeries, gc.Equals, true)
   151  		c.Assert(args.ForceUnits, gc.Equals, true)
   152  		return nil
   153  	})
   154  	cfg := service.SetCharmConfig{
   155  		ServiceName: "service",
   156  		CharmID: charmstore.CharmID{
   157  			URL: charm.MustParseURL("trusty/service-1"),
   158  		},
   159  		ForceSeries: true,
   160  		ForceUnits:  true,
   161  	}
   162  	err := s.client.SetCharm(cfg)
   163  	c.Assert(err, jc.ErrorIsNil)
   164  	c.Assert(called, jc.IsTrue)
   165  }