)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"9d4681bcbd1a65e71571712b79c680b3cbb35351","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"5847049d_2e82428a","updated":"2021-12-09 19:02:12.000000000","message":"recheck","commit_id":"3a1cf158c9bff09c60c94e2478382a26d26bc272"}],"doc/source/metastatic.rst":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"e7c40e6bb3c12da14df06a17d011a73c1ec7e8ec","unresolved":false,"context_lines":[{"line_number":50,"context_line":"              max-servers: 10"},{"line_number":51,"context_line":"              labels:"},{"line_number":52,"context_line":"                - name: small-node"},{"line_number":53,"context_line":"                  backing-label: large-node"},{"line_number":54,"context_line":"                  max-parallel-jobs: 2"},{"line_number":55,"context_line":"                  grace-time: 600"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"79ec1f7e_bf4d6470","line":53,"updated":"2021-10-14 17:05:52.000000000","message":"Ah, yep.  You\u0027ll need to do the second thing.","commit_id":"65903305612002c843a3cc2bef535b3e13b48d23"},{"author":{"_account_id":34108,"name":"Andreas Bengtsson Ohldin","email":"andreas.ohldin@volvocars.com","username":"aohldin1"},"change_message_id":"563ee5e0dc942511c1fff9dace9c64d453f38ca3","unresolved":true,"context_lines":[{"line_number":50,"context_line":"              max-servers: 10"},{"line_number":51,"context_line":"              labels:"},{"line_number":52,"context_line":"                - name: small-node"},{"line_number":53,"context_line":"                  backing-label: large-node"},{"line_number":54,"context_line":"                  max-parallel-jobs: 2"},{"line_number":55,"context_line":"                  grace-time: 600"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"b772e38f_078725a6","line":53,"range":{"start_line":53,"start_character":33,"end_line":53,"end_character":43},"updated":"2021-10-05 11:37:44.000000000","message":"Is it possible to set multiple backing-labels?\nFor example: \nbacking-label: large-node1, large-node2","commit_id":"65903305612002c843a3cc2bef535b3e13b48d23"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"430937618bee17292cc27b043232da1c6c431024","unresolved":false,"context_lines":[{"line_number":50,"context_line":"              max-servers: 10"},{"line_number":51,"context_line":"              labels:"},{"line_number":52,"context_line":"                - name: small-node"},{"line_number":53,"context_line":"                  backing-label: large-node"},{"line_number":54,"context_line":"                  max-parallel-jobs: 2"},{"line_number":55,"context_line":"                  grace-time: 600"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"249c9732_0e3e696e","line":53,"updated":"2021-10-08 21:26:55.000000000","message":"No; Nodepool only allows you to request a single label.  I\u0027m curious why that would be necessary.  If large-node1 and large-node2 are really interchangable, then you can give them both the same label.","commit_id":"65903305612002c843a3cc2bef535b3e13b48d23"},{"author":{"_account_id":34108,"name":"Andreas Bengtsson Ohldin","email":"andreas.ohldin@volvocars.com","username":"aohldin1"},"change_message_id":"c533564161fedff97dad5c02044cb8be4ea4154b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"              max-servers: 10"},{"line_number":51,"context_line":"              labels:"},{"line_number":52,"context_line":"                - name: small-node"},{"line_number":53,"context_line":"                  backing-label: large-node"},{"line_number":54,"context_line":"                  max-parallel-jobs: 2"},{"line_number":55,"context_line":"                  grace-time: 600"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"dee65ba5_1ab34654","line":53,"in_reply_to":"249c9732_0e3e696e","updated":"2021-10-11 05:01:26.000000000","message":"Sorry, I see know that I made a mistake. I meant the “- name:” and not the “– backing-label:”. \n\nWe have old SW tags which have an old label, called x. In the git master we have a new label, called y. Now both jobs can actually run using the same image and node. \n\nTherefore, we wonder if it possible to set:\n            - name: x, y\n              backing-label: backing-node\n\nOtherwise, I guess we have to set it like this.\n            - name: x\n              backing-label: backing-node\n            - name: y\n              backing-label: backing-node\n\nAgain, sorry for the confusion previously.","commit_id":"65903305612002c843a3cc2bef535b3e13b48d23"},{"author":{"_account_id":34108,"name":"Andreas Bengtsson Ohldin","email":"andreas.ohldin@volvocars.com","username":"aohldin1"},"change_message_id":"6f78a0c2b4a44dac89ad4e1e0110c68a4ef6e947","unresolved":false,"context_lines":[{"line_number":50,"context_line":"              max-servers: 10"},{"line_number":51,"context_line":"              labels:"},{"line_number":52,"context_line":"                - name: small-node"},{"line_number":53,"context_line":"                  backing-label: large-node"},{"line_number":54,"context_line":"                  max-parallel-jobs: 2"},{"line_number":55,"context_line":"                  grace-time: 600"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"a4f13d13_abdca987","line":53,"in_reply_to":"79ec1f7e_bf4d6470","updated":"2021-10-25 14:27:19.000000000","message":"Ok, if we have 2 metastatic nodes according to this configuration.\n\n            - name: x\n              backing-label: backing-node\n            - name: y\n              backing-label: backing-node\n\nIf a job is triggered via x label and another job via y label. Will the jobs then be routed to the same backing node or will there be two separate backing nodes? We would like them to be routed to the same backing node.","commit_id":"65903305612002c843a3cc2bef535b3e13b48d23"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2faf88e44a6cdacb4ad3585b715262cd57f863b6","unresolved":true,"context_lines":[{"line_number":91,"context_line":"               - name: small-node"},{"line_number":92,"context_line":"                 backing-label: large-node"},{"line_number":93,"context_line":"                  max-parallel-jobs: 2"},{"line_number":94,"context_line":"                  grace-time: 600"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"          Each entry is a dictionary with the following keys:"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"016a194b_b17e3b83","line":94,"updated":"2021-12-08 23:10:18.000000000","message":"Nit this line and the one above it have an extra space of indentation.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"09e997678921caf2bcd9e77b4b5586f52b8e9004","unresolved":false,"context_lines":[{"line_number":91,"context_line":"               - name: small-node"},{"line_number":92,"context_line":"                 backing-label: large-node"},{"line_number":93,"context_line":"                  max-parallel-jobs: 2"},{"line_number":94,"context_line":"                  grace-time: 600"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"          Each entry is a dictionary with the following keys:"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"b87517ec_b3fb31e9","line":94,"updated":"2021-12-08 23:59:39.000000000","message":"Thanks!","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"}],"nodepool/driver/metastatic/adapter.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"96259456100a3cb63512d38ecbe4293fa2278a8f","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        return []"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    def deleteResource(self, resource):"},{"line_number":302,"context_line":"        self.log.info(f\"Deleting leaked {resource.type}: {resource.name}\")"},{"line_number":303,"context_line":"        # Unused"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def listInstances(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"f93745cb_e95d5a9f","line":302,"updated":"2021-12-09 15:33:04.000000000","message":"But I\u0027ll change the log message to be less wrong.  :)","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"09e997678921caf2bcd9e77b4b5586f52b8e9004","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        return []"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    def deleteResource(self, resource):"},{"line_number":302,"context_line":"        self.log.info(f\"Deleting leaked {resource.type}: {resource.name}\")"},{"line_number":303,"context_line":"        # Unused"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def listInstances(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"8838f02e_6c67bbcc","line":302,"updated":"2021-12-08 23:59:39.000000000","message":"Fair question.  I\u0027m inclined to leave it in so that if we ever do use it, it\u0027s there.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2faf88e44a6cdacb4ad3585b715262cd57f863b6","unresolved":true,"context_lines":[{"line_number":299,"context_line":"        return []"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    def deleteResource(self, resource):"},{"line_number":302,"context_line":"        self.log.info(f\"Deleting leaked {resource.type}: {resource.name}\")"},{"line_number":303,"context_line":"        # Unused"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def listInstances(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"87699dd6_80120d25","line":302,"updated":"2021-12-08 23:10:18.000000000","message":"Should we emit this log if this method is unused?","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2faf88e44a6cdacb4ad3585b715262cd57f863b6","unresolved":true,"context_lines":[{"line_number":388,"context_line":"        nodelist \u003d self.backing_node_records.setdefault(label_name, [])"},{"line_number":389,"context_line":"        nodelist.append(backing_node_record)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def _deallocateBackingNode(self, node_id):"},{"line_number":392,"context_line":"        self._init()"},{"line_number":393,"context_line":"        for label_name, backing_node_records in \\"},{"line_number":394,"context_line":"            self.backing_node_records.items():"}],"source_content_type":"text/x-python","patch_set":15,"id":"b898bad5_bbb3a9a7","line":391,"updated":"2021-12-08 23:10:18.000000000","message":"Nit this method name makes it seem like this method deletes the backing nodes. But it really just removes slot entries then the listResources() calls will deallocate empty and not recently used backing nodes.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"09e997678921caf2bcd9e77b4b5586f52b8e9004","unresolved":false,"context_lines":[{"line_number":388,"context_line":"        nodelist \u003d self.backing_node_records.setdefault(label_name, [])"},{"line_number":389,"context_line":"        nodelist.append(backing_node_record)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def _deallocateBackingNode(self, node_id):"},{"line_number":392,"context_line":"        self._init()"},{"line_number":393,"context_line":"        for label_name, backing_node_records in \\"},{"line_number":394,"context_line":"            self.backing_node_records.items():"}],"source_content_type":"text/x-python","patch_set":15,"id":"59c121b2_bfe0826f","line":391,"updated":"2021-12-08 23:59:39.000000000","message":"WRT terminology, I was going for a distinction between \"deallocating\" and \"deleting\".  Our fake node previously had a backing node allocated to it, and this deallocates that backing node (so that yes, it can be garbage collected later if it\u0027s the last).","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"}],"nodepool/driver/metastatic/config.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2faf88e44a6cdacb4ad3585b715262cd57f863b6","unresolved":true,"context_lines":[{"line_number":123,"context_line":"                    if label_defs[pl.backing_label] !\u003d pl:"},{"line_number":124,"context_line":"                        raise Exception("},{"line_number":125,"context_line":"                            \"Multiple label definitions for the same \""},{"line_number":126,"context_line":"                            \"backing label must be identical\")"},{"line_number":127,"context_line":"                pp.labels[pl.name] \u003d pl"},{"line_number":128,"context_line":"                config.labels[pl.name].pools.append(pp)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"0df6b279_da1c56d8","line":126,"updated":"2021-12-08 23:10:18.000000000","message":"I think you need to insert into label_defs to make this check work.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"09e997678921caf2bcd9e77b4b5586f52b8e9004","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                    if label_defs[pl.backing_label] !\u003d pl:"},{"line_number":124,"context_line":"                        raise Exception("},{"line_number":125,"context_line":"                            \"Multiple label definitions for the same \""},{"line_number":126,"context_line":"                            \"backing label must be identical\")"},{"line_number":127,"context_line":"                pp.labels[pl.name] \u003d pl"},{"line_number":128,"context_line":"                config.labels[pl.name].pools.append(pp)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ac4515ec_470964f1","line":126,"updated":"2021-12-08 23:59:39.000000000","message":"It certainly seems to be missing something.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2faf88e44a6cdacb4ad3585b715262cd57f863b6","unresolved":true,"context_lines":[{"line_number":124,"context_line":"                        raise Exception("},{"line_number":125,"context_line":"                            \"Multiple label definitions for the same \""},{"line_number":126,"context_line":"                            \"backing label must be identical\")"},{"line_number":127,"context_line":"                pp.labels[pl.name] \u003d pl"},{"line_number":128,"context_line":"                config.labels[pl.name].pools.append(pp)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def getSchema(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"98baac52_3386f31d","line":127,"updated":"2021-12-08 23:10:18.000000000","message":"Is this line redundant with the MetastaticPool.load() method? When we create pp above it should populate this dict.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"09e997678921caf2bcd9e77b4b5586f52b8e9004","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        raise Exception("},{"line_number":125,"context_line":"                            \"Multiple label definitions for the same \""},{"line_number":126,"context_line":"                            \"backing label must be identical\")"},{"line_number":127,"context_line":"                pp.labels[pl.name] \u003d pl"},{"line_number":128,"context_line":"                config.labels[pl.name].pools.append(pp)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def getSchema(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"c8ecb953_a9dda835","line":127,"updated":"2021-12-08 23:59:39.000000000","message":"Sure looks that way.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"}],"nodepool/tests/unit/test_driver_metastatic.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"2faf88e44a6cdacb4ad3585b715262cd57f863b6","unresolved":true,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _getNodes(self):"},{"line_number":51,"context_line":"        nodes \u003d [n for n in self.zk.nodeIterator()]"},{"line_number":52,"context_line":"        nodes \u003d sorted(nodes, key\u003dlambda n: n.id)"},{"line_number":53,"context_line":"        self.log.debug(\"Nodes:\")"},{"line_number":54,"context_line":"        for n in nodes:"},{"line_number":55,"context_line":"            self.log.debug(\u0027  %s %s\u0027, n.id, n.provider)"}],"source_content_type":"text/x-python","patch_set":15,"id":"219c7ee5_d755b056","line":52,"updated":"2021-12-08 23:10:18.000000000","message":"If we sort in the other direction we get the backing node first then node1 and node2. Not super important but it might make the test cases below a bit clearer.\n\nI guess this might be more difficult to sort properly when creating the second backing node though.","commit_id":"2829597233784e0832fb04a0f0b8b6489e73327d"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"01e58ac95bb7d16f08001db07f039328ebac996f","unresolved":true,"context_lines":[{"line_number":63,"context_line":"        # Test schema validation"},{"line_number":64,"context_line":"        config \u003d os.path.join(os.path.dirname(tests.__file__),"},{"line_number":65,"context_line":"                              \u0027fixtures\u0027, \u0027config_validate\u0027,"},{"line_number":66,"context_line":"                              \u0027metastatic_ok.yaml\u0027)"},{"line_number":67,"context_line":"        validator \u003d ConfigValidator(config)"},{"line_number":68,"context_line":"        ret \u003d validator.validate()"},{"line_number":69,"context_line":"        self.assertEqual(ret, 0)"}],"source_content_type":"text/x-python","patch_set":16,"id":"b189a586_ebf3edc8","line":66,"updated":"2021-12-09 19:07:22.000000000","message":"I think this file may not have been git added.","commit_id":"3a1cf158c9bff09c60c94e2478382a26d26bc272"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"01e58ac95bb7d16f08001db07f039328ebac996f","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.assertEqual(ret, 0)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        # Test runtime value assertions"},{"line_number":72,"context_line":"        configfile \u003d self.setup_config(\u0027config_validate/metastatic_error.yaml\u0027)"},{"line_number":73,"context_line":"        pool \u003d self.useNodepool(configfile, watermark_sleep\u003d1)"},{"line_number":74,"context_line":"        with testtools.ExpectedException(Exception, \u0027Multiple label def\u0027):"},{"line_number":75,"context_line":"            pool.loadConfig()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1b6849ff_b44f85e6","line":72,"updated":"2021-12-09 19:07:22.000000000","message":"This file too.","commit_id":"3a1cf158c9bff09c60c94e2478382a26d26bc272"}]}
