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 }