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