)]}'
{"nodepool/driver/azure/azul.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"3c3855478a2aa8afeecc4d7ead2b0c0ae674540f","unresolved":true,"context_lines":[{"line_number":37,"context_line":"        self.federated_token_file \u003d federated_token_file"},{"line_number":38,"context_line":"        # Generally applicable"},{"line_number":39,"context_line":"        self.token \u003d None"},{"line_number":40,"context_line":"        self.expiration \u003d time.time()"},{"line_number":41,"context_line":"        if self.auth_location:"},{"line_number":42,"context_line":"            # Load the subscription id"},{"line_number":43,"context_line":"            self.load_from_token_file()"}],"source_content_type":"text/x-python","patch_set":3,"id":"26fadd12_7ed18c1a","line":40,"updated":"2025-07-03 00:20:32.000000000","message":"Nit I notice this is how the code was written before too, but if the idea is that the first time through we always want to refresh couldn\u0027t we set this value to 0? Then later we\u0027d check `0 - time.time() \u003e\u003d 60` which would always be false because we would have a negative value. Just thinking it might be easier to read as an initializer value than the time at object construction.","commit_id":"b4000a960f47b888009304f3253356138e828175"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"c70df3d79f1fe0a0a44d6498a20a67b4cadea5d8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.federated_token_file \u003d federated_token_file"},{"line_number":38,"context_line":"        # Generally applicable"},{"line_number":39,"context_line":"        self.token \u003d None"},{"line_number":40,"context_line":"        self.expiration \u003d time.time()"},{"line_number":41,"context_line":"        if self.auth_location:"},{"line_number":42,"context_line":"            # Load the subscription id"},{"line_number":43,"context_line":"            self.load_from_token_file()"}],"source_content_type":"text/x-python","patch_set":3,"id":"a09076f0_cdc97532","line":40,"in_reply_to":"26fadd12_7ed18c1a","updated":"2025-07-03 23:06:46.000000000","message":"Done","commit_id":"b4000a960f47b888009304f3253356138e828175"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"3c3855478a2aa8afeecc4d7ead2b0c0ae674540f","unresolved":true,"context_lines":[{"line_number":79,"context_line":"        return requests.post(url, data)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def refresh_federated(self):"},{"line_number":82,"context_line":"        self.log.debug(\u0027Refreshing authentication token\u0027)"},{"line_number":83,"context_line":"        url \u003d self.AUTH_URL.format(tenantId\u003dself.tenant_id)"},{"line_number":84,"context_line":"        with open(self.federated_token_file, encoding\u003d\"utf-8\") as f:"},{"line_number":85,"context_line":"            token \u003d f.read()"}],"source_content_type":"text/x-python","patch_set":3,"id":"70555291_7e3d0278","line":82,"updated":"2025-07-03 00:20:32.000000000","message":"Nit might be good to have debug logging differentiate between federated auth and shared secret auth.","commit_id":"b4000a960f47b888009304f3253356138e828175"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"c70df3d79f1fe0a0a44d6498a20a67b4cadea5d8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        return requests.post(url, data)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def refresh_federated(self):"},{"line_number":82,"context_line":"        self.log.debug(\u0027Refreshing authentication token\u0027)"},{"line_number":83,"context_line":"        url \u003d self.AUTH_URL.format(tenantId\u003dself.tenant_id)"},{"line_number":84,"context_line":"        with open(self.federated_token_file, encoding\u003d\"utf-8\") as f:"},{"line_number":85,"context_line":"            token \u003d f.read()"}],"source_content_type":"text/x-python","patch_set":3,"id":"407667ef_49310c4f","line":82,"in_reply_to":"70555291_7e3d0278","updated":"2025-07-03 23:06:46.000000000","message":"Done","commit_id":"b4000a960f47b888009304f3253356138e828175"}],"nodepool/driver/azure/config.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"3c3855478a2aa8afeecc4d7ead2b0c0ae674540f","unresolved":true,"context_lines":[{"line_number":365,"context_line":"            \u0027client-id\u0027: str,"},{"line_number":366,"context_line":"            \u0027tenant-id\u0027: str,"},{"line_number":367,"context_line":"            \u0027subscription-id\u0027: str,"},{"line_number":368,"context_line":"            \u0027federated-token-file\u0027: str,"},{"line_number":369,"context_line":"            \u0027ipv4\u0027: bool,"},{"line_number":370,"context_line":"            \u0027ipv6\u0027: bool,"},{"line_number":371,"context_line":"            \u0027public-ipv4\u0027: bool,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b988a04b_1d2f0035","line":368,"updated":"2025-07-03 00:20:32.000000000","message":"Before auth-path was required which I guess meant that the env var supplied version wasn\u0027t useful? Anyway now it is no longer required because we have an either or situation. Should we enforce that either or situation somewhere explicitly? I don\u0027t think we\u0027re doing that now so you\u0027d be left with broken auth when configuration is missing and might not get the clearest error message as a result.","commit_id":"b4000a960f47b888009304f3253356138e828175"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"44cd81355fc52b0b32e7f07ec4418400c40e53e4","unresolved":false,"context_lines":[{"line_number":365,"context_line":"            \u0027client-id\u0027: str,"},{"line_number":366,"context_line":"            \u0027tenant-id\u0027: str,"},{"line_number":367,"context_line":"            \u0027subscription-id\u0027: str,"},{"line_number":368,"context_line":"            \u0027federated-token-file\u0027: str,"},{"line_number":369,"context_line":"            \u0027ipv4\u0027: bool,"},{"line_number":370,"context_line":"            \u0027ipv6\u0027: bool,"},{"line_number":371,"context_line":"            \u0027public-ipv4\u0027: bool,"}],"source_content_type":"text/x-python","patch_set":3,"id":"59bd99ba_8f095d25","line":368,"in_reply_to":"6637f05d_a7c765b2","updated":"2025-07-19 17:52:12.000000000","message":"Acknowledged","commit_id":"b4000a960f47b888009304f3253356138e828175"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"c70df3d79f1fe0a0a44d6498a20a67b4cadea5d8","unresolved":true,"context_lines":[{"line_number":365,"context_line":"            \u0027client-id\u0027: str,"},{"line_number":366,"context_line":"            \u0027tenant-id\u0027: str,"},{"line_number":367,"context_line":"            \u0027subscription-id\u0027: str,"},{"line_number":368,"context_line":"            \u0027federated-token-file\u0027: str,"},{"line_number":369,"context_line":"            \u0027ipv4\u0027: bool,"},{"line_number":370,"context_line":"            \u0027ipv6\u0027: bool,"},{"line_number":371,"context_line":"            \u0027public-ipv4\u0027: bool,"}],"source_content_type":"text/x-python","patch_set":3,"id":"6637f05d_a7c765b2","line":368,"in_reply_to":"b988a04b_1d2f0035","updated":"2025-07-03 23:06:46.000000000","message":"That would be nice, unfortunately, the schema validation design in nodepool does not allow us to construct alternatives like that at the root level of a provider.  This is because the central validator merges them all together, which means the output of this method must be a dictionary (even if some of its keys contain voluptuous schemas that *can* have alternatives.\n\nGiven that this problem is solved in NIZ, and if anyone did omit the auth info, they would get an obvious auth error on startup, I think we should just accept this as the best we can do for now, since it would be a big job to redo the validator in nodepool.","commit_id":"b4000a960f47b888009304f3253356138e828175"}],"nodepool/tests/unit/test_driver_azure.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"3c3855478a2aa8afeecc4d7ead2b0c0ae674540f","unresolved":true,"context_lines":[{"line_number":113,"context_line":"        self._test_azure_cloud_image(configfile)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_azure_oidc_federation(self):"},{"line_number":116,"context_line":"        token_file \u003d tempfile.NamedTemporaryFile(\u0027w\u0027, delete\u003dFalse)"},{"line_number":117,"context_line":"        with token_file as f:"},{"line_number":118,"context_line":"            f.write(\"testtoken\")"},{"line_number":119,"context_line":"        configfile \u003d self.setup_config("}],"source_content_type":"text/x-python","patch_set":3,"id":"08ed86ac_03f735b5","line":116,"updated":"2025-07-03 00:20:32.000000000","message":"I think this temp file will be leaked onto the test system. The fixtures library has fixtures that cleanup post test or we could do an explicit addCleanup with a method to delete the tempfile at test exit.","commit_id":"b4000a960f47b888009304f3253356138e828175"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"c70df3d79f1fe0a0a44d6498a20a67b4cadea5d8","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self._test_azure_cloud_image(configfile)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_azure_oidc_federation(self):"},{"line_number":116,"context_line":"        token_file \u003d tempfile.NamedTemporaryFile(\u0027w\u0027, delete\u003dFalse)"},{"line_number":117,"context_line":"        with token_file as f:"},{"line_number":118,"context_line":"            f.write(\"testtoken\")"},{"line_number":119,"context_line":"        configfile \u003d self.setup_config("}],"source_content_type":"text/x-python","patch_set":3,"id":"f6a318e1_553fc08d","line":116,"in_reply_to":"08ed86ac_03f735b5","updated":"2025-07-03 23:06:46.000000000","message":"We use the Fixtures nested tempfile fixture, which causes all tempfiles to be made under a tempdir that gets removed, so this and all other instances of temp files are automatically cleaned up.","commit_id":"b4000a960f47b888009304f3253356138e828175"}]}
