func (s *JujuConnSuite) AddTestingCharm(c *gc.C, name string) *state.Charm { ch := testcharms.Repo.CharmDir(name) ident := fmt.Sprintf("%s-%d", ch.Meta().Name, ch.Revision()) curl := charm.MustParseURL("local:quantal/" + ident) repo, err := charmrepo.InferRepository( curl.Reference(), charmrepo.NewCharmStoreParams{}, testcharms.Repo.Path()) c.Assert(err, jc.ErrorIsNil) sch, err := PutCharm(s.State, curl, repo, false) c.Assert(err, jc.ErrorIsNil) return sch }
// resolveCharmURL resolves the given charm URL string // by looking it up in the appropriate charm repository. // If it is a charm store charm URL, the given csParams will // be used to access the charm store repository. // If it is a local charm URL, the local charm repository at // the given repoPath will be used. The given configuration // will be used to add any necessary attributes to the repo // and to resolve the default series if possible. // // resolveCharmURL also returns the charm repository holding // the charm. func resolveCharmURL(curlStr string, csParams charmrepo.NewCharmStoreParams, repoPath string, conf *config.Config) (*charm.URL, charmrepo.Interface, error) { ref, err := charm.ParseReference(curlStr) if err != nil { return nil, nil, errors.Trace(err) } repo, err := charmrepo.InferRepository(ref, csParams, repoPath) if err != nil { return nil, nil, errors.Trace(err) } repo = config.SpecializeCharmRepo(repo, conf) if ref.Series == "" { if defaultSeries, ok := conf.DefaultSeries(); ok { ref.Series = defaultSeries } } if ref.Schema == "local" && ref.Series == "" { possibleURL := *ref possibleURL.Series = "trusty" logger.Errorf("The series is not specified in the environment (default-series) or with the charm. Did you mean:\n\t%s", &possibleURL) return nil, nil, errors.Errorf("cannot resolve series for charm: %q", ref) } if ref.Series != "" && ref.Revision != -1 { // The URL is already fully resolved; do not // bother with an unnecessary round-trip to the // charm store. curl, err := ref.URL("") if err != nil { panic(err) } return curl, repo, nil } curl, err := repo.Resolve(ref) if err != nil { return nil, nil, errors.Trace(err) } return curl, repo, nil }