)]}'
{"swift/common/manager.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"846879cffcf750d3d2c2608f8849f46b77f19515","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @functools.wraps(func)"},{"line_number":102,"context_line":"    def wrapped(self, *a, **kw):"},{"line_number":103,"context_line":"        rv \u003d func(self, *a, **kw)"},{"line_number":104,"context_line":"        return 1 if rv else 0"},{"line_number":105,"context_line":"    return wrapped"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c450cbe3_d52ee42f","line":103,"updated":"2020-11-26 03:53:01.000000000","message":"Perhaps my Python is lacking, but does this change do anything at all? The self is just a positional argument, right? So, it\u0027s included into *a, if present, right?","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"442dd74254f09e6c1c3cb7d7f47d1a95517a967e","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @functools.wraps(func)"},{"line_number":102,"context_line":"    def wrapped(self, *a, **kw):"},{"line_number":103,"context_line":"        rv \u003d func(self, *a, **kw)"},{"line_number":104,"context_line":"        return 1 if rv else 0"},{"line_number":105,"context_line":"    return wrapped"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a9cfa8da_6b564f14","line":103,"in_reply_to":"c450cbe3_d52ee42f","updated":"2020-11-28 06:19:17.000000000","message":"Yes, you\u0027re correct!","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"846879cffcf750d3d2c2608f8849f46b77f19515","unresolved":true,"context_lines":[{"line_number":200,"context_line":"    \"\"\""},{"line_number":201,"context_line":"    if not server:"},{"line_number":202,"context_line":"        return False"},{"line_number":203,"context_line":"    server, cmd \u003d format_server_name(server)"},{"line_number":204,"context_line":"    if find_executable(cmd) is None:"},{"line_number":205,"context_line":"        return False"},{"line_number":206,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"2ff7784b_f353ef4c","line":203,"updated":"2020-11-26 03:53:01.000000000","message":"I think there\u0027s no need to return and re-assign server. If you insist on returning a tuple, assign to underscore, or use format_server_name(server)[1].","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"442dd74254f09e6c1c3cb7d7f47d1a95517a967e","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    \"\"\""},{"line_number":201,"context_line":"    if not server:"},{"line_number":202,"context_line":"        return False"},{"line_number":203,"context_line":"    server, cmd \u003d format_server_name(server)"},{"line_number":204,"context_line":"    if find_executable(cmd) is None:"},{"line_number":205,"context_line":"        return False"},{"line_number":206,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"d00eb9d8_45ad4c06","line":203,"in_reply_to":"2ff7784b_f353ef4c","updated":"2020-11-28 06:19:17.000000000","message":"Done","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"846879cffcf750d3d2c2608f8849f46b77f19515","unresolved":true,"context_lines":[{"line_number":240,"context_line":"                self.servers.add(Server(name, run_dir))"},{"line_number":241,"context_line":"            else:"},{"line_number":242,"context_line":"                self.missing_binaries \u003d True"},{"line_number":243,"context_line":"                print(_(\u0027%s server not found\u0027) % name)"},{"line_number":244,"context_line":"                # WIP: should we just fail hard in here instead of"},{"line_number":245,"context_line":"                # returning 1 from Manager.run_command() ?"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3b815a33_68ae0e8a","line":243,"updated":"2020-11-26 03:53:01.000000000","message":"The bug was about avoiding a message when binary is not present. Did you mean to leave it in, or is it a forgotten debugging printout?","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"442dd74254f09e6c1c3cb7d7f47d1a95517a967e","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                self.servers.add(Server(name, run_dir))"},{"line_number":241,"context_line":"            else:"},{"line_number":242,"context_line":"                self.missing_binaries \u003d True"},{"line_number":243,"context_line":"                print(_(\u0027%s server not found\u0027) % name)"},{"line_number":244,"context_line":"                # WIP: should we just fail hard in here instead of"},{"line_number":245,"context_line":"                # returning 1 from Manager.run_command() ?"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"063fafaf_37a11371","line":243,"in_reply_to":"3b815a33_68ae0e8a","updated":"2020-11-28 06:19:17.000000000","message":"Forgotten debugging, thanks for spotting it.","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a0819f37fea0d350d3339b7c5854b7b4ab1e65f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import six"},{"line_number":26,"context_line":"from swift import gettext_ as _"},{"line_number":27,"context_line":"import tempfile"},{"line_number":28,"context_line":"from distutils.spawn import find_executable"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from swift.common.utils import search_tree, remove_file, write_file, readconf"},{"line_number":31,"context_line":"from swift.common.exceptions import InvalidPidFileException"}],"source_content_type":"text/x-python","patch_set":5,"id":"32c552b0_dccdfd09","line":28,"updated":"2020-12-01 01:23:17.000000000","message":"Nice! You even went with something that\u0027ll work on both py2 and py3 -- take *that* shutil.which!","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"442dd74254f09e6c1c3cb7d7f47d1a95517a967e","unresolved":true,"context_lines":[{"line_number":101,"context_line":"    @functools.wraps(func)"},{"line_number":102,"context_line":"    def wrapped(*a, **kw):"},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            if a[0].missing_binaries:"},{"line_number":105,"context_line":"                return 1"},{"line_number":106,"context_line":"        except AttributeError:"},{"line_number":107,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f97da72_e03535c3","line":104,"updated":"2020-11-28 06:19:17.000000000","message":"As Pete pointed out, we can get `self` from the first argument.\nAs this is a decorator, it should not assume anything about the arguments, so I\u0027ve wrapped into a try statement.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"249a3db3ef4ab4054870dc2b44672e9e1fa434f8","unresolved":true,"context_lines":[{"line_number":101,"context_line":"    @functools.wraps(func)"},{"line_number":102,"context_line":"    def wrapped(*a, **kw):"},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            if a[0].missing_binaries:"},{"line_number":105,"context_line":"                return 1"},{"line_number":106,"context_line":"        except AttributeError:"},{"line_number":107,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"c05460b0_110501a3","line":104,"in_reply_to":"536e7736_fa782ba3","updated":"2020-12-01 04:32:35.000000000","message":"On second thought, I\u0027m not sure I\u0027m onboard with tinkering with the @command decorator. The upside is that there\u0027s no way to forget to apply to a command. But what it it\u0027s something that we actually _want_? Some of these commands may be doing some stuff that I\u0027m not grasping entirely. For example, look at kill(): it returns zero in case it fails to kill. But decorator will force it to return 1. Is that really okay to change? I\u0027m considering if adding the check for missing binaries to start() only would be the right course.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a0819f37fea0d350d3339b7c5854b7b4ab1e65f","unresolved":true,"context_lines":[{"line_number":101,"context_line":"    @functools.wraps(func)"},{"line_number":102,"context_line":"    def wrapped(*a, **kw):"},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            if a[0].missing_binaries:"},{"line_number":105,"context_line":"                return 1"},{"line_number":106,"context_line":"        except AttributeError:"},{"line_number":107,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"536e7736_fa782ba3","line":104,"in_reply_to":"9f97da72_e03535c3","updated":"2020-12-01 01:23:17.000000000","message":"Maybe something like\n\n if getattr(a[0], \u0027missing_binaries\u0027, False):\n    return 1\n\n? Catching AttributeError makes me a little nervous, though maybe I\u0027m just disposed to tyops. (And maybe a little scarred from running down https://review.opendev.org/c/openstack/python-openstackclient/+/306091 this one time -- though that also involved some lazy-loading __getattr__ craziness.)\n\nFWIW, the command decorator should only be used here in this module, and always on methods (not generic functions) -- I\u0027d be perfectly content to change wrapped\u0027s signature to make things more explicit and let any AttributeError bubble through, like\n\n def wrapped(self, *a, **kw):\n     if self.missing_binaries:\n         return 1\n     rv \u003d func(self, *a, **kw)\n     ...\n\nOh, interesting! PS2 had something closer to that... *shrug*","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"0e9b80aa0be5252d9f8886b12abb20056670c0b2","unresolved":true,"context_lines":[{"line_number":101,"context_line":"    @functools.wraps(func)"},{"line_number":102,"context_line":"    def wrapped(*a, **kw):"},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            if a[0].missing_binaries:"},{"line_number":105,"context_line":"                return 1"},{"line_number":106,"context_line":"        except AttributeError:"},{"line_number":107,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"e7d46fa6_e703cc3a","line":104,"in_reply_to":"c05460b0_110501a3","updated":"2020-12-01 05:55:43.000000000","message":"@Pete\nI believe the decorator would only return 1 if the binary of that server you are trying to kill (or any other server that was initiated with it) is missing.\nNow, as the decorator will not start any server in that exact scenario, IIUC what you are talking about seems to be a very edge case: a given binary is removed after the server was started.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"}],"test/unit/common/test_manager.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"846879cffcf750d3d2c2608f8849f46b77f19515","unresolved":true,"context_lines":[{"line_number":1649,"context_line":"class TestManager(unittest.TestCase):"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"    def test_create(self):"},{"line_number":1652,"context_line":"        m \u003d manager.Manager([\u0027object\u0027])"},{"line_number":1653,"context_line":"        self.assertEqual(len(m.servers), 1)"},{"line_number":1654,"context_line":"        server \u003d m.servers.pop()"},{"line_number":1655,"context_line":"        self.assertTrue(isinstance(server, manager.Server))"}],"source_content_type":"text/x-python","patch_set":2,"id":"e20ba00b_f603481c","line":1652,"updated":"2020-11-26 03:53:01.000000000","message":"I don\u0027t agree to these. Using \"test\" here guarantees that it\u0027s not an actual name, and now you go and possibly have real server involved, in case this runs in a root where a system Swift is installed.\n\nIf the fake name gives you trouble, you have to mock out some checks. Possibly verify_server.","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"442dd74254f09e6c1c3cb7d7f47d1a95517a967e","unresolved":false,"context_lines":[{"line_number":1649,"context_line":"class TestManager(unittest.TestCase):"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"    def test_create(self):"},{"line_number":1652,"context_line":"        m \u003d manager.Manager([\u0027object\u0027])"},{"line_number":1653,"context_line":"        self.assertEqual(len(m.servers), 1)"},{"line_number":1654,"context_line":"        server \u003d m.servers.pop()"},{"line_number":1655,"context_line":"        self.assertTrue(isinstance(server, manager.Server))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ad1d852_3c7bdd06","line":1652,"in_reply_to":"e20ba00b_f603481c","updated":"2020-11-28 06:19:17.000000000","message":"Done, thanks for pointing that out!","commit_id":"bb11a8d342a473b1cd1b95a5c02c791e9291ffde"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a0819f37fea0d350d3339b7c5854b7b4ab1e65f","unresolved":true,"context_lines":[{"line_number":1649,"context_line":"class TestManager(unittest.TestCase):"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"    def test_create(self):"},{"line_number":1652,"context_line":"        def mock_verify_server(server):"},{"line_number":1653,"context_line":"            if \u0027error\u0027 in server:"},{"line_number":1654,"context_line":"                return False"},{"line_number":1655,"context_line":"            return True"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        old_verify_server \u003d manager.verify_server"},{"line_number":1658,"context_line":"        manager.verify_server \u003d mock_verify_server"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        try:"},{"line_number":1661,"context_line":"            m \u003d manager.Manager([\u0027test\u0027])"},{"line_number":1662,"context_line":"            self.assertEqual(len(m.servers), 1)"},{"line_number":1663,"context_line":"            server \u003d m.servers.pop()"}],"source_content_type":"text/x-python","patch_set":5,"id":"41279a3c_10490bfc","line":1660,"range":{"start_line":1652,"start_character":0,"end_line":1660,"end_character":12},"updated":"2020-12-01 01:23:17.000000000","message":"Would something like\n\n @mock.patch.object(manager, \u0027verify_server\u0027,\n                    side_effect\u003dlambda server: \u0027error\u0027 not in server)\n def test_create(self, mock_verify):\n     ...\n\nwork about as well? It\u0027d save the churn due to re-indent...","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"0e9b80aa0be5252d9f8886b12abb20056670c0b2","unresolved":false,"context_lines":[{"line_number":1649,"context_line":"class TestManager(unittest.TestCase):"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"    def test_create(self):"},{"line_number":1652,"context_line":"        def mock_verify_server(server):"},{"line_number":1653,"context_line":"            if \u0027error\u0027 in server:"},{"line_number":1654,"context_line":"                return False"},{"line_number":1655,"context_line":"            return True"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        old_verify_server \u003d manager.verify_server"},{"line_number":1658,"context_line":"        manager.verify_server \u003d mock_verify_server"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        try:"},{"line_number":1661,"context_line":"            m \u003d manager.Manager([\u0027test\u0027])"},{"line_number":1662,"context_line":"            self.assertEqual(len(m.servers), 1)"},{"line_number":1663,"context_line":"            server \u003d m.servers.pop()"}],"source_content_type":"text/x-python","patch_set":5,"id":"f195ac47_2890d3fb","line":1660,"range":{"start_line":1652,"start_character":0,"end_line":1660,"end_character":12},"in_reply_to":"41279a3c_10490bfc","updated":"2020-12-01 05:55:43.000000000","message":"Thanks for the tip, using the decorator is way less verbose. Addressed in patch set 6.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a0819f37fea0d350d3339b7c5854b7b4ab1e65f","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"            # test valid + invalid server"},{"line_number":1716,"context_line":"            servers \u003d [\u0027object-server\u0027]"},{"line_number":1717,"context_line":"            m \u003d manager.Manager([\u0027object\u0027, \u0027error\u0027])"},{"line_number":1718,"context_line":"            self.assertEqual(len(m.servers), 1)"},{"line_number":1719,"context_line":"            for server in m.servers:"},{"line_number":1720,"context_line":"                self.assertTrue(server.server in servers)"},{"line_number":1721,"context_line":"            # test multi-server and invalid server together"},{"line_number":1722,"context_line":"            servers \u003d [\u0027object-replicator\u0027, \u0027object-auditor\u0027, \u0027error\u0027]"},{"line_number":1723,"context_line":"            m \u003d manager.Manager(servers)"}],"source_content_type":"text/x-python","patch_set":5,"id":"244b74b9_d98cd565","line":1720,"range":{"start_line":1718,"start_character":0,"end_line":1720,"end_character":57},"updated":"2020-12-01 01:23:17.000000000","message":"Maybe better as\n\n self.assertEqual(list(m.servers), [\u0027object-server\u0027])\n\n? Man, now I want to go rewrite a bunch of ugly tests :-/\n\nEh, you\u0027re probably right to just have it match the existing style.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a0819f37fea0d350d3339b7c5854b7b4ab1e65f","unresolved":false,"context_lines":[{"line_number":1763,"context_line":"            return True"},{"line_number":1764,"context_line":""},{"line_number":1765,"context_line":"        old_verify_server \u003d manager.verify_server"},{"line_number":1766,"context_line":"        old_server_class \u003d manager.Server"},{"line_number":1767,"context_line":""},{"line_number":1768,"context_line":"        try:"},{"line_number":1769,"context_line":"            manager.verify_server \u003d mock_verify_server"}],"source_content_type":"text/x-python","patch_set":5,"id":"14e563f6_4a82378f","line":1766,"updated":"2020-12-01 01:23:17.000000000","message":"Oh, I see... and we\u0027ve got some precedent for more manual mocking...","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"0e9b80aa0be5252d9f8886b12abb20056670c0b2","unresolved":true,"context_lines":[{"line_number":1763,"context_line":"            return True"},{"line_number":1764,"context_line":""},{"line_number":1765,"context_line":"        old_verify_server \u003d manager.verify_server"},{"line_number":1766,"context_line":"        old_server_class \u003d manager.Server"},{"line_number":1767,"context_line":""},{"line_number":1768,"context_line":"        try:"},{"line_number":1769,"context_line":"            manager.verify_server \u003d mock_verify_server"}],"source_content_type":"text/x-python","patch_set":5,"id":"712f7984_261e0a78","line":1766,"in_reply_to":"14e563f6_4a82378f","updated":"2020-12-01 05:55:43.000000000","message":"I\u0027ve tried to match the existing style, so in patch set 6 I\u0027ve refactored to use mock.object() only where nothing else was already being manually mocked.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"442dd74254f09e6c1c3cb7d7f47d1a95517a967e","unresolved":true,"context_lines":[{"line_number":1844,"context_line":"            status \u003d m.start()"},{"line_number":1845,"context_line":"            self.assertEqual(status, 1)"},{"line_number":1846,"context_line":"            for server in m.servers:"},{"line_number":1847,"context_line":"                self.assertEqual(server.called[\u0027launch\u0027], [])"},{"line_number":1848,"context_line":"                self.assertEqual(server.called[\u0027wait\u0027], [])"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"            # test interact"}],"source_content_type":"text/x-python","patch_set":5,"id":"74770ccd_335d8d31","line":1847,"updated":"2020-11-28 06:19:17.000000000","message":"As the manager will fail on any command, I believe it\u0027s correct that this test should be changed. Ditto for the other changed tests in this file","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a0819f37fea0d350d3339b7c5854b7b4ab1e65f","unresolved":true,"context_lines":[{"line_number":1844,"context_line":"            status \u003d m.start()"},{"line_number":1845,"context_line":"            self.assertEqual(status, 1)"},{"line_number":1846,"context_line":"            for server in m.servers:"},{"line_number":1847,"context_line":"                self.assertEqual(server.called[\u0027launch\u0027], [])"},{"line_number":1848,"context_line":"                self.assertEqual(server.called[\u0027wait\u0027], [])"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"            # test interact"}],"source_content_type":"text/x-python","patch_set":5,"id":"fcdb8523_03c5ec1b","line":1847,"in_reply_to":"50e02db5_21f69223","updated":"2020-12-01 01:23:17.000000000","message":"Thanks for flagging this up! I\u0027m kinda torn about it.\n\nWe don\u0027t often introduce new daemons, but I wonder if this would feel at all constraining if/when we do... The last one we added was the container-sharder; I wonder if there may have been some operators who found it convenient that they could blast out\n\n swift-init container-server container-replicator container-auditor container-sharder container-updater restart\n\nacross a mixed-version cluster... the un-upgraded nodes would\u0027ve reported back an error, but (I guess the test is trying to demonstrate that) they would\u0027ve at least restarted what they could.\n\nOTOH, these days every prod deployment I can think of is using systemd units to manage processes; IDK how much swift-init is really used outside of dev environments...\n\nI\u0027ll keep thinking about it.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":30095,"name":"Michele Valsecchi","email":"mvalsecc@redhat.com","username":"mvalsecc"},"change_message_id":"e1267a70c53f2e8d43e1dfa875551dcb6b1408ce","unresolved":true,"context_lines":[{"line_number":1844,"context_line":"            status \u003d m.start()"},{"line_number":1845,"context_line":"            self.assertEqual(status, 1)"},{"line_number":1846,"context_line":"            for server in m.servers:"},{"line_number":1847,"context_line":"                self.assertEqual(server.called[\u0027launch\u0027], [])"},{"line_number":1848,"context_line":"                self.assertEqual(server.called[\u0027wait\u0027], [])"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"            # test interact"}],"source_content_type":"text/x-python","patch_set":5,"id":"50e02db5_21f69223","line":1847,"in_reply_to":"74770ccd_335d8d31","updated":"2020-11-28 11:24:29.000000000","message":"i.e. if even only one server is missing binaries, the manager will intentionally return 1 on any command, hence this test needs to be change IIUC","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"5344ffe250aeab64952715559896da916aab3043","unresolved":true,"context_lines":[{"line_number":1844,"context_line":"            status \u003d m.start()"},{"line_number":1845,"context_line":"            self.assertEqual(status, 1)"},{"line_number":1846,"context_line":"            for server in m.servers:"},{"line_number":1847,"context_line":"                self.assertEqual(server.called[\u0027launch\u0027], [])"},{"line_number":1848,"context_line":"                self.assertEqual(server.called[\u0027wait\u0027], [])"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"            # test interact"}],"source_content_type":"text/x-python","patch_set":5,"id":"416355f8_855f4b15","line":1847,"in_reply_to":"fcdb8523_03c5ec1b","updated":"2020-12-01 03:42:17.000000000","message":"Red Hat\u0027s current offering, Train, is containerized, so the starting service is podman, replacing docker in Queens. But I\u0027m pretty sure systemd is involved somewhere anyway, because it\u0027s required in order to obtain a correct SElinux context. The swift-init can only be used if you run with SElinux set to Permissive or disabled. But I would not be surprised if someone uses swift-init. I do it for sure, and without any boot scripts. I want a person to bring things up anyway. I think swift-init remains relevant for users of large clusters.","commit_id":"a57c1ac44bb1fe1f579735e7274b7f9fba23e22b"}]}
