/srv/irclogs.ubuntu.com/2012/06/14/#juju-dev.txt

rogpeppedavecheney: mornin'06:02
davecheneyrogpeppe: hello hello06:12
rogpeppedavecheney: review delivered.07:31
davecheneythank you good sit07:31
davecheneysir07:31
davecheneyi'll polish that up now07:31
davecheneyre types07:32
davecheneyI agree, we should have more of them07:32
davecheneyi'm getting tired of typing []*state.Machine07:32
rogpeppedavecheney: with slices, i don't agree actually.07:38
rogpeppedavecheney: i think type MachineList []*state.Machine would be worse.07:38
rogpeppe(and it's the same length)07:39
rogpeppeish07:39
davecheneyMachines07:40
davecheneyrogpeppe: do I owe you any reviews ?07:51
davecheneyi don't feel that i'm in the best timezone to assist, gustavo has usually got to them before me07:52
rogpeppedavecheney: i'm about to submit https://codereview.appspot.com/6299073/; but you might want to glance over https://codereview.appspot.com/6299082/07:53
rogpeppedavecheney: yeah, but another pair of eyes is always good07:53
davecheneyok, sam just came home, but i'll check it out after dinner07:56
rogpeppedavecheney: np. it's pretty much code-grind anyway.08:00
Arammorning10:25
fwereadehey Aram10:31
TheMueAram: moin10:37
TheMueSomehow my 1.0.2 has troubles with gozk and goyaml.10:37
Aramah, new release10:40
Aramworks here10:46
TheMueAram: Maybe I just have to clean up the 3rd party libs and re-get.10:48
TheMuerogpeppe: ping10:48
rogpeppeTheMue: pong10:48
rogpeppei haven't tried 1.0.2 if that's what you're gonna ask :-)10:48
TheMuerogpeppe: Ah, is AssignUnit() in unit.go by you?10:49
TheMuerogpeppe: No ;)10:49
rogpeppeTheMue: i've touched it recently...10:49
rogpeppeTheMue: although it was fwereade's originally10:49
rogpeppei think10:49
TheMuerogpeppe: OK, thx.10:49
fwereaderogpeppe, TheMue: yeah, I think so10:49
rogpeppeTheMue: is there a problem with it?10:50
TheMuefwereade: I just wondered because it's a func taking a State as first arg.10:50
TheMuefwereade: We mostly put this as method to State.10:50
fwereadeTheMue, that's at niemeyer's request, he didn't like having it on Unit10:50
fwereadeTheMue, I guess it could go on State, that is true10:51
TheMuefwereade: And internally you used u.st, the state of the unit.10:51
AramTheMue: gozk and goyaml use cgo, maybe it's your gcc at fault, or you lack some dumb lib.10:51
fwereadeTheMue, heh that's just me being stupid10:51
rogpeppe+1 on making it a state method10:51
fwereadeTheMue, I recommend a little CL fixing it on its own and seeing what niemeyer thinks, I can't see a problem10:51
TheMuerogpeppe: thx10:52
TheMuefwereade: Will you do it or shall I?10:52
fwereadeTheMue, would you please? I'm still trying to figure out why I can't talk to launchpad properly... :/10:52
TheMuefwereade: Check if you're a member of the gophers group.10:53
TheMuefwereade: That has been the problem for me.10:53
TheMuefwereade: Same kind of error yesterday.10:53
fwereadeTheMue, looks like that's the trouble10:53
fwereadeTheMue, tyvm10:54
TheMuefwereade: np10:54
TheMueAh, found my missing package/file for ZK. I'm wondering why this happens now. OK, it's the first rebuild after switch to 12.04.11:07
rogpeppeTheMue: i think you should hold off on the tags until we get some feedback from niemeyer.11:12
rogpeppeTheMue: if we agree it's good to change them, i'll do them all in that CL.11:12
TheMuerogpeppe: Great, and it has been a good hint.11:12
rogpeppeTheMue: also, about the error message - i'd like to keep that CL as only about the go vet fixes. error message fixing needs to happen more generally in another place.11:13
rogpeppes/another place/another CL/11:13
TheMuerogpeppe: I'm doing the state error messages right now file by file.11:13
TheMuerogpeppe: And in this context I only found your prefix for ec211:14
fwereaderogpeppe, just looking at presence_test; you added the "+ a little bit for scheduler glithes" to the longEnough var11:23
fwereaderogpeppe, can you explain what that's about?11:24
* rogpeppe looks11:26
rogpeppefwereade: things can happen after they are expected to.11:27
rogpeppefwereade: it's not a real-time language11:27
fwereaderogpeppe, what does go have to do with this at all?11:27
rogpeppefwereade: so it's best to allow some slack in timings11:27
rogpeppefwereade: go is firing the watch11:28
fwereaderogpeppe, isn't allowing double the pinger period for detecting timeout good enough already?11:29
fwereaderogpeppe, ah, hmm, I see what you mean in this context11:30
* fwereade thinks a bit11:30
rogpeppefwereade: no, because as the comments say, the time out might legitimately occur after 99ms11:30
rogpeppefwereade: it doesn't matter if we add some slack, but it does matter if we get test failures on a heavily loaded system11:31
TheMuefwereade, rogpeppe: Move of AssignUnit() is in as https://codereview.appspot.com/629808111:34
rogpeppeTheMue: LGTM11:34
TheMuerogpeppe: That's fast. ;)11:34
rogpeppeTheMue: quickest review ever!11:34
TheMuerogpeppe: Definitely. Cheers!11:35
rogpeppe29s...11:35
Arammramm: 15:00 GMT is fine with you?11:40
mrammI believe that is my one not-free hour11:42
Aram16:00 GMT?11:42
mrammthat works11:43
Aramgood11:43
twobottuxaujuju: Invalid SSH key error in juju when using it with MAAS <http://askubuntu.com/questions/147714/invalid-ssh-key-error-in-juju-when-using-it-with-maas>11:46
* TheMue is out of the office this afternoon, will continue work later.12:07
rogpeppefwereade: is there a reason why in the python version some parameters are passed as env vars not flags?12:22
rogpeppe(to agents, that is)12:22
fwereaderogpeppe, I don't think so; IIRC niemeyer agreed to drop those12:22
rogpeppefwereade: cool, thanks12:22
fwereaderogpeppe, (well the reason, I think, was to make python testing more convenient, so it shouldn't aply any more ;))12:23
rogpeppefwereade: thanks12:24
rogpeppefwereade: i'm just looking in juju/machine/unit.py; it seems a bit odd that the provider type is overloaded to be "subordinate" sometimes. i'm thinking that unit deployment really needs only one argument: whether to put the unit agent in a container.12:35
rogpeppefwereade: does that sound reasonable?12:35
rogpeppewhen i say "only one argument" obviously there are other args, but i don't think it needs to know the provider type12:36
fwereaderogpeppe, sorry, went for a ciggie12:45
* fwereade reads back12:45
fwereaderogpeppe, yeah, that makes sense to me... didn't we determine that SubordinateContainerDeployment was actually identical to UnitMachineDeployment anyway?12:47
rogpeppefwereade: that it is12:47
fwereaderogpeppe, it crosses my mind that, long-term, we need to promote the concept of container somehow12:48
fwereaderogpeppe, as it is we make inferences about containers in a range of places12:48
rogpeppefwereade: i think that's what i'm doing by making it a bool argument to deploy.12:48
rogpeppefwereade: but i'm probably missing something important12:48
fwereaderogpeppe, as it is a unit "is" a container, except when some other unit "is" its container, and it confuses me12:49
rogpeppefwereade: it seems to me that we'd need a bool "containerise" field in the principal unit. but maybe not much more12:50
fwereaderogpeppe, hold on, how does this interact with deploying into local containers? a subordinate needs to be deployed into an existing container...12:50
fwereaderogpeppe, feels like there's something missing12:50
fwereaderogpeppe, but I'm not really up on the context12:50
rogpeppefwereade: subordinates are deployed by the principal's unit agent12:50
fwereaderogpeppe, ah, cool12:50
fwereaderogpeppe, your perspective seems fine to me then :)12:51
rogpeppefwereade: i *think* that it'll all just fall out naturally, including the local provider stuff12:51
rogpeppefwereade: cool, the crack is not with me today then12:52
fwereaderogpeppe, btw, https://codereview.appspot.com/629808212:53
niemeyerGuten tag!13:37
niemeyerfwereade: Heya, yeah, sorry for the gophers team issue13:38
Arammoin.13:40
niemeyerAram: Heya13:45
fwereadeniemeyer, no worries :)13:58
fwereadeniemeyer, that had me *utterly* foxed for a while though :)13:58
niemeyerfwereade: I figured that yesterday, but I wasn't sure if I should move the branch to another team and forgot to add you to ~gophers, which should be done no matter what13:59
rogpeppeniemeyer, fwereade: here's a sketch for a possible new package (proposed name launchpad.net/juju-core/juju/service) http://paste.ubuntu.com/1040813/14:01
rogpeppeniemeyer, fwereade: it will encapsulate much of the logic in juju/machine/unit.py14:02
fwereaderogpeppe, in essence, LGTM, but I think we should be careful about Destroy :)14:03
rogpeppefwereade: careful how?14:03
rogpeppefwereade: you mean avoid rm -rf / ?14:03
fwereaderogpeppe, IIRC, that's the idea14:03
rogpeppefwereade: yeah, i'll do my best not to trash your machine or mine :-)14:04
fwereaderogpeppe, nah, it's the same issue as automatically terminating machines14:04
fwereaderogpeppe, we don;t d that because we feel people might want a change toretrieve their data even if they're no longer running the service14:04
fwereaderogpeppe, deleting containers falls under the same category I think14:05
fwereadeniemeyer, is theabove broadly accurate?14:05
niemeyerrogpeppe: I'm not sure.. in isolation, that interface doesn't seem very appealing14:05
niemeyerrogpeppe: We have a bunch of things that "represent a deployed service", and we have a very special and well defined meaning for what a "service" is14:06
rogpeppefwereade: ok. my first thought was a package called "deploy"14:07
rogpeppeoops14:07
rogpeppeniemeyer: ^14:07
niemeyerrogpeppe: The parameters of New() feel like a bag of unrelated attributes14:07
rogpeppeyeah, "service" is not a great name14:07
rogpeppeniemeyer: another thought was to put those attributes in a struct14:07
niemeyerrogpeppe: I don't know.. it's hard to suggest something in isolation in this case. In my mind what we need is a function that creates the container14:08
rogpeppeniemeyer: what do you think to the basic division of functionality (leaving all setup of directory structure to the unit agent)?14:08
niemeyerrogpeppe: Not an interface, not a struct14:08
rogpeppeniemeyer: ok, so how do we then destroy the container?14:09
niemeyerrogpeppe: Thinking14:09
niemeyerrogpeppe: Ok.. the API is mostly sensible I guess14:12
niemeyerrogpeppe: Maybe the proper name for this is Container14:12
niemeyerrogpeppe: With something along the lines of Create, Start, and Destroy methods14:13
rogpeppeniemeyer: i suppose so. but it's going to be used for starting things that aren't in a container too. at least that was the idea14:13
niemeyerrogpeppe: I'm thinking about Container in a more abstract way.. it's a unit container14:13
niemeyerrogpeppe: (rather than an *LXC* container)14:13
rogpeppeniemeyer: hmm, maybe14:14
niemeyerrogpeppe: That's how we've been referring to it all along, I think14:14
niemeyerrogpeppe: We have relations with scope of "container" for example14:14
niemeyerrogpeppe: Despite the fact they're not deployed via LXC in some cases14:14
rogpeppeniemeyer: i'm slightly uncomfortable because in the default case it doesn't "contain" anything14:14
niemeyerrogpeppe: Uh.. how so?14:15
niemeyerrogpeppe: Maybe I misunderstand what this is about14:15
rogpeppeniemeyer: we're just starting a process and adding an upstart entry for it, if container==false14:15
niemeyerrogpeppe: It contains a unit14:16
niemeyerrogpeppe: That's its reason of existence14:16
rogpeppeniemeyer: starts a unit, really.14:17
niemeyerrogpeppe: Contains, unless I misunderstand what you mean14:17
niemeyerrogpeppe: The Dir there is the root of that container14:17
rogpeppeniemeyer: i suppose it comes down to what we mean by "contain"14:17
niemeyerrogpeppe: Yes, that's what I've been trying to point out :)14:17
rogpeppeniemeyer: we can have several "containers" that all have the same root.14:18
rogpeppeniemeyer: (in the subordinate case)14:18
niemeyerrogpeppe: By definition, all containers will always be in the same root.. we don't have filesystem management today14:18
rogpeppeniemeyer: LXC containers have different roots from one another, no?14:18
niemeyerrogpeppe: Ok, hold on, so I really misunderstand what you mean14:19
niemeyerrogpeppe: Subordinates all live within *one* container14:19
rogpeppeniemeyer: yeah14:19
niemeyerrogpeppe: I don't know what we're discussing then14:19
rogpeppeniemeyer: but the idea behind this API is that a machine agent or a unit agent can start another unit without worrying too much about if it's contained or not.14:19
niemeyerrogpeppe: The machine agent has to create a container (the container I'm talking about)14:20
niemeyerrogpeppe: and start a process within that container14:20
niemeyerrogpeppe: That's a different procedure from what a unit agent must do14:20
rogpeppeniemeyer: yup, and that's what i want this API to do14:20
niemeyerrogpeppe: Okay, that's a Container interface14:21
niemeyerrogpeppe: That's not what a unit agent must do14:21
niemeyerrogpeppe: A unit agent has to simply put a file on the upstart directory, and run "start whatever".. done14:21
rogpeppeniemeyer: however, in the future, the MA must be able to do both things, i think14:21
niemeyerrogpeppe: Why?14:21
rogpeppeniemeyer: because we want it to be able to start a unit both in or out of a container14:22
niemeyerrogpeppe: Nope14:22
rogpeppeniemeyer: so we can avoid LXC overhead if necessary14:22
niemeyerrogpeppe: It's always within the abstract concept of a container that I'm talking about14:22
niemeyerrogpeppe: A unit container may use LXC or not, but it's still a unit container14:23
rogpeppeniemeyer: ah!14:23
niemeyerrogpeppe: We call it "scope: container" even when there's no LXC involved14:23
rogpeppeniemeyer: so perhaps we have a global variable in the container package which is "Current"14:24
rogpeppeniemeyer: as in the container we're currently in.14:24
niemeyerrogpeppe: I don't know.. that's an implementation detail that went over my head at the moment14:24
rogpeppeniemeyer: the difficulty i'm having is that when the MA is deploying a unit without LXC, it's not creating a container.14:25
niemeyerrogpeppe: It is.. it's just a very trivial container14:26
niemeyerrogpeppe: That runs without isolation14:27
niemeyerrogpeppe: Container has Create, Start, Destroy: Create the container itself, Start makes it run now and whenever the machine boots; Destroy gets rid of it all14:27
niemeyerrogpeppe: That's doable both with and without LXC14:28
niemeyerrogpeppe: (and we'll need both)14:28
niemeyerrogpeppe: The other problem you mentioned, starting another unit from the point of view of a unit that is already running, is trivial14:30
niemeyerrogpeppe: It can literally be done in a very short function that dumps an upstart script and starts it14:30
niemeyerrogpeppe: Because we've already agreed that the unit is responsible for itself (downloading charm, etc)14:31
rogpeppeniemeyer: here's what i've got currently: http://paste.ubuntu.com/1040866/14:33
rogpeppeniemeyer: i'm not sure about the command args to Create though14:33
rogpeppeniemeyer: i'm not sure i want the code outside of container to know about how upstart works.14:34
rogpeppeniemeyer: a few typos rectified: http://paste.ubuntu.com/1040871/14:35
rogpeppefwereade: about destroying containers, i'm not sure. the current python code destroys containers when their units disappear from the machine. we'd need a new "terminate-unit" command, i guess.14:38
fwereaderogpeppe, I don't really have a position on this: I'm not really happy with either approach :)14:39
rogpeppefwereade: if in doubt, follow the existing implementation, right?14:39
fwereaderogpeppe, not sure; depends how soon ubiquitous containerisation arrives really14:40
fwereaderogpeppe, I'm not sure it's even terminate-unit so much as it is terminate-container14:40
rogpeppefwereade: i don't think the user has any concept of containers,14:41
niemeyerrogpeppe: I was thinking about something along these lines: http://paste.ubuntu.com/1040880/14:41
* rogpeppe thinks.14:43
niemeyerrogpeppe: Will actually need an extra "Start() error" method14:44
niemeyerDue to LXC.. Create > Deploy > Start14:44
rogpeppeniemeyer: i'm thinking that if we're passing in Unit (i was originally trying to build a low level package without state dependency), we can make the package know whether to deploy as LXC or not, because it can tell from the Unit itself.14:45
niemeyerrogpeppe: No, it can't14:45
niemeyerrogpeppe: This is part of the environment configuration14:45
niemeyerrogpeppe: In fact.. there's no point in having Create and Deploy, I believe..14:46
niemeyerSo it's really just Deploy and Destroy14:46
rogpeppeniemeyer: DeployLXC(*Unit) (Container, error)14:47
rogpeppeniemeyer: or we could just call the package "deploy"14:47
niemeyerrogpeppe: Then you don't have a Container interface to pass around and allow the implementation to vary anymore14:47
rogpeppeniemeyer: deploy.LXC(*Unit) (Container, error)14:47
rogpeppeniemeyer: ? that's what it's returning14:48
rogpeppeniemeyer: what's your "dir" arg?14:48
niemeyerrogpeppe: The directory for the container (!?)14:48
rogpeppeniemeyer: doesn't the LXC subsystem choose that?14:49
niemeyerrogpeppe: I don't know..14:49
rogpeppeniemeyer: the python code looked like it did14:49
rogpeppeniemeyer: but that may be just the way they've chosen to do it14:50
niemeyerThis is the direction I would go: http://paste.ubuntu.com/1040898/14:51
niemeyerBut it sounds like we're simplifying quite a bit, which is great.14:52
rogpeppeniemeyer: what can we usefully do between calling LXC and calling Deploy?14:52
niemeyerSo it may turn out to be a single function :)14:52
niemeyer<niemeyer> rogpeppe: Then you don't have a Container interface to pass around and allow the implementation to vary anymore14:52
rogpeppeniemeyer: i don't understand that14:52
rogpeppeniemeyer: you mean for testing?14:52
niemeyerrogpeppe: Ok, don't worry.. it really depends on the implementation.14:52
niemeyerI'm happy to see real stuff happening around that, whatever it is14:53
niemeyerrogpeppe: Just don't name the method as "deploy" please.. you won't want to have a destroy function within a deploy method14:54
niemeyers/method/package14:54
rogpeppeniemeyer: this is what i was thinking: http://paste.ubuntu.com/1040905/14:54
rogpeppeoh, ok14:54
rogpeppeniemeyer: this, perhaps: http://paste.ubuntu.com/1040908/14:55
rogpeppeniemeyer: or even: http://paste.ubuntu.com/1040910/14:56
niemeyerrogpeppe: How to destroy a container that wasn't created in the current process run?14:56
rogpeppegiven that LXC is really an implementation detail14:56
rogpeppeniemeyer: i'm not sure we ever want to do that.14:56
niemeyerrogpeppe: Yes, we do14:56
rogpeppeniemeyer: when?14:56
niemeyerrogpeppe: Sorry, I'm missing what you're missing14:57
niemeyerrogpeppe: Every time?!14:57
niemeyerrogpeppe: Processes are restartable14:57
rogpeppeoh yeah14:58
rogpeppeniemeyer: i'm not sure how to do it though.14:58
niemeyerrogpeppe: The interface I suggested!? :)14:58
rogpeppeniemeyer: i'm wondering how the Simple and LXC functions know what they're attaching to15:01
niemeyerrogpeppe: What does "attach" mean?15:01
rogpeppeniemeyer: if you restart, how do you get a Container that refers to a container created in a previous process run?15:02
rogpeppeniemeyer: i'm thinking that they might take a name as argument15:02
niemeyerrogpeppe: With LXC(...) or Simple(...)..15:02
rogpeppeniemeyer: yes, but how do you tell LXC what container you want it to talk to?15:03
niemeyerrogpeppe: With the arguments to LXC(...)15:03
rogpeppeniemeyer: i.e. what arguments does LXC have15:03
niemeyerrogpeppe: I'd have to implement it to tell you :)15:03
niemeyerrogpeppe: There is existent logic in the Python tree to serve as inspiration15:04
rogpeppeniemeyer: i'm thinking that we'd probably do it by name; so it'll be the name of the unit, most likely, so perhaps my interface would work after all.15:04
niemeyerrogpeppe: I'm sure you can make any interface work15:04
rogpeppeniemeyer: i'm not :-)15:05
niemeyerrogpeppe: It doesn't mean it will look good, necessarily :)15:05
rogpeppeniemeyer: i'm thinking that if the container already exists for a unit, Simple would return it15:06
rogpeppeniemeyer: but yeah, maybe we want to distinguish between create and reattach15:07
niemeyerrogpeppe: deploying an LXC container as a side-effect isn't a great idea15:07
rogpeppeniemeyer: wouldn't LXC() attach to an LXC container, or create it if it didn't exist?15:08
rogpeppeniemeyer: or maybe it doesn't do anything until you call Deploy15:08
niemeyerrogpeppe: We're starting to go in circles.. my suggested Container interface has a Deploy method15:08
rogpeppeniemeyer: i'm wondering what the LXC function actually *does*.15:09
niemeyerrogpeppe: Return an LXC Container implementation15:09
rogpeppeniemeyer: so it's just a factory. i see.15:10
rogpeppeniemeyer: hence the lack of an error return, doh!15:10
rogpeppeniemeyer: sorry, i hadn't appreciated that.15:10
niemeyernp15:11
fwereadeTheMue, btw, I like errorContextf :)15:12
rogpeppeniemeyer: https://codereview.appspot.com/6299082/ should be good to go now, i hope.15:23
niemeyerrogpeppe: Done15:29
fwereadeTheMue, ping15:34
=== hazmat is now known as kapilt
rogpeppeniemeyer: thanks a lot.15:35
rogpeppeniemeyer: submitted.15:35
niemeyerrogpeppe: Thank you! Really glad with how readable these watchers have become15:36
rogpeppeniemeyer: i still can't help thinking if there's a way to factor out some common pattern from them... but i agree, it's easier to follow than the python logic.15:37
niemeyerrogpeppe: Crosses my mind too, but I also realize that we've already been doing some of that15:38
rogpeppeniemeyer: e.g. stopWatcher15:39
niemeyerYeah15:39
rogpeppeniemeyer: i don't mind too much. they're similar enough that it's quite easy to look at them side-by-side and see differences.15:39
niemeyerrogpeppe: Yeah, don't see as an immediate issue we need to worry about either15:40
niemeyerrogpeppe: This may even change significantly if Aram's research turns out well15:40
niemeyerAram: Btw, when do you plan to start pushing some trivial branches?15:40
niemeyerAram: To get us started on the mstate stuff15:41
Aramniemeyer: today, I started to work on mstate, let me create the launchpad project so I can have a place to push them15:41
niemeyerAram: I think there are easy first steps to get us going with something concrete and get the momentum going15:41
niemeyerAram: Woah what?15:42
Aramyes.15:42
niemeyerAram: The Launchpad project is "juju-core" :-)15:42
Aramah, so I should push mstate there?15:42
niemeyerAram: and it should be pushed in very small steps that feel solid, so we can see the experience flowing15:42
fwereadeniemeyer, btw, if you have a moment to take a look at https://codereview.appspot.com/6298082/, it should be quick15:42
Aramyes, of course.15:42
Aramso niemeyer, the mstate directory should be in juju-core/juju? I used an out of tree directory for now.15:43
fwereadeniemeyer, I'm just updating it now such that it includes the error checks you suggested in the unit-relation-watcher review but that shouldn't affect how good it looks15:43
niemeyerAram: Yeah, side by side with the real state15:44
Aramniemeyer: ok, understood.15:44
Arambtw niemeyer, we use only a limited subset of the state api: http://paste.ubuntu.com/1040999/ that listing is about 90% accurate.15:46
AramI generated it to prioritize work.15:46
niemeyerAram: Yes, because TheMue has been rocking solidly porting the real API15:46
niemeyerAram: The API is entirely used assuming we finish the port of juju to Go using similar logic to Python15:47
niemeyerAram: I suggest starting with the easy wins, to get our feet wet15:47
rogpeppeniemeyer, Aram: i wonder whether we should do some watcher stuff early on, because that's where our state stuff differs most from conventional mongo usage15:49
niemeyerfwereade: Reviewed15:50
niemeyerrogpeppe: As I just said, I'd prefer to start with some easy stuff first, to get our feet wet15:51
fwereadeniemeyer, good point, thank you15:51
niemeyerrogpeppe: The mstate package doesn't exist, we have zero infrastructure working, we don't know even the basic patterns we want to use15:51
niemeyerrogpeppe: Thinking about watches when we miss all of that will be messy15:52
rogpeppeniemeyer: definitely. just we shouldn't get too far into implementing juju structures and then realise they're incompatible with the way we need to implement watchers15:52
niemeyerrogpeppe: The state package is not too far, in its entirety15:52
rogpeppeniemeyer: but gotta start with something!15:52
niemeyerLet's just get something going, slowly and solidly15:53
rogpeppeniemeyer: BTW sometime it would be great if you could do that goamz resilience stuff, so i can run -amazon tests more reliably.15:57
rogpeppeniemeyer: (another "handshake error"...)15:58
niemeyerrogpeppe: Sounds good15:58
niemeyerFirst, I'll have lunch!15:58
niemeyer:)15:58
niemeyerSee you guys soon15:58
rogpeppeniemeyer: enjoy!15:58
TheMuefwereade: pong16:13
fwereadeTheMue, NoRelationError is starting to feel a little bit redundant16:13
fwereadeTheMue, I was thinking of replacing it with a bare-faced "relation doesn't exist"16:14
fwereadeTheMue, and trusting the clients' errorContextf~s to give necessary context16:14
TheMuefwereade: Sounds reasonable, now with errorContextf.16:15
TheMuefwereade: Btw, it has been niemeyers idea.The trick with using pointers inside is cool.16:16
fwereadeTheMue, regardless of initial source, it's cool; thank you for implementing it :)16:17
TheMuefwereade: ;)16:18
rogpeppeniemeyer: i've gotta go now, but this is what i'm looking at currently: http://paste.ubuntu.com/1041100/17:06
niemeyerrogpeppe: Looks nice!17:13
fwereadeniemeyer, btw, I've been meaning to ask17:19
fwereadeniemeyer, can you precis your ideas for multi-endpoint relations?17:20
fwereadeniemeyer, I can see how they make sense for peer relations17:20
fwereadeniemeyer, but beyond that my brain breaks17:20
fwereadeniemeyer, (where "multi" means "more than we currently accept for a given relation kind")17:21
niemeyerfwereade: Hmm17:22
niemeyerfwereade: My brain doesn't break.. it simply stops thinking.. :-)17:23
niemeyerfwereade: I'm not foreseeing all kinds of relations we may come up with17:23
niemeyerfwereade: It may well turn out that we need none other than what we have17:23
niemeyerfwereade: The concerns I raised in terms of the architecture are mainly to leave the door open, since we can, rather than preparing for a specific feature that I have in mind17:24
fwereadeniemeyer, ok, cool, thanks17:25
fwereadeniemeyer, as and when we add them I imagine we'll need to take a fine-tooth comb to the existing relation code anyway, so I probably shouldn't worry *too* much about them now17:25
niemeyerfwereade: Agreed, not too much17:26
niemeyerfwereade: The sensible and simple will likely be a good step no matter what we need in the future17:26
fwereadeniemeyer, as always :)17:27
fwereadeniemeyer, I've re-proposed https://codereview.appspot.com/6303060/17:27
niemeyerfwereade: +1 :)17:27
niemeyerfwereade: Thanks a lot17:27
fwereadeniemeyer, it's much smaller than it looks really17:28
fwereadeniemeyer, and I'm not quite sure ServiceRelation is sane, but fixing that is definitely a job for another CL17:28
niemeyerfwereade: +117:28
niemeyerfwereade: Wow, 6 days17:29
niemeyerfwereade: Was it in the review list?17:29
fwereadeniemeyer, I took it out17:29
niemeyerfwereade: Aha, phew, ok17:29
niemeyerI'm not crazy then17:29
fwereadeniemeyer, that pipeline was going in a bad direction, but I think I've found the right one now17:30
niemeyerfwereade: Superb17:30
fwereadeoff for now, gn all17:33
niemeyerfwereade: Night man17:34
TheMuefwereade: Bye17:40
niemeyerrobbiew: call time?18:29
niemeyerMaybe not.. :)18:34
robbiewniemeyer: yep..just running late18:37
robbiewniemeyer: still around?18:39
niemeyerrobbiew: Yo18:39
niemeyerCreepy.. the phone rings with the hangout before the laptop sees it18:41
=== kapilt is now known as hazmat
* niemeyer steps out for a nice coffee break20:29
niemeyerBack later for more reviewing20:29
fwereaderogpeppe, ping21:34
fwereaderogpeppe, if you happen to get this, please let me know what the purpose of the unused state.Unit.isPrincipal field is :)21:36
niemeyerfwereade: Tells if the unit is a principal unit or not?22:51
niemeyerdavecheney: Morning23:02
davecheneyniemeyer: hello23:02
niemeyerdavecheney: Sorry for not having gotten through your branches yet23:02
davecheneyniemeyer: that is ok, i know everyone is busy23:03
niemeyerdavecheney: I have a meeting right now, but will still try to clean things up a bit tonight23:03
davecheneyniemeyer: for f in $(seq 1 5); do go test launchpad.net/juju-core/juju/store ; done23:03
davecheney^ fails 1 in 5 times for e23:03
davecheneyme23:03
niemeyerdavecheney: Okay, always the same test I suppose23:03
davecheney[LOG] 35.45727 Socket 0xf841bf5900 to 127.0.0.1:50017: killed again: read tcp 127.0.0.1:50017: use of closed network connection (previously: Closed explicitly)23:04
davecheneyOOPS: 25 passed, 1 FAILED23:04
davecheneyyup23:04
davecheneyactually it's,     c.Errorf("counter sum for %#v is %d, want %d", key, sum, expected)23:04
davecheney... Error: counter sum for []string{"charm-info", "oneiric", "wordpress"} is 0, want 123:04
niemeyerdavecheney: Okay, that's shaky23:06
niemeyerdavecheney: Knowingly shaky, that is23:06
davecheneyyeah, i didn't think it was a big deal, i just rerun it23:06
niemeyerdavecheney: Should definitely fix it, though23:29
niemeyerdavecheney: WIll have a look it23:30

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