<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=gb2312"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:SimSun;
        mso-fareast-language:ZH-CN;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:SimSun;
        mso-fareast-language:ZH-CN;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";
        mso-fareast-language:ZH-CN;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:SimSun;
        mso-fareast-language:ZH-CN;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";
        mso-fareast-language:ZH-CN;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:722027672;
        mso-list-template-ids:2101923884;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1
        {mso-list-id:1803229357;
        mso-list-type:hybrid;
        mso-list-template-ids:-82511010 664296114 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>There is some misunderstandings going on in this thread (nothing unusual here</span><span style='font-size:11.0pt;font-family:Wingdings;color:#1F497D'>J</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>), but since we have some code to play with, let’s use this to be more specific by what we mean.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Looking at the code that Eugene sent, I’m a bit confused, because we seem to be talking now not only about an “LB” scheduler, but a scheduler framework for all service types (LB, firewall, etc.).<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:.5in'>get_device_for_resource(resource)<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'>    return scheduling_drivers[<span style='color:red'>resource.service_type</span>].get_device_for_resource(resource)<o:p></o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal>      device_info = get_device_for_resource(resource)<o:p></o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>It seems that for each service_type, we suggest having a “scheduler”, which is  confusingly called "scheduling_driver" (I imagine this has nothing to do with the vendor-specific LB drivers, right?). <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>So, if a service type contains service definitions for LB and Firewall, we will have the same “scheduler_driver”?<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Even if I assume that my service type has been created so it only contains one “LB” service definition (and no other service definitions), and therefore it will nicely map to a scheduler that only does “LB” scheduling like the one included<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal>class LBScheduler:<o:p></o:p></p><p class=MsoNormal>  device_handlers = [list of classes for each device type, which can match VIP requirements to device caps and status]<o:p></o:p></p><p class=MsoNormal>  get_device_for_vip(vip)<o:p></o:p></p><p class=MsoNormal>   for device in devices: <o:p></o:p></p><p class=MsoNormal>      if <span style='color:red'>device_handlers[device.type].</span>is_good(device, vip):<o:p></o:p></p><p class=MsoNormal>         return device<o:p></o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>In the above code, the method get_device_for _vip(),<i> </i>uses a concept of “device_handler” for each “device type” (driver). Isn’t this device_handler(), vendor-specific code?  <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If the above assumption is correct, then the vendor *<b>is</b>* actually taking part in the scheduling decision, which is already an improvement on the previous proposal.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>But does it mean we are suggesting to have vendor-specific code scattered in several places, some of it in the scheduler, some of it in the agent/driver? I don’t like this. I thought that the LB plugin should be completely vendor-agnostic, and all vendor-specific code should be grouped in the agent/driver component.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Youcef<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><a name="_MailEndCompose"><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></a></p><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Eugene Nikanorov [mailto:enikanorov@mirantis.com] <br><b>Sent:</b> Tuesday, December 4, 2012 5:08 AM<br><b>To:</b> OpenStack Development Mailing List<br><b>Subject:</b> Re: [openstack-dev] [Quantum][LBaaS] Selecting an LBaaS device given a service type<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hi Salvatore,<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Thanks for detailed reply.<o:p></o:p></p></div><div><p class=MsoNormal>I'm going to explain my idea in more detain with pseudocode.<o:p></o:p></p></div><div><p class=MsoNormal style='margin-bottom:12.0pt'>See my comments inline.<o:p></o:p></p><div><p class=MsoNormal>On Tue, Dec 4, 2012 at 2:52 PM, Salvatore Orlando <<a href="mailto:sorlando@nicira.com" target="_blank">sorlando@nicira.com</a>> wrote:<o:p></o:p></p><div><p class=MsoNormal><span style='color:#663366'>My only remark is that in my opinion having a 'global' LB scheduler that will work across all drivers is definitely valuable, but probably not necessary. If I were to set the priority of this feature, I would put it on "wishlist" for Grizzly. And this for the several reasons:</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='color:#663366'>- as already said in this thread, it is not easy to model features and device capabilities in an agnostic way.</span><o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Capabilities are not device-agnostic, for sure. <o:p></o:p></p></div><div><p class=MsoNormal>Some part of device database model is common and generic, and some may be stored in "extra" fields which are used by device-specific code. <o:p></o:p></p></div><div><p class=MsoNormal>I'm trying to design scheduler as extensible device-agnostic (and, in fact, service-type-agnostic)  framework, where we will implement scheduling logic for LB and, going deeper, some device-specific aspects of LB scheduling. <o:p></o:p></p></div><div><p class=MsoNormal>Once again, I think that LB scheduling algorithm should be generic and also, configurable (e.g. you may write your own algorithm and make scheduler use it).<o:p></o:p></p></div><div><p class=MsoNormal>This, first of all, framework will allow us to make some stub like scheduling on first available device, e.g., something like this:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>get_device_for_vip(vip)<o:p></o:p></p></div><div><p class=MsoNormal>   for device in devices: <o:p></o:p></p></div><div><p class=MsoNormal>      if is_good(device, vip):<o:p></o:p></p></div><div><p class=MsoNormal>         return device<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>When I say, service type and device agnostic framework, I mean that all logic is hidden by just a few generic calls like the following:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>device_info = get_device_for_resource(resource)<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>which could be implemented as:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>get_device_for_resource(resource)<o:p></o:p></p></div><div><p class=MsoNormal>    return scheduling_drivers[resource.service_type].get_device_for_resource(resource)<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>In turn, scheduling_driver.get_device_for_resource(resource) may be our LB scheduling:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>class LBScheduler:<o:p></o:p></p></div><div><p class=MsoNormal>  device_handlers = [list of classes for each device type, which can match VIP requirements to device caps and status]<o:p></o:p></p></div><div><p class=MsoNormal>  get_device_for_vip(vip)<o:p></o:p></p></div><div><p class=MsoNormal>   for device in devices: <o:p></o:p></p></div><div><p class=MsoNormal>      if device_handlers[device.type].is_good(device, vip):<o:p></o:p></p></div><div><p class=MsoNormal>         return device<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>You may notice that scheduler component itself is quite thin layer which serves several purposes:<o:p></o:p></p></div><div><p class=MsoNormal>1) extensible and configurable: <o:p></o:p></p></div><div><p class=MsoNormal>    - you add service types like you add plugins to quantum<o:p></o:p></p></div><div><p class=MsoNormal>    - you add drivers to let generic algorithm have better understanding of particular device of particular type.<o:p></o:p></p></div><div><p class=MsoNormal>2) synchronous. Choosing device is one fast synch. operation.<o:p></o:p></p></div><div><p class=MsoNormal>3) The code itself is just routing resource to corresponding logic.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>I think these are both good features and easy to implement. <o:p></o:p></p></div><div><p class=MsoNormal>That may save lots of refactoring and redesigning when it'll come to other advanced services.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><span style='color:#663366'>- drivers apparently will be more than a simple "actuator", but will have their own logic. I can see for instance at least three different drivers families: i) hardware load balancers, ii) contextualized hardware load balancers (hw appliances where you create virtual LB appliances), and iii) virtualized load balancers, that could be spawn, for instance, using nova. What would be the criteria for choosing a virtual appliance versus allocating a VIP on a hardware one?</span><o:p></o:p></p></div></blockquote><div><p class=MsoNormal>That's what I'm trying to avoid: some drivers will be "simple actuators", some will have their own logic. <o:p></o:p></p></div><div><p class=MsoNormal>Regarding the question about criteria: good question :) But it, in my opinion, a bit unrelated to the scheduling architecture, e.g. it is actual whichever choice we make.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><span style='color:#663366'>- In this Grizzly release we won't probably have a huge amount of drivers. Or probably we'll have the drivers, but Quantum LB service, being experimental, will probably be deployed with no more than one or two drivers.</span><o:p></o:p></p></div></blockquote><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><span style='color:#663366'>Another interesting point in my opinion is that this scheduling logic is part of the LB plugin we're implementing for Grizzly, not part of the DB model supporting the tenant API. There will be, of course, model classes for device management, but they (and all the logic for managing them) should be separate from the modules which implement the API.</span><o:p></o:p></p></div></blockquote><div><p class=MsoNormal>That's for sure. In fact we've currently thinking of scheduling and device management as separate mandatory plugin which will provide it's functionality to other advanced service plugins.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><span style='color:#663366'>My argument here is not that we should not have a global scheduler; I'm just saying I have the impression that there are some important details which are not yet completely fleshed out.</span><o:p></o:p></p></div></blockquote><div><p class=MsoNormal> I understand that, and i just want to make this details affect particular code (drivers, algorithms), but not whole architecture.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><span style='color:#663366'>Nevertheless, driver-level scheduling is valuable too, and probably easier to implement. I wouldn't disregard, in the long run, having a two-step process:</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='color:#663366'>Step 1 - Quantum LB plugin schedules drivers according either to service_type required by the user or request features</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='color:#663366'>Step 2 - Driver selects device according to capabilities</span><o:p></o:p></p></div></blockquote><div><p class=MsoNormal>Questions here:<o:p></o:p></p></div><div><p class=MsoNormal>1) If driver selects device, is it mandatory for all drivers to provide such functionality?<o:p></o:p></p></div><div><p class=MsoNormal>2) Where device database is stored? <o:p></o:p></p></div><div><p class=MsoNormal>If it is mandatory for driver to be able to select a device, should device database be driver-specific, e.g. each driver has it's own?<o:p></o:p></p></div><div><p class=MsoNormal>Will drivers access single database remotely? Remember we decided that drivers run within agent, and there could be several agents running. Driver of which agent instance should be responsible for scheduling?<o:p></o:p></p></div><div><p class=MsoNormal>If it's not mandatory for driver, then some scheduling logic will be in generic scheduler, some in drivers.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>In fact, any option of above brings tons of coding and testing complexity when we start to answer these questions.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>> <span style='font-size:11.5pt;font-family:"Calibri","sans-serif";color:#1F497D'>but to Sam’s point, a common scheduler might not have enough visibility or understanding of device specifics/limitations in order to “correctly” pick the right device. </span><o:p></o:p></p></div></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Saying this you assume that driver has such understanding, and even that might not be the case.</span><o:p></o:p></p></div></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div></div><div><p class=MsoNormal>This boils down to defining what a driver is. If it has to be a simple "actuator" (I don't remember the name it had in Atlas), then it makes perfectly sense to do the scheduling in the service, as the driver just executes the LB operation.<o:p></o:p></p></div></div></div></blockquote><div><p class=MsoNormal>In fact, we decided that once, that driver is simple and synchronous that maps generic LB model to device-specific. <o:p></o:p></p></div><div><p class=MsoNormal>But by saying that "driver may not have understanding" I mean that in some cases we need an extended status of the device to know its "rating" in scheduling. Example: N of deployed VIPs (may be hard to find out for the driver), current connections, preconfigured device limits; some of these could be got from device, some are known at device DB.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>In fact, in order to avoid that, scheduler should contain:</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>1) all necessary logic to make a decision (logic may be device-specific, e.g. different for different kinds of devices, or even different instances of the same device type). In that case scheduling becomes simple fast operation: read data from DB - make choice - write to DB.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>2) active device monitoring: that is needed for "visibility and understanding", it can be device-specific. It is performed by scheduler using it's device database and using device-specific code from the drivers (but code is running under scheduler process or plugin).</span><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>The idea behind such scheme is the same as scheduling in nova. Unlike nova we don't have devices reporting their status to the scheduler, so we need to poll them proactively.</span><o:p></o:p></p></div></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div></div><div><p class=MsoNormal><span style='color:#663366'>I am not sure I agree on this statement. Scheduling in nova is a decision which takes into account a limited set of capabilities, and then picks the first node with enough resources. It does not select the "best" one - though I concede you can just replace the scheduling algorithm with another that select the best node. However, it assumes all nodes are identical. Instead here we're not distinguishing only on capabilities but also on features. And the concept of capability too might be quite different across drivers.</span><o:p></o:p></p></div></div></div></blockquote><div><p class=MsoNormal>Scheduling in nova is done by scheduling drivers (which in that context means pluggable scheduling algorithms), you know. There is "chance" driver that picks host randomly, there is "least_cost" driver that looks into node's load and status and applies more complex algorithm to make a decision. <o:p></o:p></p></div><div><p class=MsoNormal>That is exactly what I'd like to see in our scheduler. Make framework that will allow primitive implementation while leaving door open to more complex ones. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><div><p class=MsoNormal>However, it's probably down to me not understanding how you are planning to design this scheduler. For instance how it would select between creating a VIP on a physical load balancer, or spanning a virtual appliance and create the VIP on it? <o:p></o:p></p></div></div></div></blockquote><div><p class=MsoNormal> It's a good question. Regarding this particular choice: my idea is that scheduler doesn't make such decision at all. <o:p></o:p></p></div><div><p class=MsoNormal>It doesn't operate on yet non-existing devices. In order to insert VM LB into consideration, user needs to launch it and register as a device. <o:p></o:p></p></div><div><p class=MsoNormal>You may argue that it is additional actions user will need to take. But what is on other hand? <o:p></o:p></p></div><div><p class=MsoNormal>If we let scheduler to make such decision, that it should also be capable of doing the following: <o:p></o:p></p></div><div><p class=MsoNormal>- consider if there is already a VM LB in tenant's network that may be used<o:p></o:p></p></div><div><p class=MsoNormal>- spawn an instance of VM LB (tenant should also provide image id to do so, it should also has its reflection in tenant API, which we don't have at the moment)<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Second point alone has two disadvantages:<o:p></o:p></p></div><div><p class=MsoNormal>- scheduling can't be synchronous operation. That will affect whole architecture, complicating it.<o:p></o:p></p></div><div><p class=MsoNormal>- user will need to pass some device-management-specific info (image id) to device-management unaware Tenant API.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Sorry for the long email, you're probably tired of reading it :)<o:p></o:p></p></div><div><p class=MsoNormal>But I think this is important discussion and worth covering in upcoming LBaaS meetings; may be it's worth to setup a meeting on irc for that topic specifically.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal>Eugene.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><div><div><div><p class=MsoNormal> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>What do you think?</span><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Thanks,</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Eugene.</span><o:p></o:p></p></div><div><div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><div><p class=MsoNormal>On Fri, Nov 30, 2012 at 7:45 PM, Ilya Shakhat <<a href="mailto:ishakhat@mirantis.com" target="_blank">ishakhat@mirantis.com</a>> wrote:<o:p></o:p></p><p class=MsoNormal>Sam, Youcef, <o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Your point makes sense. I tried to make "scheduler" common, but it really looks like driver should participate in decision making. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal>Ilya<o:p></o:p></p></div><div><div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>2012/11/30 Samuel Bercovici <<a href="mailto:SamuelB@radware.com" target="_blank">SamuelB@radware.com</a>><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Ilya,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I concur with Youcef.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-Sam.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Youcef Laribi [mailto:<a href="mailto:Youcef.Laribi@eu.citrix.com" target="_blank">Youcef.Laribi@eu.citrix.com</a>] <br><b>Sent:</b> Friday, November 30, 2012 3:57 AM</span><o:p></o:p></p><div><div><p class=MsoNormal><br><b>To:</b> OpenStack Development Mailing List<br><b>Subject:</b> Re: [openstack-dev] [Quantum][LBaaS] Selecting an LBaaS device given a service type<o:p></o:p></p></div></div></div></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Ilya,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Let’s first separate device on-boarding and management from the “scheduler” discussion. These are separate functions in the system, and we’ll keep scheduler as the component that picks the driver/device (and we can argue separately and decide whether this is a common component to all vendors or a vendor-specific component, whether it resides in the plugin or in the driver, etc.).</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Now to come back to the scheduler discussion, it might seem that a scheduler can be common to all drivers would work fine, but to Sam’s point, a common scheduler might not have enough visibility or understanding of device specifics/limitations in order to “correctly” pick the right device. For example, some vendors have a limit of vlans per interface, or cannot support overlapping IPs, other vendor devices are meshed together in a cluster or a pool and there are optimal ways to distribute VIPs or networks in those setups, that a common scheduler wouldn’t understand. That’s why I previously said that the scheduler (“placement component”) should pick the driver, and let the driver pick a specific device, that way each vendor is responsible for their own allocation strategy on their devices.   Or at least the driver should have an input into the scheduler decision, so the scheduler doesn’t pick the wrong device.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>On the admin/operator APIs used for device on-boarding and management, we need to initiate a separate thread, and discuss whether this be implemented as a separate plugin than the LBaaS plugin, or we extend the LBaaS plugin to also support a provider/admin API? And what is the role of LBaaS agent/driver in the device on-boarding process.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Youcef </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                                                                                                                                                                                             </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Ilya Shakhat [<a href="mailto:ishakhat@mirantis.com" target="_blank">mailto:ishakhat@mirantis.com</a>] <br><b>Sent:</b> Thursday, November 29, 2012 7:34 AM<br><b>To:</b> OpenStack Development Mailing List<br><b>Subject:</b> Re: [openstack-dev] [Quantum][LBaaS] Selecting an LBaaS device given a service type</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Just a small summary of our discussion. We have the following<span style='font-family:"Times New Roman","serif"'> </span>components:<o:p></o:p></p><div><div><ul type=disc><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'><span style='font-family:"Times New Roman","serif"'> </span>*aaS plugins - do the logic related to services. Plugins know service data model only and don't hold information about devices. When Plugin needs to deploy any changes, it calls Scheduler.<o:p></o:p></li><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'>Scheduler ("placement component") - binds services to devices. It has API to manage devices (similar to provider api in old LBaaS). Scheduler knows how to find device by service_type and has DB to store them. When it gets request from Plugin, it finds corresponding device and forwards request to Agent<o:p></o:p></li><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'>Agent - dispatches commands to drivers. Agent holds collection of drivers and knows how to dispatch message to them<o:p></o:p></li><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'>Drivers - translate service model to device-specific.<o:p></o:p></li></ul><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Both Scheduler and Agent are common for all types of services. The logic related to load balancing is implemented as drivers.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Please see<span style='font-family:"Times New Roman","serif"'> </span><a href="http://wiki.openstack.org/Quantum/LBaaS/Architecture/Scheduler" target="_blank">http://wiki.openstack.org/Quantum/LBaaS/Architecture/Scheduler</a> for details on how components interact and what the typical workflow will be. Comments are welcome :)<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Ilya<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>2012/11/28 Eugene Nikanorov <<a href="mailto:enikanorov@mirantis.com" target="_blank">enikanorov@mirantis.com</a>><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi Youcef,<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'>Please see my comments inline.<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Wed, Nov 28, 2012 at 2:14 AM, Youcef Laribi <<a href="mailto:Youcef.Laribi@eu.citrix.com" target="_blank">Youcef.Laribi@eu.citrix.com</a>> wrote:<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Changing the subject line (was: Progress on lbaas-plugin-api-crud)…</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Eugene,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Let’s make sure we agree on the assumptions:</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif";color:#1F497D'>          </span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>LBaaS Plugin has a set of drivers (vendor-specific).  Drivers run in the LBaaS agent process.</span><o:p></o:p></p></div></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif";color:#1F497D'>          </span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Each driver (provider in Salvatore’s terminology) is registered against a service type (yes, service type can include LB drivers, firewall drivers, etc.).</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif";color:#1F497D'>          </span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>There can be several LBaaS drivers registered against the same service type (e.g. “high-performance LB” service type).</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>That probably needs to be clarified in more detail, but it does make sense. As far as I understand there is exactly 1 driver per service type, but there could be several service types referencing the same driver (like you mentioned, "high-perf-lb", "low-cost-lb", etc)<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If these assumptions are incorrect or need to be clarified further, let’s start by doing this first </span><span style='font-size:11.0pt;font-family:Wingdings;color:#1F497D'>J</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Now, let’s imagine we have a component in the system whose job is to pick a driver/provider (device type) and a device </span><o:p></o:p></p></div></blockquote><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>(device id) given a certain service type. We will call this component the “placement component” (it’s not necessarily a  separate process like the scheduler, and can be part of the plugin, the agent or the driver, it doesn’t matter for this discussion at this stage).</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I'd still prefer to call it a scheduler even though it will be a part of our plugin or separate component.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>The Placement Component needs to choose a device that can load-balance traffic coming from network A (where the VIP is) to VMs residing on Network B (pool’s network). In order to do this, the Placement Component needs to be aware of the capabilities of each driver/provider and can follow a certain strategy of device allocation that might take into account some of the following constraints. </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - Some device types are physical appliances, others are virtual appliances running on Nova. The driver might prefer one or the other if both satisfy the service type.</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed.<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - Some device types have a fixed number of devices (e.g. physical appliances), while other devices can be created at will whenever needed (e.g. HA-Proxy VMs).</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed.<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - Some device types can host a high number of VIPs, others can host a smaller number.</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed. Typically such factors are accounted during scheduling process.<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - Given a choice between multiple device types that satisfy the same service type, preference could be given to a device that is already wired to network A and network B. </span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Not sure that this is necessary, but that could be an option.<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - Given a choice between several equivalent devices (possibly of different device types), the least loaded one is chosen.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>                </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - A placement policy could be to group all VIPs belonging to the same tenant on the same device whenever possible.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>  - A placement policy could be to group all VIPs belonging to the same network on the same device.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>All these are legitimate placement strategies/algorithms, and our placement component might be very basic or very sophisticated, but we can hide this from the rest of the system.  </span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Nova has different scheduling drivers for this. We can use same approach as well.<o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Now let's assume that Placement component working through some combination of these rules, has finally chosen a driver/provider (e.g. HA-Proxy) and a specific device (HA-Proxy device 1) or it decided to create a new device in a driver (spawned new HA-Proxy VM, which is now HA-Proxy device 2). Now it needs to wire the chosen device to Quantum Network A and Network B (if it's not already wired to these networks).  This requires the Placement Component to call Quantum to do the wiring (we need to figure out the interface between the 2). If the device is a Nova VM, then this is easy as it's done like for any other VM. If the device is physical then this depends on the L2 switch technology used in the Quantum service (VLAN, Linux-Bridge, etc.): the physical device (or a proxy of it) needs to run a Quantum L2 agent in order to wire the device correctly.</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>After all this is done, the device is ready to be configured with a VIP. The Placement Component can return the driver, device_id (and possibly other config data, like the address chosen for the VIP) to the LBaaS plugin, which proceeds to call the LBaaS agent in order to create the VIP on this device.</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Agreed.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></blockquote><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If we can understand what are the tasks of the “placement component” and the interactions this component needs to have with other components, then it’s easier to figure out where it should run.</span><o:p></o:p></p></div></blockquote></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Recently we discussed an idea of separate plugin performing device management and scheduling which will be a utility plugin for other service plugins (not only lbaas).<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I think we'll need at least some simple form of this component within our lbaas efforts.<o:p></o:p></p></div><div><div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Youcef</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Eugene Nikanorov [mailto:<a href="mailto:enikanorov@mirantis.com" target="_blank">enikanorov@mirantis.com</a>] <br><b>Sent:</b> Monday, November 26, 2012 10:11 PM<br><b>To:</b> OpenStack Development Mailing List<br><b>Subject:</b> Re: [openstack-dev] [Quantum][LBaaS] Progress on lbaas-plugin-api-crud</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi Youcef,<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Driver doesn't "choose" device-specific info, driver is device-specific itself.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>When we send request to the agent, we need to specify which device to use.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>So once the<span style='font-family:"Times New Roman","serif"'> </span>user have chosen device type via service_type on VIP creation, Quantum not only should associate VIP with device type, but also it should choose particular instance of that device type to deploy the VIP.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>The process of choosing the instance is called scheduling. Unlike nova it's unreasonable for LBaaS to have separate scheduler service, thus it makes sense to have them built<span style='font-family:"Times New Roman","serif"'> </span>in the plugin.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I think we should not do this on agent since it doesn't have (and should not have) device database.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Not should it access quantum's database directly.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>So overall workflow will look like the following:<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>1. Add a device (type, physical info) to device registry (this is a part of Provider API. Call to Quantum made by cloud provider in case of shared devices, or by tenant in case of private VM balancers)<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>2. Create a VIP, specifying service type (=device type) (call by tenant),<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>3. Choose device of specified type, associate the VIP with the device (made by Quantum/Plugin)<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>4. Send message with (logical VIP info, device_type, physical device info) to LBaaS Agent (made by<span style='font-family:"Times New Roman","serif"'> </span>Quantum/Plugin)<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>5. Communicate with particular device using driver according to device_type (LBaaS<span style='font-family:"Times New Roman","serif"'> </span>Agent)<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Any CRUD request processed by Agent should be supplied by device type and device parameters.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>You may think of alternative approach where device registry is held by the Agent or even driver, but this approach has the next disadvantages:<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- Scheduling goes to Agent or Driver and thus Agent/Driver should store VIP-device association while VIP is a "foreign" object for the Agent/Driver.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- If we go with multiple agents for large deployments, we'll need to sync their device databases<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- Device locking will be complicated.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- If Agents will have non-intersecting sets of devices in their registries than scheduling will be complicated or not possible.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Please share you thoughts on this.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Eugene.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Tue, Nov 27, 2012 at 3:38 AM, Youcef Laribi <<a href="mailto:Youcef.Laribi@eu.citrix.com" target="_blank">Youcef.Laribi@eu.citrix.com</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Eugene, Leon,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Could we have the LBaaS plugin choose the “driver” based on service_type info, and then it’s the driver which choose the “device”? The driver can obviously have its own DB model where it stores device-specific info.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Youcef</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a name="13b658d0cff87dd1_13b5d7b7afff8f9f_13b5ad"><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span></a><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Dan Wendlandt [mailto:<a href="mailto:dan@nicira.com" target="_blank">dan@nicira.com</a>] <br><b>Sent:</b> Monday, November 26, 2012 9:13 AM<br><b>To:</b> Leon Cui<br><b>Cc:</b> OpenStack Development Mailing List; Salvatore Orlando<br><b>Subject:</b> Re: [openstack-dev] </span><span lang=ZH-CN style='font-size:10.0pt'>答复</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>: </span><span lang=ZH-CN style='font-size:10.0pt'>答复</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>: </span><span lang=ZH-CN style='font-size:10.0pt'>答复</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>: </span><span lang=ZH-CN style='font-size:10.0pt'>答复</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>: </span><span lang=ZH-CN style='font-size:10.0pt'>答复</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>: Progress on lbaas-plugin-api-crud</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Mon, Nov 26, 2012 at 9:03 AM, Leon Cui <<a href="mailto:lcui@vmware.com" target="_blank">lcui@vmware.com</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Eugene,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>When did you change get merged into master? I did rebase on last Friday which supposed to be your latest code, but anyway I’m planning to do it again today. </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks for your reminder that I need to include device mgmt. into DB model.  Need to look at Salvatore’s change on ServiceType.</span><o:p></o:p></p></div></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>It seems to me that each LB plugin should be able to define its own DB models for "device mgmt" (e.g., device address/credentials/etc.), as different plugins may have different strategies for how they manage devices. <span style='font-family:"Times New Roman","serif"'> </span>The usual model is that plugins can define additional models/tables to manage entities that are specific to that plugin. <span style='font-family:"Times New Roman","serif"'> </span>This is similar to how we didn't back the notion of a "vlan" into the DB model for "core plugins", since not all plugins will use vlans. <span style='font-family:"Times New Roman","serif"'> </span>If you don't go down this route, you end up with a messy DB model as everyone keeps adding columns for items that only a particular plugin needs to track. <span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Dan<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks</span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Leon</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN style='font-size:10.0pt'>发件人</span></b><b><span style='font-size:10.0pt'>:</span></b><span style='font-size:10.0pt'> Eugene Nikanorov [mailto:<a href="mailto:enikanorov@mirantis.com" target="_blank">enikanorov@mirantis.com</a>] <br><b><span lang=ZH-CN>发送时间</span>:</b> 2012<span lang=ZH-CN>年</span>11<span lang=ZH-CN>月</span>26<span lang=ZH-CN>日</span> 4:29</span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br><b><span lang=ZH-CN>收件人</span>:</b> Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> Ilya Shakhat; Sachin Thakkar; Oleg Bondarev; Salvatore Orlando; Dan Wendlandt<o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN>主题</span>:</b> Re: <span lang=ZH-CN>答复</span>: <span lang=ZH-CN>答复</span>: <span lang=ZH-CN>答复</span>: <span lang=ZH-CN>答复</span>: Progress on lbaas-plugin-api-crud<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi Leon,<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks for sending me the patch.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I've looked at it briefly, there is<span style='font-family:"Times New Roman","serif"'> </span>one major thing I was able to identify:<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>In order to couple things together (plugin, agent, drivers), we need to add device management at least to DB model.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>In particular, each vip should have a reference to the device (which has a type and address/credentials).<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>This information is passed in each agent notification message.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>This part is missing in current design blueprints but i think we need to add it before we put the code on review.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Probably it will also depend on Salvatore's ServiceTypes part.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Also I see that your patch is based on some of my outdated patches.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>My code was recently merged into the master so you can rebase on master using only Oleg's patch.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'>Eugene.<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Fri, Nov 23, 2012 at 2:40 PM, Leon Cui <<a href="mailto:lcui@vmware.com" target="_blank">lcui@vmware.com</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Eugene,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I’m still waiting for approval as openstack contributor.  For now I simply attached the patch file that you might want to take a look first.  Once I got the approval, I’ll try to post the view asap.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Leon</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN style='font-size:10.0pt'>发件人</span></b><b><span style='font-size:10.0pt'>:</span></b><span style='font-size:10.0pt'> Eugene Nikanorov [mailto:<a href="mailto:enikanorov@mirantis.com" target="_blank">enikanorov@mirantis.com</a>] <br><b><span lang=ZH-CN>发送时间</span>:</b> 2012<span lang=ZH-CN>年</span>11<span lang=ZH-CN>月</span>20<span lang=ZH-CN>日</span> 22:57<br><b><span lang=ZH-CN>收件人</span>:</b> Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> Ilya Shakhat; Sachin Thakkar; Oleg Bondarev; Salvatore Orlando; Dan Wendlandt<br><b><span lang=ZH-CN>主题</span>:</b> Re: <span lang=ZH-CN>答复</span>: <span lang=ZH-CN>答复</span>: <span lang=ZH-CN>答复</span>: Progress on lbaas-plugin-api-crud</span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Leon,<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I'll take agent and rpc parts.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I have registered<span style='font-family:"Times New Roman","serif"'> </span><a href="https://blueprints.launchpad.net/quantum/+spec/lbaas-agent-and-rpc" target="_blank">https://blueprints.launchpad.net/quantum/+spec/lbaas-agent-and-rpc</a> to track this.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'>Eugene.<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Tue, Nov 20, 2012 at 2:16 PM, Leon Cui <<a href="mailto:lcui@vmware.com" target="_blank">lcui@vmware.com</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Eugene,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks for your suggestion.  It looks good to me.  I’ll work out the UT first, and then align the class model to the diagram as you suggested.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Leon</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN style='font-size:10.0pt'>发件人</span></b><b><span style='font-size:10.0pt'>:</span></b><span style='font-size:10.0pt'> Eugene Nikanorov [mailto:<a href="mailto:enikanorov@mirantis.com" target="_blank">enikanorov@mirantis.com</a>] <br><b><span lang=ZH-CN>发送时间</span>:</b> 2012<span lang=ZH-CN>年</span>11<span lang=ZH-CN>月</span>20<span lang=ZH-CN>日</span> 17:32</span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br><b><span lang=ZH-CN>收件人</span>:</b> Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> Ilya Shakhat; Sachin Thakkar; Oleg Bondarev; Salvatore Orlando<o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN>主题</span>:</b> Re: <span lang=ZH-CN>答复</span>: <span lang=ZH-CN>答复</span>: Progress on lbaas-plugin-api-crud<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222;background:white'>replying to all...</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222;background:white'>Leon,</span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>I think </span><span style='font-size:11.5pt;font-family:"Calibri","sans-serif";color:#222222'>tests/unit/test_db_plugin.py  is right code to refer when writing unit tests for db code. The only thing is that unit tests written in test_db_plugin.py are a bit generic, e.g. the backend plugin is specified in particular plugin's UTs which inherit from QuantumDbPluginV2TestCase. I think UTs for balancer plugin may be more specific, testing </span><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>LoadbalancerPluginDb class.</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>Since you need dababase utility methods from QuantumDbPluginV2 then it's LoadbalancerPluginDb which should inherit from such QuantumDBBase (or whatever you call it), so overall diagram will look like:</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'> </span><o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>ServicePluginBase</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>    |</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>LoadBalancerPluginBase </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>    |</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>    |                                       QuantumDBBase </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>    |                                            |</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>LoadBalancerPlugin  <---------- LoadBalancerPluginDb</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>Thanks,</span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222'>Eugene.</span><o:p></o:p></p></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Tue, Nov 20, 2012 at 1:04 PM, Leon Cui <<a href="mailto:lcui@vmware.com" target="_blank">lcui@vmware.com</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Eugene,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks for your suggestion.  Please see my comments inline.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>One more question: I’m writing the unit test, mainly to verify the database functionalities for LB CRUD.  Do you think tests/unit/test_db_plugin.py is the right test code that I should refer to?  Any good suggestions on this front?</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Leon</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN style='font-size:10.0pt'>发件人</span></b><b><span style='font-size:10.0pt'>:</span></b><span style='font-size:10.0pt'> Eugene Nikanorov [mailto:<a href="mailto:enikanorov@mirantis.com" target="_blank">enikanorov@mirantis.com</a>] <br><b><span lang=ZH-CN>发送时间</span>:</b> 2012<span lang=ZH-CN>年</span>11<span lang=ZH-CN>月</span>20<span lang=ZH-CN>日</span> 16:44<br><b><span lang=ZH-CN>收件人</span>:</b> Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> Ilya Shakhat; Sachin Thakkar; Oleg Bondarev; Salvatore Orlando<br><b><span lang=ZH-CN>主题</span>:</b> Re: <span lang=ZH-CN>答复</span>: Progress on lbaas-plugin-api-crud</span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi Leon,<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>A few thoughts on your diagram.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Please consider the following:<o:p></o:p></p></div></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>1) If you want something from QuantumDbPluginV2 and you feel it may be common plugin functionality - you need to extract it to a separate class, something like QuantumPluginBase, and inherit QuantumDBPluginV2 from this class, ServicePluginBase should inherit from that class as well.<o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='color:#1F497D'>[Leon] I need some dababase utility methods from QuantumDbPluginV2.</span><span style='font-family:"Times New Roman","serif";color:#1F497D'> </span><span style='color:#1F497D'> Abstract to a separate class could be a good idea. But I<span lang=ZH-CN>’</span>m not sure if it<span lang=ZH-CN>’</span>s a good idea to let ServicePluginBase to inherit from this class. ServicePluginBase is an abstract class for service plugin service (quantum manager) to use. </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#1F497D'> </span><o:p></o:p></p></div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>2) LoadBalancerPluginBase imho should inherit from ServicePluginBase<o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>[Leon] Why it needs to inherit from ServicePluginBase?   LoadBalancerPluginBase defines the loadbalancer extension APIs.  I think we just make sure LoadbalancerPlugin inherits from both classes as below:</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='color:#1F497D'>ServicePluginBase</span><span style='font-family:"Times New Roman","serif";color:#1F497D'>   </span><span style='color:#1F497D'> QuantumPluginDbBase</span><span style='font-family:"Times New Roman","serif";color:#1F497D'>  </span><span style='color:#1F497D'> LoadbalancerPluginBase</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#1F497D'>      </span><span style='color:#1F497D'> |</span><span style='font-family:"Times New Roman","serif";color:#1F497D'>                      </span><span style='color:#1F497D'> |</span><span style='font-family:"Times New Roman","serif";color:#1F497D'>                     </span><span style='color:#1F497D'> |</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#1F497D'>       </span><span style='color:#1F497D'> ----------------------------------------------</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#1F497D'>                              </span><span style='color:#1F497D'> |</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#1F497D'>                       </span><span style='color:#1F497D'> LoadbalancerPlugin</span><span style='font-family:"Times New Roman","serif";color:#1F497D'>   </span><span style='color:#1F497D'> ------ LoadbalancerPluginDb</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#1F497D'>             </span><span style='color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>LoadbalancerPlugin will contain the LoadbalancerPluginDb instance for database access.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>3) Depending on what you need from<span style='font-family:"Times New Roman","serif"'> </span>QuantumDbPluginV2/QuantumPluginBase, this may lead to the following inheritance sequence:<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>QuantumPluginBase<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span> <span style='font-family:"Times New Roman","serif"'> </span> |<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>ServicePluginBase<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span> <span style='font-family:"Times New Roman","serif"'> </span> |<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>LoadBalancerPluginBase<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span> <span style='font-family:"Times New Roman","serif"'> </span> |<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>LoadBalancerPluginDb<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span> <span style='font-family:"Times New Roman","serif"'> </span> |<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>LoadBalancerPlugin<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Also, I think that<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPlugin should not inherit<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPluginDb.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Unlike core plugins where it could make sense, I'd prefer to see<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPluginDb to be a part of<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPlugin.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I mean<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPlugin implements<span style='font-family:"Times New Roman","serif"'> </span>"has a"<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPluginDb<span style='font-family:"Times New Roman","serif"'> </span> instead of "is a" relation.<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>The reason for this is that<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPlugin<span style='font-family:"Times New Roman","serif"'> </span>provides CRUD implementation which doesn't directly map to DB operations implemented in<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPluginDb. <o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>E.g. my idea is:<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>LoadBalancerPlugin - CRUD, validation, calling<span style='font-family:"Times New Roman","serif"'> </span>LoadBalancerPluginDb, sending/receiving messages to agent<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>LoadBalancerPluginDb - DB access.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Eugene.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Tue, Nov 20, 2012 at 6:54 AM, Leon Cui <<a href="mailto:lcui@vmware.com" target="_blank">lcui@vmware.com</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Ilya,</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Calibri","sans-serif";color:#1F497D'>R</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>ight now I took Eugene’s change under review (</span><span style='color:#003300'><a href="https://review.openstack.org/#/c/15733/" target="_blank">https://review.openstack.org/#/c/15733/</a></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>) and am developing the database access logic and plugin skeleton based on that service plugin mechanism.</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> <span style='color:#1F497D'>The class model is illustrated in the below diagram:</span></span><o:p></o:p></p><table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 align=left><tr><td width=87 style='width:65.25pt;padding:0in 0in 0in 0in'></td><td width=107 style='width:80.25pt;padding:0in 0in 0in 0in'></td><td width=178 style='width:133.5pt;padding:0in 0in 0in 0in'></td><td width=249 style='width:186.75pt;padding:0in 0in 0in 0in'></td></tr><tr style='min-height:128.25pt'><td style='padding:0in 0in 0in 0in;min-height:128.25pt'></td><td colspan=3 valign=top style='padding:0in 0in 0in 0in;min-height:128.25pt'><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wrap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:column;mso-height-rule:exactly'><o:p></o:p></p></td></tr><tr style='min-height:2.25pt'><td style='padding:0in 0in 0in 0in;min-height:2.25pt'></td><td style='padding:0in 0in 0in 0in;min-height:2.25pt'></td><td style='padding:0in 0in 0in 0in;min-height:2.25pt'></td><td style='padding:0in 0in 0in 0in;min-height:2.25pt'></td></tr><tr style='min-height:51.0pt'><td style='padding:0in 0in 0in 0in;min-height:51.0pt'></td><td style='padding:0in 0in 0in 0in;min-height:51.0pt'></td><td valign=top style='padding:0in 0in 0in 0in;min-height:51.0pt'><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wrap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:column;mso-height-rule:exactly'><o:p></o:p></p></td><td style='padding:0in 0in 0in 0in;min-height:51.0pt'></td></tr></table><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br clear=all><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>LoadBalancerPlugin module is the main body of loadbalancer plugin which inherits from multiple classes:</span><o:p></o:p></p><p style='margin-left:22.5pt'><span style='color:#1F497D'>-</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif";color:#1F497D'>          </span><span style='color:#1F497D'>ServicePluginBase: defines the abstract methods that a service plugin should implemented.</span><o:p></o:p></p><p style='margin-left:22.5pt'><span style='color:#1F497D'>-</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif";color:#1F497D'>          </span><span style='color:#1F497D'>QuantumDbPluginV2: contains a set of generic quantum database access methods. I<span lang=ZH-CN>’</span>m not sure if we really want to inherit from this class but I<span lang=ZH-CN>’</span>d like to leverage the methods defined in this class.</span><o:p></o:p></p><p style='margin-left:22.5pt'><span style='color:#1F497D'>-</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif";color:#1F497D'>          </span><span style='color:#1F497D'>LoadBalancerPluginDb: This the main part I<span lang=ZH-CN>’</span>m coding on which wrap the Lbaas database model and CRUD operation against the database.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>My thought is that LoadBalancerPlugin will control the LBaaS CRUD API flow. For instance, “create_vip” method should first validate the input, update the database, send message to the LbAgent over AMQP channel, than update the database by setting the status from PENDING_CREATE to ACTIVE.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I’m trying to write unit tests against the database access now which will take a while to complete. Meanwhile it would be great to have your help on coding the RPC interaction between plugin and agent.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I don’t like blocking your part. What’s the best practice to collaborate with you on this? Maybe I can shelve my change to you somehow?</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Leon</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span lang=ZH-CN style='font-size:10.0pt'>发件人</span></b><b><span style='font-size:10.0pt'>:</span></b><span style='font-size:10.0pt'> Ilya Shakhat [mailto:<a href="mailto:ishakhat@mirantis.com" target="_blank">ishakhat@mirantis.com</a>] <br><b><span lang=ZH-CN>发送时间</span>:</b> 2012<span lang=ZH-CN>年</span>11<span lang=ZH-CN>月</span>19<span lang=ZH-CN>日</span> 22:08<br><b><span lang=ZH-CN>收件人</span>:</b> Sachin Thakkar; Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> Eugene Nikanorov; Oleg Bondarev<br><b><span lang=ZH-CN>主题</span>:</b> Progress on lbaas-plugin-api-crud</span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi Sachin, Leo,<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Recently there was a thread related to LBaaS architecture (<a href="http://lists.openstack.org/pipermail/openstack-dev/2012-November/002646.html" target="_blank">http://lists.openstack.org/pipermail/openstack-dev/2012-November/002646.html</a>). How good is it aligned with your implementation? Do you need help in coding? (we may take Agent part)<span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Ilya<o:p></o:p></p></div></div></div></div></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div></div></div></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div></div></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div></div></div></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div></div></div></div></div></div></blockquote></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='color:#888888'><br><br clear=all></span><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif";color:#888888'> </span><o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='color:#888888'>-- <br>~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>Dan Wendlandt</span><span style='font-family:"Times New Roman","serif";color:#888888'> </span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Nicira, Inc:<span style='font-family:"Times New Roman","serif"'> </span><a href="http://www.nicira.com" target="_blank">www.nicira.com</a><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>twitter: danwendlandt<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~<o:p></o:p></p></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Times New Roman","serif"'> </span><o:p></o:p></p></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></blockquote></div></div></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div></div></div></div></div></div></div><p class=MsoNormal style='margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p></div></div></div><p class=MsoNormal style='margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p></div></div></div><p class=MsoNormal style='margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></blockquote></div></div></div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal style='margin-bottom:12.0pt'><br>_______________________________________________<br>OpenStack-dev mailing list<br><a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br><a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></p></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>