)]}'
{"nova/api/metadata/base.py":[{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"4ff689a94043c5e16d66796f4b480fdb132b1a74","unresolved":false,"context_lines":[{"line_number":74,"context_line":"NEWTON_TWO \u003d \u00272016-10-06\u0027"},{"line_number":75,"context_line":"OCATA \u003d \u00272017-02-22\u0027"},{"line_number":76,"context_line":"ROCKY_ONE \u003d \u00272018-08-27\u0027"},{"line_number":77,"context_line":"ROCKY_TWO \u003d \u00272018-08-27-2\u0027"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"OPENSTACK_VERSIONS \u003d ["},{"line_number":80,"context_line":"    FOLSOM,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_53ee44b5","line":77,"updated":"2018-07-06 19:21:40.000000000","message":"Please comment on this version. 2018-08-27 is already in the future so I\u0027m not sure what version I should use here.","commit_id":"28198ed41b617e71676fc122a5431f9532901b52"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"95d6986334bd83b811d2fdb38f61b121f4837bd9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"NEWTON_TWO \u003d \u00272016-10-06\u0027"},{"line_number":75,"context_line":"OCATA \u003d \u00272017-02-22\u0027"},{"line_number":76,"context_line":"ROCKY_ONE \u003d \u00272018-08-27\u0027"},{"line_number":77,"context_line":"ROCKY_TWO \u003d \u00272018-08-27-2\u0027"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"OPENSTACK_VERSIONS \u003d ["},{"line_number":80,"context_line":"    FOLSOM,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_6a6de8c9","line":77,"updated":"2018-07-25 20:38:11.000000000","message":"Note to self: so, looks like this is supposed to be the initial release date for rocky [1] which should be 2018-08-30. The last time we had two version changes in one release, the first version was earlier than the final release date for the cycle.\n\nI\u0027m wondering if this format 2018-08-27-2 is valid for consumers of the metadata API? We haven\u0027t had a version of that format before.\n\n[1] https://releases.openstack.org/","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"138a0fa601d8079d93d90ab4b40836ae4f46234a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"NEWTON_TWO \u003d \u00272016-10-06\u0027"},{"line_number":75,"context_line":"OCATA \u003d \u00272017-02-22\u0027"},{"line_number":76,"context_line":"ROCKY_ONE \u003d \u00272018-08-27\u0027"},{"line_number":77,"context_line":"ROCKY_TWO \u003d \u00272018-08-27-2\u0027"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"OPENSTACK_VERSIONS \u003d ["},{"line_number":80,"context_line":"    FOLSOM,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_2dc62a43","line":77,"in_reply_to":"5f7c97a3_6a6de8c9","updated":"2018-07-25 20:58:31.000000000","message":"Yes, I put a bogus version on purpose to trigger a discussion. I don\u0027t know which date to put here. I think ROCKY_ONE should have been the date for milestone-1, not the final release. Now we are stuck with it. What now? Any suggestion? \u003d)","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"95d6986334bd83b811d2fdb38f61b121f4837bd9","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        # While services are per networks, there is also a common services"},{"line_number":496,"context_line":"        # field we need to rebuild from scratch as it contains services from"},{"line_number":497,"context_line":"        # ALL subnets."},{"line_number":498,"context_line":"        seen \u003d []"},{"line_number":499,"context_line":"        networks \u003d []"},{"line_number":500,"context_line":"        services \u003d []"},{"line_number":501,"context_line":"        for net in data[\u0027networks\u0027]:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_0d36cee9","line":498,"updated":"2018-07-25 20:38:11.000000000","message":"This should be a set if it\u0027s just to check membership.","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"138a0fa601d8079d93d90ab4b40836ae4f46234a","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        # While services are per networks, there is also a common services"},{"line_number":496,"context_line":"        # field we need to rebuild from scratch as it contains services from"},{"line_number":497,"context_line":"        # ALL subnets."},{"line_number":498,"context_line":"        seen \u003d []"},{"line_number":499,"context_line":"        networks \u003d []"},{"line_number":500,"context_line":"        services \u003d []"},{"line_number":501,"context_line":"        for net in data[\u0027networks\u0027]:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_8d009e6b","line":498,"in_reply_to":"5f7c97a3_0d36cee9","updated":"2018-07-25 20:58:31.000000000","message":"Done","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a78220cb0d1d28994c8abb3128c24d594ea5a","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        # specifically handle the top level request"},{"line_number":595,"context_line":"        if len(path_tokens) \u003d\u003d 1:"},{"line_number":596,"context_line":"            if path_tokens[0] \u003d\u003d \"openstack\":"},{"line_number":597,"context_line":"                # NOTE(vish): don\u0027t show versions that are in the future"},{"line_number":598,"context_line":"                today \u003d timeutils.utcnow().strftime(\"%Y-%m-%d\")"},{"line_number":599,"context_line":"                versions \u003d [v for v in OPENSTACK_VERSIONS if v \u003c\u003d today]"},{"line_number":600,"context_line":"                if OPENSTACK_VERSIONS !\u003d versions:"},{"line_number":601,"context_line":"                    LOG.debug(\"future versions %s hidden in version list\","},{"line_number":602,"context_line":"                              [v for v in OPENSTACK_VERSIONS"},{"line_number":603,"context_line":"                               if v not in versions], instance\u003dself.instance)"},{"line_number":604,"context_line":"                versions +\u003d [\"latest\"]"},{"line_number":605,"context_line":"            else:"},{"line_number":606,"context_line":"                versions \u003d VERSIONS + [\"latest\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_4d67e625","line":603,"range":{"start_line":597,"start_character":16,"end_line":603,"end_character":77},"updated":"2018-07-25 21:08:30.000000000","message":"OK this is where we hide unreleased stuff, so just lump the changes into the existing ROCKY version and remove the ROCKY_ONE/TWO things.","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"b1a43e4956507c063b04d1661648ca3ad1f4106b","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        # specifically handle the top level request"},{"line_number":595,"context_line":"        if len(path_tokens) \u003d\u003d 1:"},{"line_number":596,"context_line":"            if path_tokens[0] \u003d\u003d \"openstack\":"},{"line_number":597,"context_line":"                # NOTE(vish): don\u0027t show versions that are in the future"},{"line_number":598,"context_line":"                today \u003d timeutils.utcnow().strftime(\"%Y-%m-%d\")"},{"line_number":599,"context_line":"                versions \u003d [v for v in OPENSTACK_VERSIONS if v \u003c\u003d today]"},{"line_number":600,"context_line":"                if OPENSTACK_VERSIONS !\u003d versions:"},{"line_number":601,"context_line":"                    LOG.debug(\"future versions %s hidden in version list\","},{"line_number":602,"context_line":"                              [v for v in OPENSTACK_VERSIONS"},{"line_number":603,"context_line":"                               if v not in versions], instance\u003dself.instance)"},{"line_number":604,"context_line":"                versions +\u003d [\"latest\"]"},{"line_number":605,"context_line":"            else:"},{"line_number":606,"context_line":"                versions \u003d VERSIONS + [\"latest\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_88708ca9","line":603,"range":{"start_line":597,"start_character":16,"end_line":603,"end_character":77},"in_reply_to":"5f7c97a3_4d67e625","updated":"2018-07-25 21:17:42.000000000","message":"Done","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":508,"context_line":"            networks.append(net)"},{"line_number":509,"context_line":"            seen.add(nettup)"},{"line_number":510,"context_line":"        data[\u0027networks\u0027] \u003d networks"},{"line_number":511,"context_line":"        data[\u0027services\u0027] \u003d services"},{"line_number":512,"context_line":"        return data"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    def _network_data(self, version, path):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_88eacc74","line":511,"range":{"start_line":511,"start_character":8,"end_line":511,"end_character":35},"updated":"2018-07-25 21:55:48.000000000","message":"Is this right for creating the previous version behavior? I thought the previous behavior was that \u0027services\u0027 only contained the services from the first subnet?","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"305f899704a69a8ff7b3b8c8b7c8fffc3101f985","unresolved":false,"context_lines":[{"line_number":508,"context_line":"            networks.append(net)"},{"line_number":509,"context_line":"            seen.add(nettup)"},{"line_number":510,"context_line":"        data[\u0027networks\u0027] \u003d networks"},{"line_number":511,"context_line":"        data[\u0027services\u0027] \u003d services"},{"line_number":512,"context_line":"        return data"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    def _network_data(self, version, path):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_23c15b31","line":511,"range":{"start_line":511,"start_character":8,"end_line":511,"end_character":35},"in_reply_to":"5f7c97a3_033bffc8","updated":"2018-07-25 22:57:00.000000000","message":"I see that now about \u0027networks\u0027 and \u0027services\u0027 both changing from first subnet \u003d\u003e all subnets. I agree that they should match. What I didn\u0027t realize is that previously, \u0027networks\u0027 only contained the first subnet as well.\n\nSo the only two options are 1) if \u0027ip_addresses\u0027 was added only for the first subnet, then nothing else changes. Or 2), if \u0027ip_addresses\u0027 is added per subnet (per \u0027networks\u0027), then \u0027services\u0027 will contain all subnets too (which is what we have here currently).\n\nSorry I didn\u0027t understand that until I looked through this implementation -- lack of knowledge on my part.\n\nFinally, I noticed the same thing you mention, that \u0027services\u0027 seems redundant since it\u0027s already under \u0027networks\u0027. I guess it\u0027s just supposed to be a shortcut rollup of all networks services. I wouldn\u0027t remove it.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":508,"context_line":"            networks.append(net)"},{"line_number":509,"context_line":"            seen.add(nettup)"},{"line_number":510,"context_line":"        data[\u0027networks\u0027] \u003d networks"},{"line_number":511,"context_line":"        data[\u0027services\u0027] \u003d services"},{"line_number":512,"context_line":"        return data"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    def _network_data(self, version, path):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_033bffc8","line":511,"range":{"start_line":511,"start_character":8,"end_line":511,"end_character":35},"in_reply_to":"5f7c97a3_88eacc74","updated":"2018-07-25 22:12:28.000000000","message":"Yes, the previous behavior was to only contain the services from the first subnet. If \"networks\" now has info for all subnets, I think it should also have info for all services. Otherwise why don\u0027t we remove \"services\" ? The \"networks\" also has the same \"services\" field. Let me know what you think this should be.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"}],"nova/tests/unit/test_metadata.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            \u0027openstack/2018-08-27-2/user_data\u0027,"},{"line_number":508,"context_line":"            \u0027openstack/2018-08-27-2/vendor_data.json\u0027,"},{"line_number":509,"context_line":"            \u0027openstack/2018-08-27-2/network_data.json\u0027,"},{"line_number":510,"context_line":"            \u0027openstack/2018-08-27-2/vendor_data2.json\u0027,"},{"line_number":511,"context_line":"            \u0027openstack/latest/meta_data.json\u0027,"},{"line_number":512,"context_line":"            \u0027openstack/latest/user_data\u0027,"},{"line_number":513,"context_line":"            \u0027openstack/latest/vendor_data.json\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_88ff2cb0","line":510,"updated":"2018-07-25 21:55:48.000000000","message":"You forgot these 2018-08-27-2 things","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            \u0027openstack/2018-08-27-2/user_data\u0027,"},{"line_number":508,"context_line":"            \u0027openstack/2018-08-27-2/vendor_data.json\u0027,"},{"line_number":509,"context_line":"            \u0027openstack/2018-08-27-2/network_data.json\u0027,"},{"line_number":510,"context_line":"            \u0027openstack/2018-08-27-2/vendor_data2.json\u0027,"},{"line_number":511,"context_line":"            \u0027openstack/latest/meta_data.json\u0027,"},{"line_number":512,"context_line":"            \u0027openstack/latest/user_data\u0027,"},{"line_number":513,"context_line":"            \u0027openstack/latest/vendor_data.json\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_0871dcdf","line":510,"in_reply_to":"5f7c97a3_88ff2cb0","updated":"2018-07-25 22:12:28.000000000","message":"Done","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"        mdinst \u003d fake_InstanceMetadata(self, inst,"},{"line_number":1111,"context_line":"                                       network_metadata\u003dnw_data)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        nwpath \u003d \"/openstack/2018-08-27-2/network_data.json\""},{"line_number":1114,"context_line":"        nw \u003d jsonutils.loads(mdinst.lookup(nwpath))"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"        # check the other expected values"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e83d8029","line":1113,"range":{"start_line":1113,"start_character":29,"end_line":1113,"end_character":41},"updated":"2018-07-25 21:55:48.000000000","message":"Here too","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"        mdinst \u003d fake_InstanceMetadata(self, inst,"},{"line_number":1111,"context_line":"                                       network_metadata\u003dnw_data)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        nwpath \u003d \"/openstack/2018-08-27-2/network_data.json\""},{"line_number":1114,"context_line":"        nw \u003d jsonutils.loads(mdinst.lookup(nwpath))"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"        # check the other expected values"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e87580ca","line":1113,"range":{"start_line":1113,"start_character":29,"end_line":1113,"end_character":41},"in_reply_to":"5f7c97a3_e83d8029","updated":"2018-07-25 22:12:28.000000000","message":"Done","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"        for k, v in nw_data.items():"},{"line_number":1118,"context_line":"            self.assertEqual(nw[k], v)"},{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"    def test_pre_rocky_two_network_data_response(self):"},{"line_number":1121,"context_line":"        inst \u003d self.instance.obj_clone()"},{"line_number":1122,"context_line":"        nw_data \u003d self._network_data()"},{"line_number":1123,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c870c40c","line":1120,"range":{"start_line":1120,"start_character":23,"end_line":1120,"end_character":27},"updated":"2018-07-25 21:55:48.000000000","message":"Here too","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"        for k, v in nw_data.items():"},{"line_number":1118,"context_line":"            self.assertEqual(nw[k], v)"},{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"    def test_pre_rocky_two_network_data_response(self):"},{"line_number":1121,"context_line":"        inst \u003d self.instance.obj_clone()"},{"line_number":1122,"context_line":"        nw_data \u003d self._network_data()"},{"line_number":1123,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_88464c7e","line":1120,"range":{"start_line":1120,"start_character":23,"end_line":1120,"end_character":27},"in_reply_to":"5f7c97a3_c870c40c","updated":"2018-07-25 22:12:28.000000000","message":"Done","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"}],"nova/virt/netutils.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        network \u003d vif[\u0027network\u0027]"},{"line_number":194,"context_line":"        if not network[\u0027subnets\u0027]:"},{"line_number":195,"context_line":"            continue"},{"line_number":196,"context_line":"        ifc_num +\u003d 1"},{"line_number":197,"context_line":"        # Get the VIF or physical NIC data"},{"line_number":198,"context_line":"        link \u003d _get_eth_link(vif, ifc_num)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_088f9c2f","line":195,"updated":"2018-07-25 21:55:48.000000000","message":"Okay, so you\u0027re doing this instead of the previous way where subnet_v4 and subnet_v6 would be None if network[\u0027subnets\u0027] was empty and several statements were guarded with \u0027if subnet_v4 or subnet_v6\u0027.\n\nInstead of that, you skip the rest of the logic if no subnet.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        network \u003d vif[\u0027network\u0027]"},{"line_number":194,"context_line":"        if not network[\u0027subnets\u0027]:"},{"line_number":195,"context_line":"            continue"},{"line_number":196,"context_line":"        ifc_num +\u003d 1"},{"line_number":197,"context_line":"        # Get the VIF or physical NIC data"},{"line_number":198,"context_line":"        link \u003d _get_eth_link(vif, ifc_num)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_6843b06c","line":195,"in_reply_to":"5f7c97a3_088f9c2f","updated":"2018-07-25 22:12:28.000000000","message":"Yes, I think there is no reason to deal with v4 and v6 in different ways. The logic is the same.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    elif subnet.get_meta(\u0027dhcp_server\u0027) is not None:"},{"line_number":258,"context_line":"        net_info \u003d {"},{"line_number":259,"context_line":"            \u0027id\u0027: \u0027network%d\u0027 % net_num,"},{"line_number":260,"context_line":"            \u0027type\u0027: \u0027ipv%d_dhcp\u0027 % subnet[\u0027version\u0027],"},{"line_number":261,"context_line":"            \u0027link\u0027: link_id,"},{"line_number":262,"context_line":"            \u0027network_id\u0027: vif[\u0027network\u0027][\u0027id\u0027]"},{"line_number":263,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c8bf64a9","line":260,"updated":"2018-07-25 21:55:48.000000000","message":"This is a good idea but I have to admit, the question comes up, \"Can we depend on \u0027version\u0027 being set in the subnet dict?\"\n\n(later) Based on the _get_first_subnet method (formerly _get_first_network), we can depend on the presence of the \u0027version\u0027 key in the subnet dict.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    elif subnet.get_meta(\u0027dhcp_server\u0027) is not None:"},{"line_number":258,"context_line":"        net_info \u003d {"},{"line_number":259,"context_line":"            \u0027id\u0027: \u0027network%d\u0027 % net_num,"},{"line_number":260,"context_line":"            \u0027type\u0027: \u0027ipv%d_dhcp\u0027 % subnet[\u0027version\u0027],"},{"line_number":261,"context_line":"            \u0027link\u0027: link_id,"},{"line_number":262,"context_line":"            \u0027network_id\u0027: vif[\u0027network\u0027][\u0027id\u0027]"},{"line_number":263,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_a8178853","line":260,"in_reply_to":"5f7c97a3_c8bf64a9","updated":"2018-07-25 22:12:28.000000000","message":"Yes, I think we can rely on it. Otherwise get_first_subnet would fail much earlier.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"}],"releasenotes/notes/multiple-fixed-ips-network-information-e2eabb992b7c1e33.yaml":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"95d6986334bd83b811d2fdb38f61b121f4837bd9","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Metadata and configuration drive will now return a list of all fixed-ips"},{"line_number":5,"context_line":"    found on a port instead of the first fixed-ip from the first subnet."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":8,"context_line":"    the \"networks[]/ip_addresses\" field."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5f7c97a3_ed3fd2af","line":5,"updated":"2018-07-25 20:38:11.000000000","message":"We should probably mention the new metadata API version these are found in.","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"138a0fa601d8079d93d90ab4b40836ae4f46234a","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Metadata and configuration drive will now return a list of all fixed-ips"},{"line_number":5,"context_line":"    found on a port instead of the first fixed-ip from the first subnet."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":8,"context_line":"    the \"networks[]/ip_addresses\" field."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5f7c97a3_8d25fe18","line":5,"in_reply_to":"5f7c97a3_ed3fd2af","updated":"2018-07-25 20:58:31.000000000","message":"Done. Will update with proposed version on next change.","commit_id":"4f7a9317edf18181ad16988f1f61f5503109e4b1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"60f353d5082e5c183b6b35fbd686e82d2279d645","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This feature is available since 2018-08-27 metadata API version."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":9,"context_line":"    the \"networks[]/ip_addresses\" field."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    For backward compatibility, the \"networks[]/ip_address\" and"},{"line_number":12,"context_line":"    \"networks[]/netmask\" fields will contain information from"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_688090bf","line":9,"updated":"2018-07-25 21:55:48.000000000","message":"And \"services\" will now contain a union of the services found in all of the subnets, right? And that is different from the previous metadata API version, correct? I do wonder if that could somehow cause a problem for anyone relying on existing behavior.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"97630ddd8b5d49a72b6ad59a49184eaef771f8e0","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This feature is available since 2018-08-27 metadata API version."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":9,"context_line":"    the \"networks[]/ip_addresses\" field."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    For backward compatibility, the \"networks[]/ip_address\" and"},{"line_number":12,"context_line":"    \"networks[]/netmask\" fields will contain information from"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_0f331063","line":9,"in_reply_to":"5f7c97a3_23171bf2","updated":"2018-07-26 14:01:54.000000000","message":"A list or dict having more values is definitely an additive change. A non-additive change would be changing the name of a key,  the data type of something, etc.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7ca5ae7fd6578e2c2ca7f7ae864fc94d7ae79141","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This feature is available since 2018-08-27 metadata API version."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":9,"context_line":"    the \"networks[]/ip_addresses\" field."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    For backward compatibility, the \"networks[]/ip_address\" and"},{"line_number":12,"context_line":"    \"networks[]/netmask\" fields will contain information from"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_882bac99","line":9,"in_reply_to":"5f7c97a3_688090bf","updated":"2018-07-25 22:02:52.000000000","message":"I also don\u0027t see any mention of a change in the behavior of the \"services\" field in the spec for this work.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":7156,"name":"Mathieu Gagné","email":"mgagne@calavera.ca","username":"mgagne"},"change_message_id":"0117d6478d672609fd8bd57f50fa25fc143189ad","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This feature is available since 2018-08-27 metadata API version."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":9,"context_line":"    the \"networks[]/ip_addresses\" field."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    For backward compatibility, the \"networks[]/ip_address\" and"},{"line_number":12,"context_line":"    \"networks[]/netmask\" fields will contain information from"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_e8fca00e","line":9,"in_reply_to":"5f7c97a3_688090bf","updated":"2018-07-25 22:12:28.000000000","message":"People relying on existing behavior should ask for the previous version. I will update release note to mention the new behavior. Should I also update the spec?","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"305f899704a69a8ff7b3b8c8b7c8fffc3101f985","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This feature is available since 2018-08-27 metadata API version."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The fixed-ips are now available as a list of objects in"},{"line_number":9,"context_line":"    the \"networks[]/ip_addresses\" field."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    For backward compatibility, the \"networks[]/ip_address\" and"},{"line_number":12,"context_line":"    \"networks[]/netmask\" fields will contain information from"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f7c97a3_23171bf2","line":9,"in_reply_to":"5f7c97a3_e8fca00e","updated":"2018-07-25 22:57:00.000000000","message":"I had another look at the spec and found the mention of \"include all the subnets\", which is where the changes to the \u0027networks\u0027 field and \u0027services\u0027 field come from. Maybe it\u0027s just me, but it would have helped me to see that more explicitly stated in the spec.\n\nIn total, it looks like we have a few changes:\n\n * addition of \u0027ip_addresses\u0027 subfield under the \u0027networks\u0027 field\n * \u0027networks\u0027 field now contains all subnets, not just first subnet\n * \u0027services\u0027 field now contains all subnets, not just first subnet\n\nMy concern comes from being unclear about whether returning more networks/services in the existing \u0027networks\u0027/\u0027services\u0027 field is considered a \"change\" or an \"addition\". As you recall, when we started talking about the metadata API change for fixed ips, there was a discussion wherein we learned that we can only add to the API, not \"change\" it, even though \"changes\" are allowed under the EC2 API versioning our metadata API is based on. This has been the precedent in the nova metadata API.\n\nSo, let me double check with dansmith and mriedem since they know a lot more about the metadata API than I do, and get their ack on the \u0027networks\u0027 and \u0027services\u0027 behavior. I\u0027ll ask them tomorrow.","commit_id":"f23766df5363eb3bcaa2b06df859c9f98210b8ca"}]}
