)]}'
{"TESTING.rst":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Since full-stack tests often require the same resources and"},{"line_number":146,"context_line":"dependencies as the functional tests, using the configuration script"},{"line_number":147,"context_line":"tools/configure_for_func_testing.sh is advised (as described above)."},{"line_number":148,"context_line":"Also note that for testing purposes, running the dsvm-functional suite"},{"line_number":149,"context_line":"will also run all full-stack tests."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":41,"id":"fa963961_f73b229b","line":147,"updated":"2015-03-26 16:14:55.000000000","message":"\u0027for testing purposes\u0027 is really vague...","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Since full-stack tests often require the same resources and"},{"line_number":146,"context_line":"dependencies as the functional tests, using the configuration script"},{"line_number":147,"context_line":"tools/configure_for_func_testing.sh is advised (as described above)."},{"line_number":148,"context_line":"Also note that for testing purposes, running the dsvm-functional suite"},{"line_number":149,"context_line":"will also run all full-stack tests."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":41,"id":"fa963961_e2afdb7b","line":147,"in_reply_to":"fa963961_f73b229b","updated":"2015-03-26 16:55:37.000000000","message":"Done","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"e8e7a33e94bee4021ced31e38608c29e46b3f3c1","unresolved":false,"context_lines":[{"line_number":146,"context_line":"dependencies as the functional tests, using the configuration script"},{"line_number":147,"context_line":"tools/configure_for_func_testing.sh is advised (as described above)."},{"line_number":148,"context_line":"When running full-stack tests on a clean VM for the first time, we"},{"line_number":149,"context_line":"advise to run ./stack.sh successfully to make sure all Neutron\u0027s"},{"line_number":150,"context_line":"dependencies are met.  Also note that for in order to preserve"},{"line_number":151,"context_line":"resources on the gate, running the dsvm-functional suite will also run"},{"line_number":152,"context_line":"all full-stack tests (and a new worker won\u0027t be assigned specifically"}],"source_content_type":"text/x-rst","patch_set":42,"id":"fa963961_fddc2048","line":149,"updated":"2015-03-26 17:11:48.000000000","message":"\u0027for\u0027 can be removed","commit_id":"b64c50bce81a786dcd55c4835d9ff783e4d1adbb"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0a9a0ea23db5c6e4e49bd449e42ac5c623711ec1","unresolved":false,"context_lines":[{"line_number":146,"context_line":"dependencies as the functional tests, using the configuration script"},{"line_number":147,"context_line":"tools/configure_for_func_testing.sh is advised (as described above)."},{"line_number":148,"context_line":"When running full-stack tests on a clean VM for the first time, we"},{"line_number":149,"context_line":"advise to run ./stack.sh successfully to make sure all Neutron\u0027s"},{"line_number":150,"context_line":"dependencies are met.  Also note that for in order to preserve"},{"line_number":151,"context_line":"resources on the gate, running the dsvm-functional suite will also run"},{"line_number":152,"context_line":"all full-stack tests (and a new worker won\u0027t be assigned specifically"}],"source_content_type":"text/x-rst","patch_set":42,"id":"fa963961_bd02183d","line":149,"in_reply_to":"fa963961_fddc2048","updated":"2015-03-26 17:21:47.000000000","message":"Done","commit_id":"b64c50bce81a786dcd55c4835d9ff783e4d1adbb"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"e8e7a33e94bee4021ced31e38608c29e46b3f3c1","unresolved":false,"context_lines":[{"line_number":147,"context_line":"tools/configure_for_func_testing.sh is advised (as described above)."},{"line_number":148,"context_line":"When running full-stack tests on a clean VM for the first time, we"},{"line_number":149,"context_line":"advise to run ./stack.sh successfully to make sure all Neutron\u0027s"},{"line_number":150,"context_line":"dependencies are met.  Also note that for in order to preserve"},{"line_number":151,"context_line":"resources on the gate, running the dsvm-functional suite will also run"},{"line_number":152,"context_line":"all full-stack tests (and a new worker won\u0027t be assigned specifically"},{"line_number":153,"context_line":"for dsvm-fullstack)."}],"source_content_type":"text/x-rst","patch_set":42,"id":"fa963961_fd1f8059","line":150,"updated":"2015-03-26 17:11:48.000000000","message":"What\u0027s the long term plan here?","commit_id":"b64c50bce81a786dcd55c4835d9ff783e4d1adbb"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0a9a0ea23db5c6e4e49bd449e42ac5c623711ec1","unresolved":false,"context_lines":[{"line_number":147,"context_line":"tools/configure_for_func_testing.sh is advised (as described above)."},{"line_number":148,"context_line":"When running full-stack tests on a clean VM for the first time, we"},{"line_number":149,"context_line":"advise to run ./stack.sh successfully to make sure all Neutron\u0027s"},{"line_number":150,"context_line":"dependencies are met.  Also note that for in order to preserve"},{"line_number":151,"context_line":"resources on the gate, running the dsvm-functional suite will also run"},{"line_number":152,"context_line":"all full-stack tests (and a new worker won\u0027t be assigned specifically"},{"line_number":153,"context_line":"for dsvm-fullstack)."}],"source_content_type":"text/x-rst","patch_set":42,"id":"fa963961_1dc104e5","line":150,"in_reply_to":"fa963961_fd1f8059","updated":"2015-03-26 17:21:47.000000000","message":"Once there are enough tests in full-stack and it will be worth the bureaucracy, a new gate job will probably be added. Maru can correct me if I\u0027m wrong here.","commit_id":"b64c50bce81a786dcd55c4835d9ff783e4d1adbb"}],"neutron/agent/linux/async_process.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def pid(self):"},{"line_number":80,"context_line":"        if not self._process:"},{"line_number":81,"context_line":"            return None"},{"line_number":82,"context_line":"        return utils.get_root_helper_child_pid("},{"line_number":83,"context_line":"            self._process.pid, self.root_helper)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_92b87412","line":80,"updated":"2015-02-05 16:27:47.000000000","message":"(No action required) Simplify:\n\nif self._process:\n  return ...","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def pid(self):"},{"line_number":80,"context_line":"        if not self._process:"},{"line_number":81,"context_line":"            return None"},{"line_number":82,"context_line":"        return utils.get_root_helper_child_pid("},{"line_number":83,"context_line":"            self._process.pid, self.root_helper)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_21ef8bea","line":80,"in_reply_to":"da86d52c_7854bfc9","updated":"2015-02-25 14:48:02.000000000","message":"Done","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @property"},{"line_number":79,"context_line":"    def pid(self):"},{"line_number":80,"context_line":"        if not self._process:"},{"line_number":81,"context_line":"            return None"},{"line_number":82,"context_line":"        return utils.get_root_helper_child_pid("},{"line_number":83,"context_line":"            self._process.pid, self.root_helper)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_7854bfc9","line":80,"in_reply_to":"da86d52c_92b87412","updated":"2015-02-05 17:19:46.000000000","message":"Though explicit is better than implicit, I\u0027ll change this in the next revision.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        while not kill_event.ready():"},{"line_number":165,"context_line":"            try:"},{"line_number":166,"context_line":"                output \u003d callback()"},{"line_number":167,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":168,"context_line":"                    break"},{"line_number":169,"context_line":"            except Exception:"},{"line_number":170,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_92eb14db","line":167,"updated":"2015-02-05 16:27:47.000000000","message":"What value are you looking for here?  Would it make more sense to check for None?","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        while not kill_event.ready():"},{"line_number":165,"context_line":"            try:"},{"line_number":166,"context_line":"                output \u003d callback()"},{"line_number":167,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":168,"context_line":"                    break"},{"line_number":169,"context_line":"            except Exception:"},{"line_number":170,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_d83dab90","line":167,"in_reply_to":"da86d52c_92eb14db","updated":"2015-02-05 17:19:46.000000000","message":"None doesn\u0027t work, as the Neutron processes may sometimes print an empty string to the string (output \u003d\u003d \u0027\u0027 return True). I didn\u0027t try to debug this further though.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        while not kill_event.ready():"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                output \u003d callback()"},{"line_number":166,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":167,"context_line":"                    break"},{"line_number":168,"context_line":"            except Exception:"},{"line_number":169,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_a608d8da","line":166,"updated":"2015-02-26 00:10:19.000000000","message":"Wouldn\u0027t it be simpler to just say \u0027if not None\u0027?  Or is there some other value that you\u0027re looking for?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        while not kill_event.ready():"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                output \u003d callback()"},{"line_number":166,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":167,"context_line":"                    break"},{"line_number":168,"context_line":"            except Exception:"},{"line_number":169,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_50050012","line":166,"in_reply_to":"ba7be1f8_a608d8da","updated":"2015-02-26 17:29:19.000000000","message":"From patchset 22: None doesn\u0027t work, as the Neutron processes may sometimes print an empty string to the string (output \u003d\u003d \u0027\u0027 return True). I didn\u0027t try to debug this further though.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        while not kill_event.ready():"},{"line_number":193,"context_line":"            try:"},{"line_number":194,"context_line":"                output \u003d callback()"},{"line_number":195,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":196,"context_line":"                    break"},{"line_number":197,"context_line":"            except Exception:"},{"line_number":198,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_3e1454f4","line":195,"updated":"2015-03-06 00:10:01.000000000","message":"not sure to understand why it\u0027s required","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"112bae586a9b92e0be0dd461b0b0ea5a4d9c9011","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        while not kill_event.ready():"},{"line_number":193,"context_line":"            try:"},{"line_number":194,"context_line":"                output \u003d callback()"},{"line_number":195,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":196,"context_line":"                    break"},{"line_number":197,"context_line":"            except Exception:"},{"line_number":198,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_7704014a","line":195,"in_reply_to":"9a80dd14_3e1454f4","updated":"2015-03-06 21:49:39.000000000","message":"readability?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        while not kill_event.ready():"},{"line_number":193,"context_line":"            try:"},{"line_number":194,"context_line":"                output \u003d callback()"},{"line_number":195,"context_line":"                if not output and output !\u003d \"\":"},{"line_number":196,"context_line":"                    break"},{"line_number":197,"context_line":"            except Exception:"},{"line_number":198,"context_line":"                LOG.exception(_LE(\u0027An error occurred while communicating \u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_fea420bb","line":195,"in_reply_to":"9a80dd14_7704014a","updated":"2015-03-09 14:14:37.000000000","message":"Please look in previous patchsets for explanations for why this is needed :)","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                LOG.exception(_LE(\u0027An error occurred while killing [%s].\u0027),"},{"line_number":173,"context_line":"                              self.cmd)"},{"line_number":174,"context_line":"                return False"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        if self._process:"},{"line_number":177,"context_line":"            self._process.wait()"},{"line_number":178,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_77c15280","line":175,"updated":"2015-03-26 16:14:55.000000000","message":"Is this still needed now that async process can start/stop in a blocking manner?","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                LOG.exception(_LE(\u0027An error occurred while killing [%s].\u0027),"},{"line_number":173,"context_line":"                              self.cmd)"},{"line_number":174,"context_line":"                return False"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        if self._process:"},{"line_number":177,"context_line":"            self._process.wait()"},{"line_number":178,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_62c86b75","line":175,"in_reply_to":"fa963961_77c15280","updated":"2015-03-26 16:55:37.000000000","message":"Yes. The fact that the module can choose to block or not when stopping the process doesn\u0027t mean a wait() syscall doesn\u0027t have to be issued when the process stops. This is actually a bug fix in disguise (but don\u0027t make me open a new patchset for that :\u003c )","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"}],"neutron/agent/linux/utils.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    \"\"\""},{"line_number":293,"context_line":"    cmd \u003d get_cmdline_from_pid(pid)"},{"line_number":294,"context_line":"    abs_cmd \u003d remove_abs_path(cmd)"},{"line_number":295,"context_line":"    abs_expected_cmd \u003d remove_abs_path(expected_cmd)"},{"line_number":296,"context_line":"    if abs_cmd \u003d\u003d abs_expected_cmd:"},{"line_number":297,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_d5443b76","line":294,"updated":"2015-03-25 23:56:34.000000000","message":"This change requires a unit test addition. (done in next patchset)","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"}],"neutron/tests/api/test_v2_rest.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import testscenarios"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutron.tests.api import base_v2"},{"line_number":25,"context_line":"from neutron.tests import sub_base"},{"line_number":26,"context_line":"from neutron.tests.tempest import test as t_test"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# Required to generate tests from scenarios.  Not compatible with nose."}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_b51dff75","line":25,"updated":"2015-03-25 23:56:34.000000000","message":"Thank you for fixing this!\n\nAlso, sub_base is going away:  https://review.openstack.org/#/c/167041/","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"}],"neutron/tests/common/helpers.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"            return os.path.join(root, filename)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def find_sample_file(filename):"},{"line_number":26,"context_line":"    \"\"\"Find a file with name \u0027filename\u0027 located in the sample directory.\"\"\""},{"line_number":27,"context_line":"    return find_file("},{"line_number":28,"context_line":"        filename,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_cc66cd50","line":25,"updated":"2015-02-26 00:10:19.000000000","message":"This will hopefully be unused.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"            return os.path.join(root, filename)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def find_sample_file(filename):"},{"line_number":26,"context_line":"    \"\"\"Find a file with name \u0027filename\u0027 located in the sample directory.\"\"\""},{"line_number":27,"context_line":"    return find_file("},{"line_number":28,"context_line":"        filename,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_8ec911ae","line":25,"in_reply_to":"ba7be1f8_cc66cd50","updated":"2015-02-26 17:29:19.000000000","message":"Actually found out that unless I specify an absolute path to an api-paste.ini file, the neutron-server process will stop because it can\u0027t find it. So I still need this to specify the sample api-paste.ini\u0027s path.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"112bae586a9b92e0be0dd461b0b0ea5a4d9c9011","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \"\"\"Find a file with name \u0027filename\u0027 located in the sample directory.\"\"\""},{"line_number":27,"context_line":"    return find_file("},{"line_number":28,"context_line":"        filename,"},{"line_number":29,"context_line":"        path\u003dos.path.join(os.path.dirname(__file__), \u0027..\u0027, \u0027..\u0027, \u0027..\u0027, \u0027etc\u0027))"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_573ffdd5","line":29,"updated":"2015-03-06 21:49:39.000000000","message":"this looks a bit prone as to where this files belong...I hope we don\u0027t get bitten by it. If the intention is to reference \u0027neutron/etc\u0027, wouldn\u0027t be better to build the path from the neutron module __path__?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \"\"\"Find a file with name \u0027filename\u0027 located in the sample directory.\"\"\""},{"line_number":27,"context_line":"    return find_file("},{"line_number":28,"context_line":"        filename,"},{"line_number":29,"context_line":"        path\u003dos.path.join(os.path.dirname(__file__), \u0027..\u0027, \u0027..\u0027, \u0027..\u0027, \u0027etc\u0027))"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_9e93245a","line":29,"in_reply_to":"9a80dd14_573ffdd5","updated":"2015-03-09 14:14:37.000000000","message":"Probably, didn\u0027t think about it :)","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"325aea52f8c16e40c3b0cbf340034abdc2f0e548","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \"\"\"Find a file with name \u0027filename\u0027 located in the sample directory.\"\"\""},{"line_number":27,"context_line":"    return find_file("},{"line_number":28,"context_line":"        filename,"},{"line_number":29,"context_line":"        path\u003dos.path.join(os.path.dirname(__file__), \u0027..\u0027, \u0027..\u0027, \u0027..\u0027, \u0027etc\u0027))"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_5ef03a66","line":29,"in_reply_to":"9a80dd14_9e93245a","updated":"2015-03-18 09:18:39.000000000","message":"Done","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"}],"neutron/tests/common/randutils.py":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_c88b37be","line":1,"updated":"2015-01-07 18:12:32.000000000","message":"this fix doesn\u0027t seem related to this patch, moving it to a dependent patch would make it easier to review","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"7dfcfdf3e00d85527dcd9f4fe5c107c0d27f94f9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_508dc57b","line":1,"in_reply_to":"3a961159_0d224aba","updated":"2015-01-12 13:44:32.000000000","message":"I understand your pain. I don\u0027t like dependent patches either but I must admit that sometime they help, especially when you get the \"helpers\" patches merged very quickly. Anyway it\u0027s your call here.","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_0d224aba","line":1,"in_reply_to":"3a961159_c88b37be","updated":"2015-01-12 13:30:16.000000000","message":"Normally I would agree, but this would create an uncomfortable chain of dependencies I would like to avoid just for this specific function (a similar change of a colleague took him little over 2 months). If I find myself relocating more of these helper functions to neutron/tests/common/, I promise to unify them to a separate patch :)","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"}],"neutron/tests/fullstack/base.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# Import all data models from services repositores."},{"line_number":16,"context_line":"from neutron_fwaas.db.firewall import firewall_db  # noqa"},{"line_number":17,"context_line":"from neutron_lbaas.db.loadbalancer import loadbalancer_db  # noqa"},{"line_number":18,"context_line":"from neutron_vpnaas.db.vpn import vpn_db  # noqa"},{"line_number":19,"context_line":"from neutronclient.common import exceptions as nc_exc"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_15a8eed9","line":16,"updated":"2015-02-05 16:27:47.000000000","message":"Neutron\u0027s tests should not depend on anything from *aas.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# Import all data models from services repositores."},{"line_number":16,"context_line":"from neutron_fwaas.db.firewall import firewall_db  # noqa"},{"line_number":17,"context_line":"from neutron_lbaas.db.loadbalancer import loadbalancer_db  # noqa"},{"line_number":18,"context_line":"from neutron_vpnaas.db.vpn import vpn_db  # noqa"},{"line_number":19,"context_line":"from neutronclient.common import exceptions as nc_exc"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_81c11756","line":16,"in_reply_to":"da86d52c_15a8eed9","updated":"2015-02-25 14:48:02.000000000","message":"Done. Was a configuration error on my part (as expected) :)","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003dendpoint_url)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":40,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_b5072281","line":39,"updated":"2015-02-05 16:27:47.000000000","message":"I think this class should be decomposed into test-specific functionality and fixture-specific functionality.  The test-specific class could be inherited from, but the fixture stuff should be reusable via composition.  Mixes \u003d\u003d evil.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003dendpoint_url)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":40,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_e1a493a7","line":39,"in_reply_to":"da86d52c_b5072281","updated":"2015-02-25 14:48:02.000000000","message":"Done. I\u0027ve added a \u0027PROCESSES\u0027 attribute which can be overridden per test suite. This points to a resources.ProcessGroupFixture which in turn can be used to define the processes and configuration. I\u0027ve added a sample test for readability and clarity.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":40,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_55db467b","line":40,"updated":"2015-02-05 16:27:47.000000000","message":"We need to stop using the olso.db \u0027Opportunistic\u0027 base classes to avoid automatically.  Some work in oslo.db is probably required.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":40,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_81bd97b9","line":40,"in_reply_to":"da86d52c_1e3d6bc4","updated":"2015-02-25 14:48:02.000000000","message":"Since no reply here, I\u0027m leaving this as is as I kinda like this now.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":40,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_1e3d6bc4","line":40,"in_reply_to":"da86d52c_55db467b","updated":"2015-02-05 17:19:46.000000000","message":"Can you elaborate? I actually think it makes the code very readable. Do you mean we should use the fixture directly?","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        Currently, the username and password options are hard-coded by"},{"line_number":89,"context_line":"        oslo.db and neutron/tests/functional/contrib/gate_hook.sh. Also,"},{"line_number":90,"context_line":"        we only support MySQL for now, but the groundwork for adding Postgres"},{"line_number":91,"context_line":"        is already laid."},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        conn \u003d \"mysql://%(username)s:%(password)s@127.0.0.1/%(db_name)s\" % {"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_55cc2689","line":90,"updated":"2015-02-05 16:27:47.000000000","message":"I\u0027m not sure we want to be running postgres tests and mysql tests in a single test run for fullstack testing.  Maybe they should be run as separate jobs?","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        Currently, the username and password options are hard-coded by"},{"line_number":89,"context_line":"        oslo.db and neutron/tests/functional/contrib/gate_hook.sh. Also,"},{"line_number":90,"context_line":"        we only support MySQL for now, but the groundwork for adding Postgres"},{"line_number":91,"context_line":"        is already laid."},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        conn \u003d \"mysql://%(username)s:%(password)s@127.0.0.1/%(db_name)s\" % {"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_fe7097a5","line":90,"in_reply_to":"da86d52c_55cc2689","updated":"2015-02-05 17:19:46.000000000","message":"Maybe. For now I\u0027m only thinking about MySQL support and postgres is regarded as \"stage #2\". Maybe we can have 2 sub-classes, one for MySQL and one for Postgres, and then we could have 2 instances of each test suite, one for each, and that will make sure it works.\n\nAs I mentioned, stage #2.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        def agent_list_returns():"},{"line_number":105,"context_line":"            try:"},{"line_number":106,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":107,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":108,"context_line":"                return False"},{"line_number":109,"context_line":"        helpers.wait_until_true(agent_list_returns)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_159c6e5c","line":106,"updated":"2015-02-05 16:27:47.000000000","message":"Do we want to rely on the client to determine that an agent is \u0027up\u0027?  We have full control over the test environment, so we potentially have other (more reliable) ways of determining agent liveness.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        def agent_list_returns():"},{"line_number":105,"context_line":"            try:"},{"line_number":106,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":107,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":108,"context_line":"                return False"},{"line_number":109,"context_line":"        helpers.wait_until_true(agent_list_returns)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_5e5443c9","line":106,"in_reply_to":"da86d52c_159c6e5c","updated":"2015-02-05 17:19:46.000000000","message":"Actually this is the most reliable way. It isn\u0027t enough to make sure that the process is up since it might be up but still initialising (and thus not ready for test start - if a test starts before the process is ready then it will produce unexpected result).\n\nChecking through the API makes sure that the neutron-server is ready for API requests, and making sure that all the agents are up makes sure their initialisation is also pretty much done.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"21d99a778153d8199d869dacaa4758fcc8e2798b","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        def agent_list_returns():"},{"line_number":105,"context_line":"            try:"},{"line_number":106,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":107,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":108,"context_line":"                return False"},{"line_number":109,"context_line":"        helpers.wait_until_true(agent_list_returns)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_fd409408","line":106,"in_reply_to":"da86d52c_5e5443c9","updated":"2015-02-05 21:36:05.000000000","message":"I agree with John about using the API here. We\u0027ve had a few discussions about this and determined that this is both the most correct way, as well as the easiest, to determine that the server is up and ready (It\u0027s responding to an API call), and that the agents are not only up but are ready as well (They\u0027ve sent one message over RPC - The heartbeat).","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        def agent_list_returns():"},{"line_number":105,"context_line":"            try:"},{"line_number":106,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":107,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":108,"context_line":"                return False"},{"line_number":109,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_b5b9e2cd","line":107,"updated":"2015-02-05 16:27:47.000000000","message":"Unless there is some other means of tracing problems with client interaction, this exception should be logged.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        def agent_list_returns():"},{"line_number":105,"context_line":"            try:"},{"line_number":106,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":107,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":108,"context_line":"                return False"},{"line_number":109,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_612d03fe","line":107,"in_reply_to":"da86d52c_b5b9e2cd","updated":"2015-02-25 14:48:02.000000000","message":"It could lead to some high-load logging (a line each second, per test), and is expected (in case the processes take a few more seconds to start). If the check times out then an exception is raised and the function name (\u0027ensure_server_is_up\u0027) can be observed in the stack trace.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.tests.functional.agent.linux import helpers"},{"line_number":24,"context_line":"from neutron.tests.functional import base as functional_base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"NEUTRON_SERVER_PATH \u003d \u0027neutron.server\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"SERVER_ADDR \u003d \"http://127.0.0.1:%(bind_port)s\""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_c61eac6f","line":26,"updated":"2015-02-26 00:10:19.000000000","message":"Why is this a constant and defined here?  It\u0027s only used once and in a different module.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.tests.functional.agent.linux import helpers"},{"line_number":24,"context_line":"from neutron.tests.functional import base as functional_base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"NEUTRON_SERVER_PATH \u003d \u0027neutron.server\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"SERVER_ADDR \u003d \"http://127.0.0.1:%(bind_port)s\""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_56bdf800","line":26,"in_reply_to":"ba7be1f8_c61eac6f","updated":"2015-02-26 17:29:19.000000000","message":"This should be used by practically every test case which wants to define a new processes layout, so I put it in a common place. See for example test_sanity.py.\n\nI\u0027ve moved this to a \u0027constants.py\u0027 file.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003dendpoint_url)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":37,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    # This variable should indicate class type which inherits from"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_662ee0a6","line":36,"updated":"2015-02-26 00:10:19.000000000","message":"If the intent is to support postgresql, consider creating a common parent class containing db-agnostic functionality.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003dendpoint_url)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class BaseFullStackTestCase(functional_base.BaseSudoTestCase,"},{"line_number":37,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    # This variable should indicate class type which inherits from"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_966130ab","line":36,"in_reply_to":"ba7be1f8_662ee0a6","updated":"2015-02-26 17:29:19.000000000","message":"I much prefer to attend this *after* this is already merged, in a separate patch. Since it\u0027s not a current requirement I don\u0027t see why we can\u0027t put this off until when we need this to actually work. This patch is complicated enough as it is :)","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # ProcessGroupFixture. This will be used when setting up the test"},{"line_number":41,"context_line":"    # environment as an indication to how many processes should be started,"},{"line_number":42,"context_line":"    # which config files should be used, etc."},{"line_number":43,"context_line":"    PROCESSES \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_61024ab5","line":43,"updated":"2015-02-26 00:10:19.000000000","message":"Why is this a class variable?  Consider providing it as an argument to setUp.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # ProcessGroupFixture. This will be used when setting up the test"},{"line_number":41,"context_line":"    # environment as an indication to how many processes should be started,"},{"line_number":42,"context_line":"    # which config files should be used, etc."},{"line_number":43,"context_line":"    PROCESSES \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_c274b869","line":43,"in_reply_to":"ba7be1f8_61024ab5","updated":"2015-02-26 17:29:19.000000000","message":"If the processes fixture is an argument to setUp, then each inheriting test suite will need to override setUp just to call super with an argument. This is cleaner IMO.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"dbc121e3412fb0d319b98854ae5092aa07f98032","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # ProcessGroupFixture. This will be used when setting up the test"},{"line_number":41,"context_line":"    # environment as an indication to how many processes should be started,"},{"line_number":42,"context_line":"    # which config files should be used, etc."},{"line_number":43,"context_line":"    PROCESSES \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_db604cd1","line":43,"in_reply_to":"ba7be1f8_c274b869","updated":"2015-03-04 02:27:11.000000000","message":"I think that having to parametize an instance via class variables is an anti-pattern and it makes for less maintainable code.  The fact that its necessary to document your intent with a 4-line comment only reinforces my argument.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"64be0587139a9f9768a385d816123539f91ddb83","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # ProcessGroupFixture. This will be used when setting up the test"},{"line_number":41,"context_line":"    # environment as an indication to how many processes should be started,"},{"line_number":42,"context_line":"    # which config files should be used, etc."},{"line_number":43,"context_line":"    PROCESSES \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        \"\"\"Sets up the environment and creates processes for full-stack tests."}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_5e6dbe31","line":43,"in_reply_to":"ba7be1f8_db604cd1","updated":"2015-03-05 06:29:11.000000000","message":"Will do.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                _(\u0027PROCESSES is not defined for class %r\u0027), self.__name__)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.check_sudo_enabled()"},{"line_number":66,"context_line":"        self.create_db_tables()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.process_fixtures \u003d self.PROCESSES("},{"line_number":69,"context_line":"            test_name\u003dself.name, connection\u003dcfg.CONF.database.connection)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_2144d248","line":66,"updated":"2015-02-26 00:10:19.000000000","message":"How costly is it to create/drop the db for every test?  The neutron unit tests reuse a db, create the tables once and then clear them at the end of each test.   The tempest tests use the same db throughout and isolate via different tenants.  What strategy do you imagine to minimize db setup time for fullstack testing?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                _(\u0027PROCESSES is not defined for class %r\u0027), self.__name__)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.check_sudo_enabled()"},{"line_number":66,"context_line":"        self.create_db_tables()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.process_fixtures \u003d self.PROCESSES("},{"line_number":69,"context_line":"            test_name\u003dself.name, connection\u003dcfg.CONF.database.connection)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_397b14bf","line":66,"in_reply_to":"ba7be1f8_2144d248","updated":"2015-02-26 17:29:19.000000000","message":"Here the approach is to sacrifice a bit of the run time it takes to create/drop the db between each test in favor of not having to explicitly clean up everything that is created after each test. The motivation behind is that if we eventually (once there are enough tests to benchmark this) determine that we need to switch to a different approach (similar to what is done in tempest) then we could always do this in a follow up patch.\n\nSince in the short run there won\u0027t be too many tests, I don\u0027t think it\u0027s a bottleneck to worry about right now. What do you think?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"4138098b93356580599e25dfc69582368a59dc96","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                _(\u0027PROCESSES is not defined for class %r\u0027), self.__name__)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.check_sudo_enabled()"},{"line_number":66,"context_line":"        self.create_db_tables()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.process_fixtures \u003d self.PROCESSES("},{"line_number":69,"context_line":"            test_name\u003dself.name, connection\u003dcfg.CONF.database.connection)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_5dea9474","line":66,"in_reply_to":"ba7be1f8_397b14bf","updated":"2015-03-04 02:21:03.000000000","message":"There are going to be over 300 tests once the api tests start relying on test-managed daemons: \n\nhttps://review.openstack.org/#/c/158021/","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"64be0587139a9f9768a385d816123539f91ddb83","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                _(\u0027PROCESSES is not defined for class %r\u0027), self.__name__)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.check_sudo_enabled()"},{"line_number":66,"context_line":"        self.create_db_tables()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.process_fixtures \u003d self.PROCESSES("},{"line_number":69,"context_line":"            test_name\u003dself.name, connection\u003dcfg.CONF.database.connection)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_1e8426d3","line":66,"in_reply_to":"ba7be1f8_5dea9474","updated":"2015-03-05 06:29:11.000000000","message":"Lets talk about this when we have the chance and we can see about changing this behaviour :)","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.check_sudo_enabled()"},{"line_number":66,"context_line":"        self.create_db_tables()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.process_fixtures \u003d self.PROCESSES("},{"line_number":69,"context_line":"            test_name\u003dself.name, connection\u003dcfg.CONF.database.connection)"},{"line_number":70,"context_line":"        self.useFixture(self.process_fixtures)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_2c05a945","line":68,"updated":"2015-02-26 00:10:19.000000000","message":"process_fixture \u003d\u003e processes_fixture ?\n\nBecause it looks like only a single fixture is being instantiated here.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.check_sudo_enabled()"},{"line_number":66,"context_line":"        self.create_db_tables()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.process_fixtures \u003d self.PROCESSES("},{"line_number":69,"context_line":"            test_name\u003dself.name, connection\u003dcfg.CONF.database.connection)"},{"line_number":70,"context_line":"        self.useFixture(self.process_fixtures)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_f9225cb7","line":68,"in_reply_to":"ba7be1f8_2c05a945","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        def agent_list_returns():"},{"line_number":107,"context_line":"            try:"},{"line_number":108,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":109,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":110,"context_line":"                return False"},{"line_number":111,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_41db867b","line":109,"updated":"2015-02-26 00:10:19.000000000","message":"Is there a more specific exception that could be looked for?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"4138098b93356580599e25dfc69582368a59dc96","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        def agent_list_returns():"},{"line_number":107,"context_line":"            try:"},{"line_number":108,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":109,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":110,"context_line":"                return False"},{"line_number":111,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_1d9bbc18","line":109,"in_reply_to":"ba7be1f8_1c61ded2","updated":"2015-03-04 02:21:03.000000000","message":"Is the exception logged anywhere else or should it be done here?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"64be0587139a9f9768a385d816123539f91ddb83","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        def agent_list_returns():"},{"line_number":107,"context_line":"            try:"},{"line_number":108,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":109,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":110,"context_line":"                return False"},{"line_number":111,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_9e2016f9","line":109,"in_reply_to":"ba7be1f8_1d9bbc18","updated":"2015-03-05 06:29:11.000000000","message":"I will add one for the next patchset","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        def agent_list_returns():"},{"line_number":107,"context_line":"            try:"},{"line_number":108,"context_line":"                return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d agents_count"},{"line_number":109,"context_line":"            except nc_exc.NeutronClientException:"},{"line_number":110,"context_line":"                return False"},{"line_number":111,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_1c61ded2","line":109,"in_reply_to":"ba7be1f8_41db867b","updated":"2015-02-26 17:29:19.000000000","message":"A swift look at neutronclient\u0027s code shows that this sole call can raise at least 5 different exceptions (Unauthorized, NoAuthURLProvided, EndpointTypeNotFound, EndpointNotFound, ConnectionFailed), all inheriting from NeutronClientException.\n\nSo I guess the answer is no :)","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":115,"context_line":"        return process.core_config.get(section, option)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_plugin_option(self, agent, section, option):"},{"line_number":118,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":119,"context_line":"        return process.plugin_config.get(section, option)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_818ade61","line":117,"updated":"2015-02-26 00:10:19.000000000","message":"This method appears to be unused.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"4138098b93356580599e25dfc69582368a59dc96","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":115,"context_line":"        return process.core_config.get(section, option)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_plugin_option(self, agent, section, option):"},{"line_number":118,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":119,"context_line":"        return process.plugin_config.get(section, option)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_dd8cc4d9","line":117,"in_reply_to":"ba7be1f8_7ca1faf6","updated":"2015-03-04 02:21:03.000000000","message":"YAGNI - we shouldn\u0027t be merging code that isn\u0027t needed.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":115,"context_line":"        return process.core_config.get(section, option)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_plugin_option(self, agent, section, option):"},{"line_number":118,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":119,"context_line":"        return process.plugin_config.get(section, option)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_7ca1faf6","line":117,"in_reply_to":"ba7be1f8_818ade61","updated":"2015-02-26 17:29:19.000000000","message":"As of now. It might be used further down the line and I don\u0027t want the first one to implement a test that needs this function to implement this (somewhat significant) part of the framework.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"64be0587139a9f9768a385d816123539f91ddb83","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":115,"context_line":"        return process.core_config.get(section, option)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_plugin_option(self, agent, section, option):"},{"line_number":118,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":119,"context_line":"        return process.plugin_config.get(section, option)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_5e269e17","line":117,"in_reply_to":"ba7be1f8_dd8cc4d9","updated":"2015-03-05 06:29:11.000000000","message":"I will remove it for the next patchset.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        do that, we must change the \u0027connection\u0027 option which the Neutron code"},{"line_number":48,"context_line":"        knows to look at."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        Currently, the username and password options are hard-coded by"},{"line_number":51,"context_line":"        oslo.db and neutron/tests/functional/contrib/gate_hook.sh. Also,"},{"line_number":52,"context_line":"        we only support MySQL for now, but the groundwork for adding Postgres"},{"line_number":53,"context_line":"        is already laid."}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_1e0eb08d","line":50,"updated":"2015-03-06 00:10:01.000000000","message":"more generally the db url is hardcoded? Allowing to pass directly the url would support mysql+postgresql?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        do that, we must change the \u0027connection\u0027 option which the Neutron code"},{"line_number":48,"context_line":"        knows to look at."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        Currently, the username and password options are hard-coded by"},{"line_number":51,"context_line":"        oslo.db and neutron/tests/functional/contrib/gate_hook.sh. Also,"},{"line_number":52,"context_line":"        we only support MySQL for now, but the groundwork for adding Postgres"},{"line_number":53,"context_line":"        is already laid."}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_9e7a4422","line":50,"in_reply_to":"9a80dd14_1e0eb08d","updated":"2015-03-09 14:14:37.000000000","message":"Yes, postgresql support is intended to be added later down the line - right now it\u0027s only mysql.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1fd0f07820fe4c1bf57f349d82b3294cb9249274","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.tests.functional import base as functional_base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class ReuseableDatabaseResource(provision.DatabaseResource):"},{"line_number":28,"context_line":"    def make(self, dependency_resources):"},{"line_number":29,"context_line":"        \"\"\"Populate the new database."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a80dd14_2d857959","line":27,"updated":"2015-03-16 17:32:21.000000000","message":"tiny nit typo: ReusableDatabaseResource","commit_id":"a956db80a0bea09650f73f927b77445d7e0bcc5b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":39,"context_line":"        super(BaseFullStackTestCase, self).__init__(*args, **kwargs)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        self._resources.setdefault(constants.NEUTRON_SERVER,"},{"line_number":42,"context_line":"            n_resources.ReusableResource(n_fixtures.NeutronServerFixture()))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_f87b7ef2","line":41,"updated":"2015-03-25 23:56:34.000000000","message":"As per a discussion with John, we\u0027re going to defer going to testresources for now.  The api tests don\u0027t need test-managed daemons (yet), so the fixture cost doesn\u0027t have to be optimized right away.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":39,"context_line":"        super(BaseFullStackTestCase, self).__init__(*args, **kwargs)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        self._resources.setdefault(constants.NEUTRON_SERVER,"},{"line_number":42,"context_line":"            n_resources.ReusableResource(n_fixtures.NeutronServerFixture()))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_d4e5a109","line":41,"in_reply_to":"1a6ced46_f87b7ef2","updated":"2015-03-26 13:25:50.000000000","message":"This chunk of code will be deleted in the next patchset and will be added in a followup patch when needed.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        for _, manager in self.resources:"},{"line_number":102,"context_line":"            manager.dirtied(None)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def processes_are_ready(self):"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d self.agents"},{"line_number":107,"context_line":"        except nc_exc.NeutronClientException:"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_986c4a37","line":104,"updated":"2015-03-25 23:56:34.000000000","message":"Consider using a \u0027fullstack\u0027 fixture that knows how to do this instead of adding it to the testcase.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        for _, manager in self.resources:"},{"line_number":102,"context_line":"            manager.dirtied(None)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def processes_are_ready(self):"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            return len(self.client.list_agents()[\u0027agents\u0027]) \u003d\u003d self.agents"},{"line_number":107,"context_line":"        except nc_exc.NeutronClientException:"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_d4ccc18b","line":104,"in_reply_to":"1a6ced46_986c4a37","updated":"2015-03-26 13:25:50.000000000","message":"I don\u0027t see the benefit of using a fixture for this, since it doesn\u0027t have any cleaning up needed. I think also that adding a fixture will add a level of unnecessary indirection which we want to avoid, so I\u0027m leaving this as is.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            # data it needs and simplifies the logic of this code greatly."},{"line_number":48,"context_line":"            f \u003d fixture(self)"},{"line_number":49,"context_line":"            setattr(self, fixture.name, f)"},{"line_number":50,"context_line":"            self.useFixture(f)"},{"line_number":51,"context_line":"        self.agents \u003d len(process_fixtures)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        utils.wait_until_true(self.processes_are_ready)"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_1c790dfd","line":50,"updated":"2015-03-26 16:14:55.000000000","message":"Maybe agents -\u003e n_agents or num_agents","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            # data it needs and simplifies the logic of this code greatly."},{"line_number":48,"context_line":"            f \u003d fixture(self)"},{"line_number":49,"context_line":"            setattr(self, fixture.name, f)"},{"line_number":50,"context_line":"            self.useFixture(f)"},{"line_number":51,"context_line":"        self.agents \u003d len(process_fixtures)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        utils.wait_until_true(self.processes_are_ready)"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_a2f9d3ca","line":50,"in_reply_to":"fa963961_1c790dfd","updated":"2015-03-26 16:55:37.000000000","message":"Code will be removed and added later in a better way :)","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"ce7b69ef4032f8de4bbc54f80cdc1216e32ed855","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            f_fixtures.NeutronServerFixture())"},{"line_number":40,"context_line":"        self.client \u003d self.neutron_server.client"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        utils.wait_until_true(self.processes_are_ready)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"},{"line_number":45,"context_line":"    def test_name(self):"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa963961_d3af0b93","line":42,"updated":"2015-03-26 18:03:08.000000000","message":"As discussed, this should probably be part of a fixture instead of the test case.","commit_id":"9504231ba38b5d9b50f5e7124819217d8bbdff63"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"3956add7ed687d5ca8115ddea5affd9a706385fc","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            f_fixtures.NeutronServerFixture())"},{"line_number":40,"context_line":"        self.client \u003d self.neutron_server.client"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        utils.wait_until_true(self.processes_are_ready)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"},{"line_number":45,"context_line":"    def test_name(self):"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa963961_ee08e42a","line":42,"in_reply_to":"fa963961_d3af0b93","updated":"2015-03-26 18:23:44.000000000","message":"Once we go for the environment fixture concept (in the follow up patch, as it really isn\u0027t needed now), it will belong there. For now (since there\u0027s only one process), it can go to NeutronServerFixture.","commit_id":"9504231ba38b5d9b50f5e7124819217d8bbdff63"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"920864520a2e38ebc521a1ac4c36c854f68c0314","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    :param process_fixtures: a list of fixture classes (not instances)."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":44,"id":"fa963961_708dd27a","line":26,"updated":"2015-03-26 18:53:51.000000000","message":"Nit: Where/how is this param used?","commit_id":"e0ea5edc128e7191d11514868b5711c23ef23821"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9551f9b9516247e933a4d86cd54bd8a9123badba","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    :param process_fixtures: a list of fixture classes (not instances)."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":44,"id":"fa963961_578d1d30","line":26,"in_reply_to":"fa963961_708dd27a","updated":"2015-03-26 22:59:04.000000000","message":"Leftover from a previous patch... will be deleted in a follow up. :(","commit_id":"e0ea5edc128e7191d11514868b5711c23ef23821"}],"neutron/tests/fullstack/config.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ConfigDict(sub_base.AttributeDict):"},{"line_number":24,"context_line":"    def update(self, other):"},{"line_number":25,"context_line":"        self.convert_to_attr_dict(other)"},{"line_number":26,"context_line":"        super(ConfigDict, self).update(other)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_43bbf571","line":24,"updated":"2015-03-06 00:10:01.000000000","message":"Not sure how ConfigDict will be used but convert_to_attr_dict is only done on update but not on __setitem__/setdefault\n\nIt\u0027s perhaps better if AttributeDict extends MutableMapping instead of dict (you will need to define few methods) and ConfigDict overloads __setitem__ to perform convert_to_attr_dict convertion?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"325aea52f8c16e40c3b0cbf340034abdc2f0e548","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ConfigDict(sub_base.AttributeDict):"},{"line_number":24,"context_line":"    def update(self, other):"},{"line_number":25,"context_line":"        self.convert_to_attr_dict(other)"},{"line_number":26,"context_line":"        super(ConfigDict, self).update(other)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_3e5f0677","line":24,"in_reply_to":"9a80dd14_43bbf571","updated":"2015-03-18 09:18:39.000000000","message":"ConfigDict is immutable (configuration is static after it\u0027s created), so inheriting from any mutable object is bad","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a5bd02ec43ebd599e8672bb8a4b3d0750f884a5d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class NeutronConfig(ConfigDict):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    filename \u003d \u0027neutron.conf\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, connection, temp_dir):"},{"line_number":45,"context_line":"        super(NeutronConfig, self).__init__()"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_0d220ca4","line":42,"updated":"2015-03-05 22:39:40.000000000","message":"Specifying the filename as an attribute on a dict subclass doesn\u0027t make much sense.  Need to rethink.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class NeutronConfig(ConfigDict):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    filename \u003d \u0027neutron.conf\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, connection, temp_dir):"},{"line_number":45,"context_line":"        super(NeutronConfig, self).__init__()"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_3e0cf893","line":42,"in_reply_to":"9a80dd14_0d220ca4","updated":"2015-03-09 14:14:37.000000000","message":"Could probably use config.__class__.__name__, and wrap it in a property function in ConfigDict.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _generate_port(self):"},{"line_number":74,"context_line":"        \"\"\"Get a free TCP port from the Operating System and return it.\"\"\""},{"line_number":75,"context_line":"        return str(helpers.get_free_namespace_port())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _generate_api_paste(self):"},{"line_number":78,"context_line":"        return c_helpers.find_sample_file(\u0027api-paste.ini\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_1e6f90fe","line":75,"updated":"2015-03-06 00:10:01.000000000","message":"not bulletproof? except if the service runs alone in a namespace\n\nAt least we should add a note/warning","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"21dbf308539aa797ad99cbc20bed80f16c203880","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _generate_port(self):"},{"line_number":74,"context_line":"        \"\"\"Get a free TCP port from the Operating System and return it.\"\"\""},{"line_number":75,"context_line":"        return str(helpers.get_free_namespace_port())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _generate_api_paste(self):"},{"line_number":78,"context_line":"        return c_helpers.find_sample_file(\u0027api-paste.ini\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_3a362953","line":75,"in_reply_to":"9a80dd14_1e6f90fe","updated":"2015-03-16 16:57:52.000000000","message":"Done","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _generate_bridge_mappings(self):"},{"line_number":110,"context_line":"        return (\u0027physnet1:%s\u0027 %"},{"line_number":111,"context_line":"                sub_base.get_rand_name("},{"line_number":112,"context_line":"                    prefix\u003d\u0027br-eth\u0027,"},{"line_number":113,"context_line":"                    max_length\u003dconstants.DEVICE_NAME_MAX_LEN))"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_2314414d","line":111,"updated":"2015-03-06 00:10:01.000000000","message":"perhaps we should define a get_rand_device_name() to avoid specifying max_length\u003dconstants.DEVICE_NAME_MAX_LEN there and in lots of  functional (net_)helpers","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _generate_bridge_mappings(self):"},{"line_number":110,"context_line":"        return (\u0027physnet1:%s\u0027 %"},{"line_number":111,"context_line":"                sub_base.get_rand_name("},{"line_number":112,"context_line":"                    prefix\u003d\u0027br-eth\u0027,"},{"line_number":113,"context_line":"                    max_length\u003dconstants.DEVICE_NAME_MAX_LEN))"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_be2e28a3","line":111,"in_reply_to":"9a80dd14_2314414d","updated":"2015-03-09 14:14:37.000000000","message":"One already exists: neutron/tests/functional/agent/linux/base.py::get_rand_port_name(). It should be moved to neutron/tests/common/helpers.py.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"21dbf308539aa797ad99cbc20bed80f16c203880","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _generate_bridge_mappings(self):"},{"line_number":110,"context_line":"        return (\u0027physnet1:%s\u0027 %"},{"line_number":111,"context_line":"                sub_base.get_rand_name("},{"line_number":112,"context_line":"                    prefix\u003d\u0027br-eth\u0027,"},{"line_number":113,"context_line":"                    max_length\u003dconstants.DEVICE_NAME_MAX_LEN))"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_da726d10","line":111,"in_reply_to":"9a80dd14_be2e28a3","updated":"2015-03-16 16:57:52.000000000","message":"This will be done in a different patch as this requires too many changes in too many places.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests import sub_base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ConfigDict(sub_base.AttributeDict):"},{"line_number":24,"context_line":"    def update(self, other):"},{"line_number":25,"context_line":"        self.convert_to_attr_dict(other)"},{"line_number":26,"context_line":"        super(ConfigDict, self).update(other)"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_d931d5ed","line":23,"updated":"2015-03-25 23:56:34.000000000","message":"As per a conversation I had with John, configuration should probably be entirely fixture-managed rather than existing independently.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests import sub_base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ConfigDict(sub_base.AttributeDict):"},{"line_number":24,"context_line":"    def update(self, other):"},{"line_number":25,"context_line":"        self.convert_to_attr_dict(other)"},{"line_number":26,"context_line":"        super(ConfigDict, self).update(other)"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_f4a7fd4d","line":23,"in_reply_to":"1a6ced46_d931d5ed","updated":"2015-03-26 13:25:50.000000000","message":"Done by Maru in patchset #39.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"}],"neutron/tests/fullstack/config_fixtures.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"1a6ced46_74806df7","line":42,"updated":"2015-03-26 13:25:50.000000000","message":"Forgot to remove these attributes... Thanks for taking care of this.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ed43ad63ace8f2d9d5d39df2cc46be47e2e85d7a","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class ConfigFileFixture(fixtures.Fixture):"},{"line_number":45,"context_line":"    def __init__(self, base_filename, config, temp_dir):"},{"line_number":46,"context_line":"        super(ConfigFileFixture, self).__init__()"},{"line_number":47,"context_line":"        self.base_filename \u003d base_filename"},{"line_number":48,"context_line":"        self.config \u003d config"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6ced46_b4d2e5fd","line":45,"updated":"2015-03-26 13:25:27.000000000","message":"Need to add a comment here which indicates that unless a new instance of this class is added each time a new process starts, the configuration will be static (because self.config is set on __init__ and not setUp().\n\nThis is currently written the write way, but someone will surely encounter this in the future so a docstring won\u0027t hurt.","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ed43ad63ace8f2d9d5d39df2cc46be47e2e85d7a","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return config_parser"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class NeutronConfigFixture(fixtures.Fixture):"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def __init__(self, connection, temp_dir):"},{"line_number":73,"context_line":"        self.config \u003d ConfigDict()"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6ced46_cfe50c0a","line":70,"updated":"2015-03-26 13:25:27.000000000","message":"This class has some code duplication with ML2ConfigFixture (specifically the setUp function and a bit of the __init__). Should probably add a basic shared class.","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8548799a282c8cc670166147a541f425ba1293a2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return config_parser"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class NeutronConfigFixture(fixtures.Fixture):"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def __init__(self, connection, temp_dir):"},{"line_number":73,"context_line":"        self.config \u003d ConfigDict()"}],"source_content_type":"text/x-python","patch_set":39,"id":"fa963961_62d876f0","line":70,"in_reply_to":"1a6ced46_cfe50c0a","updated":"2015-03-26 13:31:50.000000000","message":"+1","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    def _generate_policy_json(self):"},{"line_number":146,"context_line":"        return c_helpers.find_sample_file(\u0027policy.json\u0027)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class ML2ConfigFixture(ConfigFixture):"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def __init__(self, temp_dir):"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_172c4649","line":148,"updated":"2015-03-26 16:14:55.000000000","message":"You\u0027re mixing the server-side ML2 configuration with the OVS agent configuration here.","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"ce7b69ef4032f8de4bbc54f80cdc1216e32ed855","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        })"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def setUp(self):"},{"line_number":124,"context_line":"        super(NeutronConfigFixture, self).setUp(\u0027neutron.conf\u0027)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _generate_host(self):"},{"line_number":127,"context_line":"        return sub_base.get_rand_name(prefix\u003d\u0027host-\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa963961_133c5392","line":124,"updated":"2015-03-26 18:03:08.000000000","message":"As per our conversation, the filename can be supplied via init instead of setup.","commit_id":"9504231ba38b5d9b50f5e7124819217d8bbdff63"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"3956add7ed687d5ca8115ddea5affd9a706385fc","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        })"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def setUp(self):"},{"line_number":124,"context_line":"        super(NeutronConfigFixture, self).setUp(\u0027neutron.conf\u0027)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _generate_host(self):"},{"line_number":127,"context_line":"        return sub_base.get_rand_name(prefix\u003d\u0027host-\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa963961_334ab784","line":124,"in_reply_to":"fa963961_133c5392","updated":"2015-03-26 18:23:44.000000000","message":"Indeed, I forgot this.","commit_id":"9504231ba38b5d9b50f5e7124819217d8bbdff63"}],"neutron/tests/fullstack/constants.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"NEUTRON_SERVER \u003d \u0027neutron_server\u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_99659de3","line":15,"updated":"2015-03-25 23:56:34.000000000","message":"I really don\u0027t see the point of having an entire module for these constants, especially given that they are unlikely to be used outside of fixture.  I think both of these constants really belong in neutron_fixtures","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"NEUTRON_SERVER \u003d \u0027neutron_server\u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_54c371ec","line":15,"in_reply_to":"1a6ced46_99659de3","updated":"2015-03-26 13:25:50.000000000","message":"Done","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"}],"neutron/tests/fullstack/fullstack_fixtures.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.agent.linux import async_process"},{"line_number":23,"context_line":"from neutron.tests.fullstack import config_fixtures"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# This should correspond the directory from which infra retrieves log files"},{"line_number":26,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_a9253ec3","line":25,"updated":"2015-03-26 16:14:55.000000000","message":"I think that if it\u0027s a new host, after git clone neutron \u0026\u0026 the host setup script, this directory will probably not exist. Just waving a red flag... Maybe the documentation should reflect that the full-stack tests do indeed require a stack.sh at this point.","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.agent.linux import async_process"},{"line_number":23,"context_line":"from neutron.tests.fullstack import config_fixtures"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# This should correspond the directory from which infra retrieves log files"},{"line_number":26,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_bf3fb0d5","line":25,"in_reply_to":"fa963961_a9253ec3","updated":"2015-03-26 16:55:37.000000000","message":"Done","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# This should correspond the directory from which infra retrieves log files"},{"line_number":26,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def get_client(bind_port):"},{"line_number":30,"context_line":"    url \u003d \"http://127.0.0.1:%s\" % bind_port"},{"line_number":31,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_8c93a8a3","line":28,"updated":"2015-03-26 16:14:55.000000000","message":"Consider folding this in to the only place it\u0027s used.","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# This should correspond the directory from which infra retrieves log files"},{"line_number":26,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def get_client(bind_port):"},{"line_number":30,"context_line":"    url \u003d \"http://127.0.0.1:%s\" % bind_port"},{"line_number":31,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_425207df","line":28,"in_reply_to":"fa963961_8c93a8a3","updated":"2015-03-26 16:55:37.000000000","message":"Done","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"}],"neutron/tests/fullstack/neutron_fixtures.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            qualified_filename \u003d os.path.join(self.temp_dir, filename)"},{"line_number":45,"context_line":"            with open(qualified_filename, \u0027w\u0027) as f:"},{"line_number":46,"context_line":"                config_parser.write(f)"},{"line_number":47,"context_line":"                f.flush()"},{"line_number":48,"context_line":"            filenames.append(qualified_filename)"},{"line_number":49,"context_line":"        return filenames"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_3e2534ab","line":47,"updated":"2015-03-06 00:10:01.000000000","message":"do we need this f.flush()?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            qualified_filename \u003d os.path.join(self.temp_dir, filename)"},{"line_number":45,"context_line":"            with open(qualified_filename, \u0027w\u0027) as f:"},{"line_number":46,"context_line":"                config_parser.write(f)"},{"line_number":47,"context_line":"                f.flush()"},{"line_number":48,"context_line":"            filenames.append(qualified_filename)"},{"line_number":49,"context_line":"        return filenames"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_de003c04","line":47,"in_reply_to":"9a80dd14_3e2534ab","updated":"2015-03-09 14:14:37.000000000","message":"the config_parser doesn\u0027t write to file unless it absolutely has to. flush() forces the write so it is needed.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":81,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":82,"context_line":"        cmd \u003d [spawn.find_executable(self.exec_name),"},{"line_number":83,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":84,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt)]"},{"line_number":85,"context_line":"        for filename in self.config_filenames:"},{"line_number":86,"context_line":"            cmd +\u003d [\u0027--config-file\u0027, filename]"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_be47644a","line":83,"updated":"2015-03-06 00:10:01.000000000","message":"i would prefer we do not hardcode /opt/stack/logs","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"325aea52f8c16e40c3b0cbf340034abdc2f0e548","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":81,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":82,"context_line":"        cmd \u003d [spawn.find_executable(self.exec_name),"},{"line_number":83,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":84,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt)]"},{"line_number":85,"context_line":"        for filename in self.config_filenames:"},{"line_number":86,"context_line":"            cmd +\u003d [\u0027--config-file\u0027, filename]"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_5e911a45","line":83,"in_reply_to":"9a80dd14_0151990e","updated":"2015-03-18 09:18:39.000000000","message":"Done","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":81,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":82,"context_line":"        cmd \u003d [spawn.find_executable(self.exec_name),"},{"line_number":83,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":84,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt)]"},{"line_number":85,"context_line":"        for filename in self.config_filenames:"},{"line_number":86,"context_line":"            cmd +\u003d [\u0027--config-file\u0027, filename]"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_0151990e","line":83,"in_reply_to":"9a80dd14_be47644a","updated":"2015-03-09 14:14:37.000000000","message":"It is hard coded in the jenkins configuration (specifically all log files in that path are sent to be viewed at the gate - imperative for debugging). We can probably use a constant instead of a magic string.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def get_client(bind_port):"},{"line_number":95,"context_line":"    url \u003d \"http://127.0.0.1:%s\" % bind_port"},{"line_number":96,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class NeutronServerFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_fe3b9c99","line":96,"updated":"2015-03-06 00:10:01.000000000","message":"no need to hardcode it, self.neutron_config provides it?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"325aea52f8c16e40c3b0cbf340034abdc2f0e548","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def get_client(bind_port):"},{"line_number":95,"context_line":"    url \u003d \"http://127.0.0.1:%s\" % bind_port"},{"line_number":96,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class NeutronServerFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_9eb2b2e3","line":96,"in_reply_to":"9a80dd14_a1db6d7a","updated":"2015-03-18 09:18:39.000000000","message":"Decided against this as I think explicit is better here and creating a \u0027NOAUTH\u003d\"noauth\"\u0027 variable is pointless.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b0763362e6df3e1eb0687f29855c8a83333e6d25","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def get_client(bind_port):"},{"line_number":95,"context_line":"    url \u003d \"http://127.0.0.1:%s\" % bind_port"},{"line_number":96,"context_line":"    return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class NeutronServerFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_a1db6d7a","line":96,"in_reply_to":"9a80dd14_fe3b9c99","updated":"2015-03-09 14:14:37.000000000","message":"Problem is (IMO) that unless the auth_strategy is \"noauth\", logic for figuring out the correct arguments to pass to the client must be established. Since we intend to contact neutron-server only in \"noauth\" mode, this really should be a constant value, and passing it through from the configuration adds a level of unneeded indirection.\n\nAgain, a constant value can probably be used.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"5c914ed612930dabd63967399ddb2dabef82ef89","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    def setUp(self):"},{"line_number":106,"context_line":"        super(NeutronServerFixture, self).setUp()"},{"line_number":107,"context_line":"        self.temp_dir \u003d self.useFixture(fixtures.TempDir()).path"},{"line_number":108,"context_line":"        self.neutron_config \u003d config.NeutronConfig(self.db_connection,"},{"line_number":109,"context_line":"                                                   self.temp_dir)"},{"line_number":110,"context_line":"        self.plugin_config \u003d config.ML2Config()"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_f4b0d844","line":108,"updated":"2015-03-08 15:51:33.000000000","message":"The issue I have with the implementation of the configuration here is that sometimes we need to use the same config more than once. For example, this defines a neutron-server process just fine, but if we now want another l3 agent and an ovs agent, we will probably want to have self.neutron_config from here, shared to the other ones (and probably the self.plugin_config should be shared with the ovs agent).\n\nNow we\u0027re discussing who has the responsibility for initialising these objects - is it specifically the process fixture? If so, the ovs-agent process fixture should also have access to this instance of fixture, making the implementation of process fixtures somewhat more complicated. if not, then the base class has the responsibility (lowest common denominator), and this code should be moved out and config objects should be passed to the fixtures (like my proposal was).\n\nI\u0027m interested in hearing what you had in mind regarding this issue, Maru.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a5bd02ec43ebd599e8672bb8a4b3d0750f884a5d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                                   self.temp_dir)"},{"line_number":110,"context_line":"        self.plugin_config \u003d config.ML2Config()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        config_map \u003d collections.OrderedDict("},{"line_number":113,"context_line":"            (x.filename, x) for x in (self.neutron_config, self.plugin_config))"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        self.process_fixture \u003d self.useFixture(ProcessFixture("}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_2d5c3025","line":112,"updated":"2015-03-05 22:39:40.000000000","message":"This seems pretty pointless - why not just pass a list of the config instances and have the callee access the filename directly?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"325aea52f8c16e40c3b0cbf340034abdc2f0e548","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                                   self.temp_dir)"},{"line_number":110,"context_line":"        self.plugin_config \u003d config.ML2Config()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        config_map \u003d collections.OrderedDict("},{"line_number":113,"context_line":"            (x.filename, x) for x in (self.neutron_config, self.plugin_config))"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        self.process_fixture \u003d self.useFixture(ProcessFixture("}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_fec2ce32","line":112,"in_reply_to":"9a80dd14_2d5c3025","updated":"2015-03-18 09:18:39.000000000","message":"Done","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"21dbf308539aa797ad99cbc20bed80f16c203880","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        ))"},{"line_number":122,"context_line":"        # ProcessFixture will ensure that the server has started, but"},{"line_number":123,"context_line":"        # that doesn\u0027t mean that the server will be serving commands yet."},{"line_number":124,"context_line":"        utils.wait_until_true(self.server_is_live)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @property"},{"line_number":127,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_7a95013f","line":124,"updated":"2015-03-16 16:57:52.000000000","message":"This simply *won\u0027t* be good enough with multiple agents. Since agents have their own (sometime drastic) initialization process, we should also wait until all the agents are ready - which is why the original code possessed an \u0027agent-list\u0027 waiter - this specifically waited until all the agents were reporting themselves up.\n\nThe current code might work for simply waiting until neutron-server starts, but trial and error showed that, for example, creating a port before any OVS agents are up will simply do nothing. The above explanation and solution prevented this.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b505dde35983efb6553e8222d909acad8802f942","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @property"},{"line_number":127,"context_line":"    def client(self):"},{"line_number":128,"context_line":"        return get_client(self.neutron_config.DEFAULT.bind_port)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def server_is_live(self):"},{"line_number":131,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_7ed96c82","line":128,"updated":"2015-03-06 00:10:01.000000000","message":"if we want that self.neutron_config behaves like a oslo.config.cfg.CONF, we should try return self.neutron_config.DEFAULT.Y when self.neutron_config.Y is requested?","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"325aea52f8c16e40c3b0cbf340034abdc2f0e548","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @property"},{"line_number":127,"context_line":"    def client(self):"},{"line_number":128,"context_line":"        return get_client(self.neutron_config.DEFAULT.bind_port)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def server_is_live(self):"},{"line_number":131,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_7e0b3e7d","line":128,"in_reply_to":"9a80dd14_5a9d9d58","updated":"2015-03-18 09:18:39.000000000","message":"This will create too much code complication for now (need to be aware of configurations, look into all of them...). This can probably be done later on if needed.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"21dbf308539aa797ad99cbc20bed80f16c203880","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @property"},{"line_number":127,"context_line":"    def client(self):"},{"line_number":128,"context_line":"        return get_client(self.neutron_config.DEFAULT.bind_port)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def server_is_live(self):"},{"line_number":131,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_5a9d9d58","line":128,"in_reply_to":"9a80dd14_7ed96c82","updated":"2015-03-16 16:57:52.000000000","message":"This is a good suggestion. Will look into this.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"112bae586a9b92e0be0dd461b0b0ea5a4d9c9011","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def server_is_live(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            self.client.list_networks()"},{"line_number":133,"context_line":"            return True"},{"line_number":134,"context_line":"        except nc_exc.NeutronClientException:"},{"line_number":135,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_53bd50b6","line":132,"updated":"2015-03-06 21:49:39.000000000","message":"I wonder if ext-list is more \u0027fool-proof\u0027 but we barf at such a basic command then we\u0027re in trouble anyway","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"5c914ed612930dabd63967399ddb2dabef82ef89","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def server_is_live(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            self.client.list_networks()"},{"line_number":133,"context_line":"            return True"},{"line_number":134,"context_line":"        except nc_exc.NeutronClientException:"},{"line_number":135,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a80dd14_548b6467","line":132,"in_reply_to":"9a80dd14_53bd50b6","updated":"2015-03-08 15:51:33.000000000","message":"Why did you choose list_networks() here and not list_agents()? list_networks() might not indicate that all the agents are \"ready for action\", only that the neutron-server is up for action. Please see previous patchsets specifically discussing this issue here.","commit_id":"8da5487a4f81f8d3fdca71a1c5e61b12a0721ad3"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_98da8ae6","line":1,"updated":"2015-03-25 23:56:34.000000000","message":"Unfortunately we can\u0027t name modules \u0027fixtures\u0027 without conflicting with the fixtures library.  I added a \u0027neutron_\u0027 prefix to differentiate, but I\u0027ve since realized that prefixing with the module name is preferable and ensures that fixtures in different packages are distinguishable.  So, neutron_fixtures -\u003e fullstack_fixtures please.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_cf118c53","line":1,"in_reply_to":"1a6ced46_98da8ae6","updated":"2015-03-26 13:25:50.000000000","message":"Done","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"}],"neutron/tests/fullstack/neutron_resources.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a80dd14_1ae2c09f","line":1,"updated":"2015-03-25 23:56:34.000000000","message":"I named neutron_fixtures because \u0027fixtures\u0027 conflicts with the \u0027fixtures\u0027 library.  I don\u0027t think there is a reason to name this module in the same pattern since no import is conflicting.  So neutron_resources -\u003e resources","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_2f65c01d","line":1,"in_reply_to":"9a80dd14_1ae2c09f","updated":"2015-03-26 13:25:50.000000000","message":"Actually this file isn\u0027t needed now that we don\u0027t use testresources...","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"383b13896b3d743567506dc1fcdb53113f9ec745","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"\"\"This extends upon a resource class used internally by oslo.db."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Alongside _resources_for_driver from BaseFullStackTestCase, we insert"},{"line_number":38,"context_line":"    this resource instead to manage the databases.. This allows us to create"},{"line_number":39,"context_line":"    the tables we need for Neutron processes to run, and reverts oslo.db\u0027s"},{"line_number":40,"context_line":"    changes for isDirty - The change below allows us to selectively choose"},{"line_number":41,"context_line":"    whether or not to recreate the database and tables after each test."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6ced46_12602400","line":38,"updated":"2015-03-26 12:46:12.000000000","message":"nit: double period.","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ed43ad63ace8f2d9d5d39df2cc46be47e2e85d7a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"\"\"This extends upon a resource class used internally by oslo.db."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Alongside _resources_for_driver from BaseFullStackTestCase, we insert"},{"line_number":38,"context_line":"    this resource instead to manage the databases.. This allows us to create"},{"line_number":39,"context_line":"    the tables we need for Neutron processes to run, and reverts oslo.db\u0027s"},{"line_number":40,"context_line":"    changes for isDirty - The change below allows us to selectively choose"},{"line_number":41,"context_line":"    whether or not to recreate the database and tables after each test."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6ced46_3dbc1106","line":38,"in_reply_to":"1a6ced46_12602400","updated":"2015-03-26 13:25:27.000000000","message":"This file will be erased in the next patchset but thanks for the read :)","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"}],"neutron/tests/fullstack/resources.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        # Make sure the naming scheme is unique in the fixtures."},{"line_number":32,"context_line":"        fixtures_names \u003d [fixture.name for fixture in self.fixtures]"},{"line_number":33,"context_line":"        if len(list(fixtures_names)) !\u003d len(set(fixtures_names)):"},{"line_number":34,"context_line":"            raise ValueError(\"The fixtures names should be unique!\")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __iter__(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_f50b5a7a","line":33,"updated":"2015-02-05 16:27:47.000000000","message":"Is fixture name so important?  Consider determining the name automatically and requiring manual intervention when clashes occur.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        # Make sure the naming scheme is unique in the fixtures."},{"line_number":32,"context_line":"        fixtures_names \u003d [fixture.name for fixture in self.fixtures]"},{"line_number":33,"context_line":"        if len(list(fixtures_names)) !\u003d len(set(fixtures_names)):"},{"line_number":34,"context_line":"            raise ValueError(\"The fixtures names should be unique!\")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __iter__(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_7e14a7e8","line":33,"in_reply_to":"da86d52c_f50b5a7a","updated":"2015-02-05 17:19:46.000000000","message":"The name is important for future, in-test reference. Basically we should be able to do something like:\n\n self.processes[\u0027neutron-l3-1\u0027].conf...\n self.processes[\u0027neutron-l3-2\u0027].restart()\n\nThe \u0027name\u0027 attribute is the key we use, so if it\u0027s randomly generated the tests will be much less readable and maintainable.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def start(self):"},{"line_number":88,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":89,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":90,"context_line":"        cmd \u003d [\u0027python\u0027,"},{"line_number":91,"context_line":"               \u0027-c\u0027, \u0027from %s import main; main()\u0027 % self.module,"},{"line_number":92,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":93,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_d59bb615","line":90,"updated":"2015-02-05 16:27:47.000000000","message":"I\u0027m assuming this is a legacy of your previous approach.  I think it makes more sense to target executables directly instead of modules.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc542e4f231994c4e17007a2c00012a1b2f1ea25","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def start(self):"},{"line_number":88,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":89,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":90,"context_line":"        cmd \u003d [\u0027python\u0027,"},{"line_number":91,"context_line":"               \u0027-c\u0027, \u0027from %s import main; main()\u0027 % self.module,"},{"line_number":92,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":93,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_feadf79b","line":90,"in_reply_to":"da86d52c_d59bb615","updated":"2015-02-05 17:19:46.000000000","message":"This is intentional. I encountered some VersionConflict issues with the latest codebase and didn\u0027t have enough time to plow through them. This is a temporary workaround which will be changed.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def start(self):"},{"line_number":88,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":89,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":90,"context_line":"        cmd \u003d [\u0027python\u0027,"},{"line_number":91,"context_line":"               \u0027-c\u0027, \u0027from %s import main; main()\u0027 % self.module,"},{"line_number":92,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":93,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_c1d4efbe","line":90,"in_reply_to":"da86d52c_feadf79b","updated":"2015-02-25 14:48:02.000000000","message":"This is still here as I didn\u0027t have time to investigate this further. Either way it can be fixed in a followup patch if worse comes to worst.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":93,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"},{"line_number":94,"context_line":"               \u0027--config-file\u0027, self.core_config.path,"},{"line_number":95,"context_line":"               \u0027--config-file\u0027, self.plugin_config.path]"},{"line_number":96,"context_line":"        self.process \u003d async_process.AsyncProcess(cmd)"},{"line_number":97,"context_line":"        self.process.start()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_15d46ebb","line":96,"updated":"2015-02-05 16:27:47.000000000","message":"We\u0027re going to need to use the root helper here.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":93,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"},{"line_number":94,"context_line":"               \u0027--config-file\u0027, self.core_config.path,"},{"line_number":95,"context_line":"               \u0027--config-file\u0027, self.plugin_config.path]"},{"line_number":96,"context_line":"        self.process \u003d async_process.AsyncProcess(cmd)"},{"line_number":97,"context_line":"        self.process.start()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_012447c3","line":96,"in_reply_to":"da86d52c_15d46ebb","updated":"2015-02-25 14:48:02.000000000","message":"I disagree. This here is used strictly to run Neutron processes, which should be able to run as non-root. Why would we need root here?","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def create_patch_port(self, source, destination):"},{"line_number":144,"context_line":"        source_name \u003d sub_base.get_rand_name("},{"line_number":145,"context_line":"            prefix\u003d\"patch-\", max_length\u003d13)"},{"line_number":146,"context_line":"        destination_name \u003d sub_base.get_rand_name("},{"line_number":147,"context_line":"            prefix\u003d\"patch-\", max_length\u003d13)"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_1570eeda","line":145,"updated":"2015-02-05 16:27:47.000000000","message":"13 -\u003e magic number?  I\u0027m assuming there is a constant for linux device max name length.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def create_patch_port(self, source, destination):"},{"line_number":144,"context_line":"        source_name \u003d sub_base.get_rand_name("},{"line_number":145,"context_line":"            prefix\u003d\"patch-\", max_length\u003d13)"},{"line_number":146,"context_line":"        destination_name \u003d sub_base.get_rand_name("},{"line_number":147,"context_line":"            prefix\u003d\"patch-\", max_length\u003d13)"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_5ceb8412","line":145,"in_reply_to":"da86d52c_1570eeda","updated":"2015-02-25 14:48:02.000000000","message":"Done.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        super(ProcessGroupFixture, self).__init__()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        self.test_name \u003d test_name"},{"line_number":33,"context_line":"        self.connection \u003d connection"},{"line_number":34,"context_line":"        self.processes \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __iter__(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_811adec3","line":33,"updated":"2015-02-26 00:10:19.000000000","message":"This appears to be unused","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        super(ProcessGroupFixture, self).__init__()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        self.test_name \u003d test_name"},{"line_number":33,"context_line":"        self.connection \u003d connection"},{"line_number":34,"context_line":"        self.processes \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __iter__(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_1cb8fe28","line":33,"in_reply_to":"ba7be1f8_811adec3","updated":"2015-02-26 17:29:19.000000000","message":"It is used by inheriting classes. See test_sanity for an example.\n\nBasically this contains the database connection string assigned by the framework, and the processes (or at least the configuration creator) needs to be aware of that string.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def setUp(self, processes\u003dNone):"},{"line_number":41,"context_line":"        super(ProcessGroupFixture, self).setUp()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.processes \u003d processes"},{"line_number":44,"context_line":"        if not self.processes:  # Make sure \u0027iter\u0027 is never broken"},{"line_number":45,"context_line":"            self.processes \u003d []"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_4152a667","line":43,"updated":"2015-02-26 00:10:19.000000000","message":"Given that self.processes defaults to [] on line 34, the following change is suggested:\n\nif processes:\n  self.processes \u003d processes","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def setUp(self, processes\u003dNone):"},{"line_number":41,"context_line":"        super(ProcessGroupFixture, self).setUp()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.processes \u003d processes"},{"line_number":44,"context_line":"        if not self.processes:  # Make sure \u0027iter\u0027 is never broken"},{"line_number":45,"context_line":"            self.processes \u003d []"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_9c7b0e7a","line":43,"in_reply_to":"ba7be1f8_4152a667","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            self.processes \u003d []"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # Make sure the naming scheme is unique."},{"line_number":48,"context_line":"        processes_names \u003d [process.name for process in self.processes]"},{"line_number":49,"context_line":"        if len(list(processes_names)) !\u003d len(set(processes_names)):"},{"line_number":50,"context_line":"            raise ValueError(\"The processes names should be unique!\")"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_81481eb4","line":48,"updated":"2015-02-26 00:10:19.000000000","message":"processes_names \u003d\u003e process_names","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            self.processes \u003d []"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # Make sure the naming scheme is unique."},{"line_number":48,"context_line":"        processes_names \u003d [process.name for process in self.processes]"},{"line_number":49,"context_line":"        if len(list(processes_names)) !\u003d len(set(processes_names)):"},{"line_number":50,"context_line":"            raise ValueError(\"The processes names should be unique!\")"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_bcf532ee","line":48,"in_reply_to":"ba7be1f8_81481eb4","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            process.setUp()"},{"line_number":54,"context_line":"        self.addCleanup(self.cleanUp)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def cleanUp(self):"},{"line_number":57,"context_line":"        for process in self.processes:"},{"line_number":58,"context_line":"            process.cleanUp()"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_a1bfe25f","line":56,"updated":"2015-02-26 00:10:19.000000000","message":"According to the docs for Fixture.cleanUp, it should not be overridden.  This method should be renamed and line 54 updated accordingly.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            process.setUp()"},{"line_number":54,"context_line":"        self.addCleanup(self.cleanUp)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def cleanUp(self):"},{"line_number":57,"context_line":"        for process in self.processes:"},{"line_number":58,"context_line":"            process.cleanUp()"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_6da4e6b9","line":56,"in_reply_to":"ba7be1f8_a1bfe25f","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            process.cleanUp()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def find(self, name):"},{"line_number":61,"context_line":"        \"\"\"Get a Processprocess with \u0027name\u0027, or None if it doesn\u0027t exist.\"\"\""},{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            return next(process for process in self.processes"},{"line_number":64,"context_line":"                        if process.name \u003d\u003d name)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_e1b55a7e","line":61,"updated":"2015-02-26 00:10:19.000000000","message":"Get -\u003e Find ?\n\nProcessprocess \u003d\u003e process","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            process.cleanUp()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def find(self, name):"},{"line_number":61,"context_line":"        \"\"\"Get a Processprocess with \u0027name\u0027, or None if it doesn\u0027t exist.\"\"\""},{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            return next(process for process in self.processes"},{"line_number":64,"context_line":"                        if process.name \u003d\u003d name)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_5cd3565f","line":61,"in_reply_to":"ba7be1f8_e1b55a7e","updated":"2015-02-26 17:29:19.000000000","message":"Processprocess \u003d\u003e ProcessFixture (sed gone wrong).\n\nGet -\u003e Find.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        super(ProcessFixture, self).setUp()"},{"line_number":89,"context_line":"        self.start()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def cleanUp(self):"},{"line_number":92,"context_line":"        super(ProcessFixture, self).cleanUp()"},{"line_number":93,"context_line":"        self.stop()"},{"line_number":94,"context_line":"        self.core_config.close()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_ccd6cd4e","line":91,"updated":"2015-02-26 00:10:19.000000000","message":"As per a previous comment, cleanUp should not be overridden, so this method needs to be renamed and registered in setUp via addCleanup.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        super(ProcessFixture, self).setUp()"},{"line_number":89,"context_line":"        self.start()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def cleanUp(self):"},{"line_number":92,"context_line":"        super(ProcessFixture, self).cleanUp()"},{"line_number":93,"context_line":"        self.stop()"},{"line_number":94,"context_line":"        self.core_config.close()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_8da75abc","line":91,"in_reply_to":"ba7be1f8_ccd6cd4e","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    def cleanUp(self):"},{"line_number":92,"context_line":"        super(ProcessFixture, self).cleanUp()"},{"line_number":93,"context_line":"        self.stop()"},{"line_number":94,"context_line":"        self.core_config.close()"},{"line_number":95,"context_line":"        self.plugin_config.close()"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_cc888d73","line":94,"updated":"2015-02-26 00:10:19.000000000","message":"The need to close a configuration file whose configuration the fixture should own feels wrong to me.  As per my comment in templates.py, I think the config templates as written are still unnecessarily complicated.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":99,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":100,"context_line":"        cmd \u003d [\u0027python\u0027,"},{"line_number":101,"context_line":"               \u0027-c\u0027, \u0027from %s import main; main()\u0027 % self.module,"},{"line_number":102,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":103,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"},{"line_number":104,"context_line":"               \u0027--config-file\u0027, self.core_config.path,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_21a692ae","line":101,"updated":"2015-02-26 00:10:19.000000000","message":"It shouldn\u0027t be necessary to use module paths when binaries already exist.  Aren\u0027t the functional tests already doing this?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        prefix \u003d \"%s--%s\" % (self.test_name, self.name)"},{"line_number":99,"context_line":"        fmt \u003d prefix + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":100,"context_line":"        cmd \u003d [\u0027python\u0027,"},{"line_number":101,"context_line":"               \u0027-c\u0027, \u0027from %s import main; main()\u0027 % self.module,"},{"line_number":102,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":103,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"},{"line_number":104,"context_line":"               \u0027--config-file\u0027, self.core_config.path,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_72b921cb","line":101,"in_reply_to":"ba7be1f8_21a692ae","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":101,"context_line":"               \u0027-c\u0027, \u0027from %s import main; main()\u0027 % self.module,"},{"line_number":102,"context_line":"               \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"},{"line_number":103,"context_line":"               \u0027--log-file\u0027, timeutils.strtime(fmt\u003dfmt),"},{"line_number":104,"context_line":"               \u0027--config-file\u0027, self.core_config.path,"},{"line_number":105,"context_line":"               \u0027--config-file\u0027, self.plugin_config.path]"},{"line_number":106,"context_line":"        self.process \u003d async_process.AsyncProcess(cmd)"},{"line_number":107,"context_line":"        self.process.start()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_6c5401ca","line":104,"updated":"2015-02-26 00:10:19.000000000","message":"Given that different daemons are going to require different config, consider accepting a parameter called \u0027config_files\u0027 to the start() method instead of hard-coding here.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def stop(self):"},{"line_number":110,"context_line":"        self.process.stop()"},{"line_number":111,"context_line":"        helpers.wait_until_true("},{"line_number":112,"context_line":"            lambda: utils.find_child_pids(self.process.pid) \u003d\u003d [])"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def restart(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_8c8a1562","line":111,"updated":"2015-02-26 00:10:19.000000000","message":"Consider performing the waiting in stop() if an optional parameter block\u003dTrue.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def stop(self):"},{"line_number":110,"context_line":"        self.process.stop()"},{"line_number":111,"context_line":"        helpers.wait_until_true("},{"line_number":112,"context_line":"            lambda: utils.find_child_pids(self.process.pid) \u003d\u003d [])"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def restart(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_d2e9edb7","line":111,"in_reply_to":"ba7be1f8_8c8a1562","updated":"2015-02-26 17:29:19.000000000","message":"Done","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.start()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"class BridgeFixture(fixtures.Fixture):"},{"line_number":120,"context_line":"    def __init__(self, name):"},{"line_number":121,"context_line":"        super(BridgeFixture, self).__init__()"},{"line_number":122,"context_line":"        self.name \u003d name"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_ec0b917a","line":119,"updated":"2015-02-26 00:10:19.000000000","message":"This appears to be unused?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"class BridgeFixture(fixtures.Fixture):"},{"line_number":120,"context_line":"    def __init__(self, name):"},{"line_number":121,"context_line":"        super(BridgeFixture, self).__init__()"},{"line_number":122,"context_line":"        self.name \u003d name"},{"line_number":123,"context_line":"        self.ovs_bridge \u003d None"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_c18e962d","line":120,"updated":"2015-02-26 00:10:19.000000000","message":"Consider defaulting the name to be randomly generated so that tests have one less thing to worry about.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.addCleanup(self.ovs_bridge.destroy)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class OVSProcessFixture(ProcessFixture):"},{"line_number":133,"context_line":"    def __init__(self, test_name, name, module,"},{"line_number":134,"context_line":"                 core_config, plugin_config,"},{"line_number":135,"context_line":"                 meta_bridge_name, is_agent\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_8c43f5ad","line":132,"updated":"2015-02-26 00:10:19.000000000","message":"This appears to be unused?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self.useFixture(br_phys_fixture)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        br_phys \u003d br_phys_fixture.ovs_bridge"},{"line_number":148,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name)"},{"line_number":149,"context_line":"        self.create_patch_port(br_phys, br_meta)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def create_patch_port(self, source, destination):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_2c23e956","line":148,"updated":"2015-02-26 00:10:19.000000000","message":"What\u0027s the purpose of the \u0027meta\u0027 bridge?","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self.useFixture(br_phys_fixture)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        br_phys \u003d br_phys_fixture.ovs_bridge"},{"line_number":148,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name)"},{"line_number":149,"context_line":"        self.create_patch_port(br_phys, br_meta)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def create_patch_port(self, source, destination):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_0dc8ca53","line":148,"in_reply_to":"ba7be1f8_2c23e956","updated":"2015-02-26 17:29:19.000000000","message":"Basically, if we have multiple OVS agents, each should have his own \"physical bridge\" (like br-eth) dummy. Since we probably want them to have connectivity, a br-meta bridge is added and all these interfaces are connected to them.\n\nAdded a comment to make this clearer.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        destination.add_patch_port(destination_name, source_name)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_br_int_name(self):"},{"line_number":161,"context_line":"        return self.plugin_config.get(\u0027ovs\u0027, \u0027integration_bridge\u0027)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _get_br_phys_name(self):"},{"line_number":164,"context_line":"        return self.plugin_config.get(\u0027ovs\u0027, \u0027bridge_mappings\u0027).split(\u0027:\u0027)[1]"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_4c665dee","line":161,"updated":"2015-02-26 00:10:19.000000000","message":"It doesn\u0027t make much sense to me why the fixture wouldn\u0027t know about the configuration value.  The way I see it, the configuration value is owned by the fixture.  The fact that it needs to be written to be used by a daemon is an orthogonal.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"983dc871e8474d3f6f47f9b6fd2685df92b121ee","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.process.start()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def stop(self, block\u003dTrue):"},{"line_number":111,"context_line":"        self.process.stop()"},{"line_number":112,"context_line":"        if block:"},{"line_number":113,"context_line":"            utils.wait_until_true("},{"line_number":114,"context_line":"                lambda: utils.find_child_pids(self.process.pid) \u003d\u003d [])"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_bd2d50aa","line":111,"updated":"2015-03-04 02:29:20.000000000","message":"I think you\u0027ll want to rebase on Assaf\u0027s patch that allows stop() to block natively:\n\nhttps://review.openstack.org/#/c/158097","commit_id":"3956be26cb1c6a10c469ed61e3a4237fb51a2d50"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"983dc871e8474d3f6f47f9b6fd2685df92b121ee","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def setUp(self):"},{"line_number":143,"context_line":"        \"\"\"Create the necessary interfaces for the OVS agent."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        In case we have multiple OVS agents, each will have its own \"physical"},{"line_number":146,"context_line":"        bridge\" (equivalent to br-eth). If we want them to have connectivity"},{"line_number":147,"context_line":"        between them, we have to connect them to some shared bridge - this is"},{"line_number":148,"context_line":"        the br-meta bridge."}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_00027309","line":145,"updated":"2015-03-04 02:29:20.000000000","message":"It\u0027s fine to add docs, but the code itself would benefit from being more clear.  \u0027meta_br\u0027 isn\u0027t exactly an informative name.","commit_id":"3956be26cb1c6a10c469ed61e3a4237fb51a2d50"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"983dc871e8474d3f6f47f9b6fd2685df92b121ee","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        self.useFixture(br_phys_fixture)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        br_phys \u003d br_phys_fixture.ovs_bridge"},{"line_number":157,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name)"},{"line_number":158,"context_line":"        self.create_patch_port(br_phys, br_meta)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def create_patch_port(self, source, destination):"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_600b2f24","line":157,"updated":"2015-03-04 02:29:20.000000000","message":"So, what cleans up the metabridge?  I think you\u0027re going to want cross-test fixtures managed via testresources: \n\nhttps://pypi.python.org/pypi/testresources","commit_id":"3956be26cb1c6a10c469ed61e3a4237fb51a2d50"}],"neutron/tests/fullstack/templates.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"32567d7e9b5d30df83807ddc4c8ac9302fe34882","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.tests import sub_base"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class Template(object):"},{"line_number":27,"context_line":"    TEMPLATE_VARS \u003d None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, tempdir, filename):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_b802b707","line":26,"updated":"2015-02-05 16:27:47.000000000","message":"I question the value of having to maintain templates separate from the in-repo samples in etc/.  Is there a reason not to prefer regex-based modification of those samples?\n\nIn a perfect world those samples would be generated anyway - I think that\u0027s the case in other projects.  Maybe it\u0027s worth investigating what kind of generation mechanism those projects are using to see if we can\u0027t kill 2 birds with one stone?","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.tests import sub_base"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class Template(object):"},{"line_number":27,"context_line":"    TEMPLATE_VARS \u003d None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, tempdir, filename):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba7be1f8_9c397cf4","line":26,"in_reply_to":"da86d52c_b802b707","updated":"2015-02-25 14:48:02.000000000","message":"I\u0027ve switched to using ConfigParser to read the sample files and produce separate configuration files for our use. As a result this code here changed quite a bit so a thorough review will be appreciated.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Template(object):"},{"line_number":28,"context_line":"    TEMPLATE_VARS \u003d None"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, tempdir, filename):"},{"line_number":31,"context_line":"        self.tempdir \u003d tempdir"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_61540aca","line":28,"updated":"2015-02-26 00:10:19.000000000","message":"Why is this a class variable?  Consider simply passing it as an argument to __init__.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        if getattr(self, \u0027TEMPLATE_VARS\u0027, None) is None:"},{"line_number":34,"context_line":"            self.TEMPLATE_VARS \u003d {}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        self.sample_config_path \u003d c_helpers.find_sample_file(filename)"},{"line_number":37,"context_line":"        self.prefix \u003d \"%s.\" % filename  # Prefix to use for tmp files."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        self.config_parser \u003d configparser.SafeConfigParser()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_8699147b","line":36,"updated":"2015-02-26 00:10:19.000000000","message":"Why is it necessary to use the sample file as a baseline?  That would seem like an unnecessary dependency.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        if getattr(self, \u0027TEMPLATE_VARS\u0027, None) is None:"},{"line_number":34,"context_line":"            self.TEMPLATE_VARS \u003d {}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        self.sample_config_path \u003d c_helpers.find_sample_file(filename)"},{"line_number":37,"context_line":"        self.prefix \u003d \"%s.\" % filename  # Prefix to use for tmp files."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        self.config_parser \u003d configparser.SafeConfigParser()"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_0e8fe175","line":36,"in_reply_to":"ba7be1f8_8699147b","updated":"2015-02-26 17:29:19.000000000","message":"It isn\u0027t. removed.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.config_parser \u003d configparser.SafeConfigParser()"},{"line_number":40,"context_line":"        self.config_parser.read(self.sample_config_path)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self._generate()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _generate(self):"},{"line_number":45,"context_line":"        for section in self.TEMPLATE_VARS.keys():"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_61f08ac9","line":42,"updated":"2015-02-26 00:10:19.000000000","message":"Generating data onto the disk on __init__?  This would make testing very complicated.  In general, try to avoid performing anything more than variable init in __init__.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d751a7b9261c13783c3af772221e45ef9b6211d8","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.config_parser \u003d configparser.SafeConfigParser()"},{"line_number":40,"context_line":"        self.config_parser.read(self.sample_config_path)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self._generate()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _generate(self):"},{"line_number":45,"context_line":"        for section in self.TEMPLATE_VARS.keys():"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_8e0bd17b","line":42,"in_reply_to":"ba7be1f8_61f08ac9","updated":"2015-02-26 17:29:19.000000000","message":"Done.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"22ea579e806aea34c175b0818d7840881698420d","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def close(self):"},{"line_number":100,"context_line":"        if self.state_path and os.path.exists(self.state_path):"},{"line_number":101,"context_line":"            shutil.rmtree(self.state_path)"},{"line_number":102,"context_line":"        super(NeutronConfTemplate, self).close()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _generate_host(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba7be1f8_c6bcecbd","line":101,"updated":"2015-02-26 00:10:19.000000000","message":"Why does a configuration template have responsibility for cleaning up the state path?  Or generating one, for that matter?  Or writing the configuration file to disk?  Consider ensuring a cleaner separation here:\n\n - \u0027template\u0027 takes arguments and can return an iterator of the lines of the resulting configuration file\n - \u0027fixture\u0027 knows how to generate the arguments required by the template, can instantiate the template, and write the template output to disk\n\nThe idea is to break things up so that they can be considered in isolation and tested (yes, I did say tested).  In its current form it is going to be very difficult to validate this class without mocking.","commit_id":"18f627bf0a2231425201be03a1e1b7023ea41dda"}],"neutron/tests/fullstack/test_sanity.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_sanity(self):"},{"line_number":25,"context_line":"        self.assertEqual(self.client.list_networks(), {\u0027networks\u0027: []})"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def test_sanity2(self):"},{"line_number":28,"context_line":"        self.assertEqual(self.client.list_networks(), {\u0027networks\u0027: []})"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_0cd55842","line":26,"updated":"2015-03-26 16:14:55.000000000","message":"?","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_sanity(self):"},{"line_number":25,"context_line":"        self.assertEqual(self.client.list_networks(), {\u0027networks\u0027: []})"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def test_sanity2(self):"},{"line_number":28,"context_line":"        self.assertEqual(self.client.list_networks(), {\u0027networks\u0027: []})"}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_5f58a456","line":26,"in_reply_to":"fa963961_0cd55842","updated":"2015-03-26 16:55:37.000000000","message":"Done","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"}],"neutron/tests/functional/__init__.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b5e21c02112aadc1cf6d67a6aaccee561ce6dd70","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_b89106f3","line":1,"updated":"2015-03-25 23:56:34.000000000","message":"I was initially resistant to this approach, but after some time to think about it I\u0027ve come to the conclusion that logically partitioning the test tree according to the type of test and aggregating at discovery time makes perfect sense.","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ccd88e4d7dafcd86bb3a243d0ad1b2e798792555","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":38,"id":"1a6ced46_947fa965","line":1,"in_reply_to":"1a6ced46_b89106f3","updated":"2015-03-26 13:25:50.000000000","message":":) :) :)","commit_id":"2a565a7eebaa28b2bd92244738aaf1d58196d254"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"383b13896b3d743567506dc1fcdb53113f9ec745","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    suite.addTests(tests)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    loader \u003d unittest.loader.TestLoader()"},{"line_number":28,"context_line":"    suite.addTests(_discover(loader, \"./neutron/tests/functional\", pattern))"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    if os.getenv(\u0027OS_RUN_FULLSTACK\u0027) \u003d\u003d \u00271\u0027:"},{"line_number":31,"context_line":"        suite.addTests(_discover(loader, \"./neutron/tests/fullstack\", pattern))"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6ced46_f23e28d9","line":28,"updated":"2015-03-26 12:46:12.000000000","message":"Is the intent to run tests under functional area, when doing dsvm-fullstack, or should this be conditional?","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ed43ad63ace8f2d9d5d39df2cc46be47e2e85d7a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    suite.addTests(tests)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    loader \u003d unittest.loader.TestLoader()"},{"line_number":28,"context_line":"    suite.addTests(_discover(loader, \"./neutron/tests/functional\", pattern))"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    if os.getenv(\u0027OS_RUN_FULLSTACK\u0027) \u003d\u003d \u00271\u0027:"},{"line_number":31,"context_line":"        suite.addTests(_discover(loader, \"./neutron/tests/fullstack\", pattern))"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6ced46_7d6049a5","line":28,"in_reply_to":"1a6ced46_f23e28d9","updated":"2015-03-26 13:25:27.000000000","message":"The intent is that if we\u0027re running the test discovery mechanism under neutron/tests/functional (dsvm-functional for example), then it should always discover all the functional tests. If the OS_RUN_FULLSTACK flag is on, then we should additionally discover fullstack tests. This is to avoid adding a new gate job specifically for this.\n\ndsvm-fullstack runs the discovery under neutron/tests/fullstack so it won\u0027t even enter this code. This code makes sure that when running dsvm-functional, fullstack tests are also ran (for the above reason).\n\n\u0027tox -e functional\u0027 however won\u0027t run fullstack tests.","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9b547886292d4100bf14a97e493fafde0ec052e9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import unittest"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_2c37fcb1","line":14,"updated":"2015-03-26 16:14:55.000000000","message":"Perhaps a module level docstring that explains why all of this code exists.","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"2f4a890530ef53f6898c65a93b039e8d4891af24","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import unittest"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"fa963961_5f81c48e","line":14,"in_reply_to":"fa963961_2c37fcb1","updated":"2015-03-26 16:55:37.000000000","message":"Done","commit_id":"ee8413cfd2a73689a223ed24b892baae4797d367"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"e8e7a33e94bee4021ced31e38608c29e46b3f3c1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"framework, and instead discover tests that are present in"},{"line_number":20,"context_line":"./neutron/tests/fullstack."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"In short, running \u0027tox -e dsvm-functional\u0027 now runs both functional tests and"},{"line_number":23,"context_line":"full-stack tests, and this code makes allows for the test discovery needed."},{"line_number":24,"context_line":"\"\"\""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"fa963961_5d178ced","line":22,"updated":"2015-03-26 17:11:48.000000000","message":"makes allows","commit_id":"b64c50bce81a786dcd55c4835d9ff783e4d1adbb"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0a9a0ea23db5c6e4e49bd449e42ac5c623711ec1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"framework, and instead discover tests that are present in"},{"line_number":20,"context_line":"./neutron/tests/fullstack."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"In short, running \u0027tox -e dsvm-functional\u0027 now runs both functional tests and"},{"line_number":23,"context_line":"full-stack tests, and this code makes allows for the test discovery needed."},{"line_number":24,"context_line":"\"\"\""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"fa963961_1df34475","line":22,"in_reply_to":"fa963961_5d178ced","updated":"2015-03-26 17:21:47.000000000","message":"Done","commit_id":"b64c50bce81a786dcd55c4835d9ff783e4d1adbb"}],"neutron/tests/integration/base.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# into one during the review process."},{"line_number":46,"context_line":"#TODO(jschwarz): The above patch has removed this code. See about"},{"line_number":47,"context_line":"# https://review.openstack.org/#/c/126175"},{"line_number":48,"context_line":"class BaseDBTest(base.BaseTestCase):"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":"    Base class for tests that aim to test the interaction with the"},{"line_number":51,"context_line":"    database in a way as similar as possible to the real world scenario."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_6cda6c4c","line":48,"updated":"2014-12-21 05:47:46.000000000","message":"Please switch to using oslo.db\u0027s test_base module [1] to manage db fixture. \n\nhttps://github.com/openstack/oslo.db/blob/master/oslo/db/sqlalchemy/test_base.py","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# into one during the review process."},{"line_number":46,"context_line":"#TODO(jschwarz): The above patch has removed this code. See about"},{"line_number":47,"context_line":"# https://review.openstack.org/#/c/126175"},{"line_number":48,"context_line":"class BaseDBTest(base.BaseTestCase):"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":"    Base class for tests that aim to test the interaction with the"},{"line_number":51,"context_line":"    database in a way as similar as possible to the real world scenario."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_4d3292f3","line":48,"in_reply_to":"3a961159_6cda6c4c","updated":"2014-12-29 16:13:50.000000000","message":"Whoo, that took a while to migrate. I had to create a few functions to support this, so please take another look at this.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fd9695ad1157838d67947a6c058e1317ed0cb61b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests.functional.agent.linux import helpers"},{"line_number":21,"context_line":"from neutron.tests.integration import resources"},{"line_number":22,"context_line":"from neutron.tests.unit import testlib_api"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutronclient.common import exceptions as nc_exc"},{"line_number":25,"context_line":"from neutronclient.v2_0 import client"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_973c78c1","line":23,"updated":"2014-12-30 07:46:44.000000000","message":"why new line","commit_id":"72c47ce02c3c7bf582a897ededcdbc8cc607b692"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"fc11cd4134341aa44828cc4239d0584e19aa83c4","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests.functional.agent.linux import helpers"},{"line_number":21,"context_line":"from neutron.tests.integration import resources"},{"line_number":22,"context_line":"from neutron.tests.unit import testlib_api"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutronclient.common import exceptions as nc_exc"},{"line_number":25,"context_line":"from neutronclient.v2_0 import client"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_89f460d0","line":23,"in_reply_to":"3a961159_973c78c1","updated":"2014-12-30 09:11:36.000000000","message":"Done","commit_id":"72c47ce02c3c7bf582a897ededcdbc8cc607b692"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fd9695ad1157838d67947a6c058e1317ed0cb61b","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutronclient.common import exceptions as nc_exc"},{"line_number":25,"context_line":"from neutronclient.v2_0 import client"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# Import all data models from services repositores."},{"line_number":28,"context_line":"from neutron_fwaas.db.firewall import firewall_db  # noqa"},{"line_number":29,"context_line":"from neutron_lbaas.db.loadbalancer import loadbalancer_db  # noqa"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_b7497462","line":26,"updated":"2014-12-30 07:46:44.000000000","message":"ditto","commit_id":"72c47ce02c3c7bf582a897ededcdbc8cc607b692"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"fc11cd4134341aa44828cc4239d0584e19aa83c4","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutronclient.common import exceptions as nc_exc"},{"line_number":25,"context_line":"from neutronclient.v2_0 import client"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# Import all data models from services repositores."},{"line_number":28,"context_line":"from neutron_fwaas.db.firewall import firewall_db  # noqa"},{"line_number":29,"context_line":"from neutron_lbaas.db.loadbalancer import loadbalancer_db  # noqa"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_a9011cb1","line":26,"in_reply_to":"3a961159_b7497462","updated":"2014-12-30 09:11:36.000000000","message":"Done","commit_id":"72c47ce02c3c7bf582a897ededcdbc8cc607b692"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BaseIntegrationTestCase(functional_base.BaseSudoTestCase,"},{"line_number":38,"context_line":"                              testlib_api.SqlTestCase):"},{"line_number":39,"context_line":"    DATABASE_USERNAME \u003d \"openstack_citest\""},{"line_number":40,"context_line":"    DATABASE_PASSWORD \u003d \"openstack_citest\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_29811dc3","line":39,"updated":"2015-01-07 18:12:32.000000000","message":"why not inheriting from MySQLOpportunisticTestCase so you don\u0027t have to hardcode the db credentials and you don\u0027t have to take care of the test DB ? You can see an example regarding how to use MySQLOpportunisticTestCase  here: https://review.openstack.org/#/c/124136 .","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BaseIntegrationTestCase(functional_base.BaseSudoTestCase,"},{"line_number":38,"context_line":"                              testlib_api.SqlTestCase):"},{"line_number":39,"context_line":"    DATABASE_USERNAME \u003d \"openstack_citest\""},{"line_number":40,"context_line":"    DATABASE_PASSWORD \u003d \"openstack_citest\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_cde5a2a5","line":39,"in_reply_to":"3a961159_29811dc3","updated":"2015-01-12 13:30:16.000000000","message":"This wouldn\u0027t work since test_base.DbTestCase doesn\u0027t save instance it creates (it runs \"self.useFixture(self.FIXTURE(self))\", and we need the self.FIXTURE(self) instance), so we can\u0027t find out the database\u0027s name (and thus we can\u0027t override the connection string and run create_all() to create the tables).","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"7dfcfdf3e00d85527dcd9f4fe5c107c0d27f94f9","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BaseIntegrationTestCase(functional_base.BaseSudoTestCase,"},{"line_number":38,"context_line":"                              testlib_api.SqlTestCase):"},{"line_number":39,"context_line":"    DATABASE_USERNAME \u003d \"openstack_citest\""},{"line_number":40,"context_line":"    DATABASE_PASSWORD \u003d \"openstack_citest\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_f0add19c","line":39,"in_reply_to":"3a961159_cde5a2a5","updated":"2015-01-12 13:44:32.000000000","message":"You can get the engine connection string, see https://review.openstack.org/#/c/124136 line 52. Anyway ignore my suggestion. As Maru commented on the linked patch, the problem of the OpportunisticTestCase is that they skip the tests instead of failing if there\u0027s a problem in the DB configuration. Maybe we should consider sending a patch to oslo for that, but for now, I think it\u0027s safer if you ignore my comment and leave the code as it is","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"ce98c590be38ce1e8b72e93400c8be5c7ca38ad0","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BaseIntegrationTestCase(functional_base.BaseSudoTestCase,"},{"line_number":38,"context_line":"                              testlib_api.SqlTestCase):"},{"line_number":39,"context_line":"    DATABASE_USERNAME \u003d \"openstack_citest\""},{"line_number":40,"context_line":"    DATABASE_PASSWORD \u003d \"openstack_citest\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_3d491067","line":39,"in_reply_to":"3a961159_f0add19c","updated":"2015-01-19 16:39:49.000000000","message":"FYI, https://bugs.launchpad.net/oslo.db/+bug/1404093","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        1. Changes the \u0027connection\u0027 option and creates all the DB tables needed"},{"line_number":51,"context_line":"           by Neutron,"},{"line_number":52,"context_line":"        2. Initialize the processes using self.init_processes. The inheriting"},{"line_number":53,"context_line":"           implementaiton must override this function,"},{"line_number":54,"context_line":"        3. Runs the cleanup scripts defined by \u0027self.resource_fixtures\u0027,"},{"line_number":55,"context_line":"        4. Runs the Neutron processes defined by \u0027self.process_fixtures\u0027,"},{"line_number":56,"context_line":"        5. Waits until all the processes are up and running."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_4e458f6d","line":53,"updated":"2015-01-07 18:12:32.000000000","message":"nit: implementation","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        1. Changes the \u0027connection\u0027 option and creates all the DB tables needed"},{"line_number":51,"context_line":"           by Neutron,"},{"line_number":52,"context_line":"        2. Initialize the processes using self.init_processes. The inheriting"},{"line_number":53,"context_line":"           implementaiton must override this function,"},{"line_number":54,"context_line":"        3. Runs the cleanup scripts defined by \u0027self.resource_fixtures\u0027,"},{"line_number":55,"context_line":"        4. Runs the Neutron processes defined by \u0027self.process_fixtures\u0027,"},{"line_number":56,"context_line":"        5. Waits until all the processes are up and running."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_6df66e5f","line":53,"in_reply_to":"3a961159_4e458f6d","updated":"2015-01-12 13:30:16.000000000","message":"Thanks for reading the docstring :)","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def init_processes(self):"},{"line_number":79,"context_line":"        raise NotImplementedError(_(\u0027This method must be overridden\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def create_isolated_database(self):"},{"line_number":82,"context_line":"        \"\"\"Creates a new database and use it for the next test"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        SqlTestCase creates the databases needed by Neutron using the URL"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_696ec530","line":81,"updated":"2015-01-07 18:12:32.000000000","message":"If you use MySQLOpportunisticTestCase you can remove this method","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def init_processes(self):"},{"line_number":79,"context_line":"        raise NotImplementedError(_(\u0027This method must be overridden\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def create_isolated_database(self):"},{"line_number":82,"context_line":"        \"\"\"Creates a new database and use it for the next test"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        SqlTestCase creates the databases needed by Neutron using the URL"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_ad9776ea","line":81,"in_reply_to":"3a961159_696ec530","updated":"2015-01-12 13:30:16.000000000","message":"See previous comment","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"}],"neutron/tests/integration/resources.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"try:  # Python 2.x"},{"line_number":16,"context_line":"    import ConfigParser as configparser"},{"line_number":17,"context_line":"except ImportError:  # Python 3.x"},{"line_number":18,"context_line":"    import configparser  # noqa"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_2cbb04e6","line":15,"updated":"2014-12-21 05:47:46.000000000","message":"When it comes cross-version import compatibility, the \u0027six\u0027 library [1] is the way to go in OpenStack.  In this case, it provides a version-agnostic alias, e.g.\n\nimport six import moves\nmoves.configparser\n\n\n1: http://pythonhosted.org/six/#module-six.moves","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"try:  # Python 2.x"},{"line_number":16,"context_line":"    import ConfigParser as configparser"},{"line_number":17,"context_line":"except ImportError:  # Python 3.x"},{"line_number":18,"context_line":"    import configparser  # noqa"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_2d3c66bf","line":15,"in_reply_to":"3a961159_2cbb04e6","updated":"2014-12-29 16:13:50.000000000","message":"Done. This segment was removed from this file as it wasn\u0027t even used, but the fix is implemented in templates.py.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    import configparser  # noqa"},{"line_number":19,"context_line":"from distutils import spawn"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import eventlet"},{"line_number":22,"context_line":"eventlet.monkey_patch()"},{"line_number":23,"context_line":"import fixtures"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_6cb18c00","line":21,"updated":"2014-12-21 05:47:46.000000000","message":"Why is this necessary?","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    import configparser  # noqa"},{"line_number":19,"context_line":"from distutils import spawn"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import eventlet"},{"line_number":22,"context_line":"eventlet.monkey_patch()"},{"line_number":23,"context_line":"import fixtures"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_2daaa6d2","line":21,"in_reply_to":"3a961159_6cb18c00","updated":"2014-12-29 16:13:50.000000000","message":"It is not. Was under the impression it is needed for every executable, but this has no excuse. Removed from here and all other references in other files.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \"\"\"Get a ProcessFixture with \u0027name\u0027, or None if it doesn\u0027t exist.\"\"\""},{"line_number":68,"context_line":"        try:"},{"line_number":69,"context_line":"            return next(fixture for fixture in self.fixtures"},{"line_number":70,"context_line":"                        if fixture.name \u003d\u003d name)"},{"line_number":71,"context_line":"        except StopIteration:"},{"line_number":72,"context_line":"            return None"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_ecc49c61","line":70,"updated":"2014-12-21 05:47:46.000000000","message":"I\u0027m not sure of the wisdom of this equivalent of sqlalchemy\u0027s .first() - what if multiple processes with the same name exist?  There doesn\u0027t seem to be any limitation in the append() method to prevent this case.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \"\"\"Get a ProcessFixture with \u0027name\u0027, or None if it doesn\u0027t exist.\"\"\""},{"line_number":68,"context_line":"        try:"},{"line_number":69,"context_line":"            return next(fixture for fixture in self.fixtures"},{"line_number":70,"context_line":"                        if fixture.name \u003d\u003d name)"},{"line_number":71,"context_line":"        except StopIteration:"},{"line_number":72,"context_line":"            return None"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_edf6def8","line":70,"in_reply_to":"3a961159_ecc49c61","updated":"2014-12-29 16:13:50.000000000","message":"I removed \u0027append\u0027 since it isn\u0027t used anywhere and made sure it is unique. Creating a property around \u0027fixtures\u0027 seems useless IMO but if you insist I can add it in future revisions.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def agents_count(self):"},{"line_number":78,"context_line":"        \"\"\"Returns how many agents are started using this GroupFixture."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        The expected usage is using a single GroupFixture to initialize all"},{"line_number":81,"context_line":"        processes. One of which needs to be neutron-server, but the rest are"},{"line_number":82,"context_line":"        proper Neutron agents."},{"line_number":83,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_2ca224ae","line":80,"updated":"2014-12-21 05:47:46.000000000","message":"Why don\u0027t the processes instead have metadata identifying them as agent vs non-agent?  The switch to pecan promises to result in separate processes for wsgi and amqp handling that can be scaled independently, so being more flexible is suggested.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def agents_count(self):"},{"line_number":78,"context_line":"        \"\"\"Returns how many agents are started using this GroupFixture."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        The expected usage is using a single GroupFixture to initialize all"},{"line_number":81,"context_line":"        processes. One of which needs to be neutron-server, but the rest are"},{"line_number":82,"context_line":"        proper Neutron agents."},{"line_number":83,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_4deff2e9","line":80,"in_reply_to":"3a961159_2ca224ae","updated":"2014-12-29 16:13:50.000000000","message":"Done - added an \u0027is_agent\u0027 parameter for ProcessFixture.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9ec824af19aa7bd828f9df011fe4b482545b748b","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        pid \u003d self.pm.pid"},{"line_number":130,"context_line":"        self.pm.disable(sig\u003d\u002715\u0027)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        def ensure_process_dead():"},{"line_number":133,"context_line":"            return utils.find_child_pids(pid) \u003d\u003d []"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        helpers.wait_until_true(ensure_process_dead)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_5887c312","line":132,"updated":"2014-12-16 08:32:47.000000000","message":"This can be changed into an anonymous function:\n\n helpers.wait_until_true(lambda: utils.find_child_pids(pid) \u003d\u003d [])","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        pid \u003d self.pm.pid"},{"line_number":130,"context_line":"        self.pm.disable(sig\u003d\u002715\u0027)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        def ensure_process_dead():"},{"line_number":133,"context_line":"            return utils.find_child_pids(pid) \u003d\u003d []"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        helpers.wait_until_true(ensure_process_dead)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_0d932a5d","line":132,"in_reply_to":"3a961159_5887c312","updated":"2014-12-29 16:13:50.000000000","message":"Done","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def setUp(self):"},{"line_number":92,"context_line":"        super(ProcessFixture, self).setUp()"},{"line_number":93,"context_line":"        self.start()"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def cleanUp(self):"},{"line_number":96,"context_line":"        super(ProcessFixture, self).cleanUp()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_6e732b80","line":93,"updated":"2015-01-07 18:12:32.000000000","message":"did you forget to add self.addCleanup(self.cleanUp) ?","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def setUp(self):"},{"line_number":92,"context_line":"        super(ProcessFixture, self).setUp()"},{"line_number":93,"context_line":"        self.start()"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def cleanUp(self):"},{"line_number":96,"context_line":"        super(ProcessFixture, self).cleanUp()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_63c08f7c","line":93,"in_reply_to":"3a961159_6e732b80","updated":"2015-01-12 13:30:16.000000000","message":"I didn\u0027t - the entity using a ProcessFixture is expected to schedule the cleanup on its own (self.useFixture?). See the next patch in the series.","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"8d241e4532ff2c142768e0366104ae2de8be584e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    def start(self):"},{"line_number":102,"context_line":"        def cmd_callback(pid_file):"},{"line_number":103,"context_line":"            fmt \u003d self.name + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":104,"context_line":"            return [spawn.find_executable(\u0027neutron-daemon\u0027),"},{"line_number":105,"context_line":"                    \u0027--name\u0027, self.name,"},{"line_number":106,"context_line":"                    \u0027--pid_file\u0027, pid_file,"},{"line_number":107,"context_line":"                    \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_109d4f0a","line":104,"updated":"2015-01-08 07:26:49.000000000","message":"This should change following the removal of neutron-daemon\u0027s removal.","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    def start(self):"},{"line_number":102,"context_line":"        def cmd_callback(pid_file):"},{"line_number":103,"context_line":"            fmt \u003d self.name + \"-%Y-%m-%d--%H%M%S.log\""},{"line_number":104,"context_line":"            return [spawn.find_executable(\u0027neutron-daemon\u0027),"},{"line_number":105,"context_line":"                    \u0027--name\u0027, self.name,"},{"line_number":106,"context_line":"                    \u0027--pid_file\u0027, pid_file,"},{"line_number":107,"context_line":"                    \u0027--log-dir\u0027, \u0027/opt/stack/logs\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_ed289e35","line":104,"in_reply_to":"3a961159_109d4f0a","updated":"2015-01-12 13:30:16.000000000","message":"Done","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        br_eth_fixture \u003d BridgeFixture(self._get_br_eth_name())"},{"line_number":161,"context_line":"        self.useFixture(br_eth_fixture)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        br_eth \u003d br_eth_fixture.ovs_bridge"},{"line_number":164,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name,"},{"line_number":165,"context_line":"                                    root_helper\u003dcfg.CONF.AGENT.root_helper)"},{"line_number":166,"context_line":"        self.create_patch_port(br_eth, br_meta)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_ee139bb5","line":163,"updated":"2015-01-07 18:12:32.000000000","message":"I think br_phys would be a better name","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        br_eth_fixture \u003d BridgeFixture(self._get_br_eth_name())"},{"line_number":161,"context_line":"        self.useFixture(br_eth_fixture)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        br_eth \u003d br_eth_fixture.ovs_bridge"},{"line_number":164,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name,"},{"line_number":165,"context_line":"                                    root_helper\u003dcfg.CONF.AGENT.root_helper)"},{"line_number":166,"context_line":"        self.create_patch_port(br_eth, br_meta)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_4321d34b","line":163,"in_reply_to":"3a961159_ee139bb5","updated":"2015-01-12 13:30:16.000000000","message":"Done","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4d25aeda79453467641392e225fff9cd7117228c","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        self.useFixture(br_eth_fixture)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        br_eth \u003d br_eth_fixture.ovs_bridge"},{"line_number":164,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name,"},{"line_number":165,"context_line":"                                    root_helper\u003dcfg.CONF.AGENT.root_helper)"},{"line_number":166,"context_line":"        self.create_patch_port(br_eth, br_meta)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_ae73534c","line":164,"updated":"2015-01-07 18:12:32.000000000","message":"it this bridge cleaned up? Why not using BridgeFixture here? Also could you rename it please? By reading the name is not clear what this bridge it is.","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9343d539cacb0ee143f67a5da9f37a0966730724","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        self.useFixture(br_eth_fixture)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        br_eth \u003d br_eth_fixture.ovs_bridge"},{"line_number":164,"context_line":"        br_meta \u003d ovs_lib.OVSBridge(br_name\u003dself.meta_bridge_name,"},{"line_number":165,"context_line":"                                    root_helper\u003dcfg.CONF.AGENT.root_helper)"},{"line_number":166,"context_line":"        self.create_patch_port(br_eth, br_meta)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_c1c85b24","line":164,"in_reply_to":"3a961159_ae73534c","updated":"2015-01-12 13:30:16.000000000","message":"In case we want to run multiple OVS agents (for example, testing L3 HA hints at atleast 2 different L3 agents and 2 different OVS agents), we want their physical interfaces (br_phys) connected to each other (so they will have connectivity). For this, the class accepts some bridge name (aka meta-bridge) which all the br_phys are connected to. Since each test can potentially run concurrently to other tests, it\u0027s the test\u0027s responsibility to initialize this resource (and cleaning it up).","commit_id":"b5c85c8f81deb1fcb43a45096025faa0bf25c6b4"}],"neutron/tests/integration/templates.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"try:  # Python 2.x"},{"line_number":16,"context_line":"    import ConfigParser as configparser"},{"line_number":17,"context_line":"except ImportError:  # Python 3.x"},{"line_number":18,"context_line":"    import configparser  # noqa"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_6ca8ac8c","line":15,"updated":"2014-12-21 05:47:46.000000000","message":"Again, use six instead.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"try:  # Python 2.x"},{"line_number":16,"context_line":"    import ConfigParser as configparser"},{"line_number":17,"context_line":"except ImportError:  # Python 3.x"},{"line_number":18,"context_line":"    import configparser  # noqa"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_8d72baae","line":15,"in_reply_to":"3a961159_6ca8ac8c","updated":"2014-12-29 16:13:50.000000000","message":"Done","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return full_name[:max_length]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class Template(object):"},{"line_number":34,"context_line":"    TEMPLATE_VARS \u003d None"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self, filename):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_2c894426","line":33,"updated":"2014-12-21 05:47:46.000000000","message":"I\u0027d rather we not roll a new templating mechanism.  Given the impending switch to pecan, and it\u0027s dependency on mako templating [1], consider using that instead.\n\n1: http://docs.makotemplates.org/en/latest/usage.html","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return full_name[:max_length]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class Template(object):"},{"line_number":34,"context_line":"    TEMPLATE_VARS \u003d None"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self, filename):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_4b1b5a1c","line":33,"in_reply_to":"3a961159_2c894426","updated":"2014-12-29 16:13:50.000000000","message":"Done","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Generate the post-template configuration file and save it."},{"line_number":52,"context_line":"        self.config_file \u003d tempfile.NamedTemporaryFile("},{"line_number":53,"context_line":"            prefix\u003dself.prefix, dir\u003d\u0027/tmp/\u0027)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        for key, value in self.TEMPLATE_VARS.iteritems():"},{"line_number":56,"context_line":"            if callable(value):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_ec9bbc70","line":53,"updated":"2014-12-21 05:47:46.000000000","message":"Avoid specifying \u0027dir\u0027 unless you have a good reason.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # Generate the post-template configuration file and save it."},{"line_number":52,"context_line":"        self.config_file \u003d tempfile.NamedTemporaryFile("},{"line_number":53,"context_line":"            prefix\u003dself.prefix, dir\u003d\u0027/tmp/\u0027)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        for key, value in self.TEMPLATE_VARS.iteritems():"},{"line_number":56,"context_line":"            if callable(value):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_cd8042fa","line":53,"in_reply_to":"3a961159_ec9bbc70","updated":"2014-12-29 16:13:50.000000000","message":"Done","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"}],"neutron/tests/integration/templates/l3_agent.ini":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"a23ef51ab07d4145809a43adb4b105307479b4d3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"l3_agent_manager \u003d neutron.agent.l3_agent.L3NATAgentWithStateReport"},{"line_number":3,"context_line":"external_network_bridge \u003d br-ex"},{"line_number":4,"context_line":"ovs_integration_bridge \u003d br-int"}],"source_content_type":"text/x-properties","patch_set":10,"id":"3a961159_ac7c5421","line":1,"updated":"2014-12-21 05:47:46.000000000","message":"I\u0027m guessing having all these options and their docs is useful in the short-term, but I would hope that we could avoid having to maintain these templates.  Autogeneration or reuse of the examples in neutron\u0027s etc/ dir might be preferable.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"aa43ca4db96b2ce87a50d3d5866e148744b46d9e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"l3_agent_manager \u003d neutron.agent.l3_agent.L3NATAgentWithStateReport"},{"line_number":3,"context_line":"external_network_bridge \u003d br-ex"},{"line_number":4,"context_line":"ovs_integration_bridge \u003d br-int"}],"source_content_type":"text/x-properties","patch_set":10,"id":"3a961159_cd420268","line":1,"in_reply_to":"3a961159_ac7c5421","updated":"2014-12-29 16:13:50.000000000","message":"I\u0027ve stripped down the files to a more minimalized version (removed all comments, nova variables...), however I think we still need these templates. The reason being that we need to mark the places where the values should be dynamically generated (for example, the \u0027connection\u0027 option for DB access which is changed between each test). \n\nUsing pre-existing examples will add complicated code which will necessitate parsing them and changing their configuration values where needed, which is more complicated than what I\u0027ve tried to achieve here.\n\nAuto-generation is fine, but I think this looks better and is easier to maintain right now - the test writer merely needs to add the config option he wants with a {{value}}, and add code in templates.py that generates the value dynamically. Adding another layer which also generates the file from some other template seems to me like a real overkill.","commit_id":"db04b1996704f5b302e9dd6e578577d40f37c7cf"}],"test-requirements.txt":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"e5937868e85e442f9fbb105c369dd218d9c5ff57","unresolved":false,"context_lines":[{"line_number":8,"context_line":"discover"},{"line_number":9,"context_line":"fixtures\u003e\u003d0.3.14"},{"line_number":10,"context_line":"mock\u003e\u003d1.0"},{"line_number":11,"context_line":"Mako\u003e\u003d0.4.0"},{"line_number":12,"context_line":"python-subunit\u003e\u003d0.0.18"},{"line_number":13,"context_line":"requests-mock\u003e\u003d0.5.1  # Apache-2.0"},{"line_number":14,"context_line":"sphinx\u003e\u003d1.1.2,!\u003d1.2.0,!\u003d1.3b1,\u003c1.3"}],"source_content_type":"text/plain","patch_set":22,"id":"da86d52c_fb0c8d96","line":11,"updated":"2015-02-10 14:38:31.000000000","message":"Remove mako, not needed if we\u0027re not using/going to use mako templates.","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"936c260504e8e43fa0b1eb28ddfde976bdf0c759","unresolved":false,"context_lines":[{"line_number":8,"context_line":"discover"},{"line_number":9,"context_line":"fixtures\u003e\u003d0.3.14"},{"line_number":10,"context_line":"mock\u003e\u003d1.0"},{"line_number":11,"context_line":"Mako\u003e\u003d0.4.0"},{"line_number":12,"context_line":"python-subunit\u003e\u003d0.0.18"},{"line_number":13,"context_line":"requests-mock\u003e\u003d0.5.1  # Apache-2.0"},{"line_number":14,"context_line":"sphinx\u003e\u003d1.1.2,!\u003d1.2.0,!\u003d1.3b1,\u003c1.3"}],"source_content_type":"text/plain","patch_set":22,"id":"ba7be1f8_97079517","line":11,"in_reply_to":"da86d52c_fb0c8d96","updated":"2015-02-25 14:48:02.000000000","message":"Done","commit_id":"9df183d54f30db4fe701a0f717341a6f145c1c8b"}],"tox.ini":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"383b13896b3d743567506dc1fcdb53113f9ec745","unresolved":false,"context_lines":[{"line_number":43,"context_line":"         OS_ROOTWRAP_DAEMON_CMD\u003dsudo {envbindir}/neutron-rootwrap-daemon {envdir}/etc/neutron/rootwrap.conf"},{"line_number":44,"context_line":"         OS_FAIL_ON_MISSING_DEPS\u003d1"},{"line_number":45,"context_line":"         OS_TEST_TIMEOUT\u003d90"},{"line_number":46,"context_line":"         OS_RUN_FULLSTACK\u003d1"},{"line_number":47,"context_line":"sitepackages\u003dTrue"},{"line_number":48,"context_line":"deps \u003d"},{"line_number":49,"context_line":"  {[testenv:functional]deps}"}],"source_content_type":"text/x-properties","patch_set":39,"id":"1a6ced46_727cf8b5","line":46,"updated":"2015-03-26 12:46:12.000000000","message":"Shouldn\u0027t this be under dsvm-fullstack?","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"ed43ad63ace8f2d9d5d39df2cc46be47e2e85d7a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"         OS_ROOTWRAP_DAEMON_CMD\u003dsudo {envbindir}/neutron-rootwrap-daemon {envdir}/etc/neutron/rootwrap.conf"},{"line_number":44,"context_line":"         OS_FAIL_ON_MISSING_DEPS\u003d1"},{"line_number":45,"context_line":"         OS_TEST_TIMEOUT\u003d90"},{"line_number":46,"context_line":"         OS_RUN_FULLSTACK\u003d1"},{"line_number":47,"context_line":"sitepackages\u003dTrue"},{"line_number":48,"context_line":"deps \u003d"},{"line_number":49,"context_line":"  {[testenv:functional]deps}"}],"source_content_type":"text/x-properties","patch_set":39,"id":"1a6ced46_dd5bfdf3","line":46,"in_reply_to":"1a6ced46_727cf8b5","updated":"2015-03-26 13:25:27.000000000","message":"Nope. This is intentional - the reason (as specified in the other comment) is that when running \u0027dsvm-functional\u0027 (like at the gate), fullstack tests are also ran.","commit_id":"dc5fb0b7fd17dea126085e70ebbbbef0234d0065"}]}
