func registerMeteredCharm(registrationURL string, state *api.State, jar *cookiejar.Jar, charmURL string, serviceName, environmentUUID string) error { charmsClient := charms.NewClient(state) defer charmsClient.Close() metered, err := charmsClient.IsMetered(charmURL) if err != nil { return err } if metered { httpClient := httpbakery.NewHTTPClient() httpClient.Jar = jar credentials, err := registerMetrics(registrationURL, environmentUUID, charmURL, serviceName, httpClient, openWebBrowser) if err != nil { logger.Infof("failed to register metrics: %v", err) return err } api, cerr := getMetricCredentialsAPI(state) if cerr != nil { logger.Infof("failed to get the metrics credentials setter: %v", cerr) } err = api.SetMetricCredentials(serviceName, credentials) if err != nil { logger.Infof("failed to set metric credentials: %v", err) return err } api.Close() } return nil }
// RunPost sends credentials obtained during the call to RunPre to the controller. func (r *RegisterMeteredCharm) RunPost(state api.Connection, bakeryClient *httpbakery.Client, ctx *cmd.Context, deployInfo DeploymentInfo, prevErr error) error { if prevErr != nil { return nil } if r.credentials == nil { return nil } api, cerr := getMetricCredentialsAPI(state) if cerr != nil { logger.Infof("failed to get the metrics credentials setter: %v", cerr) return cerr } defer api.Close() err := api.SetMetricCredentials(deployInfo.ServiceName, r.credentials) if err != nil { logger.Warningf("failed to set metric credentials: %v", err) return errors.Trace(err) } err = r.AllocateBudget.RunPost(state, bakeryClient, ctx, deployInfo, prevErr) if err != nil { logger.Warningf("failed to allocate budget: %v", err) return errors.Trace(err) } return nil }
// RunPost sends credentials obtained during the call to RunPre to the controller. func (r *RegisterMeteredCharm) RunPost(state api.Connection, client *http.Client, deployInfo DeploymentInfo) error { if r.credentials == nil { return nil } api, cerr := getMetricCredentialsAPI(state) if cerr != nil { logger.Infof("failed to get the metrics credentials setter: %v", cerr) return cerr } defer api.Close() err := api.SetMetricCredentials(deployInfo.ServiceName, r.credentials) if err != nil { logger.Infof("failed to set metric credentials: %v", err) return err } return nil }
// RunPost sends credentials obtained during the call to RunPre to the controller. func (r *RegisterMeteredCharm) RunPost(state api.Connection, client *http.Client, deployInfo DeploymentInfo) error { if r.credentials == nil { return nil } api, cerr := getMetricCredentialsAPI(state) if cerr != nil { logger.Infof("failed to get the metrics credentials setter: %v", cerr) return cerr } defer api.Close() err := api.SetMetricCredentials(deployInfo.ServiceName, r.credentials) if params.IsCodeNotImplemented(err) { // The state server is too old to support metering. Warn // the user, but don't return an error. logger.Warningf("current state server version does not support charm metering") return nil } else if err != nil { logger.Infof("failed to set metric credentials: %v", err) return err } return nil }
return err } if metered { httpClient := httpbakery.NewHTTPClient() httpClient.Jar = jar credentials, err := registerMetrics(registrationURL, environmentUUID, charmURL, serviceName, httpClient, openWebBrowser) if err != nil { logger.Infof("failed to register metrics: %v", err) return err } api, cerr := getMetricCredentialsAPI(state) if cerr != nil { logger.Infof("failed to get the metrics credentials setter: %v", cerr) } err = api.SetMetricCredentials(serviceName, credentials) if err != nil { logger.Infof("failed to set metric credentials: %v", err) return err } api.Close() } return nil } func registerMetrics(registrationURL, environmentUUID, charmURL, serviceName string, client *http.Client, visitWebPage func(*url.URL) error) ([]byte, error) { if registrationURL == "" { return nil, errors.Errorf("no metric registration url is specified") } registerURL, err := url.Parse(registrationURL) if err != nil {