)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"840cded99bf76ffeb2e81c75f77b79f3b621a70e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Philipp Marek \u003cphilipp.marek@linbit.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-08 14:54:52 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Infrastructure to use the DRBD transport for NOVA."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Our DRBD block storage driver for Cinder can be used to make"},{"line_number":10,"context_line":"Nova directly connect to the DRBD 9 storage servers, instead"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da6ed579_dfdd23e1","line":7,"range":{"start_line":7,"start_character":49,"end_line":7,"end_character":50},"updated":"2016-01-13 22:02:11.000000000","message":"Please remove the \u0027.\u0027 from the end of the summary line. \n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"d7925e013144c4036414512d7f38ba29ba5b1238","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Philipp Marek \u003cphilipp.marek@linbit.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-08 14:54:52 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Infrastructure to use the DRBD transport for NOVA."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Our DRBD block storage driver for Cinder can be used to make"},{"line_number":10,"context_line":"Nova directly connect to the DRBD 9 storage servers, instead"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da6ed579_181f356d","line":7,"range":{"start_line":7,"start_character":49,"end_line":7,"end_character":50},"in_reply_to":"da6ed579_dfdd23e1","updated":"2016-01-14 11:40:12.000000000","message":"Done","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"43ee09628cc2f52fadc80e6179208d366d3b9488","unresolved":false,"context_lines":[{"line_number":15,"context_line":"for more details."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ie26f10302cd8ce3fd06bc52dd4f431ead5a03c24"},{"line_number":18,"context_line":"Blueprint: https://blueprints.launchpad.net/cinder/+spec/drbd-transport"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da6ed579_3c0c8d3a","line":18,"updated":"2016-01-13 21:26:56.000000000","message":"I believe this needs to be:\n\nImplements: blueprint drdb-transport\n\nfor it to properly link to the blueprint.","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"d7925e013144c4036414512d7f38ba29ba5b1238","unresolved":false,"context_lines":[{"line_number":15,"context_line":"for more details."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ie26f10302cd8ce3fd06bc52dd4f431ead5a03c24"},{"line_number":18,"context_line":"Blueprint: https://blueprints.launchpad.net/cinder/+spec/drbd-transport"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da6ed579_b80f0938","line":18,"in_reply_to":"da6ed579_3c0c8d3a","updated":"2016-01-14 11:40:12.000000000","message":"Done","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"}],"cinder/tests/unit/test_drbdmanagedrv.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e1c3934d9bb9c108cd4e74748ba62dbee9c8083c","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @staticmethod"},{"line_number":80,"context_line":"    def _aux_prop_name(key):"},{"line_number":81,"context_line":"        if str(key).startswith(mock_dm_consts.AUX_PROP_PREFIX):"},{"line_number":82,"context_line":"            return key[len(mock_dm_consts.AUX_PROP_PREFIX):]"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_e9e698af","line":81,"updated":"2016-01-07 21:20:35.000000000","message":"s/str()/six.text_type()","commit_id":"270e563be643a7720c50873cb2407f9b41ed9ffe"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"ba7f7f50b3d9d6e3936d1ad17401ef5257ea82b7","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @staticmethod"},{"line_number":80,"context_line":"    def _aux_prop_name(key):"},{"line_number":81,"context_line":"        if str(key).startswith(mock_dm_consts.AUX_PROP_PREFIX):"},{"line_number":82,"context_line":"            return key[len(mock_dm_consts.AUX_PROP_PREFIX):]"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_ce34b7fc","line":81,"in_reply_to":"fa69d971_e9e698af","updated":"2016-01-08 13:55:13.000000000","message":"Done","commit_id":"270e563be643a7720c50873cb2407f9b41ed9ffe"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"43ee09628cc2f52fadc80e6179208d366d3b9488","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    else:"},{"line_number":109,"context_line":"        # Python 3: AttributeError: \u0027mappingproxy\u0027 object"},{"line_number":110,"context_line":"        #           has no attribute \u0027iterkeys\u0027"},{"line_number":111,"context_line":"        return [n for n in c.__dict__.keys() if not n.startswith(\"_\")]"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"sys.modules[\u0027dbus\u0027] \u003d mock_dbus"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_dcc69199","line":111,"updated":"2016-01-13 21:26:56.000000000","message":"keys() is available in both py2 and py3. c.__dict__ should never have enough keys for the performance difference between iterkeys() and keys() to make a difference. I think things could be simplified to just always call .keys().","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"d7925e013144c4036414512d7f38ba29ba5b1238","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    else:"},{"line_number":109,"context_line":"        # Python 3: AttributeError: \u0027mappingproxy\u0027 object"},{"line_number":110,"context_line":"        #           has no attribute \u0027iterkeys\u0027"},{"line_number":111,"context_line":"        return [n for n in c.__dict__.keys() if not n.startswith(\"_\")]"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"sys.modules[\u0027dbus\u0027] \u003d mock_dbus"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_3bb7933b","line":111,"in_reply_to":"da6ed579_dcc69199","updated":"2016-01-14 11:40:12.000000000","message":"Thanks, one less version check ;)","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"}],"cinder/volume/drivers/drbdmanagedrv.py":[{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"80440435fa77689d4c7a38c2f16efeb58919798c","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def _wait_for_node_assignment(self, res_name, vol_nr, nodenames,"},{"line_number":208,"context_line":"                                  filter_props\u003dNone, timeout\u003d90,"},{"line_number":209,"context_line":"                                  check_vol_deployed\u003dTrue):"},{"line_number":210,"context_line":"        \"Returns True as soon as one assignment matches the filter.\""},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        if not filter_props:"},{"line_number":213,"context_line":"            filter_props \u003d self.empty_dict"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_c83cd995","line":210,"range":{"start_line":210,"start_character":9,"end_line":210,"end_character":16},"updated":"2015-12-31 09:22:51.000000000","message":"Return","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"650cc22766c08209056601d61950cebc5e22f46c","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def _wait_for_node_assignment(self, res_name, vol_nr, nodenames,"},{"line_number":208,"context_line":"                                  filter_props\u003dNone, timeout\u003d90,"},{"line_number":209,"context_line":"                                  check_vol_deployed\u003dTrue):"},{"line_number":210,"context_line":"        \"Returns True as soon as one assignment matches the filter.\""},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        if not filter_props:"},{"line_number":213,"context_line":"            filter_props \u003d self.empty_dict"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_a982c750","line":210,"range":{"start_line":210,"start_character":9,"end_line":210,"end_character":16},"in_reply_to":"fa69d971_c83cd995","updated":"2015-12-31 10:34:39.000000000","message":"Done","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"80440435fa77689d4c7a38c2f16efeb58919798c","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        }"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"    def _is_external_node(self, nodename):"},{"line_number":706,"context_line":"        # If the node accessing the data (the \"initiator\" in iSCSI speak,"},{"line_number":707,"context_line":"        # \"client\" or \"target\" otherwise) is marked as an FLAG_EXTERNAL"},{"line_number":708,"context_line":"        # node, it does not have DRBDmanage active - and that means"},{"line_number":709,"context_line":"        # we have to send the necessary DRBD configuration."},{"line_number":710,"context_line":"        #"},{"line_number":711,"context_line":"        # If DRBDmanage is running there, just pushing the (client)"},{"line_number":712,"context_line":"        # assignment is enough to make the local path available."},{"line_number":713,"context_line":""},{"line_number":714,"context_line":"        res, nodes \u003d self.call_or_reconnect(self.odm.list_nodes,"},{"line_number":715,"context_line":"                                            [nodename], 0,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_2826d5ce","line":712,"range":{"start_line":706,"start_character":8,"end_line":712,"end_character":64},"updated":"2015-12-31 09:22:51.000000000","message":"Multiline comments use triple-quotes.\n\"\"\"If the node accessing the data (the \"initiator\" in iSCSI speak,\n\"client\" or \"target\" otherwise) is marked as an FLAG_EXTERNAL\nnode, it does not have DRBDmanage active - and that means\nwe have to send the necessary DRBD configuration.\n\nIf DRBDmanage is running there, just pushing the (client)\nassignment is enough to make the local path available.\n\"\"\"","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"650cc22766c08209056601d61950cebc5e22f46c","unresolved":false,"context_lines":[{"line_number":703,"context_line":"        }"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"    def _is_external_node(self, nodename):"},{"line_number":706,"context_line":"        # If the node accessing the data (the \"initiator\" in iSCSI speak,"},{"line_number":707,"context_line":"        # \"client\" or \"target\" otherwise) is marked as an FLAG_EXTERNAL"},{"line_number":708,"context_line":"        # node, it does not have DRBDmanage active - and that means"},{"line_number":709,"context_line":"        # we have to send the necessary DRBD configuration."},{"line_number":710,"context_line":"        #"},{"line_number":711,"context_line":"        # If DRBDmanage is running there, just pushing the (client)"},{"line_number":712,"context_line":"        # assignment is enough to make the local path available."},{"line_number":713,"context_line":""},{"line_number":714,"context_line":"        res, nodes \u003d self.call_or_reconnect(self.odm.list_nodes,"},{"line_number":715,"context_line":"                                            [nodename], 0,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_8981034d","line":712,"range":{"start_line":706,"start_character":8,"end_line":712,"end_character":64},"in_reply_to":"fa69d971_2826d5ce","updated":"2015-12-31 10:34:39.000000000","message":"That\u0027s not a documentation for users of that function,\nbut reasoning about what it\u0027s doing.\n\nSo I kept that, but added an \"external\" docstring.","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"80440435fa77689d4c7a38c2f16efeb58919798c","unresolved":false,"context_lines":[{"line_number":738,"context_line":""},{"line_number":739,"context_line":"        nodename \u003d connector[\"host\"]"},{"line_number":740,"context_line":""},{"line_number":741,"context_line":"        # Ensure the node is known to DRBDmanage."},{"line_number":742,"context_line":"        # Note that this does *not* mean that DRBDmanage has to"},{"line_number":743,"context_line":"        # be installed on it!"},{"line_number":744,"context_line":"        # This is just so that DRBD allows the IP to connect."},{"line_number":745,"context_line":"        node_prop \u003d {"},{"line_number":746,"context_line":"            dm_const.NODE_ADDR: connector[\"ip\"],"},{"line_number":747,"context_line":"            dm_const.FLAG_DRBDCTRL: dm_const.BOOL_FALSE,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_082d11a7","line":744,"range":{"start_line":741,"start_character":8,"end_line":744,"end_character":61},"updated":"2015-12-31 09:22:51.000000000","message":"ditto","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"650cc22766c08209056601d61950cebc5e22f46c","unresolved":false,"context_lines":[{"line_number":738,"context_line":""},{"line_number":739,"context_line":"        nodename \u003d connector[\"host\"]"},{"line_number":740,"context_line":""},{"line_number":741,"context_line":"        # Ensure the node is known to DRBDmanage."},{"line_number":742,"context_line":"        # Note that this does *not* mean that DRBDmanage has to"},{"line_number":743,"context_line":"        # be installed on it!"},{"line_number":744,"context_line":"        # This is just so that DRBD allows the IP to connect."},{"line_number":745,"context_line":"        node_prop \u003d {"},{"line_number":746,"context_line":"            dm_const.NODE_ADDR: connector[\"ip\"],"},{"line_number":747,"context_line":"            dm_const.FLAG_DRBDCTRL: dm_const.BOOL_FALSE,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_09bc3304","line":744,"range":{"start_line":741,"start_character":8,"end_line":744,"end_character":61},"in_reply_to":"fa69d971_082d11a7","updated":"2015-12-31 10:34:39.000000000","message":"Done","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"80440435fa77689d4c7a38c2f16efeb58919798c","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            self.odm.assign, nodename, dres, assg_prop)"},{"line_number":767,"context_line":"        self._check_result(res, ignore\u003d[dm_exc.DM_EEXIST])"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"        # Wait for DRBDmanage to have completed that action."},{"line_number":770,"context_line":"        #"},{"line_number":771,"context_line":"        # A DRBDmanage controlled node will set the cstate:deploy flag;"},{"line_number":772,"context_line":"        # an external node will not be available to change it, so we have"},{"line_number":773,"context_line":"        # to wait for the storage nodes to remove the upd_con flag"},{"line_number":774,"context_line":"        # (ie. they\u0027re now ready to receive the connection)."},{"line_number":775,"context_line":"        if self._is_external_node(nodename):"},{"line_number":776,"context_line":"            self._wait_for_node_assignment("},{"line_number":777,"context_line":"                dres, dvol, [],"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_c81db974","line":774,"range":{"start_line":769,"start_character":8,"end_line":774,"end_character":60},"updated":"2015-12-31 09:22:51.000000000","message":"ditto","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"650cc22766c08209056601d61950cebc5e22f46c","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            self.odm.assign, nodename, dres, assg_prop)"},{"line_number":767,"context_line":"        self._check_result(res, ignore\u003d[dm_exc.DM_EEXIST])"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"        # Wait for DRBDmanage to have completed that action."},{"line_number":770,"context_line":"        #"},{"line_number":771,"context_line":"        # A DRBDmanage controlled node will set the cstate:deploy flag;"},{"line_number":772,"context_line":"        # an external node will not be available to change it, so we have"},{"line_number":773,"context_line":"        # to wait for the storage nodes to remove the upd_con flag"},{"line_number":774,"context_line":"        # (ie. they\u0027re now ready to receive the connection)."},{"line_number":775,"context_line":"        if self._is_external_node(nodename):"},{"line_number":776,"context_line":"            self._wait_for_node_assignment("},{"line_number":777,"context_line":"                dres, dvol, [],"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_4949cb30","line":774,"range":{"start_line":769,"start_character":8,"end_line":774,"end_character":60},"in_reply_to":"fa69d971_c81db974","updated":"2015-12-31 10:34:39.000000000","message":"Done","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"80440435fa77689d4c7a38c2f16efeb58919798c","unresolved":false,"context_lines":[{"line_number":840,"context_line":"            # If diskless assigned,"},{"line_number":841,"context_line":"            if ((diskless \u003d\u003d dm_const.BOOL_TRUE) and"},{"line_number":842,"context_line":"                    (temp_cli \u003d\u003d dm_const.BOOL_TRUE)):"},{"line_number":843,"context_line":"                # remove the assignment"},{"line_number":844,"context_line":"                # TODO(pm): does it make sense to relay \"force\" here?"},{"line_number":845,"context_line":"                # What are the semantics?"},{"line_number":846,"context_line":"                # TODO(pm): consistency groups shouldn\u0027t really"},{"line_number":847,"context_line":"                # remove until *all* volumes are detached"},{"line_number":848,"context_line":"                res \u003d self.call_or_reconnect(self.odm.unassign,"},{"line_number":849,"context_line":"                                             nodename, dres, force)"},{"line_number":850,"context_line":"                self._check_result(res, ignore\u003d[dm_exc.DM_ENOENT])"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_68128d64","line":847,"range":{"start_line":843,"start_character":15,"end_line":847,"end_character":57},"updated":"2015-12-31 09:22:51.000000000","message":"ditto","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"650cc22766c08209056601d61950cebc5e22f46c","unresolved":false,"context_lines":[{"line_number":840,"context_line":"            # If diskless assigned,"},{"line_number":841,"context_line":"            if ((diskless \u003d\u003d dm_const.BOOL_TRUE) and"},{"line_number":842,"context_line":"                    (temp_cli \u003d\u003d dm_const.BOOL_TRUE)):"},{"line_number":843,"context_line":"                # remove the assignment"},{"line_number":844,"context_line":"                # TODO(pm): does it make sense to relay \"force\" here?"},{"line_number":845,"context_line":"                # What are the semantics?"},{"line_number":846,"context_line":"                # TODO(pm): consistency groups shouldn\u0027t really"},{"line_number":847,"context_line":"                # remove until *all* volumes are detached"},{"line_number":848,"context_line":"                res \u003d self.call_or_reconnect(self.odm.unassign,"},{"line_number":849,"context_line":"                                             nodename, dres, force)"},{"line_number":850,"context_line":"                self._check_result(res, ignore\u003d[dm_exc.DM_ENOENT])"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_c9637bb0","line":847,"range":{"start_line":843,"start_character":15,"end_line":847,"end_character":57},"in_reply_to":"fa69d971_68128d64","updated":"2015-12-31 10:34:39.000000000","message":"These are 3 separate comments about this code block.\nI made them more readable.","commit_id":"999c3dea0ee9d8a6402453b96c78685b3638389f"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.backend_name \u003d self.configuration.safe_get("},{"line_number":115,"context_line":"            \u0027volume_backend_name\u0027) or \u0027drbdmanage\u0027"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        global CS_DEPLOYED, CS_DISKLESS, CS_UPD_CON"},{"line_number":118,"context_line":"        CS_DEPLOYED \u003d dm_const.CSTATE_PREFIX + dm_const.FLAG_DEPLOY"},{"line_number":119,"context_line":"        CS_DISKLESS \u003d dm_const.CSTATE_PREFIX + dm_const.FLAG_DISKLESS"},{"line_number":120,"context_line":"        CS_UPD_CON \u003d dm_const.CSTATE_PREFIX + dm_const.FLAG_UPD_CON"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_52ca281c","line":117,"updated":"2016-01-06 23:15:37.000000000","message":"Line 117 is not needed.  You already defined them as constants on lines 83-85.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.backend_name \u003d self.configuration.safe_get("},{"line_number":115,"context_line":"            \u0027volume_backend_name\u0027) or \u0027drbdmanage\u0027"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        global CS_DEPLOYED, CS_DISKLESS, CS_UPD_CON"},{"line_number":118,"context_line":"        CS_DEPLOYED \u003d dm_const.CSTATE_PREFIX + dm_const.FLAG_DEPLOY"},{"line_number":119,"context_line":"        CS_DISKLESS \u003d dm_const.CSTATE_PREFIX + dm_const.FLAG_DISKLESS"},{"line_number":120,"context_line":"        CS_UPD_CON \u003d dm_const.CSTATE_PREFIX + dm_const.FLAG_UPD_CON"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_cc366650","line":117,"in_reply_to":"fa69d971_52ca281c","updated":"2016-01-07 08:02:22.000000000","message":"Done","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def _wait_for_node_assignment(self, res_name, vol_nr, nodenames,"},{"line_number":207,"context_line":"                                  filter_props\u003dNone, timeout\u003d90,"},{"line_number":208,"context_line":"                                  check_vol_deployed\u003dTrue):"},{"line_number":209,"context_line":"        \"Return True as soon as one assignment matches the filter.\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        if not filter_props:"},{"line_number":212,"context_line":"            filter_props \u003d self.empty_dict"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_32a1b446","line":209,"updated":"2016-01-06 23:15:37.000000000","message":"Please use \"\"\" instead of \".","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def _wait_for_node_assignment(self, res_name, vol_nr, nodenames,"},{"line_number":207,"context_line":"                                  filter_props\u003dNone, timeout\u003d90,"},{"line_number":208,"context_line":"                                  check_vol_deployed\u003dTrue):"},{"line_number":209,"context_line":"        \"Return True as soon as one assignment matches the filter.\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        if not filter_props:"},{"line_number":212,"context_line":"            filter_props \u003d self.empty_dict"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6c42daaf","line":209,"in_reply_to":"fa69d971_32a1b446","updated":"2016-01-07 08:02:22.000000000","message":"Done","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                        {\u0027try\u0027: retry, \u0027host\u0027: nodenames,"},{"line_number":241,"context_line":"                         \u0027res\u0027: res_name, \u0027vol\u0027: vol_nr})"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            time.sleep(min(0.5 + retry / 5, 2))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        # Timeout"},{"line_number":246,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_8d1f21b6","line":243,"updated":"2016-01-06 23:15:37.000000000","message":"Recommend to use eventlet.sleep instead.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                        {\u0027try\u0027: retry, \u0027host\u0027: nodenames,"},{"line_number":241,"context_line":"                         \u0027res\u0027: res_name, \u0027vol\u0027: vol_nr})"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            time.sleep(min(0.5 + retry / 5, 2))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        # Timeout"},{"line_number":246,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6c297ae5","line":243,"in_reply_to":"fa69d971_8d1f21b6","updated":"2016-01-07 08:02:22.000000000","message":"Don\u0027t know about implications, but done.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            volume_path \u003d self.local_path(volume)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"        return {"},{"line_number":665,"context_line":"            \u0027driver_volume_type\u0027: \u0027local\u0027,"},{"line_number":666,"context_line":"            \u0027data\u0027: {"},{"line_number":667,"context_line":"                \"device_path\": volume_path"},{"line_number":668,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6d9bcd18","line":665,"updated":"2016-01-06 23:15:37.000000000","message":"Is this right?  \u0027local\u0027 is for the block device driver.  \u0027drbd\u0027 is for your driver.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            volume_path \u003d self.local_path(volume)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"        return {"},{"line_number":665,"context_line":"            \u0027driver_volume_type\u0027: \u0027local\u0027,"},{"line_number":666,"context_line":"            \u0027data\u0027: {"},{"line_number":667,"context_line":"                \"device_path\": volume_path"},{"line_number":668,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_0c66be50","line":665,"in_reply_to":"fa69d971_6d9bcd18","updated":"2016-01-07 08:02:22.000000000","message":"Yes.\nIf this DRBD resource is active on that node already (good planning, pure chance, small number of nodes) resp. a DRBD client got assigned there, the kernel will provide a \"/dev/drbdX\" device node that Nova can access.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":679,"context_line":"            [\u0027export_conf_split_up\u0027, nodename, dres])"},{"line_number":680,"context_line":"        self._check_result(res)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        config \u003d str(data.pop(0))"},{"line_number":683,"context_line":"        subst_data \u003d {}"},{"line_number":684,"context_line":"        while len(data):"},{"line_number":685,"context_line":"            k \u003d data.pop(0)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_de6cded1","line":682,"updated":"2016-01-06 23:15:37.000000000","message":"s/str/six.text_type","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":679,"context_line":"            [\u0027export_conf_split_up\u0027, nodename, dres])"},{"line_number":680,"context_line":"        self._check_result(res)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        config \u003d str(data.pop(0))"},{"line_number":683,"context_line":"        subst_data \u003d {}"},{"line_number":684,"context_line":"        while len(data):"},{"line_number":685,"context_line":"            k \u003d data.pop(0)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6c573a58","line":682,"in_reply_to":"fa69d971_de6cded1","updated":"2016-01-07 08:02:22.000000000","message":"Done.\n\nFunny that my autocompletion tells me that\n    text_type \u003d str","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":704,"context_line":"    def _is_external_node(self, nodename):"},{"line_number":705,"context_line":"        \"\"\"Return whether the given node is an \"external\" node.\"\"\""},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"        # If the node accessing the data (the \"initiator\" in iSCSI speak,"},{"line_number":708,"context_line":"        # \"client\" or \"target\" otherwise) is marked as an FLAG_EXTERNAL"},{"line_number":709,"context_line":"        # node, it does not have DRBDmanage active - and that means"},{"line_number":710,"context_line":"        # we have to send the necessary DRBD configuration."}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_9eb2e64a","line":707,"updated":"2016-01-06 23:15:37.000000000","message":"This driver doesn\u0027t use iSCSI.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":704,"context_line":"    def _is_external_node(self, nodename):"},{"line_number":705,"context_line":"        \"\"\"Return whether the given node is an \"external\" node.\"\"\""},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"        # If the node accessing the data (the \"initiator\" in iSCSI speak,"},{"line_number":708,"context_line":"        # \"client\" or \"target\" otherwise) is marked as an FLAG_EXTERNAL"},{"line_number":709,"context_line":"        # node, it does not have DRBDmanage active - and that means"},{"line_number":710,"context_line":"        # we have to send the necessary DRBD configuration."}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_accf7227","line":707,"in_reply_to":"fa69d971_9eb2e64a","updated":"2016-01-07 08:02:22.000000000","message":"Right.\nThat\u0027s just to clarify the intent; by providing similar concepts I hope to get my point across easier.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        self._check_result(res)"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        if len(nodes) !\u003d 1:"},{"line_number":722,"context_line":"            msg \u003d _LE(\u0027Expected exactly one node called \"%s\"\u0027) % nodename"},{"line_number":723,"context_line":"            LOG.error(msg)"},{"line_number":724,"context_line":"            raise exception.VolumeDriverException(message\u003dmsg)"},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_be948a8a","line":722,"updated":"2016-01-06 23:15:37.000000000","message":"It should be _ instead of _LE here because the msg is used in an exception.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        self._check_result(res)"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        if len(nodes) !\u003d 1:"},{"line_number":722,"context_line":"            msg \u003d _LE(\u0027Expected exactly one node called \"%s\"\u0027) % nodename"},{"line_number":723,"context_line":"            LOG.error(msg)"},{"line_number":724,"context_line":"            raise exception.VolumeDriverException(message\u003dmsg)"},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_cce98680","line":722,"in_reply_to":"fa69d971_be948a8a","updated":"2016-01-07 08:02:22.000000000","message":"But also in \"LOG.error\" below!?\nI don\u0027t mind, I\u0027ll just do what you wish for - \"_\" it is.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        \"\"\"Ensure the node is known to DRBDmanage."},{"line_number":743,"context_line":"        Note that this does *not* mean that DRBDmanage has to"},{"line_number":744,"context_line":"        be installed on it!"},{"line_number":745,"context_line":"        This is just so that DRBD allows the IP to connect.\"\"\""},{"line_number":746,"context_line":"        node_prop \u003d {"},{"line_number":747,"context_line":"            dm_const.NODE_ADDR: connector[\"ip\"],"},{"line_number":748,"context_line":"            dm_const.FLAG_DRBDCTRL: dm_const.BOOL_FALSE,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_3ec09a4f","line":745,"updated":"2016-01-06 23:15:37.000000000","message":"This should be comments instead of docstring.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        \"\"\"Ensure the node is known to DRBDmanage."},{"line_number":743,"context_line":"        Note that this does *not* mean that DRBDmanage has to"},{"line_number":744,"context_line":"        be installed on it!"},{"line_number":745,"context_line":"        This is just so that DRBD allows the IP to connect.\"\"\""},{"line_number":746,"context_line":"        node_prop \u003d {"},{"line_number":747,"context_line":"            dm_const.NODE_ADDR: connector[\"ip\"],"},{"line_number":748,"context_line":"            dm_const.FLAG_DRBDCTRL: dm_const.BOOL_FALSE,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_6cb3ba98","line":745,"in_reply_to":"fa69d971_3ec09a4f","updated":"2016-01-07 08:02:22.000000000","message":"In the previous review chen.xing told me the exact opposite - to use \"\"\" instead of #:\n    https://review.openstack.org/#/c/259973/4/cinder/volume/drivers/drbdmanagedrv.py@712\n\nWhich should it be, now? I\u0027m confused.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fbdf11591036f69abc7f22c458b26f5b6ec79792","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        \"\"\"Ensure the node is known to DRBDmanage."},{"line_number":743,"context_line":"        Note that this does *not* mean that DRBDmanage has to"},{"line_number":744,"context_line":"        be installed on it!"},{"line_number":745,"context_line":"        This is just so that DRBD allows the IP to connect.\"\"\""},{"line_number":746,"context_line":"        node_prop \u003d {"},{"line_number":747,"context_line":"            dm_const.NODE_ADDR: connector[\"ip\"],"},{"line_number":748,"context_line":"            dm_const.FLAG_DRBDCTRL: dm_const.BOOL_FALSE,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_ae53c66b","line":745,"in_reply_to":"fa69d971_6cb3ba98","updated":"2016-01-07 20:54:40.000000000","message":"chen.xing\u0027s comments were for multiple lines right under the function name.  Usually you see docstring right under the function name (either single line or multi-line).  In the middle of the function, it is usually comments starting with #.\n\nAnyway, I think your new code looks good.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7b0b4eccd62f9c6dd187201edb298c09fcdcccc","unresolved":false,"context_lines":[{"line_number":772,"context_line":"        A DRBDmanage controlled node will set the cstate:deploy flag;"},{"line_number":773,"context_line":"        an external node will not be available to change it, so we have"},{"line_number":774,"context_line":"        to wait for the storage nodes to remove the upd_con flag"},{"line_number":775,"context_line":"        (ie. they\u0027re now ready to receive the connection).\"\"\""},{"line_number":776,"context_line":"        if self._is_external_node(nodename):"},{"line_number":777,"context_line":"            self._wait_for_node_assignment("},{"line_number":778,"context_line":"                dres, dvol, [],"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_7e14d2e7","line":775,"updated":"2016-01-06 23:15:37.000000000","message":"The docstring should be changed to comments using # instead.","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"83cb6cf79585b45624c4dbca30f3f3b43c1a6e6a","unresolved":false,"context_lines":[{"line_number":772,"context_line":"        A DRBDmanage controlled node will set the cstate:deploy flag;"},{"line_number":773,"context_line":"        an external node will not be available to change it, so we have"},{"line_number":774,"context_line":"        to wait for the storage nodes to remove the upd_con flag"},{"line_number":775,"context_line":"        (ie. they\u0027re now ready to receive the connection).\"\"\""},{"line_number":776,"context_line":"        if self._is_external_node(nodename):"},{"line_number":777,"context_line":"            self._wait_for_node_assignment("},{"line_number":778,"context_line":"                dres, dvol, [],"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_2c80628a","line":775,"in_reply_to":"fa69d971_7e14d2e7","updated":"2016-01-07 08:02:22.000000000","message":"see above, resp. chen.xing\u0027s review ;[","commit_id":"1d61c55a1dfa493cbedc47fde4e50146360050c8"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e1c3934d9bb9c108cd4e74748ba62dbee9c8083c","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        # Still, there might or might not be the volume in the resource -"},{"line_number":383,"context_line":"        # we have to check that explicitly."},{"line_number":384,"context_line":"        (__, drbd_vol) \u003d self._resource_name_volnr_for_volume(volume,"},{"line_number":385,"context_line":"                                                             empty_ok\u003dTrue)"},{"line_number":386,"context_line":"        if not drbd_vol:"},{"line_number":387,"context_line":"            props \u003d self._priv_hash_from_volume(volume)"},{"line_number":388,"context_line":"            # TODO(PM): properties - redundancy, etc"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_a4ae85e5","line":385,"updated":"2016-01-07 21:20:35.000000000","message":"Need to add one more space before \"empty_ok\" to make the indentation right.","commit_id":"270e563be643a7720c50873cb2407f9b41ed9ffe"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"ba7f7f50b3d9d6e3936d1ad17401ef5257ea82b7","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        # Still, there might or might not be the volume in the resource -"},{"line_number":383,"context_line":"        # we have to check that explicitly."},{"line_number":384,"context_line":"        (__, drbd_vol) \u003d self._resource_name_volnr_for_volume(volume,"},{"line_number":385,"context_line":"                                                             empty_ok\u003dTrue)"},{"line_number":386,"context_line":"        if not drbd_vol:"},{"line_number":387,"context_line":"            props \u003d self._priv_hash_from_volume(volume)"},{"line_number":388,"context_line":"            # TODO(PM): properties - redundancy, etc"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_6eb6eb8b","line":385,"in_reply_to":"fa69d971_a4ae85e5","updated":"2016-01-08 13:55:13.000000000","message":"Done","commit_id":"270e563be643a7720c50873cb2407f9b41ed9ffe"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e1c3934d9bb9c108cd4e74748ba62dbee9c8083c","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                #           What are the semantics?"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"                # TODO(pm): consistency groups shouldn\u0027t really"},{"line_number":853,"context_line":"                #           remove until *all* volumes are detached"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"                res \u003d self.call_or_reconnect(self.odm.unassign,"},{"line_number":856,"context_line":"                                             nodename, dres, force)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_a953c06b","line":853,"updated":"2016-01-07 21:20:35.000000000","message":"There\u0027s no API to do a group attach or detach.  Volumes in a CG will be attached/detached individually.  So I don\u0027t quite understand your comments here.","commit_id":"270e563be643a7720c50873cb2407f9b41ed9ffe"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"ba7f7f50b3d9d6e3936d1ad17401ef5257ea82b7","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                #           What are the semantics?"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"                # TODO(pm): consistency groups shouldn\u0027t really"},{"line_number":853,"context_line":"                #           remove until *all* volumes are detached"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"                res \u003d self.call_or_reconnect(self.odm.unassign,"},{"line_number":856,"context_line":"                                             nodename, dres, force)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_ae4aa381","line":853,"in_reply_to":"fa69d971_a953c06b","updated":"2016-01-08 13:55:13.000000000","message":"Not yet, right.\nThat\u0027s just a reminder for the future.","commit_id":"270e563be643a7720c50873cb2407f9b41ed9ffe"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"43ee09628cc2f52fadc80e6179208d366d3b9488","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    import drbdmanage.consts as dm_const"},{"line_number":45,"context_line":"    import drbdmanage.exceptions as dm_exc"},{"line_number":46,"context_line":"    import drbdmanage.utils as dm_utils"},{"line_number":47,"context_line":"except ImportError as e:"},{"line_number":48,"context_line":"    # Used for the tests, when no DRBDmanage is installed"},{"line_number":49,"context_line":"    dbus \u003d None"},{"line_number":50,"context_line":"    dm_const \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_3c124d0a","line":47,"updated":"2016-01-13 21:26:56.000000000","message":"\"as e\" doesn\u0027t appear to be used anywhere, so it should probably stay as it was.","commit_id":"fb88e543fbf013f770f2c7047acfe2785ca4e9e2"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"e6e8c7fc6f6e7d2f06127f68eafcd7c72da755c0","unresolved":false,"context_lines":[{"line_number":400,"context_line":"        self._check_result(res)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        # TODO(pm): CG"},{"line_number":403,"context_line":"        self._wait_for_node_assignment(dres, 0, self.empty_list)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        if self.drbdmanage_devs_on_controller:"},{"line_number":406,"context_line":"            # TODO(pm): CG"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_500a198b","line":403,"updated":"2016-01-15 14:38:59.000000000","message":"res and dres are very similarly named, but entirely different variables. It might be good to rename dres to something more meaningful in the future.","commit_id":"5b9d169b4fe9ca98c5e973b11fe96381be9e9747"}]}
