)]}'
{"neutron/extensions/deferred_allocation.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"380af5ec3d55e023b1c20a28c15146f2dd65a81f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    attributes.PORTS: {"},{"line_number":26,"context_line":"        IP_ALLOCATION: {\u0027allow_post\u0027: False,"},{"line_number":27,"context_line":"                        \u0027allow_put\u0027: False,"},{"line_number":28,"context_line":"                        \u0027validate\u0027: {\u0027type:allocation_strategy\u0027: None},"},{"line_number":29,"context_line":"                        \u0027is_visible\u0027: True, },"},{"line_number":30,"context_line":"    },"},{"line_number":31,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_8c11d55f","line":28,"range":{"start_line":28,"start_character":43,"end_line":28,"end_character":62},"updated":"2016-06-24 22:34:06.000000000","message":"This patch doesn\u0027t add a validator for this.  Does it matter since it can\u0027t be passed on POST or PUT?","commit_id":"1a7a5538f77c687e551cdf7dd901e3b33f9ce7ad"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0a3418124f5e50fb02640060ce087cfc58fdda16","unresolved":false,"context_lines":[{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Deferred_allocation(extensions.ExtensionDescriptor):"},{"line_number":35,"context_line":"    \"\"\"Extension indicates when ports use deferred or no IP allocation.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_83fd54b3","line":34,"updated":"2016-06-29 22:17:14.000000000","message":"any chance we can rename this to something more apt? Especially since deferred is one of the value of the ip allocation attribute you\u0027re introducing? I would be okay with it if the value was a bool, but it isn\u0027t by the looks of it.","commit_id":"7df309d70d71014d3d7a8401756e8667deddb38a"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"89872dd76818bc91ad1bc77853408dd337f18c96","unresolved":false,"context_lines":[{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Deferred_allocation(extensions.ExtensionDescriptor):"},{"line_number":35,"context_line":"    \"\"\"Extension indicates when ports use deferred or no IP allocation.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_c752b234","line":34,"in_reply_to":"3aaa91ec_83fd54b3","updated":"2016-06-30 10:45:48.000000000","message":"Perhaps Allocation Strategy? Allocation Timing?","commit_id":"7df309d70d71014d3d7a8401756e8667deddb38a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"83856e58c9bf23b0b220e7dd26c41d2c276a180e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Deferred_allocation(extensions.ExtensionDescriptor):"},{"line_number":35,"context_line":"    \"\"\"Extension indicates when ports use deferred or no IP allocation.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_f0d02321","line":34,"in_reply_to":"3aaa91ec_c752b234","updated":"2016-06-30 20:21:01.000000000","message":"Yes, I can rename this.  Good idea.  How about IP_Allocation?","commit_id":"7df309d70d71014d3d7a8401756e8667deddb38a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3920ab823e1e7027b268b8f04498e1d4887c7851","unresolved":false,"context_lines":[{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Deferred_allocation(extensions.ExtensionDescriptor):"},{"line_number":35,"context_line":"    \"\"\"Extension indicates when ports use deferred or no IP allocation.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_e3b21f93","line":34,"in_reply_to":"3aaa91ec_f0d02321","updated":"2016-06-30 20:57:43.000000000","message":"That would need to be Ip_allocation, but that\u0027ll do.","commit_id":"7df309d70d71014d3d7a8401756e8667deddb38a"}],"neutron/services/segments/db.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ecb7e3f468b32e90fabbe2ec33436e3fe4acd571","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    attributes.SUBNETS, [_extend_subnet_dict_binding])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_0a884170","line":74,"updated":"2016-06-14 00:07:31.000000000","message":"Calling these \u0027subnet_res\u0027 and \u0027subnet_db\u0027 is quite confusing since they are ports. \u0027port_res\u0027 and \u0027port_db\u0027 make a lot more sense to me, or am I missing something?","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"401a4dc5c6025f19ed8369687a84ed171129514c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    attributes.SUBNETS, [_extend_subnet_dict_binding])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_0a64c1b6","line":74,"in_reply_to":"7aa08908_0a884170","updated":"2016-06-14 00:14:18.000000000","message":"Noted.\n\n@Kevin, you\u0027re too fast.  I was writing an email to you and a few others while you were reviewing this.  I really didn\u0027t work very hard on this and I\u0027m sure it shows.  But, the purpose was to throw it up as a strawman.","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c4d3465d5ca5cd33e4bb57ca537674b079d69a3f","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"},{"line_number":78,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_DEFERRED"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_6a090584","line":75,"updated":"2016-06-14 00:29:24.000000000","message":"It\u0027s not really clear to me how the workflow is supposed to work. What is their check forcing an IP protecting against? A user forgetting to create a subnet on a network? If that\u0027s the case, what is the difference between that scenario and the user intentionally creating a port without an IP address (the unaddressed port use case)?\n\n\nWRT to immediate vs deferred, is the distinction worth having? Either way, Nova will still validate that the port has IP addresses once it\u0027s actually updated with a host_id field set. It seems like if they just always defer checking for IPs until host_id is set, that would obviate the need for this patch.","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"bece7f7cdbc13ea1efec7fd125349a25bb0c281f","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"},{"line_number":78,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_DEFERRED"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_ca8ab963","line":75,"updated":"2016-06-14 00:12:24.000000000","message":"You\u0027re probably wondering why Nova can\u0027t just figure this out without a new attribute.  Well, this idea was started in the context of the unaddressed ports spec.  I think John Garbutt might have suggested it first[1].  I can\u0027t find if that was taken from somewhere else before that.  In a conversation between armax and me after this, he suggested a tri-state value for a new attribute with values showing if the port will have immediate, deferred, or no IP allocation.\n\nSo, fast forward to today when I\u0027ve finally gotten around to implementing this.  I\u0027m wondering about a few things.\n\n1)  Do we need to allow POST / PUT to this attribute on the port?\n2)  Do we need a new model for this to store the tri-state value?\n\nFor 1, I think I\u0027d like for Neutron to figure out what the value should be in most cases.  Right now, you can already create an addressed port by creating a port on a network with not subnets or updating the port with fixed_ips \u003d [].  Allowing POST to this attribute could be an additional way to create an unaddressed port.\n\nIn the case of the routed networks use case and deferred IP allocation, it is easy for Neutron to tell when deferred IP allocation is necessary.  If the network needs host binding information in order to find the right subnet, and host binding information isn\u0027t provided, then Neutron knows it needs to defer IP allocation.  Then, if host binding is provided on port update, it can fill it in.  This functionality has already merged [2][3].\n\nThe problem is, how can Neutron tell the difference between deferred allocation case and the unaddressed port case?  Does it need to?\n\nFor 2, I think this largely depends on the answers to the first questions.  Is it okay, for example, for a port that reported itself as \"deferred\" to begin reporting \"immediate\" as soon as IPs are allocated on port update?  Also, do we need to distinguish the deferred and unaddressed cases?\n\nI\u0027m trying to think about this from the Nova perspective.  What will they require in order to allow booting VMs to such ports without IP addresses?\n\n [1] https://review.openstack.org/#/c/239276/7/specs/mitaka/approved/vm-boot-with-unaddressed-port.rst@63\n [2] https://review.openstack.org/314815\n [3] https://review.openstack.org/320631","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b433fedf9aefbf802b12ae0423c5991e06663202","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"},{"line_number":78,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_DEFERRED"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_6f97253a","line":75,"in_reply_to":"7aa08908_4ab87b2a","updated":"2016-06-14 17:53:19.000000000","message":"John, where is that flag?  I\u0027m not sure I know what you\u0027re talking about.\n\nI don\u0027t mind the late checking idea.  But, I want to hear others\u0027 opinions.  Is there anyone else we should have weigh in here?","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c87f5a54ecdc306c79ed4403db1511125e061491","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"},{"line_number":78,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_DEFERRED"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_4ab87b2a","line":75,"in_reply_to":"7aa08908_6a090584","updated":"2016-06-14 08:39:44.000000000","message":"When a user creates an unaddressed port, there is flag telling Nova the user intended the port to be unaddressed, so Nova allows that port to not have an IP address (at least thats what I thought we did).\n\nThe idea of Nova\u0027s check, is because we had lots of complaints from users that their instance didn\u0027t have networking, but it was actually because of some error that happened during the boot process that we never reported, such as running out of IP addresses. Or as you say, sometimes they didn\u0027t do all the right things to make sure the port could get an IP address when the booted up the instance.\n\nWhat about another approach here? Nova only checks the port has an IP after the port is bound to the instance. I mean its really late in the process, so its going to an awful lot of wasted effort in some cases, but this is checking for an edge case, so that seems OK.","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"84d8c4347374415f181f5845c1f4840d45c6465d","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def _extend_port_dict_binding(plugin, subnet_res, subnet_db):"},{"line_number":75,"context_line":"    if subnet_res.get(\u0027fixed_ips\u0027):"},{"line_number":76,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":77,"context_line":"    else:"},{"line_number":78,"context_line":"       value \u003d deferred_allocation.IP_ALLOCATION_DEFERRED"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_5b5c73f0","line":75,"in_reply_to":"7aa08908_6f97253a","updated":"2016-06-15 17:38:27.000000000","message":"@John, after reading what you said in IRC [1] I realized that I think you were talking to armax about this extension that I\u0027m now adding.  Sorry it took me so long to get around to adding this.  I just had a lot of things to line up first.\n\nThe idea of this extension *is* to tell Nova when a port doesn\u0027t have an IP address on purpose.  This particular implementation of the extension is way cheesy and will likely evolve along with this discussion.  I just did this because it was an easy thing to do to post this for discussion.\n\n [1] http://eavesdrop.openstack.org/irclogs/%23openstack-neutron/%23openstack-neutron.2016-06-15.log.html#t2016-06-15T17:11:59","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"245a95425a3ef0ba1ef6aab2171b1c1d746eaac5","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Register dict extend functions for subnets"},{"line_number":70,"context_line":"common_db_mixin.CommonDbMixin.register_dict_extend_funcs("},{"line_number":71,"context_line":"    attributes.SUBNETS, [_extend_subnet_dict_binding])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_c66366dc","line":70,"updated":"2016-06-15 17:57:56.000000000","message":"This registers this extend function whenever this module is loaded regardless of if the service plugin is enabled.  Is there a better place where this should be loaded?","commit_id":"9701acac68a4fd27709c31497cb146c0ef8fd8b5"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"380af5ec3d55e023b1c20a28c15146f2dd65a81f","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"# Register dict extend functions for subnets"},{"line_number":69,"context_line":"common_db_mixin.CommonDbMixin.register_dict_extend_funcs("},{"line_number":70,"context_line":"    attributes.SUBNETS, [_extend_subnet_dict_binding])"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"def _extend_port_dict_binding(plugin, port_res, port_db):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_2c1ee16f","line":70,"range":{"start_line":69,"start_character":1,"end_line":70,"end_character":54},"updated":"2016-06-24 22:34:06.000000000","message":"This should probably be more like this [1]\n\n [1] https://review.openstack.org/#/c/320092/28/neutron/services/trunk/plugin.py","commit_id":"1a7a5538f77c687e551cdf7dd901e3b33f9ce7ad"}],"neutron/services/segments/plugin.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"83856e58c9bf23b0b220e7dd26c41d2c276a180e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def _extend_port_dict_binding(plugin, port_res, port_db):"},{"line_number":30,"context_line":"    if port_res.get(\u0027fixed_ips\u0027):"},{"line_number":31,"context_line":"        value \u003d deferred_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":32,"context_line":"    else:"},{"line_number":33,"context_line":"        value \u003d deferred_allocation.IP_ALLOCATION_DEFERRED"},{"line_number":34,"context_line":"    port_res[deferred_allocation.IP_ALLOCATION] \u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_d0a08792","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":59},"updated":"2016-06-30 20:21:01.000000000","message":"I just wanted to point out that this implementation will change.  At the time I post this patch, I just wanted the extension up for illustration purposes.  I just wanted the simplest implementation that would approximate how this would behave.  When we include unaddressed ports, this will have to get a little more complicated.\n\nI fear it might even need a DB model change to differentiate between ports that have no address because the user asked for a port with no address and one that will be assigned an address when host binding information is provided.","commit_id":"7df309d70d71014d3d7a8401756e8667deddb38a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7ed7eb1e5a8a2cc95900060b18e155ffc4acd063","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def _extend_port_dict_binding(plugin, port_res, port_db):"},{"line_number":30,"context_line":"    if port_res.get(\u0027fixed_ips\u0027):"},{"line_number":31,"context_line":"        value \u003d ip_allocation.IP_ALLOCATION_IMMEDIATE"},{"line_number":32,"context_line":"    else:"},{"line_number":33,"context_line":"        value \u003d ip_allocation.IP_ALLOCATION_DEFERRED"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_0d225f00","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":33},"updated":"2016-07-05 17:54:15.000000000","message":"I think we\u0027ll have to explicitly check if the extension is enabled here.  The unit tests fail when they\u0027re all run together but not when the failing ones are run alone.  I don\u0027t think we can count on the extension being loaded if this code is run.","commit_id":"98adf7647fdab62714721579d3224252e050b7b3"}],"neutron/tests/unit/extensions/test_segment.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7c77dc1924db242fd3705d1495f3942420a5087b","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        response \u003d self._create_port(self.fmt,"},{"line_number":743,"context_line":"                                     net_id\u003dnetwork[\u0027network\u0027][\u0027id\u0027],"},{"line_number":744,"context_line":"                                     tenant_id\u003dnetwork[\u0027network\u0027][\u0027tenant_id\u0027])"},{"line_number":745,"context_line":"        port \u003d self.deserialize(self.fmt, response)"},{"line_number":746,"context_line":"        ips \u003d port[\u0027port\u0027][\u0027fixed_ips\u0027]"},{"line_number":747,"context_line":"        self.assertEqual(0, len(ips))"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_9f4c7543","line":745,"updated":"2016-06-13 23:20:37.000000000","message":"I tried to validate here that port[\u0027port\u0027][\u0027ip_allocation\u0027] is \u0027deferred\u0027 but the attribute doesn\u0027t appear in the result because port create doesn\u0027t process extensions [1].  Maybe there is a way around it?\n\n [1] https://github.com/openstack/neutron/blob/cfc15e9e9a/neutron/db/db_base_plugin_v2.py#L1208","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ecb7e3f468b32e90fabbe2ec33436e3fe4acd571","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        response \u003d self._create_port(self.fmt,"},{"line_number":743,"context_line":"                                     net_id\u003dnetwork[\u0027network\u0027][\u0027id\u0027],"},{"line_number":744,"context_line":"                                     tenant_id\u003dnetwork[\u0027network\u0027][\u0027tenant_id\u0027])"},{"line_number":745,"context_line":"        port \u003d self.deserialize(self.fmt, response)"},{"line_number":746,"context_line":"        ips \u003d port[\u0027port\u0027][\u0027fixed_ips\u0027]"},{"line_number":747,"context_line":"        self.assertEqual(0, len(ips))"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_2a837d57","line":745,"updated":"2016-06-14 00:07:31.000000000","message":"It does for ML2.[1] The problem is that extensions can\u0027t really be processed in just the DB base plugin because an implementing plugin may have more work to do before the port is ready to have stuff added.\n\nI suggest either an ML2-specifc test or an API test because \u0027actual\u0027 plugins are expected to deal with this if you want to test the create response.\n\n1. https://github.com/openstack/neutron/blob/cfc15e9e9a2095ffe51e12e451f2c482f8cb8d9c/neutron/plugins/ml2/plugin.py#L1141","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"401a4dc5c6025f19ed8369687a84ed171129514c","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        response \u003d self._create_port(self.fmt,"},{"line_number":743,"context_line":"                                     net_id\u003dnetwork[\u0027network\u0027][\u0027id\u0027],"},{"line_number":744,"context_line":"                                     tenant_id\u003dnetwork[\u0027network\u0027][\u0027tenant_id\u0027])"},{"line_number":745,"context_line":"        port \u003d self.deserialize(self.fmt, response)"},{"line_number":746,"context_line":"        ips \u003d port[\u0027port\u0027][\u0027fixed_ips\u0027]"},{"line_number":747,"context_line":"        self.assertEqual(0, len(ips))"},{"line_number":748,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_8a70b173","line":745,"in_reply_to":"7aa08908_2a837d57","updated":"2016-06-14 00:14:18.000000000","message":"Thanks.","commit_id":"cb5733b1c85a45ad8366c84d529a89aa56c60b48"}]}
