)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"1ff797583a8dacdbb013ac79e3b1f0e550a5d67d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e78a61dc_1ddcdd40","updated":"2022-01-13 16:02:00.000000000","message":"Early integration tests are working as expected, thanks!","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":1955,"name":"Alan Pevec","email":"alan.pevec@redhat.com","username":"apevec"},"change_message_id":"a2556c13db17165049a15f03ed76b8b302c8158c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"530c8ad9_e4d86fa8","updated":"2022-02-03 12:11:03.000000000","message":"needs rebase?","commit_id":"c7c9bc9f638f70fec1a1af57d9f4f857da2578a9"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"b3275375_199a816f","updated":"2022-03-14 21:42:48.000000000","message":"This is a new driver so I\u0027m not sure any of my inline comments rise to the level of a -1 but will let corvus self approve if nothing is worth a new patchset.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"}],"doc/source/ibmvpc.rst":[{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"92c3919df9320763ffa2ea3008c55892995f8e24","unresolved":true,"context_lines":[{"line_number":521,"context_line":"         When set to True, nodepool-builder will not upload the image"},{"line_number":522,"context_line":"         to the provider."},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"      .. attr:: username"},{"line_number":525,"context_line":"         :type: str"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"         The username that should be used when connecting to the node."}],"source_content_type":"text/x-rst","patch_set":1,"id":"168c2884_2d714bfe","line":524,"updated":"2021-12-14 16:27:13.000000000","message":"Isn\u0027t the username already defined in the top level diskimage definition?","commit_id":"505266c9f805eca8784163e3a691d5ddd9e51025"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"55a8d10e727dc55fe05d83da10a0ce021a527265","unresolved":false,"context_lines":[{"line_number":521,"context_line":"         When set to True, nodepool-builder will not upload the image"},{"line_number":522,"context_line":"         to the provider."},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"      .. attr:: username"},{"line_number":525,"context_line":"         :type: str"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"         The username that should be used when connecting to the node."}],"source_content_type":"text/x-rst","patch_set":1,"id":"262f9484_7bfd0077","line":524,"updated":"2021-12-14 16:40:19.000000000","message":"Yes that\u0027s correct.  We should either omit this or we could keep it and update it to allow for an override.","commit_id":"505266c9f805eca8784163e3a691d5ddd9e51025"}],"nodepool/driver/ibmvpc/adapter.py":[{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"1ff797583a8dacdbb013ac79e3b1f0e550a5d67d","unresolved":true,"context_lines":[{"line_number":291,"context_line":"        self.rate_limiter \u003d RateLimiter(self.provider.name,"},{"line_number":292,"context_line":"                                        self.provider.rate)"},{"line_number":293,"context_line":"        if self.provider.credentials_file:"},{"line_number":294,"context_line":"            os.environ[\u0027IBM_CREDENTIALS_FILE\u0027] \u003d self.provider.credentials_file"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        authenticator \u003d get_authenticator_from_environment(\u0027vpc\u0027)"},{"line_number":297,"context_line":"        self.cloud_vpc \u003d VpcV1(authenticator\u003dauthenticator)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a18030b_8c112aa7","line":294,"updated":"2022-01-13 16:02:00.000000000","message":"I guess this won\u0027t work when using different credentials-file, should this setting be unique per nodepool-launcher instance (instead of per provider)?","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"07eeca8b7f3deb48e634accb6d2f4a70c41796c6","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        self.rate_limiter \u003d RateLimiter(self.provider.name,"},{"line_number":292,"context_line":"                                        self.provider.rate)"},{"line_number":293,"context_line":"        if self.provider.credentials_file:"},{"line_number":294,"context_line":"            os.environ[\u0027IBM_CREDENTIALS_FILE\u0027] \u003d self.provider.credentials_file"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        authenticator \u003d get_authenticator_from_environment(\u0027vpc\u0027)"},{"line_number":297,"context_line":"        self.cloud_vpc \u003d VpcV1(authenticator\u003dauthenticator)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa808087_ffd5d281","line":294,"updated":"2022-01-19 22:54:43.000000000","message":"I think we can make this safe for multiple providers by wrapping it in a global threading.Lock.  Once the authenticator is constructed, the env variables aren\u0027t used any more.","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"1ff797583a8dacdbb013ac79e3b1f0e550a5d67d","unresolved":true,"context_lines":[{"line_number":294,"context_line":"            os.environ[\u0027IBM_CREDENTIALS_FILE\u0027] \u003d self.provider.credentials_file"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        authenticator \u003d get_authenticator_from_environment(\u0027vpc\u0027)"},{"line_number":297,"context_line":"        self.cloud_vpc \u003d VpcV1(authenticator\u003dauthenticator)"},{"line_number":298,"context_line":"        self.cloud_resource_manager \u003d ResourceManagerV2("},{"line_number":299,"context_line":"            authenticator\u003dauthenticator)"},{"line_number":300,"context_line":"        self.cloud_resource_controller \u003d ResourceControllerV2("}],"source_content_type":"text/x-python","patch_set":2,"id":"118fdc24_542c44f7","line":297,"updated":"2022-01-13 16:02:00.000000000","message":"It seems like the region name is not passed to the sdk. I could not find what is the right way to do this, but after reading the source code, this is what we found to make it work with a custom region:\n\n  service_url \u003d f\"https://{self.provider.region}.iaas.cloud.ibm.com/v1\" % self.provider.region \n  self.cloud_vpc.set_service_url(service_url)","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"07eeca8b7f3deb48e634accb6d2f4a70c41796c6","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            os.environ[\u0027IBM_CREDENTIALS_FILE\u0027] \u003d self.provider.credentials_file"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        authenticator \u003d get_authenticator_from_environment(\u0027vpc\u0027)"},{"line_number":297,"context_line":"        self.cloud_vpc \u003d VpcV1(authenticator\u003dauthenticator)"},{"line_number":298,"context_line":"        self.cloud_resource_manager \u003d ResourceManagerV2("},{"line_number":299,"context_line":"            authenticator\u003dauthenticator)"},{"line_number":300,"context_line":"        self.cloud_resource_controller \u003d ResourceControllerV2("}],"source_content_type":"text/x-python","patch_set":2,"id":"a6d3b119_ec151684","line":297,"updated":"2022-01-19 22:54:43.000000000","message":"That looks like a good update; I don\u0027t think it\u0027s strictly required to contact the API endpoint of the region being used, but it sure makes sense.  :)","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"07eeca8b7f3deb48e634accb6d2f4a70c41796c6","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        self._getProfiles()"},{"line_number":339,"context_line":"        self.subnets \u003d {}"},{"line_number":340,"context_line":"        self._getSubnets()"},{"line_number":341,"context_line":"        self.subnet_id \u003d self.subnets[self.provider.subnet][\u0027id\u0027]"},{"line_number":342,"context_line":"        self.keys \u003d {}"},{"line_number":343,"context_line":"        self._getKeys()"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1246a27c_74c10eeb","line":341,"updated":"2022-01-19 22:54:43.000000000","message":"LGTM.","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"1ff797583a8dacdbb013ac79e3b1f0e550a5d67d","unresolved":true,"context_lines":[{"line_number":338,"context_line":"        self._getProfiles()"},{"line_number":339,"context_line":"        self.subnets \u003d {}"},{"line_number":340,"context_line":"        self._getSubnets()"},{"line_number":341,"context_line":"        self.subnet_id \u003d self.subnets[self.provider.subnet][\u0027id\u0027]"},{"line_number":342,"context_line":"        self.keys \u003d {}"},{"line_number":343,"context_line":"        self._getKeys()"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8d456199_dddde5b0","line":341,"updated":"2022-01-13 16:02:00.000000000","message":"it might be useful to check that the selected subnet is in the correct zone, otherwise if there is a mismatch, it will fail when creating the instance (`Error: the network interface\u0027s subnet is located in a different zone from the vsi`).\n\nThat should do the trick:\n\n    subnet_zone \u003d self.subnets[self.provider.subnet][\u0027zone\u0027][\u0027name\u0027]\n    if subnet_zone !\u003d self.provider.zone:\n        raise Exception(f\"Subnet is {self.provider.subnet} zone mismatch: {subnet_zone} /\u003d {self.provider.zone}\")","commit_id":"805ae0d44dbca5bb81e8d9c3eb52a07dad808a9b"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            self.fip \u003d self.adapter._deleteFloatingIP(self.external_id)"},{"line_number":164,"context_line":"            self.state \u003d self.FIP_DELETING"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if self.state \u003d\u003d self.FIP_DELETING:"},{"line_number":167,"context_line":"            if self.fip:"},{"line_number":168,"context_line":"                self.fip \u003d self.adapter._refreshFloatingIP("},{"line_number":169,"context_line":"                    self.fip, delete\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"22e7a042_37012bfe","line":166,"updated":"2022-03-14 22:38:47.000000000","message":"Intentionally not elif -- we should do as much work as we can in one pass.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":163,"context_line":"            self.fip \u003d self.adapter._deleteFloatingIP(self.external_id)"},{"line_number":164,"context_line":"            self.state \u003d self.FIP_DELETING"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if self.state \u003d\u003d self.FIP_DELETING:"},{"line_number":167,"context_line":"            if self.fip:"},{"line_number":168,"context_line":"                self.fip \u003d self.adapter._refreshFloatingIP("},{"line_number":169,"context_line":"                    self.fip, delete\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"b10ba70a_ea08d208","line":166,"updated":"2022-03-14 21:42:48.000000000","message":"Just noting that the first advance call is likely enter this block as well as the block above. If we wanted to make it more step wise then these should be elifs. I don\u0027t think that is necessary though.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":413,"context_line":"                    \u0027name\u0027: obj[\u0027Key\u0027],"},{"line_number":414,"context_line":"                    \u0027id\u0027: obj[\u0027Key\u0027],"},{"line_number":415,"context_line":"                }"},{"line_number":416,"context_line":"                yield IBMVPCResource(\u0027object\u0027, storage_object, rg)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def deleteResource(self, resource):"},{"line_number":419,"context_line":"        self.log.info(f\"Deleting leaked {resource.type}: {resource.name}\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"d913f84b_8c3dc260","line":416,"updated":"2022-03-14 21:42:48.000000000","message":"Just talking out loud here listing the object store resources along side the other resources may not be super desireable if that set of resources grows large. In this case the objects should be removed after image creation which should keep this manageable. But if they leak or if we don\u0027t delete them as expected objects should hang around for quite some time.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                    \u0027name\u0027: obj[\u0027Key\u0027],"},{"line_number":414,"context_line":"                    \u0027id\u0027: obj[\u0027Key\u0027],"},{"line_number":415,"context_line":"                }"},{"line_number":416,"context_line":"                yield IBMVPCResource(\u0027object\u0027, storage_object, rg)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def deleteResource(self, resource):"},{"line_number":419,"context_line":"        self.log.info(f\"Deleting leaked {resource.type}: {resource.name}\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"8e05e1d5_bbb2d929","line":416,"updated":"2022-03-14 22:38:47.000000000","message":"Yes.  The intent is to dedicate a bucket for this though, so it should only grow large if it leaks.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":502,"context_line":"            with self.rate_limiter:"},{"line_number":503,"context_line":"                image \u003d self.cloud_vpc.get_image(image[\u0027id\u0027]).get_result()"},{"line_number":504,"context_line":"                if image[\u0027status\u0027] \u003d\u003d \u0027pending\u0027:"},{"line_number":505,"context_line":"                    continue"},{"line_number":506,"context_line":"                if image[\u0027status\u0027] \u003d\u003d \u0027available\u0027:"},{"line_number":507,"context_line":"                    break"},{"line_number":508,"context_line":"                raise Exception("}],"source_content_type":"text/x-python","patch_set":8,"id":"61a743aa_1b25ff79","line":505,"updated":"2022-03-14 22:38:47.000000000","message":"Good idea; will followup.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":502,"context_line":"            with self.rate_limiter:"},{"line_number":503,"context_line":"                image \u003d self.cloud_vpc.get_image(image[\u0027id\u0027]).get_result()"},{"line_number":504,"context_line":"                if image[\u0027status\u0027] \u003d\u003d \u0027pending\u0027:"},{"line_number":505,"context_line":"                    continue"},{"line_number":506,"context_line":"                if image[\u0027status\u0027] \u003d\u003d \u0027available\u0027:"},{"line_number":507,"context_line":"                    break"},{"line_number":508,"context_line":"                raise Exception("}],"source_content_type":"text/x-python","patch_set":8,"id":"fbb4510e_1f8f0659","line":505,"updated":"2022-03-14 21:42:48.000000000","message":"You might want a sleep here just to keep this from consuming the rate limit capacity? For image uploads this is probably not much of a concern though as they happen infrequently.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                result \u003d fn(*args, **kw, start\u003dstart).get_result()"},{"line_number":560,"context_line":"                ret.extend(result[resultname])"},{"line_number":561,"context_line":"                if \u0027next\u0027 in result:"},{"line_number":562,"context_line":"                    start \u003d get_query_param(result[\u0027next\u0027][\u0027href\u0027], \u0027start\u0027)"},{"line_number":563,"context_line":"                else:"},{"line_number":564,"context_line":"                    break"},{"line_number":565,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":8,"id":"2b121c81_4b3ba778","line":562,"updated":"2022-03-14 22:38:47.000000000","message":"If there is a \u0027next\u0027, we will either get the \u0027start\u0027 value from it, or raise an exception.  If there is no next, then we break after one pass through the loop.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":559,"context_line":"                result \u003d fn(*args, **kw, start\u003dstart).get_result()"},{"line_number":560,"context_line":"                ret.extend(result[resultname])"},{"line_number":561,"context_line":"                if \u0027next\u0027 in result:"},{"line_number":562,"context_line":"                    start \u003d get_query_param(result[\u0027next\u0027][\u0027href\u0027], \u0027start\u0027)"},{"line_number":563,"context_line":"                else:"},{"line_number":564,"context_line":"                    break"},{"line_number":565,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":8,"id":"70df77b6_49b7f5cd","line":562,"range":{"start_line":562,"start_character":68,"end_line":562,"end_character":75},"updated":"2022-03-14 21:42:48.000000000","message":"If this is a default value will we end up returning a \"double\" list in the case of no href being present?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def _getResourceGroups(self):"},{"line_number":568,"context_line":"        for rg in self.cloud_resource_manager.list_resource_groups()\\"},{"line_number":569,"context_line":"                                             .get_result()[\u0027resources\u0027]:"},{"line_number":570,"context_line":"            self.log.debug(f\"Found resource group {rg[\u0027name\u0027]}\")"},{"line_number":571,"context_line":"            self.resource_groups[rg[\u0027name\u0027]] \u003d rg"},{"line_number":572,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bee5e884_9fb86768","line":569,"updated":"2022-03-14 21:42:48.000000000","message":"Does this need to handle pagination?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def _getResourceGroups(self):"},{"line_number":568,"context_line":"        for rg in self.cloud_resource_manager.list_resource_groups()\\"},{"line_number":569,"context_line":"                                             .get_result()[\u0027resources\u0027]:"},{"line_number":570,"context_line":"            self.log.debug(f\"Found resource group {rg[\u0027name\u0027]}\")"},{"line_number":571,"context_line":"            self.resource_groups[rg[\u0027name\u0027]] \u003d rg"},{"line_number":572,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"8989a4fc_a7ddc514","line":569,"updated":"2022-03-14 22:38:47.000000000","message":"This API call is not paginated: https://cloud.ibm.com/apidocs/resource-controller/resource-manager#list-resource-groups","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":596,"context_line":"    def _getProfiles(self):"},{"line_number":597,"context_line":"        self.log.debug(\"Querying instance profiles\")"},{"line_number":598,"context_line":"        with self.rate_limiter:"},{"line_number":599,"context_line":"            result \u003d self.cloud_vpc.list_instance_profiles().get_result()"},{"line_number":600,"context_line":"            for profile in result[\u0027profiles\u0027]:"},{"line_number":601,"context_line":"                self.profiles[profile[\u0027name\u0027]] \u003d profile"},{"line_number":602,"context_line":"        self.log.debug(\"Done querying instance profiles\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"c00fcd88_2b7cb54c","line":599,"updated":"2022-03-14 21:42:48.000000000","message":"Does this need to handle pagination?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":596,"context_line":"    def _getProfiles(self):"},{"line_number":597,"context_line":"        self.log.debug(\"Querying instance profiles\")"},{"line_number":598,"context_line":"        with self.rate_limiter:"},{"line_number":599,"context_line":"            result \u003d self.cloud_vpc.list_instance_profiles().get_result()"},{"line_number":600,"context_line":"            for profile in result[\u0027profiles\u0027]:"},{"line_number":601,"context_line":"                self.profiles[profile[\u0027name\u0027]] \u003d profile"},{"line_number":602,"context_line":"        self.log.debug(\"Done querying instance profiles\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"40b97a0b_dce812cd","line":599,"updated":"2022-03-14 22:38:47.000000000","message":"Nope: https://cloud.ibm.com/apidocs/vpc#list-instance-profiles","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":788,"context_line":"            with self.rate_limiter:"},{"line_number":789,"context_line":"                fip \u003d self.cloud_vpc.get_floating_ip(fip[\u0027id\u0027]).get_result()"},{"line_number":790,"context_line":"        if \u0027target\u0027 not in fip:"},{"line_number":791,"context_line":"            return fip"},{"line_number":792,"context_line":"        with self.rate_limiter:"},{"line_number":793,"context_line":"            self.log.debug(f\"Detaching floating IP address from {name}\")"},{"line_number":794,"context_line":"            return self.cloud_vpc.\\"}],"source_content_type":"text/x-python","patch_set":8,"id":"c89b37c3_1db5d762","line":791,"updated":"2022-03-14 21:42:48.000000000","message":"Might want to also double check that vm \u003d\u003d target? Otherwise you could detach from a different instance? This is unused so also not very important.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"}],"nodepool/driver/ibmvpc/config.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def external_name(self):"},{"line_number":48,"context_line":"        \u0027\u0027\u0027Human readable version of external.\u0027\u0027\u0027"},{"line_number":49,"context_line":"        return (self.image_name or self.image_href or"},{"line_number":50,"context_line":"                self.image_name or self.name)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def getSchema():"}],"source_content_type":"text/x-python","patch_set":8,"id":"db6add6c_b91a89e5","line":50,"updated":"2022-03-14 22:38:47.000000000","message":"Probably image_id.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":47,"context_line":"    def external_name(self):"},{"line_number":48,"context_line":"        \u0027\u0027\u0027Human readable version of external.\u0027\u0027\u0027"},{"line_number":49,"context_line":"        return (self.image_name or self.image_href or"},{"line_number":50,"context_line":"                self.image_name or self.name)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def getSchema():"}],"source_content_type":"text/x-python","patch_set":8,"id":"a1b1e4b0_9dcfd63f","line":50,"range":{"start_line":50,"start_character":16,"end_line":50,"end_character":31},"updated":"2022-03-14 21:42:48.000000000","message":"This is redundant since it is the first value checked. Was this meant to be image_id?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                msg\u003d(\u0027Provide either \"image-filter\", \"image-href\", \u0027"},{"line_number":85,"context_line":"                     \u0027\"image-id\", or \"image-name\" keys\u0027)"},{"line_number":86,"context_line":"            ): object,"},{"line_number":87,"context_line":"            object: object,"},{"line_number":88,"context_line":"        })"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dc257141_230b47d8","line":87,"updated":"2022-03-14 22:38:47.000000000","message":"It allows everything in the previous dictionary (name, username, etc) to pass through.\n\nGetting the exclusive-and-required behavior we want for the image-* attributes is tricky with voluptuous.  We have to do it in two steps:\n\n  1) The schema should match the (name, username, etc) dictionary.  This includes a requirement than no more than one image-* attribute be present (but doesn\u0027t indicate that any of them are required).\n  2) At least one image-* must be present, and beyond that we don\u0027t care what else is there.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                msg\u003d(\u0027Provide either \"image-filter\", \"image-href\", \u0027"},{"line_number":85,"context_line":"                     \u0027\"image-id\", or \"image-name\" keys\u0027)"},{"line_number":86,"context_line":"            ): object,"},{"line_number":87,"context_line":"            object: object,"},{"line_number":88,"context_line":"        })"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"8142aaf9_964fce6f","line":87,"range":{"start_line":87,"start_character":12,"end_line":87,"end_character":27},"updated":"2022-03-14 21:42:48.000000000","message":"What does this extra object: object key value pair do in the schema?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":158,"context_line":"                    (diskimage_name, provider_config.name, self.name))"},{"line_number":159,"context_line":"            self.diskimage \u003d diskimage"},{"line_number":160,"context_line":"        else:"},{"line_number":161,"context_line":"            self.diskimage \u003d None"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        self.profile \u003d label[\u0027profile\u0027]"},{"line_number":164,"context_line":"        self.user_data \u003d label.get(\u0027user-data\u0027, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa934502_32d2780b","line":161,"updated":"2022-03-14 21:42:48.000000000","message":"Do we need to check for setting one of cloud_image_name or diskimage here?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    (diskimage_name, provider_config.name, self.name))"},{"line_number":159,"context_line":"            self.diskimage \u003d diskimage"},{"line_number":160,"context_line":"        else:"},{"line_number":161,"context_line":"            self.diskimage \u003d None"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        self.profile \u003d label[\u0027profile\u0027]"},{"line_number":164,"context_line":"        self.user_data \u003d label.get(\u0027user-data\u0027, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"d2d6ab31_250a590b","line":161,"updated":"2022-03-14 22:38:47.000000000","message":"That might be a good improvement, but I don\u0027t think we do that anywhere yet.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":171,"context_line":"            \u0027diskimage\u0027: str,"},{"line_number":172,"context_line":"            v.Required(\u0027profile\u0027): str,"},{"line_number":173,"context_line":"            \u0027user-data\u0027: str,"},{"line_number":174,"context_line":"        }"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"class IBMVPCPool(ConfigPool):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fd68f1eb_43be6336","line":174,"updated":"2022-03-14 21:42:48.000000000","message":"Or maybe checking the above item at a schema level here is preferred.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":238,"context_line":"        pass"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def load(self, config):"},{"line_number":241,"context_line":"        self.image_type \u003d self.provider.get(\u0027image-format\u0027, \u0027qcow2\u0027)"},{"line_number":242,"context_line":"        self.image_name_format \u003d \u0027npimage{upload_id}\u0027"},{"line_number":243,"context_line":"        self.post_upload_hook \u003d self.provider.get(\u0027post-upload-hook\u0027)"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bed302fe_71c50534","line":241,"updated":"2022-03-14 21:42:48.000000000","message":"Is there any reason to make this configurable? I wonder if ibm cloud boots multiple image formats. I guess it doesn\u0027t hurt if they grow that feature.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1956932961b38f6dc36d8873329de2d2221bb7ad","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        pass"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def load(self, config):"},{"line_number":241,"context_line":"        self.image_type \u003d self.provider.get(\u0027image-format\u0027, \u0027qcow2\u0027)"},{"line_number":242,"context_line":"        self.image_name_format \u003d \u0027npimage{upload_id}\u0027"},{"line_number":243,"context_line":"        self.post_upload_hook \u003d self.provider.get(\u0027post-upload-hook\u0027)"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"170ede71_a599c378","line":241,"updated":"2022-03-14 22:38:47.000000000","message":"Yeah, was just future-proofing.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"}],"nodepool/tests/fixtures/ibmvpc.yaml":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"55a8d10e727dc55fe05d83da10a0ce021a527265","unresolved":false,"context_lines":[{"line_number":55,"context_line":"          operating-system:"},{"line_number":56,"context_line":"            family: \"Debian GNU/Linux\""},{"line_number":57,"context_line":"            version: \"9.x Stretch/Stable - Minimal Install\""},{"line_number":58,"context_line":"              "},{"line_number":59,"context_line":"    diskimages:"},{"line_number":60,"context_line":"      - name: fake-image"},{"line_number":61,"context_line":"        # This actually works for booting a fedora image"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"0c3dad3b_1be7b76b","line":58,"updated":"2021-12-14 16:40:19.000000000","message":"Fix on next ps.","commit_id":"505266c9f805eca8784163e3a691d5ddd9e51025"}],"nodepool/tests/unit/test_driver_ibmvpc.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":27,"context_line":"from . import fake_ibmboto"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def make_image(name, tags):"},{"line_number":31,"context_line":"    return {"},{"line_number":32,"context_line":"        \u0027name\u0027: name,"},{"line_number":33,"context_line":"        \u0027id\u0027: (\u0027/subscriptions/c35cf7df-ed75-4c85-be00-535409a85120/\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"e435cc3e_a6ada2e0","line":30,"updated":"2022-03-14 21:42:48.000000000","message":"Is this leftover from azure testing? Can we remove it?","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"}],"requirements.txt":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"81fa32dca1ee3eadfe815d3e04a61ad71ecfef4d","unresolved":true,"context_lines":[{"line_number":27,"context_line":"urllib3\u003e\u003d1.26.0"},{"line_number":28,"context_line":"ibm-vpc"},{"line_number":29,"context_line":"ibm-platform-services"},{"line_number":30,"context_line":"ibm-cos-sdk"}],"source_content_type":"text/plain","patch_set":8,"id":"a9c4ee9d_2425180d","line":30,"updated":"2022-03-14 21:42:48.000000000","message":"All three of these new deps appear to be Apache 2 licensed. Should be happy with this Apache 2 licensed code base as a result.","commit_id":"bd19da6d4d53ad4afb091793569b7df3475d5d1c"}]}
