github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/cmd/plugins/juju-metadata/addimage.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  	"launchpad.net/gnuflag"
    12  
    13  	"github.com/juju/juju/apiserver/params"
    14  )
    15  
    16  const AddImageCommandDoc = `
    17  Add image metadata to Juju environment.
    18  
    19  Image metadata properties vary between providers. Consequently, some properties
    20  are optional for this command but they may still be needed by your provider.
    21  
    22  options:
    23  -e, --environment (= "")
    24     juju environment to operate in
    25  --image-id
    26     image identifier
    27  --region
    28     cloud region
    29  --series (= "trusty")
    30     image series
    31  --arch (= "amd64")
    32     image architectures
    33  --virt-type
    34     virtualisation type [provider specific], e.g. hmv
    35  --storage-type
    36     root storage type [provider specific], e.g. ebs
    37  --storage-size
    38     root storage size [provider specific]
    39  --stream (= "released")
    40     image stream
    41  `
    42  
    43  // AddImageMetadataCommand stores image metadata in Juju environment.
    44  type AddImageMetadataCommand struct {
    45  	CloudImageMetadataCommandBase
    46  
    47  	ImageId         string
    48  	Region          string
    49  	Series          string
    50  	Arch            string
    51  	VirtType        string
    52  	RootStorageType string
    53  	RootStorageSize uint64
    54  	Stream          string
    55  }
    56  
    57  // Init implements Command.Init.
    58  func (c *AddImageMetadataCommand) Init(args []string) (err error) {
    59  	if err := checkArgumentSet(c.ImageId, "image id"); err != nil {
    60  		return err
    61  	}
    62  	return nil
    63  }
    64  
    65  // Info implements Command.Info.
    66  func (c *AddImageMetadataCommand) Info() *cmd.Info {
    67  	return &cmd.Info{
    68  		Name:    "add-image",
    69  		Purpose: "adds image metadata to environment",
    70  		Doc:     AddImageCommandDoc,
    71  	}
    72  }
    73  
    74  // SetFlags implements Command.SetFlags.
    75  func (c *AddImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
    76  	c.CloudImageMetadataCommandBase.SetFlags(f)
    77  
    78  	f.StringVar(&c.ImageId, "image-id", "", "metadata image id")
    79  	f.StringVar(&c.Region, "region", "", "image cloud region")
    80  	// TODO (anastasiamac 2015-09-30) Ideally default should be latest LTS.
    81  	// Hard-coding "trusty" for now.
    82  	f.StringVar(&c.Series, "series", "trusty", "image series")
    83  	f.StringVar(&c.Arch, "arch", "amd64", "image architecture")
    84  	f.StringVar(&c.VirtType, "virt-type", "", "image metadata virtualisation type")
    85  	f.StringVar(&c.RootStorageType, "storage-type", "", "image metadata root storage type")
    86  	f.Uint64Var(&c.RootStorageSize, "storage-size", 0, "image metadata root storage size")
    87  	f.StringVar(&c.Stream, "stream", "released", "image metadata stream")
    88  }
    89  
    90  // Run implements Command.Run.
    91  func (c *AddImageMetadataCommand) Run(ctx *cmd.Context) (err error) {
    92  	api, err := getImageMetadataAddAPI(c)
    93  	if err != nil {
    94  		return err
    95  	}
    96  	defer api.Close()
    97  
    98  	m := c.constructMetadataParam()
    99  	found, err := api.Save([]params.CloudImageMetadata{m})
   100  	if err != nil {
   101  		return err
   102  	}
   103  	if len(found) == 0 {
   104  		return nil
   105  	}
   106  	if len(found) > 1 {
   107  		return errors.New(fmt.Sprintf("expected one result, got %d", len(found)))
   108  	}
   109  	if found[0].Error != nil {
   110  		return errors.New(found[0].Error.GoString())
   111  	}
   112  	return nil
   113  }
   114  
   115  // MetadataAddAPI defines the API methods that add image metadata command uses.
   116  type MetadataAddAPI interface {
   117  	Close() error
   118  	Save(metadata []params.CloudImageMetadata) ([]params.ErrorResult, error)
   119  }
   120  
   121  var getImageMetadataAddAPI = (*AddImageMetadataCommand).getImageMetadataAddAPI
   122  
   123  func (c *AddImageMetadataCommand) getImageMetadataAddAPI() (MetadataAddAPI, error) {
   124  	return c.NewImageMetadataAPI()
   125  }
   126  
   127  func checkArgumentSet(arg, name string) (err error) {
   128  	if arg == "" {
   129  		return errors.New(fmt.Sprintf("%v must be supplied when adding an image metadata", name))
   130  	}
   131  	return nil
   132  }
   133  
   134  // constructMetadataParam returns cloud image metadata as a param.
   135  func (c *AddImageMetadataCommand) constructMetadataParam() params.CloudImageMetadata {
   136  	info := params.CloudImageMetadata{
   137  		ImageId:         c.ImageId,
   138  		Region:          c.Region,
   139  		Series:          c.Series,
   140  		Arch:            c.Arch,
   141  		VirtType:        c.VirtType,
   142  		RootStorageType: c.RootStorageType,
   143  		Stream:          c.Stream,
   144  		Source:          "custom",
   145  	}
   146  	if c.RootStorageSize != 0 {
   147  		info.RootStorageSize = &c.RootStorageSize
   148  	}
   149  	return info
   150  }