/srv/irclogs.ubuntu.com/2012/05/22/#juju-dev.txt

niemeyerandrewsmedina: Heya00:17
niemeyerandrewsmedina: Just delivered a review on your branch00:17
niemeyerandrewsmedina: Seems pretty close..00:18
niemeyerandrewsmedina: just trivial stuff00:18
niemeyerAchievement unlocked!00:20
niemeyerNothing to review on the Go front!00:20
niemeyerPhew00:20
andrewsmedinaniemeyer: thanks for review! I will work to resolve the things that you said00:45
=== davechen1y is now known as davecheney
andrewsmedinaanybody here?04:16
* davecheney waves05:06
davecheneyandrewsmedina: are you doing a full port for the local provider to juju/go ?05:28
davecheneythat would be awesome05:28
rogpeppedavecheney: hiya06:31
davecheneyaoy06:35
rogpeppedavecheney: i'm a big fan of sharing-memory-by-communicating in general, but sometimes a mutex gets the job done more cleanly IMHO. http://paste.ubuntu.com/1000362/06:56
rogpeppedavecheney: (which also has the advantage that we don't serialise all requests)06:57
davecheneyrogpeppe: yup, that will work also07:00
davecheneythere is no reason why we couldn't also do07:01
davecheneycase cmd := <- p.cmd ; go cmd(p.env)07:01
davecheneyi'm not sure gustavo is sold on the idea of a proxy yet07:02
davecheneybut I do admit your idea is simpler07:02
rogpeppedavecheney: invoking go doesn't quite have the same semantics (something may be operating on the environment while it changes) but perhaps that doesn't matter.07:03
davecheneyrogpeppe: it's fine to operate on a stale copy07:04
davecheneybecause that is inevitable07:04
rogpeppedavecheney: if i'm passing a function into a goroutine just to get mutual exclusion, then i start to think i'm doing something a bit wrong.07:04
davecheneyrogpeppe: i was following the way the topology worked07:04
* rogpeppe obviously hasn't looked too closely at that code :-)07:05
rogpeppedavecheney: if you don't care whether things can run on the same environment when it changes, then things can be even simpler: http://paste.ubuntu.com/1000370/07:07
davecheneynice07:08
davecheneyi'll take that, thank you07:08
rogpeppedavecheney: cool, glad to be of help.07:08
davecheneyi had some reason why it needed to be the original way07:09
davecheneybut I can't remember them now07:09
davecheneyso until I do07:09
davecheneylets go for simplicity07:09
rogpeppedavecheney: one thing: do we really need to block in NewProxyEnviron? can't we just let the first operation block until there's a valid environ?07:14
davecheneynope, no need to block07:14
rogpeppedavecheney: that would simplify things even more: http://paste.ubuntu.com/1000379/07:14
davecheneythat was a personal chioce07:14
rogpeppedavecheney: down from 167 lines to 86 :-)07:14
davecheneyexcellent07:14
davecheneyi won't mention that it won't compile anymore07:15
rogpeppedavecheney: minor details07:15
rogpeppe:-)07:15
davecheneyahh, that is why we block til a valid environ07:15
davecheneyso we don't need to check for nil07:15
rogpeppedavecheney: ah, that's easy to fix too.07:16
davecheneywhen NewProxyEnviron returns, there is something that proports to be an envion there07:16
davecheneyso no worrying about NPE07:16
rogpeppedavecheney: something like this, perhaps? http://paste.ubuntu.com/1000381/07:17
davecheneyno thanks07:17
davecheneylocked isn't protected by a mutex, and the locks and unlocks are unbalanced07:17
rogpeppedavecheney: locked doesn't need to be protected by a mutex (it's local). we ensure that the lock is held on entry to loop. but yeah, it's not so pretty.07:18
rogpeppedavecheney: i had the locked logic wrong BTW: http://paste.ubuntu.com/1000384/07:19
rogpeppedavecheney: a slightly less unsavoury option: http://paste.ubuntu.com/1000388/07:23
rogpeppedavecheney: but maybe it's best just to do the wait explicitly in NewProxyEnviron as before.07:24
davecheneylets wait for the request that it doesn't block during startup07:24
davecheneyi don't see it as a issue, as nothing can act on the Environ til it's valid anyway07:25
davecheneythanks rogpeppe that made the code a lot simpler07:25
davecheneytests still don't pass, but whatever07:26
davecheneythe main goal is to convince gustavo why a proxy is a good way of managing the unstable environment07:26
rogpeppedavecheney: i think that the simpler it is the more likely we are of that07:26
rogpeppedavecheney: BTW i'm not convinced this deserves its own package. it's quite specific to the provisioning agent, isn't it?07:28
davecheneyi hope that it makes it easier to test07:28
davecheneyie, we test we can do all the dummy tests against this Environ07:28
davecheneyrather than trying to test it via the provisioning agent07:28
rogpeppedavecheney: there's nothing stopping us having internal tests for the provisioning agent code07:29
davecheneybut your point is well made that in theory the provisinng agent is the only one talking to the Environ07:29
rogpeppedavecheney: i've done that quite a bit in the ec2 provider07:29
rogpeppedavecheney: also, as a general mechanism it's not quite there07:29
rogpeppedavecheney: because if a client keeps a Storage around, that won't work well - you'd have to proxy that too.07:30
davecheneyrogpeppe: yup - i saw that, maybe that can be solved via convention07:31
davecheneyon error, get a new storage07:31
rogpeppedavecheney: yeah, but will the provisioning agent actually be writing to storage ever?07:31
rogpeppedavecheney: i.e. do we really care?07:31
davecheneyrogpeppe: that, i do not know07:31
rogpeppedavecheney: we could have a Storage method that just paniced.07:32
rogpeppedavecheney: (or returned a Storage that always returned an error, i suppose)07:33
rogpeppedavecheney: oh, i'm talking bollocks, of course the provisioning agent needs to talk to the storage.07:34
davecheneyok, i'll make a proxy storage07:34
rogpeppedavecheney: yeah. it could always call the relevant storage method in proxy before invoking its method.07:35
rogpeppedavecheney: it's slightly easier if you assume that the provisioning agent will never need to *write* to the storage (which i think is the case) http://paste.ubuntu.com/1000412/07:46
rogpeppedavecheney: and i'm thinking that it's probably best to have NewProxyEnviron block until the environment is valid, and let the caller deal with that.07:46
rogpeppedavecheney: rather than putting an error test in every method.07:46
rogpeppedavecheney: anyway, i should get back to my *own* damn code!07:49
davecheneyrogpeppe: thanks for your help08:08
davecheneyout08:08
Arammorning.11:18
rogpeppeAram: hiya11:21
rogpeppegotta love ec2 request reliability12:00
TheMuerogpeppe: Why?12:15
TheMuerogpeppe: Heya btw.12:15
rogpeppeTheMue: (hiya too) i've run the environs/ec2 amazon tests four times in a row and they've failed each time for different reasons.12:15
rogpeppeTheMue: we really need some retry logic at the goamz/ec2 level - that will help a lot.12:16
rogpeppeTheMue: it's great when a test fails 3/4s of the way through, reading a file that it already read successfully, saying "file not found"12:17
TheMuerogpeppe: Yes, transparent for the user. Only real hard errors we know should raise.12:17
rogpeppeTheMue: yeah. you can't deal with the eventual consistency stuff automatically sadly. but the "premature EOF" and "handshake failure" errors are entirely possible.12:17
TheMuerogpeppe: Is EC2 in general so unreliable? Or is it only a special part of their API?12:18
rogpeppeTheMue: i have a feeling it's all that unreliable12:19
rogpeppeTheMue: but i only have the one data point12:19
TheMuerogpeppe: Uuh, not good.12:19
rogpeppeTheMue: it applies to S3 too12:19
rogpeppeTheMue: yay, put in a couple of retry loops and it all works now12:19
TheMuerogpeppe: Are there any hints by Amazon on an optimal retry strategy (how often, which delay between requests, …)?12:21
rogpeppeTheMue: no. they don't even talk about eventual consistency issues. it all looks hunky-dory in their docs.12:21
TheMuerogpeppe: I've got to admit that I expected this answer. I only had a little hope left.12:22
rogpeppeTheMue: building on shifting sands...12:22
TheMuerogpeppe: So take a house boat, able to move but tied in place.12:24
rogpeppeTheMue: right, time for some lunch12:26
TheMuerogpeppe: Enjoy, I just had.12:26
niemeyerHullah!12:39
TheMueniemeyer: Moin. ;)12:49
niemeyerTheMue: Heya12:49
TheMueniemeyer: I'm just thinking about the "endpointInfo" in topology.go. It's indeed no beatiful solution and tries to wrap what "get_relation_service" and "get_relations_for_service" return in the Python version.12:58
TheMueniemeyer: Its really very similar to "RelationEndpoint2, only that there are names while "endpointInfo" deals with keys.12:59
niemeyerTheMue: Right13:00
TheMueniemeyer: I could add the keys to "RelationEndpoint" as private fields, that would safe us one type13:01
niemeyerTheMue: Why do we need the keys there?13:01
niemeyerTheMue: See the Python code13:01
TheMueniemeyer: Have to look, one moment. It's taken from the Python code.13:02
niemeyerTheMue: I don't think it is13:02
niemeyerTheMue: This branch diverges wildly from Python all around13:02
TheMueniemeyer: The information that the two functions using the "endpointInfo" returns is the same like the two Python functions named above.13:05
TheMueniemeyer: But there dynamically lists and dictionaries are taken.13:05
niemeyerTheMue: That's not what we were talking about..13:05
niemeyer<TheMue> niemeyer: I could add the keys to "RelationEndpoint" as private fields, that would safe us one type13:05
niemeyer<niemeyer> TheMue: Why do we need the keys there?13:06
niemeyer<niemeyer> TheMue: See the Python code13:06
rogpeppegorgeous weather out there for a change.13:09
rogpeppeniemeyer: mornin', BTW13:10
TheMueniemeyer: "get_relations_for_service" stores at least the "relation_id", I don't yet know where it is used. Regarding the "ServiceKey" William and I discussed that it's better than the name, which can be retrieved via "ServiceName(key)".13:10
rogpeppeniemeyer: thanks a lot for the review last night. you might've seen two tiny branches proposed this morning: https://codereview.appspot.com/6220065/ and https://codereview.appspot.com/6221058/13:11
niemeyerrogpeppe: Morning13:13
niemeyerTheMue: Sorry, I don't understand what you mean.. the service key is a service key, the service name is a service name. Neither is better than the other without context.13:14
niemeyerrogpeppe: No, haven't run through reviews yet13:14
rogpeppeniemeyer: that's fine. they're both independent anyway,13:14
niemeyerrogpeppe: That's great, thanks13:15
TheMueniemeyer: If I have one of it (service name or key) I can retrieve the other (only that from key to name is a bit faster). For relations I need the key to retrieve the name.13:17
niemeyerTheMue: Yes. How does that change the picture in the scenario we were talking about earlier?13:18
niemeyerTheMue: You can use RelationEndpoint to work with relations in the same way that Python deos.13:18
niemeyerdoes13:18
niemeyerTheMue: You don't need to store any private keys in RelationEndpoint.13:18
TheMueniemeyer: That's only a first observation for me to get a better understanding13:19
niemeyerTheMue: RelationEndpoint needs a RelationName13:19
niemeyerTheMue: All of that has to be fixed13:19
niemeyerTheMue: And all of it are divergences from what Python does13:19
TheMueniemeyer: It has now a name.13:19
niemeyerTheMue: Simplifying is cool, but it needs a lot of attention to what is being done if we are to diverge from what is being done in the Python code. I get quite nervous when I see the implementation diverging wildly both in terms of implementation and in terms of *semantics*.13:20
TheMueniemeyer: What I'm looking for is how to optimally return informations that get_relations_for_service and get_relation_service return.13:21
niemeyerTheMue: Ok, let me look at that13:21
TheMueniemeyer: There they are e.g. dynamic lists with the interface as first field and service topology as second field.13:21
niemeyerTheMue: What is "service topology"?13:22
TheMueniemeyer: For the rest I already adopted your suggestions.13:22
niemeyerTheMue: I suppose get_relations_for_service should return []relation?13:24
TheMueniemeyer: Eh, wrong wording, see return (relation_data["interface"], relation_data["services"][service_id])13:24
TheMueniemeyer: Good idea, would only have to add the key here (currently it doesn't has).13:25
niemeyerTheMue: Yeah, that sounds fine.. RelationKey13:26
niemeyerWell, not really13:26
niemeyerTheMue: relation{ Key: ... }13:26
TheMueniemeyer: It would be persisted.13:26
niemeyerTheMue: Not necessarily.. omitempty13:26
TheMueniemeyer: Ah, yes, I remember.13:26
niemeyerTheMue:                     service=services[service_id]))13:27
niemeyerTheMue: What is that data in the service key?13:27
niemeyer{"role": r, "name": n}, I suppose..?13:29
TheMueniemeyer: The function only looks for one service. So our Services map would contain the role and the key.13:29
niemeyerTheMue: Why does it do that? I'm not sure we should mimic it13:30
TheMueniemeyer: Let me look for a consumer of this function, moment.13:30
niemeyerTheMue: If we get a relation back, it should be the actual relation, with its actual.. it's not clear to me why we should be stripping it off arbitrarily13:30
niemeyers/its actual/its actual data/13:31
niemeyerTheMue: I was looking at that too.. still not clear.. feels like a poor interface13:31
TheMueniemeyer: So far I don't see any reason too.13:31
niemeyerTheMue: Ok.. let's just return a proper relation with its real data then13:32
niemeyerTheMue: If we find out why we can talk again13:32
niemeyerTheMue: But I suspect this should do quite nicely13:32
TheMueniemeyer: Think so too.13:32
TheMueniemeyer: At least it "feels" better than my current solution.13:32
niemeyerrogpeppe: You got a major LGTM, and a major OMG WHAT ARE YOU DOING?13:36
rogpeppeniemeyer: interesting13:36
rogpeppeniemeyer: the way to fix that OMG is to implement signed URLs in s3, which i haven't got around to yet.13:37
rogpeppeniemeyer: if i put in a TODO, would that be ok?13:37
niemeyerrogpeppe: No.. we're not making anything public and swiping that under the carpet13:38
niemeyers/anything/everything/13:38
niemeyerrogpeppe: Been there, doesn't end up well13:38
rogpeppeniemeyer: ok. i'll do the s3 thing first then.13:38
rogpeppeniemeyer: only problem is, i looked for how to do the signed URL thing before and didn't come up with anything13:39
niemeyerrogpeppe: I can do that if necessary13:39
niemeyerrogpeppe: Actually, let me do that13:39
niemeyerrogpeppe: Are you happy with the former s3 branch?13:39
rogpeppeniemeyer: just a pointer to some docs would be fine. or, if you wanna do that, that would be lovely too!13:39
rogpeppeniemeyer: oh shit, forgot about that. one mo.13:39
niemeyerrogpeppe: Cheers13:40
rogpeppeniemeyer: you've got a review13:55
niemeyerrogpeppe: "could we give a nicer error here when we panic?"13:58
niemeyerrogpeppe: When would it panic?13:58
rogpeppeniemeyer: if the host in the headers didn't have two dots in it?13:59
niemeyerrogpeppe: This code can't execute if that's the case13:59
rogpeppeniemeyer: ah yes.14:00
niemeyerrogpeppe: Will fix the rest14:00
niemeyerrogpeppe: Thanks for the review14:00
rogpeppeniemeyer: doh, sorry for that14:00
niemeyerrogpeppe: np14:01
niemeyerrogpeppe: I'll add the "" on a line on its own.. it's not using field names purposefully in this case14:01
rogpeppeniemeyer: that's fine14:02
niemeyerrogpeppe: It should fail if we add a field and forget to update one of the structs14:02
rogpeppeniemeyer: sure.14:02
niemeyerrogpeppe: ${bucket} would probably be a more sensible replacement var14:06
rogpeppeniemeyer: yeah, that would be fine. although if there's ambiguity between $name and the rest, there's gonna be ambiguity between the bucket name and the rest...14:07
niemeyerrogpeppe: Hm?14:07
rogpeppeniemeyer: isn't that why you're preferring ${bucket} ?14:07
rogpeppeniemeyer: because it's unambiguously replaceable?14:08
rogpeppei suppose the host name might have a $ in.14:08
rogpeppeif that's allowed14:08
niemeyerrogpeppe: $namesis shouldn't get replaced14:08
rogpeppeniemeyer: yeah, true. it's a URL really and URLs can contain $s14:10
rogpeppeniemeyer: ${bucket} is just fine.14:10
rogpeppeniemeyer: lots better than %s :-)14:10
niemeyerrogpeppe: Indeed14:12
niemeyer"@ylastic #AWS #EC2 API calls returning intermittent errors "Unavailable: Unable to process request, please retry shortly""14:15
niemeyerThings are getting more and more "eventual"14:15
niemeyerrogpeppe: Branch re-proposed14:18
rogpeppeniemeyer: it's wonderful. i tried the amazon test 4 times in a row this morning and it failed each time with a different error. we need to get that retry logic in!14:19
rogpeppeniemeyer: LGTM14:22
niemeyerrogpeppe: Thanks14:23
andrewsmedinarogpeppe, niemeyer morning :D14:23
rogpeppeandrewsmedina: hiya!14:23
andrewsmedinarogpeppe, niemeyer thanks for review14:24
rogpeppeandrewsmedina: np. thanks for bearing with us!14:24
andrewsmedinarogpeppe: when you have a time, I wanted to talk with you about the reivew14:24
rogpeppeandrewsmedina: i've got a meeting in 5 minutes, but in an hour or so, no problem.14:25
andrewsmedinarogpeppe: ok14:32
rogpeppeandrewsmedina: ping14:50
andrewsmedinarogpeppe: pong14:57
andrewsmedinarogpeppe: about the %d14:57
rogpeppeandrewsmedina: about the %d14:58
andrewsmedinarogpeppe: virsh use the %d to create a autoincrement number for the net/bridge name14:58
andrewsmedinarogpeppe: the juju python version uses it14:59
rogpeppeandrewsmedina: is that needed, given that the name needs to unique anyway?14:59
rogpeppes/to /to be /14:59
rogpeppeandrewsmedina: fair enough. *is* it actually documented anywhere, or is it just a bit of black magic known to those who've read the source?15:00
andrewsmedinarogpeppe: http://bazaar.launchpad.net/~juju/juju/trunk/view/head:/juju/providers/local/network.py#L1315:01
andrewsmedinarogpeppe: I dont know if this is a oficial feature =/15:02
rogpeppeandrewsmedina: ok. i see that, thanks. but i'd like to know why we're doing that. or at any rate write a comment saying what it's there for.15:02
rogpeppeniemeyer, hazmat: do you know, by any chance, why we need an autoincrement number in the lxc network bridge name?15:03
andrewsmedinarogpeppe: I will do a comment about it15:03
rogpeppeandrewsmedina: thanks a lot15:03
andrewsmedinarogpeppe: about the split15:03
hazmatrogpeppe, we do? we just use the default libvirt name15:03
hazmats/name/network15:04
andrewsmedinarogpeppe: virsh always returns the same string pattern15:04
rogpeppehazmat: see link above15:04
andrewsmedinaI need to check anyway?15:04
andrewsmedinahazmat: http://bazaar.launchpad.net/~juju/juju/trunk/view/head:/juju/providers/local/network.py#L1315:04
rogpeppeandrewsmedina: yes, but virsh isn't part of the juju program. if someone changes the virsh output, we want a "unexpected virsh output" error or similar, rather than an array bounds panic.15:05
hazmatandrewsmedina, we don't specify that value15:05
hazmatandrewsmedina, its escaped because libvirt uses it15:05
hazmat%%d15:05
rogpeppehazmat: why do we need it?15:05
hazmatrogpeppe, we don't.. libvirt does15:06
rogpeppehazmat: isn't the bridge name unique enough, given that it includes the network name?15:06
hazmati'd suggest not being slavish about copying that aspect.. i've got a separate branch local-cloud-img that gets rid of libvirt entirely15:06
andrewsmedinalaunch time :(15:07
andrewsmedinasorry15:07
hazmatrogpeppe, its not15:07
rogpeppehazmat: ok.15:07
rogpeppehazmat: when you say "getting rid of libvirt", you mean "not using virsh" ?15:07
rogpeppehazmat: i haven't looked too deeply into how all the lxc stuff is set up. i should!15:08
hazmatrogpeppe, no i mean getting rid of libvirt15:08
hazmatrogpeppe, the name comes out virbr15:08
hazmatagain this has nothing to do with juju15:08
hazmatthis is libvirt's configuration15:08
hazmatand it needs that string insertion for its templates %d15:09
rogpeppehazmat: i didn't see any mention of the %d in the libvirt docs. but i'm probably looking in the wrong place.15:10
rogpeppehazmat: (i looked in15:10
rogpeppehttp://libvirt.org/formatnetwork.html and15:10
rogpeppehttp://libvirt.org/sources/virshcmdref/html/sect-net-define.html15:10
rogpeppe)15:10
rogpeppehazmat: so your branch eschews the portability layer and talks to lxc directly?15:11
hazmatrogpeppe, what portability layer?15:11
hazmatrogpeppe, i think your misunderstanding something fundamental here15:12
rogpeppehazmat: libvirt looks like a portability layer to me, but i may be misinterpreting15:12
rogpeppehazmat: almost certainly!15:12
hazmatrogpeppe, we don't use libvirt outside of setting up the network15:12
hazmatrogpeppe, its a rather broken portability layer when it comes to lxc15:12
hazmatrogpeppe, it has many additional functionalities that have no meaning on the context of lxc15:12
rogpeppehazmat: sure. but that is the role it's trying to play, no? or i'm i fundamentally misunderstanding?15:12
niemeyerIt's lunch time15:12
hazmatrogpeppe, we're just piggybacking on its packinging of a default network15:12
hazmatin the lxc in precise, this is also in the lxc package15:13
hazmatmoreover local provider doesn't use cloud-init or cloud images at the moment, the branch i mentioned local-cloud-img, rips out libvirt, uses cloud images for local provider, and uses cloud-init to configure15:13
hazmatrogpeppe, yes libvirt is an abstraction layer over different virt providers15:14
rogpeppehazmat: ok, cool. i'm not too far off then!15:14
hazmatrogpeppe, but its not particularly good for several of them15:14
rogpeppehazmat: that's in the nature of portability layers i guess. lowest common denominator.15:15
hazmatrogpeppe, for example openstack uses libvirt to address several different tech, but there are also standalone providers for some of the same ones that libvirt provides an abstraction for15:15
hazmatwithin openstack15:15
hazmatrogpeppe, its actually quite rich as a common api, but in the context of lxc specifically its typically out-of-date, and overkill15:15
hazmatrogpeppe, we had a discussion about trying to use libvirt directly a while ago instead of lxc directly15:16
rogpeppehazmat: given that we're directly reliant on lxc in other aspects, i'd be inclined to agree, although i haven't looked at how hard it is to configure networks in lxc directly.15:16
rogpeppehazmat: that's the other possibility of course15:16
hazmatrogpeppe, its pretty trivial, just needs the packaging effort around creating the bridge, etc15:17
hazmattrivial to configure that is15:17
* hazmat preps for his next meeting15:17
rogpeppeandrewsmedina: anyway, with a comment, i'm happy with that code.15:17
rogpeppeTheMue: i see sporadic test failures testing state: http://paste.ubuntu.com/1001083/15:49
TheMueTheMue: I've done no changes at watcher for a longer time, but I've just merged the trunk into my branch and get a watcher failure too.15:51
rogpeppeTheMue: i don't *think* it's my fault :-)16:02
* niemeyer waves16:10
niemeyerTheMue: Perhaps a race?16:10
rogpeppeniemeyer, TheMue: i suspect a race, or an inadequate timeout.16:17
rogpeppeniemeyer: BTW if i take out that PublicRead change, does that "make amazon tests work" branch LGTY?16:17
niemeyerrogpeppe: I've stopped checking it out there16:17
TheMueSo, back, had to do an emergency repair here (jalousie broke down).16:18
rogpeppeniemeyer: ok. 'cos i need that branch in an upcoming branch that already has a dependency...16:18
niemeyerrogpeppe: Ok, what's the plan?16:27
rogpeppeniemeyer: i've pushed that branch without that change. the amazon tests no longer pass of course, so i'm changing it temporarily locally so i can test. but the other changes are less trivial and also necessary.16:28
rogpeppeniemeyer: so when s3 implements signed URLs we'll use them and the amazon tests will pass16:28
niemeyerrogpeppe: Ok, I mean what's the plan as far as the branch goes16:29
rogpeppeniemeyer: the "fix amazon tests" branch?16:29
niemeyerrogpeppe: Whatever branch you mean.. yous said you need that branch.. what's your plan16:29
TheMuerogpeppe: I few moments ago I had your watcher error too, but now everything runs. Will investigate it later.16:30
rogpeppeniemeyer: i'll hold off proposing again until the "fix amazon tests" branch is in.16:30
niemeyerrogpeppe: Ok.. so I'm' not sure about what you meant16:31
niemeyer<rogpeppe> niemeyer: BTW if i take out that PublicRead change, does that "make amazon tests work" branch LGTY?16:31
niemeyer<rogpeppe> niemeyer: ok. 'cos i need that branch in an upcoming branch that already has a dependency...16:31
rogpeppeniemeyer: it would be nice to have a review of the "fix tests" branch so i can propose that upcoming branch16:31
niemeyerrogpeppe: You already have a review.. there's a change that can't go in16:31
rogpeppeniemeyer: it no longer has that PublicRead change16:31
rogpeppeniemeyer: i've re-proposed it16:32
niemeyerrogpeppe: Ok.. so you've reproposed and you want another review?16:32
rogpeppeniemeyer: yes please16:32
rogpeppeniemeyer: you should have got a mail saying "please take a look" :-)16:32
niemeyerrogpeppe: Heh16:32
niemeyerrogpeppe: That's a pretty difficult way to ask for a review16:33
niemeyerrogpeppe: Will have a look16:33
rogpeppeniemeyer: isn't that implied? if not, what's the point of the mail?16:33
niemeyerrogpeppe: You see the history above?16:34
niemeyerrogpeppe: "Please have a look at http://... again" is fine16:34
rogpeppeniemeyer: fair enough16:34
rogpeppeniemeyer: (but i thought that was the point of the "Please take a look" email!)16:35
niemeyerrogpeppe: Nevermind!16:35
rogpeppeyay! go tools now working on the server again...16:35
rogpeppeniemeyer: BTW while (if?) you're on little reviews, this is trivial, assuming you agree with the premise.  https://codereview.appspot.com/6188068/16:41
niemeyerrogpeppe: What's the point of these loops?16:50
niemeyerfor i := 0; i < 5; i++ {16:50
niemeyer?16:50
andrewsmedinaniemeyer: ping16:50
niemeyerandrewsmedina: hi16:50
andrewsmedinaniemeyer: thanks for your review16:50
niemeyerandrewsmedina: np16:50
andrewsmedinaniemeyer: I think it is okay16:50
andrewsmedinanow16:50
rogpeppeniemeyer: same as for other eventual consistency issues16:50
rogpeppeniemeyer: i copied the retry code from elsewhere. we could use a different retry time or count16:51
niemeyerrogpeppe: Ok, can you please reduce the delay on each retry then, to maybe 1e8, increase the limit to 30 or so, and add a comment explaining?16:51
rogpeppeniemeyer: ok, will do, and in the other place too.16:51
niemeyerrogpeppe: No need to be too extensive in the comment, just a reminder16:51
andrewsmedinaniemeyer: I will work on local provider interface now: p16:52
niemeyerrogpeppe: Thanks16:52
niemeyerrogpeppe: "LGTM assuming reduced timeouts and increased N as discussed online."16:53
rogpeppeniemeyer: thanks a lot16:53
niemeyerrogpeppe: No problem.. that was easy :)16:56
niemeyerrogpeppe: Hopefully we can get a fix to the signature issue in very soon16:56
niemeyerrogpeppe: I'll try to address that today still16:56
rogpeppe*splash*16:57
rogpeppe(the sound of a branch landing)16:57
andrewsmedinaniemeyer: It needed something more to my proposal be accepted?16:58
rogpepperight, gotta go. have fun all. see you tomorrow.17:00
niemeyerrogpeppe: See ya17:13
niemeyerandrewsmedina: I haven't re-reviewed your branch yet17:13
niemeyerandrewsmedina: have you addressed the latest comments by rog/17:13
niemeyer?17:13
twobottuxaujuju: What is the best way to use the mysql charm in Juju with dynamic database credientials? <http://askubuntu.com/questions/140818/what-is-the-best-way-to-use-the-mysql-charm-in-juju-with-dynamic-database-credie>17:19
andrewsmedinaniemeyer: yes, about %d rog said it is ok17:50
andrewsmedinaniemeyer: about split, virsh always returns the same pattern17:50
niemeyerandrewsmedina: Cool, need to step out for a doc appointment.. back soon, though17:50
andrewsmedinaniemeyer: I'm using the same strategy used in juju python code17:50
andrewsmedinaniemeyer: ok17:51
SpamapSMultiple IPs!!17:55
* SpamapS does a dance17:56
SpamapSniemeyer: great news!17:56
SpamapSthe multiple IPs, not the doc appointment ;)17:56
andrewsmedinaSpamapS: :-p18:08
niemeyerSpamapS: Indeed!!19:25
niemeyerOuch.. that's the sleepiest time of the day20:48
niemeyerAlright, not working.. I'll do it Windows style and take a short nap to reboot20:54
Aramsleep is when the garbage collector runs.20:54
niemeyerdavecheney: Morning!22:00
niemeyerAram: Indeed22:00
davecheneymornign!22:02
davecheneyniemeyer: lets talk about the proxy environ22:02
niemeyerdavecheney: Yeah, was planning on that too22:02
niemeyerdavecheney: Good we're overlapping today22:03
davecheneyhow can I convince you of it's utility22:03
niemeyerdavecheney: Hehe :-)22:03
davecheneyniemeyer: yes, sorry about that, i had to go intot he city to finish some of the employment paper work that was dropped when veronika moved on22:03
niemeyerdavecheney: Ah, no worries at all22:03
niemeyerdavecheney: The concept of having such a wrapper feels pretty icky to me22:04
davecheneyniemeyer: ok, maybe the name is a problem22:04
niemeyerdavecheney: It's a bit like replacing the car every time the battery goes bad22:04
niemeyerdavecheney: Not really22:04
niemeyerdavecheney: It's the concept itself22:05
davecheneyok, let me put it like this22:05
davecheneywe dont' wrap one Environ in another22:05
davecheneythe proxy wraps a *ConfigNode in an Environ22:05
niemeyerdavecheney: We wrap it so that it is magically replaced every time its configuration changes22:05
davecheneyyes22:05
niemeyerdavecheney: That foundational idea is that seems misleading22:05
davecheneyok22:06
niemeyerdavecheney: If the configuration of an environment changes, we should replace its configuration at an appropriate well known time, not the entire thing behind the scenes at an arbitrary moment22:06
davecheneyniemeyer: hmm, this is a bit of a change of heart frmo UDS22:07
davecheneywhere we talked about making the environment a *ConfigNide22:07
davecheneyNode22:07
niemeyerdavecheney: We're talking about different things22:07
davecheneythen the provisioning agent would start to watch that node, until it got a valid configuration22:07
davecheneyok22:07
niemeyerdavecheney: I'm talking about the thing that offers an environs.Environ interface, not the content of the /environment node22:08
davecheneyok22:08
niemeyerdavecheney: Whenever the configuration of an environment changes, there's a window of time that the value in memory we have that represents the environment (implements environs.Environ) will have a wrong configuration.22:09
davecheneyyup22:09
davecheneyi see that as inevitable22:10
niemeyerdavecheney: This is a problem inherent to the distributed context that we can't solve..22:10
niemeyerdavecheney: Understanding that gives us some freedom too, interestingly. It means we can *choose* the best moment to make the configuration active, since we have to deal with it being wrong no matter what.22:11
davecheneyi don't think that matters22:11
davecheneythe config changing is not the thing that broke the environment22:11
davecheneytake the case of AWS keys chanign22:11
niemeyerdavecheney: It matters, in the sense that we don't have to rush to replace the configuration of an environment.22:11
davecheneyok, so i see your concern as proxy.loop() replacing the configuration at wil22:12
niemeyerdavecheney: Not the configuration, it is replacing *the environment*22:12
niemeyerdavecheney: That environs.Environ, is not just a configuration22:12
davecheneyhow are those not the same thing22:13
niemeyerdavecheney: It's the environment state we have in memory.22:13
davecheneythe environ.Environ is formed from materialising the configuration stored in zk22:13
niemeyerdavecheney: Is httpd and httpd.conf the same thing?22:13
davecheneythat is not a good example22:13
niemeyer:-)22:13
davecheneybut I take your point22:13
davecheneyto offer a counter example, port 80 and httpd.conf are the same thing22:14
niemeyerdavecheney: Wait, waht?22:14
niemeyerdavecheney: *port 80* and *httpd.conf* are the same thing!?22:14
davecheneyas a counter example22:14
davecheneynot being too literal22:15
niemeyerdavecheney: I can't process or even argue about that.. it seems so wrong in so many levels22:15
davecheneysure, lets get back to the point22:15
davecheneyworking from the point of view of the PA22:16
davecheneyit needs to see changes to the topology relating to machines22:16
niemeyerdavecheney: RIght22:16
davecheneyand try to make reality match that22:16
davecheneyso, it needs an Environ22:17
davecheneythis we know22:17
niemeyerdavecheney: Right, I'm with you22:17
davecheneyhowever the PA doen't ahve environments.yaml, only the data stored in zk22:17
davecheneyagain, no supprise22:17
niemeyerdavecheney: Right, all good22:17
davecheneyso we've added support to state and environs to be able to construct an Envrion interface from zk data22:18
niemeyerYep, sensible22:18
niemeyer(now comes the interesting leap)22:18
davecheneyso, what happens when the underlying data in zk changes22:18
davecheneythere are number of possible choices, and it looks liek I've chosen the wrong logic22:19
* davecheney re-reads the preceeding discussion before continuing22:20
davecheneyah, yes, you previously said, "If the configuration of an environment changes, we should replace its configuration at an  appropriate well known time,22:20
davecheney"22:20
davecheneyi offer that the proxy environ does that22:21
davecheneywithout having to teach the real environs how to do that22:21
davecheneyand it is not papering over their limitations22:21
davecheneybut a good seperation of concerns22:21
davecheneyhey, what did you miss ?22:22
niemeyerLOL, perfect timing for the disconnection..22:22
niemeyer<niemeyer> davecheney: Right, all good22:22
niemeyer<davecheney> so we've added support to state and environs to be able to construct an Envrion interface from zk data22:22
niemeyer<niemeyer> Yep, sensible22:22
niemeyer<niemeyer> (now comes the interesting leap)22:22
davecheney08:18 < davecheney> so, what happens when the underlying data in zk changes22:22
davecheney08:19 < davecheney> there are number of possible choices, and it looks liek I've chosen the wrong logic22:22
davecheney08:20  * davecheney re-reads the preceeding discussion before continuing22:22
davecheney08:20 < davecheney> ah, yes, you previously said, "If the configuration of an environment changes, we should replace  its configuration at an  appropriate well known time,22:23
davecheney08:20 < davecheney> "22:23
davecheney08:21 < davecheney> i offer that the proxy environ does that22:23
davecheney08:21 < davecheney> without having to teach the real environs how to do that22:23
davecheney08:21 < davecheney> and it is not papering over their limitations22:23
davecheney08:21 < davecheney> but a good seperation of concerns22:23
niemeyerdavecheney: and that was the interesting leap22:23
niemeyerdavecheney: THe proxy doesn't replace the configuration.. it replaces the whole environment22:23
davecheneyi accept that22:23
niemeyerdavecheney: and has to wrap its whole interface so that whoever has it can pick the latest replacement22:24
davecheneyit does so because there is no Environ.ReloadConfiguration() facility22:24
niemeyerdavecheney: Exactly22:24
niemeyerdavecheney: That's what we need.. well, something like it22:24
davecheneyhow would such a faciliy with given that Environ knows nothing of state22:24
niemeyerdavecheney: SetConfig, potentially22:24
niemeyerdavecheney: func (e) SetConfig(config EnvironConfig) error, more precisely22:25
davecheneyok22:25
davecheneyi think that pushes a lot of logic down to the environ22:26
davecheneyit may potentially hold locks while it's config is reloading22:27
davecheneyi think using a proxy acomplishes the same thing with less work22:27
niemeyerdavecheney: The logic is in the environment anyway, if you see it from the perspective that the wrapper is actually an environment that deals just with that one factor22:27
davecheneysounds like good separation of concerns22:28
niemeyerdavecheney: Not really, from the perspective that two sequential calls to the same environment interface are actually dealing with different environments22:28
niemeyerdavecheney: This is really not that great22:28
davecheneyok, now I am understanding your concern22:29
davecheneyi see that as inevitable, and something we need to code for anyway22:29
davecheneyas the environ can't hold any state about it's remote provider22:29
niemeyerdavecheney: Why is it inevitable?22:29
niemeyerdavecheney: Why?22:30
davecheneywell it can hold state, but it must validate that state before using it22:30
davecheneybut that is a digression22:30
niemeyerdavecheney: Yes22:30
davecheneyso, we're always talking about the case of AWS creds failing22:30
davecheneys/failing/changing22:30
niemeyerdavecheney: Yes.. or failing.. both have to be dealt with22:31
davecheneyso, take the case of calling .Instances() to get the instance data, then using StopInstances to stop some of those instances22:31
davecheneyduring the two calls the environ is replaced22:31
davecheneyi dont' see the problem22:31
davecheneythe data from Instances() comes from the real AWS somewhere, and is passed back to the real AWS in the second call22:32
davecheneyah, let me approach it another way22:32
niemeyerdavecheney: I don't want to be using a value that is changing behind my feet.. I don't want to be programming with that mindset. The problems we handle are complex enough by themselves.. we don't have to spoil our own environments.22:32
davecheneyso you are happen for the configuration inside an Environ to change, but not the reference to the Environ itself ?22:33
niemeyerdavecheney: Yes, I'm happy to see the configuration within the environment changing when the configuration of the environment changes22:34
niemeyer(!)22:34
davecheneymaybe i can approach this another way22:35
davecheneywith a different example22:35
davecheneytwo machines are added to the topology, the PA starts the first, then is restarted, then starts the second22:36
davecheneythe reason i ask this is I am trying to understand what is so important inside the specific instance of the real Environ that you want to preserve (that isn't its configuration)22:37
niemeyerdavecheney: func MyFunc(e environs.Environ) { ... <code> ... }.. is it fine to replace what e *is* in the middle of MyFunc?22:37
davecheneyniemeyer: if e is an interface, yes22:38
davecheneywait, let me reread that again22:38
davecheneyyes, if e is an interface, yes22:38
niemeyerdavecheney: Oh, ok.. so it doesn't matter how e is implemented, or what <code> does? It's always ok, necessarily?22:38
davecheneyin the situation of juju, we have to code to taht22:39
davecheneyfor the specific case that e represents a set of calls to an external provider of resources22:39
davecheneyhere is a better example22:39
davecheneyif e was an SQL connection22:39
niemeyerdavecheney: Not at all.. we don't have to code with a wild environment where we have no idea about what our own code is doing22:39
davecheneyit is well established to give back a proxy e (sql connection) that goes an gets a real sql connection when invoked22:40
niemeyerdavecheney: You've lost me22:40
davecheneylet me back up22:41
niemeyerdavecheney: I have no idea about what you mean there22:41
davecheneylets not talk about environs for a moment22:41
davecheneyyou know how db connection pools work22:41
niemeyerdavecheney: Yep22:41
davecheneyyou get a proxy connection from the pool, then when you do work on it, it checks out a real connection22:41
niemeyerdavecheney: No22:42
davecheneyok, i'll cease that line of argument22:42
davecheneyok, to summarise, i am aruging that using a proxy environ achieves the same as an (unwritten) Envrion.SetConfig()22:42
davecheneybut I can't offer any argument that says it is superior (apart from we don't ahve to write SetConfig)22:43
davecheneyso I will drop this branch and go an do SetConfig22:43
niemeyerdavecheney: I understand your argument, and I've been pointing out that it doesn't.. an Environ is an interface.. the implementation of that interface can do anything it pleases, cache anything it wants, start any goroutines it wants..22:43
davecheneyniemeyer: ok, yes, and that would be sensible22:44
davecheneyhoweve the consumer of the interface can't assume any of that22:44
niemeyerdavecheney: Replacing the credentials that an environment uses should not destroy all of that.22:44
niemeyerdavecheney: Nor should it cause code that takes an Environ to blindly talk to two different values in an arbitrary moment.22:44
davecheneyok, you've won me over22:45
davecheneyi would point out that the python version does rebuild a new environ when the config changes22:45
davecheneybut i won't take long to do SetConfig22:45
niemeyerdavecheney: We're talking about *credentials*.. why are we killing the value representing the whole environment to have its credentials changed22:46
davecheneyi have a slight concern that at some point in the future configuration may include more than credentials22:46
davecheneybut for right now, and what we need for this cycle22:46
davecheneyi can't see that happened22:46
niemeyerdavecheney: The Python provisioning agent isn't something I'd put in a frame, for a few different reasons.. I'm sure you can come up with something we'll be a lot more proud of22:46
davecheneyflattery will get you everywhere :)22:47
niemeyerdavecheney: I'm being honest!22:47
davecheneyok, i'll add SetConfig22:47
davecheneybut I would point out my concern that SetConfig will have to drop (potentially) any caches or other internal state22:48
davecheneybut having just writtne that22:48
davecheneyit's not going to be that hard to recognise those things22:48
niemeyerdavecheney: Agreed, and it's also conscious.. the exact moment in time when the agent replaces the environment configuration is under our control.22:49
davecheneyah that raises an intersting point22:50
davecheneywhen you say under our control, i imagine you saying 'when nothing else is using it'22:51
davecheneyis that fair to say ?22:51
niemeyerdavecheney: You know it's not :)22:51
davecheneygood22:51
davecheneybecause that would make things harder22:51
niemeyerdavecheney: But the provisioning agent itself should not be spinning and replacing the configuration in the background.. there's no reason to, I believe22:52
davecheneyso, currently in the proposed PA, the actual stop/start signal is delegated to a goroutine to handle any potential retry logic22:52
davecheneythe aim of that was, the signal of topology change is sent one time22:53
davecheneyon the change, you can't observe it again22:53
davecheneyso we have to store it until it's actioned22:53
niemeyerdavecheney: We've debated at length the idea of how the agents should be organized, and our tentative design direction was to have a main loop that is responsible for dispatching tasks22:53
niemeyerdavecheney: I imagine the configuration replacement being done as one of the potential tasks in that main loop22:54
davecheneyok my recollection was the opposite, but i'm happy to be corrected22:54
niemeyerdavecheney: That's all theoretical, but it gives you the feeling we have about the problem, at least22:54
niemeyerdavecheney: I recall we talked about one goroutine per machine.. is that what you are alluding to?22:55
davecheneyyes22:56
niemeyerdavecheney: Yeah, this is a recent idea22:56
davecheneyso, either the main loop servicing the watcher maintains a list of machines to be added and delted22:56
niemeyerdavecheney: I'm not entirely sure about it yet..22:56
davecheneythen services that list when there is nothing else to do22:56
niemeyerdavecheney: I'm not in a good position to say either way since it depends a lot on how the details are done22:56
davecheneyor do something like this22:57
davecheneyhttp://codereview.appspot.com/6220063/22:57
niemeyerdavecheney: I suspect having goroutines per machine should make the problem simpler, at least in terms of moving things concurrently and focusing on a single task at once22:57
davecheneyi think so too22:58
davecheneyhowever it makes the problem of reloading the environment configuration a bit trickier22:58
niemeyerdavecheney: Still, there's some maintenance task which is unrelated to an individual machine, such as configuration changing, which seems to make sense to be done by a main loop22:58
davecheneyas, from the point of view of those workers, it can happen at any time22:58
niemeyerdavecheney: That orchestrates the whole thing, if you will22:58
davecheneyyup, so it's selecting on the watcher for machines and the watcher for confgiuration22:58
davecheneymachine changes get delegated22:58
davecheneyconfiguration change call environ.SetConfig22:59
niemeyerdavecheney: Right, but even those changes need some taking care of22:59
niemeyerdavecheney: E.g. a controlled reboot needs to take into account those tasks22:59
davecheneyright, you're talking about limiting work in progress and the number of concurrent connections in progress23:00
niemeyerdavecheney: No, not just that23:00
davecheneycan I ask a semi related question ?23:00
niemeyerdavecheney: I'm saying that it's not just a background task that we fire and forget23:00
davecheneydo machines, that is to say their topology name, ever get reused23:00
niemeyerdavecheney: It needs to be managed23:00
niemeyerdavecheney: If the provisioning agent has to reboot (e.g. upgrades) it should be done in a controlled fashion23:01
davecheneycan you expand a bit on that last sentance pelase23:01
niemeyerdavecheney: Pretty much all background activity must be accounted for, and properly terminated synchronously when necessary23:01
niemeyerdavecheney: Watchers, for example, have Stop methods that request the termination of the background task23:01
niemeyerdavecheney: Those methods are synchronous.. they ask for the background activity to die, and wait until they do so23:02
davecheneycan you expand on this bit "If the provisioning agent has to reboot (e.g. upgrades) it should be done in a controlled  fashion23:02
niemeyerdavecheney: It's critical that things that start background activity, have hooks onto the termination of those activities, and that we can wait and verify that the given activity was ok23:02
davecheneyspecifically about rebooting the PA23:02
niemeyerdavecheney: We need to be able to upgrade, from day zero23:03
niemeyerdavecheney: Upgrade == get new version, unpack, reboot23:03
niemeyerdavecheney: s/reboot/restart/, maybe that's clear23:03
davecheneyok, i'm not sure i understand the significance of that23:03
niemeyerdavecheney: process stops and starts?23:04
davecheneyi'm assuming this code will run on EC2 therefore stands a strong chance23:04
davecheneyof being rebooted at any time23:04
niemeyerdavecheney: Yes, why does that matter?23:04
davecheneyi'm writing everything to assume no local state23:04
davecheneyeverything is sensed from the zk state23:04
davecheneyand acts uppon it anew every time23:05
niemeyerdavecheney: Yep, that's nice.. but you have local state no matter how much you pray not to.. in memory23:05
niemeyerdavecheney: Code running, variables flowing, error conditions23:05
davecheneysure, but lets not get pedantic23:05
niemeyerdavecheney: No no, I'm serious23:05
niemeyerdavecheney: It's not ok to say 1) start machine; 2) reboot23:05
davecheneythe only assumption i'm building on is that the watcher will always tell me about anything I have missed on the first cycle23:06
niemeyerdavecheney: Yes, that's fine23:06
davecheneytf the PA can start at any point and learn about the complete topology to that point without having to maintain it's own journal23:06
niemeyerdavecheney: I'm talking about background activity.. it's not ok to put a goroutine to do something and then ignore it23:06
niemeyerdavecheney: Watchers have Stop methods23:06
niemeyerdavecheney: We can stop them, and get the error condition23:06
niemeyerdavecheney: That's not what I'm saying.. I'm saying that activities should be controllable.. it's not ok to run stuff in the background and be unable to ask them to stop or to tell if they worked or not23:07
niemeyerdavecheney: That's hard to test, hard to debug, hard to make work correctly23:07
davecheneyok, i understand your concerns23:07
davecheneyi will work towards addressing them today23:08
niemeyerdavecheney: Python code base is largely unmanaged.. watchers are very hard to deal with23:08
niemeyerdavecheney: We have code hacks in place for managing the watcher logic that was obtained from trial and error23:09
niemeyerdavecheney: "Oh, hey, yeah.. maybe it's still running"23:09
niemeyerdavecheney: That sucks.. we know better now.. let's keep track of stuff running so we have a handle on them23:09
davecheneyright, because watchers drive twisted callbacks, which might still be firing23:09
niemeyerdavecheney: Exactly23:10
davecheneyso, to conclude, because this has taken a lot of your time23:10
davecheneyyou are happy for me to continue to itterat on this23:10
davecheneyi do worry that the PA is becoming a blocker to having _something_ to get us a golang juju23:11
niemeyerdavecheney: I am very happy with that, and I find that conversation very healthy23:11
niemeyerdavecheney: It is a blocker indeed, but you had to learn about the problems we face23:11
niemeyerdavecheney: and we all have to learn about how to design it properly23:11
niemeyerdavecheney: I suggest small branches, that we can quickly merge/refactor/reject/whatever23:12
andrewsmedinaIm back23:12
niemeyerdavecheney: So that as a side effect of these conversations we move forward steadily, and get unblocked23:12
* davecheney applauds23:12
niemeyerAlright.. I have to go help my wife for a moment.. back later23:13
niemeyerandrewsmedina: Heya23:13
davecheneynw23:13
davecheneythanks for the talk23:13
niemeyerandrewsmedina: Will still be back today, in case you wanna talk23:13
andrewsmedinaniemeyer: ok23:15
andrewsmedinaniemeyer: juju client on centos working fine :D23:26
niemeyerandrewsmedina: Woohay23:33
jimbaker`andrewsmedina, is this the python version of the juju client?23:35
niemeyerI suppose.. the Go version isn't runnable yet23:35
andrewsmedinajimbaker`: in this python version23:39
andrewsmedinaniemeyer: we will work now to do vms create by juju works fine with centos :D23:39
niemeyerandrewsmedina: Sweeet23:40
niemeyerandrewsmedina: How's the PaaS side of things going?23:41
andrewsmedinaniemeyer: the PaaS have a cli and a webserver (rest api) both written in go23:43
davecheneyandrewsmedina: cool23:43
davecheneyand that runs ok on RHEL5 ?23:43
davecheneyi ask because technically 2.6.18 isn't a supported kernel23:44
andrewsmedinadavecheney: it's running on ubuntu at the moment23:44
davecheneyah, ok23:44
andrewsmedinadavecheney: we will use centos 6.23:44
andrewsmedina6.223:44
davecheneyno problems then23:44
davecheney2.6.32 is fine23:44
davecheneygo could be made to run on 2.6.18 easily23:44
andrewsmedinato create machines for projects (django, php, rails) and services (mysql, mongo, elastic search) the webserver calls juju in the backend23:46
andrewsmedinaand with juju we can use openstack or ec2 for IaaS23:46
andrewsmedinawe are using openstack essex23:46
andrewsmedinathis project is opensource https://github.com/timeredbull/tsuru23:47
davecheneyniemeyer: are you still there23:50
davecheneyniemeyer: nm, will be back in 30 mins (breakfast)23:51
niemeyerdavecheney: Here23:51
davecheneywas just looking at the latest changes to environs/interface.go23:52
niemeyerTrying to get that S3 signing stuff working23:52
niemeyerdavecheney: Ok?23:52
davecheneywhat is the signature that Environs.SetConfig() should use23:52
davecheneyshould it take an EnvironConfig ?23:52
davecheneyor just a plain map[string]interface{}23:52
niemeyerdavecheney: Yeah, EnvironConfig23:53
niemeyerdavecheney: So that we force the raw data to go through NewConfig23:53
niemeyerdavecheney: Which validates and processes it into something the environment is happy with23:54
davecheneyok, might have to do some type checking on the way in23:54
niemeyerdavecheney: I think it's fine to assume it's the correct one23:55
niemeyerdavecheney: It will panic if it's not, and that seems fine given it would be a major coding mistake23:55
davecheneyyup23:55
davecheneyok, afk for real this time23:55
niemeyerdavecheney: See ya later23:55

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