github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/provider/lxd/environ_broker_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // +build go1.3 5 6 package lxd_test 7 8 import ( 9 "github.com/juju/errors" 10 gitjujutesting "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils/arch" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/provider/lxd" 16 "github.com/juju/juju/tools/lxdclient" 17 ) 18 19 type environBrokerSuite struct { 20 lxd.BaseSuite 21 } 22 23 var _ = gc.Suite(&environBrokerSuite{}) 24 25 func (s *environBrokerSuite) SetUpTest(c *gc.C) { 26 s.BaseSuite.SetUpTest(c) 27 } 28 29 func (s *environBrokerSuite) TestStartInstance(c *gc.C) { 30 s.Client.Inst = s.RawInstance 31 32 // Patch the host's arch, so the broker will filter tools. 33 s.PatchValue(&arch.HostArch, func() string { return arch.ARM64 }) 34 35 result, err := s.Env.StartInstance(s.StartInstArgs) 36 c.Assert(err, jc.ErrorIsNil) 37 c.Check(result.Instance, gc.DeepEquals, s.Instance) 38 c.Check(result.Hardware, gc.DeepEquals, s.HWC) 39 c.Assert(s.StartInstArgs.InstanceConfig.AgentVersion().Arch, gc.Equals, arch.ARM64) 40 } 41 42 func (s *environBrokerSuite) TestStartInstanceNoTools(c *gc.C) { 43 s.Client.Inst = s.RawInstance 44 45 // Patch the host's arch, so the broker will filter tools. 46 s.PatchValue(&arch.HostArch, func() string { return arch.PPC64EL }) 47 48 _, err := s.Env.StartInstance(s.StartInstArgs) 49 c.Assert(err, gc.ErrorMatches, "no matching tools available") 50 } 51 52 func (s *environBrokerSuite) TestStopInstances(c *gc.C) { 53 err := s.Env.StopInstances(s.Instance.Id()) 54 c.Assert(err, jc.ErrorIsNil) 55 56 s.Stub.CheckCalls(c, []gitjujutesting.StubCall{{ 57 FuncName: "Instances", 58 Args: []interface{}{ 59 "juju-f75cba-", 60 []string(nil), 61 }, 62 }, { 63 FuncName: "RemoveInstances", 64 Args: []interface{}{ 65 "juju-f75cba-", 66 []string{"spam"}, 67 }, 68 }}) 69 } 70 71 func (s *environBrokerSuite) TestStopInstancesRemoveCertificate(c *gc.C) { 72 s.RawInstance.InstanceSummary.Metadata[lxdclient.CertificateFingerprintKey] = "foo" 73 s.Client.Insts = []lxdclient.Instance{*s.RawInstance} 74 75 err := s.Env.StopInstances(s.Instance.Id()) 76 c.Assert(err, jc.ErrorIsNil) 77 78 s.Stub.CheckCallNames(c, "Instances", "RemoveCertByFingerprint", "RemoveInstances") 79 s.Stub.CheckCall(c, 1, "RemoveCertByFingerprint", "foo") 80 } 81 82 func (s *environBrokerSuite) TestStopInstancesRemoveCertificateNotFound(c *gc.C) { 83 s.RawInstance.InstanceSummary.Metadata[lxdclient.CertificateFingerprintKey] = "foo" 84 s.Client.Insts = []lxdclient.Instance{*s.RawInstance} 85 86 s.Stub.SetErrors(nil, errors.NotFoundf("certificate")) 87 err := s.Env.StopInstances(s.Instance.Id()) 88 c.Assert(err, jc.ErrorIsNil) 89 90 s.Stub.CheckCallNames(c, "Instances", "RemoveCertByFingerprint", "RemoveInstances") 91 s.Stub.CheckCall(c, 1, "RemoveCertByFingerprint", "foo") 92 } 93 94 func (s *environBrokerSuite) TestImageMetadataURL(c *gc.C) { 95 s.UpdateConfig(c, map[string]interface{}{ 96 "image-metadata-url": "https://my-test.com/images/", 97 }) 98 s.checkSources(c, []string{ 99 "https://my-test.com/images/", 100 "https://streams.canonical.com/juju/images/releases/", 101 "https://cloud-images.ubuntu.com/releases/", 102 }) 103 } 104 105 func (s *environBrokerSuite) TestImageMetadataURLMungesHTTP(c *gc.C) { 106 // LXD requires 'https://' hosts for simplestreams data. 107 // https://github.com/lxc/lxd/issues/1763 108 s.UpdateConfig(c, map[string]interface{}{ 109 "image-metadata-url": "http://my-test.com/images/", 110 }) 111 s.checkSources(c, []string{ 112 "https://my-test.com/images/", 113 "https://streams.canonical.com/juju/images/releases/", 114 "https://cloud-images.ubuntu.com/releases/", 115 }) 116 } 117 118 func (s *environBrokerSuite) checkSources(c *gc.C, expectedURLs []string) { 119 sources, err := lxd.GetImageSources(s.Env) 120 c.Assert(err, jc.ErrorIsNil) 121 var sourceURLs []string 122 for _, source := range sources { 123 sourceURLs = append(sourceURLs, source.Host) 124 } 125 c.Check(sourceURLs, gc.DeepEquals, expectedURLs) 126 } 127 128 func (s *environBrokerSuite) checkSourcesFromStream(c *gc.C, stream string, expectedURLs []string) { 129 if stream != "" { 130 s.UpdateConfig(c, map[string]interface{}{"image-stream": stream}) 131 } 132 s.checkSources(c, expectedURLs) 133 } 134 135 func (s *environBrokerSuite) TestImageStreamDefault(c *gc.C) { 136 s.checkSourcesFromStream(c, "", []string{ 137 "https://streams.canonical.com/juju/images/releases/", 138 "https://cloud-images.ubuntu.com/releases/", 139 }) 140 } 141 142 func (s *environBrokerSuite) TestImageStreamReleased(c *gc.C) { 143 s.checkSourcesFromStream(c, "released", []string{ 144 "https://streams.canonical.com/juju/images/releases/", 145 "https://cloud-images.ubuntu.com/releases/", 146 }) 147 } 148 149 func (s *environBrokerSuite) TestImageStreamDaily(c *gc.C) { 150 s.checkSourcesFromStream(c, "daily", []string{ 151 "https://streams.canonical.com/juju/images/daily/", 152 "https://cloud-images.ubuntu.com/daily/", 153 }) 154 }