// addCharmViaAPI calls the appropriate client API calls to add the // given charm URL to state. For non-public charm URLs, this function also // handles the macaroon authorization process using the given csClient. // The resulting charm URL of the added charm is displayed on stdout. func addCharmViaAPI(client *api.Client, ctx *cmd.Context, curl *charm.URL, repo charmrepo.Interface, csclient *csClient) (*charm.URL, error) { switch curl.Schema { case "local": ch, err := repo.Get(curl) if err != nil { return nil, err } stateCurl, err := client.AddLocalCharm(curl, ch) if err != nil { return nil, err } curl = stateCurl case "cs": if err := client.AddCharm(curl); err != nil { if !params.IsCodeUnauthorized(err) { return nil, errors.Mask(err) } m, err := csclient.authorize(curl) if err != nil { return nil, errors.Mask(err) } if err := client.AddCharmWithAuthorization(curl, m); err != nil { return nil, errors.Mask(err) } } default: return nil, fmt.Errorf("unsupported charm URL schema: %q", curl.Schema) } ctx.Infof("Added charm %q to the environment.", curl) return curl, nil }
// addCharmViaAPI calls the appropriate client API calls to add the // given charm URL to state. Also displays the charm URL of the added // charm on stdout. func addCharmViaAPI(client *api.Client, ctx *cmd.Context, curl *charm.URL, repo charm.Repository) (*charm.URL, error) { if curl.Revision < 0 { latest, err := charm.Latest(repo, curl) if err != nil { return nil, err } curl = curl.WithRevision(latest) } switch curl.Schema { case "local": ch, err := repo.Get(curl) if err != nil { return nil, err } stateCurl, err := client.AddLocalCharm(curl, ch) if err != nil { return nil, err } curl = stateCurl case "cs": err := client.AddCharm(curl) if err != nil { return nil, err } default: return nil, fmt.Errorf("unsupported charm URL schema: %q", curl.Schema) } ctx.Infof("Added charm %q to the environment.", curl) return curl, nil }
// addCharmFromURL calls the appropriate client API calls to add the // given charm URL to state. For non-public charm URLs, this function also // handles the macaroon authorization process using the given csClient. // The resulting charm URL of the added charm is displayed on stdout. func addCharmFromURL(client *api.Client, curl *charm.URL, repo charmrepo.Interface, csclient *csClient) (*charm.URL, error) { switch curl.Schema { case "local": ch, err := repo.Get(curl) if err != nil { return nil, err } stateCurl, err := client.AddLocalCharm(curl, ch) if err != nil { return nil, err } curl = stateCurl case "cs": if err := client.AddCharm(curl); err != nil { if !params.IsCodeUnauthorized(err) { return nil, errors.Trace(err) } m, err := csclient.authorize(curl) if err != nil { return nil, maybeTermsAgreementError(err) } if err := client.AddCharmWithAuthorization(curl, m); err != nil { return nil, errors.Trace(err) } } default: return nil, fmt.Errorf("unsupported charm URL schema: %q", curl.Schema) } return curl, nil }
// addCharmFromURL calls the appropriate client API calls to add the // given charm URL to state. For non-public charm URLs, this function also // handles the macaroon authorization process using the given csClient. // The resulting charm URL of the added charm is displayed on stdout. func addCharmFromURL(client *api.Client, curl *charm.URL, channel csparams.Channel, csClient *csclient.Client) (*charm.URL, *macaroon.Macaroon, error) { var csMac *macaroon.Macaroon if err := client.AddCharm(curl, channel); err != nil { if !params.IsCodeUnauthorized(err) { return nil, nil, errors.Trace(err) } m, err := authorizeCharmStoreEntity(csClient, curl) if err != nil { return nil, nil, maybeTermsAgreementError(err) } if err := client.AddCharmWithAuthorization(curl, channel, m); err != nil { return nil, nil, errors.Trace(err) } csMac = m } return curl, csMac, nil }
// addCharmFromURL calls the appropriate client API calls to add the // given charm URL to state. For non-public charm URLs, this function also // handles the macaroon authorization process using the given csClient. // The resulting charm URL of the added charm is displayed on stdout. // // The repo holds the charm repository associated with with the URL // by resolveCharmStoreEntityURL. func addCharmFromURL(client *api.Client, curl *charm.URL, channel csparams.Channel, repo charmrepo.Interface) (*charm.URL, *macaroon.Macaroon, error) { var csMac *macaroon.Macaroon switch curl.Schema { case "local": ch, err := repo.Get(curl) if err != nil { return nil, nil, err } stateCurl, err := client.AddLocalCharm(curl, ch) if err != nil { return nil, nil, err } curl = stateCurl case "cs": repo, ok := repo.(*charmrepo.CharmStore) if !ok { return nil, nil, errors.Errorf("(cannot happen) cs-schema URL with unexpected repo type %T", repo) } csClient := repo.Client() if err := client.AddCharm(curl, channel); err != nil { if !params.IsCodeUnauthorized(err) { return nil, nil, errors.Trace(err) } m, err := authorizeCharmStoreEntity(csClient, curl) if err != nil { return nil, nil, maybeTermsAgreementError(err) } if err := client.AddCharmWithAuthorization(curl, channel, m); err != nil { return nil, nil, errors.Trace(err) } csMac = m } default: return nil, nil, fmt.Errorf("unsupported charm URL schema: %q", curl.Schema) } return curl, csMac, nil }