func (s *CharmSuite) TestInferRepository(c *gc.C) { for i, t := range inferRepoTests { c.Logf("test %d", i) curl, err := charm.InferURL(t.url, "precise") c.Assert(err, gc.IsNil) repo, err := charm.InferRepository(curl.Reference, "/some/path") c.Assert(err, gc.IsNil) switch repo := repo.(type) { case *charm.LocalRepository: c.Assert(repo.Path, gc.Equals, t.path) default: c.Assert(repo, gc.Equals, charm.Store) } } curl, err := charm.InferURL("local:whatever", "precise") c.Assert(err, gc.IsNil) _, err = charm.InferRepository(curl.Reference, "") c.Assert(err, gc.ErrorMatches, "path to local repository not specified") curl.Schema = "foo" _, err = charm.InferRepository(curl.Reference, "") c.Assert(err, gc.ErrorMatches, "unknown schema for charm reference.*") }
func (c *DeployCommand) Run(ctx *cmd.Context) error { client, err := juju.NewAPIClientFromName(c.EnvName) if err != nil { return err } defer client.Close() attrs, err := client.EnvironmentGet() if err != nil { return err } conf, err := config.New(config.NoDefaults, attrs) if err != nil { return err } curl, err := resolveCharmURL(c.CharmName, client, conf) if err != nil { return err } repo, err := charm.InferRepository(curl.Reference, ctx.AbsPath(c.RepoPath)) if err != nil { return err } repo = config.SpecializeCharmRepo(repo, conf) curl, err = addCharmViaAPI(client, ctx, curl, repo) if err != nil { return err } if c.BumpRevision { ctx.Infof("--upgrade (or -u) is deprecated and ignored; charms are always deployed with a unique revision.") } var includeNetworks []string if c.Networks != "" { includeNetworks = parseNetworks(c.Networks) env, err := environs.New(conf) if err != nil { return err } if !env.SupportNetworks() { return errors.New("cannot use --networks: not supported by the environment") } } 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.ToMachineSpec == "" { 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 } } err = client.ServiceDeployWithNetworks( curl.String(), serviceName, numUnits, string(configYAML), c.Constraints, c.ToMachineSpec, includeNetworks, nil, ) if params.IsCodeNotImplemented(err) { if len(includeNetworks) > 0 { return errors.New("cannot use --networks: not supported by the API server") } err = client.ServiceDeploy( curl.String(), serviceName, numUnits, string(configYAML), c.Constraints, c.ToMachineSpec) } return err }