github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/plugins/juju-metadata/listimages_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  
    10  	"github.com/juju/cmd"
    11  	"github.com/juju/cmd/cmdtesting"
    12  	"github.com/juju/errors"
    13  	jc "github.com/juju/testing/checkers"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/apiserver/params"
    17  	"github.com/juju/juju/cmd/modelcmd"
    18  	"github.com/juju/juju/core/model"
    19  	"github.com/juju/juju/jujuclient"
    20  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    21  	"github.com/juju/juju/testing"
    22  )
    23  
    24  type BaseCloudImageMetadataSuite struct {
    25  	testing.FakeJujuXDGDataHomeSuite
    26  	store *jujuclient.MemStore
    27  }
    28  
    29  func (s *BaseCloudImageMetadataSuite) SetUpTest(c *gc.C) {
    30  	s.setupBaseSuite(c)
    31  }
    32  
    33  func (s *BaseCloudImageMetadataSuite) setupBaseSuite(c *gc.C) {
    34  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    35  
    36  	s.store = jujuclient.NewMemStore()
    37  	s.store.CurrentControllerName = "testing"
    38  	s.store.Controllers["testing"] = jujuclient.ControllerDetails{}
    39  	s.store.Models["testing"] = &jujuclient.ControllerModels{
    40  		Models: map[string]jujuclient.ModelDetails{
    41  			"admin/controller": {
    42  				ModelType: model.IAAS,
    43  			},
    44  		},
    45  		CurrentModel: "admin/controller",
    46  	}
    47  	s.store.Accounts["testing"] = jujuclient.AccountDetails{
    48  		User: "admin",
    49  	}
    50  }
    51  
    52  type ListSuite struct {
    53  	BaseCloudImageMetadataSuite
    54  	mockAPI *mockListAPI
    55  }
    56  
    57  var _ = gc.Suite(&ListSuite{})
    58  
    59  func (s *ListSuite) SetUpTest(c *gc.C) {
    60  	s.BaseCloudImageMetadataSuite.SetUpTest(c)
    61  
    62  	s.mockAPI = &mockListAPI{}
    63  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
    64  		return testData, nil
    65  	}
    66  	s.PatchValue(&getImageMetadataListAPI, func(c *listImagesCommand) (MetadataListAPI, error) {
    67  		return s.mockAPI, nil
    68  	})
    69  }
    70  
    71  func runList(c *gc.C, args []string) (*cmd.Context, error) {
    72  	cmd := &listImagesCommand{}
    73  	cmd.SetClientStore(jujuclienttesting.MinimalStore())
    74  	return cmdtesting.RunCommand(c, modelcmd.Wrap(cmd), args...)
    75  }
    76  
    77  func (s *ListSuite) TestListDefault(c *gc.C) {
    78  	// Default format is tabular
    79  	s.assertValidList(c, `
    80  Source  Series  Arch   Region  Image id  Stream    Virt Type  Storage Type
    81  custom  vivid   amd64  asia    im-21     released  kvm        ebs
    82  custom  vivid   amd64  europe  im-21     released  kvm        ebs
    83  custom  vivid   amd64  us      im-21     released  kvm        ebs
    84  custom  trusty  amd64  europe  im-21     released  kvm        ebs
    85  custom  trusty  i386   asia    im-21     released  kvm        ebs
    86  custom  trusty  i386   europe  im-21     released  kvm        ebs
    87  public  vivid   amd64  europe  im-21     released  kvm        ebs
    88  public  trusty  i386   europe  im-21     released  kvm        ebs
    89  public  trusty  i386   europe  im-42     devel     kvm        ebs
    90  public  trusty  i386   europe  im-42     devel                ebs
    91  public  trusty  i386   europe  im-42     devel     kvm        
    92  public  trusty  i386   europe  im-42     devel                
    93  
    94  `[1:], "")
    95  }
    96  
    97  func (s *ListSuite) TestListYAML(c *gc.C) {
    98  	s.assertValidList(c, `
    99  custom:
   100    trusty:
   101      amd64:
   102        europe:
   103        - image-id: im-21
   104          stream: released
   105          virt-type: kvm
   106          storage-type: ebs
   107      i386:
   108        asia:
   109        - image-id: im-21
   110          stream: released
   111          virt-type: kvm
   112          storage-type: ebs
   113        europe:
   114        - image-id: im-21
   115          stream: released
   116          virt-type: kvm
   117          storage-type: ebs
   118    vivid:
   119      amd64:
   120        asia:
   121        - image-id: im-21
   122          stream: released
   123          virt-type: kvm
   124          storage-type: ebs
   125        europe:
   126        - image-id: im-21
   127          stream: released
   128          virt-type: kvm
   129          storage-type: ebs
   130        us:
   131        - image-id: im-21
   132          stream: released
   133          virt-type: kvm
   134          storage-type: ebs
   135  public:
   136    trusty:
   137      i386:
   138        europe:
   139        - image-id: im-21
   140          stream: released
   141          virt-type: kvm
   142          storage-type: ebs
   143        - image-id: im-42
   144          stream: devel
   145          virt-type: kvm
   146          storage-type: ebs
   147        - image-id: im-42
   148          stream: devel
   149          storage-type: ebs
   150        - image-id: im-42
   151          stream: devel
   152          virt-type: kvm
   153        - image-id: im-42
   154          stream: devel
   155    vivid:
   156      amd64:
   157        europe:
   158        - image-id: im-21
   159          stream: released
   160          virt-type: kvm
   161          storage-type: ebs
   162  `[1:], "", "--format", "yaml")
   163  }
   164  
   165  func (s *ListSuite) TestListMetadataFailed(c *gc.C) {
   166  	msg := "failed"
   167  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   168  		return nil, errors.New(msg)
   169  	}
   170  
   171  	_, err := runList(c, nil)
   172  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf(".*%v.*", msg))
   173  }
   174  
   175  func (s *ListSuite) TestListMetadataFilterStream(c *gc.C) {
   176  	msg := "stream"
   177  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   178  		c.Assert(stream, gc.DeepEquals, msg)
   179  		return nil, nil
   180  	}
   181  	s.assertValidList(c, "", "", "--stream", msg)
   182  }
   183  
   184  func (s *ListSuite) TestListMetadataFilterRegion(c *gc.C) {
   185  	msg := "region"
   186  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   187  		c.Assert(region, gc.DeepEquals, msg)
   188  		return nil, nil
   189  	}
   190  	s.assertValidList(c, "", "", "--region", msg)
   191  }
   192  
   193  func (s *ListSuite) TestListMetadataFilterSeries(c *gc.C) {
   194  	all := []string{"series1", "series2"}
   195  	msg := strings.Join(all, ",")
   196  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   197  		c.Assert(ser, gc.DeepEquals, all)
   198  		return nil, nil
   199  	}
   200  	s.assertValidList(c, "", "", "--series", msg)
   201  }
   202  
   203  func (s *ListSuite) TestListMetadataFilterArches(c *gc.C) {
   204  	all := []string{"arch1", "barch2"}
   205  	msg := strings.Join(all, ",")
   206  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   207  		c.Assert(arch, gc.DeepEquals, all)
   208  		return nil, nil
   209  	}
   210  	s.assertValidList(c, "", "", "--arch", msg)
   211  }
   212  
   213  func (s *ListSuite) TestListMetadataFilterVirtType(c *gc.C) {
   214  	msg := "virtType"
   215  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   216  		c.Assert(virtType, gc.DeepEquals, msg)
   217  		return nil, nil
   218  	}
   219  	s.assertValidList(c, "", "", "--virt-type", msg)
   220  }
   221  
   222  func (s *ListSuite) TestListMetadataFilterStorageType(c *gc.C) {
   223  	msg := "storagetype"
   224  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   225  		c.Assert(rootStorageType, gc.DeepEquals, msg)
   226  		return nil, nil
   227  	}
   228  	s.assertValidList(c, "", "", "--storage-type", msg)
   229  }
   230  
   231  func (s *ListSuite) TestListMetadataNoFilter(c *gc.C) {
   232  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   233  		c.Assert(rootStorageType, gc.DeepEquals, "")
   234  		c.Assert(virtType, gc.DeepEquals, "")
   235  		c.Assert(region, gc.DeepEquals, "")
   236  		c.Assert(stream, gc.DeepEquals, "")
   237  		c.Assert(ser, gc.IsNil)
   238  		c.Assert(arch, gc.IsNil)
   239  		return nil, nil
   240  	}
   241  	s.assertValidList(c, "", "")
   242  }
   243  
   244  func (s *ListSuite) TestListMetadataFewFilters(c *gc.C) {
   245  	streamValue := "streamValue"
   246  	regionValue := "regionValue"
   247  	typeValue := "typeValue"
   248  	s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   249  		c.Assert(stream, gc.DeepEquals, streamValue)
   250  		c.Assert(region, gc.DeepEquals, regionValue)
   251  		c.Assert(virtType, gc.DeepEquals, typeValue)
   252  		return nil, nil
   253  	}
   254  	s.assertValidList(c, "", "", "--stream", streamValue, "--region", regionValue, "--virt-type", typeValue)
   255  }
   256  
   257  func (s *ListSuite) assertValidList(c *gc.C, expectedValid, expectedErr string, args ...string) {
   258  	context, err := runList(c, args)
   259  	c.Assert(err, jc.ErrorIsNil)
   260  
   261  	obtainedErr := cmdtesting.Stderr(context)
   262  	c.Assert(obtainedErr, gc.Matches, expectedErr)
   263  
   264  	obtainedValid := cmdtesting.Stdout(context)
   265  	c.Assert(obtainedValid, gc.Matches, expectedValid)
   266  }
   267  
   268  type mockListAPI struct {
   269  	list func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error)
   270  }
   271  
   272  func (s mockListAPI) Close() error {
   273  	return nil
   274  }
   275  
   276  func (s mockListAPI) List(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) {
   277  	return s.list(stream, region, ser, arch, virtType, rootStorageType)
   278  }
   279  
   280  var testData = []params.CloudImageMetadata{
   281  	{
   282  		Source:          "custom",
   283  		Series:          "vivid",
   284  		Arch:            "amd64",
   285  		Region:          "asia",
   286  		ImageId:         "im-21",
   287  		Stream:          "released",
   288  		VirtType:        "kvm",
   289  		RootStorageType: "ebs",
   290  	},
   291  	{
   292  		Source:          "custom",
   293  		Series:          "vivid",
   294  		Arch:            "amd64",
   295  		Region:          "us",
   296  		ImageId:         "im-21",
   297  		Stream:          "released",
   298  		VirtType:        "kvm",
   299  		RootStorageType: "ebs",
   300  	},
   301  	{
   302  		Source:          "custom",
   303  		Series:          "vivid",
   304  		Arch:            "amd64",
   305  		Region:          "europe",
   306  		ImageId:         "im-21",
   307  		Stream:          "released",
   308  		VirtType:        "kvm",
   309  		RootStorageType: "ebs",
   310  	},
   311  	{
   312  		Source:          "public",
   313  		Series:          "vivid",
   314  		Arch:            "amd64",
   315  		Region:          "europe",
   316  		ImageId:         "im-21",
   317  		Stream:          "released",
   318  		VirtType:        "kvm",
   319  		RootStorageType: "ebs",
   320  	},
   321  	{
   322  		Source:          "custom",
   323  		Series:          "trusty",
   324  		Arch:            "amd64",
   325  		Region:          "europe",
   326  		ImageId:         "im-21",
   327  		Stream:          "released",
   328  		VirtType:        "kvm",
   329  		RootStorageType: "ebs",
   330  	},
   331  	{
   332  		Source:          "custom",
   333  		Series:          "trusty",
   334  		Arch:            "i386",
   335  		Region:          "europe",
   336  		ImageId:         "im-21",
   337  		Stream:          "released",
   338  		VirtType:        "kvm",
   339  		RootStorageType: "ebs",
   340  	},
   341  	{
   342  		Source:          "custom",
   343  		Series:          "trusty",
   344  		Arch:            "i386",
   345  		Region:          "asia",
   346  		ImageId:         "im-21",
   347  		Stream:          "released",
   348  		VirtType:        "kvm",
   349  		RootStorageType: "ebs",
   350  	},
   351  	{
   352  		Source:          "public",
   353  		Series:          "trusty",
   354  		Arch:            "i386",
   355  		Region:          "europe",
   356  		ImageId:         "im-21",
   357  		Stream:          "released",
   358  		VirtType:        "kvm",
   359  		RootStorageType: "ebs",
   360  	},
   361  	{
   362  		Source:          "public",
   363  		Series:          "trusty",
   364  		Arch:            "i386",
   365  		Region:          "europe",
   366  		ImageId:         "im-42",
   367  		Stream:          "devel",
   368  		VirtType:        "kvm",
   369  		RootStorageType: "ebs",
   370  	},
   371  	{
   372  		Source:          "public",
   373  		Series:          "trusty",
   374  		Arch:            "i386",
   375  		Region:          "europe",
   376  		ImageId:         "im-42",
   377  		Stream:          "devel",
   378  		RootStorageType: "ebs",
   379  	},
   380  	{
   381  		Source:   "public",
   382  		Series:   "trusty",
   383  		Arch:     "i386",
   384  		Region:   "europe",
   385  		ImageId:  "im-42",
   386  		Stream:   "devel",
   387  		VirtType: "kvm",
   388  	},
   389  	{
   390  		Source:  "public",
   391  		Series:  "trusty",
   392  		Arch:    "i386",
   393  		Region:  "europe",
   394  		ImageId: "im-42",
   395  		Stream:  "devel",
   396  	},
   397  }