-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update examples #348
Update examples #348
Conversation
Check out this pull request on See visual diffs & provide feedback on Jupyter Notebooks. Powered by ReviewNB |
WalkthroughThe pull request introduces several modifications across various files, primarily focusing on updates to the execution of Jupyter notebooks, documentation enhancements, and structural changes in the README and other documentation files. Notably, the workflow for running notebooks has been adjusted to include new examples, and the README has been reorganized to clarify the Python Simple Queuing System Adapter ( Changes
Possibly related PRs
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 9
🧹 Outside diff range and nitpick comments (2)
docs/queue.md (1)
2-10
: Improved clarity in introduction and configuration.The updates to the introduction and configuration section provide clearer information about
pysqa
and its setup. The addition of thequeue_type
parameter is a valuable improvement for dynamic template definition.Consider adding a comma after "By default" in line 3 for better readability:
-By default `pysqa` expects to find these templates in the configuration +By default, `pysqa` expects to find these templates in the configuration🧰 Tools
🪛 LanguageTool
[uncategorized] ~3-~3: Did you mean: “By default,”?
Context: ...ed in thejinja2
templating language. By defaultpysqa
expects to find these templates...(BY_DEFAULT_COMMA)
notebooks/example_queue_type.ipynb (1)
1-32
: Enhance the introduction for better context.The initial explanation is concise, but it could be more informative for users who are new to
pysqa
. Consider adding a brief description of whatpysqa
is and its primary use case before diving into theQueueAdapter
class.Here's a suggested improvement for the introduction:
# Dynamic Python Interface for Queue Systems The `pysqa` (Python Simple Queuing System Adapter) package provides a unified interface for interacting with various queuing systems used in high-performance computing environments. Its primary class, `QueueAdapter`, offers a high-level interface for users to interact with different queuing systems in a consistent manner. The `QueueAdapter` can be initialized in two ways: 1. By loading the configuration from a configuration directory 2. By specifying the queuing system type using the `queue_type` parameter This notebook demonstrates how to use the `QueueAdapter` class for common queue management tasks.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (7)
- .github/workflows/notebooks.yml (1 hunks)
- README.md (2 hunks)
- docs/_toc.yml (1 hunks)
- docs/installation.md (1 hunks)
- docs/queue.md (7 hunks)
- notebooks/example_config.ipynb (6 hunks)
- notebooks/example_queue_type.ipynb (1 hunks)
✅ Files skipped from review due to trivial changes (2)
- docs/installation.md
- notebooks/example_config.ipynb
🧰 Additional context used
🪛 LanguageTool
docs/queue.md
[uncategorized] ~3-~3: Did you mean: “By default,”?
Context: ...ed in thejinja2
templating language. By defaultpysqa
expects to find these templates...(BY_DEFAULT_COMMA)
🔇 Additional comments (10)
docs/_toc.yml (1)
6-7
: LGTM! The changes improve documentation structure.The replacement of
example.ipynb
with two more specific examples (example_queue_type.ipynb
andexample_config.ipynb
) should provide clearer and more focused guidance to users. This aligns well with the PR objective of updating examples.Let's verify the existence of these new files:
Also, let's check if the README needs updating:
If the README search returns results, consider updating those references to point to the new example files.
.github/workflows/notebooks.yml (1)
38-39
: LGTM! Verify the existence of new notebooks.The changes look good and align with the PR objectives of updating examples. The workflow now executes two specific notebooks instead of a single example, which should provide more comprehensive testing and documentation.
Let's verify the existence of the new notebooks:
✅ Verification successful
Verification Successful: All new notebooks are present.
Both
example_config.ipynb
andexample_queue_type.ipynb
exist in thenotebooks
directory, ensuring the workflow changes are correctly implemented.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the existence of the new notebooks mentioned in the workflow. # Test 1: Check if example_config.ipynb exists echo "Checking for example_config.ipynb:" fd --type f "example_config.ipynb" notebooks # Test 2: Check if example_queue_type.ipynb exists echo "Checking for example_queue_type.ipynb:" fd --type f "example_queue_type.ipynb" notebooks # If both files exist, the output should show their paths. # If either file is missing, there will be no output for that file.Length of output: 325
README.md (4)
Line range hint
1-100
: LGTM: README structure improved with new sectionsThe changes to the README have enhanced the documentation structure by adding new sections for "Python Interface Dynamic" and "Python Interface Config". These additions provide more detailed and accessible information for users.
To ensure overall consistency and completeness, please run the following script:
#!/bin/bash # Description: Verify the consistency of the README structure # Test: Check for any potential inconsistencies or missing sections echo "Checking for potential inconsistencies or missing sections:" rg -i "installation" README.md || echo "Warning: Installation section might be missing" rg -i "queuing systems" README.md || echo "Warning: Queuing Systems section might be missing" rg -i "python interface" README.md || echo "Warning: Python Interface section might be missing" rg -i "command line interface" README.md || echo "Warning: Command Line Interface section might be missing" rg -i "advanced configuration" README.md || echo "Warning: Advanced Configuration section might be missing" rg -i "debugging" README.md || echo "Warning: Debugging section might be missing" rg -i "license" README.md || echo "Warning: License section might be missing" echo "Please review the output and ensure all expected sections are present and consistent."After running this script, please perform a final manual review to ensure that no information has been inadvertently removed and that the new structure is consistent with the rest of the document.
64-68
: LGTM: New "Python Interface Config" section addedThe addition of the "Python Interface Config" section with links for listing available queues, submitting jobs, showing jobs, and deleting jobs enhances the documentation structure and provides clear guidance for users of the config-based interface.
Please run the following script to confirm the existence of the linked documentation:
#!/bin/bash # Description: Verify the existence of Python Interface Config documentation # Test: Check if the documentation file exists and contains the required sections if fd -t f "example_config.html" docs; then echo "example_config.html exists." rg -q "List available queues" docs/example_config.html && echo "List queues section found." || echo "List queues section not found." rg -q "Submit job to queue" docs/example_config.html && echo "Submit job section found." || echo "Submit job section not found." rg -q "Show jobs in queue" docs/example_config.html && echo "Show jobs section found." || echo "Show jobs section not found." rg -q "Delete job from queue" docs/example_config.html && echo "Delete job section found." || echo "Delete job section not found." else echo "example_config.html does not exist in the docs directory. Please ensure it has been added." fi
60-63
: LGTM: New "Python Interface Dynamic" section addedThe addition of the "Python Interface Dynamic" section with links for submitting jobs, showing jobs, and deleting jobs improves the documentation structure and accessibility.
Please run the following script to confirm the existence of the linked documentation:
#!/bin/bash # Description: Verify the existence of Python Interface Dynamic documentation # Test: Check if the documentation file exists and contains the required sections if fd -t f "example_queue_type.html" docs; then echo "example_queue_type.html exists." rg -q "Submit job to queue" docs/example_queue_type.html && echo "Submit job section found." || echo "Submit job section not found." rg -q "Show jobs in queue" docs/example_queue_type.html && echo "Show jobs section found." || echo "Show jobs section not found." rg -q "Delete job from queue" docs/example_queue_type.html && echo "Delete job section found." || echo "Delete job section not found." else echo "example_queue_type.html does not exist in the docs directory. Please ensure it has been added." fi
6-6
: Verify the existence ofexample_config.ipynb
The Binder link has been updated to point to
example_config.ipynb
. This change aligns with the new documentation structure, focusing on the config-based interface.Please run the following script to confirm the existence of the new notebook:
✅ Verification successful
Verified:
example_config.ipynb
existsThe Binder link has been successfully updated to point to
example_config.ipynb
, and the notebook exists in the repository.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the existence of example_config.ipynb # Test: Check if example_config.ipynb exists if fd -t f "example_config.ipynb"; then echo "example_config.ipynb exists." else echo "example_config.ipynb does not exist. Please ensure it has been added to the repository." fiLength of output: 981
Script:
#!/bin/bash # Description: Verify the existence of example_config.ipynb in the repository # Test: Check if example_config.ipynb exists in the root or docs directory if fd -t f "example_config.ipynb" .; then echo "example_config.ipynb exists." else echo "example_config.ipynb does not exist. Please ensure it has been added to the repository." fiLength of output: 132
docs/queue.md (3)
60-61
: Added helpful information for Flux template usage.The addition of information about importing the Flux template from the
pysqa
package and enabling the Flux interface is valuable for users. This change improves the documentation's completeness and usability.
143-144
: Added helpful information for SGE template usage.The addition of information about importing the SGE template from the
pysqa
package and enabling the SGE interface is valuable for users. This change improves the documentation's completeness and usability.
Line range hint
1-211
: Overall documentation improvement with minor issues to address.The changes to this documentation file significantly improve its clarity, completeness, and usefulness for users of the
pysqa
system. The additions provide valuable information about importing templates and enabling different queuing system interfaces.However, there are several minor issues and inconsistencies throughout the document that need to be addressed:
- Missing comma after "By default" in the introduction.
- Incorrect references to "flux" interface in LSF and MOAB sections.
- Contradictory information about the availability of the MOAB template.
- Errors in the import statements and queue_type settings for SLURM and TORQUE sections.
Once these issues are resolved, the documentation will be in excellent shape to guide users in configuring and using various queuing systems with
pysqa
.🧰 Tools
🪛 LanguageTool
[uncategorized] ~3-~3: Did you mean: “By default,”?
Context: ...ed in thejinja2
templating language. By defaultpysqa
expects to find these templates...(BY_DEFAULT_COMMA)
🪛 Markdownlint
13-13: null
Fenced code blocks should have a language specified(MD040, fenced-code-language)
notebooks/example_queue_type.ipynb (1)
1-236
: Overall, an informative and well-structured tutorial notebook.This notebook provides a comprehensive introduction to using the
QueueAdapter
class from thepysqa
package. It effectively covers the main operations required for queue management: initialization, job submission, status checking, and job deletion. The examples are clear and demonstrate the practical usage of the package.Key strengths:
- Logical flow from basic to more advanced operations
- Clear explanations of method parameters and their usage
- Demonstration of different ways to check job status
Suggestions for enhancement:
- Add more robust error handling to each example
- Provide more detailed explanations of potential issues and how to address them
- Include examples of how to use the returned data (e.g., queue IDs, job statuses) in a workflow
By implementing the suggested improvements, this notebook could serve as an even more valuable resource for users learning to work with queue systems using
pysqa
. It would not only demonstrate the basic usage but also prepare users for real-world scenarios and best practices in queue management.
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | ||
`from pysqa.wrapper.lsf import template`. So the flux interface can be enabled by setting `queue_type="lsf"`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added helpful information for LSF template usage, but contains a minor error.
The addition of information about importing the LSF template from the pysqa
package and enabling the LSF interface is valuable for users. This change improves the documentation's completeness and usability.
There's a minor error in the last sentence. Please apply the following fix:
-So the flux interface can be enabled by setting `queue_type="lsf"`.
+So the LSF interface can be enabled by setting `queue_type="lsf"`.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | |
`from pysqa.wrapper.lsf import template`. So the flux interface can be enabled by setting `queue_type="lsf"`. | |
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | |
`from pysqa.wrapper.lsf import template`. So the LSF interface can be enabled by setting `queue_type="lsf"`. |
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | ||
`from pysqa.wrapper.slurm import template`. So the flux interface can be enabled by setting `queue_type="slurm"`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added information for TORQUE template usage, but contains errors.
The addition of information about importing the TORQUE template from the pysqa
package and enabling the TORQUE interface is valuable for users. However, there are errors in the implementation details.
Please apply the following fixes:
- Correct the import statement:
-`from pysqa.wrapper.slurm import template`.
+`from pysqa.wrapper.torque import template`.
- Correct the queue_type setting:
-So the flux interface can be enabled by setting `queue_type="slurm"`.
+So the TORQUE interface can be enabled by setting `queue_type="torque"`.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | |
`from pysqa.wrapper.slurm import template`. So the flux interface can be enabled by setting `queue_type="slurm"`. | |
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | |
`from pysqa.wrapper.torque import template`. So the TORQUE interface can be enabled by setting `queue_type="torque"`. |
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | ||
`from pysqa.wrapper.sge import template`. So the flux interface can be enabled by setting `queue_type="sge"`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added information for SLURM template usage, but contains errors.
The addition of information about importing the SLURM template from the pysqa
package and enabling the SLURM interface is valuable for users. However, there are errors in the implementation details.
Please apply the following fixes:
- Correct the import statement:
-`from pysqa.wrapper.sge import template`.
+`from pysqa.wrapper.slurm import template`.
- Correct the queue_type setting:
-So the flux interface can be enabled by setting `queue_type="sge"`.
+So the SLURM interface can be enabled by setting `queue_type="slurm"`.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | |
`from pysqa.wrapper.sge import template`. So the flux interface can be enabled by setting `queue_type="sge"`. | |
the job `memory_max`. The same template is stored in the `pysqa` package and can be imported using | |
`from pysqa.wrapper.slurm import template`. So the SLURM interface can be enabled by setting `queue_type="slurm"`. |
Currently, no template for the Maui Cluster Scheduler is available. The same template is stored in the `pysqa` package | ||
and can be imported using `from pysqa.wrapper.moab import template`. So the flux interface can be enabled by setting | ||
`queue_type="moab"`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Inconsistency Found in MOAB Template Documentation
The documentation currently states that no template for the Maui Cluster Scheduler is available but also mentions importing template
from the pysqa
package. Our verification indicates that the template
does not exist in the pysqa.wrapper.moab
module.
Actions Required:
- Remove or correct the reference to the
template
in the documentation. - Clarify the availability of the Maui Cluster Scheduler template to avoid confusion.
🔗 Analysis chain
Added information for MOAB template usage, but contains inconsistencies.
The addition of information about importing the MOAB template from the pysqa
package and enabling the MOAB interface is valuable for users. However, there are some inconsistencies that need to be addressed.
- There's a minor error in the last sentence. Please apply the following fix:
-So the flux interface can be enabled by setting `queue_type="moab"`.
+So the MOAB interface can be enabled by setting `queue_type="moab"`.
- The documentation states that no template for the Maui Cluster Scheduler is available, but then mentions that a template can be imported. This is contradictory and needs clarification. Consider revising this section to accurately reflect the availability and state of the MOAB template.
To verify the actual state of the MOAB template, you can run the following script:
To further verify the existence of the MOAB template in the codebase, please run the following script:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if the MOAB template exists in the pysqa package
# Test: Check if the MOAB template file exists
if python -c "from pysqa.wrapper.moab import template; print(template)"; then
echo "MOAB template exists and can be imported."
else
echo "MOAB template does not exist or cannot be imported."
fi
Length of output: 257
Script:
#
#!/bin/bash
# Description: Search for the 'template' definition in the 'pysqa.wrapper.moab' module.
# Using ast-grep to find the import and definition of 'template'
ast-grep --lang python --pattern '
from pysqa.wrapper.moab import template
'
# Alternatively, using ripgrep to search for 'template' in moab.py files
rg 'def template' $(fd 'moab\.py')
Length of output: 156
notebooks/example_queue_type.ipynb
Outdated
{ | ||
"id": "04e9d4a2-6161-448b-81cd-1c6f8689867d", | ||
"cell_type": "code", | ||
"source": "from pysqa import QueueAdapter", | ||
"metadata": { | ||
"tags": [], | ||
"trusted": true | ||
}, | ||
"outputs": [], | ||
"execution_count": 1 | ||
}, | ||
{ | ||
"id": "7e3cf646-d4e7-4b1e-ab47-f07342d7a5a2", | ||
"cell_type": "markdown", | ||
"source": "After the initial import the class is initialized using the queuing system type specificed by the `queue_type` parameter. In this example we load the `flux` as queuing system interface: ", | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "7e234eaf-80bc-427e-bd65-9acf70802689", | ||
"cell_type": "code", | ||
"source": "qa = QueueAdapter(queue_type=\"flux\")", | ||
"metadata": { | ||
"tags": [], | ||
"trusted": true | ||
}, | ||
"outputs": [], | ||
"execution_count": 2 | ||
}, | ||
{ | ||
"id": "514a7f2e-04ec-4fed-baa5-a181dace7123", | ||
"cell_type": "markdown", | ||
"source": "The configuration is explained in more detail in the [documentation](https://pysqa.readthedocs.io/en/latest/queue.html#flux). ", | ||
"metadata": {} | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add error handling and expand explanation for QueueAdapter initialization.
While the current implementation is correct, it could be more robust and informative. Consider the following suggestions:
- Add error handling for the QueueAdapter initialization.
- Provide more details about the "flux" queue type and potential alternatives.
- Explain what happens if the initialization fails.
Here's an example of how you could improve this section:
try:
qa = QueueAdapter(queue_type="flux")
print("QueueAdapter initialized successfully with 'flux' queue type.")
except Exception as e:
print(f"Failed to initialize QueueAdapter: {str(e)}")
# Handle the error appropriately
Add the following explanation to the markdown cell:
The `queue_type` parameter specifies the type of queuing system to use. In this example, we're using "flux", but `pysqa` supports various queue types such as SLURM, LSF, or SGE. The choice depends on your specific computing environment.
If the initialization fails, it could be due to missing configuration files, incorrect queue type, or lack of necessary permissions. Ensure that your environment is correctly set up for the chosen queue type.
notebooks/example_queue_type.ipynb
Outdated
{ | ||
"id": "42a53d33-2916-461f-86be-3edbe01d3cc7", | ||
"cell_type": "markdown", | ||
"source": [ | ||
"## Submit job to queue\n", | ||
"Submit a job to the queue - if no queue is specified it is submitted to the default queue defined in the queue configuration:" | ||
], | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "a3f2ba3a-0f82-4a0a-aa63-b5e71f8f8b39", | ||
"cell_type": "code", | ||
"source": "queue_id = qa.submit_job(\n job_name=None,\n working_directory=\".\",\n cores=1,\n memory_max=None,\n run_time_max=None,\n dependency_list=None,\n submission_template=None,\n command=\"sleep 5\",\n)\nqueue_id", | ||
"metadata": { | ||
"trusted": true | ||
}, | ||
"outputs": [ | ||
{ | ||
"execution_count": 3, | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": "64156073984" | ||
}, | ||
"metadata": {} | ||
} | ||
], | ||
"execution_count": 3 | ||
}, | ||
{ | ||
"id": "9aa0fdf9-0827-4706-bfed-6b95b95dd061", | ||
"cell_type": "markdown", | ||
"source": "The only required parameter is: \n* `command` the command that is executed as part of the job \n\nAdditional options for the submission of the job are:\n* `job_name` the name of the job submitted to the queuing system. \n* `working_directory` the working directory the job submitted to the queuing system is executed in.\n* `cores` the number of cores used for the calculation. If the cores are not defined the minimum number of cores defined for the selected queue are used. \n* `memory_max` the memory used for the calculation. \n* `run_time_max` the run time for the calculation. If the run time is not defined the maximum run time defined for the selected queue is used. \n* `dependency_list` other jobs the calculation depends on.\n* `submission_template` the template submission script.\n* `**kwargs` allows writing additional parameters to the job submission script if they are available in the corresponding template.\n", | ||
"metadata": {} | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance job submission example with error handling and queue ID usage.
The current example demonstrates the basic usage of submit_job
, but it could be improved to show best practices and error handling. Consider the following suggestions:
- Add error handling for the job submission.
- Demonstrate how to use the returned queue ID.
- Show an example with more realistic job parameters.
Here's an example of how you could improve this section:
try:
queue_id = qa.submit_job(
job_name="example_job",
working_directory="./job_directory",
cores=4,
memory_max="4GB",
run_time_max=3600, # 1 hour
command="python my_script.py --input data.csv --output results.json"
)
print(f"Job submitted successfully. Queue ID: {queue_id}")
# Demonstrate immediate status check
status = qa.get_status_of_job(process_id=queue_id)
print(f"Initial job status: {status}")
except Exception as e:
print(f"Failed to submit job: {str(e)}")
# Handle the error appropriately
Add the following to the markdown explanation:
After submitting a job, it's a good practice to store the returned `queue_id` for future reference. This ID can be used to check the job's status, retrieve results, or delete the job if necessary.
Note that the actual parameters you use (like `cores`, `memory_max`, and `run_time_max`) should be adjusted based on your specific job requirements and the capabilities of your computing environment.
notebooks/example_queue_type.ipynb
Outdated
{ | ||
"id": "e9cef4ba-ddf6-4cd5-9519-ba93ce13256a", | ||
"cell_type": "markdown", | ||
"source": "The submission script template can be imported directly using `from pysqa.wrapper.flux import template`: ", | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "5379ef70-39a5-45ac-b325-d71abe1ba4b0", | ||
"cell_type": "code", | ||
"source": "from pysqa.wrapper.flux import template\n\ntemplate.split(\"\\n\")", | ||
"metadata": { | ||
"trusted": true | ||
}, | ||
"outputs": [ | ||
{ | ||
"execution_count": 4, | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": "['#!/bin/bash',\n '# flux: --job-name={{job_name}}',\n '# flux: --env=CORES={{cores}}',\n '# flux: --output=time.out',\n '# flux: --error=error.out',\n '# flux: -n {{cores}}',\n '{%- if run_time_max %}',\n '# flux: -t {{ [1, run_time_max // 60]|max }}',\n '{%- endif %}',\n '{%- if dependency %}',\n '{%- for jobid in dependency %}',\n '# flux: --dependency=afterok:{{jobid}}',\n '{%- endfor %}',\n '{%- endif %}',\n '',\n '{{command}}',\n '']" | ||
}, | ||
"metadata": {} | ||
} | ||
], | ||
"execution_count": 4 | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Improve template display and add explanation on customization.
While showing the job submission template is valuable, the current display method and lack of explanation could be improved. Consider the following suggestions:
- Use a more readable format to display the template.
- Add an explanation of how users can customize this template.
- Highlight key parts of the template that users might want to modify.
Here's an example of how you could improve this section:
from pysqa.wrapper.flux import template
print("Job Submission Template:")
print(template)
# Highlight key parts
import re
highlighted_template = re.sub(r'(\{\{.*?\}\})', r'\033[1m\1\033[0m', template)
print("\nTemplate with highlighted customizable parts:")
print(highlighted_template)
Add the following explanation:
The job submission template defines how your job will be configured in the queue system. Key parts that you can customize are wrapped in `{{}}` brackets.
To use a custom template:
1. Create a new file with your modified template.
2. Pass the path to this file as the `submission_template` parameter in `submit_job`.
Example of customizing the template:
```python
custom_template = template.replace("{{cores}}", "{{cores|default(4)}}")
qa.submit_job(..., submission_template=custom_template)
This would set a default of 4 cores if not specified in the submit_job
call.
<!-- This is an auto-generated comment by CodeRabbit -->
notebooks/example_queue_type.ipynb
Outdated
{ | ||
"id": "672854fd-3aaa-4287-b29c-d5370e4adc14", | ||
"cell_type": "markdown", | ||
"source": [ | ||
"## Show jobs in queue\n", | ||
"Get status of all jobs currently handled by the queuing system:" | ||
], | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "73518256-faf8-4fea-bc40-9b2198903bf5", | ||
"cell_type": "code", | ||
"source": "qa.get_queue_status()", | ||
"metadata": { | ||
"trusted": true | ||
}, | ||
"outputs": [ | ||
{ | ||
"execution_count": 5, | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": " jobid user jobname status\n0 64156073984 jovyan None running", | ||
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>jobid</th>\n <th>user</th>\n <th>jobname</th>\n <th>status</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>64156073984</td>\n <td>jovyan</td>\n <td>None</td>\n <td>running</td>\n </tr>\n </tbody>\n</table>\n</div>" | ||
}, | ||
"metadata": {} | ||
} | ||
], | ||
"execution_count": 5 | ||
}, | ||
{ | ||
"id": "9338f32f-b127-4700-8aba-25aded6b548f", | ||
"cell_type": "markdown", | ||
"source": "With the additional parameter `user` a specific user can be defined to only list the jobs of this specific user. \n\nIn analogy the jobs of the current user can be listed with: ", | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "cf6e59e8-f117-4d4a-9637-f83ec84c62fa", | ||
"cell_type": "code", | ||
"source": "qa.get_status_of_my_jobs()", | ||
"metadata": { | ||
"trusted": true | ||
}, | ||
"outputs": [ | ||
{ | ||
"execution_count": 6, | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": " jobid user jobname status\n0 64156073984 jovyan None running", | ||
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>jobid</th>\n <th>user</th>\n <th>jobname</th>\n <th>status</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>64156073984</td>\n <td>jovyan</td>\n <td>None</td>\n <td>running</td>\n </tr>\n </tbody>\n</table>\n</div>" | ||
}, | ||
"metadata": {} | ||
} | ||
], | ||
"execution_count": 6 | ||
}, | ||
{ | ||
"id": "d2566873-2d30-4801-9d86-287a247fb7c6", | ||
"cell_type": "markdown", | ||
"source": "Finally, the status of a specific job with the queue id `queue_id` can be received from the queuing system using:", | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "ee8e14db-cc6e-47e7-a1e5-035427ca83a9", | ||
"cell_type": "code", | ||
"source": "qa.get_status_of_job(process_id=queue_id)", | ||
"metadata": { | ||
"trusted": true | ||
}, | ||
"outputs": [ | ||
{ | ||
"execution_count": 7, | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": "'running'" | ||
}, | ||
"metadata": {} | ||
} | ||
], | ||
"execution_count": 7 | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance job status checking examples and explanations.
The current examples demonstrate different methods for checking job status, but they could be improved for better error handling and clarity. Consider the following suggestions:
- Add error handling for each status checking method.
- Provide more detailed explanations of when to use each method.
- Demonstrate how to handle empty results or specific job statuses.
Here's an example of how you could improve this section:
# Check status of all jobs
try:
all_jobs = qa.get_queue_status()
if all_jobs.empty:
print("No jobs found in the queue.")
else:
print("All jobs in the queue:")
print(all_jobs)
except Exception as e:
print(f"Failed to get queue status: {str(e)}")
# Check status of current user's jobs
try:
my_jobs = qa.get_status_of_my_jobs()
if my_jobs.empty:
print("You have no jobs in the queue.")
else:
print("Your jobs in the queue:")
print(my_jobs)
except Exception as e:
print(f"Failed to get status of your jobs: {str(e)}")
# Check status of a specific job
try:
job_status = qa.get_status_of_job(process_id=queue_id)
print(f"Status of job {queue_id}: {job_status}")
# Demonstrate handling of different statuses
if job_status == "running":
print("Job is still running. You may want to wait before retrieving results.")
elif job_status == "finished":
print("Job is finished. You can now retrieve the results.")
elif job_status == "error":
print("Job encountered an error. Check the error logs.")
except Exception as e:
print(f"Failed to get status of job {queue_id}: {str(e)}")
Add the following explanation:
These methods offer different levels of detail for job status:
1. `get_queue_status()`: Use this to get an overview of all jobs in the queue. Useful for system administrators or when you need to see the overall queue state.
2. `get_status_of_my_jobs()`: Use this when you only want to see your own jobs. This is typically what you'll use most often as a regular user.
3. `get_status_of_job(process_id)`: Use this when you need to check the status of a specific job. This is useful for monitoring a particular job's progress or determining when it's finished.
Remember to handle different job statuses appropriately in your workflows. Common statuses include "queued", "running", "finished", and "error", but the exact terms may vary depending on the queue system.
notebooks/example_queue_type.ipynb
Outdated
{ | ||
"id": "f89528d3-a3f5-4adb-9f74-7f70270aec12", | ||
"cell_type": "markdown", | ||
"source": [ | ||
"## Delete job from queue\n", | ||
"Delete a job with the queue id `queue_id` from the queuing system:" | ||
], | ||
"metadata": {} | ||
}, | ||
{ | ||
"id": "06e1535b-eafd-4b94-ba33-ba24da088a33", | ||
"cell_type": "code", | ||
"source": "qa.delete_job(process_id=queue_id)", | ||
"metadata": { | ||
"tags": [], | ||
"trusted": true | ||
}, | ||
"outputs": [ | ||
{ | ||
"execution_count": 8, | ||
"output_type": "execute_result", | ||
"data": { | ||
"text/plain": "''" | ||
}, | ||
"metadata": {} | ||
} | ||
], | ||
"execution_count": 8 | ||
} | ||
] | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Improve job deletion example and add important considerations.
The current example for job deletion is simple but could be enhanced with error handling and more detailed explanations. Consider the following suggestions:
- Add error handling for the job deletion process.
- Explain the return value of the
delete_job
method. - Provide information about when and why to delete a job, and potential consequences.
Here's an example of how you could improve this section:
try:
result = qa.delete_job(process_id=queue_id)
if result == "":
print(f"Job {queue_id} was successfully deleted from the queue.")
else:
print(f"Unexpected result when deleting job {queue_id}: {result}")
except Exception as e:
print(f"Failed to delete job {queue_id}: {str(e)}")
# Verify deletion
try:
status = qa.get_status_of_job(process_id=queue_id)
print(f"Status after deletion attempt: {status}")
except Exception as e:
if "not found" in str(e).lower():
print("Job not found in queue, confirming successful deletion.")
else:
print(f"Unexpected error when verifying deletion: {str(e)}")
Add the following explanation:
## Deleting a Job from the Queue
Deleting a job from the queue stops the job if it's running and removes it from the queue system. Here are some important considerations:
1. **When to delete a job**:
- If you've submitted a job by mistake
- If you realize the job parameters are incorrect
- If the job is taking too long and you want to stop it
- If you no longer need the results of the job
2. **Consequences of deleting a job**:
- Any progress made by the job will be lost
- Resources allocated to the job will be freed up for other jobs
- You won't be able to retrieve any results from the job
3. **Return value**:
- The `delete_job` method typically returns an empty string on success
- Any non-empty return value usually indicates an error or unexpected behavior
Always verify that the job has been successfully deleted by checking its status afterwards. If the job is not found in the queue after deletion, it confirms that the deletion was successful.
Note: Some queue systems may have restrictions on which jobs you can delete. Generally, you can only delete your own jobs unless you have administrative privileges.
Summary by CodeRabbit
New Features
example_config.ipynb
andexample_queue_type.ipynb
, providing enhanced guidance on using thepysqa
package.Documentation
README.md
to better direct users to relevant sections.queue.md
documentation regarding template usage and configuration.Style