<div dir="ltr"><div>Sam, Flavio, Zhenyu, Daniel thank you for your responses!<br><br>Indeed, we're in a difficult position with activating zero-size images... To fix it we have to solve 2 problems: one with disk and container formats parameters - glance v2 doesn't allow activate images if these two are unset; and the second with image data - glance v2 requires some data to be passed before image activation.<br><br>About formats: I don't see any good solution rather than to hardcode them for Glance and then ignore in Nova. If you can figure out a better one, please share :) But changing image schema - no way!<br><br>About data: afaiu, block_device_mapping property contains volume_id. That means we may take it out and activate an image by providing new location, i.e. cinder://volume_id. The problem is setting custom locations for image is disabled by default and enabling it may cause serious mishaps. <br>My solution was to provide empty data (not 1 byte as Sam said) with image-upload, it leads to image activation and it works. Unfortunately, it's just another workaround, because we create absolutely unnecessary empty file in store and after that users can download it, which is wrong. But we can improve it on glance side: if we provide empty data in image-upload, glance won't create a file in store and set location to the image (in other words - avoid Location layer in Glance domain model). In that case these operation will be identical (v1:image-create(size=0) and v2:image-create()+image-upload(data='')).<br></div><div><br>Frankly speaking I wish to see more feedback on this matter, because we will have to make difficult decisions or Nova will never adopt Glance v2 api.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 8, 2016 at 10:14 PM, Sam Matzek <span dir="ltr"><<a href="mailto:matzeksam@gmail.com" target="_blank">matzeksam@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, Jan 8, 2016 at 11:54 AM, Sam Matzek <<a href="mailto:matzeksam@gmail.com">matzeksam@gmail.com</a>> wrote:<br>
> On Fri, Jan 8, 2016 at 8:31 AM, Flavio Percoco <<a href="mailto:flavio@redhat.com">flavio@redhat.com</a>> wrote:<br>
>> On 29/12/15 07:41 -0600, Sam Matzek wrote:<br>
>>><br>
>>> On Thu, Dec 24, 2015 at 7:49 AM, Mikhail Fedosin <<a href="mailto:mfedosin@mirantis.com">mfedosin@mirantis.com</a>><br>
>>> wrote:<br>
>>>><br>
>>>> Hello, it's another topic about glance v2 adoption in Nova, but it's<br>
>>>> different from the others. I want to declare that there is a set of<br>
>>>> commits,<br>
>>>> that make Nova version agnostic and allow to work with both glance apis.<br>
>>>> The<br>
>>>> idea of the solution is to determine the current api version in the<br>
>>>> beginning and make appropriate requests after.<br>
>>>> (<a href="https://review.openstack.org/#/c/228578/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/228578/</a>,<br>
>>>> <a href="https://review.openstack.org/#/c/238309/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/238309/</a>,<br>
>>>> <a href="https://review.openstack.org/#/c/259097/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/259097/</a>)<br>
>>>><br>
>>>> Indeed, it requires some additional (and painful) work, but now all<br>
>>>> tempest<br>
>>>> tests pass in Jenkins.<br>
>>>><br>
>>>> Note: this thread is not about xenplugin, there is another topic, called<br>
>>>> 'Xenplugin + Glance_v2 = Hate'<br>
>>>><br>
>>>> Here the main issues we faced and how we've solved them:<br>
>>>><br>
>>>> 1. "changes-since" filter for image-list is not supported in v2 api.<br>
>>>> Steve<br>
>>>> Lewis made a great job and implemented a set of filters with comparison<br>
>>>> operators <a href="https://review.openstack.org/#/c/197388/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/197388/</a>. Filtering by<br>
>>>> 'changes-since' is completely similar to 'gte:updated_at'.<br>
>>>><br>
>>>> 2. Filtering by custom properties must have prefix 'property-'. In v2<br>
>>>> it's<br>
>>>> not required.<br>
>>>><br>
>>>> 3. V2 states that all custom properties must be image attributes, but<br>
>>>> Nova<br>
>>>> assumes that they are included in 'properties' dictionary. It's fixed<br>
>>>> with<br>
>>>> glanceclient's method 'is_base_property(prop_name)', that returns False<br>
>>>> in<br>
>>>> case of custom property.<br>
>>>><br>
>>>> 4. is_public=True/False is visibility="public"/"private" respectively.<br>
>>>><br>
>>>> 5. Deleting custom image properties in Nova is performed with<br>
>>>> 'purge_props'<br>
>>>> flag. If it's set to True, then all prop names, that are not included in<br>
>>>> updated data, will be removed. In case of v2 we have to explicitly<br>
>>>> specify<br>
>>>> prop names in the list param 'remove_props'. To implement this behaviour,<br>
>>>> if<br>
>>>> 'purge_props' is set, we make additional 'get' request to determine the<br>
>>>> existing properties and put in 'remove_prop' list only those, that are<br>
>>>> not<br>
>>>> in updated_data.<br>
>>>><br>
>>>> 6. My favourite:<br>
>>>> There is an ability to activate an empty image by just providing 'size =<br>
>>>> 0':<br>
>>>> <a href="https://review.openstack.org/#/c/9715/" rel="noreferrer" target="_blank">https://review.openstack.org/#/c/9715/</a>, in this case image will be a<br>
>>>> collection of metadata. Glance v2 doesn't support this "feature" and<br>
>>>> that's<br>
>>>> why we have to implement a very dirty workaround:<br>
>>>>     * v2 requires, that disk_format and container-format must be set<br>
>>>> before<br>
>>>> the activation. if these params are not provided to 'create' method then<br>
>>>> we<br>
>>>> hardcode it to 'qcow2' and 'bare'.<br>
>>>>     * we call 'upload' method with empty data (data = '') to activate<br>
>>>> image.<br>
>>>> Me (and the rest glance team) think that this image activation with<br>
>>>> zero-size is inconsistent and we won't implement it in v2. So, I'm going<br>
>>>> to<br>
>>>> ask if Nova really needs this feature and maybe it's possible to make it<br>
>>>> work without it.<br>
>>><br>
>>><br>
>>> Nova uses this functionality when it creates snapshots of volume<br>
>>> backed instances, that is, instances that only have Cinder volumes<br>
>>> attached and do not have an ephemeral disk.<br>
>>> In this case Nova API creates Cinder snapshots for the Cinder volumes<br>
>>> and builds the block_device_mapping property with block devices that<br>
>>> reference the Cinder snapshots.  Nova activates this image with size=0<br>
>>> because this image does not have a disk and simply refers to the<br>
>>> collection of Cinder snapshots that collectively comprise the binary<br>
>>> image.  Callers of Glance outside of Nova may also use the APIs to<br>
>>> create "block device mapping" images as well that contain references<br>
>>> to Cinder volumes to attach, blank volumes to create, snapshots to<br>
>>> create volumes from, etc during the server creation.  Not having the<br>
>>> ability to create these images with V2 is a loss of function.<br>
>><br>
>><br>
>> I disagree. Being able to activate empty images breaks the consistency<br>
>> of Glances API and I don't think it should be considered a feature but<br>
>> a bug. An active image is an image that can be used to *boot* a VM. If<br>
>> the image is empty, you simply can't do that.<br>
>><br>
>> Note that pointing to a block device makes the image "non-empty"<br>
>> already. There's a spec merged[0] and code written[1] to allow for<br>
>> using cinder as backend for Glance.<br>
>><br>
>> If there's a missing functionality for the mapping users require, I<br>
>> believe activating empty images is not the solution for it.<br>
>><br>
>> [0] <a href="https://review.openstack.org/183363" rel="noreferrer" target="_blank">https://review.openstack.org/183363</a><br>
>> [1] <a href="https://review.openstack.org/166414" rel="noreferrer" target="_blank">https://review.openstack.org/166414</a><br>
>><br>
>>> The callers could supply 1 byte of junk data, like a space character,<br>
>>> but that would result in a junk image being stored in Glance's default<br>
>>> backing store for the image.  It would also give the impression that a<br>
>>> real disk image exists for the image in a backing store which could be<br>
>>> fetched, which is incorrect.<br>
>>><br>
>>> If I remember correctly Glance V2 lets you transition an image from<br>
>>> queued to active state with size = 0 if the image is using an external<br>
>>> backing store such as http.  The store is then called to fetch the<br>
>>> size.  Would it be possible to allow Glance to consider images with<br>
>>> size = 0 and the block_device_mapping property to be "externally<br>
>>> sourced" and allow the transition?<br>
>><br>
>><br>
>> In v2 you can create an image and then add a location for it (this<br>
>> should be enabled, of course). You can even use cinder locations since<br>
>> Kilo (or Havana?).<br>
><br>
> I don't believe Cinder backing store / Cinder locations can work for<br>
> the Nova use case here.  In the case of this use case, Nova snapshot<br>
> of Cinder backed VM, Nova creates Cinder snapshots of every attached<br>
> Cinder volume and puts the snapshots in a BDM list in the Glance<br>
> metadata, and moves the image to Active with size = 0 and no volume.<br>
><br>
> This inherently creates an image that is pointing at a collection of<br>
> multiple image binaries (Cinder snapshots) that collectively make up<br>
> the "image".  For example the Cinder snapshots could be snapshot0 =<br>
> boot disk, snapshot1 = application binaries, snapshot1 = DB volume 1<br>
> snapshot2 = DB volume 2.<br>
><br>
> I may be wrong, but my understanding of multiple location support in<br>
> Glance is that the multiple locations are intended to all contain<br>
> copies / mirrors of the same image binary (singular), and the image<br>
> consumer, say, a Nova virt driver, could look at the locations and<br>
> make the best choice of location based on its settings for ephemeral<br>
> disk backing, etc.  If this is the correct understanding then the<br>
> multiple locations support using Cinder the Cinder backing store to<br>
> reference multiple Cinder snapshots of different Cinder volumes is not<br>
> a good fit.<br>
><br>
> Now possibly a compromise could exist where in the "snapshot volume<br>
> backed VM" flow, Nova changes to set location of the Glance image to<br>
> be the Cinder snapshot of the boot disk / root BDM, and then puts the<br>
> non-root BDM volumes in the block_device_mapping image metadata.<br>
><br>
> This would make the image non-empty and would use the Cinder backing<br>
> store for the boot disk while maintaining the existing functionality<br>
> of having the image refer to the other Cinder snapshots in the block<br>
> device mapping metadata.<br>
<br>
</div></div>I sent the previous reply a bit prematurely.  In order for my idea<br>
above to work, to have the Glance image use a Cinder location /<br>
backing store for the boot disk in this case, the Cinder backing store<br>
[1] needs to be enhanced to support Cinder snapshots as well as Cinder<br>
volumes.<br>
[1] <a href="https://github.com/openstack/glance_store/blob/master/glance_store/_drivers/cinder.py" rel="noreferrer" target="_blank">https://github.com/openstack/glance_store/blob/master/glance_store/_drivers/cinder.py</a><br>
<div class="HOEnZb"><div class="h5"><br>
><br>
><br>
>><br>
>> Cheers,<br>
>> Flavio<br>
>><br>
>> --<br>
>> @flaper87<br>
>> Flavio Percoco<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>