github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/azure/internal/imageutils/images_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imageutils_test 5 6 import ( 7 "net/http" 8 9 "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute" 10 "github.com/Azure/go-autorest/autorest/mocks" 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/environs/context" 16 "github.com/juju/juju/environs/instances" 17 "github.com/juju/juju/provider/azure/internal/imageutils" 18 "github.com/juju/juju/testing" 19 ) 20 21 type imageutilsSuite struct { 22 testing.BaseSuite 23 24 mockSender *mocks.Sender 25 client compute.VirtualMachineImagesClient 26 callCtx *context.CloudCallContext 27 } 28 29 var _ = gc.Suite(&imageutilsSuite{}) 30 31 func (s *imageutilsSuite) SetUpTest(c *gc.C) { 32 s.BaseSuite.SetUpTest(c) 33 s.mockSender = mocks.NewSender() 34 s.client.BaseClient = compute.New("subscription-id") 35 s.client.Sender = s.mockSender 36 s.callCtx = context.NewCloudCallContext() 37 } 38 39 func (s *imageutilsSuite) TestSeriesImage(c *gc.C) { 40 s.mockSender.AppendResponse(mocks.NewResponseWithContent( 41 `[{"name": "14.04.3"}, {"name": "14.04.1-LTS"}, {"name": "12.04.5"}]`, 42 )) 43 image, err := imageutils.SeriesImage(s.callCtx, "trusty", "released", "westus", s.client) 44 c.Assert(err, jc.ErrorIsNil) 45 c.Assert(image, gc.NotNil) 46 c.Assert(image, jc.DeepEquals, &instances.Image{ 47 Id: "Canonical:UbuntuServer:14.04.3:latest", 48 Arch: arch.AMD64, 49 VirtType: "Hyper-V", 50 }) 51 } 52 53 func (s *imageutilsSuite) TestSeriesImageInvalidSKU(c *gc.C) { 54 s.mockSender.AppendResponse(mocks.NewResponseWithContent( 55 `[{"name": "12.04.invalid"}, {"name": "12.04.5-LTS"}]`, 56 )) 57 image, err := imageutils.SeriesImage(s.callCtx, "precise", "released", "westus", s.client) 58 c.Assert(err, jc.ErrorIsNil) 59 c.Assert(image, gc.NotNil) 60 c.Assert(image, jc.DeepEquals, &instances.Image{ 61 Id: "Canonical:UbuntuServer:12.04.5-LTS:latest", 62 Arch: arch.AMD64, 63 VirtType: "Hyper-V", 64 }) 65 } 66 67 func (s *imageutilsSuite) TestSeriesImageWindows(c *gc.C) { 68 s.assertImageId(c, "win2012r2", "daily", "MicrosoftWindowsServer:WindowsServer:2012-R2-Datacenter:latest") 69 s.assertImageId(c, "win2012", "daily", "MicrosoftWindowsServer:WindowsServer:2012-Datacenter:latest") 70 s.assertImageId(c, "win81", "daily", "MicrosoftVisualStudio:Windows:8.1-Enterprise-N:latest") 71 s.assertImageId(c, "win10", "daily", "MicrosoftVisualStudio:Windows:10-Enterprise:latest") 72 } 73 74 func (s *imageutilsSuite) TestSeriesImageCentOS(c *gc.C) { 75 s.assertImageId(c, "centos7", "released", "OpenLogic:CentOS:7.3:latest") 76 } 77 78 func (s *imageutilsSuite) TestSeriesImageGenericLinux(c *gc.C) { 79 _, err := imageutils.SeriesImage(s.callCtx, "genericlinux", "released", "westus", s.client) 80 c.Assert(err, gc.ErrorMatches, "deploying GenericLinux not supported") 81 } 82 83 func (s *imageutilsSuite) TestSeriesImageStream(c *gc.C) { 84 s.mockSender.AppendAndRepeatResponse(mocks.NewResponseWithContent( 85 `[{"name": "14.04.2"}, {"name": "14.04.3-DAILY"}, {"name": "14.04.1-LTS"}]`), 2) 86 s.assertImageId(c, "trusty", "daily", "Canonical:UbuntuServer:14.04.3-DAILY:latest") 87 s.assertImageId(c, "trusty", "released", "Canonical:UbuntuServer:14.04.2:latest") 88 } 89 90 func (s *imageutilsSuite) TestSeriesImageNotFound(c *gc.C) { 91 s.mockSender.AppendResponse(mocks.NewResponseWithContent(`[]`)) 92 image, err := imageutils.SeriesImage(s.callCtx, "trusty", "released", "westus", s.client) 93 c.Assert(err, gc.ErrorMatches, "selecting SKU for trusty: Ubuntu SKUs not found") 94 c.Assert(image, gc.IsNil) 95 } 96 97 func (s *imageutilsSuite) TestSeriesImageStreamNotFound(c *gc.C) { 98 s.mockSender.AppendResponse(mocks.NewResponseWithContent(`[{"name": "14.04-beta1"}]`)) 99 _, err := imageutils.SeriesImage(s.callCtx, "trusty", "whatever", "westus", s.client) 100 c.Assert(err, gc.ErrorMatches, "selecting SKU for trusty: Ubuntu SKUs for whatever stream not found") 101 } 102 103 func (s *imageutilsSuite) TestSeriesImageStreamThrewCredentialError(c *gc.C) { 104 s.mockSender.AppendResponse(mocks.NewResponseWithStatus("401 Unauthorized", http.StatusUnauthorized)) 105 called := false 106 s.callCtx.InvalidateCredentialFunc = func(string) error { 107 called = true 108 return nil 109 } 110 111 _, err := imageutils.SeriesImage(s.callCtx, "trusty", "whatever", "westus", s.client) 112 c.Assert(err.Error(), jc.Contains, "StatusCode=401") 113 c.Assert(called, jc.IsTrue) 114 } 115 116 func (s *imageutilsSuite) TestSeriesImageStreamThrewNonCredentialError(c *gc.C) { 117 s.mockSender.AppendResponse(mocks.NewResponseWithStatus("308 Permanent Redirect", http.StatusPermanentRedirect)) 118 called := false 119 s.callCtx.InvalidateCredentialFunc = func(string) error { 120 called = true 121 return nil 122 } 123 124 _, err := imageutils.SeriesImage(s.callCtx, "trusty", "whatever", "westus", s.client) 125 c.Assert(err.Error(), jc.Contains, "StatusCode=308") 126 c.Assert(called, jc.IsFalse) 127 } 128 129 func (s *imageutilsSuite) assertImageId(c *gc.C, series, stream, id string) { 130 image, err := imageutils.SeriesImage(s.callCtx, series, stream, "westus", s.client) 131 c.Assert(err, jc.ErrorIsNil) 132 c.Assert(image.Id, gc.Equals, id) 133 }