)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0e5c229b45291fa66a8241094f8ec736180f7bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dan Smith \u003cdansmith@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-11-08 09:36:34 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Store security groups in RequestSpec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I2107ec6260954561b5d31b91ad3f27fd325400e2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a629dbe_0ff9824d","line":7,"updated":"2016-11-09 14:01:54.000000000","message":"I know it can be confusing but the difference between the BuildRequest and the RequestSpec objects was that the BuildRequest was existing temporarely (being deleted once the instance was scheduled) for the whole purpose of showing the needed instance fields until the instance object was properly created; compared to the RequestSpec object which was originally created for passing necessary information for a placement decision.\n\nHere, my big question is then : do we need to pass those secgroup informations down to the scheduler (and reuse them for a move operation) or is it just because we need them until the instance is created ? I need to carefully review the latter patches in order to understand the problem but my first guess is that it\u0027s for the latter, hence me thinking it could be wrong to amend the RequestSpec object.\n\nThat\u0027s not a firm -1, I need more investigation but I\u0027m not sold on adding that information here for the moment, because I don\u0027t see where the scheduler could need that.","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5578399efda985ed73464d5574d22b199eb4d12a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dan Smith \u003cdansmith@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-11-08 09:36:34 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Store security groups in RequestSpec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I2107ec6260954561b5d31b91ad3f27fd325400e2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a629dbe_30ce9e2e","line":7,"in_reply_to":"9a629dbe_0ff9824d","updated":"2016-11-09 16:33:09.000000000","message":"Okay, after discussing a lot over IRC about that specific problem, I now understand much better the problem and why it\u0027s useful to store that list of SecurityGroup objects in the RequestSpec.\n\nBasically, given there is difference between how we access those security groups in bstween Neutron and Nova-net, there is no way to use the nested Instance object persisted in the BuildRequest. \n\nGiven we also want to provide that list of security groups for a move operation, it totally makes sense to have those being stored in the RequestSpec object.","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a7e35dca559e381a42c253d607b8530d6dfbe3c2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dan Smith \u003cdansmith@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-11-08 09:36:34 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Store security groups in RequestSpec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I2107ec6260954561b5d31b91ad3f27fd325400e2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a629dbe_f3ab4b73","line":7,"in_reply_to":"9a629dbe_30ce9e2e","updated":"2016-11-09 18:45:47.000000000","message":"We need details in the commit message for this change given the confusion, and just for the sake of posterity when looking back at this commit.","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dc4e708c1a16d2205cbc868917edc391c32e4369","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dan Smith \u003cdansmith@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-11-08 09:36:34 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Store security groups in RequestSpec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I2107ec6260954561b5d31b91ad3f27fd325400e2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a629dbe_f4ef831b","line":7,"in_reply_to":"9a629dbe_f3ab4b73","updated":"2016-11-10 16:07:06.000000000","message":"Yeah, sorry this is my standard \"write a commit message later\" which I forgot to do after slamming this at the front of my set.","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d3686af6ea9871d74296cd43f2c288a13b0976a9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"that we can communicate those as part of the request to other"},{"line_number":11,"context_line":"services. Historically this has been a formal RPC parameter to"},{"line_number":12,"context_line":"compute (and later conductor), which was a list of string names."},{"line_number":13,"context_line":"Putting it here in the request spec means that we can easly"},{"line_number":14,"context_line":"pass a list of real objects, and that we can persist them with"},{"line_number":15,"context_line":"the request spec for later reconstruction of the original request"},{"line_number":16,"context_line":"when appropriate, such as for a rebuild operation."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7a77a97e_3310a201","line":13,"range":{"start_line":13,"start_character":54,"end_line":13,"end_character":59},"updated":"2016-11-16 03:00:38.000000000","message":"omfg this is EASILY the worst thing I\u0027ve ever seen in a patch.","commit_id":"35452788ac058db63f278d1b61f69a76cfc96078"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"993fbda009c37cb37cd83dbe2e03b4545aa3247e","unresolved":false,"context_lines":[{"line_number":910,"context_line":"        # Reserve quotas"},{"line_number":911,"context_line":"        num_instances, quotas \u003d self._check_num_instances_quota("},{"line_number":912,"context_line":"                context, instance_type, min_count, max_count)"},{"line_number":913,"context_line":"        security_groups \u003d self.security_group_api.populate_security_groups("},{"line_number":914,"context_line":"                security_groups)"},{"line_number":915,"context_line":"        self.security_group_api.ensure_default(context)"},{"line_number":916,"context_line":"        LOG.debug(\"Going to run %s instances...\", num_instances)"},{"line_number":917,"context_line":"        instances \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_dbd37ed3","line":914,"range":{"start_line":913,"start_character":8,"end_line":914,"end_character":32},"updated":"2016-11-10 23:27:12.000000000","message":"So for neutron this is an empty list today.\n\nBut we want to change that and return a list of NeutronSecurityGroup objects using:\n\nhttps://review.openstack.org/#/c/396436/\n\nwhich will store the uuids, right?","commit_id":"6aa7b76d2c1a26af58a2d9dc7b806832e227b194"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"993fbda009c37cb37cd83dbe2e03b4545aa3247e","unresolved":false,"context_lines":[{"line_number":939,"context_line":"                if key_pair:"},{"line_number":940,"context_line":"                    instance.keypairs.objects.append(key_pair)"},{"line_number":941,"context_line":"                instance \u003d self.create_db_entry_for_new_instance(context,"},{"line_number":942,"context_line":"                        instance_type, boot_meta, instance, security_groups,"},{"line_number":943,"context_line":"                        block_device_mapping, num_instances, i,"},{"line_number":944,"context_line":"                        shutdown_terminate, create_instance\u003dFalse)"},{"line_number":945,"context_line":"                block_device_mapping \u003d ("}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_fbde82db","line":942,"range":{"start_line":942,"start_character":60,"end_line":942,"end_character":75},"updated":"2016-11-10 23:27:12.000000000","message":"I think this is the part where we don\u0027t want to persist the neutron security groups above, it needs to be an empty list at this point...","commit_id":"6aa7b76d2c1a26af58a2d9dc7b806832e227b194"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"88ef0403b2e8d629985a37a972432ea35cdd49d3","unresolved":false,"context_lines":[{"line_number":953,"context_line":"                        base_options[\u0027numa_topology\u0027],"},{"line_number":954,"context_line":"                        base_options[\u0027pci_requests\u0027], filter_properties,"},{"line_number":955,"context_line":"                        instance_group, base_options[\u0027availability_zone\u0027],"},{"line_number":956,"context_line":"                        security_groups\u003dsecurity_groups)"},{"line_number":957,"context_line":"                req_spec.create()"},{"line_number":958,"context_line":""},{"line_number":959,"context_line":"                # Create an instance object, but do not store in db yet."}],"source_content_type":"text/x-python","patch_set":10,"id":"7a77a97e_b3c9127b","line":956,"updated":"2016-11-16 03:08:40.000000000","message":"Seems there should have been an existing test in nova.tests.unit.compute.test_compute_api that we could have modified slightly to make sure this was passed in, just to prevent future regressions.","commit_id":"35452788ac058db63f278d1b61f69a76cfc96078"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            # old-world instance objects here"},{"line_number":201,"context_line":"            attrs \u003d [\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":202,"context_line":"                     \u0027security_groups\u0027]"},{"line_number":203,"context_line":"            instance \u003d objects.Instance._from_db_object("},{"line_number":204,"context_line":"                context, objects.Instance(), instance,"},{"line_number":205,"context_line":"                expected_attrs\u003dattrs)"},{"line_number":206,"context_line":"        # NOTE: Remove this when we drop support for v1 of the RPC API"},{"line_number":207,"context_line":"        if flavor and not isinstance(flavor, objects.Flavor):"},{"line_number":208,"context_line":"            # Code downstream may expect extra_specs to be populated since it"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_57bc3c05","line":205,"range":{"start_line":203,"start_character":12,"end_line":205,"end_character":37},"updated":"2016-11-15 17:53:45.000000000","message":"For nova-network, at this point we\u0027d have the instance.security_groups loaded.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                context, instance.uuid, image,"},{"line_number":237,"context_line":"                flavor, instance.numa_topology, instance.pci_requests,"},{"line_number":238,"context_line":"                filter_properties, None, instance.availability_zone,"},{"line_number":239,"context_line":"                objects.SecurityGroupList())"},{"line_number":240,"context_line":"        else:"},{"line_number":241,"context_line":"            # NOTE(sbauza): Resizes means new flavor, so we need to update the"},{"line_number":242,"context_line":"            # original RequestSpec object for make sure the scheduler verifies"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_f772a87b","line":239,"range":{"start_line":239,"start_character":16,"end_line":239,"end_character":43},"updated":"2016-11-15 17:53:45.000000000","message":"Rather than pass an empty list we could get them off the instance in scope which would at least make this work for nova-network. I\u0027m not really sure that matters though, it looks like this request spec is just used for scheduling the cold migration. In that case, why even set anything for this field and not just leave it unset or None?","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea55241893f873e056c8db03de8019e668decfe7","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                context, instance.uuid, image,"},{"line_number":237,"context_line":"                flavor, instance.numa_topology, instance.pci_requests,"},{"line_number":238,"context_line":"                filter_properties, None, instance.availability_zone,"},{"line_number":239,"context_line":"                objects.SecurityGroupList())"},{"line_number":240,"context_line":"        else:"},{"line_number":241,"context_line":"            # NOTE(sbauza): Resizes means new flavor, so we need to update the"},{"line_number":242,"context_line":"            # original RequestSpec object for make sure the scheduler verifies"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_fdf9a9c9","line":239,"range":{"start_line":239,"start_character":16,"end_line":239,"end_character":43},"in_reply_to":"7a77a97e_e2b024f7","updated":"2016-11-15 18:25:20.000000000","message":"I think I\u0027d prefer that are just cool with None as a default so we don\u0027t have to touch every piece of code that creates one of these objects, and then only set it where we need to set it, when creating the instance.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34b67de78c7dff11edd695aada8e31a894894de7","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                context, instance.uuid, image,"},{"line_number":237,"context_line":"                flavor, instance.numa_topology, instance.pci_requests,"},{"line_number":238,"context_line":"                filter_properties, None, instance.availability_zone,"},{"line_number":239,"context_line":"                objects.SecurityGroupList())"},{"line_number":240,"context_line":"        else:"},{"line_number":241,"context_line":"            # NOTE(sbauza): Resizes means new flavor, so we need to update the"},{"line_number":242,"context_line":"            # original RequestSpec object for make sure the scheduler verifies"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_e2b024f7","line":239,"range":{"start_line":239,"start_character":16,"end_line":239,"end_character":43},"in_reply_to":"7a77a97e_f772a87b","updated":"2016-11-15 18:05:35.000000000","message":"Right, doesn\u0027t matter, I was just filling this. I could have made this default to None for calls that don\u0027t need to pass it and default it in from_components(). I didn\u0027t so I would find all the uses and make sure they\u0027re okay.\n\nSylvain is planning to rip out all this compat stuff soon so I didn\u0027t worry about it much.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"}],"nova/conductor/tasks/migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                 scheduler_client):"},{"line_number":24,"context_line":"        super(MigrationTask, self).__init__(context, instance)"},{"line_number":25,"context_line":"        self.clean_shutdown \u003d clean_shutdown"},{"line_number":26,"context_line":"        self.request_spec \u003d request_spec"},{"line_number":27,"context_line":"        self.reservations \u003d reservations"},{"line_number":28,"context_line":"        self.flavor \u003d flavor"},{"line_number":29,"context_line":"        self.quotas \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_97a6d4bf","line":26,"range":{"start_line":26,"start_character":7,"end_line":26,"end_character":40},"updated":"2016-11-15 17:53:45.000000000","message":"This came from:\n\nhttps://review.openstack.org/#/c/394656/8/nova/conductor/manager.py\n\nSo why not use the self.request_spec.security_groups below?","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea55241893f873e056c8db03de8019e668decfe7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                 scheduler_client):"},{"line_number":24,"context_line":"        super(MigrationTask, self).__init__(context, instance)"},{"line_number":25,"context_line":"        self.clean_shutdown \u003d clean_shutdown"},{"line_number":26,"context_line":"        self.request_spec \u003d request_spec"},{"line_number":27,"context_line":"        self.reservations \u003d reservations"},{"line_number":28,"context_line":"        self.flavor \u003d flavor"},{"line_number":29,"context_line":"        self.quotas \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_3df241d3","line":26,"range":{"start_line":26,"start_character":7,"end_line":26,"end_character":40},"in_reply_to":"7a77a97e_62741435","updated":"2016-11-15 18:25:20.000000000","message":"I\u0027m having a hard time following what\u0027s legacy and what\u0027s not and all of the massaging required in between. My main fear is just setting it in one place and then overwriting that later with an empty list, seems we should be passing this stuff through if we\u0027re going to set it at all, else default to None for the operations where we don\u0027t care about security groups.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34b67de78c7dff11edd695aada8e31a894894de7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                 scheduler_client):"},{"line_number":24,"context_line":"        super(MigrationTask, self).__init__(context, instance)"},{"line_number":25,"context_line":"        self.clean_shutdown \u003d clean_shutdown"},{"line_number":26,"context_line":"        self.request_spec \u003d request_spec"},{"line_number":27,"context_line":"        self.reservations \u003d reservations"},{"line_number":28,"context_line":"        self.flavor \u003d flavor"},{"line_number":29,"context_line":"        self.quotas \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_62741435","line":26,"range":{"start_line":26,"start_character":7,"end_line":26,"end_character":40},"in_reply_to":"7a77a97e_97a6d4bf","updated":"2016-11-15 18:05:35.000000000","message":"I guess I could, but it kinda seems like it goes against the spirit there, which is replacing everything in self.request_spec. Not sure it matters, all of that is purely legacy handling AFAIK.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"}],"nova/objects/request_spec.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5578399efda985ed73464d5574d22b199eb4d12a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # just provide to the RequestSpec object a free-form dictionary"},{"line_number":69,"context_line":"        \u0027scheduler_hints\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":71,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":72,"context_line":"    }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_70b9f678","line":71,"updated":"2016-11-09 16:33:09.000000000","message":"As we discussed over IRC, we need to store the UUID and use it so that we\u0027re not using the existing security group name field that can be mutable.","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a7e35dca559e381a42c253d607b8530d6dfbe3c2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # just provide to the RequestSpec object a free-form dictionary"},{"line_number":69,"context_line":"        \u0027scheduler_hints\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":71,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":72,"context_line":"    }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_730adb7a","line":71,"in_reply_to":"9a629dbe_70b9f678","updated":"2016-11-09 18:45:47.000000000","message":"Right, that will happen in some dependent changes I\u0027m working on here: https://review.openstack.org/#/c/395747/\n\nNote that \u0027default\u0027 will still be in that list even if using neutron. If you don\u0027t request any security groups, nova adds [\u0027default\u0027] before we get here. Later on in the neutronv2 API allocate_for_instance code that \u0027default\u0027 is scrubbed out of the list though:\n\nhttps://github.com/openstack/nova/blob/569e463f02b0a631d341b06849217657a22c4569/nova/network/neutronv2/api.py#L582","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a7e35dca559e381a42c253d607b8530d6dfbe3c2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if attrname \u003d\u003d \u0027security_groups\u0027:"},{"line_number":91,"context_line":"            self.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # NOTE(sbauza): In case the primitive was not providing that field"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_f31eebb9","line":91,"updated":"2016-11-09 18:45:47.000000000","message":"Why an empty list here?","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a7e35dca559e381a42c253d607b8530d6dfbe3c2","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        spec._populate_group_info(filter_properties)"},{"line_number":259,"context_line":"        scheduler_hints \u003d filter_properties.get(\u0027scheduler_hints\u0027, {})"},{"line_number":260,"context_line":"        spec._from_hints(scheduler_hints)"},{"line_number":261,"context_line":"        spec.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        # NOTE(sbauza): Default the other fields that are not part of the"},{"line_number":264,"context_line":"        # original contract"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_131c3fc0","line":261,"updated":"2016-11-09 18:45:47.000000000","message":"why empty?","commit_id":"c5ae52150c21f9e81da7191f97e8371bd42b420e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c45f7b4e0cf3022ff9b00e19c7bb3a16b71b556c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # just provide to the RequestSpec object a free-form dictionary"},{"line_number":69,"context_line":"        \u0027scheduler_hints\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":71,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":72,"context_line":"    }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_4e8b2e68","line":71,"range":{"start_line":71,"start_character":47,"end_line":71,"end_character":64},"updated":"2016-11-10 23:48:56.000000000","message":"Now the issue I\u0027m going to have with this is SecurityGroupList won\u0027t allow having a NeutronSecurityGroup object in it, which is what I have here:\n\nhttps://review.openstack.org/#/c/396436/\n\nEven though that extends SecurityGroup, o.vo doesn\u0027t handle the inheritance.\n\nValueError: An object of type nova.objects.security_group.SecurityGroup is required in field objects[0], not a nova.objects.security_group.NeutronSecurityGroup\n\nSo we can either:\n\n1. Soften the type restriction on SecurityGroupList.objects, or\n\n2. Add a uuid field to SecurityGroup and only set that for Neutron\n\nI\u0027m not crazy about either one really.","commit_id":"6aa7b76d2c1a26af58a2d9dc7b806832e227b194"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # just provide to the RequestSpec object a free-form dictionary"},{"line_number":69,"context_line":"        \u0027scheduler_hints\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":71,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":72,"context_line":"    }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_b782f0fe","line":71,"updated":"2016-11-15 17:53:45.000000000","message":"nullable\u003dTrue and default\u003dNone like requested_destination?","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea55241893f873e056c8db03de8019e668decfe7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # just provide to the RequestSpec object a free-form dictionary"},{"line_number":69,"context_line":"        \u0027scheduler_hints\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":71,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":72,"context_line":"    }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_1d93c55c","line":71,"in_reply_to":"7a77a97e_62d97421","updated":"2016-11-15 18:25:20.000000000","message":"OK, then I think I\u0027d prefer that we don\u0027t set them (leave unset) in the cases we don\u0027t care, like cold migration scheduling.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34b67de78c7dff11edd695aada8e31a894894de7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # just provide to the RequestSpec object a free-form dictionary"},{"line_number":69,"context_line":"        \u0027scheduler_hints\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":71,"context_line":"        \u0027security_groups\u0027: fields.ObjectField(\u0027SecurityGroupList\u0027),"},{"line_number":72,"context_line":"    }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_62d97421","line":71,"in_reply_to":"7a77a97e_b782f0fe","updated":"2016-11-15 18:05:35.000000000","message":"nullable means this can be None. AFAIK, you can\u0027t ever have no security group for a real request.. You\u0027d always get at least \"default\". I like to avoid the \"anything could be None at any time\" scenario for things that really shouldn\u0027t be, because it means you have to be defensive everywhere on receipt instead of while creating an object.\n\nIf we don\u0027t have security groups at some point, leaving this unset means we have the opportunity to lazy-load them from the stored request spec later, or something. Leaving them unset means \"we don\u0027t know what they are\" and None means \"there are not any\", IMHO.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                action\u003d\u0027obj_load_attr\u0027,"},{"line_number":88,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if attrname \u003d\u003d \u0027security_groups\u0027:"},{"line_number":91,"context_line":"            self.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_d7404c59","line":90,"updated":"2016-11-15 17:53:45.000000000","message":"Don\u0027t think we have a test for this.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if attrname \u003d\u003d \u0027security_groups\u0027:"},{"line_number":91,"context_line":"            self.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # NOTE(sbauza): In case the primitive was not providing that field"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_772bf8eb","line":91,"range":{"start_line":91,"start_character":61,"end_line":91,"end_character":71},"updated":"2016-11-15 17:53:45.000000000","message":"nit: this is redundant and it\u0027s not used anyway.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea55241893f873e056c8db03de8019e668decfe7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if attrname \u003d\u003d \u0027security_groups\u0027:"},{"line_number":91,"context_line":"            self.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # NOTE(sbauza): In case the primitive was not providing that field"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_9d943538","line":91,"range":{"start_line":91,"start_character":61,"end_line":91,"end_character":71},"in_reply_to":"7a77a97e_02f9a080","updated":"2016-11-15 18:25:20.000000000","message":"But it\u0027s already defaulted in the base class in that case:\n\nhttps://github.com/openstack/oslo.versionedobjects/blob/1.18.0/oslo_versionedobjects/base.py#L793\n\nI guess it\u0027s not my convention as I know the base class already sets the default.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34b67de78c7dff11edd695aada8e31a894894de7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if attrname \u003d\u003d \u0027security_groups\u0027:"},{"line_number":91,"context_line":"            self.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # NOTE(sbauza): In case the primitive was not providing that field"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_02f9a080","line":91,"range":{"start_line":91,"start_character":61,"end_line":91,"end_character":71},"in_reply_to":"7a77a97e_772bf8eb","updated":"2016-11-15 18:05:35.000000000","message":"Well, it\u0027s the convention, which should be what we need to do, until you identified that this object is a snowflake.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba81cbf82f4a60c0874e6b34fe82b35591d687d8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if attrname \u003d\u003d \u0027security_groups\u0027:"},{"line_number":91,"context_line":"            self.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # NOTE(sbauza): In case the primitive was not providing that field"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_1dae652e","line":91,"range":{"start_line":91,"start_character":61,"end_line":91,"end_character":71},"in_reply_to":"7a77a97e_9d943538","updated":"2016-11-15 18:31:20.000000000","message":"Right, but it shouldn\u0027t be that way. That\u0027s my point -- no other list object behaves this way. I was doing this assuming the outcome of our previous discussion was to fix the behavior of this weirdo object.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        image \u003d request_spec.get(\u0027image\u0027)"},{"line_number":245,"context_line":"        spec._image_meta_from_image(image)"},{"line_number":246,"context_line":"        instance \u003d request_spec.get(\u0027instance_properties\u0027)"},{"line_number":247,"context_line":"        spec._from_instance(instance)"},{"line_number":248,"context_line":"        flavor \u003d request_spec.get(\u0027instance_type\u0027)"},{"line_number":249,"context_line":"        spec._from_flavor(flavor)"},{"line_number":250,"context_line":"        # Hydrate now from filter_properties"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_b7e8307e","line":247,"range":{"start_line":247,"start_character":8,"end_line":247,"end_character":37},"updated":"2016-11-15 17:53:45.000000000","message":"For nova-network we could get the security_groups off the instance, but they wouldn\u0027t be set for neutron. So I guess that doesn\u0027t work. We could pass security_groups into this method, but it\u0027s deprecated so seems we don\u0027t need to care what we set.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        spec._populate_group_info(filter_properties)"},{"line_number":259,"context_line":"        scheduler_hints \u003d filter_properties.get(\u0027scheduler_hints\u0027, {})"},{"line_number":260,"context_line":"        spec._from_hints(scheduler_hints)"},{"line_number":261,"context_line":"        spec.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        # NOTE(sbauza): Default the other fields that are not part of the"},{"line_number":264,"context_line":"        # original contract"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_57751cf7","line":261,"range":{"start_line":261,"start_character":57,"end_line":261,"end_character":67},"updated":"2016-11-15 17:53:45.000000000","message":"redundant and not used","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea55241893f873e056c8db03de8019e668decfe7","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        spec._populate_group_info(filter_properties)"},{"line_number":259,"context_line":"        scheduler_hints \u003d filter_properties.get(\u0027scheduler_hints\u0027, {})"},{"line_number":260,"context_line":"        spec._from_hints(scheduler_hints)"},{"line_number":261,"context_line":"        spec.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        # NOTE(sbauza): Default the other fields that are not part of the"},{"line_number":264,"context_line":"        # original contract"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_bde731e3","line":261,"range":{"start_line":261,"start_character":57,"end_line":261,"end_character":67},"in_reply_to":"7a77a97e_223dbc2b","updated":"2016-11-15 18:25:20.000000000","message":"I meant the objects\u003d[] kwargs.\n\nBut as noted earlier, leaving it unset seems fine if we don\u0027t actually need it. Maybe that could result in other nastiness like attribute errors, although obj_load_attr would handle that for us right?","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34b67de78c7dff11edd695aada8e31a894894de7","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        spec._populate_group_info(filter_properties)"},{"line_number":259,"context_line":"        scheduler_hints \u003d filter_properties.get(\u0027scheduler_hints\u0027, {})"},{"line_number":260,"context_line":"        spec._from_hints(scheduler_hints)"},{"line_number":261,"context_line":"        spec.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        # NOTE(sbauza): Default the other fields that are not part of the"},{"line_number":264,"context_line":"        # original contract"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_223dbc2b","line":261,"range":{"start_line":261,"start_character":57,"end_line":261,"end_character":67},"in_reply_to":"7a77a97e_57751cf7","updated":"2016-11-15 18:05:35.000000000","message":"Why do you think it\u0027s redundant? If I don\u0027t do this, I end up with secgroups unset after a from_primitives() call.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    @classmethod"},{"line_number":372,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":373,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":374,"context_line":"                        availability_zone, security_groups):"},{"line_number":375,"context_line":"        \"\"\"Returns a new RequestSpec object hydrated by various components."},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        This helper is useful in creating the RequestSpec from the various"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_d7ecccc9","line":374,"range":{"start_line":373,"start_character":12,"end_line":374,"end_character":58},"updated":"2016-11-15 17:53:45.000000000","message":"Alignment is messy here, either keep az lined up where it was, or align the line above this the same way.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34b67de78c7dff11edd695aada8e31a894894de7","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    @classmethod"},{"line_number":372,"context_line":"    def from_components(cls, context, instance_uuid, image, flavor,"},{"line_number":373,"context_line":"            numa_topology, pci_requests, filter_properties, instance_group,"},{"line_number":374,"context_line":"                        availability_zone, security_groups):"},{"line_number":375,"context_line":"        \"\"\"Returns a new RequestSpec object hydrated by various components."},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        This helper is useful in creating the RequestSpec from the various"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_6247b4bb","line":374,"range":{"start_line":373,"start_character":12,"end_line":374,"end_character":58},"in_reply_to":"7a77a97e_d7ecccc9","updated":"2016-11-15 18:05:35.000000000","message":"Yeah I dunno what happened here.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc477674556f21405365565c6e06bf57df9aad6e","unresolved":false,"context_lines":[{"line_number":388,"context_line":"        :param filter_properties: a dict of properties for scheduling"},{"line_number":389,"context_line":"        :param instance_group: None or an instance group NovaObject"},{"line_number":390,"context_line":"        :param availability_zone: an availability_zone string"},{"line_number":391,"context_line":"        \"\"\""},{"line_number":392,"context_line":"        spec_obj \u003d cls(context)"},{"line_number":393,"context_line":"        spec_obj.num_instances \u003d 1"},{"line_number":394,"context_line":"        spec_obj.instance_uuid \u003d instance_uuid"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_17cf2457","line":391,"updated":"2016-11-15 17:53:45.000000000","message":"Add a param for security_groups.","commit_id":"9807108f1190d3d21f145d969f23dc34741165ee"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cab264c9bc1b0ded63c9e76bf656201597ad99b6","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    def from_primitives(cls, context, request_spec, filter_properties):"},{"line_number":222,"context_line":"        \"\"\"Returns a new RequestSpec object by hydrating it from legacy dicts."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        Deprecated.  A RequestSpec object is created early in the boot process"},{"line_number":225,"context_line":"        using the from_components method.  That object will either be passed to"},{"line_number":226,"context_line":"        places that require it, or it can be looked up with"},{"line_number":227,"context_line":"        get_by_instance_uuid.  This method can be removed when there are no"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a77a97e_28a03a9f","line":224,"updated":"2016-11-15 20:20:41.000000000","message":"See that, I\u0027m not really sure if we should really modify this method given it\u0027s only called in the conductor and the scheduler manager where we don\u0027t need to lookup the security_groups field.\n\nTbc, that from_primitives() method is only used because there are still some helper methods (for example in the scheduler.utils module) that not support yet the RequestSpec object so we dehydrate the object into dicts and then rehydrate the object using that method.\nDo we then really need to set the security_groups field ? I don\u0027t think so but I could be missing some point.","commit_id":"6a276df77fdcb88e2f9ecee6f43fa4076eec45bd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54c1c10f02e51ff70db7fbe95ee805c838289397","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    def from_primitives(cls, context, request_spec, filter_properties):"},{"line_number":222,"context_line":"        \"\"\"Returns a new RequestSpec object by hydrating it from legacy dicts."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        Deprecated.  A RequestSpec object is created early in the boot process"},{"line_number":225,"context_line":"        using the from_components method.  That object will either be passed to"},{"line_number":226,"context_line":"        places that require it, or it can be looked up with"},{"line_number":227,"context_line":"        get_by_instance_uuid.  This method can be removed when there are no"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a77a97e_684a3285","line":224,"in_reply_to":"7a77a97e_28a03a9f","updated":"2016-11-15 20:25:44.000000000","message":"No, meant to remove this.","commit_id":"6a276df77fdcb88e2f9ecee6f43fa4076eec45bd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"88ef0403b2e8d629985a37a972432ea35cdd49d3","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        context, instance.uuid, image,"},{"line_number":575,"context_line":"        instance.flavor, instance.numa_topology,"},{"line_number":576,"context_line":"        instance.pci_requests,"},{"line_number":577,"context_line":"        filter_properties, None, instance.availability_zone)"},{"line_number":578,"context_line":"    request_spec.create()"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7a77a97e_532a7e2d","line":577,"updated":"2016-11-16 03:08:40.000000000","message":"nit: rebase issue, didn\u0027t really need to change this.","commit_id":"35452788ac058db63f278d1b61f69a76cfc96078"}],"nova/tests/unit/objects/test_request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"88ef0403b2e8d629985a37a972432ea35cdd49d3","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                flavor, instance.numa_topology, instance.pci_requests,"},{"line_number":372,"context_line":"                filter_properties, None, instance.availability_zone)"},{"line_number":373,"context_line":"        self.assertNotIn(\u0027security_groups\u0027, spec)"},{"line_number":374,"context_line":"        spec \u003d objects.RequestSpec.from_components(ctxt, instance.uuid, image,"},{"line_number":375,"context_line":"                flavor, instance.numa_topology, instance.pci_requests,"},{"line_number":376,"context_line":"                filter_properties, None, instance.availability_zone,"},{"line_number":377,"context_line":"                security_groups\u003dobjects.SecurityGroupList())"},{"line_number":378,"context_line":"        self.assertIn(\u0027security_groups\u0027, spec)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def test_get_scheduler_hint(self):"},{"line_number":381,"context_line":"        spec_obj \u003d objects.RequestSpec(scheduler_hints\u003d{\u0027foo_single\u0027: [\u00271\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a77a97e_b3ae7283","line":378,"range":{"start_line":374,"start_character":8,"end_line":378,"end_character":46},"updated":"2016-11-16 03:08:40.000000000","message":"test_from_components already basically tests this case.","commit_id":"35452788ac058db63f278d1b61f69a76cfc96078"}]}
