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  }