Saturday, 2015-02-14

jgriffiththingee: so I can understand people want an easier way to consume all the tricks you can do with extra-specs00:00
jgriffiththingee: but what I don't understand is the value in displaying:00:00
*** jcru has quit IRC00:00
thingeemy use example shows a command being issued to get the capabilities of a particular pool within a backend. None of that information was meant to come off as being hardcoded in the driver. The driver should be asking the backend for that information then pass it back in a structured way.00:00
jgriffiththingee: dude... it's the same thing00:01
jgriffiththingee: driver and backend are synonymous here00:01
jgriffiththingee: I'm not following the point on this00:01
thingeethe driver to me is python code. i.e. the class we define today as a volume driver.00:02
thingeethe backend, is the actual implementation the driver is talking to00:02
jgriffithsure... ok, sorry; to me the driver talks to the backend and that's where it gets its info from so making that distinction didn't make sense00:02
jgriffithbut ok00:02
jgriffithI also still point out that my data structure was 100% the same in that respect00:03
jgriffithso dont' know what the point of that comment was anyway00:03
jgriffithhemna: so I do have one question00:03
*** sigmavirus24_awa is now known as sigmavirus2400:03
jgriffithhemna: you said the "whole point is we want the description"00:04
gary-smithjgriffith: I think hemna bowed out00:04
jgriffithoh... smart guy00:04
jgriffithgary-smith: maybe you can help me understand00:04
gary-smithjgriffith: but yeah, part of the motivation behind this spec was to provide meaningful information on the extra specs00:04
jgriffithhe mentioned somethign like "the whole point is to hvae the description"00:04
jgriffithbut if you look at my version of personal reporting vs the one you guys started with00:04
gary-smithjgriffith: it's description, permitted values, etc.00:04
gary-smithjgriffith: basically what you see in a json schema00:04
jgriffithThe ONLY thing that's missing is "override the hp3par snap stting, title and type00:05
jgriffithwho cares00:05
thingeeit's not json schema. I think we wanted that so other things can understand how to consume it. From your example, it doesn't appear the backend is passing back to Cinder an explanation of what the extra spec and what the value can be.00:05
jgriffiththingee: you don't know what compression is :)00:05
jgriffiththingee: so yeah you're right00:06
jgriffithI didn't put a whole section for HP to document what the call a "persona"00:06
*** sigmavirus24 is now known as sigmavirus24_awa00:06
jgriffithbut honestly I don't think that's appropriate00:06
jgriffithbut I'm obviously in the minority00:06
*** Guest33715 has joined #openstack-cinder00:06
jgriffithso on that note, this particular problem is all yours and HP's00:06
thingeewell the only explanation I got from you is it's messy.00:07
gary-smithjgriffith: the intent was not to reproduce a manual, just to provide a brief description00:07
*** Guest33715 has quit IRC00:07
jgriffithgary-smith: yeah, that's fair00:07
jgriffithok.. well, I took a shot00:07
jgriffithdidn't work out00:07
jgriffithwin some lose some00:07
jgriffithno big deal00:07
jgriffiththingee: thanks for taking a look at it anyway00:08
gary-smithjgriffith: what's going on? what does 'win some lose some' imply?00:09
gary-smithjgriffith: I thought we were getting somewhere00:09
jgriffithgary-smith: oh... sorry, just means sometimes people like your proposal, and sometimes they don't00:09
jgriffithgary-smith: oh... it didn't seem like we were, maybe I missed something00:09
gary-smithjgriffith: I thought yours was fine, but lacked a couple things like possibility of a description, couple others.00:10
gary-smithjgriffith: but I didn't see a way to provide review comments on a gist00:10
jgriffithok, cool00:10
jgriffithLOL00:10
jgriffithwell yeah, that's why I put it up there :)00:10
jgriffithso I couldn't get flamed :)00:11
thingeeI was pretty excited about this... mostly because I have spent a bit of time talking to different users and what they were asking for seemed to align very closely to these bps hp originally set out to do. But I wanted there to be standards as much as possible.00:11
gary-smithjgriffith: that's one way :-)00:11
thingeeI'm not saying no one else here talks to users, but that's what was motivating me.00:12
jgriffiththingee: cool, but I would say in all fairness you did ask for my input00:12
jgriffiththingee: and I still don't know what the whole device vs driver thing was all about00:12
thingeewell all I have to go off your opinion is its messy. and who cares about that information being exposed.00:12
jgriffiththingee: ok00:12
thingeefrom cinder00:13
jgriffiththingee: well.. let's see; should I try and be nice, or just be a jerk00:13
jgriffiththingee: let's try nice for a bit :)00:13
jgriffiththingee: I think I provided more than "it's messy"00:13
jgriffithOne of my concerns with what you proposed as well as what HP proposed00:13
jgriffithis that there's no formal structure to the data00:14
jgriffithin other words, it's pretty much impossible to automate00:14
jgriffithor querie in a meaningful way00:14
jgriffithMy descriptions in that gist I posted actually tried to point that out00:14
jgriffithThere's a known/expected organization for every entry00:15
thingeeI disagree with that. I'll admit the approach I was taking might not work with the scheduler today, but my intentions was the data structure could be constructed by the driver to the scheduler and out through the cinder-api.00:15
thingeeI tried my best to articulate that in my example that's starts off what the driver tells the scheduler, all the way to what the admin sees from the cli...to how the admin would express it in an extra spec.00:16
jgriffithOk, my bad then00:16
jgriffithsorry00:16
jgriffiththingee: look at the end of the day, I was just trying to help out based on your request00:17
jgriffiththingee: you don't like it, or agree with the propsoal that's no problem00:18
jgriffiththingee: you want to modify it, that's fine too00:18
jgriffiththingee: you want to dump it in a river with an anchor around it, that's cool00:18
jgriffiththingee: it really doesn't matter much to me00:19
jgriffithI thought it was well structured and fairly complete, but I wrote it, so of course I would think that :)00:19
*** thingee has quit IRC00:21
jgriffithgary-smith: BTW, if description is the only real hang up, that could just be added as a single standard key in the capabilities key00:21
gary-smithjgriffith: it would also be nice to be able to specify the type and possible ranges00:21
jgriffithgary-smith: yeah, I'm not a fan but that's cool00:22
jgriffithgary-smith: I just think sometimes too much information is worse than too little, there's a balance IMO00:23
gary-smithjgriffith: i.e. is it expecting a number, a boolean, etc. I guess your spec handled boolean with an enum of ['true', 'false'], that could work, too00:23
gary-smithjgriffith: do you mean too much information for the user?00:24
jgriffithwell.. admin user00:24
gary-smithjgriffith: yes, of course00:24
jgriffithend user is a whole diff thing but we're not displaying any of this to them00:24
gary-smithjgriffith: right, they just see vol types00:24
gary-smithjgriffith: for things like ranges, you don't necessarily need to display them to the admin user, but including them in the structure has value, ...00:25
gary-smithjgriffith: such as being able to programatically validate against them00:25
jgriffithI can see that00:25
jgriffithgary-smith: for like personas though, it just seemed kinda silly/redundant to list out options "Generic", "AIX" etc00:26
jgriffithand then say "hey.. by the way these are strings"... "duhhhh"00:26
gary-smithjgriffith: obviously 'string' would be the default and would need to be specified00:27
jgriffithbut man was I wrong!00:27
jgriffithPissed of Walt and Mike both at the same time00:27
jgriffithhey... that's like some kinda record for me I think00:27
gary-smithjgriffith: for personas, those values (Generic, etc.) are the actual values that have to be entered by the admin in the extra spec00:27
jgriffithgary-smith: right, that's why I put them there that way00:27
jgriffithgary-smith: so an automated example:  'persona':'options'[4]00:28
gary-smithjgriffith: sorry, misread your statement. it's redundant to list them and also say type='string'. agreed00:28
jgriffitherr... I left out the "persona="00:28
*** patrickeast has joined #openstack-cinder00:31
gary-smithjgriffith: so your gist isn't dramatically different than what we were proposing except for leaving out a few key/values (like title, namespace, etc) most of which we could live without00:31
jgriffithgary-smith: yeah, I actually thought it would be a bit more well accdepted :)00:32
jgriffithmostly because it is closer to what you initially proposed00:32
gary-smithjgriffith: but one thing we did have is that the structure was the same as the jsonschema spec, which permits us to programatically validate extra specs against it00:32
jgriffithand took some of the things we talked about in Austin00:32
*** vilobhmm_ has quit IRC00:32
jgriffithgary-smith: not sure... what do you mean same as jsonschema spec?00:33
gary-smithjgriffith: http://json-schema.org/ is a standard way to describe how json data is supposed to look00:34
jgriffithgary-smith: oh!!00:34
jgriffiththat00:34
jgriffithsorry00:34
jgriffithderp00:34
gary-smithjgriffith: and extra_specs are basically in a json format00:34
jgriffithOh, certainly if the schema is busted that should be fixed00:34
*** hodos|2 has quit IRC00:34
openstackgerritTomoki Sekiyama proposed openstack/cinder: Ensure initialize_connection in targets pass multipath parameter  https://review.openstack.org/15593300:34
jgriffithI mean if it's busted in my version, it should be fixed00:34
jgriffithgary-smith: so to be fair I just threw that together this afternoon real quick00:35
gary-smithjgriffith: fair enough00:35
gary-smithjgriffith: would you consider putting it up as a alternative bp to consider/debate/refine ?00:35
gary-smithjgriffith: spec, I mean00:35
jgriffithgary-smith: what are you trying to get me killed!00:36
gary-smithjgriffith: LOL00:36
jgriffithI think it's obvious the PTL took things the wrong way already00:36
jgriffithand hemna left too00:36
jgriffithso I think I'm just going to leave it to you and Mike to figure out what you want at this point00:37
jgriffithgary-smith: feel free to take anything from that that you like00:37
jgriffithgary-smith: and if you don't like any of it, well that's ok too00:37
gary-smithjgriffith: ok. So you're not gonna -2 anything that contains a brief description then?00:37
jgriffithgary-smith: I might make suggestions :)00:38
jgriffithgary-smith: so honestly I am trying not to -2 anything any more00:38
gary-smithjgriffith: fair enough00:38
jgriffithgary-smith: been getting a good bit of heat from folks for being "too negative"00:38
jgriffithgary-smith: so I would ask that we have a consistent structure of keys that's easy to automate00:39
gary-smithjgriffith: agreed.00:39
jgriffithgary-smith: and if you need descriptions, fair enough, but brief would be awesome, and consistency in how they're presented00:39
gary-smithjgriffith: i did have one question on your gist00:39
jgriffithsure00:40
gary-smiththere doesn't seem to be much of a diff between a base_key and a well_defined capability.00:40
gary-smithwhat is the difference?00:40
jgriffithgary-smith: so I struggled with that piece.... the distinction in my mind was somethign like this:00:40
jgriffithbase_key is stuff that is just reported00:41
jgriffithlike "capacity"00:41
jgriffithit's a value the device reports00:41
jgriffithit has nothing to do with a capability option00:41
jgriffiththe well-defined keys are meant to be things that you can set to "modify" or "expose" unique behaviors or options on a device00:41
gary-smithwhere would qos_supported be? I think it's in that realm of base keys now00:42
gary-smithdoh!00:42
gary-smithi see, you put it in capabilities00:42
jgriffithyeah, see to me it's not00:42
gary-smithgot it00:42
jgriffithright.. because it's no matter what it's still a "feature"00:42
jgriffithhaving a "name" isn't a feature, it's a flat out requirement00:43
jgriffithand there are no options associated with it00:43
gary-smithand thus would never show up in an extra_spec, either, right?00:43
jgriffiththings in base-keys are things that I don't think are optional or have options associated with them00:43
jgriffithgary-smith: EXACTLY!!00:43
jgriffithyes00:43
gary-smiththat's a reasonable distinction00:44
jgriffiththat's why I put that note about the name "base_key"00:44
jgriffithit's not a very descriptive label00:45
gary-smithyeah, naming is so hard to get right00:45
*** bill_az has quit IRC00:46
gary-smithone extra wrinkle, though, is that the filter scheduler currently compares extra specs with all values it finds under 'capabilities'. I guess it would have to also look under 'base_keys'..00:47
*** patrickeast has quit IRC00:47
gary-smithor figure out another way to incorporate 'base_keys' into the 'capabilities' section00:47
jgriffithgary-smith: yeah, that's what I intended at any rate00:47
jgriffithgary-smith: I looked at the code and it's pretty easy to change it up00:47
jgriffithgary-smith: ya know the other thing is we could work it the other way00:48
gary-smithyeah, the filter scheduler is simple, but...00:48
jgriffithleave the existing stuff and have a seperate "new" structure for the new stuff00:48
*** patrickeast has joined #openstack-cinder00:48
jgriffithand later add that to filter sched if we want00:48
jgriffithdunno00:48
jgriffithI think it's easy to solve though00:49
gary-smiththat might work, might have to thing that thruogh00:49
gary-smithI'd be perfectly happy to have all of this extra info (enums, types, etc.) in a separate structure, too00:50
jgriffithgary-smith: yeah, it just can get weird figuring out where that is, but maybe we just go with the idea of the extra-specs vs other00:51
jgriffiththat's actually pretty reasonable I think00:51
*** markvoelker has joined #openstack-cinder00:52
gary-smithyup00:54
jgriffithgary-smith: well, if you want to collaborate on this more I'm happy to work with you on it00:55
jgriffithfor now though, I think I'm going to go home; last thing I need to do is make someone at home mad too :)00:55
gary-smith:-) me too. Have a good weekend00:56
jgriffithyou too, catch ya later00:56
*** markvoelker has quit IRC00:57
*** sgotliv has quit IRC00:57
anishjgriffith: got a sec ? need an expert opinion on something00:58
*** tsekiyam_ has joined #openstack-cinder01:01
*** mtanino has quit IRC01:03
*** patrickeast has quit IRC01:04
*** tsekiyama has quit IRC01:04
*** tsekiyam_ has quit IRC01:06
*** rmesta has quit IRC01:10
*** markvoelker has joined #openstack-cinder01:10
*** diegows has quit IRC01:12
*** Mandell has quit IRC01:12
*** markvoelker has quit IRC01:17
*** Mandell has joined #openstack-cinder01:18
*** david-lyle has joined #openstack-cinder01:32
*** david-lyle is now known as david-lyle_afk01:33
*** Mandell has quit IRC01:41
*** scottda_ has joined #openstack-cinder01:42
*** scottda_ has quit IRC01:43
*** Lee1092 has joined #openstack-cinder01:44
*** Mandell has joined #openstack-cinder01:46
*** diegows has joined #openstack-cinder01:46
*** diegows has quit IRC01:46
*** leeantho has quit IRC01:50
*** Computer_Czar has quit IRC01:54
*** _cjones_ has quit IRC01:57
*** Mandell has quit IRC01:58
*** Apoorva_ has quit IRC02:01
*** Apoorva has joined #openstack-cinder02:02
*** ndipanoff has quit IRC02:03
*** emagana has quit IRC02:11
*** emagana has joined #openstack-cinder02:12
*** zzzeek has quit IRC02:13
anishsmcginnis: whoops. saw your comment earlier, but completely forgot about it in a dumb comment02:13
*** markvoelker has joined #openstack-cinder02:14
*** emagana has quit IRC02:16
*** markvoelker has quit IRC02:22
openstackgerritAnish Bhatt proposed openstack/cinder: Add support for chiscsi iscsi helper  https://review.openstack.org/14775802:25
openstackgerritAnish Bhatt proposed openstack/cinder: Improve error handling in Targets refactoring  https://review.openstack.org/15471302:28
anishsmcginnis: thanks for the clarification, I was thoroughly confused :)02:35
*** theanalyst has quit IRC02:38
*** theanalyst has joined #openstack-cinder02:42
*** zzzeek has joined #openstack-cinder02:44
*** zzzeek has quit IRC02:49
*** sigmavirus24_awa is now known as sigmavirus2402:55
*** mberlin has joined #openstack-cinder02:56
*** kaisers1 has joined #openstack-cinder02:56
*** mberlin1 has quit IRC02:58
*** kaisers has quit IRC02:59
*** mriedem1 has joined #openstack-cinder03:02
*** mriedem has quit IRC03:02
*** sigmavirus24 is now known as sigmavirus24_awa03:12
*** jdurgin has quit IRC03:15
*** Apoorva_ has joined #openstack-cinder03:15
*** Apoorva has quit IRC03:18
*** markvoelker has joined #openstack-cinder03:18
*** Apoorva_ has quit IRC03:20
*** markvoelker has quit IRC03:23
*** Longgeek has joined #openstack-cinder03:31
*** markvoelker has joined #openstack-cinder03:36
*** harlowja_at_home has joined #openstack-cinder03:39
*** wanghao has quit IRC03:41
*** wanghao has joined #openstack-cinder03:42
*** Lee1092 has quit IRC03:50
*** harlowja_ is now known as harlowja_away03:51
*** zzzeek has joined #openstack-cinder04:21
*** zzzeek has quit IRC04:22
*** kfox1111 has quit IRC04:24
*** harlowja_at_home has quit IRC04:27
openstackgerritSasikanth Eda proposed openstack/cinder: Volume Replication support - GPFS Synchronous mirroring  https://review.openstack.org/15391804:28
*** mriedem has joined #openstack-cinder04:28
*** mriedem1 has quit IRC04:31
*** Longgeek has quit IRC04:35
*** Longgeek has joined #openstack-cinder04:35
*** Longgeek has quit IRC04:35
*** jcru has joined #openstack-cinder05:01
*** jcru has quit IRC05:19
*** Longgeek has joined #openstack-cinder05:51
openstackgerritOpenStack Proposal Bot proposed openstack/cinder: Imported Translations from Transifex  https://review.openstack.org/15240106:06
*** Longgeek has quit IRC06:25
*** jseiler_ has quit IRC07:03
*** jseiler_ has joined #openstack-cinder07:04
*** Swanson has quit IRC07:07
*** Swanson has joined #openstack-cinder07:08
*** markvoelker has quit IRC07:11
*** dansmith has quit IRC07:15
*** bswartz has quit IRC07:18
*** jseiler__ has joined #openstack-cinder07:19
*** dansmith has joined #openstack-cinder07:20
*** dansmith is now known as Guest5907607:21
*** Longgeek has joined #openstack-cinder07:21
*** e0ne has joined #openstack-cinder07:23
*** smcginni1 has joined #openstack-cinder07:24
*** med_` has joined #openstack-cinder07:27
*** jseiler_ has quit IRC07:28
*** kaisers1 has quit IRC07:28
*** liusheng has quit IRC07:28
*** med_ has quit IRC07:28
*** afazekas has quit IRC07:28
*** rwsu has quit IRC07:28
*** smcginnis has quit IRC07:28
*** kbyrne has quit IRC07:28
*** liusheng has joined #openstack-cinder07:28
*** rwsu has joined #openstack-cinder07:32
openstackgerritQiangGuan proposed openstack/cinder: Remove useless storage_availability_zone import  https://review.openstack.org/15393207:34
*** bswartz has joined #openstack-cinder07:34
*** afazekas has joined #openstack-cinder07:35
*** kaisers1 has joined #openstack-cinder07:35
*** kbyrne has joined #openstack-cinder07:35
*** kbyrne has quit IRC07:36
*** kbyrne has joined #openstack-cinder07:37
*** markvoelker has joined #openstack-cinder07:42
*** markvoelker has quit IRC07:46
*** Mandell has joined #openstack-cinder07:50
*** Longgeek has quit IRC07:55
*** e0ne has quit IRC08:10
*** lpetrut has joined #openstack-cinder08:14
*** ronis_ has joined #openstack-cinder08:18
*** Mandell has quit IRC08:30
*** markvoelker has joined #openstack-cinder08:42
*** rwsu has quit IRC08:46
*** markvoelker has quit IRC08:48
*** Lee1092 has joined #openstack-cinder09:29
*** markvoelker has joined #openstack-cinder09:44
*** sileht has quit IRC09:49
*** markvoelker has quit IRC09:50
*** markvoelker has joined #openstack-cinder10:45
*** markvoelker has quit IRC10:50
openstackgerritwuyuting proposed openstack/cinder: Tenant can't set readonly metadata to True  https://review.openstack.org/15566811:11
*** arif-ali has quit IRC11:24
*** Tross1 has quit IRC11:33
*** Tross has joined #openstack-cinder11:33
*** kazzazi has joined #openstack-cinder11:37
openstackgerritwuyuting proposed openstack/cinder: Admin extends tenant's volume but change admin's quota  https://review.openstack.org/15560711:44
*** markvoelker has joined #openstack-cinder11:46
*** markvoelker has quit IRC11:51
*** bkopilov has quit IRC12:19
*** Mandell has joined #openstack-cinder12:30
*** Mandell has quit IRC12:35
*** kazzazi is now known as kazazi12:41
*** markvoelker has joined #openstack-cinder12:48
*** markvoelker has quit IRC12:53
*** xyang1 has quit IRC13:06
*** IanGovett has joined #openstack-cinder13:32
*** ronis_ has quit IRC13:41
*** e0ne has joined #openstack-cinder13:41
*** IanGovett has quit IRC13:44
*** markvoelker has joined #openstack-cinder13:49
*** markvoelker has quit IRC13:53
*** e0ne has quit IRC13:55
*** kazazi has quit IRC14:14
*** lpetrut has quit IRC14:35
*** sileht has joined #openstack-cinder14:35
*** Tross has quit IRC14:47
*** Tross1 has joined #openstack-cinder14:47
*** markvoelker has joined #openstack-cinder14:50
*** ronis_ has joined #openstack-cinder14:50
*** markvoelker has quit IRC14:54
*** vmtyler has joined #openstack-cinder14:55
*** lpetrut has joined #openstack-cinder15:20
*** mriedem1 has joined #openstack-cinder15:31
*** mriedem has quit IRC15:32
openstackgerritJohn Griffith proposed openstack/cinder: Remove the deactivate retry  https://review.openstack.org/15598115:48
*** markvoelker has joined #openstack-cinder15:51
*** markvoelker has quit IRC15:56
*** adb5a56 is now known as tries16:08
*** tries has joined #openstack-cinder16:08
*** paul-- has quit IRC16:25
*** mriedem1 has quit IRC16:27
*** mriedem has joined #openstack-cinder16:28
*** paul-- has joined #openstack-cinder16:31
*** hemna_ has joined #openstack-cinder16:31
*** jungleboyj has quit IRC16:35
*** markvoelker has joined #openstack-cinder16:52
*** scottda_ has joined #openstack-cinder16:56
*** scottda_ has quit IRC16:56
*** markvoelker has quit IRC16:56
*** jungleboyj has joined #openstack-cinder17:10
*** xyang has joined #openstack-cinder17:17
*** jungleboyj has quit IRC17:20
*** hemna_ has quit IRC17:29
*** markvoelker has joined #openstack-cinder17:53
*** markvoelker has quit IRC17:58
*** e0ne has joined #openstack-cinder18:34
*** e0ne has quit IRC18:52
*** markvoelker has joined #openstack-cinder18:54
*** markvoelker has quit IRC19:01
*** bkopilov has joined #openstack-cinder19:16
*** emagana has joined #openstack-cinder19:24
*** sgotliv has joined #openstack-cinder19:35
*** sgotliv has quit IRC19:36
*** sgotliv has joined #openstack-cinder19:36
*** jdurgin1 has quit IRC19:37
*** Lee1092 has quit IRC19:40
*** sgotliv has quit IRC19:42
*** MasterPiece has joined #openstack-cinder19:50
*** markvoelker has joined #openstack-cinder19:57
*** markvoelker has quit IRC20:04
*** Mandell has joined #openstack-cinder20:07
*** lpetrut has quit IRC20:08
*** sgotliv has joined #openstack-cinder20:11
*** lpetrut has joined #openstack-cinder20:12
*** rushil has quit IRC20:17
*** MasterPiece has quit IRC20:21
*** markvoelker has joined #openstack-cinder21:01
*** markvoelker has quit IRC21:06
*** theanalyst has quit IRC21:21
*** ebalduf has joined #openstack-cinder21:22
*** theanalyst has joined #openstack-cinder21:24
*** Mandell has quit IRC21:28
*** markvoelker has joined #openstack-cinder22:02
*** lpetrut has quit IRC22:05
*** markvoelker has quit IRC22:06
*** cppforlife_ has quit IRC22:24
*** e0ne has joined #openstack-cinder22:26
*** ebalduf has quit IRC22:27
*** cppforlife_ has joined #openstack-cinder22:45
*** e0ne has quit IRC22:49
*** ronis_ has quit IRC22:52
*** markvoelker has joined #openstack-cinder23:03
*** markvoelker has quit IRC23:08
*** theanalyst has quit IRC23:23
*** Mandell has joined #openstack-cinder23:27
*** theanalyst has joined #openstack-cinder23:27
*** ebalduf has joined #openstack-cinder23:28
*** ebalduf has quit IRC23:34

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