I'm on the fence a little; let's have a chat about how bad the
revision-bumping situation is, it might be that the benefits of your
implementation will win out.
https://codereview.appspot.com/8540050/diff/23001/cmd/juju/upgradecharm.go#oldcode95
cmd/juju/upgradecharm.go:95: return fmt.Errorf("already running latest
charm %q", curl)
On 2013/04/29 09:53:21, dimitern wrote:
> On 2013/04/28 10:41:25, fwereade wrote:
> > Hmm. If the --force flag is set to something different to before, we
might
> > actually want to allow this case (and other error below)?.
Pre-existing bug,
> > doesn't have to be addressed in this CL, but if it isn't it should
be
> recorded.
The --switch flag allows you to replace the charm with an entirely
different one. The new charm's URL and revision are inferred as they
would be when running a deploy command.
Please note that --switch is dangerous, because juju only has limited
information with which to determine compatibility; the operation will
succeed, regardless of potential havoc, so long as the following
conditions hold:
- The new charm must declare all relations that the service is currently
participating in.
- All config settings shared by the old and new charms must have the
same types.
https://codereview.appspot.com/8540050/diff/23001/cmd/juju/upgradecharm.go#newcode161
cmd/juju/upgradecharm.go:161: if considerBumpRevision {
On 2013/04/29 09:53:21, dimitern wrote:
> On 2013/04/28 10:41:25, fwereade wrote:
> > I think this can all be simpler.
> >
> > oldURL, _ := service.CharmURL()
> > var newURL *charm.URL
> > if c.SwitchURL != "" {
> > // A new charm URL was explicitly specified.
> > conf, err := conn.State.EnvironConfig()
> > if err != nil {
> > return err
> > }
> > newURL, err = charm.InferURL(c.SwitchURL, conf.DefaultSeries())
> > if err != nil {
> > return err
> > }
> > } else {
> > // No new URL was specified, but a revision might have been.
> > newURL = oldURL.WithRevision(c.Revision)
> > }
> > repo, err := charm.InferRepository(newURL, ctx.AbsPath(c.RepoPath))
> > if err != nil {
> > return err
> > }
> > // If no revision was explicitly specified by either Revision or
> > // SwitchURL, discover the latest from the repo.
> > if newURL.Revision == -1 {
> > latest, err := repo.Latest(newURL)
> > if err != nil {
> > return err
> > }
> > newURL = newURL.WithRevision(latest)
> > }
> > if *newURL == *oldURL {
> > if _, isLocal := repo.(*charm.LocalRepository); !isLocal {
> > // etc
> I prefer to keep it as is, if you don't mind, and I don't think it's
any more
> clear the suggested way.
I find the current way rather unclear; it's a little tricky to keep
track of curl, scurl, bumpRevision, explicitRevision, rev, and
considerBumpRevision; especially considering that curl and scurl both
have revisions embedded as well. And I'm not sure that bumpRevision is
even used any more...
If my suggestion is unclear, perhaps I should have commented it better;
but I think it's definitely easier to understand and keep track of
oldURL and newURL than all that other stuff... isn't it?
I'm not sure mine has ideal behaviour when --force and --revision
interact with local repos, but I don't think we have the *capacity* to
do the Right Thing there (ie upload a charm with a unique revision: but
at the moment we're screwed here in 2 or 3 different ways anyway, so it
seems to be a moot point).
> Does it fulfill the required set of cases? I think so.
I'm on the fence a little; let's have a chat about how bad the
revision-bumping situation is, it might be that the benefits of your
implementation will win out.
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go upgradecharm. go (left):
File cmd/juju/
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#oldcode95 upgradecharm. go:95: return fmt.Errorf("already running latest
cmd/juju/
charm %q", curl)
On 2013/04/29 09:53:21, dimitern wrote:
> On 2013/04/28 10:41:25, fwereade wrote:
> > Hmm. If the --force flag is set to something different to before, we
might
> > actually want to allow this case (and other error below)?.
Pre-existing bug,
> > doesn't have to be addressed in this CL, but if it isn't it should
be
> recorded.
> I added a TODO
A bug would be great too please.
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go upgradecharm. go (right):
File cmd/juju/
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#newcode27 upgradecharm. go:27: originally deployed.
cmd/juju/
An explicit revision can be chosen with the --revision flag.
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#newcode50 upgradecharm. go:50: The new charm may add new relations and
cmd/juju/
configuration settings.
How about:
The --switch flag allows you to replace the charm with an entirely
different one. The new charm's URL and revision are inferred as they
would be when running a deploy command.
Please note that --switch is dangerous, because juju only has limited
information with which to determine compatibility; the operation will
succeed, regardless of potential havoc, so long as the following
conditions hold:
- The new charm must declare all relations that the service is currently
participating in.
- All config settings shared by the old and new charms must have the
same types.
--switch and --revision are mutually exclusive.
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#newcode56 upgradecharm. go:56: specify revision number 5 of the wordpress
cmd/juju/
charm.
Drop this para, --revision is best described at the top, I think; we
just need to mention it won't work with switch.
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#newcode76 upgradecharm. go:76: f.StringVar( &c.SwitchURL, "switch", "",
cmd/juju/
"charm URL to upgrade to")
"crossgrade to a different charm" ?
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#newcode77 upgradecharm. go:77: f.IntVar( &c.Revision, "revision", -1,
cmd/juju/
"revision number to upgrade to")
"explicit revision of current charm" ?
https:/ /codereview. appspot. com/8540050/ diff/23001/ cmd/juju/ upgradecharm. go#newcode161 upgradecharm. go:161: if considerBumpRev ision { EnvironConfig( ) c.SwitchURL, conf.DefaultSer ies()) WithRevision( c.Revision) sitory( newURL, ctx.AbsPath( c.RepoPath) ) WithRevision( latest) charm.LocalRepo sitory) ; !isLocal {
cmd/juju/
On 2013/04/29 09:53:21, dimitern wrote:
> On 2013/04/28 10:41:25, fwereade wrote:
> > I think this can all be simpler.
> >
> > oldURL, _ := service.CharmURL()
> > var newURL *charm.URL
> > if c.SwitchURL != "" {
> > // A new charm URL was explicitly specified.
> > conf, err := conn.State.
> > if err != nil {
> > return err
> > }
> > newURL, err = charm.InferURL(
> > if err != nil {
> > return err
> > }
> > } else {
> > // No new URL was specified, but a revision might have been.
> > newURL = oldURL.
> > }
> > repo, err := charm.InferRepo
> > if err != nil {
> > return err
> > }
> > // If no revision was explicitly specified by either Revision or
> > // SwitchURL, discover the latest from the repo.
> > if newURL.Revision == -1 {
> > latest, err := repo.Latest(newURL)
> > if err != nil {
> > return err
> > }
> > newURL = newURL.
> > }
> > if *newURL == *oldURL {
> > if _, isLocal := repo.(*
> > // etc
> I prefer to keep it as is, if you don't mind, and I don't think it's
any more
> clear the suggested way.
I find the current way rather unclear; it's a little tricky to keep ision; especially considering that curl and scurl both
track of curl, scurl, bumpRevision, explicitRevision, rev, and
considerBumpRev
have revisions embedded as well. And I'm not sure that bumpRevision is
even used any more...
If my suggestion is unclear, perhaps I should have commented it better;
but I think it's definitely easier to understand and keep track of
oldURL and newURL than all that other stuff... isn't it?
I'm not sure mine has ideal behaviour when --force and --revision
interact with local repos, but I don't think we have the *capacity* to
do the Right Thing there (ie upload a charm with a unique revision: but
at the moment we're screwed here in 2 or 3 different ways anyway, so it
seems to be a moot point).
> Does it fulfill the required set of cases? I think so.
I'm not 100% sure, and that's the problem.
https:/ /codereview. appspot. com/8540050/