{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":78537725,"defaultBranch":"main","name":"aiida-core","ownerLogin":"sphuber","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2017-01-10T13:50:47.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/6992332?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1724850062.0","currentOid":""},"activityList":{"items":[{"before":null,"after":"b24fc3c5a3be77f78c7b1f284a0217002f30775b","ref":"refs/heads/fix/close-database-connections","pushedAt":"2024-08-28T13:01:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"`PsqlDosStorage`: Close all sessions when storage closes\n\nThe recommended approach for controlling session lifetime and the\nassociated connections is to open sessions using a context manager such\nthat they are automatically closed at the end of the scope.\n\nThe storage class currently does not use this approach but creates\nsessions without context manager and so they have to be closed manually.\nThe `close` method should explicitly close any existing sessions.\n\nThe SqlAlchemy API provides the `sqlalchemy.orm.close_all_sessions`\nfunction to close all sessions, but this will close _all_ sessions and\nnot just those that are associated with the current storage. Therefore,\ninstead we have to manually iterate over the global cache of sessions,\nwhich is kept in `sqlalchemy.orm.session._sessions` and close those\nsessions that are associated with the same engine as the storage's.","shortMessageHtmlLink":"PsqlDosStorage: Close all sessions when storage closes"}},{"before":null,"after":"2e0633a77f15971b14eea62a01d520d40c912c19","ref":"refs/heads/feature/azure-broker","pushedAt":"2024-08-26T09:25:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Very early implementation of broker interface using Azure services\n\nUses the Azure Service Bus implementation for the process queue.t","shortMessageHtmlLink":"Very early implementation of broker interface using Azure services"}},{"before":"ac616ab5d2e802f37d3a18308ddbe756f3c95fea","after":null,"ref":"refs/heads/fix/6558/dependencies-paramiko","pushedAt":"2024-08-20T15:19:22.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"2bea022840d514506448de57053ce42cd950bdfd","after":null,"ref":"refs/heads/fix/6557/verdi-plugin-list","pushedAt":"2024-08-19T10:32:05.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"4591145ed5d3b92891dd1904591ae9a54a055526","after":null,"ref":"refs/heads/fix/tmp-config-profile-fixtures","pushedAt":"2024-08-19T08:57:53.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"8816801b252b4e19b14ab7a071bec0da1759aa3f","after":"ac616ab5d2e802f37d3a18308ddbe756f3c95fea","ref":"refs/heads/fix/6558/dependencies-paramiko","pushedAt":"2024-08-19T08:56:32.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Dependencies: Update requirement `paramiko~=3.0`","shortMessageHtmlLink":"Dependencies: Update requirement paramiko~=3.0"}},{"before":null,"after":"2bea022840d514506448de57053ce42cd950bdfd","ref":"refs/heads/fix/6557/verdi-plugin-list","pushedAt":"2024-08-19T08:54:54.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"CLI: Fix exception for `verdi plugin list`\n\nIn e952d7717c1d8001555e8d19f54f4fa349da6c6e a bug in `verdi plugin list`\nwas fixed where the conditional to check whether the plugin was a\nprocess class would always raise an `AttributeError` if the plugin was\nnot a `Process` or a proces function. As a result, the code would never\nget to the else-clause.\n\nThe else-clause contained itself another bug, which was now revealed by\nthe fixing of the bug in the conditional. The else-clause would call the\n`get_description` classmethod of the plugin, but no classes in AiiDA\nthat are pluginnable even define such a class method. Probably, the\noriginal author confused it with the instance method `get_description`\nbut the `verdi plugin list` command just deals with the class.\n\nThe `get_description` call is replaced with just getting `__doc__` which\nreturns the docstring of the class/function, or `None` if it is not\ndefined. In the latter case, a default message is displayed saying that\nno description is available.\n\nSince the else-clause code was never reached before the recent fix and\nthe `get_description` method was never supported officially by AiiDA's\npluginnable interfaces, it is fine to just change this behavior.","shortMessageHtmlLink":"CLI: Fix exception for verdi plugin list"}},{"before":"b67e9e83de0991f7dea8de3dd2e33fd7ccf22ad5","after":"8816801b252b4e19b14ab7a071bec0da1759aa3f","ref":"refs/heads/fix/6558/dependencies-paramiko","pushedAt":"2024-08-19T08:29:42.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Dependencies: Update requirement `paramiko~=3.0`","shortMessageHtmlLink":"Dependencies: Update requirement paramiko~=3.0"}},{"before":null,"after":"b67e9e83de0991f7dea8de3dd2e33fd7ccf22ad5","ref":"refs/heads/fix/6558/dependencies-paramiko","pushedAt":"2024-08-19T08:26:26.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Dependencies: Update requirement `paramiko~=3.0`","shortMessageHtmlLink":"Dependencies: Update requirement paramiko~=3.0"}},{"before":"9d1d08a856f3a34708634ca4ac03d09bcc98cf07","after":null,"ref":"refs/heads/fix/remove-old-local-config-fixtures-bak","pushedAt":"2024-08-19T08:19:55.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"a529e9b960fc04c483edea62ef9baab0cc9e72d3","after":null,"ref":"refs/heads/fix/remove-old-local-config-fixtures","pushedAt":"2024-08-19T08:19:51.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"9816200c4edcefb84cde5547bb85650b3b75c7ff","after":"d4c4d94851836e58e743d8f1a2d30c665af2ae3b","ref":"refs/heads/feature/orm-pydantic-models","pushedAt":"2024-08-09T07:56:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"ORM: Use `pydantic` to specify a schema for each ORM entity","shortMessageHtmlLink":"ORM: Use pydantic to specify a schema for each ORM entity"}},{"before":null,"after":"4591145ed5d3b92891dd1904591ae9a54a055526","ref":"refs/heads/fix/tmp-config-profile-fixtures","pushedAt":"2024-08-08T14:57:23.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Replace `config_with_profile` with `aiida_profile_tmp`","shortMessageHtmlLink":"Replace config_with_profile with aiida_profile_tmp"}},{"before":"988a9614a648fdf12bd5b86a369139739c9396d6","after":"a529e9b960fc04c483edea62ef9baab0cc9e72d3","ref":"refs/heads/fix/remove-old-local-config-fixtures","pushedAt":"2024-08-08T10:07:47.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Replace use of `isolated_config` with `aiida_config_tmp`","shortMessageHtmlLink":"Replace use of isolated_config with aiida_config_tmp"}},{"before":null,"after":"9d1d08a856f3a34708634ca4ac03d09bcc98cf07","ref":"refs/heads/fix/remove-old-local-config-fixtures-bak","pushedAt":"2024-08-08T10:03:44.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"36bf9e1009814cc6426713efa012fed07a7d4a92","after":"988a9614a648fdf12bd5b86a369139739c9396d6","ref":"refs/heads/fix/remove-old-local-config-fixtures","pushedAt":"2024-08-06T18:37:04.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"WIP","shortMessageHtmlLink":"WIP"}},{"before":"c7ffdd1e8afb50f5482fc0b039a92b8ed30d9560","after":null,"ref":"refs/heads/fix/6548/seal-excepted-process","pushedAt":"2024-08-06T08:41:52.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"28636f75546659aee633f8fa568d241c1c3ce4b3","after":"c7ffdd1e8afb50f5482fc0b039a92b8ed30d9560","ref":"refs/heads/fix/6548/seal-excepted-process","pushedAt":"2024-08-06T07:16:11.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Engine: Ensure node is sealed when process excepts\n\nProcesses that hit a certain exception were not being sealed. This would\ncause problems when trying to export them, which only allows sealed\nnodes. The problem occurs when another exception occurs while handling\nthe original exception.\n\nAn example is when `Process.update_outputs` would raise a `ValueError`\nbecause an unstored node had be attached as an output. Since this method\nis called in `on_entered`, which is called when the process entered a\nnew state, it would be called again when it entered the excepted state.\nSince the process was already excepted, the rest of the state changes is\ncut short by `plumpy`. This would cause the process to never go to the\nfinal `TERMINATED` state and so the `on_terminated` method would not be\ncalled, which is where the process' node is sealed.\n\nThe solution is to check the current state in `on_entered` and if it is\n`EXCEPTED` to simply return and no longer perform any updates on the\nnode. This should prevent any other exceptions from being hit and ensure\nthe process transitions properly to the final terminated state. The only\nupdate that is still performed is to update the process state on the\nprocess' node, otherwise it would not properly be shown as excepted.","shortMessageHtmlLink":"Engine: Ensure node is sealed when process excepts"}},{"before":"6459592c0083ee132584fc195ca3114cd42806e6","after":null,"ref":"refs/heads/fix/6547/verdi-storage-info-exit-status","pushedAt":"2024-08-05T09:09:32.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"6019e8bbbce99e2eb864d74fcc3ad3b04cc5b02b","after":null,"ref":"refs/heads/fix/6546/verdi-storage-migrate-no-broker","pushedAt":"2024-07-25T06:11:40.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"e480aff84420576981fffa8736b0b66c8fe45ffa","after":"6019e8bbbce99e2eb864d74fcc3ad3b04cc5b02b","ref":"refs/heads/fix/6546/verdi-storage-migrate-no-broker","pushedAt":"2024-07-24T22:47:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"CLI: Fix `verdi storage migrate` for profile without broker\n\nThe command needs to make sure the daemon of the profile is not running\nso it instantiates the `DaemonClient` but this raises for profiles that\ndo not define a broker. Since the daemon cannot be started for\nbrokerless profiles anyway the command does not have to check in this\ncase.","shortMessageHtmlLink":"CLI: Fix verdi storage migrate for profile without broker"}},{"before":null,"after":"6459592c0083ee132584fc195ca3114cd42806e6","ref":"refs/heads/fix/6547/verdi-storage-info-exit-status","pushedAt":"2024-07-24T22:44:57.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"CLI: Validate storage in `verdi storage version`\n\nThe `verdi storage version`, in addition to printing the version of the\ncode's and storage's schema, now also validates the storage. If the\nstorage is corrupt or cannot be reached, the command returns the exit\ncode 3. If the storage and code schema versions are incompatible, exit\ncode 4 is returned. This way this command serves as an alternative to\nrunning `verdi storage migrate` as a way to check whether a profile\nneeds to be migrated. The `verdi storage migrate` command needs to\nperform checks such as whether the daemon is running and so is always\ngoing to be slower.","shortMessageHtmlLink":"CLI: Validate storage in verdi storage version"}},{"before":null,"after":"e480aff84420576981fffa8736b0b66c8fe45ffa","ref":"refs/heads/fix/6546/verdi-storage-migrate-no-broker","pushedAt":"2024-07-24T22:13:58.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"CLI: Fix `verdi storage migrate` for profile without broker\n\nThe command needs to make sure the daemon of the profile is not running\nso it instantiates the `DaemonClient` but this raises for profiles that\ndo not define a broker. Since the daemon cannot be started for\nbrokerless profiles anyway the command does not have to check in this\ncase.","shortMessageHtmlLink":"CLI: Fix verdi storage migrate for profile without broker"}},{"before":null,"after":"28636f75546659aee633f8fa568d241c1c3ce4b3","ref":"refs/heads/fix/6548/seal-excepted-process","pushedAt":"2024-07-24T20:10:18.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Engine: Ensure node is sealed when process excepts\n\nProcesses that hit a certain exception were not being sealed. This would\ncause problems when trying to export them, which only allows sealed\nnodes. The problem occurs when another exception occurs while handling\nthe original exception.\n\nAn example is when `Process.update_outputs` would raise a `ValueError`\nbecause an unstored node had be attached as an output. Since this method\nis called in `on_entered`, which is called when the process entered a\nnew state, it would be called again when it entered the excepted state.\nSince the process was already excepted, the rest of the state changes is\ncut short by `plumpy`. This would cause the process to never go to the\nfinal `TERMINATED` state and so the `on_terminated` method would not be\ncalled, which is where the process' node is sealed.\n\nThe solution is to check the current state in `on_entered` and if it is\n`EXCEPTED` to simply return and no longer perform any updates on the\nnode. This should prevent any other exceptions from being hit and ensure\nthe process transitions properly to the final terminated state. The only\nupdate that is still performed is to update the process state on the\nprocess' node, otherwise it would not properly be shown as excepted.","shortMessageHtmlLink":"Engine: Ensure node is sealed when process excepts"}},{"before":"2c7c23dc26f8f3ccd773fb0acb0b3197b04d0317","after":null,"ref":"refs/heads/fix/6532/sqlite-catch-database-locked-set-global-variable","pushedAt":"2024-07-24T10:23:20.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"334f2ac96353e10093aa273c619b03f43abc69e3","after":"2c7c23dc26f8f3ccd773fb0acb0b3197b04d0317","ref":"refs/heads/fix/6532/sqlite-catch-database-locked-set-global-variable","pushedAt":"2024-07-24T09:47:35.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Engine: Ignore failing process state change for `core.sqlite_dos`\n\nFor each process state change, the engine calls the utility function\n`aiida.engine.utils.set_process_state_change_timestamp`. This calls\n`set_global_variable` on the storage plugin to update the\n`process|state_change|.*` key in the settings table. This value is used\nin `verdi process list` to show when the last time a process changed its\nstate, which serves as a proxy of daemon activity.\n\nWhen multiple processes would be running, this call would throw an\nexception for the `core.sqlite_dos` storage plugin. This is because\nSQLite does not support concurrent writes that touch the same page,\nwhich is the case when multiple writes are updating the same row.\n\nSince the updating of the timestamp is not crucial for AiiDA functioning\nproperly, especially since it is because another process was trying to\nperform the same update, it is safe to ignore the failed update and\nsimply log that as a warning.","shortMessageHtmlLink":"Engine: Ignore failing process state change for core.sqlite_dos"}},{"before":"39cb9c402b21d75b802fd281f5e767a4bbb754d1","after":"334f2ac96353e10093aa273c619b03f43abc69e3","ref":"refs/heads/fix/6532/sqlite-catch-database-locked-set-global-variable","pushedAt":"2024-07-23T21:01:37.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Engine: Ignore failing process state change for `core.sqlite_dos`\n\nFor each process state change, the engine calls the utility function\n`aiida.engine.utils.set_process_state_change_timestamp`. This calls\n`set_global_variable` on the storage plugin to update the\n`process|state_change|.*` key in the settings table. This value is used\nin `verdi process list` to show when the last time a process changed its\nstate, which serves as a proxy of daemon activity.\n\nWhen multiple processes would be running, this call would throw an\nexception for the `core.sqlite_dos` storage plugin. This is because\nSQLite does not support concurrent writes that touch the same page,\nwhich is the case when multiple writes are updating the same row.\n\nSince the updating of the timestamp is not crucial for AiiDA functioning\nproperly, especially since it is because another process was trying to\nperform the same update, it is safe to ignore the failed update and\nsimply log that as a warning.","shortMessageHtmlLink":"Engine: Ignore failing process state change for core.sqlite_dos"}},{"before":"9e12740133a49d5fb7231493fe818eeb89e96cd9","after":"39cb9c402b21d75b802fd281f5e767a4bbb754d1","ref":"refs/heads/fix/6532/sqlite-catch-database-locked-set-global-variable","pushedAt":"2024-07-23T19:47:34.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Engine: Ignore failing process state change for `core.sqlite_dos`\n\nFor each process state change, the engine calls the utility function\n`aiida.engine.utils.set_process_state_change_timestamp`. This calls\n`set_global_variable` on the storage plugin to update the\n`process|state_change|.*` key in the settings table. This value is used\nin `verdi process list` to show when the last time a process changed its\nstate, which serves as a proxy of daemon activity.\n\nWhen multiple processes would be running, this call would throw an\nexception for the `core.sqlite_dos` storage plugin. This is because\nSQLite does not support concurrent writes that touch the same page,\nwhich is the case when multiple writes are updating the same row.\n\nSince the updating of the timestamp is not crucial for AiiDA functioning\nproperly, especially since it is because another process was trying to\nperform the same update, it is safe to ignore the failed update and\nsimply log that as a warning.","shortMessageHtmlLink":"Engine: Ignore failing process state change for core.sqlite_dos"}},{"before":"76245054c33dee7abd1b879b7d6346f00907529a","after":null,"ref":"refs/heads/feature/ssh-fabric","pushedAt":"2024-07-23T19:28:52.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"}},{"before":"8fd664fcfd8a6923d995905b17549a842a7538bf","after":"76245054c33dee7abd1b879b7d6346f00907529a","ref":"refs/heads/feature/ssh-fabric","pushedAt":"2024-07-23T14:06:34.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sphuber","name":"Sebastiaan Huber","path":"/sphuber","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6992332?s=80&v=4"},"commit":{"message":"Add the `SshAutoTransport` transport plugin\n\nThis transport plugin subclasses the `SshTransport` plugin in order to\nremove all the configuration options. Instead, it parses the user's SSH\nconfig file using `paramiko.SSHConfig` when the transport is\ninstantiated to determine the connection parameters automatically.\n\nThe advantage of this approach is that when configuring a `Computer`\nusing this plugin, the user is not prompted with a bunch of options.\nRather, if they can connect to the target machine using `ssh` directly,\nthe transport will also work. What's more, when the user updates their\nSSH config, the transport automatically uses these changes the next time\nit is instantiated as opposed to the `SshTransport` plugin which stores\nthe configuration in an `AuthInfo` in the database and is therefore\nstatic.\n\nThe original implementation of this plugin looked into the `fabric`\nlibrary. This library builds on top of `paramiko` and aims to make\nconfiguration SSH connections easier, just as this new plugin was aiming\nto. However, after a closer look, it seems that fabric was not adding a\nlot of clever code when it comes to parsing the user's SSH config. It\ndoes implement some clever code for dealing with proxy jumps and\ncommands but the `SshTransport` also already implements this. Therefore,\nit is not really justified to add `fabric` as a dependency but instead\nwe opt to use `paramiko` to parse the config ourselves.","shortMessageHtmlLink":"Add the SshAutoTransport transport plugin"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0yOFQxMzowMTowMi4wMDAwMDBazwAAAASmgi2P","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0yOFQxMzowMTowMi4wMDAwMDBazwAAAASmgi2P","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0yM1QxNDowNjozNC4wMDAwMDBazwAAAASG7vBI"}},"title":"Activity ยท sphuber/aiida-core"}