func (c *DeployCommand) deployCharm( curl *charm.URL, series string, ctx *cmd.Context, client *api.Client, deployer *serviceDeployer, ) (rErr error) { if c.BumpRevision { ctx.Infof("--upgrade (or -u) is deprecated and ignored; charms are always deployed with a unique revision.") } charmInfo, err := client.CharmInfo(curl.String()) if err != nil { return err } numUnits := c.NumUnits if charmInfo.Meta.Subordinate { if !constraints.IsEmpty(&c.Constraints) { return errors.New("cannot use --constraints with subordinate service") } if numUnits == 1 && c.PlacementSpec == "" { numUnits = 0 } else { return errors.New("cannot use --num-units or --to with subordinate service") } } serviceName := c.ServiceName if serviceName == "" { serviceName = charmInfo.Meta.Name } var configYAML []byte if c.Config.Path != "" { configYAML, err = c.Config.Read(ctx) if err != nil { return err } } state, err := c.NewAPIRoot() if err != nil { return errors.Trace(err) } httpClient, err := c.HTTPClient() if err != nil { return errors.Trace(err) } deployInfo := DeploymentInfo{ CharmURL: curl, ServiceName: serviceName, ModelUUID: client.ModelUUID(), } for _, step := range c.Steps { err = step.RunPre(state, httpClient, ctx, deployInfo) if err != nil { return err } } defer func() { for _, step := range c.Steps { err = step.RunPost(state, httpClient, ctx, deployInfo, rErr) if err != nil { rErr = err } } }() if err := deployer.serviceDeploy(serviceDeployParams{ curl.String(), serviceName, series, numUnits, string(configYAML), c.Constraints, c.Placement, c.Networks, c.Storage, }); err != nil { return err } state, err = c.NewAPIRoot() if err != nil { return errors.Trace(err) } httpClient, err = c.HTTPClient() if err != nil { return errors.Trace(err) } return err }