github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 if err := c.checkCanRead(); err != nil { 23 return params.GetBundleChangesResults{}, err 24 } 25 26 var results params.GetBundleChangesResults 27 data, err := charm.ReadBundleData(strings.NewReader(args.BundleDataYAML)) 28 if err != nil { 29 return results, errors.Annotate(err, "cannot read bundle YAML") 30 } 31 verifyConstraints := func(s string) error { 32 _, err := constraints.Parse(s) 33 return err 34 } 35 verifyStorage := func(s string) error { 36 _, err := storage.ParseConstraints(s) 37 return err 38 } 39 if err := data.Verify(verifyConstraints, verifyStorage); err != nil { 40 if err, ok := err.(*charm.VerificationError); ok { 41 results.Errors = make([]string, len(err.Errors)) 42 for i, e := range err.Errors { 43 results.Errors[i] = e.Error() 44 } 45 return results, nil 46 } 47 // This should never happen as Verify only returns verification errors. 48 return results, errors.Annotate(err, "cannot verify bundle") 49 } 50 changes := bundlechanges.FromData(data) 51 results.Changes = make([]*params.BundleChangesChange, len(changes)) 52 for i, c := range changes { 53 results.Changes[i] = ¶ms.BundleChangesChange{ 54 Id: c.Id(), 55 Method: c.Method(), 56 Args: c.GUIArgs(), 57 Requires: c.Requires(), 58 } 59 } 60 return results, nil 61 }