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] = &params.BundleChangesChange{
    50  			Id:       c.Id(),
    51  			Method:   c.Method(),
    52  			Args:     c.GUIArgs(),
    53  			Requires: c.Requires(),
    54  		}
    55  	}
    56  	return results, nil
    57  }