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