github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/imagemanager/imagemanager_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemanager_test
     5  
     6  import (
     7  	"bytes"
     8  	"io"
     9  	"time"
    10  
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  	"gopkg.in/juju/names.v2"
    14  
    15  	"github.com/juju/juju/apiserver/common"
    16  	commontesting "github.com/juju/juju/apiserver/common/testing"
    17  	"github.com/juju/juju/apiserver/imagemanager"
    18  	"github.com/juju/juju/apiserver/params"
    19  	apiservertesting "github.com/juju/juju/apiserver/testing"
    20  	jujutesting "github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/state/imagestorage"
    22  )
    23  
    24  type imageManagerSuite struct {
    25  	jujutesting.JujuConnSuite
    26  
    27  	imagemanager *imagemanager.ImageManagerAPI
    28  	resources    *common.Resources
    29  	authoriser   apiservertesting.FakeAuthorizer
    30  
    31  	commontesting.BlockHelper
    32  }
    33  
    34  var _ = gc.Suite(&imageManagerSuite{})
    35  
    36  func (s *imageManagerSuite) SetUpTest(c *gc.C) {
    37  	s.JujuConnSuite.SetUpTest(c)
    38  	s.resources = common.NewResources()
    39  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
    40  
    41  	s.authoriser = apiservertesting.FakeAuthorizer{
    42  		Tag: s.AdminUserTag(c),
    43  	}
    44  	var err error
    45  	s.imagemanager, err = imagemanager.NewImageManagerAPI(s.State, s.resources, s.authoriser)
    46  	c.Assert(err, jc.ErrorIsNil)
    47  
    48  	s.BlockHelper = commontesting.NewBlockHelper(s.APIState)
    49  	s.AddCleanup(func(*gc.C) { s.BlockHelper.Close() })
    50  }
    51  
    52  func (s *imageManagerSuite) TestNewImageManagerAPIAcceptsClient(c *gc.C) {
    53  	endPoint, err := imagemanager.NewImageManagerAPI(s.State, s.resources, s.authoriser)
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	c.Assert(endPoint, gc.NotNil)
    56  }
    57  
    58  func (s *imageManagerSuite) TestNewImageManagerAPIRefusesNonClient(c *gc.C) {
    59  	anAuthoriser := s.authoriser
    60  	anAuthoriser.Tag = names.NewUnitTag("mysql/0")
    61  	anAuthoriser.EnvironManager = false
    62  	endPoint, err := imagemanager.NewImageManagerAPI(s.State, s.resources, anAuthoriser)
    63  	c.Assert(endPoint, gc.IsNil)
    64  	c.Assert(err, gc.ErrorMatches, "permission denied")
    65  }
    66  
    67  func (s *imageManagerSuite) addImage(c *gc.C, content string) {
    68  	var r io.Reader = bytes.NewReader([]byte(content))
    69  	addedMetadata := &imagestorage.Metadata{
    70  		ModelUUID: s.State.ModelUUID(),
    71  		Kind:      "lxc",
    72  		Series:    "trusty",
    73  		Arch:      "amd64",
    74  		Size:      int64(len(content)),
    75  		SHA256:    "hash(" + content + ")",
    76  		SourceURL: "http://lxc-trusty-amd64",
    77  	}
    78  	stor := s.State.ImageStorage()
    79  	err := stor.AddImage(r, addedMetadata)
    80  	c.Assert(err, gc.IsNil)
    81  	_, rdr, err := stor.Image("lxc", "trusty", "amd64")
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	rdr.Close()
    84  }
    85  
    86  func (s *imageManagerSuite) TestListAllImages(c *gc.C) {
    87  	s.addImage(c, "image")
    88  	args := params.ImageFilterParams{}
    89  	result, err := s.imagemanager.ListImages(args)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(result.Result, gc.HasLen, 1)
    92  	dummyTime := time.Now()
    93  	result.Result[0].Created = dummyTime
    94  	c.Assert(result.Result[0], gc.Equals, params.ImageMetadata{
    95  		Kind: "lxc", Arch: "amd64", Series: "trusty", URL: "http://lxc-trusty-amd64", Created: dummyTime,
    96  	})
    97  }
    98  
    99  func (s *imageManagerSuite) TestListImagesWithSingleFilter(c *gc.C) {
   100  	s.addImage(c, "image")
   101  	args := params.ImageFilterParams{
   102  		Images: []params.ImageSpec{
   103  			{
   104  				Kind:   "lxc",
   105  				Series: "trusty",
   106  				Arch:   "amd64",
   107  			},
   108  		},
   109  	}
   110  	result, err := s.imagemanager.ListImages(args)
   111  	c.Assert(err, jc.ErrorIsNil)
   112  	c.Assert(result.Result, gc.HasLen, 1)
   113  	dummyTime := time.Now()
   114  	result.Result[0].Created = dummyTime
   115  	c.Assert(result.Result[0], gc.Equals, params.ImageMetadata{
   116  		Kind: "lxc", Arch: "amd64", Series: "trusty", URL: "http://lxc-trusty-amd64", Created: dummyTime,
   117  	})
   118  }
   119  
   120  func (s *imageManagerSuite) TestListImagesWithMultipleFiltersFails(c *gc.C) {
   121  	s.addImage(c, "image")
   122  	args := params.ImageFilterParams{
   123  		Images: []params.ImageSpec{
   124  			{
   125  				Kind:   "lxc",
   126  				Series: "trusty",
   127  				Arch:   "amd64",
   128  			}, {
   129  				Kind:   "lxc",
   130  				Series: "precise",
   131  				Arch:   "amd64",
   132  			},
   133  		},
   134  	}
   135  	_, err := s.imagemanager.ListImages(args)
   136  	c.Assert(err, gc.ErrorMatches, "image filter with multiple terms not supported")
   137  }
   138  
   139  func (s *imageManagerSuite) TestDeleteImages(c *gc.C) {
   140  	s.addImage(c, "image")
   141  	args := params.ImageFilterParams{
   142  		Images: []params.ImageSpec{
   143  			{
   144  				Kind:   "lxc",
   145  				Series: "trusty",
   146  				Arch:   "amd64",
   147  			}, {
   148  				Kind:   "lxc",
   149  				Series: "precise",
   150  				Arch:   "amd64",
   151  			},
   152  		},
   153  	}
   154  	results, err := s.imagemanager.DeleteImages(args)
   155  	c.Assert(err, jc.ErrorIsNil)
   156  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
   157  		Results: []params.ErrorResult{
   158  			{Error: nil},
   159  			{Error: apiservertesting.NotFoundError("image lxc/precise/amd64")},
   160  		},
   161  	})
   162  	stor := s.State.ImageStorage()
   163  	_, _, err = stor.Image("lxc", "trusty", "amd64")
   164  	c.Assert(err, gc.ErrorMatches, ".*-lxc-trusty-amd64 image metadata not found")
   165  }
   166  
   167  func (s *imageManagerSuite) TestBlockDeleteImages(c *gc.C) {
   168  	s.addImage(c, "image")
   169  	args := params.ImageFilterParams{
   170  		Images: []params.ImageSpec{{
   171  			Kind:   "lxc",
   172  			Series: "trusty",
   173  			Arch:   "amd64",
   174  		}},
   175  	}
   176  
   177  	s.BlockAllChanges(c, "TestBlockDeleteImages")
   178  	_, err := s.imagemanager.DeleteImages(args)
   179  	// Check that the call is blocked
   180  	s.AssertBlocked(c, err, "TestBlockDeleteImages")
   181  	// Check the image still exists.
   182  	stor := s.State.ImageStorage()
   183  	_, rdr, err := stor.Image("lxc", "trusty", "amd64")
   184  	c.Assert(err, jc.ErrorIsNil)
   185  	rdr.Close()
   186  }