github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/plugins/juju-metadata/addimage_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  	"regexp"
     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/jujuclient/jujuclienttesting"
    19  )
    20  
    21  type addImageSuite struct {
    22  	BaseCloudImageMetadataSuite
    23  
    24  	data []params.CloudImageMetadata
    25  
    26  	mockAPI *mockAddAPI
    27  }
    28  
    29  var _ = gc.Suite(&addImageSuite{})
    30  
    31  var emptyMetadata = []params.CloudImageMetadata{}
    32  
    33  func (s *addImageSuite) SetUpTest(c *gc.C) {
    34  	s.BaseCloudImageMetadataSuite.SetUpTest(c)
    35  
    36  	s.data = emptyMetadata
    37  
    38  	s.mockAPI = &mockAddAPI{}
    39  	s.mockAPI.add = func(metadata []params.CloudImageMetadata) error {
    40  		s.data = append(s.data, metadata...)
    41  		return nil
    42  	}
    43  	s.PatchValue(&getImageMetadataAddAPI, func(c *addImageMetadataCommand) (MetadataAddAPI, error) {
    44  		return s.mockAPI, nil
    45  	})
    46  }
    47  
    48  func (s *addImageSuite) TestAddImageMetadata(c *gc.C) {
    49  	s.assertValidAddImageMetadata(c, constructTestImageMetadata())
    50  }
    51  
    52  func (s *addImageSuite) TestAddImageMetadataWithStream(c *gc.C) {
    53  	m := constructTestImageMetadata()
    54  	m.Stream = "streamV"
    55  	s.assertValidAddImageMetadata(c, m)
    56  }
    57  
    58  func (s *addImageSuite) TestAddImageMetadataWithRegion(c *gc.C) {
    59  	m := constructTestImageMetadata()
    60  	m.Region = "region"
    61  	s.assertValidAddImageMetadata(c, m)
    62  }
    63  
    64  func (s *addImageSuite) TestAddImageMetadataAWS(c *gc.C) {
    65  	m := constructTestImageMetadata()
    66  	m.VirtType = "vType"
    67  	m.RootStorageType = "sType"
    68  	s.assertValidAddImageMetadata(c, m)
    69  }
    70  
    71  func (s *addImageSuite) TestAddImageMetadataAWSWithSize(c *gc.C) {
    72  	m := constructTestImageMetadata()
    73  	m.VirtType = "vType"
    74  	m.RootStorageType = "sType"
    75  
    76  	size := uint64(100)
    77  	m.RootStorageSize = &size
    78  
    79  	s.assertValidAddImageMetadata(c, m)
    80  }
    81  
    82  func (s *addImageSuite) TestAddImageMetadataFailed(c *gc.C) {
    83  	msg := "failed"
    84  	s.mockAPI.add = func(metadata []params.CloudImageMetadata) error {
    85  		return errors.New(msg)
    86  	}
    87  
    88  	s.assertAddImageMetadataErr(c, constructTestImageMetadata(), msg)
    89  }
    90  
    91  func (s *addImageSuite) TestAddImageMetadataNoImageId(c *gc.C) {
    92  	m := constructTestImageMetadata()
    93  	m.ImageId = ""
    94  
    95  	s.assertAddImageMetadataErr(c, m, "image id must be supplied when adding image metadata")
    96  }
    97  
    98  func (s *addImageSuite) TestAddImageMetadataNoSeries(c *gc.C) {
    99  	m := constructTestImageMetadata()
   100  	m.Series = ""
   101  	// Series will default to config default, for e.g. "trusty"
   102  	s.assertValidAddImageMetadata(c, m)
   103  }
   104  
   105  func (s *addImageSuite) TestAddImageMetadataInvalidSeries(c *gc.C) {
   106  	m := constructTestImageMetadata()
   107  	m.Series = "blah"
   108  
   109  	s.assertAddImageMetadataErr(c, m, regexp.QuoteMeta(`unknown version for series: "blah"`))
   110  }
   111  
   112  func (s *addImageSuite) TestAddImageMetadataNoArch(c *gc.C) {
   113  	m := constructTestImageMetadata()
   114  	m.Arch = ""
   115  
   116  	s.assertValidAddImageMetadata(c, m)
   117  }
   118  
   119  func (s *addImageSuite) assertValidAddImageMetadata(c *gc.C, m params.CloudImageMetadata) {
   120  	args := getAddImageMetadataCmdFlags(c, m)
   121  
   122  	_, err := runAddImageMetadata(c, args...)
   123  	c.Assert(err, jc.ErrorIsNil)
   124  
   125  	// Need to make sure that defaults are populated
   126  	if m.Arch == "" {
   127  		m.Arch = "amd64"
   128  	}
   129  	if m.Stream == "" {
   130  		m.Stream = "released"
   131  	}
   132  
   133  	c.Assert(s.data, gc.DeepEquals, []params.CloudImageMetadata{m})
   134  }
   135  
   136  func runAddImageMetadata(c *gc.C, args ...string) (*cmd.Context, error) {
   137  	cmd := &addImageMetadataCommand{}
   138  	cmd.SetClientStore(jujuclienttesting.MinimalStore())
   139  	return cmdtesting.RunCommand(c, modelcmd.Wrap(cmd), args...)
   140  }
   141  
   142  func (s *addImageSuite) assertAddImageMetadataErr(c *gc.C, m params.CloudImageMetadata, msg string) {
   143  	args := getAddImageMetadataCmdFlags(c, m)
   144  	_, err := runAddImageMetadata(c, args...)
   145  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf(".*%v.*", msg))
   146  	c.Assert(s.data, gc.DeepEquals, emptyMetadata)
   147  }
   148  
   149  func constructTestImageMetadata() params.CloudImageMetadata {
   150  	return params.CloudImageMetadata{
   151  		ImageId: "im-33333",
   152  		Series:  "trusty",
   153  		Arch:    "arch",
   154  		Source:  "custom",
   155  	}
   156  }
   157  
   158  func getAddImageMetadataCmdFlags(c *gc.C, data params.CloudImageMetadata) []string {
   159  	args := []string{}
   160  
   161  	addFlag := func(flag, value, defaultValue string) {
   162  		if value != "" {
   163  			args = append(args, flag, value)
   164  		} else {
   165  			if defaultValue != "" {
   166  				args = append(args, flag, defaultValue)
   167  			}
   168  		}
   169  	}
   170  
   171  	addFlag("--series", data.Series, "")
   172  	addFlag("--region", data.Region, "")
   173  	addFlag("--arch", data.Arch, "amd64")
   174  	addFlag("--virt-type", data.VirtType, "")
   175  	addFlag("--storage-type", data.RootStorageType, "")
   176  	addFlag("--stream", data.Stream, "released")
   177  
   178  	if data.RootStorageSize != nil {
   179  		args = append(args, "--storage-size", fmt.Sprintf("%d", *data.RootStorageSize))
   180  	}
   181  
   182  	// image id is an argument
   183  	if data.ImageId != "" {
   184  		args = append(args, data.ImageId)
   185  	}
   186  	return args
   187  }
   188  
   189  type mockAddAPI struct {
   190  	add func(metadata []params.CloudImageMetadata) error
   191  }
   192  
   193  func (s mockAddAPI) Close() error {
   194  	return nil
   195  }
   196  
   197  func (s mockAddAPI) Save(metadata []params.CloudImageMetadata) error {
   198  	return s.add(metadata)
   199  }