github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/imagemetadata/metadata_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/state/cloudimagemetadata"
    13  )
    14  
    15  type metadataSuite struct {
    16  	baseImageMetadataSuite
    17  }
    18  
    19  var _ = gc.Suite(&metadataSuite{})
    20  
    21  func (s *metadataSuite) TestFindNil(c *gc.C) {
    22  	found, err := s.api.List(params.ImageMetadataFilter{})
    23  	c.Assert(err, jc.ErrorIsNil)
    24  	c.Assert(found.Result, gc.HasLen, 0)
    25  	s.assertCalls(c, "ControllerTag", findMetadata)
    26  }
    27  
    28  func (s *metadataSuite) TestFindEmpty(c *gc.C) {
    29  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    30  		return map[string][]cloudimagemetadata.Metadata{}, nil
    31  	}
    32  
    33  	found, err := s.api.List(params.ImageMetadataFilter{})
    34  	c.Assert(err, jc.ErrorIsNil)
    35  	c.Assert(found.Result, gc.HasLen, 0)
    36  	s.assertCalls(c, "ControllerTag", findMetadata)
    37  }
    38  
    39  func (s *metadataSuite) TestFindEmptyGroups(c *gc.C) {
    40  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    41  		return map[string][]cloudimagemetadata.Metadata{
    42  			"public": []cloudimagemetadata.Metadata{},
    43  			"custom": []cloudimagemetadata.Metadata{},
    44  		}, nil
    45  	}
    46  
    47  	found, err := s.api.List(params.ImageMetadataFilter{})
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	c.Assert(found.Result, gc.HasLen, 0)
    50  	s.assertCalls(c, "ControllerTag", findMetadata)
    51  }
    52  
    53  func (s *metadataSuite) TestFindError(c *gc.C) {
    54  	msg := "find error"
    55  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    56  		return nil, errors.New(msg)
    57  	}
    58  
    59  	found, err := s.api.List(params.ImageMetadataFilter{})
    60  	c.Assert(err, gc.ErrorMatches, msg)
    61  	c.Assert(found.Result, gc.HasLen, 0)
    62  	s.assertCalls(c, "ControllerTag", findMetadata)
    63  }
    64  
    65  func (s *metadataSuite) TestFindOrder(c *gc.C) {
    66  	customImageId := "custom1"
    67  	customImageId2 := "custom2"
    68  	customImageId3 := "custom3"
    69  	publicImageId := "public1"
    70  
    71  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    72  		return map[string][]cloudimagemetadata.Metadata{
    73  				"public": []cloudimagemetadata.Metadata{
    74  					cloudimagemetadata.Metadata{ImageId: publicImageId, Priority: 15},
    75  				},
    76  				"custom": []cloudimagemetadata.Metadata{
    77  					cloudimagemetadata.Metadata{ImageId: customImageId, Priority: 87},
    78  					cloudimagemetadata.Metadata{ImageId: customImageId2, Priority: 20},
    79  					cloudimagemetadata.Metadata{ImageId: customImageId3, Priority: 56},
    80  				},
    81  			},
    82  			nil
    83  	}
    84  
    85  	found, err := s.api.List(params.ImageMetadataFilter{})
    86  	c.Assert(err, jc.ErrorIsNil)
    87  	c.Assert(found.Result, gc.HasLen, 4)
    88  
    89  	c.Assert(found.Result, jc.SameContents, []params.CloudImageMetadata{
    90  		params.CloudImageMetadata{ImageId: customImageId, Priority: 87},
    91  		params.CloudImageMetadata{ImageId: customImageId3, Priority: 56},
    92  		params.CloudImageMetadata{ImageId: customImageId2, Priority: 20},
    93  		params.CloudImageMetadata{ImageId: publicImageId, Priority: 15},
    94  	})
    95  	s.assertCalls(c, "ControllerTag", findMetadata)
    96  }
    97  
    98  func (s *metadataSuite) TestSaveEmpty(c *gc.C) {
    99  	errs, err := s.api.Save(params.MetadataSaveParams{})
   100  	c.Assert(err, jc.ErrorIsNil)
   101  	c.Assert(errs.Results, gc.HasLen, 0)
   102  	s.assertCalls(c, "ControllerTag")
   103  }
   104  
   105  func (s *metadataSuite) TestSave(c *gc.C) {
   106  	m := params.CloudImageMetadata{
   107  		Source: "custom",
   108  	}
   109  	msg := "save error"
   110  
   111  	saveCalls := 0
   112  	s.state.saveMetadata = func(m []cloudimagemetadata.Metadata) error {
   113  		saveCalls += 1
   114  		c.Assert(m, gc.HasLen, saveCalls)
   115  		// TODO (anastasiamac 2016-08-24) This is a check for a band-aid solution.
   116  		// Once correct value is read from simplestreams, this needs to go.
   117  		// Bug# 1616295
   118  		// Ensure empty stream is changed to release
   119  		c.Assert(m[0].Stream, gc.DeepEquals, "released")
   120  		if saveCalls == 1 {
   121  			// don't err on first call
   122  			return nil
   123  		}
   124  		return errors.New(msg)
   125  	}
   126  
   127  	errs, err := s.api.Save(params.MetadataSaveParams{
   128  		Metadata: []params.CloudImageMetadataList{{
   129  			Metadata: []params.CloudImageMetadata{m},
   130  		}, {
   131  			Metadata: []params.CloudImageMetadata{m, m},
   132  		}},
   133  	})
   134  	c.Assert(err, jc.ErrorIsNil)
   135  	c.Assert(errs.Results, gc.HasLen, 2)
   136  	c.Assert(errs.Results[0].Error, gc.IsNil)
   137  	c.Assert(errs.Results[1].Error, gc.ErrorMatches, msg)
   138  	s.assertCalls(c, "ControllerTag", environConfig, saveMetadata, saveMetadata)
   139  }
   140  
   141  func (s *metadataSuite) TestDeleteEmpty(c *gc.C) {
   142  	errs, err := s.api.Delete(params.MetadataImageIds{})
   143  	c.Assert(err, jc.ErrorIsNil)
   144  	c.Assert(errs.Results, gc.HasLen, 0)
   145  	s.assertCalls(c, "ControllerTag")
   146  }
   147  
   148  func (s *metadataSuite) TestDelete(c *gc.C) {
   149  	idOk := "ok"
   150  	idFail := "fail"
   151  	msg := "delete error"
   152  
   153  	s.state.deleteMetadata = func(imageId string) error {
   154  		if imageId == idFail {
   155  			return errors.New(msg)
   156  		}
   157  		return nil
   158  	}
   159  
   160  	errs, err := s.api.Delete(params.MetadataImageIds{[]string{idOk, idFail}})
   161  	c.Assert(err, jc.ErrorIsNil)
   162  	c.Assert(errs.Results, gc.HasLen, 2)
   163  	c.Assert(errs.Results[0].Error, gc.IsNil)
   164  	c.Assert(errs.Results[1].Error, gc.ErrorMatches, msg)
   165  	s.assertCalls(c, "ControllerTag", deleteMetadata, deleteMetadata)
   166  }