github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/romulus/resolve.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package romulus
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/juju/api/controller"
     9  	"github.com/juju/juju/cmd/modelcmd"
    10  	"gopkg.in/juju/charm.v6"
    11  	"gopkg.in/juju/charmrepo.v3"
    12  	"gopkg.in/macaroon-bakery.v2-unstable/httpbakery"
    13  )
    14  
    15  // CharmResolver interface defines the functionality to resolve a charm URL.
    16  type CharmResolver interface {
    17  	// Resolve resolves the charm URL.
    18  	Resolve(client *httpbakery.Client, charmURL string) (string, error)
    19  }
    20  
    21  // CharmStoreResolver implements the CharmResolver interface.
    22  type CharmStoreResolver struct {
    23  	csURL string
    24  }
    25  
    26  // NewCharmStoreResolverForControllerCmd creates a new charm store resolver
    27  // that connects to the controller configured charmstore-url.
    28  var NewCharmStoreResolverForControllerCmd = newCharmStoreResolverForControllerCmdImpl
    29  
    30  func newCharmStoreResolverForControllerCmdImpl(c *modelcmd.ControllerCommandBase) (CharmResolver, error) {
    31  	controllerAPIRoot, err := c.NewAPIRoot()
    32  	if err != nil {
    33  		return nil, errors.Trace(err)
    34  	}
    35  	controllerAPI := controller.NewClient(controllerAPIRoot)
    36  	controllerCfg, err := controllerAPI.ControllerConfig()
    37  	if err != nil {
    38  		return nil, errors.Trace(err)
    39  	}
    40  	return &CharmStoreResolver{
    41  		csURL: controllerCfg.CharmStoreURL(),
    42  	}, nil
    43  }
    44  
    45  // Resolve implements the CharmResolver interface.
    46  func (r *CharmStoreResolver) Resolve(client *httpbakery.Client, charmURL string) (string, error) {
    47  	repo := charmrepo.NewCharmStore(charmrepo.NewCharmStoreParams{
    48  		BakeryClient: client,
    49  		URL:          r.csURL,
    50  	})
    51  
    52  	curl, err := charm.ParseURL(charmURL)
    53  	if err != nil {
    54  		return "", errors.Annotate(err, "could not parse charm url")
    55  	}
    56  	// ignore local charm urls
    57  	if curl.Schema == "local" {
    58  		return charmURL, nil
    59  	}
    60  	resolvedURL, _, err := repo.Resolve(curl)
    61  	if err != nil {
    62  		return "", errors.Trace(err)
    63  	}
    64  	return resolvedURL.String(), nil
    65  }