func (c *removeServiceCommand) removeAllocation(ctx *cmd.Context) error { client, err := c.getAPI() if err != nil { return err } charmURL, err := client.GetCharmURL(c.ServiceName) if err != nil { return errors.Trace(err) } if charmURL.Schema == "local" { return nil } root, err := c.NewAPIRoot() if err != nil { return errors.Trace(err) } charmsClient := charms.NewClient(root) metered, err := charmsClient.IsMetered(charmURL.String()) if err != nil { return errors.Trace(err) } if !metered { return nil } modelUUID := client.ModelUUID() httpClient, err := c.HTTPClient() if err != nil { return errors.Trace(err) } bClient, err := getBudgetAPIClient(httpClient) if err != nil { return errors.Trace(err) } resp, err := bClient.DeleteAllocation(modelUUID, c.ServiceName) if wireformat.IsNotAvail(err) { fmt.Fprintf(ctx.Stdout, "WARNING: Allocation not removed - %s.\n", err.Error()) } else if err != nil { return err } if resp != "" { fmt.Fprintf(ctx.Stdout, "%s\n", resp) } return nil }
func (c *removeServiceCommand) removeAllocation(ctx *cmd.Context) error { client, err := c.getAPI() if err != nil { return err } charmURL, err := client.GetCharmURL(c.ApplicationName) if err != nil { return errors.Trace(err) } if charmURL.Schema == "local" { return nil } root, err := c.NewAPIRoot() if err != nil { return errors.Trace(err) } charmsClient := charms.NewClient(root) metered, err := charmsClient.IsMetered(charmURL.String()) if err != nil { return errors.Trace(err) } if !metered { return nil } modelUUID := client.ModelUUID() bakeryClient, err := c.BakeryClient() if err != nil { return errors.Trace(err) } budgetClient := getBudgetAPIClient(bakeryClient) resp, err := budgetClient.DeleteAllocation(modelUUID, c.ApplicationName) if wireformat.IsNotAvail(err) { logger.Warningf("allocation not removed: %v", err) } else if err != nil { return err } if resp != "" { logger.Infof(resp) } return nil }
func (t *TSuite) TestCreateBudgetUnavail(c *gc.C) { httpClient := &mockClient{ RespCode: http.StatusServiceUnavailable, } client := budget.NewClient(httpClient) response, err := client.CreateBudget("personal", "200") c.Assert(wireformat.IsNotAvail(err), jc.IsTrue) c.Assert(response, gc.Equals, "") httpClient.CheckCalls(c, []jujutesting.StubCall{{ "DoWithBody", []interface{}{"POST", "https://api.jujucharms.com/omnibus/v2/budget", map[string]interface{}{ "limit": "200", "budget": "personal", }, }}}) }
func (t *TSuite) TestCreateBudgetConnRefused(c *gc.C) { httpClient := &mockClient{ RespCode: http.StatusOK, } httpClient.SetErrors(errors.New("Connection refused")) client := budget.NewClient(httpClient) response, err := client.CreateBudget("personal", "200") c.Assert(wireformat.IsNotAvail(err), jc.IsTrue) c.Assert(response, gc.Equals, "") httpClient.CheckCalls(c, []jujutesting.StubCall{{ "DoWithBody", []interface{}{"POST", "application/json", "https://api.jujucharms.com/omnibus/v2/budget", map[string]interface{}{ "limit": "200", "budget": "personal", }, }}}) }
// RunPre is part of the DeployStep interface. func (a *AllocateBudget) RunPre(state api.Connection, client *http.Client, ctx *cmd.Context, deployInfo DeploymentInfo) error { if deployInfo.CharmURL.Schema == "local" { return nil } charmsClient := charms.NewClient(state) metered, err := charmsClient.IsMetered(deployInfo.CharmURL.String()) if params.IsCodeNotImplemented(err) { // The state server is too old to support metering. Warn // the user, but don't return an error. logger.Tracef("current state server version does not support charm metering") return nil } else if err != nil { return errors.Annotate(err, "could not determine charm type") } if !metered { return nil } allocBudget, allocLimit, err := parseBudgetWithLimit(a.AllocationSpec) if err != nil { return errors.Trace(err) } a.APIClient, err = getApiClient(client) if err != nil { return errors.Annotate(err, "could not create API client") } resp, err := a.APIClient.CreateAllocation(allocBudget, allocLimit, deployInfo.ModelUUID, []string{deployInfo.ServiceName}) if err != nil { if wireformat.IsNotAvail(err) { fmt.Fprintf(ctx.Stdout, "WARNING: Allocation not created - %s.\n", err.Error()) return nil } return errors.Annotate(err, "could not create budget allocation") } a.allocated = true fmt.Fprintf(ctx.Stdout, "%s\n", resp) return nil }