diff --git a/capsulflask/hub_model.py b/capsulflask/hub_model.py index 478100c..ca4bc51 100644 --- a/capsulflask/hub_model.py +++ b/capsulflask/hub_model.py @@ -21,8 +21,17 @@ class MockHub(VirtualizationInterface): def capacity_avaliable(self, additional_ram_bytes): return True - def get(self, id): + def get(self, id, get_ssh_host_keys): validate_capsul_id(id) + + if get_ssh_host_keys: + ssh_host_keys = json.loads("""[ + {"key_type":"ED25519", "content":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN8cna0zeKSKl/r8whdn/KmDWhdzuWRVV0GaKIM+eshh", "sha256":"V4X2apAF6btGAfS45gmpldknoDX0ipJ5c6DLfZR2ttQ"}, + {"key_type":"RSA", "content":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvotgzgEP65JUQ8S8OoNKy1uEEPEAcFetSp7QpONe6hj4wPgyFNgVtdoWdNcU19dX3hpdse0G8OlaMUTnNVuRlbIZXuifXQ2jTtCFUA2mmJ5bF+XjGm3TXKMNGh9PN+wEPUeWd14vZL+QPUMev5LmA8cawPiU5+vVMLid93HRBj118aCJFQxLgrdP48VPfKHFRfCR6TIjg1ii3dH4acdJAvlmJ3GFB6ICT42EmBqskz2MPe0rIFxH8YohCBbAbrbWYcptHt4e48h4UdpZdYOhEdv89GrT8BF2C5cbQ5i9qVpI57bXKrj8hPZU5of48UHLSpXG8mbH0YDiOQOfKX/Mt", "sha256":"ghee6KzRnBJhND2kEUZSaouk7CD6o6z2aAc8GPkV+GQ"}, + {"key_type":"ECDSA", "content":"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLLgOoATz9R4aS2kk7vWoxX+lshK63t9+5BIHdzZeFE1o+shlcf0Wji8cN/L1+m3bi0uSETZDOAWMP3rHLJj9Hk=", "sha256":"aCYG1aD8cv/TjzJL0bi9jdabMGksdkfa7R8dCGm1yYs"} + ]""") + return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], ipv4="1.1.1.1", ssh_host_keys=ssh_host_keys) + return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], ipv4="1.1.1.1") def list_ids(self) -> list: @@ -123,17 +132,17 @@ class CapsulFlaskHub(VirtualizationInterface): return False - def get(self, id) -> VirtualMachine: + def get(self, id, get_ssh_host_keys) -> VirtualMachine: validate_capsul_id(id) host = get_model().host_of_capsul(id) if host is not None: - payload = json.dumps(dict(type="get", id=id)) + payload = json.dumps(dict(type="get", id=id, get_ssh_host_keys=get_ssh_host_keys)) results = self.synchronous_operation([host], payload) for result in results: try: result_body = json.loads(result.body) if isinstance(result_body, dict) and ('ipv4' in result_body or 'ipv6' in result_body): - return VirtualMachine(id, host=host, ipv4=result_body['ipv4'], ipv6=result_body['ipv6']) + return VirtualMachine(id, host=host, ipv4=result_body['ipv4'], ipv6=result_body['ipv6'], ssh_host_keys=result_body['ssh_host_keys']) except: pass diff --git a/capsulflask/spoke_api.py b/capsulflask/spoke_api.py index a3de660..f07c541 100644 --- a/capsulflask/spoke_api.py +++ b/capsulflask/spoke_api.py @@ -41,7 +41,7 @@ def operation_with_id(operation_id: int): def operation_without_id(): return operation_impl(None) -def operation_impl(operation_id: int): +def operation_impl(operation_id: int|None): if authorized_as_hub(request.headers): request_body_json = request.json request_body = json.loads(request_body_json) @@ -89,9 +89,9 @@ def handle_get(operation_id, request_body): current_app.logger.error(f"/hosts/operation returned 400: id is required for get") return abort(400, f"bad request; id is required for get") - vm = current_app.config['SPOKE_MODEL'].get(request_body['id']) + vm = current_app.config['SPOKE_MODEL'].get(request_body['id'], request_body['get_ssh_host_keys']) - return jsonify(dict(assignment_status="assigned", id=vm.id, host=vm.host, ipv4=vm.ipv4, ipv6=vm.ipv6)) + return jsonify(dict(assignment_status="assigned", id=vm.id, host=vm.host, ipv4=vm.ipv4, ipv6=vm.ipv6, ssh_host_keys=vm.ssh_host_keys)) def handle_list_ids(operation_id, request_body): return jsonify(dict(assignment_status="assigned", ids=current_app.config['SPOKE_MODEL'].list_ids()))