github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/client/bundles.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package client 5 6 import ( 7 "strings" 8 9 "github.com/juju/bundlechanges" 10 "github.com/juju/errors" 11 "gopkg.in/juju/charm.v6-unstable" 12 13 "github.com/juju/juju/apiserver/params" 14 "github.com/juju/juju/constraints" 15 "github.com/juju/juju/storage" 16 ) 17 18 // GetBundleChanges returns the list of changes required to deploy the given 19 // bundle data. The changes are sorted by requirements, so that they can be 20 // applied in order. 21 func (c *Client) GetBundleChanges(args params.GetBundleChangesParams) (params.GetBundleChangesResults, error) { 22 var results params.GetBundleChangesResults 23 data, err := charm.ReadBundleData(strings.NewReader(args.BundleDataYAML)) 24 if err != nil { 25 return results, errors.Annotate(err, "cannot read bundle YAML") 26 } 27 verifyConstraints := func(s string) error { 28 _, err := constraints.Parse(s) 29 return err 30 } 31 verifyStorage := func(s string) error { 32 _, err := storage.ParseConstraints(s) 33 return err 34 } 35 if err := data.Verify(verifyConstraints, verifyStorage); err != nil { 36 if err, ok := err.(*charm.VerificationError); ok { 37 results.Errors = make([]string, len(err.Errors)) 38 for i, e := range err.Errors { 39 results.Errors[i] = e.Error() 40 } 41 return results, nil 42 } 43 // This should never happen as Verify only returns verification errors. 44 return results, errors.Annotate(err, "cannot verify bundle") 45 } 46 changes := bundlechanges.FromData(data) 47 results.Changes = make([]*params.BundleChangesChange, len(changes)) 48 for i, c := range changes { 49 results.Changes[i] = ¶ms.BundleChangesChange{ 50 Id: c.Id(), 51 Method: c.Method(), 52 Args: c.GUIArgs(), 53 Requires: c.Requires(), 54 } 55 } 56 return results, nil 57 }