/srv/irclogs.ubuntu.com/2012/12/10/#juju-dev.txt

wallyworldjam: 1 on 1?06:05
jamwallyworld: sure, guess I missed my alarm06:05
jamwallyworld: I just lost mumble connection, will try again07:04
wallyworldok07:04
jamwallyworld: it seems dead from my view... Are you still on mumble.canonical.com?07:05
wallyworldyes, i'll retry also07:05
TheMueMorning07:05
jamwallyworld: it is possible the great firewall of the UAE has been updated to block mumble :).07:05
jamTheMue: hi07:05
jamclearly I still have some internet access.07:05
wallyworldjam: when i restart, it says host unreachble for me too07:05
jamk07:06
jammaybe just a dns issue?07:06
wallyworldso maybe mumble is down07:06
jam(migrating to a new host, and DNS updates being done.)07:06
TheMuejam: Hi, and yes, seems so.07:06
jamI got remote host closed it, connected now, but invalid password.07:06
jammaybe they are just restarting it or something07:06
wallyworldworks now07:06
davecheneymorning/evening07:07
TheMuedavecheney: Hiya07:16
jamand mumble dies again...07:44
* davecheney sad trombone07:44
jamTheMue: How's stuff going? I saw that you're working on the firewalling code. Mark mentioned that you'll be starting to look into the MaaS code soon. Do you know when that might be?07:45
jamI think I also saw that you're going on vacation next week?07:45
jamdavecheney: http://www.sadtrombone.com/07:45
jamsorry: http://www.sadtrombone.com/?play=true07:45
jamthe latter will autopaly07:45
jamplay07:45
* davecheney bookmarks07:46
jamdavecheney: though I wonder if you need a bit.ly link to it, so you can surprise people.07:46
TheMuejam: Yes, right now I'm fixing/fixed the firewaller.07:46
davecheneyjam lmgtfy07:46
TheMuejam: I already took a first look into MAAS, but now I have to coordinate with Aram who started with it too.07:47
Aramgood morning.07:49
davecheneymorning07:50
TheMueAram: Hiya07:50
* Aram installed Debian because Unity doesn't work with NX.07:51
AramI forgot computers could be this fast.07:51
davecheneydebian is quite lean07:51
* davecheney has been playing with plan9 on a Pi07:51
AramI'm still waiting for my Pis. I somehow managed to order Pis in Australia, no wonder no Pi came.07:52
Aramperhaps I donated some Pis to someone this way.07:52
davecheneyAram: another canonical guy sold me his 512mb pi07:53
davecheneydo you want my old 256mb one ?07:53
davecheneyapart from running acme on your telly, it isn't all that useful07:53
Aramnah, thanks, I think I'll get one in a week or so.07:53
davecheneyunderstood07:53
Aramyeah, I suppose/.07:53
* davecheney is still waiting on the TTL 3.3v usb adapter07:54
* TheMue is playing with Smalltalk again and always wonders about the Power of such a small environment like Pharo. Funny how ST has been too large for most computers in its early days. 07:54
=== TheMue_ is now known as TheMue
davecheneyAram: over the weekend some significant improvements were made on compiler memory usage08:03
davecheneythere are CL's in review that effectively halve the amount of memory the compiler uses08:03
Aramfantastic.08:03
davecheneyyup, pkg/net now takes ~ 43mb on 32bit platforms08:03
davecheneydown from 10808:04
davecheney103 on 8g08:05
davecheney5g is slightly larger because the Prog structure and Reg list is longer08:05
rogpeppemorning all!08:13
Aramhi.08:13
TheMuerogpeppe: Hi08:17
rogpeppeafk while the boiler man is fixing our boiler... hopefully.09:25
TheMueAnyone interest in reviewing the changed firewaller? https://codereview.appspot.com/6875053/09:26
TheMueinterested09:26
TheMueAram: Do you want to take a look on the changed firewaller? https://codereview.appspot.com/6875053/09:40
TheMues/on/at/09:40
jammgz: /wave09:57
TheMueAram: Having fun doing installations with following reboots? ;)09:57
AramTheMue: just configuring NX.09:59
TheMueAram: IC09:59
rogpeppefwereade: ping10:25
TheMuerogpeppe: He's out this morning.10:31
rogpeppeTheMue: ah, thanks10:31
TheMuerogpeppe: yw10:31
jamrogpeppe: I've been meaning to ask. What does "CL" actually stand for?11:01
rogpeppejam: change list11:02
rogpeppejam: (i believe)11:02
jamit doesn't seem to be a very good fit, IMO, but as long as it is known. :)11:02
rogpeppejam: yeah, i don't think it matters too much.11:02
dimiternrogpeppe: do you think having a single mutex for all maps and other internal structures will suffice to overcome possible race conditions, or it's better to have one mutex per member (I'm referring to my CL for nova double)11:05
jamdimitern: my suggesstion is to just put the mutex in ServeHTTP like the ec2 version11:06
rogpeppejam: +111:06
rogpeppejam: do you really need to export all those Nove functions?11:06
rogpeppes/Nove/Nova/11:06
dimiternjam, rogpeppe: but dave pointed out that since the API is public this might not be enough?11:06
rogpeppes/jam/dimitern/11:06
rogpeppedimitern: that's my question: does this API need to be public?11:07
rogpeppedimitern: who are you seeing as the clients of this API?11:07
dimiternrogpeppe: well, since they're used for tests only, unless we use them outside the package, they can be private11:07
rogpeppedimitern: that's what i thought11:08
rogpeppedimitern: i'd suggest making them private11:08
jamI'd slightly suggest that it is being a bit over prescriptive, but we can start there.11:08
rogpeppedimitern: then we can ignore concurrency issues for the tests (because we know we're not calling them concurrently) and the ServeHTTP mutex will be sufficient.11:08
rogpeppejam: if we don't do that, i think we'll probably end up needing a different entry point for each one of those calls, one for internal use (with lock held) and one for external use11:09
dimiternrogpeppe: ok, seems reasonable11:09
rogpeppejam: given that almost all the functionality will be provided through the http interface, i'm not sure that's necessary.11:10
rogpeppejam: but maybe you see some utility to the entry points that i don't?11:11
jamrogpeppe: I just think it is slightly overly prophylactic to say that you shouldn't have any public methods in case someone might use them incorrectly. But we can always go the 'its default private and we'll make it public when we need them'11:13
jamI'm also a bit more used to Python where everything that is "private" is still public.11:13
jam(consenting adults approach)11:14
rogpeppejam: given that it's an http server, i'm not sure it's possible to use the methods correctly without second-guessing what the server is doing behind the scenes (which breaks modularity)11:15
rogpeppejam: (because it's perfectly legitimate for the server to have something concurrent going on)11:16
jamrogpeppe: it is possible that in testing you would take out the HTTP section of the communication because it isn't always relevant for the tests themselves. (the fact that goose talks HTTP to openstack *should* be an implementation detail).11:17
jamATM, we do, and we do for the forseeable future11:17
jamso we can go that route.11:17
jambut if HTTP overhead starts slowing down the tests, it would make sense to pull it out as uninteresting11:17
rogpeppejam: it's one of those areas in Go that we tend to be very careful about, because unlocked concurrent access is a source of hard-to-find bugs.11:17
rogpeppejam: if that happens to be the case (which i think is fairly unlikely), post-facto refactoring to make this possible would not be hard.11:19
rogpeppejam: also, we have had times when the http section of the communication has contributed to test failures, so it's worth keeping it in the loop IMHO.11:21
TheMueLunchtime, biab.11:28
dimiternrogpeppe: PTAL https://codereview.appspot.com/687705412:46
rogpeppedimitern: looking12:47
dimiternjam: you too pls ^^12:58
rogpeppedimitern: replied13:02
dimiternrogpeppe: thanks!13:03
dimiternrogpeppe: was not sure *x.y when x is *T and y is *W will be the same as *x.*y13:05
rogpeppedimitern: you can't do *x.*y :-)13:05
dimiternrogpeppe: yeah, but you got my point :)13:05
rogpeppe*x.y is always the same as *(x.y)13:05
rogpeppedimitern: if x is a pointer, x.y is the same as (*x).y13:06
dimiternrogpeppe: I was confused, because before x was T and y was *W, hence the parens13:06
dimiternrogpeppe: I see, ok, good to know13:06
rogpeppedimitern: so when both x and y are pointers, *x.y is the same as *((*x).y)13:06
dimiternrogpeppe: and no, flavors and servers must have links according to the OS API13:07
rogpeppedimitern: so perhaps building links automatically if none are given is reasonable behaviour13:08
rogpeppedimitern: but probably no need to distinguish []Link{} and nil there.13:08
rogpeppedimitern: BTW for chapter and verse on selector expressions, see http://golang.org/ref/spec#Selectors13:09
dimiternrogpeppe: ok, so I can change it so it checks for len(links) = 0 and adds them13:09
rogpeppedimitern: that seems reasonable to me, assuming it does to jam13:09
dimiternrogpeppe: but if Links []Link is nil, will len(Links) make sense?13:10
rogpeppedimitern: absolutely13:10
rogpeppedimitern: you can len([]T(nil)) and range over it too13:10
dimiternrogpeppe: good!\13:11
rogpeppedimitern: same with maps13:11
rogpeppedimitern: and channels actually13:11
rogpeppedimitern: it simplifies quite a bit of logic13:11
dimiternrogpeppe: yeah, for sure - learning new things about go every day :)13:12
rogpeppedimitern: it's worth reading parts of the spec until they make sense13:13
TheMueAram: How far has your digging into MAAS gone? Already found a suitable OAuth client for a MAAS client?13:21
AramTheMue: bradfitz wrote an oauth library.13:24
TheMueAram: OAuth 1 or 2?13:24
TheMueAram: IMHO MAAS need OAuth 1.13:24
dimiternrogpeppe: but the problem is len([]T{}) == len([]T{nil}) == 0, so I cannot distinguish between those13:28
rogpeppedimitern: yes, but do you want to?13:28
dimiternrogpeppe: well, originally my point was to create links only explicitly, so I can simplify my tests, otherwise I have to add the Links: []nova.Link{} to EACH server or flavor13:29
rogpeppedimitern: i'm not sure i understand. why do you have to do that?13:29
dimiternrogpeppe: because if I don't DeepEquals will fail13:29
dimiternrogpeppe: I'll have to have server := nova.ServerDetail{Id: "x", Links: []nova.Link{}} instead of just {Id: "x"}13:30
Aramyes, DeepEquals distinguishes between []T{}, and the nil equivalent, that's a pity.13:31
Aramjust wrap DeepEquals.13:31
dimiternrogpeppe: because in the latter case add will create the links, and what I passed and what got stored in the map will be different13:31
rogpeppedimitern: so you're using the []nova.Link{} to suppress the link creation?13:31
dimiternrogpeppe: exactly13:31
dimiternAram: how?13:32
rogpeppedimitern: presumably you could put the expected links in there?13:32
Arampseudocode: if len(a) == len(b) == 0 { return true} DeepEquals(a, b)...13:32
dimiternAram: that's seems reasonable13:33
rogpeppedimitern: but i think the "buildlinks" argument is a perfectly reasonable solution too13:33
dimiternrogpeppe: yes, but that will complicate a lot of cases, where I don't really need links at all13:33
rogpeppeAram: that won't work in this case13:33
Aramrogpeppe: why not?13:33
rogpeppeAram: because the slice is embedded in a struct13:34
Aramaah, ok.13:34
rogpeppedimitern: here's another possibility:13:34
Aramwell, you can write an Equals function for that struct.13:34
rogpeppedimitern: you could have a method on FlavorDetail that builds the links for it13:35
rogpeppedimitern: that would mean that addFlavor is a little less magic, and the link-building logic gets its own function, independent of addFlavor13:36
rogpeppedimitern: then you could call flavor.BuildLinks() before addFlavor, and the DeepEquals would work ok13:37
dimiternrogpeppe: I was thinking of that actually, but the FlavorDetail is outside the package (in nova, not novatests)13:37
rogpeppedimitern: then add a function instead13:37
dimiternrogpeppe: ok, that seems the least amount of overhead, I'll do it13:38
rogpeppedimitern: perhaps AddLinks(f *FlavorDetail) ?13:46
dimiternrogpeppe: I was thinking of suite.buildLinksFlavor(f FlavorDetail) FlavorDetail and suite.buildLinksServer(s ServerDetail) ServerDetail13:47
dimiternrogpeppe: I need the suite to construct the URLs (the hostname, etc. are in the suite)13:48
rogpeppedimitern: is it not functionality that you to be usable outside the test suite?13:48
dimiternrogpeppe: hmm, hold on - actually that won't work13:50
rogpeppes/you to/you want to/ :-)13:50
dimiternrogpeppe: my original idea was to make the direct api complete in a sense that calling addServer is enough to have everything initialized in the state, so the HTTP API will just need to get the server and serialize the ServerDetail to json13:51
dimiternrogpeppe: but I suppose adding it to the suite won't be enough - i have to add it to the service itself and put a comment to call this always before add*() to produce a consistent result for the http api13:53
rogpeppedimitern: that seems reasonable.13:53
dimiternrogpeppe: ok :) 10x for the walkthrough13:54
rogpeppedimitern: np13:54
dimiternrogpeppe: ok, so now it should be fine https://codereview.appspot.com/687705414:06
dimiternrogpeppe: it you think it looks good I can go ahead and submit it14:07
rogpeppedimitern: one thought (sorry for not catching it earlier) - you could just mutate the links field *ServerDetail in place, rather than passing it in and out by value. YMMV though.14:10
dimiternrogpeppe: I thought so, but I followed the same pattern append() uses for example14:11
rogpeppedimitern: append is a bit of a special case14:11
rogpeppedimitern: because it's designed to be called in many scenarios14:11
rogpeppedimitern: anyway (and including if you choose not to change it), still LGTM14:12
dimiternrogpeppe: ok, I'll change it, 10x14:13
TheMuefwereade: ping14:36
fwereadeTheMue, pong14:36
fwereadeTheMue, I'm just looking at your CL right now :)14:36
TheMuefwereade: Aaaah, that's what I wanted to ask you to do. Thx. ;)14:36
fwereadeTheMue, quick question: in initMachine, you appear only to start a unit watch when the service is exposed14:38
fwereadeTheMue, AFAICT, in the rest of the FW, the unit watch is started regardless and the service exposure is only taken into account when refcounting?14:39
TheMuefwereade: Yes14:39
fwereadeTheMue, did I misread somewhere? I'm still not familiar with the whole thing in detail :)14:39
TheMuefwereade: One moment, have to look, because it tries to act like later in "runtime mode".14:40
fwereadeTheMue, ok, just to confirm: line 224, `if service.IsExposed() {`14:40
fwereadeTheMue, vs line 276, `} else if unit != nil && unit.Life() != state.Dead && fw.machine ds[machineId] != nil {`14:41
TheMuefwereade: Yes, you're right.14:41
fwereadeTheMue, so, definitely a bug?14:41
TheMuefwereade: Hmm, have to think what changes if the watch is started also for not yet exposed services.14:42
dimiternrogpeppe: while you're still fresh on the topic, PTAL https://codereview.appspot.com/6910055/14:42
TheMuefwereade: Funnily all tests are green, even repeated multiple (150x) in a row.14:42
dimiternrogpeppe: this the follow up - removing interface and get prefix from methods14:42
rogpeppedimitern: looking14:43
rogpeppedimitern: just wondering: why NovaService rather than Nova?14:43
rogpeppedimitern: (novaservice.NovaService seems perhaps unnecessarily stuttering)14:44
dimiternrogpeppe: well, as a convention - the other doubles are like that, and the package is novaservice to distinguish it from the nova package14:44
fwereadeTheMue, sure, but it's quite possible they just don't have a test case with the right parameters to trigger a bug -- or maybe it comes out not to be a bug after all14:44
TheMuefwereade: Funny, behaves the same way.14:44
dimiternrogpeppe: you think it's too long?14:45
fwereadeTheMue, but I am still having a bit of a hard time following all the different ways and times for creating the various datas14:45
rogpeppedimitern: the package name is fine. if it's a convention i don't mind much, but, yeah i think it could be shorter without loss of clarity14:45
fwereadeTheMue, ok, I think I have a fail case14:45
fwereadeTheMue, let me check it's not covered by the tests14:46
dimiternrogpeppe: ok, fair enough I like shorter names too :)14:46
rogpeppedimitern: (given that it's always going to be qualified with the package name)14:46
rogpeppedimitern: generally the changes look great14:46
rogpeppedimitern: LGTM with that thought about the name14:46
dimiternrogpeppe: thanks! I'll change the name and submit it then14:47
fwereadeTheMue, ISTM that there are no test cases that check the behaviour when a FW is started with an unexposed service -- which is then exposed while the FW is running14:49
TheMuefwereade: OK, good hint, I'll add one for both modes.14:50
fwereadeTheMue, ok, but wait a mo14:51
fwereadeTheMue, there's something I think could be explored a bit further14:51
fwereadeTheMue, if we look more at initMachineData and assume the service is exposed and everything is fine14:52
fwereadeTheMue, sorry initMachine14:52
fwereadeTheMue, just after the createUnitData call14:53
fwereadeTheMue, when you get the OpenedPorts14:53
fwereadeTheMue, (sorry, thinking out loud, crrect me when I go off the rails)14:54
TheMuefwereade: Go on.14:54
fwereadeTheMue, you set them directly on the unitData and then start the ud's watch14:54
TheMuefwereade: The IsExposed() block has to be from before retrieving the OpenedPorts() and setting them in ud and md.15:03
TheMuefwereade: Additional tests are working fine.15:24
fwereadeTheMue, hmm, ok15:24
fwereadeTheMue, I think the thing I'm finding hard to follow is the creation chain now15:25
fwereadeTheMue, you have several different funcs that create the same kinds of data in different ways15:25
TheMuefwereade: I find it now even more clear than before.15:25
fwereadeTheMue, and I'm trying to think of a reason why any of those creation funcs need to be different in any way15:26
TheMuefwereade: Not at all, but maybe I can move it into own methods to avoid code doubling, yes.15:26
fwereadeTheMue, ok; and yu now have two different styles of initialization too15:27
TheMuefwereade: No15:27
fwereadeTheMue, I think that by using the new one troughout you will see a dramatic simplification15:27
TheMuefwereade: Before we had two, now there is only one left.15:27
fwereadeTheMue, sometimes you fill in a machine's units and sometimes you don't, right?15:27
TheMuefwereade: Huh?15:27
fwereadeTheMue, dammit, sorry15:29
fwereadeTheMue, line 43715:29
TheMuefwereade: *lol*15:29
fwereadeTheMue, at what point does that machine's set of units contain valid data?15:29
TheMuefwereade: After it's unit watcher sent its initial event which is then handled by the firewaller, that sets the data.15:32
TheMuefwereade: This is the logic we had from beginning.15:32
fwereadeTheMue, ok, how long does it take for the initial event to be handled?15:32
fwereadeTheMue, or rather, at what point o yo know that all the initial events have been handled?15:33
fwereadeTheMue, (does this line of questioning sound familiar? ;))15:33
TheMuefwereade: Stop15:33
TheMuefwereade: This newMachineData() is only used after (!) the initial stuff is handled.15:33
TheMuefwereade: That's what changed.15:34
fwereadeTheMue, yes15:34
fwereadeTheMue, I know15:34
TheMuefwereade: In init() and in there in initMache(). Where explicitely the initial events of those initial watchers are handled before (!) the firewaller loop starts handling new changes.15:34
fwereadeTheMue, initMachine is a step in the direction we need to take15:34
fwereadeTheMue, but you do now have two ways of initializing a machine15:35
fwereadeTheMue, in one of them, the machine has the correct unit data and can be safely used at any point onwards15:36
fwereadeTheMue, in the other one, the machine starts off with empty unit data and has it added gradually after the fact15:36
fwereadeTheMue, I think that the second approach *is* in fact adequate to the needs of a running FW15:37
fwereadeTheMue, but I'm having difficulty figuring out why we have two separate initialization modes when we could have one that is correct in all circumstances15:37
TheMuefwereade: Yes, and port changing is done when the information has arived. The problem has been when the firewaller starts and there are already open ports that have to be closed or closed ports that have to be open.15:38
TheMuefwereade: But when those are handled all further initial and changing events handle the rest.15:38
fwereadeTheMue, are you arguing that it is better to have two separate ways of initing the various *Data structs?15:40
fwereadeTheMue, it really does make it hard for me to follow what's going on15:40
fwereadeTheMue, it feels like you're drawing information from a whole bunch of different sources and asserting that you have enough information to cover every possible case15:41
fwereadeTheMue, but every different data source is a potential race15:41
fwereadeTheMue, and I'm not sure I'm equal to the task of analyzing them all15:43
TheMuefwereade: Avoiding code duplication for sure is a good goal.15:43
TheMuefwereade: Step by step the FW is totally rewritte. :/15:43
TheMuerewritten15:44
fwereadeTheMue, well, I was a little surprised by this direction -- I had thought we were clear on the advantages of doing *everything* based on watchers, instead of adding more random desynchronized data sources into the mix15:46
TheMuefwereade: The bad think is that you're right, but on the other hand the change grows and grows. :(15:46
fwereadeTheMue, I *think* it's possible to make it shrink15:47
fwereadeTheMue, you only need a single creation function for each *Data type15:47
TheMuefwereade: It is everythink done by watchers. But only in init() it's done on the initial event and later lazy.15:47
fwereadeTheMue, initMachine uses IsExposed() and OpenedPorts(), completely divorced from any sort of watches on those things15:48
fwereadeTheMue, you've moved the desynchronization up a level but not resolved it15:48
fwereadeTheMue, so: in each *Data creation function, you must *consume the guaranteed first event* from your own watcher, and fill in your state based on the information received15:49
TheMuefwereade: Sorry, can't follow.15:49
fwereadeTheMue, ok, any time you create a machine15:50
fwereadeTheMue, all its unit and service data must be created and filled in before the watch lop is started and the creation function returns15:50
fwereadeTheMue, that is all you need to do, and all these alternate ways of initialization just fall away15:51
fwereadeTheMue, the *only* initialization you need is a `var reconciled bool` at the top of the FW loop15:51
fwereadeTheMue, and then `if !reconciled { reconciled := true; err := fw.initWhateverMode() etc }` at the end of the <-machinew.Changes branch15:52
TheMuefwereade: ???15:52
fwereadeTheMue, ok15:52
fwereadeTheMue, let's turn this around15:52
fwereadeTheMue, why do you have more than one way of creating unit data, or machine data?15:52
fwereadeTheMue, why are the serviceDatas for those units created in different ways?15:54
TheMuefwereade: That's already understood, the ??? has been for the reconciled mode.15:54
fwereadeTheMue, it is a bool which is used to fire off some logic once and only once when the time is opportune15:55
fwereadeTheMue, ie, once you have handled the first machines change15:55
fwereadeTheMue, you then have complete state, and can run initGlobalMode() or whatever to reconcile with provider-supplied reality15:55
fwereadeTheMue, then set the bool to true so we don;t hit the branch again15:56
fwereadeTheMue, and just casually handle all other changes as they come15:56
TheMuefwereade: OK, just trying to bring it together.15:57
dimiternif I do x := y, when y is struct {..}, does this mean it's making a copy and you can change x independently?15:59
dimiterndimitern: answering to myself :) yep, it seems so - i checked16:03
TheMuefwereade: But you still would init the first machines wtacher event before the firewaller loop?16:03
TheMuefwereade: Eh, handle it.16:04
fwereadeTheMue, no, why?16:04
fwereadeTheMue, nothing is going to start sending on the other channels until the various *Datas have been set up16:05
TheMuefwereade: Ah, no, get it with the reconciled.16:05
fwereadeTheMue, if you handle the whole chain in the first event that's all you need16:05
fwereadeTheMue, (ok, you might get an env change before the machines change, but that's all to the good)16:05
TheMuefwereade: So the first event I get IS the initial machine watcher event, but in the loop. And there I use that flag to reconcile with the current real world.16:06
TheMuefwereade: That sound reasonable.16:07
fwereadeTheMue, yeah, so, the first event is "all known machines"16:07
fwereadeTheMue, you do the machineLifeChanged for each machine as before16:07
fwereadeTheMue, the only difference is that you handle the initial event from the units watcher *before* starting the loop and returning the created machine16:08
fwereadeTheMue, but, ofc, for each unit in the initial event for that machine, you have data to create and fill in before starting the watch and returning the unit data16:08
fwereadeTheMue, this may even include starting a service watch, getting the initial event16:09
fwereadeTheMue, etc16:09
fwereadeTheMue, the idea is just to make sure that there's only one way to create each *Data kind, and that it always completely fills in its own data before it returns from the creation function (and has its watches based on diffs from that known state)16:10
fwereadeTheMue, I *think* this hugely simplifies matters16:10
fwereadeTheMue, am I making any sense?16:11
TheMuefwereade: Hmm, to make it clean I have to move those new…Data() to methods in firewaller, because the firewaller changes datas but not vice versa.16:11
fwereadeTheMue, yeah, my gut was suggesting that would be a good way to go16:11
fwereadeTheMue, I didn't want to be excessively prescriptive16:11
fwereadeTheMue, what's your feeling about the relative simplicity of the above approach? I think it would be smaller and easier to follow16:12
TheMuefwereade: No, you aren't. But next time you've got such a redesign in mind just write down a little outline with comments. That's simpler than to do it in a dialog.16:13
mrammfwereade: TheMue: I agree that we would all benefit from a bit of design documentation around lifecycle stuff16:17
TheMuemramm: Hiya.16:17
mrammin general I think we often find out that there are disagreements about design later in the process than we should16:17
mrammsome of that is inevitable16:18
mrammand I don't want to do Big Design Up Front16:18
fwereademramm, yeah, I know what you mean16:18
mrammbut a few quick notes about what is planed would be good to have more often16:18
fwereadeyeah -- I think that perhaps some artifacts were preserved from lisbon, but I couldn't tell you *where*16:20
fwereademramm, if you think it would still be a win at this stage I would be more than happy to document what I plan to be doing to them over the coming weeks16:21
fwereademramm, what I plan to write does not differ in any significant way from what we agreed back then -- the fundamental dependencies have not changed16:21
mrammfwereade: I do think it would be a win16:21
mrammfwereade: I know, but we didn't really document what we agreed that well, so I think it would be good to do still16:22
TheMueSo, AFK for a few minutes, playing daughters taxi. BRB16:24
mrammrogpeppe: I think it would also be good to document a bit about how we expect the API to work16:24
mrammTheMue: cool, see you soon.16:24
rogpeppemramm: i agree16:24
mrammrogpeppe: and also a little bit about the plan for building it16:25
rogpeppemramm: we some ideas but we haven't worked out what the message format will be like16:25
mrammrogpeppe: so that we can see if we are over-promising for 13.0416:25
rogpeppemramm: i've already got a preliminary branch submitted with some of the basics done16:25
mrammeven writing down what we have now would be valuable I think, but of course the message format/content is the key16:26
rogpeppemramm: i'm building the framework from the bottom up and leaving decisions about the actual protocol until later16:26
mrammok, thats fine16:26
mrammlet's just define what we know, and write todo items for the decisions that still need to be made16:27
rogpeppemramm: i also did a preliminary top-down implementation, but it didn't go down that well16:27
mrammalways good to give it time16:27
TheMueSo, back again16:45
rogpeppefor anyone that would like something to look at, a small CL: https://codereview.appspot.com/6902070/17:05
=== TheMue_ is now known as TheMue
rogpeppetime for me to go. have a good rest-of-day, peeps18:33
=== robbiew is now known as robbiew-afk
=== robbiew-afk is now known as robbiew

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