)]}'
{"nailgun/nailgun/api/handlers/network.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2Fh4%3D","line":3,"updated":"2014-04-09 00:28:28.000000000","message":"years","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"40f5c61e86dfc651aa810ecb53601bf27c80d63f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from nailgun.logger import logger"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class NetworkGroupHandler(BaseHandler):"},{"line_number":38,"context_line":"    \"\"\"Network group handler"},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FpAo%3D","line":37,"updated":"2014-04-11 13:54:51.000000000","message":"How NovaNetworkConfigurationHandler/NeutronNetworkConfigurationHandler/etc. will work now? What is the difference with these two?","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"60ec2067f316edd54b55d0a2640d7c3c4285805c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from nailgun.logger import logger"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class NetworkGroupHandler(BaseHandler):"},{"line_number":38,"context_line":"    \"\"\"Network group handler"},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FoTI%3D","line":37,"in_reply_to":"AAAAW3%2F%2FpAo%3D","updated":"2014-04-11 15:13:03.000000000","message":"Done","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"1c40f1fde82a9e9e5107e51220a68cc63e7f6516","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        net \u003d self.get_object_or_404(NetworkGroup, net_id)"},{"line_number":57,"context_line":"        data \u003d self.validator.validate(web.data())"},{"line_number":58,"context_line":"        for key, value in data.iteritems():"},{"line_number":59,"context_line":"            setattr(net, key, value)"},{"line_number":60,"context_line":"        db().add(net)"},{"line_number":61,"context_line":"        return self.render(net)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FoOo%3D","line":59,"updated":"2014-04-11 15:32:40.000000000","message":"Changing of \u0027id\u0027 and may be some other fields (meta, group_id, release) should be prohibited.","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"91e00899eee19d0118de6e50852fe54b58914f62","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        net \u003d self.get_object_or_404(NetworkGroup, net_id)"},{"line_number":57,"context_line":"        data \u003d self.validator.validate(web.data())"},{"line_number":58,"context_line":"        for key, value in data.iteritems():"},{"line_number":59,"context_line":"            setattr(net, key, value)"},{"line_number":60,"context_line":"        db().add(net)"},{"line_number":61,"context_line":"        return self.render(net)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FnxU%3D","line":59,"in_reply_to":"AAAAW3%2F%2FoOo%3D","updated":"2014-04-11 18:12:56.000000000","message":"Done","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"e62d413aaa17ef0f86ac72723746c9b7f5605c85","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from nailgun.logger import logger"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class NetworkGroupHandler(BaseHandler):"},{"line_number":38,"context_line":"    \"\"\"Network group handler"},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FfNA%3D","line":37,"updated":"2014-04-14 09:27:27.000000000","message":"API repeats functionality that we have already and adds some new (e.g. POST/DELETE). Why not to have one API set for this functionality? Now we can change networks parameters via both old and new handlers in some cases and via new handlers only in other cases. New handlers don\u0027t have data validation that we have in old ones.","commit_id":"3edbeede4fdb05a2954db863038d337a7c8abda2"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"f6897c046f42de62c8850d8a0d5c1a42dca2b888","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        return self.render(network_groups)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @content_json"},{"line_number":106,"context_line":"    def POST(self):"},{"line_number":107,"context_line":"        data \u003d self.checked_data()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        ng \u003d NetworkGroup()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FfSQ%3D","line":106,"updated":"2014-04-14 09:12:21.000000000","message":"We don\u0027t have consistency checks that every node group has proper set of network groups.","commit_id":"3edbeede4fdb05a2954db863038d337a7c8abda2"}],"nailgun/nailgun/api/handlers/node.py":[{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"c1667b59c04b28d65ce9d68d82834f0c7b23d121","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if \"group_id\" in data:"},{"line_number":120,"context_line":"            old_group_id \u003d node.group_id"},{"line_number":121,"context_line":"            node.group_id \u003d data[\"group_id\"]"},{"line_number":122,"context_line":"            if node.group_id !\u003d old_group_id:"},{"line_number":123,"context_line":"                if old_group_id:"},{"line_number":124,"context_line":"                    network_manager.clear_assigned_networks(node)"},{"line_number":125,"context_line":"                if node.group_id:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F936w%3D","line":122,"updated":"2014-04-01 15:54:41.000000000","message":"It seems that networks assignment can be run twice during one request processing (L112-116 and 123-127).","commit_id":"ab3c5222ea7b70cd430c5b69a61af55225f612a7"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"f47cd7849b0bdd5a3259abe05af6d5c5300f12f3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if \"group_id\" in data:"},{"line_number":120,"context_line":"            old_group_id \u003d node.group_id"},{"line_number":121,"context_line":"            node.group_id \u003d data[\"group_id\"]"},{"line_number":122,"context_line":"            if node.group_id !\u003d old_group_id:"},{"line_number":123,"context_line":"                if old_group_id:"},{"line_number":124,"context_line":"                    network_manager.clear_assigned_networks(node)"},{"line_number":125,"context_line":"                if node.group_id:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F923Q%3D","line":122,"in_reply_to":"AAAAWH%2F936w%3D","updated":"2014-04-01 16:05:04.000000000","message":"The idea here is that cluster_id will be present when adding a node to an environment. group_id will only be present when a node is assigned to a node group (which can only happen after a node is part of a cluster). Both keys should never be present in the same request.","commit_id":"ab3c5222ea7b70cd430c5b69a61af55225f612a7"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"c1667b59c04b28d65ce9d68d82834f0c7b23d121","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            else:"},{"line_number":376,"context_line":"                node \u003d q.get(nd[\"id\"])"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"            is_agent \u003d nd.pop(\"is_agent\") if \"is_agent\" in nd else False"},{"line_number":379,"context_line":"            if is_agent:"},{"line_number":380,"context_line":"                node.timestamp \u003d datetime.now()"},{"line_number":381,"context_line":"                if not node.online:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F93BY%3D","line":378,"updated":"2014-04-01 15:54:41.000000000","message":"Why agent logic is here not in AgentHandler?","commit_id":"ab3c5222ea7b70cd430c5b69a61af55225f612a7"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"f47cd7849b0bdd5a3259abe05af6d5c5300f12f3","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            else:"},{"line_number":376,"context_line":"                node \u003d q.get(nd[\"id\"])"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"            is_agent \u003d nd.pop(\"is_agent\") if \"is_agent\" in nd else False"},{"line_number":379,"context_line":"            if is_agent:"},{"line_number":380,"context_line":"                node.timestamp \u003d datetime.now()"},{"line_number":381,"context_line":"                if not node.online:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9250%3D","line":378,"in_reply_to":"AAAAWH%2F93BY%3D","updated":"2014-04-01 16:05:04.000000000","message":"Because a lot of this code was originally written 2 months ago. I\u0027ll update the AgentHandler.","commit_id":"ab3c5222ea7b70cd430c5b69a61af55225f612a7"},{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            for ng in admin_ngs:"},{"line_number":173,"context_line":"                if ip in IPNetwork(ng.cidr):"},{"line_number":174,"context_line":"                    node.group_id \u003d ng.group_id"},{"line_number":175,"context_line":"                    if node.error_type \u003d\u003d \u0027discover\u0027:"},{"line_number":176,"context_line":"                        node.error_type \u003d None"},{"line_number":177,"context_line":"                        node.error_msg \u003d None"},{"line_number":178,"context_line":"                        notifier.notify("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2F%2BA%3D","line":175,"updated":"2014-04-16 01:29:45.000000000","message":"There is no such error_type. Did you mean status?","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            for ng in admin_ngs:"},{"line_number":173,"context_line":"                if ip in IPNetwork(ng.cidr):"},{"line_number":174,"context_line":"                    node.group_id \u003d ng.group_id"},{"line_number":175,"context_line":"                    if node.error_type \u003d\u003d \u0027discover\u0027:"},{"line_number":176,"context_line":"                        node.error_type \u003d None"},{"line_number":177,"context_line":"                        node.error_msg \u003d None"},{"line_number":178,"context_line":"                        notifier.notify("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7Gw%3D","line":175,"in_reply_to":"AAAAXH%2F%2F%2F%2BA%3D","updated":"2014-04-16 13:49:32.000000000","message":"Probably. This will all be removed. We don\u0027t need to send a notification or log anything.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                    if node.error_type \u003d\u003d \u0027discover\u0027:"},{"line_number":176,"context_line":"                        node.error_type \u003d None"},{"line_number":177,"context_line":"                        node.error_msg \u003d None"},{"line_number":178,"context_line":"                        notifier.notify("},{"line_number":179,"context_line":"                            \"discover\","},{"line_number":180,"context_line":"                            ("},{"line_number":181,"context_line":"                                u\"Node \u0027{0}\u0027 rejoined with group_id \u0027{1}\u0027\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2F8s%3D","line":178,"updated":"2014-04-16 01:29:45.000000000","message":"Why do you notify about it?","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                    if node.error_type \u003d\u003d \u0027discover\u0027:"},{"line_number":176,"context_line":"                        node.error_type \u003d None"},{"line_number":177,"context_line":"                        node.error_msg \u003d None"},{"line_number":178,"context_line":"                        notifier.notify("},{"line_number":179,"context_line":"                            \"discover\","},{"line_number":180,"context_line":"                            ("},{"line_number":181,"context_line":"                                u\"Node \u0027{0}\u0027 rejoined with group_id \u0027{1}\u0027\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7EQ%3D","line":178,"in_reply_to":"AAAAXH%2F%2F%2F8s%3D","updated":"2014-04-16 13:49:32.000000000","message":"When we wrote this originally we cared about this info. In the general case here we definitely don\u0027t want to notify about this case.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                        )"},{"line_number":187,"context_line":"                        node.status \u003d \u0027rollback\u0027"},{"line_number":188,"context_line":"                    break"},{"line_number":189,"context_line":"            if node.group_id is None and node.error_type is None:"},{"line_number":190,"context_line":"                msg \u003d ("},{"line_number":191,"context_line":"                    u\"Failed to match node \u0027{0}\u0027 with group_id. Add \""},{"line_number":192,"context_line":"                    \"fuelweb_admin NetworkGroup to match \u0027{1}\u0027\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2F6Q%3D","line":189,"updated":"2014-04-16 01:29:45.000000000","message":"What do you check here? node.group_id will be always None because ng.group_id is None. You didn\u0027t assign any NodeGroup to admin network group.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                        )"},{"line_number":187,"context_line":"                        node.status \u003d \u0027rollback\u0027"},{"line_number":188,"context_line":"                    break"},{"line_number":189,"context_line":"            if node.group_id is None and node.error_type is None:"},{"line_number":190,"context_line":"                msg \u003d ("},{"line_number":191,"context_line":"                    u\"Failed to match node \u0027{0}\u0027 with group_id. Add \""},{"line_number":192,"context_line":"                    \"fuelweb_admin NetworkGroup to match \u0027{1}\u0027\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7Ek%3D","line":189,"in_reply_to":"AAAAXH%2F%2F%2F6Q%3D","updated":"2014-04-16 13:49:32.000000000","message":"The idea behind this block of code is that if you set up additional admin networks (like one per rack of hosts) then when the node is discovered we can know which group it belongs to based on its IP. This would save the user time in what we felt was the most common use case.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8787,"name":"Dmitry Borodaenko","email":"angdraug@gmail.com","username":"angdraug"},"change_message_id":"4c09d1ee7ab5893fef8c8f381f5786bdb5d13844","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                    node.ip"},{"line_number":196,"context_line":"                )"},{"line_number":197,"context_line":"                logger.warning(msg)"},{"line_number":198,"context_line":"                notifier.notify(\"error\", msg, node_id\u003dnode.id)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        if not node.online:"},{"line_number":201,"context_line":"            node.online \u003d True"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FYjA%3D","line":198,"updated":"2014-04-15 00:44:13.000000000","message":"This whole if could be a helper method for greater readability, eliminate code duplication against nailgun/objects/node.py and FTGJ.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/api/handlers/node_group.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9z%2FU%3D","line":3,"updated":"2014-04-02 17:58:51.000000000","message":"2014","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"},{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2Fh0%3D","line":3,"updated":"2014-04-09 00:28:28.000000000","message":"year","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"}],"nailgun/nailgun/api/serializers/network_group.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2Fho%3D","line":3,"updated":"2014-04-09 00:28:28.000000000","message":"year","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"40f5c61e86dfc651aa810ecb53601bf27c80d63f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        \u0027name\u0027,"},{"line_number":25,"context_line":"        \u0027release\u0027,"},{"line_number":26,"context_line":"        \u0027network_size\u0027,"},{"line_number":27,"context_line":"        \u0027amount\u0027,"},{"line_number":28,"context_line":"        \u0027vlan_start\u0027,"},{"line_number":29,"context_line":"        \u0027cidr\u0027,"},{"line_number":30,"context_line":"        \u0027gateway\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2Fo%2Bc%3D","line":27,"updated":"2014-04-11 13:54:51.000000000","message":"We don\u0027t have \u0027network_size\u0027 , \u0027amount\u0027 and \u0027netmask\u0027 now.","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"91e00899eee19d0118de6e50852fe54b58914f62","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        \u0027name\u0027,"},{"line_number":25,"context_line":"        \u0027release\u0027,"},{"line_number":26,"context_line":"        \u0027network_size\u0027,"},{"line_number":27,"context_line":"        \u0027amount\u0027,"},{"line_number":28,"context_line":"        \u0027vlan_start\u0027,"},{"line_number":29,"context_line":"        \u0027cidr\u0027,"},{"line_number":30,"context_line":"        \u0027gateway\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FnxE%3D","line":27,"in_reply_to":"AAAAW3%2F%2Fo%2Bc%3D","updated":"2014-04-11 18:12:56.000000000","message":"Done","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"}],"nailgun/nailgun/api/serializers/node_group.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9z%2FE%3D","line":3,"updated":"2014-04-02 17:58:51.000000000","message":"2014","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"},{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2Fhg%3D","line":3,"updated":"2014-04-09 00:28:28.000000000","message":"year","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"}],"nailgun/nailgun/api/urls/v1.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":59,"context_line":"from nailgun.api.handlers.node import NodeHandler"},{"line_number":60,"context_line":"from nailgun.api.handlers.node import NodeNICsDefaultHandler"},{"line_number":61,"context_line":"from nailgun.api.handlers.node import NodeNICsHandler"},{"line_number":62,"context_line":"from nailgun.api.handlers.node import NodesAllocationStatsHandler"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"from nailgun.api.handlers.notifications import NotificationCollectionHandler"},{"line_number":65,"context_line":"from nailgun.api.handlers.notifications import NotificationHandler"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9z%2Bk%3D","line":62,"updated":"2014-04-02 17:58:51.000000000","message":"flake8, should come after L 55","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"}],"nailgun/nailgun/api/validators/node_group.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9z%2BM%3D","line":2,"updated":"2014-04-02 17:58:51.000000000","message":"2014","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"},{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2FhU%3D","line":2,"updated":"2014-04-09 00:28:28.000000000","message":"year","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"}],"nailgun/nailgun/db/migration/alembic_migrations/versions/330ec2ab2bbf_add_nodegroup.py":[{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"c1667b59c04b28d65ce9d68d82834f0c7b23d121","unresolved":false,"context_lines":[{"line_number":7,"context_line":"\"\"\""},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"# revision identifiers, used by Alembic."},{"line_number":10,"context_line":"revision \u003d \u0027330ec2ab2bbf\u0027"},{"line_number":11,"context_line":"down_revision \u003d \u00274f21f21e2672\u0027"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F96lg%3D","line":10,"updated":"2014-04-01 15:54:41.000000000","message":"We\u0027ve agreed to merge all changes to \u0027current\u0027 version before 5.0.","commit_id":"ab3c5222ea7b70cd430c5b69a61af55225f612a7"},{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"40f5c61e86dfc651aa810ecb53601bf27c80d63f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"\"\"\""},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"# revision identifiers, used by Alembic."},{"line_number":10,"context_line":"revision \u003d \u0027330ec2ab2bbf\u0027"},{"line_number":11,"context_line":"down_revision \u003d \u00274f21f21e2672\u0027"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FpRo%3D","line":10,"updated":"2014-04-11 13:54:51.000000000","message":"We agreed to merge all alembic stuff to \u0027current\u0027 version, i.e. to versions/current.py","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"}],"nailgun/nailgun/db/sqlalchemy/models/__init__.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":43,"context_line":"from nailgun.db.sqlalchemy.models.task import Task"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"from nailgun.db.sqlalchemy.models.redhat import RedHatAccount"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2FhM%3D","line":46,"updated":"2014-04-09 00:28:28.000000000","message":"trailing line?","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"}],"nailgun/nailgun/db/sqlalchemy/models/cluster.py":[{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"40f5c61e86dfc651aa810ecb53601bf27c80d63f","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        return [g.id for g in self.node_groups if g.name \u003d\u003d \"default\"][0]"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @property"},{"line_number":153,"context_line":"    def network_manager(self):"},{"line_number":154,"context_line":"        if self.net_provider \u003d\u003d \u0027neutron\u0027:"},{"line_number":155,"context_line":"            from nailgun.network.neutron import NeutronManager"},{"line_number":156,"context_line":"            return NeutronManager"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2Fo9w%3D","line":153,"updated":"2014-04-11 13:54:51.000000000","message":"We have this hepler in master in objects now (get_network_manager).","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"91e00899eee19d0118de6e50852fe54b58914f62","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        return [g.id for g in self.node_groups if g.name \u003d\u003d \"default\"][0]"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @property"},{"line_number":153,"context_line":"    def network_manager(self):"},{"line_number":154,"context_line":"        if self.net_provider \u003d\u003d \u0027neutron\u0027:"},{"line_number":155,"context_line":"            from nailgun.network.neutron import NeutronManager"},{"line_number":156,"context_line":"            return NeutronManager"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2Fnwo%3D","line":153,"in_reply_to":"AAAAW3%2F%2Fo9w%3D","updated":"2014-04-11 18:12:56.000000000","message":"Done","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    def network_groups(self):"},{"line_number":154,"context_line":"        net_list \u003d []"},{"line_number":155,"context_line":"        for ng in self.node_groups:"},{"line_number":156,"context_line":"            for n in ng.networks:"},{"line_number":157,"context_line":"                net_list.append(n)"},{"line_number":158,"context_line":"        return net_list"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2Ft8%3D","line":156,"updated":"2014-04-16 01:29:45.000000000","message":"net_list.extend(ng.networks)","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    def network_groups(self):"},{"line_number":154,"context_line":"        net_list \u003d []"},{"line_number":155,"context_line":"        for ng in self.node_groups:"},{"line_number":156,"context_line":"            for n in ng.networks:"},{"line_number":157,"context_line":"                net_list.append(n)"},{"line_number":158,"context_line":"        return net_list"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7D4%3D","line":156,"in_reply_to":"AAAAXH%2F%2F%2Ft8%3D","updated":"2014-04-16 13:49:32.000000000","message":"Of course.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/db/sqlalchemy/models/network.py":[{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    # can be nullable only for fuelweb admin net"},{"line_number":66,"context_line":"    release \u003d Column(Integer, ForeignKey(\u0027releases.id\u0027))"},{"line_number":67,"context_line":"    # can be nullable only for fuelweb admin net"},{"line_number":68,"context_line":"    group_id \u003d Column(Integer, ForeignKey(\u0027nodegroups.id\u0027), nullable\u003dTrue)"},{"line_number":69,"context_line":"    vlan_start \u003d Column(Integer)"},{"line_number":70,"context_line":"    cidr \u003d Column(String(25))"},{"line_number":71,"context_line":"    gateway \u003d Column(String(25))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2FtM%3D","line":68,"updated":"2014-04-16 01:29:45.000000000","message":"network group with id and group_id? Little confusing. Better call it node_group_id","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    # can be nullable only for fuelweb admin net"},{"line_number":66,"context_line":"    release \u003d Column(Integer, ForeignKey(\u0027releases.id\u0027))"},{"line_number":67,"context_line":"    # can be nullable only for fuelweb admin net"},{"line_number":68,"context_line":"    group_id \u003d Column(Integer, ForeignKey(\u0027nodegroups.id\u0027), nullable\u003dTrue)"},{"line_number":69,"context_line":"    vlan_start \u003d Column(Integer)"},{"line_number":70,"context_line":"    cidr \u003d Column(String(25))"},{"line_number":71,"context_line":"    gateway \u003d Column(String(25))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7Dw%3D","line":68,"in_reply_to":"AAAAXH%2F%2F%2FtM%3D","updated":"2014-04-16 13:49:32.000000000","message":"Yeah, that\u0027s probably a better name.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/db/sqlalchemy/models/node.py":[{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if NetworkManager.is_ip_belongs_to_admin_subnet(ip_addr):"},{"line_number":240,"context_line":"                return interface"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        for interface in self.interfaces:"},{"line_number":243,"context_line":"            if interface.mac \u003d\u003d self.mac:"},{"line_number":244,"context_line":"                return interface"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2Fss%3D","line":242,"updated":"2014-04-16 01:29:45.000000000","message":"How is this connected with all this changes?","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if NetworkManager.is_ip_belongs_to_admin_subnet(ip_addr):"},{"line_number":240,"context_line":"                return interface"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        for interface in self.interfaces:"},{"line_number":243,"context_line":"            if interface.mac \u003d\u003d self.mac:"},{"line_number":244,"context_line":"                return interface"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7A4%3D","line":242,"in_reply_to":"AAAAXH%2F%2F%2Fss%3D","updated":"2014-04-16 13:49:32.000000000","message":"Without this code node.admin_interface will only return a result when a node uses the default admin network. If you\u0027ve created another admin network then you want to know which interface that network is on.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/network/manager.py":[{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"40f5c61e86dfc651aa810ecb53601bf27c80d63f","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                    db().query(NetworkGroup).filter("},{"line_number":499,"context_line":"                        NetworkGroup.id.in_(ng_ids)))"},{"line_number":500,"context_line":"        db().flush()"},{"line_number":501,"context_line":"        db().commit()"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    @classmethod"},{"line_number":504,"context_line":"    def get_cluster_networkgroups_by_node(cls, node):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2Fo8Y%3D","line":501,"updated":"2014-04-11 13:54:51.000000000","message":"Is it required?","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"91e00899eee19d0118de6e50852fe54b58914f62","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                    db().query(NetworkGroup).filter("},{"line_number":499,"context_line":"                        NetworkGroup.id.in_(ng_ids)))"},{"line_number":500,"context_line":"        db().flush()"},{"line_number":501,"context_line":"        db().commit()"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    @classmethod"},{"line_number":504,"context_line":"    def get_cluster_networkgroups_by_node(cls, node):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FnU8%3D","line":501,"in_reply_to":"AAAAW3%2F%2Fo8Y%3D","updated":"2014-04-11 18:12:56.000000000","message":"No it\u0027s not needed.","commit_id":"75d3652d6e4b4350f9576cee9bee077251b50c51"},{"author":{"_account_id":8787,"name":"Dmitry Borodaenko","email":"angdraug@gmail.com","username":"angdraug"},"change_message_id":"4c09d1ee7ab5893fef8c8f381f5786bdb5d13844","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            node_db \u003d db().query(Node).get(node_id)"},{"line_number":90,"context_line":"            admin_ng \u003d admin_ngs.filter_by(group_id\u003dnode_db.group_id).first()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        admin_ng \u003d admin_ng or admin_ngs.first()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if not admin_ng:"},{"line_number":95,"context_line":"            raise errors.AdminNetworkNotFound()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FYqM%3D","line":92,"updated":"2014-04-15 00:44:13.000000000","message":"How about sorting this list or otherwise ensuring that it\u0027s deterministic (as discussed, filtering by NULL group_id would ensure global admin ng is picked).","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8787,"name":"Dmitry Borodaenko","email":"angdraug@gmail.com","username":"angdraug"},"change_message_id":"4c09d1ee7ab5893fef8c8f381f5786bdb5d13844","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        group_id \u003d None"},{"line_number":269,"context_line":"        for node in cluster.nodes:"},{"line_number":270,"context_line":"            if \u0027controller\u0027 in node.all_roles or \\"},{"line_number":271,"context_line":"               \u0027primary-controller\u0027 in node.all_roles:"},{"line_number":272,"context_line":"                group_id \u003d node.group_id"},{"line_number":273,"context_line":"                break"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FYn0%3D","line":271,"updated":"2014-04-15 00:44:13.000000000","message":"Long-term, it\u0027s better not to assume that controller is the only type of node that can have a vip.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/network/neutron.py":[{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"0052d2b75dc83194151ed1d89f41f55a5735a6bd","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            NetworkGroup.cidr,"},{"line_number":42,"context_line":"            NetworkGroup.gateway"},{"line_number":43,"context_line":"        ).filter_by("},{"line_number":44,"context_line":"            group_id\u003dcluster.default_group,"},{"line_number":45,"context_line":"            name\u003d\u0027public\u0027"},{"line_number":46,"context_line":"        ).first()"},{"line_number":47,"context_line":"        join_range \u003d lambda r: (\":\".join(map(str, r)) if r else None)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FgFQ%3D","line":44,"updated":"2014-04-14 07:49:20.000000000","message":"Public addresses of one node group are used for neutron external networks (floating ranges) for whole cluster. Will this work properly? It seems that our current network check (nailgun.network.checker.NetworkCheck) will fail when different public cidrs are in use in one cluster.","commit_id":"3edbeede4fdb05a2954db863038d337a7c8abda2"}],"nailgun/nailgun/objects/node.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        if \"group_id\" in data:"},{"line_number":297,"context_line":"            new_group_id \u003d data.pop(\"group_id\")"},{"line_number":298,"context_line":"            if instance.group_id !\u003d new_group_id:"},{"line_number":299,"context_line":"                NetworkManager.clear_assigned_networks()"},{"line_number":300,"context_line":"            instance.group_id \u003d new_group_id"},{"line_number":301,"context_line":"            cls.add_into_cluster(instance, instance.cluster_id)"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9s0g%3D","line":299,"updated":"2014-04-02 17:58:51.000000000","message":"should this filter by the node(s) in question?","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"},{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c808282946f6bfe2a92ce659f56768c64b801ac9","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        if \"group_id\" in data:"},{"line_number":305,"context_line":"            new_group_id \u003d data.pop(\"group_id\")"},{"line_number":306,"context_line":"            if instance.group_id !\u003d new_group_id:"},{"line_number":307,"context_line":"                nm \u003d Cluster.get_network_manager(instance.cluster)"},{"line_number":308,"context_line":"                nm.clear_assigned_networks(instance)"},{"line_number":309,"context_line":"            instance.group_id \u003d new_group_id"},{"line_number":310,"context_line":"            cls.add_into_cluster(instance, instance.cluster_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7NU%3D","line":307,"updated":"2014-04-16 13:31:07.000000000","message":"what if it\u0027s not in cluster yet?","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        if \"group_id\" in data:"},{"line_number":305,"context_line":"            new_group_id \u003d data.pop(\"group_id\")"},{"line_number":306,"context_line":"            if instance.group_id !\u003d new_group_id:"},{"line_number":307,"context_line":"                nm \u003d Cluster.get_network_manager(instance.cluster)"},{"line_number":308,"context_line":"                nm.clear_assigned_networks(instance)"},{"line_number":309,"context_line":"            instance.group_id \u003d new_group_id"},{"line_number":310,"context_line":"            cls.add_into_cluster(instance, instance.cluster_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7Ik%3D","line":307,"in_reply_to":"AAAAXH%2F%2F7NU%3D","updated":"2014-04-16 13:49:32.000000000","message":"Good catch.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8787,"name":"Dmitry Borodaenko","email":"angdraug@gmail.com","username":"angdraug"},"change_message_id":"4c09d1ee7ab5893fef8c8f381f5786bdb5d13844","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        db().flush()"},{"line_number":398,"context_line":"        db().refresh(instance)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # Assign node group"},{"line_number":401,"context_line":"        cls.assign_group(instance)"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        network_manager \u003d Cluster.get_network_manager(instance.cluster)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FYhc%3D","line":400,"updated":"2014-04-15 00:44:13.000000000","message":"Don\u0027t need this comment any more.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/objects/node_group.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9s0M%3D","line":3,"updated":"2014-04-02 17:58:51.000000000","message":"2014","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"},{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"9219873e0d89799ae9083d9e455f89e55b8cf685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Mirantis, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2F%2Fgo%3D","line":3,"updated":"2014-04-09 00:28:28.000000000","message":"year","commit_id":"f85d857287a73a00062b789a165a0b766b7b72ff"}],"nailgun/nailgun/orchestrator/deployment_serializers.py":[{"author":{"_account_id":8392,"name":"Aleksey Kasatkin","email":"akasatkin@mirantis.com","username":"aleksey"},"change_message_id":"0052d2b75dc83194151ed1d89f41f55a5735a6bd","unresolved":false,"context_lines":[{"line_number":395,"context_line":"            return NeutronNetworkDeploymentSerializer"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    @classmethod"},{"line_number":398,"context_line":"    def network_ranges(cls, cluster):"},{"line_number":399,"context_line":"        \"\"\"Returns ranges for network groups"},{"line_number":400,"context_line":"        except range for public network"},{"line_number":401,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2Ff8Y%3D","line":398,"updated":"2014-04-14 07:49:20.000000000","message":"Do we need this? Aren\u0027t ranges updated with node_network_ranges always?","commit_id":"3edbeede4fdb05a2954db863038d337a7c8abda2"},{"author":{"_account_id":8787,"name":"Dmitry Borodaenko","email":"angdraug@gmail.com","username":"angdraug"},"change_message_id":"4c09d1ee7ab5893fef8c8f381f5786bdb5d13844","unresolved":false,"context_lines":[{"line_number":410,"context_line":"            elif net.meta.get(\"render_type\") \u003d\u003d \u0027cidr\u0027 and net.cidr:"},{"line_number":411,"context_line":"                attrs[net_name] \u003d net.cidr"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        return attrs"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @classmethod"},{"line_number":416,"context_line":"    def node_network_ranges(cls, node):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FYlE%3D","line":413,"updated":"2014-04-15 00:44:13.000000000","message":"Should we get rid of network_ranges() altogether? Would help avoid code duplication...","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":820,"context_line":"def serialize(cluster, nodes):"},{"line_number":821,"context_line":"    \"\"\"Serialization depends on deployment mode"},{"line_number":822,"context_line":"    \"\"\""},{"line_number":823,"context_line":"    TaskHelper.prepare_for_provisioning(cluster.nodes)"},{"line_number":824,"context_line":"    TaskHelper.prepare_for_deployment(cluster.nodes)"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"    if cluster.mode \u003d\u003d \u0027multinode\u0027:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2Fmg%3D","line":823,"updated":"2014-04-16 01:29:45.000000000","message":"Why do you need this?","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":820,"context_line":"def serialize(cluster, nodes):"},{"line_number":821,"context_line":"    \"\"\"Serialization depends on deployment mode"},{"line_number":822,"context_line":"    \"\"\""},{"line_number":823,"context_line":"    TaskHelper.prepare_for_provisioning(cluster.nodes)"},{"line_number":824,"context_line":"    TaskHelper.prepare_for_deployment(cluster.nodes)"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"    if cluster.mode \u003d\u003d \u0027multinode\u0027:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7M8%3D","line":823,"in_reply_to":"AAAAXH%2F%2F%2Fmg%3D","updated":"2014-04-16 13:49:32.000000000","message":"Because I needed the admin IPs assigned before serialization. It\u0027s possible this is no longer needed. I\u0027ll have to look into it more.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/task/task.py":[{"author":{"_account_id":8954,"name":"Lukasz Oles","email":"loles@mirantis.com","username":"loles"},"change_message_id":"c00920e72dbb074489d4c54d6f71d2ae372cf6bf","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                vlans \u003d []"},{"line_number":367,"context_line":"                for ng in assigned_networks:"},{"line_number":368,"context_line":"                    # Handle FuelWeb admin network first."},{"line_number":369,"context_line":"                    if ng.group_id is None:"},{"line_number":370,"context_line":"                        vlans.append(0)"},{"line_number":371,"context_line":"                        continue"},{"line_number":372,"context_line":"                    data_ng \u003d filter(lambda i: i[\u0027name\u0027] \u003d\u003d ng.name, data)[0]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F%2FlE%3D","line":369,"updated":"2014-04-16 01:29:45.000000000","message":"so fuelweb admin shouldn\u0027t have assigned GroupNode?","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"de005445e74dd45fc7ccd108840ebc4c7cdcfe36","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                vlans \u003d []"},{"line_number":367,"context_line":"                for ng in assigned_networks:"},{"line_number":368,"context_line":"                    # Handle FuelWeb admin network first."},{"line_number":369,"context_line":"                    if ng.group_id is None:"},{"line_number":370,"context_line":"                        vlans.append(0)"},{"line_number":371,"context_line":"                        continue"},{"line_number":372,"context_line":"                    data_ng \u003d filter(lambda i: i[\u0027name\u0027] \u003d\u003d ng.name, data)[0]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2F7Nk%3D","line":369,"in_reply_to":"AAAAXH%2F%2F%2FlE%3D","updated":"2014-04-16 13:49:32.000000000","message":"It can if you create a new admin network attached to a node group. The default one Fuel creates has a group_id of None. All other cluster networks that Fuel generates will have the cluster\u0027s group ID.","commit_id":"9530ef323b6b5fdb4dc9ff3516054b19b94c8e60"}],"nailgun/nailgun/test/integration/test_provisioning.py":[{"author":{"_account_id":8797,"name":"Andrew Woodward","email":"xarses@gmail.com","username":"xarses"},"change_message_id":"af374abac7310120a8f5bb88d4ab045411271e09","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        cluster \u003d self.env.clusters[0]"},{"line_number":69,"context_line":"        objects.Cluster.clear_pending_changes(cluster)"},{"line_number":70,"context_line":"        nodes_ids \u003d map(lambda n: n.id, self.env.nodes)"},{"line_number":71,"context_line":"        self.env.network_manager.assign_ips(nodes_ids, \u0027fuelweb_admin\u0027)"},{"line_number":72,"context_line":"        self.env.network_manager.assign_ips(nodes_ids, \u0027management\u0027)"},{"line_number":73,"context_line":"        self.env.network_manager.assign_ips(nodes_ids, \u0027storage\u0027)"},{"line_number":74,"context_line":"        self.env.network_manager.assign_ips(nodes_ids, \u0027public\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9sww%3D","line":71,"updated":"2014-04-02 17:58:51.000000000","message":"shouldn\u0027t we be using some form of assign_admin_ips?","commit_id":"f6ff954759366abfcd6eddf338a83d6dbd9a5291"}]}
