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