/srv/irclogs.ubuntu.com/2013/01/15/#juju-dev.txt

=== slank is now known as slank_away
=== _mup__ is now known as _mup_
TheMuedavecheney, fwereade_, rogpeppe: Morning07:40
fwereade_TheMue, everybody, heyhey07:40
rogpeppemorning all!08:14
TheMuerogpeppe: hiya08:22
* TheMue enjoys installing a fresh environment to run MAAS in KVM08:42
arammoin.08:57
dimiternmorning!09:10
TheMuearam, dimitern: hiya09:30
dimiternTheMue: yo :)09:30
rogpeppefwereade_: you have reviews10:25
rogpeppefwereade_: i'd appreciate a look at https://codereview.appspot.com/7105054/10:25
fwereade_rogpeppe, cool, thanks; I'll take a peek10:27
fwereade_rogpeppe, LGTM10:45
rogpeppefwereade_: thanks!10:45
fwereade_rogpeppe, I need to take a break for a bit... would you let http://paste.ubuntu.com/1533914/ roll around your mind for sanity for a bit?10:46
rogpeppefwereade_: looking10:46
* jam goes to grab a coffee, will be back for standup in 2 min10:57
jammgz: poke11:01
mgzhey11:01
jamfor great mumbling!11:01
mgzI'm on.11:05
fwereade_niemeyer, heyhey11:14
niemeyerfwereade_: How's tricks? :)11:28
fwereade_niemeyer, good thanks; but a massive storm has just blown up here, somewhat to my surprise11:28
niemeyerfwereade_: Ugh11:29
niemeyerfwereade_: I guess you have good power rails there :)11:29
rogpeppeniemeyer: hiya!11:30
fwereade_niemeyer, it usually messes with the wifi more than the power but power cuts are not unheard of here11:30
fwereade_holy crap, hail11:30
TheMuelunchtime11:38
niemeyerfwereade_: Wow11:40
fwereade_niemeyer, and now it's just eerie silence11:40
dimiternfwereade_: I'm always hoping for a good, massive hailstorm, just to see how bad it gets here, but alas - nothing worthy so far :D11:46
fwereade_dimitern, yeah, that wasn't all that much to write home about on reflection11:48
fwereade_dimitern, but still pretty unexpected, given the beautiful sunshine not half an hour before11:48
fwereade_dimitern, I think I just heard thunder though11:48
dimiternfwereade_: yeah, this here is like mountain weather - 5m and it's completely different11:50
fwereade_rogpeppe, any thoughts re sanity of that paste?11:50
rogpeppefwereade_: what's the difference between Destroy and Remove?11:51
fwereade_rogpeppe, Destroy is the method everything has; it might set Dying or it might remove11:51
fwereade_rogpeppe, Remove only applies to units/machines because they're the only ones that follow the path we originally understood11:52
fwereade_rogpeppe, Dying services and relations are removed as side-effects of either Unit.Remove or RelationUnit.LeaveScope11:52
fwereade_rogpeppe, did you get a chance to take a look at death-and-destruction.txt?11:53
rogpeppefwereade_: yes, i did, although i wasn't sure how much is what we've got now, and how much is plans for the future.11:54
fwereade_rogpeppe, everything except how services are done, which was agreed before xmas and which I'm working on now11:54
rogpeppefwereade_: BTW why might Remove of a unit also remove its service? don't we allow services with no units?11:56
fwereade_rogpeppe, if the service is Dying, then the disappearing unit might be the last reference to the service11:56
rogpeppefwereade_: ah, of course11:56
rogpeppefwereade_: the paste looks reasonable to me11:57
rogpeppefwereade_: it'll be worth discussing this with niemeyer, since he's around11:57
fwereade_rogpeppe, quite so; niemeyer, I'd like to have an API discussion with you when you have some free time11:58
niemeyerfwereade_: Sure, any time11:59
niemeyerfwereade_: Next meeting is in an hour11:59
fwereade_niemeyer, I'd quite like a bite to eat before then -- could we do it right afterwards please?11:59
fwereade_niemeyer, (or, hmm, will that hit your lunchtime?)12:00
niemeyerfwereade_: Sounds good12:00
fwereade_niemeyer, ok, cool, thanks :)12:00
niemeyerfwereade_: It might, but it's okay either way.. worst case we do when I'm back12:00
rogpeppefairly simple CL if anyone cares to have a look:  https://codereview.appspot.com/708506212:06
niemeyerrogpeppe: Looking12:17
rogpeppeniemeyer: thanks12:22
dimiterni keep getting error: environment "canonistack" has an unknown provider type "openstack" - what should I do to fix this? I tried go installing cmd/juju to make sure it was compiled with the latest source, still no luck12:51
dimiternrogpeppe, fwereade_- any hints? ^^12:55
rogpeppedimitern: juju needs to import the openstack provider12:56
rogpeppedimitern: import _ "launchpad.net/juju-core/environs/openstack"12:56
dimiternrogpeppe: so we need that for all providers? even though they are registered?12:56
rogpeppedimitern: they can only register if they're imported12:57
rogpeppedimitern: (by at least one thing)12:57
dimiternrogpeppe: I see, 10x12:57
jamTheMue: https://wiki.canonical.com/Launchpad/MAASTesting I'm not sure if you knew of that one, but it should have some stuff about the Lenovo QA Lab for MaaS13:17
TheMuethx13:17
jamTheMue: I think rvba in #maas would probably be able to help out on questions/access information to the lab.13:18
jamaram: ^^ probably you're interested in that one as well (if you haven't seen it already)13:19
=== niemeyer_ is now known as niemeyer
niemeyerfwereade_: Sorry, net hiccup13:43
fwereade_niemeyer, np, hangout is still open13:43
niemeyerfwereade_: Are you still in the same hangout?13:43
niemeyerfwereade_: Joining13:43
rogpeppewallyworld__: shall we try to sort out the public storage thing?13:50
wallyworld__rogpeppe: would love to but it's almost midnight here and i'm tired, i'll have another look tomorrow to try and see how what i've done may be different to how ec2 does it and will ask you if i need to13:51
rogpeppewallyworld__: ok, np13:51
wallyworld__thanks for asking13:51
rogpeppewallyworld__: FWIW in the ec2 provider, the public storage is implemented with exactly the same type as the private storage13:52
wallyworld__i do that too13:52
wallyworld__the public openstack storage uses a client connection that doesn't fo any authentication13:52
rogpeppewallyworld__: it's probably down to the way the container object is initialised13:52
wallyworld__the public storage requires that the container be created with the correct acl to allow world readable without auth being required13:53
wallyworld__and so the reading bit works fine13:53
wallyworld__ie someone who is authenticated can upload stuff to the container and then anyone can read it, autjenticated or not13:54
wallyworld__ however, using the public container to try and write something eg fake tools in the tests, fails because no auth is used since the public container uses a non authenticating client13:55
wallyworld__s/public container/public storage13:55
rogpeppewallyworld__: is the issue that you *can't* use authentication when connecting to a container that doesn't require it?13:56
wallyworld__i could, but the public storage is initialised with a non authenticating client13:56
wallyworld__openstack clients store the auth token when authentication occurs13:56
rogpeppewallyworld__: could you initialise it with an authenticating client?13:56
wallyworld__and then put that token in each request13:56
wallyworld__yes, but that would require authentication which the public containers must not require?13:57
rogpeppewallyworld__: i'm presuming the crux is in this code: http://paste.ubuntu.com/1534329/13:57
wallyworld__the non public storage in the openstack provider does indeed use an authenticating client13:57
wallyworld__yes13:58
wallyworld__the public storage is initialised with a client which does not authenticate, so no credentials are used13:58
wallyworld__used or required13:59
rogpeppewallyworld__: what is it about the publicStorageUnlocked initialisation that isn't authenticating?13:59
wallyworld__publicBucketClient13:59
rogpeppewallyworld__: i see two occurrences of e.client(ecfg, authMethodCfg)13:59
rogpeppewallyworld__: ah, i may be looking at an old branch though13:59
wallyworld__let me check the code13:59
wallyworld__func (e *environ) publicClient(ecfg *environConfig) client.Client {14:00
wallyworld__return client.NewPublicClient(ecfg.publicBucketURL(), nil)14:00
wallyworld__}14:00
wallyworld__around line 19614:00
wallyworld__the public storage instance uses a goose client that is non authenticating as constructed above14:01
rogpeppewallyworld__: ah, i wasn't in sync14:01
wallyworld__public bucker url above is like the public region for ec214:01
wallyworld__so a goose client can be created with credentials, or not14:02
wallyworld__if credentials are provided, it authenticates14:02
rogpeppewallyworld__: so if you provide credentials for a container that doesn't require them, it fails?14:03
wallyworld__there are separate constructors for each type - you cannot supply credentials for a public client14:03
wallyworld__if use curl to poke a container which is publicly readable but use credentials, i'm not sure what will happwn14:04
wallyworld__i think i read that there is a but in that area and it will not work14:04
wallyworld__bug not but14:05
rogpeppewallyworld__: that's what i was wondering14:05
wallyworld__i definitely read that there is a bug in that area, but am uncertain if it is fixed. i will need to test14:05
rogpeppewallyworld__: it seems a bit wrong that it can't ignore credentials when they're not required14:06
wallyworld__indeed14:06
rogpeppewallyworld__: i wonder if it would be possible to work around that bug14:07
rogpeppewallyworld__: for instance, by detecting an error code that signifies the bug14:07
wallyworld__not sure, but it does seem the idea of a non authenticating client needs to be rethought14:07
rogpeppewallyworld__: goose/client could certainly do with some API docs - i can't see how it's meant to work...14:08
fwereade_rogpeppe, https://codereview.appspot.com/7058073 has changed a bit since I merged trunk in and might benefit from a second glance; TheMue, you've also started to review that one14:08
TheMuefwereade_: Will take a look.14:08
fwereade_TheMue, tyvm14:09
wallyworld__rogpeppe: yes, it probably does need more doc14:09
wallyworld__it's very openstack specific14:09
wallyworld__to understand it you need you to know about how openstack works14:10
rogpeppewallyworld__: if it's openstack specific, perhaps it should be hidden behind the swift, etc APIs14:10
rogpeppewallyworld__: rather than requiring clients to interact with it14:10
wallyworld__the goose client is used by the goose swift code to provide the underlying transport/connectivity14:11
wallyworld__a client needs to be created with credentials, but after that, it's opaque14:11
wallyworld__it just needs to be passed to a swift instance so that it can be used14:12
rogpeppewallyworld__: perhaps the goose swift code should provide a function that encapsulates that, so the type isn't externally visible.14:12
dimiternis there a command to show the complete effective environ config as seen by juju?14:12
wallyworld__the same client is used by the nova and glance stuff too14:12
dimiternafter defaults, etc. are applied?14:12
rogpeppedimitern: you can call AllAttrs14:13
rogpeppewallyworld__: hmm, yes, i see the issue14:14
dimiternrogpeppe: on what?14:14
rogpeppedimitern: config.Config14:14
rogpeppedimitern: what's your context?14:14
dimiternrogpeppe: I want to dump the config after validation, before any cmd like bootstrap is executed14:15
rogpeppewallyworld__: if NewPublicClient and NewClient were merged, i'm not sure there would be a good reason for exposing Client.14:15
dimiternrogpeppe: isn't there something like juju get --all ?14:16
wallyworld__rogpeppe: the same client instance is shared by nova and swift instances14:16
rogpeppedimitern: ah, from the command line14:16
dimiternrogpeppe: yeah, that seems easiest14:16
wallyworld__ah, no it's not14:16
wallyworld__a new client instance is created for each nova, swift instance14:17
wallyworld__rogpeppe: i sort of think of a goose client as like a tcp socket - you may need to create one and then give it to things to use on your behalf but you don't need to know how a socket works14:18
wallyworld__but i guess you are saying each thing should create it's own socket14:18
rogpeppewallyworld__: well, i think that might possibly make for a more straightforward API, but i'd need to think about it14:19
rogpeppewallyworld__: in general though, whether openstack-specific or not, any exported API should be fully documented14:20
wallyworld__the thing with merging NewClient and NewPublicClient is that go lacks default method  params etc, so it gets messy14:20
wallyworld__yeah, agree with doco - we've just run way short on time14:20
rogpeppewallyworld__: i don't think that's necessarily a problem. NewClient has quite a few args anyway; it could easily be a struct.14:21
wallyworld__yes. i used that approach in some of the client internals14:21
rogpeppewallyworld__: type ClientParams struct {Creds ...; AuthMethod ...; Logger; etc}14:21
=== TheMue_ is now known as TheMue
rogpeppewallyworld__: that's the go way to do default method params. works pretty well usually.14:22
wallyworld__yeah, i gotta get used to that. hard to forget all that python14:22
wallyworld__it does seem to add overhead though14:22
wallyworld__compared with just using default method or kw args14:23
wallyworld__and that overhead is incurred for each and every call14:23
rogpeppewallyworld__: runtime overhead?14:23
wallyworld__since the struct needs to be created each time14:23
wallyworld__typing/verbosity overhead14:23
wallyworld__code bloat14:24
rogpeppewallyworld__: there are advantages too though - you can create an object encapsulating the params and pass it around and manipulate it easily14:24
fwereade_rogpeppe, TheMue, niemeyer: can anyone remember why we prevent SetExposed and ClearExposed when a service is Dying?14:24
wallyworld__rogpeppe: swings and roundabouts as with anything :-)14:25
rogpeppefwereade_: it was a fairly arbitrary decision AFAIR14:25
dimiternrogpeppe: so I guess there isn't a way to dump the config from the command line?14:25
rogpeppedimitern: you could write a program to do it in 3 minutes14:25
wallyworld__rogpeppe: thanks for discussion, way past my bedtime, i'll look again tomorrow14:26
rogpeppewallyworld__: cheers!14:26
dimiternrogpeppe: ok, so I need to dump AllAttrs from environ?14:26
rogpeppedimitern: i think you'd print the result of environs.NewFromName("").Config().AllAttrs()14:27
dimiternrogpeppe: I'll try that, 10x14:27
fwereade_rogpeppe, I don't think I can justify disallowing ClearExposed; SetExposed is more interesting, but I'm inclined to say it should be allowed for symetry's sake14:27
rogpeppedimitern: assuming you're using the standard environments.yaml14:27
rogpeppefwereade_: i'm not sure the operations need to be symmetrical14:28
rogpeppefwereade_: we often allow closing-down operations when dying, but not adding operations14:28
fwereade_rogpeppe, yeah, true14:28
rogpeppefwereade_: mind you, i always thought there should only be one call: SetExposed(bool)...14:29
fwereade_rogpeppe, yeah, I can sympathize there14:30
niemeyerfwereade_: I think either way is fine14:30
niemeyerrogpeppe: Yeah, I recall that :)14:31
niemeyerThe reasoning, ironically, is precisely for symmetry..14:31
niemeyerOther flags require more than a bool14:31
niemeyerBut I digress14:31
niemeyerand will have lunch, in fact.. biab14:31
rogpeppefwereade_: just looking at https://codereview.appspot.com/7058073 - quite a bit has changed, but i don't see my comments addressed14:32
fwereade_rogpeppe, oh, hell, I got completely distracted by the manual merge14:33
rogpeppefwereade_: np14:33
fwereade_rogpeppe, I don't have any objections to any of them though14:33
rogpeppefwereade_: cool14:33
TheMuefwereade_: you've got a review14:40
fwereade_TheMue, ty14:40
rogpeppefwereade_: ping14:45
fwereade_rogpeppe, pong14:45
rogpeppefwereade_: i'm starting to think that all public Dying methods are crackful (other than Tomb's, of course). thoughts?14:46
rogpeppefwereade_: the fact that something is dying is really an internal detail - what an external thing should care about is dead or not dead IMO14:47
fwereade_rogpeppe, hmm -- I can't think of many places they're used but I'm not yet ready to commit to such a statement myself14:47
fwereade_rogpeppe, wait, you mean on state entities? or on watchery things?14:47
rogpeppefwereade_: so for instance, the only place you use Uniter.Dying, you could (should, i think) use u.tomb.Dying instead14:47
rogpeppefwereade_: both14:47
fwereade_rogpeppe, when is there a Dying method that isn't `return x.tomb.Dying()`?14:48
rogpeppefwereade_: here: http://paste.ubuntu.com/1534428/14:48
rogpeppefwereade_: oops, those are calls14:49
rogpeppefwereade_: i don't think anything should expose its internal tomb's dying state14:49
rogpeppefwereade_: what's it useful for?14:49
rogpeppefwereade_: it says "this object is starting to shut down", but that's not useful info when interacting with the object.14:50
rogpeppefwereade_: i think all those Dying methods should be Dead methods that return x.tomb.Dead()14:50
=== slank_away is now known as slank
rogpeppefwereade_: for example, the comment here is just wrong:14:53
rogpeppe// Dying returns a channel that signals a Firewaller exit.14:53
rogpeppefunc (fw *Firewaller) Dying() <-chan struct{} {14:53
rogpeppefwereade_: it doesn't signal a firewaller exit, but just that at some time in the future the firewaller hopefully will exit.14:54
rogpeppelunch15:32
rogpeppefwereade_: what was the last thing you saw me say before i said "lunch" ?16:19
fwereade_rogpeppe, fwereade_: it says "this object is starting to shut down", but that's not useful info when interacting with the object.16:19
rogpeppeah16:20
rogpeppe[14:50:46] <rogpeppe> fwereade_: i think all those Dying methods should be Dead methods that return x.tomb.Dead()16:20
rogpeppe[14:53:40] <rogpeppe> fwereade_: for example, the comment here is just wrong:16:20
rogpeppe[14:53:40] <rogpeppe> // Dying returns a channel that signals a Firewaller exit.16:20
rogpeppe[14:53:40] <rogpeppe> func (fw *Firewaller) Dying() <-chan struct{} {16:20
rogpeppe[14:54:06] <rogpeppe> fwereade_: it doesn't signal a firewaller exit, but just that at some time in the future the firewaller hopefully will exit.16:20
fwereade_rogpeppe, that also sounds sane, probably, where there are places it's actually used16:21
fwereade_rogpeppe, how common is that?16:21
rogpeppefwereade_: there's one use, in a test.16:21
fwereade_rogpeppe, heh, for something that doesn't just have a .Wait()?16:22
rogpeppefwereade_: no, so that we can time out a wait16:22
rogpeppefwereade_: all the other uses of Dying other than on a tomb are in uniter, and those could all be u.tomb.Dying16:22
fwereade_rogpeppe, consider me +1 then16:23
fwereade_rogpeppe, not sure why I ever had u.Dying()16:23
rogpeppefwereade_:  i tell a lie, it's never used16:23
fwereade_rogpeppe, cool16:24
rogpeppefwereade_: i thought f.Dying was on a firewaller (not looking at the file) but it was on a uniter.filter.16:24
fwereade_rogpeppe, ah, yeah16:24
rogpeppeniemeyer: does this sound reasonable to you: change all public Dying methods in juju-core into Dead methods?16:25
niemeyerrogpeppe: Huh!?16:26
rogpeppeniemeyer: there's no use for Dying, but there is a use for Dead16:26
rogpeppeniemeyer: dying in an internal state16:26
rogpeppes/in an/is an/16:26
niemeyerrogpeppe: Sorry.. quite out of context here16:26
niemeyerrogpeppe: The quick answer is no, it doesn't sound reasonable without further detail16:27
rogpeppeniemeyer: that's fine. let me try to explain.16:27
rogpeppeniemeyer: 1) nothing ever uses a Dying method currently (other than Tomb.Dying)16:27
rogpeppeniemeyer: 2) ... except for one case in a test where it should be using Dead.16:28
rogpeppeniemeyer: 3) i'd like to use a Dead method (on api.Server)16:28
rogpeppeniemeyer: 4) i believe that "dying" cannot signify anything useful to a user of an object16:29
rogpeppeniemeyer: because it's really a transitional state16:29
niemeyerrogpeppe: What's the test that is broken? That may be an interesting case to look at16:29
niemeyerrogpeppe: Not really.. Dying isn't transitional16:30
rogpeppeniemeyer: here's the code: http://paste.ubuntu.com/1534705/16:30
rogpeppeniemeyer: the bug is that it can wait 50ms for dying to happen, but then the transition to dead might take a lot longer16:30
niemeyerrogpeppe: tomb.Dying and other similar channels fire once the thing is dying, and always from then on16:30
rogpeppeniemeyer: i mean that dying is part of the transition to dead16:31
rogpeppeniemeyer: i realise that the channel state is persistent16:31
niemeyerrogpeppe: The point is that Dying, the method you're suggesting we remove, is not transitional.. it has well defined  behavior that is fire-once16:31
rogpeppeniemeyer: can you think of a good use case for Dying?16:31
rogpeppeniemeyer: as a publicly visible method16:31
niemeyerrogpeppe: Given the dozens of cases we have with tomb.Dying, of course..16:31
rogpeppeniemeyer: i'm not including tomb.Dying.16:32
rogpeppeniemeyer: that's fine as is16:32
rogpeppeniemeyer: it's the tomb's raison d'etre16:32
niemeyerrogpeppe: Not really.. Tomb is only useful with the full behavioral pack it has16:32
niemeyerrogpeppe: Including Dead, Kill, etc16:32
rogpeppeniemeyer: but a tomb is an implementation detail of an object, which is why we have it as a non-exported field, rather than embedding it.16:33
niemeyerrogpeppe: Wait16:33
rogpeppeniemeyer: ok, true16:33
niemeyerrogpeppe: So I'm looking at the paste16:33
niemeyerrogpeppe: It's not clear how that proves Dying is bad16:33
rogpeppeniemeyer: "dead not detected"16:33
rogpeppeniemeyer: it's waiting for the object to die. but Dying does not signify that. it signifies that it will die (hopefully soon)16:34
niemeyerrogpeppe: Sure.. it's a bit like saying Sleep is back because it blocks16:34
niemeyers/back/bad16:34
rogpeppeniemeyer: why would we ever want to wait until an object *starts* to clean itself up?16:35
rogpeppeniemeyer: i think that we always want to wait until it *has* cleaned itself up16:35
niemeyerrogpeppe: Always when?16:35
rogpeppeniemeyer: (unless we're part of the object itself, and need to participate in the cleaning-up process)16:35
niemeyerrogpeppe: It feels like we're trying to guess stuff up unnecessarily16:35
niemeyerrogpeppe: All I see is one test poorly written16:36
niemeyerrogpeppe: That doesn't say much about Dying16:36
rogpeppeniemeyer: that's the *only* place that Dying is used (other than some places in uniter that could use the tomb Dying method)16:36
rogpeppeniemeyer: i mean Dying-other-than-tomb.Dying there16:36
niemeyerrogpeppe: Erm16:37
rogpeppeniemeyer: the only place that one of the Dying methods defined in juju-core is used16:37
rogpeppeniemeyer: to be more accurate16:37
niemeyerrogpeppe: UnitDying?16:38
fwereade_niemeyer, UnitDying is justa broadcast channel that's closed when the unit's Life is Dying -- has nothing to do with tombs16:39
rogpeppeniemeyer: that's different. it's not about the object itself16:39
niemeyer<rogpeppe> niemeyer: why would we ever want to wait until an object *starts* to clean itself up?16:40
rogpeppe[16:35:40] <rogpeppe> niemeyer: (unless we're part of the object itself, and need to participate in the cleaning-up process)16:40
niemeyerrogpeppe: UnitDying is not part of the object itself16:40
niemeyerrogpeppe: Someone else watches it16:40
rogpeppein this case, the uniter could arguably be considered part of the unit "objecT"16:40
rogpeppeniemeyer: i would not suggest changing UnitDying to UnitDead16:41
niemeyerrogpeppe: Me neither.. Dying means what it means, and seems to be fine everywhere we've used it16:41
niemeyerrogpeppe: If you use Dying when you mean Dead, it won't fly so well, though16:41
niemeyerrogpeppe: Same thing if you use Dead when you mean Dying16:41
rogpeppeniemeyer: which is... in one place, wrongly.16:41
niemeyerrogpeppe: In one place if you special case-out every other place16:42
rogpeppeniemeyer: i don't see why we expose Dying on Firewaller, for example16:42
rogpeppeniemeyer: or Provisioner or Uniter16:42
rogpeppeniemeyer: or uniter.filter16:43
rogpeppeniemeyer: all those places would be much better served with a Dead method AFAICS16:43
niemeyerrogpeppe: That's an easier to verify assertion16:44
niemeyerrogpeppe: rather than a witch-hunting against Dying methods16:44
* niemeyer looks16:44
rogpeppeniemeyer: those are the only Dying methods we define16:44
fwereade_rogpeppe, don't all tasks have Wait() though anyway?16:44
niemeyerrogpeppe: Heh16:44
rogpeppefwereade_: yes. but Dying is nicer than starting a new goroutine just to call wait and send on a channel16:44
rogpeppefwereade_: when we've got that channel available anyway16:45
rogpeppeoops!16:45
rogpeppefwereade_: Dead!16:45
fwereade_rogpeppe, haha :)16:45
fwereade_rogpeppe, I'll be guided by you in that, you're deeply involved with the client ATM16:45
fwereade_rogpeppe, AIUI that's what the client does at the moment, right?16:46
rogpeppefwereade_: which client?16:46
fwereade_rogpeppe, jujud16:46
niemeyerrogpeppe: So firewaller.Dying is never used?16:47
rogpeppeniemeyer: indeed16:47
niemeyerrogpeppe: Easy one.. just kill it16:47
rogpeppeniemeyer: +116:47
niemeyerHuh16:47
rogpeppeniemeyer: and the other never-used Dying methods too?16:47
niemeyerWhy are we even discussing this?16:47
rogpeppeniemeyer: because i'm just about to create a Dead method16:47
rogpeppeniemeyer: and was wondering about the precedent.16:48
niemeyerrogpeppe: Why do we need one?16:48
niemeyerrogpeppe: That's different16:48
niemeyerrogpeppe: Removing an unused method is a pretty easy choice16:48
niemeyerrogpeppe: No matter its name :)16:48
rogpeppeniemeyer: we don't *need* one - we can always do go func() {c <- obj.Wait()}; but a Dead method seems nicer, since the channel is available anyway16:48
niemeyerrogpeppe: Sure, if you need Dead just add it16:49
rogpeppeniemeyer: ok, cool16:49
niemeyerrogpeppe: That's a different conversation than "let's kill all Dying methods and replace them by Dead because that's always what we need", if you see what I mean16:50
rogpeppeniemeyer: i guess so. i had hypothetical use cases in mind, not real ones :-)16:50
niemeyerrogpeppe: There's no long term decision, or convention being established.. just add that one-liner you need and let's be happy :)16:50
rogpeppeniemeyer: and i still think that an externally visible Dying method that just returns obj.tomb.Dying() is almost certainly going to be a mistake16:51
rogpeppehmm, weird codereview behaviour i haven't seen before: https://codereview.appspot.com/7101059/17:05
rogpeppefwereade_: do you see no diffs at all?17:06
rogpeppethe diffs in launchpad look fine17:06
niemeyerrogpeppe: No issue exists with that id (7101059)17:13
niemeyerrogpeppe: That's the message I get17:13
rogpeppeniemeyer: i've just deleted it, trying again.17:13
rogpeppeniemeyer: but the next one has the same problem too17:13
rogpeppeniemeyer: one mo17:13
niemeyerrogpeppe: FWIW, I just got a weird behavior while using it too.. had to reload the CL *several* times to see comments I had just entered17:13
rogpeppeniemeyer: https://codereview.appspot.com/710605217:13
niemeyerrogpeppe: And my comments disappeared again!17:14
niemeyerrogpeppe: There's something funky going on in their side17:14
rogpeppeniemeyer: i guess you could review it by looking at the launchpad page17:14
rogpeppeniemeyer: there's nothing complicated going on17:15
niemeyerrogpeppe: It's not okay for lbox/codereview to be broken like that17:20
rogpeppeniemeyer: i've never seen this particular failure-mode before17:21
rogpeppeniemeyer: i imagine there's a data warehouse gone down somewhere :-)17:21
niemeyerrogpeppe: The changes to u.Dying => u.tomb.Dying seem undue17:25
niemeyerrogpeppe: u.Dying seems perfectly okay there17:26
rogpeppeniemeyer: why would something external to uniter find any use from using the Dying method?17:26
rogpeppeniemeyer: the dying state is surely something internal to the implementation of Uniter?17:26
rogpeppeniemeyer: as it is in all our other objects17:27
rogpeppefwereade_: what do you think?17:27
niemeyerrogpeppe: Maybe17:28
niemeyerrogpeppe: none of our other objects tend to touch their tombs from external functions, though17:28
rogpeppeniemeyer: neither does uniter17:28
niemeyerrogpeppe: See modes.go17:29
niemeyerrogpeppe: I don't care enough, though17:29
rogpeppeniemeyer: modes.go is still internal to the package, although it's true it defines functions not methods17:30
rogpeppeniemeyer: but that's not unprecedented. in jujud, i pass tombs around to other functions.17:30
niemeyerWhatever William says is fine by me17:30
niemeyerrogpeppe: Yes, you do..17:30
niemeyerrogpeppe: Other functions don't grab private tombs, though17:30
rogpeppeniemeyer: the modes.go functions use other private Uniter fields too17:31
niemeyerrogpeppe: I don't care, though.. it feels a bit of a red-herring change, and a bike-sheddy discussion17:31
rogpeppeniemeyer: i don't think the tomb is much different17:31
niemeyerrogpeppe: LGTM and let's focus on something more valuable17:32
rogpeppeniemeyer: i didn't plan on spending more than 5 minutes on this change!17:32
niemeyerrogpeppe: Zero would be a better number17:32
mrammlooks like I'm going to be without power for about 2 hours here this afternoon17:33
mrammI'll be around though, so if you you need to contact me I will be checking e-mail periodically17:34
mrammand will be available by phone17:34
niemeyerrogpeppe: Regarding the yaml vs. json change, we can use yaml, and fix goyaml later to use !binary, that encodes as base64 by itself17:34
rogpeppeniemeyer: i think if we use yaml we'll exceed the 16K cloudinit limit17:35
niemeyerrogpeppe: "The server encountered an error and could not complete your request."17:35
niemeyerrogpeppe: codereview is busted17:35
rogpeppeniemeyer: seems like it17:35
niemeyerrogpeppe: I don't understand17:35
niemeyerrogpeppe: How does the agent configuration file written to disk relate to cloudinit?17:35
rogpeppeniemeyer: see WriteCommands17:36
rogpeppeniemeyer: it's also used to generate the cloudinit file17:36
rogpeppeniemeyer: which is kinda the point of the package - it's a common place that knows how to write an agent configuration file17:36
rogpeppeniemeyer: whether that's into a cloudinit file or an upstart script, or directly.17:36
rogpeppeniemeyer: actually we don't use it in an upstart script17:37
niemeyerrogpeppe: echo | gunzip?17:38
niemeyerrogpeppe: I mean, the two things seem somewhat unrelated.. you can do whatever you want in these commands17:38
rogpeppeniemeyer: that's a thought17:38
rogpeppeniemeyer: except it would have to be echo | b64decode | gunzip17:39
rogpeppeniemeyer: is there a base 64 decoder provided as standard in ubuntu?17:39
niemeyerrogpeppe: Yeah:17:40
niemeyer% dpkg -S /usr/bin/base6417:40
niemeyercoreutils: /usr/bin/base6417:40
rogpeppeniemeyer: cool, i'll do that then.17:41
rogpeppeniemeyer: if that seems like a reasonable approach to you17:41
niemeyerrogpeppe: Sounds okay.. even if we convert it to base64 inside goyaml itself (which sounds sane), we'll still be getting more compression that way17:47
niemeyerrogpeppe: It would actually be nice to pass the whole cloudinit compressed instead17:48
niemeyerBut I don't recall if that's possible out of the box17:48
rogpeppeniemeyer: yeah, and it will deal nicely with the two-identical certificates issue17:48
rogpeppeniemeyer: yes, that would be good17:48
rogpeppeniemeyer: maybe it does - i haven't actually experimented with the limits, just googled for them17:49
niemeyerrogpeppe: I know it has a fancier mime multipart scheme17:49
niemeyerHah17:49
niemeyerrogpeppe: https://help.ubuntu.com/community/CloudInit17:50
niemeyerrogpeppe: "content found to be gzip compressed will be uncompressed"17:50
rogpeppeniemeyer: cool!17:50
niemeyerrogpeppe: We can actually just bundle the whole thing with gzip and send down the wire17:50
rogpeppeniemeyer: that's just brilliant17:50
niemeyer+117:50
rogpeppeniemeyer: i can relax a bit17:50
niemeyerLots of good stuff in the history of the past month so far18:02
niemeyerIt's great to have the CL links in the log, btw18:03
niemeyerI hadn't realized how useful that'd be until now18:03
rogpeppeniemeyer: isn't it, just18:03
rogpeppeniemeyer: i'm glad you haven't found too many WTFs!18:04
rogpeppeniemeyer: (or maybe you have, but are dwelling on the good things...)18:04
rogpeppeniemeyer: i've gotta go18:04
rogpeppeg'night all, see ya tomorrow18:05
niemeyerrogpeppe: Nah, looks good so far :)18:05
niemeyerrogpeppe: Have a goo dnight man18:05
rogpeppeniemeyer: my dnights will indeed be all gooey18:05
rogpeppe:-)18:05
niemeyerrogpeppe1: Are you back from the goo dnight? :)18:16
hazmatanyone else having issues with reitveld?18:16
niemeyerhazmat: Yeah18:16
niemeyerhazmat: Server seems busted ATM18:16
hazmatrogpeppe1, gooey is sweet and crunchy ;-)18:16
niemeyer  testing: print mongod log messages18:18
niemeyerrogpeppe1: ^ nice18:18
niemeyerI had seen that before too18:18
niemeyerOr rather, s/seen/suffered from/18:18
hazmatapp engine, the most helpless way to fail at scale18:22
TheMueniemeyer: Google has GAE troubles and rietveld runs on it.18:25
niemeyerTheMue: Really?18:25
niemeyerTheMue: Where's the news?18:25
TheMueniemeyer: Yep, just read it.18:25
TheMueniemeyer: One moment.18:26
TheMueniemeyer: Hehe, even http://code.google.com/status/appengine failt.18:26
TheMuefails.18:26
niemeyerTheMue: Works here, but it does say the service is facing difficulties18:27
TheMueniemeyer: See also https://twitter.com/app_engine/status/29124326723905945618:28
niemeyerTheMue: Cheers18:28
=== fss is now known as flaviacarlette
=== flaviacarlette is now known as fss
hazmatniemeyer, if you've got a moment.. there was an lbox question from orange squad .. an error their getting on submit .. http://pastebin.ubuntu.com/1535263/20:03
hazmatbzr info output http://pastebin.ubuntu.com/1535286/20:03
niemeyerhazmat: "*** Bazaar has encountered an internal error."20:04
niemeyerhazmat: Doesn't look like an lbox issue20:04
niemeyerhazmat: The command line is pretty boring: arguments: ['/usr/bin/bzr', 'commit', '-F', '/tmp/commit-803116972', '--20:05
niemeyer    author', 'Curtis Hovey <curtis.hovey@canonical.com>',20:05
niemeyer    '/home/curtis/Work/charmworld/lbox-245970753/lbox']20:05
hazmatniemeyer, noted thanks20:05
niemeyerhazmat: I note it's a beta bzr version.. might be related20:06
niemeyer(2.6b2)20:07
hazmatniemeyer, it might also be related to plugins, several members of this team have various assorted plugins.. i'm wondering if lbox should do bzr --no-plugins when executing20:10
hazmatseveral don't use it as a result due primarily to errors on submit20:10
niemeyerhazmat: lbox doesn't use anything special about bzr20:11
niemeyerhazmat: It's just running it via its command line20:11
niemeyerhazmat: If plugins are broken with lbox, I'm curious about why is that a problem related to lbox20:12
hazmatniemeyer, understood. but in this case the user can commit to trunk fine using bzr byitself..20:12
niemeyerhazmat: Exactly, lbox *is* using bzr itself20:12
hazmatniemeyer, just that lbox could potentially be more robust by disabling user plugins20:13
niemeyerhazmat: indeed, but it would also prevent people from using plugins with lbox.. I don't yet understand why that's a good thing20:14
hazmathmm...20:14
niemeyerhazmat: The one thing lbox uses that some people are not used to is lightweight checkouts20:14
niemeyerhazmat: But that's a stock feature, which hopefully should work fine20:15
hazmatat the moment i'm just trying to discover what's the issue, it was pointed out that the plugin disable can be done via env var. we're trying that now20:15
niemeyerhazmat: Thanks, I'm also curious to know what's the actual issue20:15
hazmatniemeyer, no change.. http://pastebin.ubuntu.com/1535318/  is there an option to have lbox keep the temp directory around?20:18
hazmathmm.. no such revision.. is that a common ancestor check.20:18
niemeyerhazmat: Not yet, but it should be relatively simple to break at the right point by replacing the bzr executable and catching commit20:21
niemeyerHmm.. the branch checked message has a bug..20:21
* niemeyer fixes20:21
hazmatniemeyer, fwiw 2.6b2 is the quantal bzr and the further analysis (no real answer) http://pastebin.ubuntu.com/1535610/21:17
=== davechen1y is now known as davecheney
=== davechen1y is now known as davecheney
fwereade_davecheney, morning23:33
davecheneyfwereade_: hello23:33
fwereade_davecheney, I'm about to sleep, but I have a vague feeling that you are *probably* least tainted by groupthink-related issues re state and lifecycle23:34
davecheneyfwereade_: that is a sounds assumption23:34
fwereade_davecheney, and therefore I would particularly appreciate your thoughts on https://codereview.appspot.com/709505923:34
davecheneyfwereade_: will do23:34
fwereade_davecheney, as a diff, it's a monster; but if you read doc/draft/death-and-destruction.txt first, I *hope* it will appear roughly sane to you23:35
davecheneyfwereade_: ok23:35
fwereade_davecheney, ie I think/hope the operations are clear and adequately explained; but the near-equivalence between behaviours before and after is harder to discern23:35
davecheneyremoving things is always the hardest23:36
davecheneyand tends to mess up pretty mental models23:36
fwereade_davecheney, I *thiiiink* I'm converging one something that works ok for now23:36
davecheneyfwereade_: i can assure you that you are the one that knows the most about this problem23:36
fwereade_davecheney, which is why it's so important I get sanity-checks from everyone else ;p23:37
fwereade_davecheney, anyway, sleepytime :)23:37
doc_is this strictly for juju developer questions?23:38
davecheneydoc_: if it's a general juju question you're probably likely to find better help in #Juju23:52
doc_davecheney: Thanks. Tried there, nobody answering :-(23:53
davecheneydoc_: bad time of day23:54
davecheneymost juju's are in the EU/US timezone23:54
doc_tx. Will try again tomorrow then23:54
doc_EST myself … which reminds me maybe I should go get some food :-)23:55
davecheneydoc_: consider also https://lists.ubuntu.com/mailman/listinfo/juju23:55

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!