{
  "version": "1.8.2",
  "timeZone": "Europe/Berlin",
  "title": "Checking the Importable Python Modules",
  "instructions": [
    {
      "TYPE": "Try",
      "try": {
        "instructions": [
          {
            "TYPE": "Execute.Named",
            "jobName": "modules_check",
            "label": "modules_check"
          }
        ]
      },
      "catch": {
        "instructions": [
          {
            "TYPE": "Finish",
            "message": "An error has occurred.",
            "unsuccessful": true
          }
        ]
      }
    }
  ],
  "jobs": {
    "modules_check": {
      "agentName": "testAgent",
      "withSubagentClusterIdExpr": false,
      "executable": {
        "TYPE": "InternalExecutable",
        "internalType": "Python_Graal",
        "script": "import pkgutil\nimport importlib\nimport csv\n\nclass JS7Job(js7.Job):\n    def processOrder(self, js7Step):\n        # Adjust the output path if desired\n        csv_output_path = \"/tmp\"\n      \n        skip = {\"crypt\"}  # Job crashes with crypt\n        modules = sorted([m.name for m in pkgutil.iter_modules()])\n\n        ok = []\n        failed = []\n\n        for module in modules:\n            if module in skip:\n                js7Step.getLogger().info(f\"skipping: {module}\")\n                continue\n\n            try:\n                importlib.import_module(module)\n                ok.append(module)\n                js7Step.getLogger().info(f\"OK: {module}\")\n            except Exception as e:\n                failed.append((module, str(e)))\n                js7Step.getLogger().error(f\"FAILED: {module} -> {e}\")\n\n        with open(f\"{csv_output_path}/module_status.csv\", \"w\", newline=\"\") as f:\n            writer = csv.writer(f)\n            writer.writerow([\"module\", \"status\", \"error\"])\n\n            for m in ok:\n                writer.writerow([m, \"OK\", \"\"])\n\n            for m, err in failed:\n                writer.writerow([m, \"FAILED\", err])"
      },
      "skipIfNoAdmissionForOrderDay": false,
      "killAtEndOfAdmissionPeriod": false,
      "parallelism": 1,
      "graceTimeout": 1,
      "failOnErrWritten": false,
      "warnOnErrWritten": false,
      "title": "Checking the Importable Python Modules",
      "isNotRestartable": false
    }
  }
}