)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"b90cd8a4839f1d68d0b98234014a5c474eac670b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"are renamed to ensure a consistent naming scheme across"},{"line_number":18,"context_line":"drivers."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-authored: Dennis Kliban \u003cdkliban@redhat.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Blueprint: request-spec-object"},{"line_number":23,"context_line":"Change-Id: I60162b8bae0aa44861bcbac5d215c49e8eda7c21"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a016987_33a3bda0","line":20,"updated":"2015-05-27 08:15:32.000000000","message":"Think this should be \"Co-Authored-By\".","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e2ae679a45e10d818dea0355430b27f484b351cc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"are renamed to ensure a consistent naming scheme across"},{"line_number":18,"context_line":"drivers."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-authored: Dennis Kliban \u003cdkliban@redhat.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Blueprint: request-spec-object"},{"line_number":23,"context_line":"Change-Id: I60162b8bae0aa44861bcbac5d215c49e8eda7c21"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a016987_c8682bbd","line":20,"in_reply_to":"7a016987_33a3bda0","updated":"2015-05-27 12:39:31.000000000","message":"minor nit, let\u0027s merge this change anyway","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"36108fe8129e3b4e13c301843b09e05da48ad50f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"are renamed to ensure a consistent naming scheme across"},{"line_number":18,"context_line":"drivers."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-authored: Dennis Kliban \u003cdkliban@redhat.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Blueprint: request-spec-object"},{"line_number":23,"context_line":"Change-Id: I60162b8bae0aa44861bcbac5d215c49e8eda7c21"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a016987_afe2672d","line":20,"in_reply_to":"7a016987_c8682bbd","updated":"2015-05-28 12:42:10.000000000","message":"Might be minor but I don\u0027t think it will get picked up this way so not sure it makes a lot of sense to keep it like this.","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"}],"nova/network/model.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dbd6d5ae4f993dce1b8ed5e5e24c5879669b38b9","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    VIF_MODEL_E1000,"},{"line_number":90,"context_line":"    VIF_MODEL_E1000E,"},{"line_number":91,"context_line":"    VIF_MODEL_NETFRONT,"},{"line_number":92,"context_line":"    VIF_MODEL_SPAPR_VLAN,"},{"line_number":93,"context_line":")"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Constant for max length of network interface names"}],"source_content_type":"text/x-python","patch_set":36,"id":"5afe65bd_18e8f5e1","line":92,"updated":"2015-06-02 12:38:49.000000000","message":"I think that this will break the VMware driver. The following are currently supported:\nhttps://github.com/openstack/nova/blob/master/nova/virt/vmwareapi/vm_util.py#L54","commit_id":"48e125e4e393e431ed01d2502f7175a611b7e680"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"7532f637a1f2f1c9a9825671f83f8163b6d05aab","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    VIF_MODEL_E1000,"},{"line_number":90,"context_line":"    VIF_MODEL_E1000E,"},{"line_number":91,"context_line":"    VIF_MODEL_NETFRONT,"},{"line_number":92,"context_line":"    VIF_MODEL_SPAPR_VLAN,"},{"line_number":93,"context_line":")"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Constant for max length of network interface names"}],"source_content_type":"text/x-python","patch_set":36,"id":"5afe65bd_d2d8f9f1","line":92,"in_reply_to":"5afe65bd_1855954f","updated":"2015-06-02 13:48:16.000000000","message":"NB this will not actually break the VMware driver, since this patch merely introduces the object model, but does not convert any code to use it.\n\nSo I think it\u0027d be preferrable to add any extra VIF models as a patch that follows this one, so we avoid two unrelated changes in one file. We just need to be sure they\u0027re added before the vmware driver is converted.","commit_id":"48e125e4e393e431ed01d2502f7175a611b7e680"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d6982c0bfa1f5869c9c3f102a26373a7360c9166","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    VIF_MODEL_E1000,"},{"line_number":90,"context_line":"    VIF_MODEL_E1000E,"},{"line_number":91,"context_line":"    VIF_MODEL_NETFRONT,"},{"line_number":92,"context_line":"    VIF_MODEL_SPAPR_VLAN,"},{"line_number":93,"context_line":")"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Constant for max length of network interface names"}],"source_content_type":"text/x-python","patch_set":36,"id":"5afe65bd_1855954f","line":92,"in_reply_to":"5afe65bd_18e8f5e1","updated":"2015-06-02 12:45:49.000000000","message":"Those are vmware specific names - my understanding was that vmware accepted the standard names and converted them to its internal name. ie we should not have both \u0027e1000\u0027 and \u0027VirtualE1000\u0027 as public facing vif names. Though i see we\u0027re missing a few of the names.","commit_id":"48e125e4e393e431ed01d2502f7175a611b7e680"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"6be443b33900d76353a1aada1e5adb5971283840","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    VIF_MODEL_E1000,"},{"line_number":90,"context_line":"    VIF_MODEL_E1000E,"},{"line_number":91,"context_line":"    VIF_MODEL_NETFRONT,"},{"line_number":92,"context_line":"    VIF_MODEL_SPAPR_VLAN,"},{"line_number":93,"context_line":")"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Constant for max length of network interface names"}],"source_content_type":"text/x-python","patch_set":36,"id":"5afe65bd_6eab68d7","line":92,"in_reply_to":"5afe65bd_d2d8f9f1","updated":"2015-06-03 13:35:19.000000000","message":"ok, i\u0027ll update","commit_id":"48e125e4e393e431ed01d2502f7175a611b7e680"}],"nova/objects/fields.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39ed76f8337c07c37e388893194e699cafe13251","unresolved":false,"context_lines":[{"line_number":270,"context_line":"                             \u0027 of permitted values\u0027)"},{"line_number":271,"context_line":"        if length \u003d\u003d 0:"},{"line_number":272,"context_line":"            raise ValueError(\u0027valid_values may not be empty\u0027)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        self._valid_values \u003d valid_values"},{"line_number":275,"context_line":"        super(Enum, self).__init__(**kwargs)"},{"line_number":276,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1aca2d91_0e3cc8c6","line":273,"updated":"2015-05-08 16:17:36.000000000","message":"Stray whitespace!","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39ed76f8337c07c37e388893194e699cafe13251","unresolved":false,"context_lines":[{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def __init__(self):"},{"line_number":448,"context_line":"        super(WatchdogAction, self).__init__("},{"line_number":449,"context_line":"            valid_values\u003dWatchdogAction.ALL)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"class UUID(FieldType):"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aca2d91_aeba7408","line":449,"updated":"2015-05-08 16:17:36.000000000","message":"Per the previous patch, I think putting these straight into the image_meta.py file makes the most sense.","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"639738912c73d6cbe9fd54f9254ce341b5e68dbc","unresolved":false,"context_lines":[{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def __init__(self):"},{"line_number":448,"context_line":"        super(WatchdogAction, self).__init__("},{"line_number":449,"context_line":"            valid_values\u003dWatchdogAction.ALL)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"class UUID(FieldType):"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aca2d91_cec9307a","line":449,"in_reply_to":"1aca2d91_aeba7408","updated":"2015-05-08 16:21:33.000000000","message":"Actually the reason I put them in this file, is that several of these enums are going to be referenced from multiple different objects, so we want them in a centralized place, not tied to any single object.  In fact if we objectify flavour extra specs, all of these will be used from at least 2 objects, sometimes 3 or 4.\n\nHow about my idea from the comment on the previous patch about creating a nova/objects/enums.py file to hold them instead of bloating fields.py too much","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"deb7bc2373c633ff54525a8a62ec513f3b19ae37","unresolved":false,"context_lines":[{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def __init__(self):"},{"line_number":448,"context_line":"        super(WatchdogAction, self).__init__("},{"line_number":449,"context_line":"            valid_values\u003dWatchdogAction.ALL)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"class UUID(FieldType):"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aca2d91_8e61f83b","line":449,"in_reply_to":"1aca2d91_cec9307a","updated":"2015-05-08 16:26:15.000000000","message":"Yep, enums is fine. Having the objects import each other creates a bit of a hierarchy of where a thing is owned, or where it comes from (i.e. first comes from the user as part of image_meta, but filters down to FoobarObject eventually).\n\nI\u0027m a little mixed on the define-it-close-to-the-object thing, but if it\u0027s used in multiple places then you lose that anyway.\n\nSounds like enums is the way to go at least for now.","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ffbe257134d466b7ef3a918c38144d7d49fb2d1","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            valid_values\u003dcpumodel.ALL_POLICIES, **kwargs)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"class DiskBus(Enum):"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    FDC \u003d \"fdc\""},{"line_number":349,"context_line":"    IDE \u003d \"ide\""}],"source_content_type":"text/x-python","patch_set":37,"id":"ba3cc151_69d044ca","line":346,"updated":"2015-07-06 19:18:00.000000000","message":"Is it just me or is uml and lxc missing from this enum?\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/virt/libvirt/blockinfo.py#n112","commit_id":"40c2a4d6b05db879f976fc7eaf7a1a5aa93b270c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fec18ed9c554754cc0d4fc15344bdead275c2c2e","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        elif value \u003d\u003d \"virtualvmxnet\":"},{"line_number":471,"context_line":"            value \u003d network_model.VIF_MODEL_VMXNET"},{"line_number":472,"context_line":"        elif value \u003d\u003d \"virtualvmxnet3\":"},{"line_number":473,"context_line":"            value \u003d network_model.VIF_MODEL_VMXNET3"},{"line_number":474,"context_line":"        return super(VIFModel, self).coerce(obj, attr, value)"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5afe65bd_05004ea9","line":473,"updated":"2015-06-03 15:25:02.000000000","message":"Feels like this should be a dict...","commit_id":"40c2a4d6b05db879f976fc7eaf7a1a5aa93b270c"}],"nova/objects/image_meta.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    #"},{"line_number":40,"context_line":"    # The latter being missing is probably a bug..."},{"line_number":41,"context_line":"    fields \u003d {"},{"line_number":42,"context_line":"        \u0027id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_cc6f32f9","line":42,"updated":"2015-01-13 16:43:22.000000000","message":"Is this really nullable? Can we ever tolerate an image with no id? The same goes for the rest of these. They should only be nullable if None is a valid value for them. If they can just simply be unspecified, then they should not be nullable. That\u0027s why we have obj_attr_is_set().","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                if key \u003d\u003d \"properties\":"},{"line_number":80,"context_line":"                    self.properties \u003d objects.ImageMetaProps()"},{"line_number":81,"context_line":"                elif key not in [\"id\", \"created_at\"]:"},{"line_number":82,"context_line":"                    setattr(self, key, None)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def _validate_prop_names(cls, image_meta):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_0c5bfa22","line":82,"updated":"2015-01-13 16:43:22.000000000","message":"Why is this needed? This should be provided by the base class __init__. If it\u0027s broken for something, we should fix it.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f8ab5feb249075ee3d864e6569c529c0c1ea5759","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                if key \u003d\u003d \"properties\":"},{"line_number":80,"context_line":"                    self.properties \u003d objects.ImageMetaProps()"},{"line_number":81,"context_line":"                elif key not in [\"id\", \"created_at\"]:"},{"line_number":82,"context_line":"                    setattr(self, key, None)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def _validate_prop_names(cls, image_meta):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_9618acce","line":82,"in_reply_to":"3a961159_0c5bfa22","updated":"2015-01-14 16:14:38.000000000","message":"So this is really gets to the root cause of all the questions you ask on this patch.\n\nBasically for a given attribute \u0027foo\u0027\n\n   \"foo\": fields.StringField()\n\nif the attribute is set then \u0027obj.foo\u0027 should return the value obviously, but if it is not set then I want/need it to return \u0027None\u0027\n\nIf I have the field non-nulluable though, attempting to access an unset attribute results in an exception being raised eg:\n\n  File \"nova/tests/unit/objects/test_image_meta_props.py\", line 43, in test_default_props\n    self.assertIsNone(getattr(virtprops, prop))\n  File \"nova/objects/base.py\", line 72, in getter\n    self.obj_load_attr(name)\n  File \"nova/objects/base.py\", line 507, in obj_load_attr\n    _(\"Cannot load \u0027%s\u0027 in the base class\") % attrname)\nNotImplementedError: Cannot load \u0027img_cache_in_nova\u0027 in the base class\n\nWhen I looked it seems NovaObject is explicitly designed to raise an exception if an attribute does not have a value set.\n\nSo the only way I could get the behaviour desired, was to allow the fields to be nullable, and initialize them all to None in the constructor, and add all these other (temporary) hacks for dict-access compat.\n\nI don\u0027t want to have to update all of nova image meta handling code to test  obj_attr_is_set before accessing attributes that may not have a value set\n\n  if image_meta.obj_attr_is_set(foo)\n      image_meta.foo\n  else\n      None\n\nI just want  image_meta.foo to evaluate to None if no value is set, instead of raising an exception","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"05482133baa19654b5831e4bf8685bb7f1d53a7e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                if key \u003d\u003d \"properties\":"},{"line_number":80,"context_line":"                    self.properties \u003d objects.ImageMetaProps()"},{"line_number":81,"context_line":"                elif key not in [\"id\", \"created_at\"]:"},{"line_number":82,"context_line":"                    setattr(self, key, None)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def _validate_prop_names(cls, image_meta):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da86d52c_b47256ab","line":82,"in_reply_to":"3a961159_9618acce","updated":"2015-02-02 17:53:17.000000000","message":"If the property is nullable\u003dTrue and default\u003dNone, then the base infrastructure should provide the behavior you have here. Did you try that?\n\nHowever, I know it\u0027s more work, but I personally think that the right behavior is to treat unset as unset, and None as None. They mean two very different things, and if you conflate the two then you\u0027re throwing away information. Presumably we could have some image property for which None is a valid value, which would mean something different than \"unspecified\". So, my vote would be to change the code that uses this to properly check for \"is set\" and \"is none\" separately, and also to have properties for which None is not a valid value be non-nullable in the definition. Most of them would be non-nullable in that case I think, so it\u0027s not like all the code would need to check for multiple things.\n\nSince the existing code is looking at a dict, presumably it\u0027s using either \"in\" or .get() to gracefully handle the present/missing cases, right? Since you mixin the dict compatibility layer here, won\u0027t the code mostly do the right thing already?","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                if cls.STRICT_PROP_NAMES:"},{"line_number":89,"context_line":"                    raise Exception(_LE(\"Unknown property \u0027%s\u0027\") % key)"},{"line_number":90,"context_line":"                else:"},{"line_number":91,"context_line":"                    LOG.debug(\"Unknown property \u0027%s\u0027\", key)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def _from_dict(cls, image_meta):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_0c4e9a38","line":91,"updated":"2015-01-13 16:43:22.000000000","message":"This should be automatic if using the dict syntax -- trying to set an item that doesn\u0027t exist as a field will fail. I think we should build in support to the base class to not allow setting non-field attributes if they don\u0027t start with _. We have some local scratch data we store in some of them, but those are prefixed with an underscore. I can cook up a patch to do this, which will benefit all the other objects as well and pull out some of what you\u0027re doing here.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        if ret is None:"},{"line_number":140,"context_line":"            return None"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return ret"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def __setitem__(self, name, value):"},{"line_number":145,"context_line":"        \"\"\"For backwards-compatibility with dict-based objects."}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_0c65baae","line":142,"updated":"2015-01-13 16:43:22.000000000","message":"What is the purpose of this method? You inherit from the compatibility mix-in, so you don\u0027t need this do you?","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        if name \u003d\u003d \"properties\" and type(value) \u003d\u003d dict:"},{"line_number":151,"context_line":"            value \u003d objects.ImageMetaProps._from_dict(value)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        return super(ImageMeta, self).__setitem__(name, value)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def get(self, name, value\u003dbase.NotSpecifiedSentinel):"},{"line_number":156,"context_line":"        \"\"\"For backwards-compatibility with dict-based objects."}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_8cb52aef","line":153,"updated":"2015-01-13 16:43:22.000000000","message":"How many places depend on this? Could we reasonably just convert them all instead of having this translation?","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        if ret is None:"},{"line_number":164,"context_line":"            return None"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        return ret"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def pop(self, name, value\u003dbase.NotSpecifiedSentinel):"},{"line_number":169,"context_line":"        \"\"\"For backwards-compatibility with dict-based objects."}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_2c9fd666","line":166,"updated":"2015-01-13 16:43:22.000000000","message":"Like getitem, this seems unnecessary.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        for key in self.fields.keys():"},{"line_number":186,"context_line":"            if self.obj_attr_is_set(key):"},{"line_number":187,"context_line":"                ret.append(key)"},{"line_number":188,"context_line":"        return ret"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def obj_attr_is_set(self, attrname):"},{"line_number":191,"context_line":"        \"\"\"For backwards-compatibility with dict-based objects."}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_6c80fef7","line":188,"updated":"2015-01-13 16:43:22.000000000","message":"pop() and keys() should go on the NovaObjectDictCompat mixin, right?","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        isset \u003d super(ImageMeta, self).obj_attr_is_set(attrname)"},{"line_number":197,"context_line":"        # We need all attributes to always exist, but with"},{"line_number":198,"context_line":"        # a None value. So the standard obj_attr_is_set test"},{"line_number":199,"context_line":"        # does not work, hence this override."},{"line_number":200,"context_line":"        if isset and getattr(self, attrname) is None:"},{"line_number":201,"context_line":"            return False"},{"line_number":202,"context_line":"        return isset"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_4cc8a221","line":199,"updated":"2015-01-13 16:43:22.000000000","message":"If this is the case, why don\u0027t we just set them all to None in the constructor? If this returns true, then we assume that we can access the attribute, which would fail (or try to lazy load) if it\u0027s really not set. However, as I said above, I don\u0027t think they all should be nullable.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from nova import utils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ImageMeta(base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_ae2be7ea","line":25,"updated":"2015-04-29 12:56:49.000000000","message":"not necessary","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"133ec0da3645c18ede5dfa6e529b023acc66f827","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from nova import utils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ImageMeta(base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_7a025140","line":25,"in_reply_to":"5ad0253b_ae2be7ea","updated":"2015-04-29 14:50:10.000000000","message":"Opps, yeah, left over from rebase","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ImageMeta(base.NovaObject):"},{"line_number":29,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # These are driven by what the image client API returns"}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_ae888723","line":28,"updated":"2015-04-29 12:56:49.000000000","message":"it would be preferrable to use NovaPersistentObject also","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"133ec0da3645c18ede5dfa6e529b023acc66f827","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ImageMeta(base.NovaObject):"},{"line_number":29,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # These are driven by what the image client API returns"}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_5a8675ba","line":28,"in_reply_to":"5ad0253b_ae888723","updated":"2015-04-29 14:50:10.000000000","message":"Yep, I see that can do the trick.","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    #"},{"line_number":36,"context_line":"    # The latter being missing is probably a bug..."},{"line_number":37,"context_line":"    fields \u003d {"},{"line_number":38,"context_line":"        \u0027id\u0027: fields.StringField(),"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_ce1d03bf","line":38,"updated":"2015-04-29 12:56:49.000000000","message":"I just wonder if it would be better to coerce against fields.UUIDField() ?","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"133ec0da3645c18ede5dfa6e529b023acc66f827","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    #"},{"line_number":36,"context_line":"    # The latter being missing is probably a bug..."},{"line_number":37,"context_line":"    fields \u003d {"},{"line_number":38,"context_line":"        \u0027id\u0027: fields.StringField(),"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_1a90fdeb","line":38,"in_reply_to":"5ad0253b_ce1d03bf","updated":"2015-04-29 14:50:10.000000000","message":"Possibly, will need to investigate if glance guarantees this is always in UUID format or not","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \u0027created_at\u0027: fields.DateTimeField(),"},{"line_number":49,"context_line":"        \u0027updated_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027deleted\u0027: fields.BooleanField(),"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        \u0027disk_format\u0027: fields.StringField(),"},{"line_number":54,"context_line":"        \u0027container_format\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_4e87b30f","line":51,"updated":"2015-04-29 12:56:49.000000000","message":"as said L28, all of them can be provided by the above mixin","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # sub-object, to avoid callers having to check if it exists"},{"line_number":75,"context_line":"        # or not"},{"line_number":76,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":77,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_ceef43af","line":77,"updated":"2015-04-29 12:56:49.000000000","message":"Mmm, I wonder why we would need to lazy-load an ImageMetaProps object if that object would be empty.\n\nPerhaps this is not needed, and we just need to check obj_attr_is_set() for any call we do to the future ImageMeta.properties field ?","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3829ad2a0bf117beb77acde93453f5bd0213d5e0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # sub-object, to avoid callers having to check if it exists"},{"line_number":75,"context_line":"        # or not"},{"line_number":76,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":77,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_7b37f0e3","line":77,"in_reply_to":"3acd31a7_4976b13f","updated":"2015-04-29 16:12:27.000000000","message":"NB, this isn\u0027t changing the behaviour for persistence - only the behaviour for access.\n\nI think the default semantics of attribute access here will lead to error prone code - people will just access the attribute and forget to do the obj_is_attr_check() and/or not realize they should instead use the custom get-like() method. I think doing this default value on attribute access will reduce the buggyness of the code in general when using these objects. It makes no sense for the default semantics to be tailored to a usage pattern that the callers will never want to have.","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"06817fc7829723cf1ec9045a236b3dd44b45e008","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # sub-object, to avoid callers having to check if it exists"},{"line_number":75,"context_line":"        # or not"},{"line_number":76,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":77,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_e9be9dd3","line":77,"in_reply_to":"3acd31a7_7a0c9142","updated":"2015-04-29 16:01:36.000000000","message":"Do you have some cases where the properties are not provided when calling the image_meta dict ?\n\nIf we consider that, then the properties field just has to be consider nullable\u003dTrue, that still doesn\u0027t require a specific initialization IMHO","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e703837f950340d7b8ba3292f5dc0da511df1216","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # sub-object, to avoid callers having to check if it exists"},{"line_number":75,"context_line":"        # or not"},{"line_number":76,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":77,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_4976b13f","line":77,"in_reply_to":"3acd31a7_7a0c9142","updated":"2015-04-29 16:03:34.000000000","message":"We could be dict-like and have a .get() method here that returns none if the attribute is not set. It\u0027s only a few more characters for each access:\n\n  thing \u003d imagemeta.properties.get(\u0027thing\u0027)\n\nCall it \"safe_get\" or \"maybe_get\" or \"danpb_get\" if the dict correlation bothers you :)\n\nIn any case, I think that fundamentally changing how this object behaves, both for persistence and the developer-facing api is a bad idea.","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d9251a1646f4799585ad6dbbfa00f8049b241b5a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # sub-object, to avoid callers having to check if it exists"},{"line_number":75,"context_line":"        # or not"},{"line_number":76,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":77,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_092b19ed","line":77,"in_reply_to":"3acd31a7_e9be9dd3","updated":"2015-04-29 16:06:40.000000000","message":"The current code does not require \u0027properties\u0027 to be set in the image_meta dict - the common access pattern in virt driver code today is image_meta.get(\u0027properties\u0027, {})  to take account of this. When we objectify this, and use attribute access instead of get(), then we don\u0027t have scope for passing in a default {} in this way. Overloading the obj_load_attr method is the way to achieve the same end result here.","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"133ec0da3645c18ede5dfa6e529b023acc66f827","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # sub-object, to avoid callers having to check if it exists"},{"line_number":75,"context_line":"        # or not"},{"line_number":76,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":77,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_7a0c9142","line":77,"in_reply_to":"5ad0253b_ceef43af","updated":"2015-04-29 14:50:10.000000000","message":"If we don\u0027t do this, then all code needs to do\n\n   if image_meta.obj_attr_is_set(\"properties\") and image_meta.properties.obj_attr_is_set(\"hw_disk_bus\"):\n     disk_bus \u003d image_meta.properties.hw_disk_bus\n  else:\n     disk_bus \u003d None\n\nThere are *sooo* many accesses to image properties that this repeated conditional test will be a huge waste of time \u0026 make less clear code \u0026 will often be forgotten leading to bugs. With this change, and further code in ImageMetaProps, code can unconditionally do\n\n    disk_bus \u003d image_meta.properties.hw_disk_bus\n\nwhich is much simpler \u0026 less error prone.","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8cd7c85a0f414acab5d297631ed063690e2e7d81","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        #    val \u003d image_meta.properties.some_attr"},{"line_number":74,"context_line":"        #"},{"line_number":75,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":76,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3acd31a7_69cbad73","line":76,"updated":"2015-04-29 16:01:42.000000000","message":"As said in the previous PS, I think we just need to consider the properties field nullable, right ?","commit_id":"5b31fd8f00e76a51979afe07150135d5bcc0a7d7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3fbbacdd3f9c5b3cfdcc200f719bdde29166b8e0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        #    val \u003d image_meta.properties.some_attr"},{"line_number":74,"context_line":"        #"},{"line_number":75,"context_line":"        if name \u003d\u003d \"properties\":"},{"line_number":76,"context_line":"            setattr(self, name, objects.ImageMetaProps())"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            super(ImageMeta, self).obj_load_attr(name)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3acd31a7_693ccd2f","line":76,"in_reply_to":"3acd31a7_69cbad73","updated":"2015-04-29 16:21:57.000000000","message":"I think the implication here is that it can\u0027t ever be None because of this load action.","commit_id":"5b31fd8f00e76a51979afe07150135d5bcc0a7d7"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"96b2e8d7636e4d2c27df83e366b8029d2b27b978","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova import utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ImageMeta(base.NovaObject, base.NovaPersistentObject):"},{"line_number":24,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # These are driven by what the image client API returns"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_174be488","line":23,"updated":"2015-05-06 20:30:29.000000000","message":"Please remove NovaPersistentObject inheritance, as these objects are not stored in the Nova DB.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"353ee59301475e060de43b3864bed4f6b8573aa0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova import utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ImageMeta(base.NovaObject, base.NovaPersistentObject):"},{"line_number":24,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # These are driven by what the image client API returns"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_d0357846","line":23,"in_reply_to":"3acd31a7_174be488","updated":"2015-05-07 16:19:22.000000000","message":"This was actually done to get the created_at/deleted_at/etc fields which are included in the image meta dict IIUC","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"96b2e8d7636e4d2c27df83e366b8029d2b27b978","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        \u0027size\u0027: fields.IntegerField(),"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        \u0027status\u0027: fields.StringField(),"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_19b902ea","line":37,"updated":"2015-05-06 20:30:29.000000000","message":"In v2 Images, there is also a \"virtual_size\" attribute:\n\nhttps://github.com/openstack/glance/blob/master/glance/api/v2/images.py#L827","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"353ee59301475e060de43b3864bed4f6b8573aa0","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        \u0027size\u0027: fields.IntegerField(),"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        \u0027status\u0027: fields.StringField(),"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_90f94083","line":37,"in_reply_to":"1aca2d91_19b902ea","updated":"2015-05-07 16:19:22.000000000","message":"ok will add it","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"96b2e8d7636e4d2c27df83e366b8029d2b27b978","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        \u0027status\u0027: fields.StringField(),"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        \u0027disk_format\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027container_format\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_d9da6a78","line":41,"updated":"2015-05-06 20:30:29.000000000","message":"The Glance v2 API uses the term \"visibility\" and it is a string value, not a boolean, having the string \"public\", \"private\", and \"shared\":\n\nhttps://github.com/openstack/glance/blob/master/glance/api/v2/images.py#L805\n\nhttps://github.com/openstack/glance/blob/master/glance/api/v2/images.py#L584\n\n\"shared\" images are manually shared with one or more tenant IDs.\n\nI would recommend using visibility as the name of the field here, and using a string field type. In addition, you could add some \"generated\" attributes to the ImageMeta class that would act like the boolean is_public() fields on v1 Image API images.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"353ee59301475e060de43b3864bed4f6b8573aa0","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        \u0027status\u0027: fields.StringField(),"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        \u0027disk_format\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027container_format\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_70f46486","line":41,"in_reply_to":"1aca2d91_d9da6a78","updated":"2015-05-07 16:19:22.000000000","message":"I\u0027ll switch this to use an EnumField","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \u0027status\u0027: fields.StringField(),"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        \u0027disk_format\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027container_format\u0027: fields.StringField(),"},{"line_number":45,"context_line":"        \u0027checksum\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_2858c831","line":42,"updated":"2015-05-01 15:33:58.000000000","message":"Do we need the whitespace between these?","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \u0027status\u0027: fields.StringField(),"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \u0027is_public\u0027: fields.BooleanField(),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        \u0027disk_format\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027container_format\u0027: fields.StringField(),"},{"line_number":45,"context_line":"        \u0027checksum\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_a84a98c3","line":42,"in_reply_to":"3acd31a7_2858c831","updated":"2015-05-01 15:41:18.000000000","message":"No, not really. No idea why I did that :-)","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"96b2e8d7636e4d2c27df83e366b8029d2b27b978","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027owner\u0027: fields.StringField(),"},{"line_number":47,"context_line":"        \u0027min_disk\u0027: fields.IntegerField(),"},{"line_number":48,"context_line":"        \u0027min_ram\u0027: fields.IntegerField(),"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        \u0027properties\u0027: fields.ObjectField(\u0027ImageMetaProps\u0027),"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # TODO(berrange) probably kill this - see comment"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_99c19231","line":49,"updated":"2015-05-06 20:30:29.000000000","message":"In addition to the above, v2 images also have a \"protected\" attribute:\n\nhttps://github.com/openstack/glance/blob/master/glance/api/v2/images.py#L809\n\nand a \"direct_url\" attribute:\n\nhttps://github.com/openstack/glance/blob/master/glance/api/v2/images.py#L861\n\nNot sure it\u0027s worth adding these though?","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"353ee59301475e060de43b3864bed4f6b8573aa0","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027owner\u0027: fields.StringField(),"},{"line_number":47,"context_line":"        \u0027min_disk\u0027: fields.IntegerField(),"},{"line_number":48,"context_line":"        \u0027min_ram\u0027: fields.IntegerField(),"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        \u0027properties\u0027: fields.ObjectField(\u0027ImageMetaProps\u0027),"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # TODO(berrange) probably kill this - see comment"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_30d70cef","line":49,"in_reply_to":"1aca2d91_99c19231","updated":"2015-05-07 16:19:22.000000000","message":"Yeah, I don\u0027t think we really use those, so I will leave them out for now.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"96b2e8d7636e4d2c27df83e366b8029d2b27b978","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # TODO(berrange) probably kill this - see comment"},{"line_number":53,"context_line":"        # in compute.api.snapshot_volume_backed"},{"line_number":54,"context_line":"        \u0027location\u0027: fields.StringField(),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    obj_relationships \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_f798681d","line":54,"updated":"2015-05-06 20:30:29.000000000","message":"So, the Glance v2 API has an image *locations* attribute that is a set of strings with backend location information for an image (an image can have multiple copies in different backends).\n\nNote that line 2257 of the compute api.py module:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/api.py#L2257\n\nIs a bug. There is no \"location\" (without the \u0027s\u0027) attribute of an image, either in the v1 or v2 Glance API.\n\nTherefore, please remove the above field.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"353ee59301475e060de43b3864bed4f6b8573aa0","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # TODO(berrange) probably kill this - see comment"},{"line_number":53,"context_line":"        # in compute.api.snapshot_volume_backed"},{"line_number":54,"context_line":"        \u0027location\u0027: fields.StringField(),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    obj_relationships \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_d0fe986a","line":54,"in_reply_to":"3acd31a7_f798681d","updated":"2015-05-07 16:19:22.000000000","message":"Hmm, modelling the \"locations\" attribute is well hard as there\u0027s no obvious definition of what\u0027s valid data for the contents of its metadata sub-attribute. So I\u0027ll just leave that out for now too. We can add it later if requried.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        if image_meta is None:"},{"line_number":73,"context_line":"            image_meta \u003d {}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        image_meta \u003d copy.deepcopy(image_meta)"},{"line_number":76,"context_line":"        image_meta[\"properties\"] \u003d \\"},{"line_number":77,"context_line":"            objects.ImageMetaProps.from_dict("},{"line_number":78,"context_line":"                image_meta.get(\"properties\", {}))"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_c836f4e6","line":75,"updated":"2015-05-01 15:33:58.000000000","message":"Not that it\u0027s a bad idea, but why is this needed? What in the initialization process alters the input? This isn\u0027t without performance penalty, so I\u0027d like to understand where we might be doing something we shouldn\u0027t if we need this.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        if image_meta is None:"},{"line_number":73,"context_line":"            image_meta \u003d {}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        image_meta \u003d copy.deepcopy(image_meta)"},{"line_number":76,"context_line":"        image_meta[\"properties\"] \u003d \\"},{"line_number":77,"context_line":"            objects.ImageMetaProps.from_dict("},{"line_number":78,"context_line":"                image_meta.get(\"properties\", {}))"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_481664a8","line":75,"in_reply_to":"3acd31a7_c836f4e6","updated":"2015-05-01 15:41:18.000000000","message":"I think this is actually redundant now - left over from a previous version of the patch, so will remove it","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"49443a8366a586b66417f34462fe9e70c37bf713","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return cls(**image_meta)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @classmethod"},{"line_number":83,"context_line":"    def from_instance(cls, instance):"},{"line_number":84,"context_line":"        \"\"\"Create instance from instance system metadata"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param instance: Instance object"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_1b1d310f","line":83,"updated":"2015-05-04 14:01:28.000000000","message":"How about add field \u0027image_meta\u0027 to Instance object. Which field also return this Object and load from system_metadata? But it can be another patch","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"353ee59301475e060de43b3864bed4f6b8573aa0","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return cls(**image_meta)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @classmethod"},{"line_number":83,"context_line":"    def from_instance(cls, instance):"},{"line_number":84,"context_line":"        \"\"\"Create instance from instance system metadata"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param instance: Instance object"}],"source_content_type":"text/x-python","patch_set":29,"id":"1aca2d91_1d69f7be","line":83,"in_reply_to":"3acd31a7_1b1d310f","updated":"2015-05-07 16:19:22.000000000","message":"Yep, that\u0027s really a much later phase of work. We need to consider conversion of the code to use this object first really.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"65964b00192845ca0ed61726dab9a799f50e668f","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    # \u0027hw_\u0027 - settings affecting the guest virtual machine hardware"},{"line_number":105,"context_line":"    # \u0027img_\u0027 - settings affecting the use of images by the compute node"},{"line_number":106,"context_line":"    # \u0027os_\u0027 - settings affecting the guest operating system setup"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    fields \u003d {"},{"line_number":109,"context_line":"        # name of guest hardware architecture eg i686, x86_64, ppc64"}],"source_content_type":"text/x-python","patch_set":32,"id":"1aca2d91_07d17457","line":106,"updated":"2015-05-07 17:59:18.000000000","message":"in the vmware driver we support limits, reservations and shares. the are also going to be supported as image meta data.\nwill that fall under hw_ or os_\ncan we consider have quota_?\n\nfor example:-\nquota_disk_limit\nquota_disk_reservation\nquota_disk_shares_level\nquota_disk_shares_share\n\nSimilarly for cpu, memory and vnics","commit_id":"e43e366950ec3833a77a834b39517cebb388941b"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"27025c46595e85686280b9cce61f02d89363ef3c","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    # \u0027hw_\u0027 - settings affecting the guest virtual machine hardware"},{"line_number":105,"context_line":"    # \u0027img_\u0027 - settings affecting the use of images by the compute node"},{"line_number":106,"context_line":"    # \u0027os_\u0027 - settings affecting the guest operating system setup"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    fields \u003d {"},{"line_number":109,"context_line":"        # name of guest hardware architecture eg i686, x86_64, ppc64"}],"source_content_type":"text/x-python","patch_set":32,"id":"1aca2d91_1c1c1011","line":106,"in_reply_to":"1aca2d91_07d17457","updated":"2015-05-08 08:35:02.000000000","message":"You could probably argue for them to be hw_, but I think a 4th prefix for tunables could be a viable option too.","commit_id":"e43e366950ec3833a77a834b39517cebb388941b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b0b38f2d799484fad0e4ddace7ca400bc1e199f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027tags\u0027: fields.ListOfStringsField(),"},{"line_number":51,"context_line":"        \u0027direct_url\u0027: fields.StringField(),"},{"line_number":52,"context_line":"        \u0027min_ram\u0027: fields.IntegerField(),"},{"line_number":53,"context_line":"        \u0027min_disk\u0027: fields.IntegerField(),"},{"line_number":54,"context_line":"        \u0027properties\u0027: fields.ObjectField(\u0027ImageMetaProps\u0027),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"9af37de9_ad1d2a68","line":53,"updated":"2015-05-11 12:55:43.000000000","message":"This still needs a locations field attribute of type list of strings.","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6a2e869ac4c739eadb7f161adacf9e2fb3487339","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027tags\u0027: fields.ListOfStringsField(),"},{"line_number":51,"context_line":"        \u0027direct_url\u0027: fields.StringField(),"},{"line_number":52,"context_line":"        \u0027min_ram\u0027: fields.IntegerField(),"},{"line_number":53,"context_line":"        \u0027min_disk\u0027: fields.IntegerField(),"},{"line_number":54,"context_line":"        \u0027properties\u0027: fields.ObjectField(\u0027ImageMetaProps\u0027),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a016987_b3d8e61e","line":53,"in_reply_to":"9af37de9_ad1d2a68","updated":"2015-05-14 18:01:52.000000000","message":"It isn\u0027t actually a list of strings - in glance it appears to be defines as a list of dicts, where each dict contains a string and an object, and the object is unspecified - it could be another dict of strings but Its really unclear \u0026 undocumented  :-(\n\nSo per the comment above, I\u0027d like to leave out locations for now while its investigated further. It shouldn\u0027t prevent us merging this - we can easily add the field afterwards.","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c7df3a75c3a6a1703628c0fc8e163697724ca0e4","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # used to decide to expand root disk partition and fs to full size of"},{"line_number":113,"context_line":"        # root disk"},{"line_number":114,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.FlexibleBooleanField(),"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # whether to display BIOS boot device menu"},{"line_number":117,"context_line":"        \u0027hw_boot_menu\u0027: fields.FlexibleBooleanField(),"}],"source_content_type":"text/x-python","patch_set":33,"id":"9af37de9_636f6a93","line":114,"updated":"2015-05-10 12:45:56.000000000","message":"When I check the code found, this property in image isn\u0027t Boolean, https://github.com/openstack/nova/blob/7b21fe395b1df0c33127a87c81825459df03643a/nova/utils.py#L1059\n\nCorrect me if I\u0027m wrong...","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b0b38f2d799484fad0e4ddace7ca400bc1e199f","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # used to decide to expand root disk partition and fs to full size of"},{"line_number":113,"context_line":"        # root disk"},{"line_number":114,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.FlexibleBooleanField(),"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # whether to display BIOS boot device menu"},{"line_number":117,"context_line":"        \u0027hw_boot_menu\u0027: fields.FlexibleBooleanField(),"}],"source_content_type":"text/x-python","patch_set":33,"id":"9af37de9_6dff4202","line":114,"in_reply_to":"9af37de9_636f6a93","updated":"2015-05-11 12:55:43.000000000","message":"Nice catch Alex. Looks like this is a string field, Dan?","commit_id":"c22a22749f7e53dcb6a0450a963bd67cc44ede4f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4e356fb430815c45a4a4fb1e88b820661deef549","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027tags\u0027: fields.ListOfStringsField(),"},{"line_number":51,"context_line":"        \u0027direct_url\u0027: fields.StringField(),"},{"line_number":52,"context_line":"        \u0027min_ram\u0027: fields.IntegerField(),"},{"line_number":53,"context_line":"        \u0027min_disk\u0027: fields.IntegerField(),"},{"line_number":54,"context_line":"        \u0027properties\u0027: fields.ObjectField(\u0027ImageMetaProps\u0027),"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a016987_f5ede6ef","line":53,"updated":"2015-05-16 23:55:02.000000000","message":"Missing the locations field... please add:\n\n \u0027locations\u0027: fields.ListOfStringsField(nullable\u003dTrue)","commit_id":"9adf3d72d3cf800d2320402ce984ab2224b8bb0f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":411,"context_line":"            return defvalue"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return self.__getattr__(name)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_69601636","line":413,"updated":"2015-05-27 15:03:26.000000000","message":"needs to be : \n\n    getattr(self, name)\n\n\n\nor we get an AttributeError","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"36108fe8129e3b4e13c301843b09e05da48ad50f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":411,"context_line":"            return defvalue"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return self.__getattr__(name)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_ef217ffd","line":413,"in_reply_to":"7a016987_69601636","updated":"2015-05-28 12:42:10.000000000","message":"right __getattr__ is not defined by default - which means that this obviously needs more tests :)","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"}],"nova/objects/image_meta_props.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"# TODO(berrange) remove NovaObjectDictCompat"},{"line_number":28,"context_line":"class ImageMetaProps(base.NovaObject,"},{"line_number":29,"context_line":"                     base.NovaObjectDictCompat):"},{"line_number":30,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    STRICT_PROP_NAMES \u003d False"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_27036fbf","line":30,"updated":"2015-01-13 16:43:22.000000000","message":"So, I think one thing we\u0027ve learned and one pattern we\u0027d like to move to, is tying this version to that of the ImageMeta object. Since they really don\u0027t ever need to move without each other, let\u0027s just make them always the same. Either they can go in the same file (maybe they\u0027re each a little too big for that with the compat code), or import the other one here and just forcibly tie their versions together:\n\n  from nova.objects import image_meta\n  ...\n  VERSION \u003d image_meta.ImageMeta.VERSION\n\nThat way we never have them increment out of lockstep, and we only have to change it in one place. Thoughts?","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    fields \u003d {"},{"line_number":39,"context_line":"        # name of the SCSI adapter model eg \u0027lsiLogic\u0027"},{"line_number":40,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # name of guest hardware architecture eg i686, x86_64, ppc64"},{"line_number":43,"context_line":"        \u0027hw_architecture\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_2c2fd6a8","line":40,"updated":"2015-01-13 16:43:22.000000000","message":"As in the previous one, nullable means that None is a valid value for this attribute, and I don\u0027t think it is. The object has a notion of \"unset\" which is different from being set to None. I think pretty much all of these should not be nullable.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        # Citrix PV tools version installed in image)"},{"line_number":72,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # name of the hard disk bus to use eg virtio, scsi, ide"},{"line_number":75,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # allocation mode eg \u0027preallocated\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_a7375fe3","line":74,"updated":"2015-01-13 16:43:22.000000000","message":"We need to have an Enum field type for this (and other things), but that\u0027s outside the scope of this patch, just a note.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        super(ImageMetaProps, self).__init__(*args, **kwargs)"},{"line_number":215,"context_line":"        for key in self.fields:"},{"line_number":216,"context_line":"            if key not in kwargs:"},{"line_number":217,"context_line":"                setattr(self, key, None)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _set_value(self, key, value):"},{"line_number":220,"context_line":"        if isinstance(self.fields[key], fields.BooleanField):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_072d938f","line":217,"updated":"2015-01-13 16:43:22.000000000","message":"As in the previous file, I don\u0027t think this is necessary.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        if isinstance(self.fields[key], fields.BooleanField):"},{"line_number":221,"context_line":"            setattr(self, key, strutils.bool_from_string(value))"},{"line_number":222,"context_line":"        else:"},{"line_number":223,"context_line":"            setattr(self, key, value)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    # TODO(berrange): Need to run this from a data migration"},{"line_number":226,"context_line":"    # at some point so we can eventually kill off the compat"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_c739cbd0","line":223,"updated":"2015-01-13 16:43:22.000000000","message":"Hrm, I wonder if we should just build this into the field itself? Seems reasonable.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    # TODO(berrange): Need to run this from a data migration"},{"line_number":226,"context_line":"    # at some point so we can eventually kill off the compat"},{"line_number":227,"context_line":"    def _set_old_props(self, image_props):"},{"line_number":228,"context_line":"        for legacy_key in self._legacy_property_map:"},{"line_number":229,"context_line":"            new_key \u003d self._legacy_property_map[legacy_key]"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_87a6e30d","line":227,"updated":"2015-01-13 16:43:22.000000000","message":"This is actually \"set the new properties from a dict of old properties\" right? When I read this function name, I thought it was the opposite.","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        for cellid in range(nodes):"},{"line_number":241,"context_line":"            memprop \u003d \"hw_numa_mem.%d\" % cellid"},{"line_number":242,"context_line":"            if memprop in image_props:"},{"line_number":243,"context_line":"                hw_numa_mem[cellid] \u003d int(image_props[memprop])"},{"line_number":244,"context_line":"                hw_numa_mem_set \u003d True"},{"line_number":245,"context_line":"                del image_props[memprop]"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_677ad778","line":243,"updated":"2015-01-13 16:43:22.000000000","message":"Since this is in image metadata that could be provided incorrectly, we probably want to be very defensive about the case where they don\u0027t specify this exact calculated key, right?","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        if hw_numa_cpus_set:"},{"line_number":263,"context_line":"            self.hw_numa_cpus \u003d hw_numa_cpus"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def _set_new_props(self, image_props):"},{"line_number":266,"context_line":"        for key in self.fields:"},{"line_number":267,"context_line":"            if key \u003d\u003d \"hw_numa_mem\":"},{"line_number":268,"context_line":"                self._set_numa_mem(image_props)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_07e03325","line":265,"updated":"2015-01-13 16:43:22.000000000","message":"Now, I\u0027m confused :)\n\nI think this is setting the newer new properties from the older new numa properties (?)","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8dbcdce0b129a2d90895594b226586f5f82eee1","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        # and new prop names are set, the value against the"},{"line_number":300,"context_line":"        # new prop name takes priority"},{"line_number":301,"context_line":"        obj._set_old_props(image_props)"},{"line_number":302,"context_line":"        obj._set_new_props(image_props)"},{"line_number":303,"context_line":"        obj._validate_prop_names(image_props)"},{"line_number":304,"context_line":"        return obj"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_67c817a9","line":302,"updated":"2015-01-13 16:43:22.000000000","message":"/me puzzles :P","commit_id":"aeeac9c6c3413985386927ea785f3ed8e47d54f2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3eb3dd9d30ed042c0a5551c735be820b9b7405eb","unresolved":false,"context_lines":[{"line_number":27,"context_line":"# TODO(berrange) remove NovaObjectDictCompat"},{"line_number":28,"context_line":"class ImageMetaProps(base.NovaObject,"},{"line_number":29,"context_line":"                     base.NovaObjectDictCompat):"},{"line_number":30,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    STRICT_PROP_NAMES \u003d False"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_a2b5a3ef","line":30,"updated":"2015-01-22 15:24:19.000000000","message":"I think Dan Smiths suggestion  from patch set 17 of tying the the version of ImageMetaProps  \nthe image image_meta version is a good approach.\n\n\" from nova.objects import image_meta\n...\nVERSION \u003d image_meta.ImageMeta.VERSION\"\n\nthere is a tight coupling between these two classes that could cause issues if they are versioned separately.","commit_id":"b6621e2356d45d5564b23454fe12322754bffb37"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"485152b7c9c25afe9507771bb08741506bc919b9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"# TODO(berrange) remove NovaObjectDictCompat"},{"line_number":28,"context_line":"class ImageMetaProps(base.NovaObject,"},{"line_number":29,"context_line":"                     base.NovaObjectDictCompat):"},{"line_number":30,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    STRICT_PROP_NAMES \u003d False"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_458c0980","line":30,"in_reply_to":"1a930d6b_a2b5a3ef","updated":"2015-01-22 15:33:05.000000000","message":"Oh absolutely I agree, I should have marked this WIP.\n\nI was just waiting for Dan Smiths feedback on my reply to his other comments, before re-working this patch.","commit_id":"b6621e2356d45d5564b23454fe12322754bffb37"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        # for props.obj_attr_is_set(\"foo\") before every single access"},{"line_number":305,"context_line":"        # to this object. In the rare cases where callers do still"},{"line_number":306,"context_line":"        # want to distinguish None vs unset, they still have the"},{"line_number":307,"context_line":"        # option of calling props.obj_attr_is_set(\"foo\")"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":310,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_8237dfaf","line":307,"updated":"2015-04-29 12:56:49.000000000","message":"could we consider debating that in a later change ? I don\u0027t see the point of needing that until when you require it, so I would like not to block that new object for that single need\n\nAs what you propose is something non remotable, it can even be provided in the object without needing to bump a new version","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"133ec0da3645c18ede5dfa6e529b023acc66f827","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        # for props.obj_attr_is_set(\"foo\") before every single access"},{"line_number":305,"context_line":"        # to this object. In the rare cases where callers do still"},{"line_number":306,"context_line":"        # want to distinguish None vs unset, they still have the"},{"line_number":307,"context_line":"        # option of calling props.obj_attr_is_set(\"foo\")"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":310,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":26,"id":"3acd31a7_1d48f75a","line":307,"in_reply_to":"5ad0253b_8237dfaf","updated":"2015-04-29 14:50:10.000000000","message":"See my comment against ImageMeta  obj_load_attr as to why this is needed. I don\u0027t want to add this later, as while it doesn\u0027t affect remotability, it is a semantic change callers should be away of right from the first merge.","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    def obj_load_attr(self, name):"},{"line_number":315,"context_line":"        # Part of solution mentioned in __getattr__ comment - we must"},{"line_number":316,"context_line":"        # stop the default auto-loading behaviour which throws an error"},{"line_number":317,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_e248d32f","line":317,"updated":"2015-04-29 12:56:49.000000000","message":"same remark as above","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3fbbacdd3f9c5b3cfdcc200f719bdde29166b8e0","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        #"},{"line_number":318,"context_line":"        # This effectively optimizes code clarity \u0026 safety for the"},{"line_number":319,"context_line":"        # common case."},{"line_number":320,"context_line":"        #"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":323,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":27,"id":"3acd31a7_bb5b482e","line":320,"updated":"2015-04-29 16:21:57.000000000","message":"How does this even work? __getattr__ is called if the attribute name can\u0027t be resolved normally (__getattribute__ is the one that always gets called). The fields are created as @property items on the class during initialization, so they should be resolved normally.\n\nAccesses must be triggering the property, which tries the load (as evidenced by your call below), and then calls getattr(self, name) after the load to return the result. I would expect that that getattr() call results in infinite recursion, I\u0027m not sure why it would be magically ignoring the property on that next call.\n\nEither way, if this _is_ working, it\u0027s highly dependent on the implementation of make_class_properties(), which is something that is effectively now an external library (when we move to oslo.versionedobjects very soon). If that library (as planned) moves the fields to using descriptors for accesses, this hack will break.\n\nThe code path described above in the base object actually *should* check that the attribute was set by the load and raise an exception if it didn\u0027t. If the library gains such a check in the future, this will also stop working.\n\nIMHO, if we want to have the least-pain route for this, we should go the .get() route I suggested on a previous patchset.","commit_id":"5b31fd8f00e76a51979afe07150135d5bcc0a7d7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e4a1a6c1dfea2aec8527c71a79500ae6c3d2e77c","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":323,"context_line":"            return None"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        return super(ImageMetaProps, self).__getattr__(self, name)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def obj_load_attr(self, name):"},{"line_number":328,"context_line":"        # Part of solution mentioned in __getattr__ comment - we must"}],"source_content_type":"text/x-python","patch_set":28,"id":"3acd31a7_bbafc893","line":325,"updated":"2015-04-29 16:22:23.000000000","message":"See comments on the previous set.","commit_id":"a06fae86d8d8a7ffdc2445363f2f486e2afcdc2e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.virt import hardware"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ImageMetaProps(base.NovaObject):"},{"line_number":24,"context_line":"    VERSION \u003d image_meta.ImageMeta.VERSION"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # \u0027hw_\u0027 - settings affecting the guest virtual machine hardware"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_88723c48","line":23,"updated":"2015-05-01 15:33:58.000000000","message":"So, one thing to consider is just putting this into the same file as the parent object, and tying their versions together. Effectively bumping one will bump the other always. Every time we bump the child object we\u0027ll have to bump the parent anyway, and that may happen frequently. Thus, just setting this thing\u0027s version to ImageMeta.VERSION may be much easier. We\u0027ve talked about doing this for some to make bumping easier, and this seems like an ideal case to start with.  I\u0027ll leave to to you to decide, but thought I\u0027d mention it.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.virt import hardware"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ImageMetaProps(base.NovaObject):"},{"line_number":24,"context_line":"    VERSION \u003d image_meta.ImageMeta.VERSION"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # \u0027hw_\u0027 - settings affecting the guest virtual machine hardware"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_a82178fd","line":23,"in_reply_to":"3acd31a7_88723c48","updated":"2015-05-01 15:41:18.000000000","message":"Sure, putting them in the same source file works fine with me. IU have actually tied the versions together in this posting - just see the next line :-)","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9d86c84bbd7409b1a39cf118c7801b7cd87b12f0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.virt import hardware"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ImageMetaProps(base.NovaObject):"},{"line_number":24,"context_line":"    VERSION \u003d image_meta.ImageMeta.VERSION"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    # \u0027hw_\u0027 - settings affecting the guest virtual machine hardware"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_d64e756e","line":23,"in_reply_to":"3acd31a7_a82178fd","updated":"2015-05-04 09:02:35.000000000","message":"Well good point for maintanability","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # guest ABI version for guest xentools either 1 or 2 (or 3 - depends on"},{"line_number":69,"context_line":"        # Citrix PV tools version installed in image)"},{"line_number":70,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(),"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # name of the hard disk bus to use eg virtio, scsi, ide"},{"line_number":73,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_6875a096","line":70,"updated":"2015-05-01 15:33:58.000000000","message":"So why not use an IntegerField? There are several below that are called out as integers in the comment but are StringFields. I won\u0027t mark them all, but is there a reason some need to be strings? The benefit of making them properly typed is of course being able to ensure we don\u0027t send a device_id of \"foo\" to an older compute that will just run int() on it.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # guest ABI version for guest xentools either 1 or 2 (or 3 - depends on"},{"line_number":69,"context_line":"        # Citrix PV tools version installed in image)"},{"line_number":70,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(),"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # name of the hard disk bus to use eg virtio, scsi, ide"},{"line_number":73,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_487d44e6","line":70,"in_reply_to":"3acd31a7_6875a096","updated":"2015-05-01 15:41:18.000000000","message":"It is possible we can use an int - I\u0027ll just investigate the Xen code more closely to verify","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(),"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # name of the hard disk bus to use eg virtio, scsi, ide"},{"line_number":73,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(),"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        # allocation mode eg \u0027preallocated\u0027"},{"line_number":76,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_a8ba9821","line":73,"updated":"2015-05-01 15:33:58.000000000","message":"We have an EnumField now, which we could use for this. If we used that, we would have clear indication of what versions of the code could handle a specific new bus type that we added. For example, if we added a foobar bus type, it would be clear that kilo computes can\u0027t handle that request because we had to bump the version. Thus, we could properly fail when we pass this to a kilo compute with \"doesn\u0027t support this thing\". What do you think?","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(),"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # name of the hard disk bus to use eg virtio, scsi, ide"},{"line_number":73,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(),"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        # allocation mode eg \u0027preallocated\u0027"},{"line_number":76,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_08874cd8","line":73,"in_reply_to":"3acd31a7_a8ba9821","updated":"2015-05-01 15:41:18.000000000","message":"Yes, using an enum would be nice here, as we have a finite set of disk buses","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \u0027hw_video_ram\u0027: fields.IntegerField(),"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # name of a NIC device model eg virtio, e1000, rtl8139"},{"line_number":125,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(),"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # \"xen\" vs \"hvm\""},{"line_number":128,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_28cb28a7","line":125,"updated":"2015-05-01 15:33:58.000000000","message":"This definitely seems like a good option for an enum, as do the video and scsi model things above. We *know* we have major drift here :)","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \u0027hw_video_ram\u0027: fields.IntegerField(),"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # name of a NIC device model eg virtio, e1000, rtl8139"},{"line_number":125,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(),"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # \"xen\" vs \"hvm\""},{"line_number":128,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_e86e502e","line":125,"in_reply_to":"3acd31a7_28cb28a7","updated":"2015-05-01 15:41:18.000000000","message":"Indeed, since this was first written, we have actually defined constants for the valid NIC types, so we can likly use an enum.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # XXX unclear what this is - used in snapshotting somehow"},{"line_number":141,"context_line":"        \u0027img_block_device_mapping\u0027:"},{"line_number":142,"context_line":"            fields.ListOfDictOfNullableStringsField(),"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # boolean - if True, and image cache set to \"some\" decides if image"},{"line_number":145,"context_line":"        # should be cached on host when server is booted on that host"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_c8c0347f","line":142,"updated":"2015-05-01 15:33:58.000000000","message":"Hmm, yeah, this seems weird. Maybe ndipanov can help?","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # XXX unclear what this is - used in snapshotting somehow"},{"line_number":141,"context_line":"        \u0027img_block_device_mapping\u0027:"},{"line_number":142,"context_line":"            fields.ListOfDictOfNullableStringsField(),"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # boolean - if True, and image cache set to \"some\" decides if image"},{"line_number":145,"context_line":"        # should be cached on host when server is booted on that host"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_e8dc10e6","line":142,"in_reply_to":"3acd31a7_c8c0347f","updated":"2015-05-01 15:41:18.000000000","message":"I wonder if it will in fact be possible to use the BlockDeviceMappingList object here instead.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        \u0027img_linked_clone\u0027: fields.BooleanField(),"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # XXX unclear what this is - used in snapshotting somehow"},{"line_number":156,"context_line":"        \u0027img_mappings\u0027: fields.ListOfDictOfNullableStringsField(),"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        # image project id (set on upload)"},{"line_number":159,"context_line":"        \u0027img_owner_id\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_88ba3c09","line":156,"updated":"2015-05-01 15:33:58.000000000","message":"Same here.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        # boolean - if using agent don\u0027t inject files, assume someone else is"},{"line_number":171,"context_line":"        # doing that (cloud-init)"},{"line_number":172,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.BooleanField("},{"line_number":173,"context_line":"            ),"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # boolean - if using agent don\u0027t try inject ssh key, assume someone"},{"line_number":176,"context_line":"        # else is doing that (cloud-init)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_a85618d0","line":173,"updated":"2015-05-01 15:33:58.000000000","message":"Was this newline intentional?","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6643b622247d984129e36b2cda1d13d794c6ee8a","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        # boolean - if using agent don\u0027t inject files, assume someone else is"},{"line_number":171,"context_line":"        # doing that (cloud-init)"},{"line_number":172,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.BooleanField("},{"line_number":173,"context_line":"            ),"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # boolean - if using agent don\u0027t try inject ssh key, assume someone"},{"line_number":176,"context_line":"        # else is doing that (cloud-init)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_c8695427","line":173,"in_reply_to":"3acd31a7_a85618d0","updated":"2015-05-01 15:41:18.000000000","message":"Nope!","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _set_value(self, key, value):"},{"line_number":212,"context_line":"        if isinstance(self.fields[key], fields.BooleanField):"},{"line_number":213,"context_line":"            setattr(self, key, strutils.bool_from_string(value))"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            setattr(self, key, value)"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_4809c4dc","line":213,"updated":"2015-05-01 15:33:58.000000000","message":"The field should perform this coercion for us, right? Did you hit something that made you need to do this?","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"2095591c9a9087b8bd4ee548b941ea2368536b98","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _set_value(self, key, value):"},{"line_number":212,"context_line":"        if isinstance(self.fields[key], fields.BooleanField):"},{"line_number":213,"context_line":"            setattr(self, key, strutils.bool_from_string(value))"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            setattr(self, key, value)"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_e88ad0be","line":213,"in_reply_to":"3acd31a7_4809c4dc","updated":"2015-05-01 15:43:09.000000000","message":"I did this to address some test case failure in a previous patch, but damned if I know just what now. I\u0027ll double check this again.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            setattr(self, key, value)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    # TODO(berrange): Need to run this from a data migration"},{"line_number":218,"context_line":"    # at some point so we can eventually kill off the compat"},{"line_number":219,"context_line":"    def _set_attr_from_legacy_names(self, image_props):"},{"line_number":220,"context_line":"        for legacy_key in self._legacy_property_map:"},{"line_number":221,"context_line":"            new_key \u003d self._legacy_property_map[legacy_key]"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_c8f5d4cb","line":218,"updated":"2015-05-01 15:33:58.000000000","message":"This should be done like the flavor stuff, IMHO, where we provide a nova-manage command that can do this on live data in small batches for throttling. But yeah, +1 on performing the cleanup once we\u0027re done with this for sure.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        # We look to see if the dict has entries for any"},{"line_number":284,"context_line":"        # of the legacy property names first. Then we use"},{"line_number":285,"context_line":"        # the current property names. That way if both the"},{"line_number":286,"context_line":"        # currenet and legacy names are set, the value"},{"line_number":287,"context_line":"        # associated with the current name takes priority"},{"line_number":288,"context_line":"        obj._set_attr_from_legacy_names(image_props)"},{"line_number":289,"context_line":"        obj._set_attr_from_current_names(image_props)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_68bb60e6","line":286,"range":{"start_line":286,"start_character":10,"end_line":286,"end_character":18},"updated":"2015-05-01 15:33:58.000000000","message":"\"current\" is misspelled.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4abcf6644ec9783f2a808c103b7c772aeeb74b0b","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        \"\"\""},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":317,"context_line":"            return None"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        return self.__getattr__(name)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_a8a058a0","line":317,"updated":"2015-05-01 15:33:58.000000000","message":"Do we ever want to support the defaulting behavior like a dict? Since all the code that uses this is working on dicts now, I wonder if there are a few cases where supporting .get(foo, default) would be helpful? If not, or if we want to try to avoid such behavior then this is cool.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"2095591c9a9087b8bd4ee548b941ea2368536b98","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        \"\"\""},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if not self.obj_attr_is_set(name):"},{"line_number":317,"context_line":"            return None"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        return self.__getattr__(name)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3acd31a7_c8fef437","line":317,"in_reply_to":"3acd31a7_a8a058a0","updated":"2015-05-01 15:43:09.000000000","message":"Yeah, it is probably useful to allow a default.","commit_id":"a1e6cc71db542f1fc8e214af0275423846bc4857"}],"nova/objects/virt_properties.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3adcd12c211608511c8921b559fafc943b4a1231","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            nullable\u003dTrue),"},{"line_number":55,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":58,"context_line":"    }"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAU3%2F%2FoOU%3D","line":57,"updated":"2014-02-25 15:28:10.000000000","message":"I don\u0027t think that the virt-specific properties should be in this object, ever. The point is to get rid of them and migrate to generic hw_* versions. So, what needs to happen is you only put the hw_* ones in the fields, and then in the _obj_from_image_meta(), migrate the old properties explicitly when they are present (and the hw_* one is not). Then we need to convert all the drivers to only use the hw_* properties of this object and it will provide the translation/migration from the old values.\n\nMake sense?","commit_id":"a5e616d13da883f5793edddb235f6ed4860d784d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e9257d53e577fbb5f8343df3d3bd41c375a02021","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    }"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @staticmethod"},{"line_number":61,"context_line":"    def _obj_from_image_meta(context, virt_properties_obj, image_meta):"},{"line_number":62,"context_line":"        virt_properties_obj._context \u003d context"},{"line_number":63,"context_line":"        if image_meta and \u0027properties\u0027 in image_meta:"},{"line_number":64,"context_line":"            for key in virt_properties_obj.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAU3%2F%2FoPY%3D","line":61,"updated":"2014-02-25 15:28:22.000000000","message":"could you please write some unit tests for this method.\nplease look at https://github.com/openstack/nova/tree/master/nova/tests/objects for example of objects with tests","commit_id":"a5e616d13da883f5793edddb235f6ed4860d784d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e9257d53e577fbb5f8343df3d3bd41c375a02021","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        return virt_properties_obj"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @base.remotable_classmethod"},{"line_number":71,"context_line":"    def get_by_image_id(cls, context, image_id):"},{"line_number":72,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service("},{"line_number":73,"context_line":"                context, image_id)"},{"line_number":74,"context_line":"        image_meta \u003d image_service.show(context, image_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAU3%2F%2FoQc%3D","line":71,"updated":"2014-02-25 15:28:22.000000000","message":"not 100% sure why this method is needed. can you please explain","commit_id":"a5e616d13da883f5793edddb235f6ed4860d784d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e9257d53e577fbb5f8343df3d3bd41c375a02021","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    @base.remotable_classmethod"},{"line_number":78,"context_line":"    def get_from_metadata(cls, context, image_meta):"},{"line_number":79,"context_line":"        return cls._obj_from_image_meta(context, cls(), image_meta)"},{"line_number":80,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAU3%2F%2FoR4%3D","line":80,"updated":"2014-02-25 15:28:22.000000000","message":"why do we need the pass here?","commit_id":"a5e616d13da883f5793edddb235f6ed4860d784d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"aabc19bc54f4af0516179904d1b4e402c3a74427","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \u0027hw_cdrom_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":26,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":27,"context_line":"        \u0027hw_floppy_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":28,"context_line":"        \u0027hw_qemu_guest_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027hw_rng\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027hw_scsi_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027hw_video_model\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FhDk%3D","line":28,"updated":"2014-02-26 06:58:50.000000000","message":"following comments on line 41 this also looks like it is os related and not hw related.","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"423d8b5fc9bd259a1e2433e540bb89ccb2f03a58","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \u0027hw_cdrom_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":26,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":27,"context_line":"        \u0027hw_floppy_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":28,"context_line":"        \u0027hw_qemu_guest_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027hw_rng\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027hw_scsi_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027hw_video_model\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2Ff9w%3D","line":28,"in_reply_to":"AAAAU3%2F%2FhDk%3D","updated":"2014-02-26 09:19:23.000000000","message":"It is hardware related because guest agents have certain virtual hardware devices associated with them","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(),"},{"line_number":40,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027hw_os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkHI%3D","line":41,"updated":"2014-02-25 22:11:39.000000000","message":"this looks os-y not hw-y","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_image_compression_level\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027hw_use_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027hw_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027hw_skip_agent_inject_files_at_boot\u0027: fields.StringField("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkJM%3D","line":45,"updated":"2014-02-25 22:11:39.000000000","message":"This doesn\u0027t seem like a hardware-related thing, so it probably needs a different namespace. Maybe img_ compression_level?","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_image_compression_level\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027hw_use_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027hw_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027hw_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":49,"context_line":"            nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkJA%3D","line":46,"updated":"2014-02-25 22:11:39.000000000","message":"Same","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027hw_use_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027hw_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027hw_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":49,"context_line":"            nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027hw_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027hw_bittorrent\u0027: fields.StringField(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkI4%3D","line":49,"updated":"2014-02-25 22:11:39.000000000","message":"These seem like os_* or something","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027hw_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027hw_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":49,"context_line":"            nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027hw_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027hw_bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":53,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkIw%3D","line":50,"updated":"2014-02-25 22:11:39.000000000","message":"If this is a standard glance-y thing, then maybe no prefix?","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027hw_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027hw_bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    property_map \u003d {\u0027hw_architecture\u0027: [\u0027architecture\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkIg%3D","line":52,"updated":"2014-02-25 22:11:39.000000000","message":",etc","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"423d8b5fc9bd259a1e2433e540bb89ccb2f03a58","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027hw_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027hw_bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    property_map \u003d {\u0027hw_architecture\u0027: [\u0027architecture\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2Ff98%3D","line":52,"updated":"2014-02-26 09:19:23.000000000","message":"These should *not* all be using a \u0027hw_\u0027 prefix.\n\nThe \u0027hw_\u0027 prefix should only be used for things which are related to guest hardware device configuration.\n\nThe \u0027os_\u0027 prefix should be used for things related to the guest operating system\n\nA bunch of the remaining things are really related to operation of Nova itself, so should probably use some third prefix.","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f4a960be21296ec1bf772a41fab5a85525d87219","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027hw_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027hw_bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    property_map \u003d {\u0027hw_architecture\u0027: [\u0027architecture\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVX%2F%2F4DM%3D","line":52,"in_reply_to":"AAAAU3%2F%2Ff98%3D","updated":"2014-02-27 18:35:01.000000000","message":"Agreed.","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cc627ec1aa380beeeccbadf12941af98d283376d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    for prop_name in virt_properties_obj.property_map[key]:"},{"line_number":85,"context_line":"                        if prop_name in image_meta[\u0027properties\u0027]:"},{"line_number":86,"context_line":"                            virt_properties_obj[key] \u003d \\"},{"line_number":87,"context_line":"                                    image_meta[\u0027properties\u0027][prop_name]"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        return virt_properties_obj"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FkHc%3D","line":87,"updated":"2014-02-25 22:11:39.000000000","message":"These need to have their values checked and converted in the case of the migrated ones. For example, libvirt calls its ethernet \"e1000e\" but vmware calls it \"VirtualE1000\" or some such. We need to sanitize the older keys *and* values so that the virt drivers can expect a consistent interface.","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"aabc19bc54f4af0516179904d1b4e402c3a74427","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        return virt_properties_obj"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @base.remotable_classmethod"},{"line_number":92,"context_line":"    def get_by_image_id(cls, context, image_id):"},{"line_number":93,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service("},{"line_number":94,"context_line":"                context, image_id)"},{"line_number":95,"context_line":"        image_meta \u003d image_service.show(context, image_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAU3%2F%2FhEI%3D","line":92,"updated":"2014-02-26 06:58:50.000000000","message":"can you please clarify why this method is needed?","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f4a960be21296ec1bf772a41fab5a85525d87219","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        return virt_properties_obj"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @base.remotable_classmethod"},{"line_number":92,"context_line":"    def get_by_image_id(cls, context, image_id):"},{"line_number":93,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service("},{"line_number":94,"context_line":"                context, image_id)"},{"line_number":95,"context_line":"        image_meta \u003d image_service.show(context, image_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVX%2F%2F4C4%3D","line":92,"in_reply_to":"AAAAU3%2F%2FhEI%3D","updated":"2014-02-27 18:35:01.000000000","message":"Seems pretty obvious to me. You have an image_id and want the metadata from it. Is the concern that you don\u0027t think there is any place that would currently need this?","commit_id":"52c5b47f4cd3ce16b353e6d5bc43206823e577c6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027hw_cdrom_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":27,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":28,"context_line":"        \u0027hw_floppy_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027hw_qemu_guest_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027hw_rng\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027hw_scsi_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":32,"context_line":"        \u0027hw_video_model\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwOc%3D","line":29,"updated":"2014-02-28 14:55:49.000000000","message":"This should s/qemu//\n\nWhat\u0027s the format of this field? Is it boolean or a path or what?","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"9a17bf9b98f4097e4dc6c22269b3df555a02c0b9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027hw_cdrom_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":27,"context_line":"        \u0027hw_disk_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":28,"context_line":"        \u0027hw_floppy_bus\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027hw_qemu_guest_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027hw_rng\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027hw_scsi_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":32,"context_line":"        \u0027hw_video_model\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwKk%3D","line":29,"in_reply_to":"AAAAVX%2F%2FwOc%3D","updated":"2014-02-28 15:01:54.000000000","message":"Actually, this is a boolean which determines whether the QEMU agent is enabled for the guest, so having qemu in the name is appropriate.\n\nOther types of agents would have separate properties, unless we wanted to have a single \u0027hw_guest_agents\u003dname1,name2\u0027 instead","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027hw_video_ram\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx88%3D","line":36,"updated":"2014-02-28 10:34:58.000000000","message":"Remove \u0027hw_\u0027 prefix","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx8k%3D","line":37,"updated":"2014-02-28 10:34:58.000000000","message":"This is nothing todo with guest hardware, so this needs a different prefix","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwRA%3D","line":37,"in_reply_to":"AAAAVX%2F%2Fx8k%3D","updated":"2014-02-28 14:55:49.000000000","message":"img_ I think","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx78%3D","line":38,"updated":"2014-02-28 10:34:58.000000000","message":"Assuming this is copied from vmware driver, this is just duplicating  hw_disk_bus/hw_scsi_model but with worse semantics","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwQ4%3D","line":38,"in_reply_to":"AAAAVX%2F%2Fx78%3D","updated":"2014-02-28 14:55:49.000000000","message":"Yes, nix this","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx7k%3D","line":39,"updated":"2014-02-28 10:34:58.000000000","message":"Sounds like it copoies hw_disk_bus again","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwQw%3D","line":39,"in_reply_to":"AAAAVX%2F%2Fx7k%3D","updated":"2014-02-28 14:55:49.000000000","message":"Yes","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx7Q%3D","line":41,"updated":"2014-02-28 10:34:58.000000000","message":"Doesn\u0027t seem at all related to guest hardware, so hw_ prefix is inappropriate","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwQs%3D","line":41,"in_reply_to":"AAAAVX%2F%2Fx7Q%3D","updated":"2014-02-28 14:55:49.000000000","message":"Yeah, img_version","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx7M%3D","line":42,"updated":"2014-02-28 10:34:58.000000000","message":"Doesn\u0027t seem at all related to guest hardware, so hw_ prefix is inappropriate","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        # Probably need to change this"},{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwPc%3D","line":42,"in_reply_to":"AAAAVX%2F%2Fx7M%3D","updated":"2014-02-28 14:55:49.000000000","message":"Yeah, this is something vmware guys used to indicate that they\u0027re using CoW disks I think. So, img_prefix and probably \"cow\" instead of \"linked clone\". We already have a config variable for cow I think, so we should probably mirror that.","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027img_compression_level\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx7E%3D","line":44,"updated":"2014-02-28 10:34:58.000000000","message":"Unclear what this is, but not sure its related to guest hardware","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027hw_image_version\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027img_compression_level\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwQE%3D","line":44,"in_reply_to":"AAAAVX%2F%2Fx7E%3D","updated":"2014-02-28 14:55:49.000000000","message":"It\u0027s on our instance and there are utility method in nova.utils for this. I think it has something to do with attaching the disks in order to the instance, instead of honoring the device_id or something like that.","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_ipxe_boot\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027hw_device_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027img_compression_level\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027img_use_agent\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx6o%3D","line":45,"updated":"2014-02-28 10:34:58.000000000","message":"This seems more relate to host network config than guest hardware, unless this is really used to set the guest boot device order ?","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027os_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":51,"context_line":"            nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":55,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx5o%3D","line":52,"updated":"2014-02-28 10:34:58.000000000","message":"What is this about ? If its related to images, then an img_ prefix is needed","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027os_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":51,"context_line":"            nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":55,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwNM%3D","line":52,"in_reply_to":"AAAAVX%2F%2Fx5o%3D","updated":"2014-02-28 14:55:49.000000000","message":"https://github.com/openstack/nova/blob/master/nova/virt/xenapi/vm_utils.py#L68-71\n\nIf this is set\u003dFalse, it may cause nova to not store the image for later use, if so configured (and running xenapi)","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":51,"context_line":"            nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx58%3D","line":53,"updated":"2014-02-28 10:34:58.000000000","message":"IIRC this is used to choose between different virt types, so is really a probably better as a \u0027hw_virt_mode\u0027 or \u0027hw_virt_type\u0027 name.","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":51,"context_line":"            nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwMw%3D","line":53,"in_reply_to":"AAAAVX%2F%2Fx58%3D","updated":"2014-02-28 14:55:49.000000000","message":"Yeah, hw_virt_mode \u003d (PV, HVM, etc) would be good I think","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    property_map \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx5U%3D","line":54,"updated":"2014-02-28 10:34:58.000000000","message":"What is this about, should it have an img_ prefix again","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":55,"context_line":"    }"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    property_map \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwMg%3D","line":54,"in_reply_to":"AAAAVX%2F%2Fx5U%3D","updated":"2014-02-28 14:55:49.000000000","message":"Yeah, img_","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"963d1067d6003f582ac23d6e27ba9ce38495ae67","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":131,"context_line":"        obj \u003d cls()"},{"line_number":132,"context_line":"        obj.from_image_props(image_meta.get(\u0027properties\u0027, {}))"},{"line_number":133,"context_line":"        return obj"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx48%3D","line":133,"updated":"2014-02-28 10:34:58.000000000","message":"I think that this class should have getter methods for every defined property, rather than having callers continue to pass through magic string constants.","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"9a17bf9b98f4097e4dc6c22269b3df555a02c0b9","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":131,"context_line":"        obj \u003d cls()"},{"line_number":132,"context_line":"        obj.from_image_props(image_meta.get(\u0027properties\u0027, {}))"},{"line_number":133,"context_line":"        return obj"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwIk%3D","line":133,"in_reply_to":"AAAAVX%2F%2FwLU%3D","updated":"2014-02-28 15:01:54.000000000","message":"Ok, I didn\u0027t spot that properties get auto-created because the driver.py code changes are still manually calling the general helpers above using magic strings in many places.","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6f485f4373bfd84a0b5ec2ee198b4d3e1073ad66","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":131,"context_line":"        obj \u003d cls()"},{"line_number":132,"context_line":"        obj.from_image_props(image_meta.get(\u0027properties\u0027, {}))"},{"line_number":133,"context_line":"        return obj"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2Fx4E%3D","line":133,"in_reply_to":"AAAAVX%2F%2Fx48%3D","updated":"2014-02-28 10:36:54.000000000","message":"Also each getter should have a inline API doc which describes the intended usage of the property and its commonly permitted values.","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"94f0957e1c6b94aca726506e33c8bb6808ec7b43","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":131,"context_line":"        obj \u003d cls()"},{"line_number":132,"context_line":"        obj.from_image_props(image_meta.get(\u0027properties\u0027, {}))"},{"line_number":133,"context_line":"        return obj"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwLU%3D","line":133,"in_reply_to":"AAAAVX%2F%2Fx4E%3D","updated":"2014-02-28 14:55:49.000000000","message":"It\u0027s a NovaObject, so each of the things in the fields list above gets turned into an @property magically, filtered through the Field class defined in the fields dict.\n\nWhat might be confusing is that they\u0027re mostly strings now, but they *should* be Booleans, integers, etc as appropriate. The object infrastructure takes care of ensuring that they get coerced to the proper type (or raised if that\u0027s not possible).","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d241cece6c6916f534867f414597b63a9ce0dac3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def iteritems(self):"},{"line_number":100,"context_line":"        for key in self.fields:"},{"line_number":101,"context_line":"            if self[key] is not None:"},{"line_number":102,"context_line":"                print \"Yielding %s,%s\" % (key, self[key])"},{"line_number":103,"context_line":"                yield (key, self[key])"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                print \"Nothing for %s\" % key"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAVX%2F%2Fvws%3D","line":102,"updated":"2014-02-28 15:59:56.000000000","message":"We really shouldn\u0027t use print but logging facilities instead","commit_id":"5e2543cd68303b1a443f2b2aa057ca2fd0bb961d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 Red Hat, Inc"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_1a62ee3d","line":1,"updated":"2014-07-04 10:03:18.000000000","message":"2014?","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.openstack.common import log as logging"},{"line_number":19,"context_line":"from nova import utils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_1a7bcef5","line":21,"updated":"2014-07-04 10:03:18.000000000","message":"this is not used","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5a81c6c1","line":24,"updated":"2014-07-04 10:03:18.000000000","message":"ditto","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def iteritems(self):"},{"line_number":110,"context_line":"        for key in self.fields:"},{"line_number":111,"context_line":"            if self[key] is not None:"},{"line_number":112,"context_line":"                LOG.debug(\"Yielding %s,%s\" % (key, self[key]))"},{"line_number":113,"context_line":"                yield (key, self[key])"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                LOG.debug(\"Nothing for %s\" % key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_ba6bc21c","line":112,"updated":"2014-07-04 10:03:18.000000000","message":"can you please use a , instead of %","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                LOG.debug(\"Yielding %s,%s\" % (key, self[key]))"},{"line_number":113,"context_line":"                yield (key, self[key])"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                LOG.debug(\"Nothing for %s\" % key)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def from_image_properties(cls, image_props):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_da74f6ff","line":115,"updated":"2014-07-04 10:03:18.000000000","message":"ditto","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from nova.image import glance"},{"line_number":16,"context_line":"from nova.objects import base"},{"line_number":17,"context_line":"from nova.objects import fields"},{"line_number":18,"context_line":"from nova.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_186b9685","line":15,"updated":"2014-07-07 22:51:23.000000000","message":"The glance module should no longer be directly used.\n\nInstead, do this:\n\n from nova import image","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class VirtProperties(base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_980ec6e3","line":25,"updated":"2014-07-07 22:51:23.000000000","message":"And here, do this:\n\n IMAGE_API \u003d image.API()","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":62,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":63,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":64,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":65,"context_line":"    }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    property_map \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_98afa67c","line":64,"updated":"2014-07-07 22:51:23.000000000","message":"How about adding defaults for all of the above? That would reduce the need for if/else blocks in subsequent files.","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def get_by_image_id(cls, context, image_id):"},{"line_number":140,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service("},{"line_number":141,"context_line":"                context, image_id)"},{"line_number":142,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":143,"context_line":"        obj \u003d cls()"},{"line_number":144,"context_line":"        obj.from_image_props(image_meta.get(\u0027properties\u0027, {}))"},{"line_number":145,"context_line":"        return obj"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_f8f6e2d5","line":142,"updated":"2014-07-07 22:51:23.000000000","message":"Change lines 140-142 to this:\n\n image_meta \u003d IMAGE_API.get(context, image_id)","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e31625bbf1cdd62ce0d9566d7c3a81fcb7d88438","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 Red Hat, Inc"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_4aad5f9a","line":1,"updated":"2014-07-14 12:28:04.000000000","message":"2013 \u003d\u003e 2014","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e31625bbf1cdd62ce0d9566d7c3a81fcb7d88438","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.openstack.common import log as logging"},{"line_number":19,"context_line":"from nova import utils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ca988f77","line":21,"updated":"2014-07-14 12:28:04.000000000","message":"not used","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e31625bbf1cdd62ce0d9566d7c3a81fcb7d88438","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":"IMAGE_API \u003d image.API()"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ea8ab319","line":24,"updated":"2014-07-14 12:28:04.000000000","message":"not used","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e31625bbf1cdd62ce0d9566d7c3a81fcb7d88438","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \u0027hw_disktype\u0027: [\u0027vmware_disktype\u0027],"},{"line_number":73,"context_line":"        \u0027hw_image_version\u0027: [\u0027vmware_image_version\u0027],"},{"line_number":74,"context_line":"        \u0027hw_linked_clone\u0027: [\u0027vmware_linked_clone\u0027],"},{"line_number":75,"context_line":"        \u0027os_type\u0027: [\u0027vmware_ostype\u0027, \u0027os_type\u0027],"},{"line_number":76,"context_line":"        \u0027hw_auto_disk_config\u0027: [\u0027auto_disk_config\u0027],"},{"line_number":77,"context_line":"        \u0027hw_ipxe_boot\u0027: [\u0027ipxe_boot\u0027],"},{"line_number":78,"context_line":"        \u0027hw_device_id\u0027: [\u0027xenapi_device_id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_8ac77744","line":75,"updated":"2014-07-14 12:28:04.000000000","message":"why is os_type defined twice here?","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e31625bbf1cdd62ce0d9566d7c3a81fcb7d88438","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def iteritems(self):"},{"line_number":110,"context_line":"        for key in self.fields:"},{"line_number":111,"context_line":"            if self[key] is not None:"},{"line_number":112,"context_line":"                LOG.debug(\"Yielding %s,%s\" % (key, self[key]))"},{"line_number":113,"context_line":"                yield (key, self[key])"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                LOG.debug(\"Nothing for %s\" % key)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_0a8e072e","line":112,"updated":"2014-07-14 12:28:04.000000000","message":"can you please use a , instead of the %","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e31625bbf1cdd62ce0d9566d7c3a81fcb7d88438","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                LOG.debug(\"Yielding %s,%s\" % (key, self[key]))"},{"line_number":113,"context_line":"                yield (key, self[key])"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                LOG.debug(\"Nothing for %s\" % key)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def from_image_properties(cls, image_props):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_2a810bfb","line":115,"updated":"2014-07-14 12:28:04.000000000","message":"ditto","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"677d41cb8cffc57ababc1012c9be562a99aa850d","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova import utils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":"IMAGE_API \u003d image.API()"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_e0d16fcd","line":22,"updated":"2014-07-30 16:37:29.000000000","message":"Will be unused, so please remove this and the log import above (see below...)","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"677d41cb8cffc57ababc1012c9be562a99aa850d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027hw_rng\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027hw_scsi_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027hw_video_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_video_ram\u0027: fields.StringField(default\u003d\u00270\u0027),"},{"line_number":39,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_6018ffcd","line":38,"updated":"2014-07-30 16:37:29.000000000","message":"Should be IntegerField.","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3d388eb22bc1c1ca138d2517bd2015c968427b68","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":56,"context_line":"            nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027vm_mode\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":59,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":60,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":61,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_ddb61489","line":58,"updated":"2014-07-30 16:15:54.000000000","message":"I\u0027m wondering why we don\u0027t have a \u0027hw_\u0027 prefix on this one, since it is an aspect of the guest hardware setup IIRC.","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"677d41cb8cffc57ababc1012c9be562a99aa850d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    def iteritems(self):"},{"line_number":107,"context_line":"        for key in self.fields:"},{"line_number":108,"context_line":"            if self[key] is not None:"},{"line_number":109,"context_line":"                LOG.debug(\"Yielding %s,%s\", (key, self[key]))"},{"line_number":110,"context_line":"                yield (key, self[key])"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                LOG.debug(\"Nothing for %s\", key)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_80c4330f","line":109,"updated":"2014-07-30 16:37:29.000000000","message":"Please remove this debug log and the one below. This will blow up the debug logs terribly :)","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class VirtProperties(base.NovaObject):"},{"line_number":25,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    fields \u003d {"},{"line_number":28,"context_line":"        \u0027hw_architecture\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027hw_cdrom_bus\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_429fdff5","line":26,"updated":"2014-08-12 10:54:20.000000000","message":"I think we should probably have inline docs describing the intended usage of each property name prefix, so it is clearer to people which they should use\n\n  - \"hw_\" - settings affecting the guest virtual machine hardware\n  - \u0027img_\u0027 - settings affecting the use of images by the compute node\n  - \u0027os_\u0027 - settings affecting the guest operating system setup","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027hw_vif_model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027hw_os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027hw_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027hw_image_version\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_c20f6f36","line":40,"updated":"2014-08-12 10:54:20.000000000","message":"I think this is an image property not a hardware property, so should have \u0027img_\u0027 prefix.","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        \u0027hw_adaptertype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027hw_disktype\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027hw_image_version\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hw_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027hw_machine_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027hw_auto_disk_config\u0027: fields.BooleanField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_22290b9c","line":44,"updated":"2014-08-12 10:54:20.000000000","message":"I think this is an image property not a hardware property, so should have \u0027img_\u0027 prefix.","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        \u0027os_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":55,"context_line":"            nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":59,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_e27473d1","line":56,"updated":"2014-08-12 10:54:20.000000000","message":"This seems to be an image related property, so \u0027img_\u0027 prefix is desired.","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027: fields.StringField("},{"line_number":55,"context_line":"            nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":59,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":60,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_82649721","line":57,"updated":"2014-08-12 10:54:20.000000000","message":"Again, \u0027img_\u0027 prefix","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":59,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_0205e713","line":58,"updated":"2014-08-12 10:54:20.000000000","message":"Seems to be a duplicate of \u0027hw_os_command_line\u0027, so can be removed.","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e26501fba92c4383e8606858d0be35f6a859c43d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \u0027cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":59,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    property_map \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_a23efbe0","line":59,"updated":"2014-08-12 10:54:20.000000000","message":"Overall it would be nice to sort this list of fields alphabetically and add inline doc for the description of purpose of each field as described in https://wiki.openstack.org/wiki/VirtDriverImageProperties","commit_id":"5b7c151fba6a9decf349ffd164df22162d2d5804"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"5803aa7d436aa0474b0cec39c349ba6965d4bfda","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # \u0027virt\u0027 or \u0027vexpress-a15\u0027 (for ARM)"},{"line_number":88,"context_line":"        \u0027hw_machine_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # used for many things, such as PV vs HVM defaults, default filesystem"},{"line_number":91,"context_line":"        # types, etc"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_09fa10bd","line":88,"updated":"2014-08-19 13:06:51.000000000","message":"Out of order wrt alphanum","commit_id":"da9f71eecfb97133ccbf96bd32d22475a9ba048f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"5803aa7d436aa0474b0cec39c349ba6965d4bfda","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # used for many things, such as PV vs HVM defaults, default filesystem"},{"line_number":91,"context_line":"        # types, etc"},{"line_number":92,"context_line":"        \u0027os_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # \"xen\" vs \"hvm\""},{"line_number":95,"context_line":"        \u0027hw_vm_mode\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_49bfa8fb","line":92,"updated":"2014-08-19 13:06:51.000000000","message":"Just move this later to keep alphanum ordering.","commit_id":"da9f71eecfb97133ccbf96bd32d22475a9ba048f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"5803aa7d436aa0474b0cec39c349ba6965d4bfda","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # boolean - if True, and image cache set to \"some\" decides if image"},{"line_number":114,"context_line":"        # should be cached on host when server is booted on that host"},{"line_number":115,"context_line":"        \u0027img_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # boolean - if using agent don\u0027t try inject ssh key, assume someone"},{"line_number":118,"context_line":"        # else is doing that (cloud-init)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_892d4049","line":115,"updated":"2014-08-19 13:06:51.000000000","message":"These img_ props aren\u0027t alphanum sorted correctly","commit_id":"da9f71eecfb97133ccbf96bd32d22475a9ba048f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"5803aa7d436aa0474b0cec39c349ba6965d4bfda","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            nullable\u003dTrue),"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # name of the RNG device type eg virtio"},{"line_number":130,"context_line":"        \u0027hw_rng_model\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":131,"context_line":"    }"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    property_map \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_c942d80f","line":130,"updated":"2014-08-19 13:06:51.000000000","message":"Move up to preserve alpha ordering","commit_id":"da9f71eecfb97133ccbf96bd32d22475a9ba048f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"5803aa7d436aa0474b0cec39c349ba6965d4bfda","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        \u0027os_skip_agent_inject_ssh\u0027: [\u0027xenapi_skip_agent_inject_ssh\u0027],"},{"line_number":148,"context_line":"        \u0027os_skip_agent_inject_files_at_boot\u0027:"},{"line_number":149,"context_line":"            [\u0027xenapi_skip_agent_inject_files_at_boot\u0027],"},{"line_number":150,"context_line":"        \u0027cache_in_nova\u0027: [\u0027cache_in_nova\u0027],"},{"line_number":151,"context_line":"        \u0027hw_vm_mode\u0027: [\u0027vm_mode\u0027],"},{"line_number":152,"context_line":"        \u0027bittorrent\u0027: [\u0027bittorrent\u0027]"},{"line_number":153,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_0973f080","line":150,"updated":"2014-08-19 13:06:51.000000000","message":"The left hand side needs the \u0027img_\u0027 prefix.","commit_id":"da9f71eecfb97133ccbf96bd32d22475a9ba048f"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"5803aa7d436aa0474b0cec39c349ba6965d4bfda","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            [\u0027xenapi_skip_agent_inject_files_at_boot\u0027],"},{"line_number":150,"context_line":"        \u0027cache_in_nova\u0027: [\u0027cache_in_nova\u0027],"},{"line_number":151,"context_line":"        \u0027hw_vm_mode\u0027: [\u0027vm_mode\u0027],"},{"line_number":152,"context_line":"        \u0027bittorrent\u0027: [\u0027bittorrent\u0027]"},{"line_number":153,"context_line":"        }"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_6968e487","line":152,"updated":"2014-08-19 13:06:51.000000000","message":"The left hand side needs \u0027img_\u0027 prefix. I\u0027d ensure this whole list is alphanum sorted too","commit_id":"da9f71eecfb97133ccbf96bd32d22475a9ba048f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \u0027hw_watchdog_action\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # if true download using bittorrent"},{"line_number":94,"context_line":"        \u0027img_bittorrent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # boolean - if True, and image cache set to \"some\" decides if image"},{"line_number":97,"context_line":"        # should be cached on host when server is booted on that host"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_1becbfba","line":94,"updated":"2014-08-28 14:06:48.000000000","message":"Shouldn\u0027t this be a boolean?","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # boolean - if True, and image cache set to \"some\" decides if image"},{"line_number":97,"context_line":"        # should be cached on host when server is booted on that host"},{"line_number":98,"context_line":"        \u0027img_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # Compression level for images. (1-9)"},{"line_number":101,"context_line":"        \u0027img_compression_level\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_5b31d758","line":98,"updated":"2014-08-28 14:06:48.000000000","message":"This says boolean, but is a string.","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027img_cache_in_nova\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # Compression level for images. (1-9)"},{"line_number":101,"context_line":"        \u0027img_compression_level\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # boolean flag to set space-saving or performance behavior on the"},{"line_number":104,"context_line":"        # Datastore"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_9b00cf67","line":101,"updated":"2014-08-28 14:06:48.000000000","message":"Shouldn\u0027t this be an integer?","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # boolean flag to set space-saving or performance behavior on the"},{"line_number":104,"context_line":"        # Datastore"},{"line_number":105,"context_line":"        \u0027img_linked_clone\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # image project id (set on upload)"},{"line_number":108,"context_line":"        \u0027img_owner_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_1b43dfaf","line":105,"updated":"2014-08-28 14:06:48.000000000","message":"boolean?","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        \u0027img_owner_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # boolean - if false don\u0027t talk to nova agent"},{"line_number":111,"context_line":"        \u0027img_use_agent\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # string of boot time command line arguments for the guest kernel"},{"line_number":114,"context_line":"        \u0027os_command_line\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_db3c0732","line":111,"updated":"2014-08-28 14:06:48.000000000","message":"boolean?","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        # boolean - if using agent don\u0027t try inject ssh key, assume someone"},{"line_number":122,"context_line":"        # else is doing that (cloud-init)"},{"line_number":123,"context_line":"        \u0027os_skip_agent_inject_ssh\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        # used for many things, such as PV vs HVM defaults, default filesystem"},{"line_number":126,"context_line":"        # types, etc"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_5b7f17e0","line":123,"updated":"2014-08-28 14:06:48.000000000","message":"these two are both marked boolean, but are strings.","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    def _migrate_old_property(self, image_props, key):"},{"line_number":159,"context_line":"        for old_key in self.property_map.get(key, []):"},{"line_number":160,"context_line":"            if old_key in image_props:"},{"line_number":161,"context_line":"                # NOTE(danms): This needs data migration"},{"line_number":162,"context_line":"                return image_props[old_key]"},{"line_number":163,"context_line":"        return None"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_1b291f9b","line":161,"updated":"2014-08-28 14:06:48.000000000","message":"The data migration is the most interesting/helpful part. I think I put this NOTE in there in an initial POC of this, expecting that it would get done. What\u0027s the plan for actually doing that part?","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            if key in image_props:"},{"line_number":168,"context_line":"                self[key] \u003d image_props[key]"},{"line_number":169,"context_line":"            else:"},{"line_number":170,"context_line":"                self[key] \u003d self._migrate_old_property(image_props, key)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def iteritems(self):"},{"line_number":173,"context_line":"        for key in self.fields:"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_dbade732","line":170,"updated":"2014-08-28 14:06:48.000000000","message":"Note that this will result in all things in the map being None if they\u0027re missing, instead of \"unset\".\n\nGiven the nature of this thing, I think it probably makes sense to not have anything be unset and instead set things to None if they\u0027re missing or unspecified. To do that, add an obj_load_attr() method that just sets anything we try to load to None. Something like:\n\n def obj_load_attr(self, name):\n     setattr(self, name, None)","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"432fdbbcf95412653aca263d3d37e17e7643da9e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"IMAGE_API \u003d image.API()"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class VirtProperties(base.NovaObject):"},{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    # \u0027hw_\u0027 - settings affecting the guest virtual machine hardware"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aa7fdbe_37c9aeac","line":25,"updated":"2014-10-23 18:23:26.000000000","message":"I just request a docstring here for this object, since it\u0027s not clear right now to the user exactly what this object represents. How about something like this:\n\n    \"\"\"Collection of named fields representing *image* properties.\"\"\"\n\nAlternately, you could rename the class to VirtImageProperties? That would prevent readers from assuming that the object contained properties that were not image-related?","commit_id":"3afb49b7f51b97dfc8a041290a9dab6510f66b75"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"9e427bcca9419a61479273b26c708c10bc16d43b","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            if key in image_props:"},{"line_number":169,"context_line":"                value \u003d image_props[key]"},{"line_number":170,"context_line":"            else:"},{"line_number":171,"context_line":"                value \u003d self._migrate_old_property(image_props, key)"},{"line_number":172,"context_line":"            if isinstance(self.fields[key], fields.BooleanField):"},{"line_number":173,"context_line":"                self[key] \u003d strutils.bool_from_string(value)"},{"line_number":174,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa98f980_5e590859","line":171,"updated":"2014-09-02 20:07:07.000000000","message":"Should this be marked with an expiration clause?","commit_id":"3afb49b7f51b97dfc8a041290a9dab6510f66b75"}],"nova/tests/objects/test_virt_properties.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class TestVirtProperties(test.NoDBTestCase):"},{"line_number":22,"context_line":"    def test_normal_properties(self):"},{"line_number":23,"context_line":"        props \u003d {\u0027os_type\u0027: \u0027foo\u0027,"},{"line_number":24,"context_line":"                 # Fill sane values for the rest here"},{"line_number":25,"context_line":"                 }"},{"line_number":26,"context_line":"        virtprops \u003d virt_properties.VirtProperties.from_image_properties("},{"line_number":27,"context_line":"            props)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_fa48dab4","line":24,"updated":"2014-07-04 10:03:18.000000000","message":"same as comment below","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        virtprops \u003d virt_properties.VirtProperties.from_image_properties("},{"line_number":27,"context_line":"            props)"},{"line_number":28,"context_line":"        self.assertEqual(\u0027foo\u0027, virtprops.os_type)"},{"line_number":29,"context_line":"        # Check the rest here"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def test_os_type_migrations_vmware(self):"},{"line_number":32,"context_line":"        props \u003d {\u0027vmware_ostype\u0027: \u0027foo\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_9a551e52","line":29,"updated":"2014-07-04 10:03:18.000000000","message":"do you want to add more tests or just remove the comment","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class TestVirtProperties(test.NoDBTestCase):"},{"line_number":22,"context_line":"    def test_normal_properties(self):"},{"line_number":23,"context_line":"        props \u003d {\u0027os_type\u0027: \u0027foo\u0027,"},{"line_number":24,"context_line":"                 # Fill sane values for the rest here"},{"line_number":25,"context_line":"                 }"},{"line_number":26,"context_line":"        virtprops \u003d virt_properties.VirtProperties.from_image_properties("},{"line_number":27,"context_line":"            props)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_98fde670","line":24,"updated":"2014-07-07 22:51:23.000000000","message":"Please fill these in :)","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"677d41cb8cffc57ababc1012c9be562a99aa850d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from nova.objects import virt_properties"},{"line_number":16,"context_line":"from nova import test"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_a0b697d9","line":15,"updated":"2014-07-30 16:37:29.000000000","message":"from nova import objects","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"677d41cb8cffc57ababc1012c9be562a99aa850d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                 \u0027hw_scsi_model\u0027: \u0027virtio-scsi\u0027,"},{"line_number":28,"context_line":"                 # Fill sane values for the rest here"},{"line_number":29,"context_line":"                 }"},{"line_number":30,"context_line":"        virtprops \u003d virt_properties.VirtProperties.from_image_properties("},{"line_number":31,"context_line":"                props)"},{"line_number":32,"context_line":"        self.assertEqual(\u0027foo\u0027, virtprops.os_type)"},{"line_number":33,"context_line":"        self.assertEqual(\u0027vga\u0027, virtprops.hw_video_model)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_e0b08fde","line":30,"updated":"2014-07-30 16:37:29.000000000","message":"objects.VirtProperties(...)\n\nhere and throughout","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"}],"nova/tests/unit/objects/test_image_meta.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"83fefa03b5868a82b7f0e442c37360fd166f1480","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEqual(\u0027c8b1790e-a07d-4971-b137-44f2432936cd\u0027, image_meta.id)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        image_meta_props \u003d image_meta.properties"},{"line_number":67,"context_line":"        self.assertEqual(\u0027foo\u0027, image_meta_props.os_type)"},{"line_number":68,"context_line":"        self.assertEqual(\u0027vga\u0027, image_meta_props.hw_video_model)"},{"line_number":69,"context_line":"        self.assertEqual(512, image_meta_props.hw_video_ram)"},{"line_number":70,"context_line":"        self.assertEqual(True, image_meta_props.hw_qemu_guest_agent)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5ad0253b_c2f157cf","line":67,"updated":"2015-04-29 12:56:49.000000000","message":"I think you only need to assess that you will get an instance of ImageMetaProps, that\u0027s it for isolating the tests","commit_id":"ec7cad137e662ae340ddd4c2ad062d6d323bd1d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8cd7c85a0f414acab5d297631ed063690e2e7d81","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEqual(\u0027c8b1790e-a07d-4971-b137-44f2432936cd\u0027, image_meta.id)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        image_meta_props \u003d image_meta.properties"},{"line_number":67,"context_line":"        self.assertEqual(\u0027foo\u0027, image_meta_props.os_type)"},{"line_number":68,"context_line":"        self.assertEqual(\u0027vga\u0027, image_meta_props.hw_video_model)"},{"line_number":69,"context_line":"        self.assertEqual(512, image_meta_props.hw_video_ram)"},{"line_number":70,"context_line":"        self.assertEqual(True, image_meta_props.hw_qemu_guest_agent)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3acd31a7_69484d2e","line":67,"updated":"2015-04-29 16:01:42.000000000","message":"I think you only need to assess that you will get an instance of ImageMetaProps, that\u0027s it for isolating the tests","commit_id":"5b31fd8f00e76a51979afe07150135d5bcc0a7d7"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"dad412ccfd24899a2c9f9bed8048b729e99ad47a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEqual(\u0027c8b1790e-a07d-4971-b137-44f2432936cd\u0027, image_meta.id)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        image_meta_props \u003d image_meta.properties"},{"line_number":67,"context_line":"        self.assertEqual(\u0027foo\u0027, image_meta_props.os_type)"},{"line_number":68,"context_line":"        self.assertEqual(\u0027vga\u0027, image_meta_props.hw_video_model)"},{"line_number":69,"context_line":"        self.assertEqual(512, image_meta_props.hw_video_ram)"},{"line_number":70,"context_line":"        self.assertEqual(True, image_meta_props.hw_qemu_guest_agent)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3acd31a7_c90be17c","line":67,"in_reply_to":"3acd31a7_69484d2e","updated":"2015-04-29 16:12:43.000000000","message":"Yes, good point, forgot about changing this.","commit_id":"5b31fd8f00e76a51979afe07150135d5bcc0a7d7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class TestImageMeta(test.NoDBTestCase):"},{"line_number":22,"context_line":"    def test_basic_attrs(self):"},{"line_number":23,"context_line":"        image \u003d {\u0027status\u0027: \u0027active\u0027,"},{"line_number":24,"context_line":"                 \u0027deleted\u0027: False,"},{"line_number":25,"context_line":"                 \u0027container_format\u0027: \u0027bare\u0027,"},{"line_number":26,"context_line":"                 \u0027min_ram\u0027: 0,"},{"line_number":27,"context_line":"                 \u0027updated_at\u0027: \u00272014-12-12T11:16:36.000000\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_642cbb4a","line":24,"updated":"2015-05-27 15:03:26.000000000","message":"deleted is no longer a field","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                 \u0027min_disk\u0027: \u00270\u0027,"},{"line_number":30,"context_line":"                 \u0027owner\u0027: \u00272d8b9502858c406ebee60f0849486222\u0027,"},{"line_number":31,"context_line":"                 # Testing string -\u003e bool conversion"},{"line_number":32,"context_line":"                 \u0027is_public\u0027: \u0027yes\u0027,"},{"line_number":33,"context_line":"                 \u0027deleted_at\u0027: None,"},{"line_number":34,"context_line":"                 \u0027properties\u0027: {"},{"line_number":35,"context_line":"                     \u0027os_type\u0027: \u0027Linux\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_44509f0a","line":32,"updated":"2015-05-27 15:03:26.000000000","message":"guess the field is now called \u0027protected\u0027","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                 \u0027owner\u0027: \u00272d8b9502858c406ebee60f0849486222\u0027,"},{"line_number":31,"context_line":"                 # Testing string -\u003e bool conversion"},{"line_number":32,"context_line":"                 \u0027is_public\u0027: \u0027yes\u0027,"},{"line_number":33,"context_line":"                 \u0027deleted_at\u0027: None,"},{"line_number":34,"context_line":"                 \u0027properties\u0027: {"},{"line_number":35,"context_line":"                     \u0027os_type\u0027: \u0027Linux\u0027,"},{"line_number":36,"context_line":"                     \u0027hw_video_model\u0027: \u0027vga\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_84fe97ac","line":33,"updated":"2015-05-27 15:03:26.000000000","message":"deleted_at is no longer a field","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        image_meta \u003d objects.ImageMeta.from_dict(image)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self.assertEqual(\u0027active\u0027, image_meta.status)"},{"line_number":51,"context_line":"        self.assertFalse(image_meta.deleted)"},{"line_number":52,"context_line":"        self.assertEqual(\u0027bare\u0027, image_meta.container_format)"},{"line_number":53,"context_line":"        self.assertEqual(0, image_meta.min_ram)"},{"line_number":54,"context_line":"        self.assertIsInstance(image_meta.updated_at, datetime.datetime)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_44e09fcc","line":51,"updated":"2015-05-27 15:03:26.000000000","message":"see above","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.assertIsInstance(image_meta.updated_at, datetime.datetime)"},{"line_number":55,"context_line":"        self.assertEqual(0, image_meta.min_disk)"},{"line_number":56,"context_line":"        self.assertEqual(\u00272d8b9502858c406ebee60f0849486222\u0027, image_meta.owner)"},{"line_number":57,"context_line":"        self.assertTrue(image_meta.is_public)"},{"line_number":58,"context_line":"        self.assertIsNone(image_meta.deleted_at)"},{"line_number":59,"context_line":"        self.assertEqual(213581824, image_meta.size)"},{"line_number":60,"context_line":"        self.assertEqual(\u0027f16-x86_64-openstack-sda\u0027, image_meta.name)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_8471f746","line":57,"updated":"2015-05-27 15:03:26.000000000","message":"here the test is not failing because of https://github.com/openstack/nova/blob/master/nova/objects/base.py#L274-L275 but this is just an object attribute, not a NovaObject field typed and versioned (so as this is a string, it\u0027s True)","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6b91653fc804c2f8fe0118224f9937a0504e80eb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                 \u0027hw_video_model\u0027: \u0027vga\u0027,"},{"line_number":79,"context_line":"                 \u0027hw_video_ram\u0027: \u0027512\u0027,"},{"line_number":80,"context_line":"                 \u0027hw_qemu_guest_agent\u0027: \u0027yes\u0027,"},{"line_number":81,"context_line":"                 \u0027hw_scsi_model\u0027: \u0027virtio-scsi\u0027,"},{"line_number":82,"context_line":"                 # Fill sane values for the rest here"},{"line_number":83,"context_line":"                 }"},{"line_number":84,"context_line":"        virtprops \u003d objects.ImageMetaProps.from_dict(props)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a016987_bf987d6b","line":81,"updated":"2015-05-27 15:56:47.000000000","message":"probably bikeshed : well, this hw_scsi_model key can be provided directly or have a legacy key mapped to it (vmware_adaptertype) so that\u0027s not really a normal prop IMHO","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79be7b1aeb7011ea09d01640d287195dd044f69f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"7a016987_642b9bec","line":159,"updated":"2015-05-27 15:03:26.000000000","message":"we are not testing the numa sets (for the memory and cpu)","commit_id":"b366611387b033d54080f0b26f8684cb7ab667a5"}],"nova/virt/libvirt/blockinfo.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d241cece6c6916f534867f414597b63a9ce0dac3","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    # Prefer a disk bus set against the image first of all"},{"line_number":227,"context_line":"    if image_meta:"},{"line_number":228,"context_line":"        key \u003d \"hw_\" + device_type + \"_bus\""},{"line_number":229,"context_line":"        virt_props \u003d virt_properties_obj.VirtProperties.get_from_metadata("},{"line_number":230,"context_line":"                    context, image_meta)"},{"line_number":231,"context_line":"        if virt_props.obj_attr_is_set(key):"},{"line_number":232,"context_line":"            disk_bus \u003d getattr(virt_props, key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAVX%2F%2FvuQ%3D","line":229,"updated":"2014-02-28 15:59:56.000000000","message":"You don\u0027t have this method on the object? I think you mean from_image_metadata. And you don\u0027t need the context... so you don\u0027t really need to pass it in all those methods.","commit_id":"5e2543cd68303b1a443f2b2aa057ca2fd0bb961d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7d05afe8062f797cda503a34fcdfdf4c3dabcdb9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"from nova.compute import flavors"},{"line_number":79,"context_line":"from nova import exception"},{"line_number":80,"context_line":"from nova.objects import base as obj_base"},{"line_number":81,"context_line":"from nova.objects import virt_properties as virt_properties_obj"},{"line_number":82,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":83,"context_line":"from nova.virt import block_device as driver_block_device"},{"line_number":84,"context_line":"from nova.virt import configdrive"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_9ab19e91","line":81,"updated":"2014-07-04 10:04:51.000000000","message":"i think this should be from nova import objects and then you should use objects.VirtProperties.","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    if image_meta:"},{"line_number":230,"context_line":"        key \u003d \"hw_\" + device_type + \"_bus\""},{"line_number":231,"context_line":"        disk_bus \u003d image_meta.get(\u0027properties\u0027, {}).get(key)"},{"line_number":232,"context_line":"        virt_props \u003d \\"},{"line_number":233,"context_line":"                virt_properties_obj.VirtProperties.from_image_metadata("},{"line_number":234,"context_line":"                        image_meta)"},{"line_number":235,"context_line":"        if virt_props.obj_attr_is_set(key):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_7ad4cabc","line":232,"updated":"2014-07-04 10:03:18.000000000","message":"any chance of writing this without the \\?","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":78,"context_line":"from nova.compute import flavors"},{"line_number":79,"context_line":"from nova import exception"},{"line_number":80,"context_line":"from nova.objects import base as obj_base"},{"line_number":81,"context_line":"from nova.objects import virt_properties as virt_properties_obj"},{"line_number":82,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":83,"context_line":"from nova.virt import block_device as driver_block_device"},{"line_number":84,"context_line":"from nova.virt import configdrive"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_1819d621","line":81,"updated":"2014-07-07 22:51:23.000000000","message":"Instead of the above, just add the VirtProperties object to the nova/objects/__init__.py file, and then you can just do:\n\n from nova import objects","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        disk_bus \u003d image_meta.get(\u0027properties\u0027, {}).get(key)"},{"line_number":232,"context_line":"        virt_props \u003d \\"},{"line_number":233,"context_line":"                virt_properties_obj.VirtProperties.from_image_metadata("},{"line_number":234,"context_line":"                        image_meta)"},{"line_number":235,"context_line":"        if virt_props.obj_attr_is_set(key):"},{"line_number":236,"context_line":"            disk_bus \u003d getattr(virt_props, key)"},{"line_number":237,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_58d6ee28","line":234,"updated":"2014-07-07 22:51:23.000000000","message":"And then you can instead do this:\n\n virt_props \u003d objects.VirtProperties.from_image_metadata(image_meta)\n\nand get rid of the annoying \\ :)","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2d61d1ab1e63e3a73b028e74f366e87560137130","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        if virt_props.obj_attr_is_set(key):"},{"line_number":234,"context_line":"            disk_bus \u003d getattr(virt_props, key)"},{"line_number":235,"context_line":"        else:"},{"line_number":236,"context_line":"            disk_bus \u003d None"},{"line_number":237,"context_line":"        if disk_bus is not None:"},{"line_number":238,"context_line":"            if not is_disk_bus_valid_for_virt(virt_type, disk_bus):"},{"line_number":239,"context_line":"                raise exception.UnsupportedHardware(model\u003ddisk_bus,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1abeadc6_7606aa1d","line":236,"updated":"2014-08-28 14:06:48.000000000","message":"The obj_load_attr() thing I mention in the object file will prevent you having to do this all the time.","commit_id":"f12071f52ae8389f0a3be4176995d16b685310dd"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"8e80ae6e53599d6d05b348cfe46ee31bcc2d2528","unresolved":false,"context_lines":[{"line_number":2986,"context_line":"        for d in devices:"},{"line_number":2987,"context_line":"            self.set_cache_mode(d)"},{"line_number":2988,"context_line":""},{"line_number":2989,"context_line":"        if (image_meta and"},{"line_number":2990,"context_line":"                image_meta.get(\u0027properties\u0027, {}).get(\u0027hw_scsi_model\u0027)):"},{"line_number":2991,"context_line":"            hw_scsi_model \u003d image_meta[\u0027properties\u0027][\u0027hw_scsi_model\u0027]"},{"line_number":2992,"context_line":"            scsi_controller \u003d vconfig.LibvirtConfigGuestController()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVX%2F%2F1xE%3D","line":2989,"updated":"2014-02-27 22:36:21.000000000","message":"This should be using the virt_properties_obj as well","commit_id":"0efd1671416c6ca471aad3d18d121c22ac606b59"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"8e80ae6e53599d6d05b348cfe46ee31bcc2d2528","unresolved":false,"context_lines":[{"line_number":3035,"context_line":"            nova_context.get_admin_context(read_deleted\u003d\u0027yes\u0027),"},{"line_number":3036,"context_line":"            instance[\u0027instance_type_id\u0027])"},{"line_number":3037,"context_line":"        inst_path \u003d libvirt_utils.get_instance_path(instance)"},{"line_number":3038,"context_line":"        disk_mapping \u003d disk_info[\u0027mapping\u0027]"},{"line_number":3039,"context_line":"        img_meta_prop \u003d image_meta.get(\u0027properties\u0027, {}) if image_meta else {}"},{"line_number":3040,"context_line":""},{"line_number":3041,"context_line":"        CONSOLE \u003d \"console\u003dtty0 console\u003dttyS0\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVX%2F%2F12w%3D","line":3038,"updated":"2014-02-27 22:36:21.000000000","message":"I think it should be either removed or replaced with virt_properties_obj","commit_id":"0efd1671416c6ca471aad3d18d121c22ac606b59"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"8e80ae6e53599d6d05b348cfe46ee31bcc2d2528","unresolved":false,"context_lines":[{"line_number":3138,"context_line":"            else:"},{"line_number":3139,"context_line":"                guest.os_boot_dev \u003d blockinfo.get_boot_order(disk_info)"},{"line_number":3140,"context_line":"        if image_meta:"},{"line_number":3141,"context_line":"            virt_props \u003d virt_properties_obj.VirtProperties.get_from_metadata("},{"line_number":3142,"context_line":"                    context, image_meta)"},{"line_number":3143,"context_line":"            if virt_props.obj_attr_is_set(\u0027hw_os_command_line\u0027):"},{"line_number":3144,"context_line":"                guest.os_cmdline \u003d virt_props.hw_os_command_line"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVX%2F%2F1zk%3D","line":3141,"updated":"2014-02-27 22:36:21.000000000","message":"I think you can initialize this variable only once, on line 3039, replacing the img_meta_prop initialization.\nRight now you are initializing it several times with different names (ie. virt_props, meta_prop)","commit_id":"0efd1671416c6ca471aad3d18d121c22ac606b59"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"8e80ae6e53599d6d05b348cfe46ee31bcc2d2528","unresolved":false,"context_lines":[{"line_number":3286,"context_line":"                    raise exception.InvalidVideoMode(model\u003dvideo.type)"},{"line_number":3287,"context_line":""},{"line_number":3288,"context_line":"            # Set video memory, only if the flavor\u0027s limit is set"},{"line_number":3289,"context_line":"            video_ram \u003d int(img_meta_prop.get(\u0027hw_video_ram\u0027, 0))"},{"line_number":3290,"context_line":"            max_vram \u003d int(flavor.extra_specs"},{"line_number":3291,"context_line":"                                    .get(\u0027hw_video:ram_max_mb\u0027, 0))"},{"line_number":3292,"context_line":"            if video_ram \u003e max_vram:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVX%2F%2F16A%3D","line":3289,"updated":"2014-02-27 22:36:21.000000000","message":"This variable should be called meta_prop as well, since you have change it above.","commit_id":"0efd1671416c6ca471aad3d18d121c22ac606b59"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"8e80ae6e53599d6d05b348cfe46ee31bcc2d2528","unresolved":false,"context_lines":[{"line_number":3319,"context_line":"                                (\"org.qemu.guest_agent.0\", instance[\u0027name\u0027]))"},{"line_number":3320,"context_line":"                guest.add_device(qga)"},{"line_number":3321,"context_line":""},{"line_number":3322,"context_line":"            if (img_meta_prop.get(\u0027hw_rng_model\u0027) \u003d\u003d \u0027virtio\u0027 and"},{"line_number":3323,"context_line":"                flavor.extra_specs.get(\u0027hw_rng:allowed\u0027,"},{"line_number":3324,"context_line":"                                             \u0027\u0027).lower() \u003d\u003d \u0027true\u0027):"},{"line_number":3325,"context_line":"                rng_device \u003d vconfig.LibvirtConfigGuestRng()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVX%2F%2F15A%3D","line":3322,"updated":"2014-02-27 22:36:21.000000000","message":"s/img_meta_prop/meta_prop","commit_id":"0efd1671416c6ca471aad3d18d121c22ac606b59"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"9a17bf9b98f4097e4dc6c22269b3df555a02c0b9","unresolved":false,"context_lines":[{"line_number":3140,"context_line":"        if image_meta:"},{"line_number":3141,"context_line":"            virt_props \u003d virt_properties_obj.VirtProperties.get_from_metadata("},{"line_number":3142,"context_line":"                    context, image_meta)"},{"line_number":3143,"context_line":"            if virt_props.obj_attr_is_set(\u0027hw_os_command_line\u0027):"},{"line_number":3144,"context_line":"                guest.os_cmdline \u003d virt_props.hw_os_command_line"},{"line_number":3145,"context_line":""},{"line_number":3146,"context_line":"        if ((CONF.libvirt.virt_type !\u003d \"lxc\" and"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwJk%3D","line":3143,"updated":"2014-02-28 15:01:54.000000000","message":"Using magic string here isn\u0027t too nice - should this instead be doing  \n\n   if virt_props.hw_os_command_line is not None:\n       ....blah....","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"9a17bf9b98f4097e4dc6c22269b3df555a02c0b9","unresolved":false,"context_lines":[{"line_number":3281,"context_line":"            meta_prop \u003d virt_properties_obj.VirtProperties.get_from_metadata("},{"line_number":3282,"context_line":"                    context, image_meta)"},{"line_number":3283,"context_line":"            if meta_prop.obj_attr_is_set(\u0027hw_video_model\u0027):"},{"line_number":3284,"context_line":"                video.type \u003d meta_prop.get(\u0027hw_video_model\u0027)"},{"line_number":3285,"context_line":"                if (video.type not in VALID_VIDEO_DEVICES):"},{"line_number":3286,"context_line":"                    raise exception.InvalidVideoMode(model\u003dvideo.type)"},{"line_number":3287,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwJM%3D","line":3284,"updated":"2014-02-28 15:01:54.000000000","message":"Again using magic strings here is not nice","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"9a17bf9b98f4097e4dc6c22269b3df555a02c0b9","unresolved":false,"context_lines":[{"line_number":3304,"context_line":"                virt_props \u003d \\"},{"line_number":3305,"context_line":"                        virt_properties_obj.VirtProperties.get_from_metadata("},{"line_number":3306,"context_line":"                                context, image_meta)"},{"line_number":3307,"context_line":"                if virt_props.obj_attr_is_set(\u0027hw_qemu_guest_agent\u0027):"},{"line_number":3308,"context_line":"                    hw_qga \u003d virt_props.hw_qemu_guest_agent"},{"line_number":3309,"context_line":"                    if hw_qga.lower() \u003d\u003d \u0027yes\u0027:"},{"line_number":3310,"context_line":"                        LOG.debug(_(\"Qemu guest agent is enabled through image\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVX%2F%2FwJA%3D","line":3307,"updated":"2014-02-28 15:01:54.000000000","message":"And again","commit_id":"ac115b815dc8046aa1e0c6b8119f7b46da583c79"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d241cece6c6916f534867f414597b63a9ce0dac3","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"                        \"required.\") % ver"},{"line_number":1186,"context_line":"                raise exception.Invalid(msg)"},{"line_number":1187,"context_line":""},{"line_number":1188,"context_line":"        disk_info \u003d blockinfo.get_info_from_bdm(context,"},{"line_number":1189,"context_line":"                                                CONF.libvirt.virt_type, bdm)"},{"line_number":1190,"context_line":"        conf \u003d self.volume_driver_method(\u0027connect_volume\u0027,"},{"line_number":1191,"context_line":"                                         connection_info,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAVX%2F%2FvtQ%3D","line":1188,"updated":"2014-02-28 15:59:56.000000000","message":"See comment on blockinfo - I don\u0027t think you need to do any of these things","commit_id":"5e2543cd68303b1a443f2b2aa057ca2fd0bb961d"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d241cece6c6916f534867f414597b63a9ce0dac3","unresolved":false,"context_lines":[{"line_number":3140,"context_line":"        if image_meta:"},{"line_number":3141,"context_line":"            virt_props \u003d virt_properties_obj.VirtProperties.get_from_metadata("},{"line_number":3142,"context_line":"                    context, image_meta)"},{"line_number":3143,"context_line":"            if virt_props.obj_attr_is_set(\u0027hw_os_command_line\u0027):"},{"line_number":3144,"context_line":"                guest.os_cmdline \u003d virt_props.hw_os_command_line"},{"line_number":3145,"context_line":""},{"line_number":3146,"context_line":"        if ((CONF.libvirt.virt_type !\u003d \"lxc\" and"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAVX%2F%2Fvs0%3D","line":3143,"updated":"2014-02-28 15:59:56.000000000","message":"Why not access it like virt_props.hw_os_command_line... ? As disscussed in the prev patch","commit_id":"5e2543cd68303b1a443f2b2aa057ca2fd0bb961d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"359be352f0f07ee702ebc7af9bbbcc81b29d54dc","unresolved":false,"context_lines":[{"line_number":3380,"context_line":"                                (\"org.qemu.guest_agent.0\", instance[\u0027name\u0027]))"},{"line_number":3381,"context_line":"                guest.add_device(qga)"},{"line_number":3382,"context_line":""},{"line_number":3383,"context_line":"            if img_meta_prop.hw_rng_model \u003d\u003d \u0027virtio\u0027 and \\"},{"line_number":3384,"context_line":"                flavor.extra_specs.get(\u0027hw_rng:allowed\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027:"},{"line_number":3385,"context_line":"                rng_device \u003d vconfig.LibvirtConfigGuestRng()"},{"line_number":3386,"context_line":"                rate_bytes \u003d flavor.extra_specs.get(\u0027hw_rng:rate_bytes\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_daf9564f","line":3383,"updated":"2014-07-04 10:03:18.000000000","message":"if (img_meta_prop.hw_ ... and\n   ...)","commit_id":"924f1c0ef3a28ed15f7866ba8c6016b2604c5b86"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"from nova import objects"},{"line_number":61,"context_line":"from nova.objects import flavor as flavor_obj"},{"line_number":62,"context_line":"from nova.objects import service as service_obj"},{"line_number":63,"context_line":"from nova.objects import virt_properties as virt_prop_obj"},{"line_number":64,"context_line":"from nova.openstack.common import excutils"},{"line_number":65,"context_line":"from nova.openstack.common import fileutils"},{"line_number":66,"context_line":"from nova.openstack.common.gettextutils import _"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_f8e4220e","line":63,"updated":"2014-07-07 22:51:23.000000000","message":"ditto from previous page.","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":3036,"context_line":"            self._set_cache_mode(d)"},{"line_number":3037,"context_line":""},{"line_number":3038,"context_line":"        if image_meta:"},{"line_number":3039,"context_line":"            virt_props \u003d virt_prop_obj.VirtProperties.from_image_metadata("},{"line_number":3040,"context_line":"                    image_meta)"},{"line_number":3041,"context_line":"            if virt_props.hw_scsi_model:"},{"line_number":3042,"context_line":"                hw_scsi_model \u003d virt_props.hw_scsi_model"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_18f0f6c7","line":3039,"updated":"2014-07-07 22:51:23.000000000","message":"ditto here and througout...","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":3349,"context_line":"            if img_meta_prop.hw_video_ram:"},{"line_number":3350,"context_line":"                video_ram \u003d int(img_meta_prop.hw_video_ram)"},{"line_number":3351,"context_line":"            else:"},{"line_number":3352,"context_line":"                video_ram \u003d 0"},{"line_number":3353,"context_line":"            max_vram \u003d int(flavor.extra_specs"},{"line_number":3354,"context_line":"                                    .get(\u0027hw_video:ram_max_mb\u0027, 0))"},{"line_number":3355,"context_line":"            if video_ram \u003e max_vram:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_38ecdaba","line":3352,"updated":"2014-07-07 22:51:23.000000000","message":"Note here and below, these are places where using a default value for the field would make the code a little cleaner, IMO.","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":3366,"context_line":"            if img_meta_prop.hw_qemu_guest_agent:"},{"line_number":3367,"context_line":"                hw_qga \u003d img_meta_prop.hw_qemu_guest_agent"},{"line_number":3368,"context_line":"            else:"},{"line_number":3369,"context_line":"                hw_qga \u003d \"no\""},{"line_number":3370,"context_line":"            if hw_qga.lower() \u003d\u003d \u0027yes\u0027:"},{"line_number":3371,"context_line":"                LOG.debug(\"Qemu guest agent is enabled through image \""},{"line_number":3372,"context_line":"                          \"metadata\", instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_b8846a0b","line":3369,"updated":"2014-07-07 22:51:23.000000000","message":"Shouldn\u0027t the hw_qemu_quest_agent property just default to \"no\"?","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":3380,"context_line":"                                (\"org.qemu.guest_agent.0\", instance[\u0027name\u0027]))"},{"line_number":3381,"context_line":"                guest.add_device(qga)"},{"line_number":3382,"context_line":""},{"line_number":3383,"context_line":"            if img_meta_prop.hw_rng_model \u003d\u003d \u0027virtio\u0027 and \\"},{"line_number":3384,"context_line":"                flavor.extra_specs.get(\u0027hw_rng:allowed\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027:"},{"line_number":3385,"context_line":"                rng_device \u003d vconfig.LibvirtConfigGuestRng()"},{"line_number":3386,"context_line":"                rate_bytes \u003d flavor.extra_specs.get(\u0027hw_rng:rate_bytes\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_38c21a53","line":3383,"updated":"2014-07-07 22:51:23.000000000","message":"Please use parens to contain the predicates instead of a \\ line continuation.","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d34ba7d489e1295dcede3054407f13d0e6e2bf1a","unresolved":false,"context_lines":[{"line_number":3053,"context_line":"            self._set_cache_mode(d)"},{"line_number":3054,"context_line":""},{"line_number":3055,"context_line":"        if image_meta:"},{"line_number":3056,"context_line":"            virt_props \u003d objects.VirtProperties.from_image_metadata(image_meta)"},{"line_number":3057,"context_line":"            if virt_props.hw_scsi_model:"},{"line_number":3058,"context_line":"                hw_scsi_model \u003d virt_props.hw_scsi_model"},{"line_number":3059,"context_line":"                scsi_controller \u003d vconfig.LibvirtConfigGuestController()"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_cfd9be58","line":3056,"updated":"2014-07-11 11:28:39.000000000","message":"I think this should be passed in from the calling method, instead of passing in the image_meta","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d34ba7d489e1295dcede3054407f13d0e6e2bf1a","unresolved":false,"context_lines":[{"line_number":3103,"context_line":"            instance[\u0027instance_type_id\u0027])"},{"line_number":3104,"context_line":"        inst_path \u003d libvirt_utils.get_instance_path(instance)"},{"line_number":3105,"context_line":"        disk_mapping \u003d disk_info[\u0027mapping\u0027]"},{"line_number":3106,"context_line":"        img_meta_prop \u003d objects.VirtProperties.from_image_metadata(image_meta)"},{"line_number":3107,"context_line":""},{"line_number":3108,"context_line":"        CONSOLE \u003d \"console\u003dtty0 console\u003dttyS0\""},{"line_number":3109,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_4f1e8e0d","line":3106,"updated":"2014-07-11 11:28:39.000000000","message":"So you get the property object here.....","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d34ba7d489e1295dcede3054407f13d0e6e2bf1a","unresolved":false,"context_lines":[{"line_number":3164,"context_line":"            # or otherwise based on some architecture specific defaults"},{"line_number":3165,"context_line":"            if image_meta:"},{"line_number":3166,"context_line":"                virt_props \u003d objects.VirtProperties.from_image_metadata("},{"line_number":3167,"context_line":"                        image_meta)"},{"line_number":3168,"context_line":"                if virt_props.hw_machine_type:"},{"line_number":3169,"context_line":"                    guest.os_mach_type \u003d virt_props.hw_machine_type"},{"line_number":3170,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_6f17d2ee","line":3167,"updated":"2014-07-11 11:28:39.000000000","message":"...but then get it again here","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d34ba7d489e1295dcede3054407f13d0e6e2bf1a","unresolved":false,"context_lines":[{"line_number":3212,"context_line":"                # os_command_line property without a specified kernel_id param"},{"line_number":3213,"context_line":"                if image_meta:"},{"line_number":3214,"context_line":"                    props \u003d objects.VirtProperties.from_image_metadata("},{"line_number":3215,"context_line":"                            image_meta)"},{"line_number":3216,"context_line":"                    if props.os_command_line:"},{"line_number":3217,"context_line":"                        guest.os_cmdline \u003d props.os_command_line"},{"line_number":3218,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_8f1426ea","line":3215,"updated":"2014-07-11 11:28:39.000000000","message":"...and again","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"677d41cb8cffc57ababc1012c9be562a99aa850d","unresolved":false,"context_lines":[{"line_number":3417,"context_line":"                    raise exception.InvalidVideoMode(model\u003dvideo.type)"},{"line_number":3418,"context_line":""},{"line_number":3419,"context_line":"            # Set video memory, only if the flavor\u0027s limit is set"},{"line_number":3420,"context_line":"            video_ram \u003d int(img_meta_prop.hw_video_ram)"},{"line_number":3421,"context_line":"            max_vram \u003d int(flavor.extra_specs"},{"line_number":3422,"context_line":"                                    .get(\u0027hw_video:ram_max_mb\u0027, 0))"},{"line_number":3423,"context_line":"            if video_ram \u003e max_vram:"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_e035ef45","line":3420,"updated":"2014-07-30 16:37:29.000000000","message":"There should be no need for an int() wrapper any more, since hw_video_ram should be an IntegerField","commit_id":"32f4ae2947cf568272d244d9087247b120fe7b03"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"519ff4d3d9c4874d8a39a3091633033420e2891f","unresolved":false,"context_lines":[{"line_number":3617,"context_line":"        watchdog_action \u003d flavor.extra_specs.get(\u0027hw_watchdog_action\u0027,"},{"line_number":3618,"context_line":"                                                 \u0027disabled\u0027)"},{"line_number":3619,"context_line":"        if (image_meta is not None and"},{"line_number":3620,"context_line":"                image_meta.get(\u0027properties\u0027, {}).get(\u0027hw_watchdog_action\u0027)):"},{"line_number":3621,"context_line":"            watchdog_action \u003d image_meta[\u0027properties\u0027][\u0027hw_watchdog_action\u0027]"},{"line_number":3622,"context_line":""},{"line_number":3623,"context_line":"        # NB(sross): currently only actually supported by KVM/QEmu"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_730425c0","line":3620,"updated":"2014-08-20 10:44:28.000000000","message":"This needs converting too.\n\nAlso missed a usage in vif.py","commit_id":"7f516d8211005039e6bdc200c044050aa1fbc6b2"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"9e427bcca9419a61479273b26c708c10bc16d43b","unresolved":false,"context_lines":[{"line_number":3745,"context_line":"                guest.add_device(qga)"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":"            if img_meta_prop.hw_rng_model \u003d\u003d \u0027virtio\u0027 and \\"},{"line_number":3748,"context_line":"                flavor.extra_specs.get(\u0027hw_rng:allowed\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027:"},{"line_number":3749,"context_line":"                rng_device \u003d vconfig.LibvirtConfigGuestRng()"},{"line_number":3750,"context_line":"                rate_bytes \u003d flavor.extra_specs.get(\u0027hw_rng:rate_bytes\u0027, 0)"},{"line_number":3751,"context_line":"                period \u003d flavor.extra_specs.get(\u0027hw_rng:rate_period\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa98f980_91bb61e4","line":3748,"updated":"2014-09-02 20:07:07.000000000","message":"Parenthesis are the preferred way to wrap long lines.","commit_id":"3afb49b7f51b97dfc8a041290a9dab6510f66b75"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b6c791b482be8b676fa1bfbac3206888b2328d1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from lxml import etree"},{"line_number":26,"context_line":"from oslo.config import cfg"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from nova.objects import virt_properties as virt_properties_obj"},{"line_number":29,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":30,"context_line":"from nova.openstack.common.gettextutils import _LI"},{"line_number":31,"context_line":"from nova.openstack.common.gettextutils import _LW"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_b8370a4c","line":28,"updated":"2014-07-07 22:51:23.000000000","message":"ditto about using:\n\n from nova import objects","commit_id":"7290bb275f6abf88fe3fb0783b8225474d7f6512"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d34ba7d489e1295dcede3054407f13d0e6e2bf1a","unresolved":false,"context_lines":[{"line_number":508,"context_line":"    \"\"\""},{"line_number":509,"context_line":"    if image_meta:"},{"line_number":510,"context_line":"        virt_props \u003d objects.VirtProperties.from_image_metadata(image_meta)"},{"line_number":511,"context_line":"        arch \u003d virt_props.hw_architecture"},{"line_number":512,"context_line":"        if arch is not None:"},{"line_number":513,"context_line":"            return arch"},{"line_number":514,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_afbbaae3","line":511,"updated":"2014-07-11 11:28:39.000000000","message":"I\u0027d prefer to see this method changed to accept a property object, instead of image_meta, so the caller can handle conversion (if it doesn\u0027t already have the property object).\n\nUltimately our goal should be that \u0027image_meta\u0027 doesn\u0027t exist anywhere in the virt driver - the compute manager should pass in the virt property object.","commit_id":"e2688e72f869a87bc11bc809ecf75792cfb3ade2"}]}
