<div dir="ltr"><span style="font-size:12.8px">>We actually called out this problem in the Ironic midcycle and the Tokyo</span><br style="font-size:12.8px"><span style="font-size:12.8px">>summit - we decided to report Ironic's total capacity from each compute</span><br style="font-size:12.8px"><span style="font-size:12.8px">>host (resulting in over-reporting from Nova), and real capacity (for</span><br style="font-size:12.8px"><span style="font-size:12.8px">>purposes of reporting, monitoring, whatever) should be fetched by</span><br style="font-size:12.8px"><span style="font-size:12.8px">>operators from Ironic (IIRC, you specifically were okay with this</span><br style="font-size:12.8px"><span style="font-size:12.8px">>limitation). This is still wrong, but it's the least wrong of any option</span><br style="font-size:12.8px"><span style="font-size:12.8px">>(yes, all are wrong in some way). See the spec[1] for more details.</span><br><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">I do recall that discussion, but the merged spec says: </span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">"In general, a nova-compute running the Ironic virt driver should expose</span></div><div><span style="font-size:12.8px">(total resources)/(number of compute services). This allows for resources to be</span></div><div><span style="font-size:12.8px">sharded across multiple compute services without over-reporting resources."</span></div><div><br></div><div>I agree that what you said via email is Less Awful than what I read on the spec (Did I misread it? Am I full of crazy?)</div><div><br></div><div><span style="font-size:12.8px">></span><span style="font-size:12.8px">We *do* still</span><br style="font-size:12.8px"><span style="font-size:12.8px">>need to figure out how to handle availability zones or host aggregates,</span><br style="font-size:12.8px"><span style="font-size:12.8px">>but I expect we would pass along that data to be matched against. I</span><br style="font-size:12.8px"><span style="font-size:12.8px">>think it would just be metadata on a node. Something like</span><br style="font-size:12.8px"><span style="font-size:12.8px">>node.properties['availability_</span><span style="font-size:12.8px">zone'] = 'rackspace-iad-az3' or what have</span><br style="font-size:12.8px"><span style="font-size:12.8px">>you. Ditto for host aggregates - add the metadata to ironic to match</span><br style="font-size:12.8px"><span style="font-size:12.8px">>what's in the host aggregate. I'm honestly not sure what to do about</span><br style="font-size:12.8px"><span style="font-size:12.8px">>(anti-)affinity filters; we'll need help figuring that out.</span></div><div><span style="font-size:12.8px">&</span></div><div><span style="font-size:12.8px">>Right, I didn't mean gantt specifically, but rather "splitting out the</span><br></div><div><span style="font-size:12.8px">>scheduler" like folks keep talking about. That's why I said "actually</span><br style="font-size:12.8px"><span style="font-size:12.8px">>exists". :)</span></div><div><br></div><div> I think splitting out the scheduler isn't going to be realistic. My feeling is, if Nova is going to fulfill its destiny of being The Compute Service, then the scheduler will stay put and the VM pieces will split out into another service (Which I think should be named "Seamus" so I can refer to it as "The wee baby Seamus"). </div><div><br></div><div>(re: ironic maintaining host aggregates)</div><div><span style="font-size:12.8px"><font color="#500050">></font>Yes, and yes, assuming those things are valuable to our users. The</span><br></div><div><span style="font-size:12.8px">>former clearly is, the latter will clearly depend on the change but I</span><br style="font-size:12.8px"><span style="font-size:12.8px">>expect we will evolve to continue to fit Nova's model of the world</span><br style="font-size:12.8px"><span style="font-size:12.8px">>(after all, fitting into Nova's model is a huge chunk of what we do, and</span><br style="font-size:12.8px"><span style="font-size:12.8px">>is exactly what we're trying to do with this work).</span></div><div><span class="im" style="font-size:12.8px"><font color="#222222"><br></font></span></div><div><span class="im" style="font-size:12.8px"><font color="#222222">It's a lot easier to fit into the nova model if we just use what's there and don't bother trying to replicate it.<br></font><br></span><span style="font-size:12.8px">>Again, the other solutions I'm seeing that *do* solve more problems are:</span><br style="font-size:12.8px"><span style="font-size:12.8px">>* Rewrite the resource tracker</span></div><div><br><span style="font-size:12.8px">>Do you have an entire team (yes, it will take a relatively large team,</span><br style="font-size:12.8px"><span style="font-size:12.8px">>especially when you include some cores dedicated to reviewing the code)</span><br style="font-size:12.8px"><span style="font-size:12.8px">>that can dedicate a couple of development cycles to one of these? </span></div><div><br></div><div> We can certainly help. </div><div><br></div><div><span style="font-size:12.8px">>I sure</span><br style="font-size:12.8px"><span style="font-size:12.8px">>don't. If and when we do, we can move forward on that and deprecate this</span><br style="font-size:12.8px"><span style="font-size:12.8px">>model, if we find that to be a useful thing to do at that time. Right</span><br style="font-size:12.8px"><span style="font-size:12.8px">>now, this is the best plan I have, that we can commit to completing in a</span><br style="font-size:12.8px"><span style="font-size:12.8px">>reasonable timeframe.</span><br></div><div><br></div><div>I respect that you're trying to solve the problem we have right now to make operators lives Suck Less. But I think that a short term decision made now would hurt a lot more later on. </div><div><br></div><div>-James<br></div><div><br></div><div class="gmail_extra"><div class="gmail_quote">On Wed, Dec 16, 2015 at 8:03 AM, Jim Rollenhagen <span dir="ltr"><<a href="mailto:jim@jimrollenhagen.com" target="_blank">jim@jimrollenhagen.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">On Tue, Dec 15, 2015 at 05:19:19PM -0800, James Penick wrote:<br>
> > getting rid of the raciness of ClusteredComputeManager in my<br>
> >current deployment. And I'm willing to help other operators do the same.<br>
><br>
>  You do alleviate race, but at the cost of complexity and<br>
> unpredictability.  Breaking that down, let's say we go with the current<br>
> plan and the compute host abstracts hardware specifics from Nova.  The<br>
> compute host will report (sum of resources)/(sum of managed compute).  If<br>
> the hardware beneath that compute host is heterogenous, then the resources<br>
> reported up to nova are not correct, and that really does have significant<br>
> impact on deployers.<br>
><br>
>  As an example: Let's say we have 20 nodes behind a compute process.  Half<br>
> of those nodes have 24T of disk, the other have 1T.  An attempt to schedule<br>
> a node with 24T of disk will fail, because Nova scheduler is only aware of<br>
> 12.5T of disk.<br>
<br>
</span>We actually called out this problem in the Ironic midcycle and the Tokyo<br>
summit - we decided to report Ironic's total capacity from each compute<br>
host (resulting in over-reporting from Nova), and real capacity (for<br>
purposes of reporting, monitoring, whatever) should be fetched by<br>
operators from Ironic (IIRC, you specifically were okay with this<br>
limitation). This is still wrong, but it's the least wrong of any option<br>
(yes, all are wrong in some way). See the spec[1] for more details.<br>
<span class=""><br>
>  Ok, so one could argue that you should just run two compute processes per<br>
> type of host (N+1 redundancy).  If you have different raid levels on two<br>
> otherwise identical hosts, you'll now need a new compute process for each<br>
> variant of hardware.  What about host aggregates or availability zones?<br>
> This sounds like an N^2 problem.  A mere 2 host flavors spread across 2<br>
> availability zones means 8 compute processes.<br>
><br>
> I have hundreds of hardware flavors, across different security, network,<br>
> and power availability zones.<br>
<br>
</span>Nobody is talking about running a compute per flavor or capability. All<br>
compute hosts will be able to handle all ironic nodes. We *do* still<br>
need to figure out how to handle availability zones or host aggregates,<br>
but I expect we would pass along that data to be matched against. I<br>
think it would just be metadata on a node. Something like<br>
node.properties['availability_zone'] = 'rackspace-iad-az3' or what have<br>
you. Ditto for host aggregates - add the metadata to ironic to match<br>
what's in the host aggregate. I'm honestly not sure what to do about<br>
(anti-)affinity filters; we'll need help figuring that out.<br>
<span class=""><br>
> >None of this precludes getting to a better world where Gantt actually<br>
> >exists, or the resource tracker works well with Ironic.<br>
><br>
> It doesn't preclude it, no. But Gantt is dead[1], and I haven't seen any<br>
> movement to bring it back.<br>
<br>
</span>Right, I didn't mean gantt specifically, but rather "splitting out the<br>
scheduler" like folks keep talking about. That's why I said "actually<br>
exists". :)<br>
<span class=""><br>
> >It just gets us to an incrementally better model in the meantime.<br>
><br>
>  I strongly disagree. Will Ironic manage its own concept of availability<br>
> zones and host aggregates?  What if nova changes their model, will Ironic<br>
> change to mirror it?  If not I now need to model the same topology in two<br>
> different ways.<br>
<br>
</span>Yes, and yes, assuming those things are valuable to our users. The<br>
former clearly is, the latter will clearly depend on the change but I<br>
expect we will evolve to continue to fit Nova's model of the world<br>
(after all, fitting into Nova's model is a huge chunk of what we do, and<br>
is exactly what we're trying to do with this work).<br>
<span class=""><br>
>  In that context, breaking out scheduling and "hiding" ironic resources<br>
> behind a compute process is going to create more problems than it will<br>
> solve, and is not the "Least bad" of the options to me.<br>
<br>
</span>Again, the other solutions I'm seeing that *do* solve more problems are:<br>
<br>
* Rewrite the resource tracker<br>
* Break out the scheduler into a separate thing<br>
<br>
Do you have an entire team (yes, it will take a relatively large team,<br>
especially when you include some cores dedicated to reviewing the code)<br>
that can dedicate a couple of development cycles to one of these? I sure<br>
don't. If and when we do, we can move forward on that and deprecate this<br>
model, if we find that to be a useful thing to do at that time. Right<br>
now, this is the best plan I have, that we can commit to completing in a<br>
reasonable timeframe.<br>
<span class=""><font color="#888888"><br>
// jim<br>
</font></span><div class=""><div class="h5"><br>
><br>
> -James<br>
> [1] <a href="http://git.openstack.org/cgit/openstack/gantt/tree/README.rst" rel="noreferrer" target="_blank">http://git.openstack.org/cgit/openstack/gantt/tree/README.rst</a><br>
><br>
> On Mon, Dec 14, 2015 at 5:28 PM, Jim Rollenhagen <<a href="mailto:jim@jimrollenhagen.com">jim@jimrollenhagen.com</a>><br>
> wrote:<br>
><br>
> > On Mon, Dec 14, 2015 at 04:15:42PM -0800, James Penick wrote:<br>
> > > I'm very much against it.<br>
> > ><br>
> > >  In my environment we're going to be depending heavily on the nova<br>
> > > scheduler for affinity/anti-affinity of physical datacenter constructs,<br>
> > > TOR, Power, etc. Like other operators we need to also have a concept of<br>
> > > host aggregates and availability zones for our baremetal as well. If<br>
> > these<br>
> > > decisions move out of Nova, we'd have to replicate that entire concept of<br>
> > > topology inside of the Ironic scheduler. Why do that?<br>
> > ><br>
> > > I see there are 3 main problems:<br>
> > ><br>
> > > 1. Resource tracker sucks for Ironic.<br>
> > > 2. We need compute host HA<br>
> > > 3. We need to schedule compute resources in a consistent way.<br>
> > ><br>
> > >  We've been exploring options to get rid of RT entirely. However, melwitt<br>
> > > suggested out that by improving RT itself, and changing it from a pull<br>
> > > model to a push, we skip a lot of these problems. I think it's an<br>
> > excellent<br>
> > > point. If RT moves to a push model, Ironic can dynamically register nodes<br>
> > > as they're added, consumed, claimed, etc and update their state in Nova.<br>
> > ><br>
> > >  Compute host HA is critical for us, too. However, if the compute hosts<br>
> > are<br>
> > > not responsible for any complex scheduling behaviors, it becomes much<br>
> > > simpler to move the compute hosts to being nothing more than dumb workers<br>
> > > selected at random.<br>
> > ><br>
> > >  With this model, the Nova scheduler can still select compute resources<br>
> > in<br>
> > > the way that it expects, and deployers can expect to build one system to<br>
> > > manage VM and BM. We get rid of RT race conditions, and gain compute HA.<br>
> ><br>
> > Right, so Deva mentioned this here. Copied from below:<br>
> ><br>
> > > > > Some folks are asking us to implement a non-virtualization-centric<br>
> > > > > scheduler / resource tracker in Nova, or advocating that we wait for<br>
> > the<br>
> > > > > Nova scheduler to be split-out into a separate project. I do not<br>
> > believe<br>
> > > > > the Nova team is interested in the former, I do not want to wait for<br>
> > the<br>
> > > > > latter, and I do not believe that either one will be an adequate<br>
> > solution<br>
> > > > > -- there are other clients (besides Nova) that need to schedule<br>
> > workloads<br>
> > > > > on Ironic.<br>
> ><br>
> > And I totally agree with him. We can rewrite the resource tracker, or we<br>
> > can break out the scheduler. That will take years - what do you, as an<br>
> > operator, plan to do in the meantime? As an operator of ironic myself,<br>
> > I'm willing to eat the pain of figuring out what to do with my<br>
> > out-of-tree filters (and cells!), in favor of getting rid of the<br>
> > raciness of ClusteredComputeManager in my current deployment. And I'm<br>
> > willing to help other operators do the same.<br>
> ><br>
> > We've been talking about this for close to a year already - we need<br>
> > to actually do something. I don't believe we can do this in a<br>
> > reasonable timeline *and* make everybody (ironic devs, nova devs, and<br>
> > operators) happy. However, as we said elsewhere in the thread, the old<br>
> > model will go through a deprecation process, and we can wait to remove<br>
> > it until we do figure out the path forward for operators like yourself.<br>
> > Then operators that need out-of-tree filters and the like can keep doing<br>
> > what they're doing, while they help us (or just wait) to build something<br>
> > that meets everyone's needs.<br>
> ><br>
> > None of this precludes getting to a better world where Gaant actually<br>
> > exists, or the resource tracker works well with Ironic. It just gets us<br>
> > to an incrementally better model in the meantime.<br>
> ><br>
> > If someone has a *concrete* proposal (preferably in code) for an<br>
> > alternative<br>
> > that can be done relatively quickly and also keep everyone happy here, I'm<br>
> > all ears. But I don't believe one exists at this time, and I'm inclined<br>
> > to keep rolling forward with what we've got here.<br>
> ><br>
> > // jim<br>
> ><br>
> > ><br>
> > > -James<br>
> > ><br>
> > > On Thu, Dec 10, 2015 at 4:42 PM, Jim Rollenhagen <<a href="mailto:jim@jimrollenhagen.com">jim@jimrollenhagen.com</a><br>
> > ><br>
> > > wrote:<br>
> > ><br>
> > > > On Thu, Dec 10, 2015 at 03:57:59PM -0800, Devananda van der Veen wrote:<br>
> > > > > All,<br>
> > > > ><br>
> > > > > I'm going to attempt to summarize a discussion that's been going on<br>
> > for<br>
> > > > > over a year now, and still remains unresolved.<br>
> > > > ><br>
> > > > > TLDR;<br>
> > > > > --------<br>
> > > > ><br>
> > > > > The main touch-point between Nova and Ironic continues to be a pain<br>
> > > > point,<br>
> > > > > and despite many discussions between the teams over the last year<br>
> > > > resulting<br>
> > > > > in a solid proposal, we have not been able to get consensus on a<br>
> > solution<br>
> > > > > that meets everyone's needs.<br>
> > > > ><br>
> > > > > Some folks are asking us to implement a non-virtualization-centric<br>
> > > > > scheduler / resource tracker in Nova, or advocating that we wait for<br>
> > the<br>
> > > > > Nova scheduler to be split-out into a separate project. I do not<br>
> > believe<br>
> > > > > the Nova team is interested in the former, I do not want to wait for<br>
> > the<br>
> > > > > latter, and I do not believe that either one will be an adequate<br>
> > solution<br>
> > > > > -- there are other clients (besides Nova) that need to schedule<br>
> > workloads<br>
> > > > > on Ironic.<br>
> > > > ><br>
> > > > > We need to decide on a path of least pain and then proceed. I really<br>
> > want<br>
> > > > > to get this done in Mitaka.<br>
> > > > ><br>
> > > > ><br>
> > > > > Long version:<br>
> > > > > -----------------<br>
> > > > ><br>
> > > > > During Liberty, Jim and I worked with Jay Pipes and others on the<br>
> > Nova<br>
> > > > team<br>
> > > > > to come up with a plan. That plan was proposed in a Nova spec [1] and<br>
> > > > > approved in October, shortly before the Mitaka summit. It got<br>
> > significant<br>
> > > > > reviews from the Ironic team, since it is predicated on work being<br>
> > done<br>
> > > > in<br>
> > > > > Ironic to expose a new "reservations" API endpoint. The details of<br>
> > that<br>
> > > > > Ironic change were proposed separately [2] but have deadlocked.<br>
> > > > Discussions<br>
> > > > > with some operators at and after the Mitaka summit have highlighted a<br>
> > > > > problem with this plan.<br>
> > > > ><br>
> > > > > Actually, more than one, so to better understand the divergent<br>
> > viewpoints<br>
> > > > > that result in the current deadlock, I drew a diagram [3]. If you<br>
> > haven't<br>
> > > > > read both the Nova and Ironic specs already, this diagram probably<br>
> > won't<br>
> > > > > make sense to you. I'll attempt to explain it a bit with more words.<br>
> > > > ><br>
> > > > ><br>
> > > > > [A]<br>
> > > > > The Nova team wants to remove the (Host, Node) tuple from all the<br>
> > places<br>
> > > > > that this exists, and return to scheduling only based on Compute<br>
> > Host.<br>
> > > > They<br>
> > > > > also don't want to change any existing scheduler filters (especially<br>
> > not<br>
> > > > > compute_capabilities_filter) or the filter scheduler class or plugin<br>
> > > > > mechanisms. And, as far as I understand it, they're not interested in<br>
> > > > > accepting a filter plugin that calls out to external APIs (eg,<br>
> > Ironic) to<br>
> > > > > identify a Node and pass that Node's UUID to the Compute Host.  [[<br>
> > nova<br>
> > > > > team: please correct me on any point here where I'm wrong, or your<br>
> > > > > collective views have changed over the last year. ]]<br>
> > > > ><br>
> > > > > [B]<br>
> > > > > OpenStack deployers who are using Nova + Ironic rely on a few things:<br>
> > > > > - compute_capabilities_filter to match<br>
> > node.properties['capabilities']<br>
> > > > > against flavor extra_specs.<br>
> > > > > - other downstream nova scheduler filters that do other sorts of<br>
> > hardware<br>
> > > > > matching<br>
> > > > > These deployers clearly and rightly do not want us to take away<br>
> > either of<br>
> > > > > these capabilities, so anything we do needs to be backwards<br>
> > compatible<br>
> > > > with<br>
> > > > > any current Nova scheduler plugins -- even downstream ones.<br>
> > > > ><br>
> > > > > [C] To meet the compatibility requirements of [B] without requiring<br>
> > the<br>
> > > > > nova-scheduler team to do the work, we would need to forklift some<br>
> > parts<br>
> > > > of<br>
> > > > > the nova-scheduler code into Ironic. But I think that's terrible,<br>
> > and I<br>
> > > > > don't think any OpenStack developers will like it. Furthermore,<br>
> > operators<br>
> > > > > have already expressed their distase for this because they want to<br>
> > use<br>
> > > > the<br>
> > > > > same filters for virtual and baremetal instances but do not want to<br>
> > > > > duplicate the code (because we all know that's a recipe for drift).<br>
> > > > ><br>
> > > > > [D]<br>
> > > > > What ever solution we devise for scheduling bare metal resources in<br>
> > > > Ironic<br>
> > > > > needs to perform well at the scale Ironic deployments are aiming for<br>
> > (eg,<br>
> > > > > thousands of Nodes) without the use of Cells. It also must be<br>
> > integrable<br>
> > > > > with other software (eg, it should be exposed in our REST API). And<br>
> > it<br>
> > > > must<br>
> > > > > allow us to run more than one (active-active) nova-compute process,<br>
> > which<br>
> > > > > we can't today.<br>
> > > > ><br>
> > > > ><br>
> > > > > OK. That's a lot of words... bear with me, though, as I'm not done<br>
> > yet...<br>
> > > > ><br>
> > > > > This drawing [3] is a Venn diagram, but not everything overlaps. The<br>
> > Nova<br>
> > > > > and Ironic specs [0],[1] meet the needs of the Nova team and the<br>
> > Ironic<br>
> > > > > team, and will provide a more performant, highly-available solution,<br>
> > that<br>
> > > > > is easier to use with other schedulers or datacenter-management<br>
> > tools.<br>
> > > > > However, this solution does not meet the needs of some current<br>
> > OpenStack<br>
> > > > > Operators because it will not support Nova Scheduler filter plugins.<br>
> > > > Thus,<br>
> > > > > in the diagram, [A] and [D] overlap but neither one intersects with<br>
> > [B].<br>
> > > > ><br>
> > > > ><br>
> > > > > Summary<br>
> > > > > --------------<br>
> > > > ><br>
> > > > > We have proposed a solution that fits ironic's HA model into<br>
> > > > nova-compute's<br>
> > > > > failure domain model, but that's only half of the picture -- in so<br>
> > doing,<br>
> > > > > we assumed that scheduling of bare metal resources was simplistic<br>
> > when,<br>
> > > > in<br>
> > > > > fact, it needs to be just as rich as the scheduling of virtual<br>
> > resources.<br>
> > > > ><br>
> > > > > So, at this point, I think we need to accept that the scheduling of<br>
> > > > > virtualized and bare metal workloads are two different problem<br>
> > domains<br>
> > > > that<br>
> > > > > are equally complex.<br>
> > > > ><br>
> > > > > Either, we:<br>
> > > > > * build a separate scheduler process in Ironic, forking the Nova<br>
> > > > scheduler<br>
> > > > > as a starting point so as to be compatible with existing plugins; or<br>
> > > > > * begin building a direct integration between nova-scheduler and<br>
> > ironic,<br>
> > > > > and create a non-virtualization-centric resource tracker within<br>
> > Nova; or<br>
> > > > > * proceed with the plan we previously outlined, accept that this<br>
> > isn't<br>
> > > > > going to be backwards compatible with nova filter plugins, and<br>
> > apologize<br>
> > > > to<br>
> > > > > any operators who rely on the using the same scheduler plugins for<br>
> > > > > baremetal and virtual resources; or<br>
> > > > > * keep punting on this, bringing pain and suffering to all operators<br>
> > of<br>
> > > > > bare metal clouds, because nova-compute must be run as exactly one<br>
> > > > process<br>
> > > > > for all sizes of clouds.<br>
> > > ><br>
> > > > Thanks for summing this up, Deva. The planned solution still gets my<br>
> > > > vote; we build that, deprecate the old single compute host model where<br>
> > > > nova handles all scheduling, and in the meantime figure out the gaps<br>
> > > > that operators need filled and the best way to fill them. Maybe we can<br>
> > > > fill them by the end of the deprecation period (it's going to need to<br>
> > be<br>
> > > > a couple cycles), or maybe operators that care about these things need<br>
> > > > to carry some downstream patches for a bit.<br>
> > > ><br>
> > > > I'd be curious how many ops out there run ironic with custom scheduler<br>
> > > > filters, or rely on the compute capabilities filters. Rackspace has one<br>
> > > > out of tree weigher for image caching, but are okay with moving forward<br>
> > > > and doing what it takes to move that.<br>
> > > ><br>
> > > > // jim<br>
> > > ><br>
> > > > ><br>
> > > > ><br>
> > > > > Thanks for reading,<br>
> > > > > Devananda<br>
> > > > ><br>
> > > > ><br>
> > > > ><br>
> > > > > [0] Yes, there are some hacks to work around this, but they are bad.<br>
> > > > Please<br>
> > > > > don't encourage their use.<br>
> > > > ><br>
> > > > > [1] <a href="https://review.openstack.org/#/c/194453/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/194453/</a><br>
> > > > ><br>
> > > > > [2] <a href="https://review.openstack.org/#/c/204641/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/204641/</a><br>
> > > > ><br>
> > > > > [3]<br>
> > > > ><br>
> > > ><br>
> > <a href="https://drive.google.com/file/d/0Bz_nyJF_YYGZWnZ2dlAyejgtdVU/view?usp=sharing" rel="noreferrer" target="_blank">https://drive.google.com/file/d/0Bz_nyJF_YYGZWnZ2dlAyejgtdVU/view?usp=sharing</a><br>
> > > ><br>
> > > > ><br>
> > > ><br>
> > __________________________________________________________________________<br>
> > > > > OpenStack Development Mailing List (not for usage questions)<br>
> > > > > Unsubscribe:<br>
> > > > <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
> > > > > <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> > > ><br>
> > > ><br>
> > > ><br>
> > __________________________________________________________________________<br>
> > > > OpenStack Development Mailing List (not for usage questions)<br>
> > > > Unsubscribe:<br>
> > <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
> > > > <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> > > ><br>
> ><br>
> > ><br>
> > __________________________________________________________________________<br>
> > > OpenStack Development Mailing List (not for usage questions)<br>
> > > Unsubscribe:<br>
> > <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
> > > <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> ><br>
> ><br>
> > __________________________________________________________________________<br>
> > OpenStack Development Mailing List (not for usage questions)<br>
> > Unsubscribe: <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
> > <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
> ><br>
<br>
> __________________________________________________________________________<br>
> OpenStack Development Mailing List (not for usage questions)<br>
> Unsubscribe: <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
> <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
<br>
<br>
__________________________________________________________________________<br>
OpenStack Development Mailing List (not for usage questions)<br>
Unsubscribe: <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</div></div></blockquote></div><br></div></div>