<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:Courier;
        panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:宋体;
        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:Consolas;
        panose-1:2 11 6 9 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:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
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;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML 预设格式 Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"批注框文本 Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.HTMLChar
        {mso-style-name:"HTML 预设格式 Char";
        mso-style-priority:99;
        mso-style-link:"HTML 预设格式";
        font-family:"Courier New";}
span.Char
        {mso-style-name:"批注框文本 Char";
        mso-style-priority:99;
        mso-style-link:批注框文本;
        font-family:宋体;}
p.HTMLPreformatted, li.HTMLPreformatted, div.HTMLPreformatted
        {mso-style-name:"HTML Preformatted";
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
p.BalloonText, li.BalloonText, div.BalloonText
        {mso-style-name:"Balloon Text";
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
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;}
span.EmailStyle26
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.line
        {mso-style-name:line;}
span.id
        {mso-style-name:id;}
span.number
        {mso-style-name:number;}
span.string
        {mso-style-name:string;}
span.EmailStyle31
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle32
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#993366;}
span.EmailStyle33
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle34
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#003300;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1606569774;
        mso-list-type:hybrid;
        mso-list-template-ids:-709317164 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></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='color:#003300'>Hi Youcef,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#003300'>Thanks for the clarification!  It makes more sense to me now.  <o:p></o:p></span></p><p class=MsoNormal><span style='color:#003300'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#003300'>As you mentioned, a member should already have been created before create the pool.  The last question in my mind is that as per the API spec, when create a member, the pool_id is a mandatory attribute, where in this sample, the pool_id is unknown yet.  This sounds like a “egg or chicken came first” question</span><span style='font-family:Wingdings;color:#003300'>J</span><span style='color:#003300'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:#003300'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#003300'>Shall we make the pool_id of a member as an optional attribute?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#003300'><o:p> </o:p></span></p><div><p class=MsoNormal><span style='color:#003300'>Thanks</span><span style='color:#003300'><o:p></o:p></span></p></div><p class=MsoNormal><span style='color:#003300'>Leon</span><span style='color:#003300'><o:p></o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=ZH-CN style='font-size:10.0pt;font-family:宋体'>发件人</span></b><b><span style='font-size:10.0pt;font-family:宋体'>:</span></b><span style='font-size:10.0pt;font-family:宋体'> Youcef Laribi [mailto:Youcef.Laribi@eu.citrix.com] <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> 10:53<br><b><span lang=ZH-CN>收件人</span>:</b> Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> openstack-dev@lists.openstack.org<br><b><span lang=ZH-CN>主题</span>:</b> RE: [quantum][LBaas] Add members to the pool<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#1F497D'>Hi Leon,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Let me clarify one thing. User doesn’t have to provide members when she creates the pool, it is an optional attribute. User can create it an empty pool and then add members to it later. <o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>But if user wants to create the pool *<b>and</b>* populate it with members at the same time, then this is possible by providing the “members” attribute when creating a pool. In this case, the members should already have been created (see “create member” section) because user will be using their IDs to populate the pool. <o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>So, if you are implementing this API, you should consider 2 use cases:<o:p></o:p></span></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='color:#1F497D'>Whether user has provided a members attribute in the request or not. If she hasn’t, you create an empty pool (user can add members to it later).<o:p></o:p></span></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='color:#1F497D'>If user specified the members attribute, then you:<o:p></o:p></span></p><p class=MsoListParagraph style='margin-left:72.0pt;text-indent:-18.0pt;mso-list:l0 level2 lfo2'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>a.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='color:#1F497D'> Create the pool in the DB first and get the pool ID<o:p></o:p></span></p><p class=MsoListParagraph style='margin-left:72.0pt;text-indent:-18.0pt;mso-list:l0 level2 lfo2'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>b.<span style='font:7.0pt "Times New Roman"'>      </span></span></span><![endif]><span style='color:#1F497D'>For each member ID in the members attribute, update that member in the DB by updating its “pool_id” attribute from step a.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>We can always remove the option of “creating a pool and populating it at the same time” to simplify implementation.   <o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Thanks<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Youcef<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                                                                                                                                                                                                                                                         <o:p></o:p></span></p><p class=MsoNormal><a name="_MailEndCompose"></a><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><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"'> Leon Cui [mailto:lcui@vmware.com] <br><b>Sent:</b> Monday, November 19, 2012 6:27 PM<br><b>To:</b> Youcef Laribi<br><b>Cc:</b> openstack-dev@lists.openstack.org<br><b>Subject:</b> </span><span lang=ZH-CN style='font-size:10.0pt;font-family:宋体'>答复</span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>: [quantum][LBaas] Add members to the pool<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#993366'>Hi Youcef,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#993366'>The problem is “create the member rows” in this call (create a pool) will insert new members which has only <member_id, pool_id> attributes. The other mandatory attributes for the member, such as address and port, are basically None at the end of this call. Do you mean that user has to update those members by providing those attributes later?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#993366'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#993366'>In addition, how do you know the member id (which I suppose it’s auto-generated) in this call before create the member?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#993366'><o:p> </o:p></span></p><div><p class=MsoNormal><span style='color:#993366'>Thanks<o:p></o:p></span></p></div><p class=MsoNormal><span style='color:#993366'>Leon<o:p></o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=ZH-CN style='font-size:10.0pt;font-family:宋体'>发件人</span></b><b><span style='font-size:10.0pt;font-family:宋体'>:</span></b><span style='font-size:10.0pt;font-family:宋体'> Youcef Laribi [<a href="mailto:Youcef.Laribi@eu.citrix.com">mailto:Youcef.Laribi@eu.citrix.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> 2:51<br><b><span lang=ZH-CN>收件人</span>:</b> Leon Cui<br><b><span lang=ZH-CN>抄送</span>:</b> <a href="mailto:openstack-dev@lists.openstack.org">openstack-dev@lists.openstack.org</a><br><b><span lang=ZH-CN>主题</span>:</b> RE: [quantum][LBaas] Add members to the pool<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#1F497D'>Hi Leon,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>You don’t have to map the API operations one-to-one to SQLAlchemy operations. For this call (create a pool), you can in SQLAlchemy first create the “pool” row in a pool table, then create the members rows in the member table (and set their pool_id to the pool you created).<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>If you are worried about updating the DB transactionally, then you can start a transaction before updating both tables and commit it only when both tables have been updated successfully. There will be a lot of operations in the API that will require updating more than one table in the DB, so we have to support transactions anyway.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Thanks<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Youcef<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><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"'> Leon Cui [<a href="mailto:lcui@vmware.com">mailto:lcui@vmware.com</a>] <br><b>Sent:</b> Monday, November 19, 2012 2:34 AM<br><b>To:</b> Youcef Laribi<br><b>Cc:</b> <a href="mailto:openstack-dev@lists.openstack.org">openstack-dev@lists.openstack.org</a><br><b>Subject:</b> [quantum][LBaas] Add members to the pool<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hi Youcef,<o:p></o:p></p><p class=MsoNormal>While I’m coding on SQLAlchemy data model for pool, I found that there is no way to create a pool and specifying its members in a single rest call. The members will only be added to a pool by using member creation/update methods. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Therefore, the sample given in API spec in “Creating a pool” should be corrected as below, where “members” is removed.<o:p></o:p></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>POST /v1.</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#0080C0'>0</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>/pools<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>Host: lbaas-service.cloudX.com:</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#0080C0'>8651</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'><o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>Accept: application/json<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>Content-Type: application/json<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>X-Auth-Token:</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#0080C0'>887665443383838</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'><o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>Content-Length: </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#0080C0'>194</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'><o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>{<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>  </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"pool"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'> : {<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>            </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"name"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>: </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"web_pool"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>,<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>            </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"vip_id"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>: </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"db902c0c-d5ff-4753-b465-668ad9656918"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>,<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>            </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"protocol"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>: </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"HTTP"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>,<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>            </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"network_id"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'> : </span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:#004080'>"e2a7a228-8fd1-4aa8-8d0c-4023a68e1c92"</span><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>,<o:p></o:p></span></p><p class=MsoNormal style='line-height:13.5pt;background:#F3F5F7'><span lang=EN style='font-size:10.5pt;font-family:Courier;color:black'>}<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>What do you think?  Correct me if I’m wrong.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks<o:p></o:p></p><p class=MsoNormal>Leon<o:p></o:p></p></div></body></html>