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 }