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 }