1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
12
"launchpad.net/gnuflag"
14
"launchpad.net/juju-core/cmd"
15
"launchpad.net/juju-core/environs"
16
"launchpad.net/juju-core/environs/imagemetadata"
19
// ValidateImageMetadataCommand
20
type ValidateImageMetadataCommand struct {
29
var validateImagesMetadataDoc = `
30
validate-images loads simplestreams metadata and validates the contents by looking for images
31
belonging to the specified cloud.
33
The cloud specificaton comes from the current Juju environment, as specified in the usual way
34
from either ~/.juju/environments.yaml, the -e option, or JUJU_ENV. Series, Region, and Endpoint
35
are the key attributes.
37
The key environment attributes may be overridden using command arguments, so that the validation
38
may be peformed on arbitary metadata.
42
- validate using the current environment settings but with series raring
43
juju metadata validate-images -s raring
45
- validate using the current environment settings but with series raring and using metadata from local directory
46
juju metadata validate-images -s raring -d <some directory>
48
A key use case is to validate newly generated metadata prior to deployment to production.
49
In this case, the metadata is placed in a local directory, a cloud provider type is specified (ec2, openstack etc),
50
and the validation is performed for each supported region and series.
56
juju metadata validate-images -p ec2 -r us-east-1 -s precise -d <some directory>
58
[ $RETVAL -eq 0 ] && echo Success
59
[ $RETVAL -ne 0 ] && echo Failure
62
func (c *ValidateImageMetadataCommand) Info() *cmd.Info {
64
Name: "validate-images",
65
Purpose: "validate image metadata and ensure image(s) exist for an environment",
66
Doc: validateImagesMetadataDoc,
70
func (c *ValidateImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
71
c.EnvCommandBase.SetFlags(f)
72
f.StringVar(&c.providerType, "p", "", "the provider type eg ec2, openstack")
73
f.StringVar(&c.metadataDir, "d", "", "directory where metadata files are found")
74
f.StringVar(&c.series, "s", "", "the series for which to validate (overrides env config series)")
75
f.StringVar(&c.region, "r", "", "the region for which to validate (overrides env config region)")
76
f.StringVar(&c.endpoint, "u", "", "the cloud endpoint URL for which to validate (overrides env config endpoint)")
79
func (c *ValidateImageMetadataCommand) Init(args []string) error {
80
if c.providerType != "" {
82
return fmt.Errorf("series required if provider type is specified")
85
return fmt.Errorf("region required if provider type is specified")
87
if c.metadataDir == "" {
88
return fmt.Errorf("metadata directory required if provider type is specified")
91
return c.EnvCommandBase.Init(args)
94
func (c *ValidateImageMetadataCommand) Run(context *cmd.Context) error {
95
var params *imagemetadata.MetadataLookupParams
97
if c.providerType == "" {
98
environ, err := environs.NewFromName(c.EnvName)
102
mdLookup, ok := environ.(imagemetadata.ImageMetadataValidator)
104
return fmt.Errorf("%s provider does not support image metadata validation", environ.Config().Type())
106
params, err = mdLookup.MetadataLookupParams(c.region)
111
prov, err := environs.Provider(c.providerType)
115
mdLookup, ok := prov.(imagemetadata.ImageMetadataValidator)
117
return fmt.Errorf("%s provider does not support image metadata validation", c.providerType)
119
params, err = mdLookup.MetadataLookupParams(c.region)
126
params.Series = c.series
129
params.Region = c.region
131
if c.endpoint != "" {
132
params.Endpoint = c.endpoint
134
// If the metadata files are to be loaded from a directory, we need to register
135
// a file http transport.
136
if c.metadataDir != "" {
137
if _, err := os.Stat(c.metadataDir); err != nil {
141
params.BaseURLs = []string{"file://" + c.metadataDir}
142
t := &http.Transport{}
143
t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/")))
144
c := &http.Client{Transport: t}
145
imagemetadata.SetHttpClient(c)
148
image_ids, err := imagemetadata.ValidateImageMetadata(params)
153
if len(image_ids) > 0 {
154
fmt.Fprintf(context.Stdout, "matching image ids for region %q:\n%s\n", params.Region, strings.Join(image_ids, "\n"))
156
return fmt.Errorf("no matching image ids for region %s using URLs:\n%s", params.Region, strings.Join(params.BaseURLs, "\n"))