diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:04:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:04:41 +0000 |
commit | 975f66f2eebe9dadba04f275774d4ab83f74cf25 (patch) | |
tree | 89bd26a93aaae6a25749145b7e4bca4a1e75b2be /ansible_collections/dellemc/powerflex/docs | |
parent | Initial commit. (diff) | |
download | ansible-975f66f2eebe9dadba04f275774d4ab83f74cf25.tar.xz ansible-975f66f2eebe9dadba04f275774d4ab83f74cf25.zip |
Adding upstream version 7.7.0+dfsg.upstream/7.7.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ansible_collections/dellemc/powerflex/docs')
23 files changed, 5839 insertions, 0 deletions
diff --git a/ansible_collections/dellemc/powerflex/docs/ADOPTERS.md b/ansible_collections/dellemc/powerflex/docs/ADOPTERS.md new file mode 100644 index 000000000..826b5cd78 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/ADOPTERS.md @@ -0,0 +1,11 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# List of adopters diff --git a/ansible_collections/dellemc/powerflex/docs/BRANCHING.md b/ansible_collections/dellemc/powerflex/docs/BRANCHING.md new file mode 100644 index 000000000..e244df707 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/BRANCHING.md @@ -0,0 +1,32 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Branching strategy + +Ansible modules for Dell PowerFlex follows a scaled trunk branching strategy where short-lived branches are created off of the main branch. When coding is complete, the branch is merged back into main after being approved in a pull request code review. + +## Branch naming convention + +| Branch Type | Example | Comment | +|--------------|-----------------------------------|-------------------------------------------| +| main | main | | +| Release | release-1.0 | hotfix: release-1.1 patch: release-1.0.1 | +| Feature | feature-9-vol-support | "9" referring to GitHub issue ID | +| Bug Fix | bugfix-110-fix-duplicates-issue | "110" referring to GitHub issue ID | + + +## Steps for working on a release branch + +1. Fork the repository. +2. Create a branch off of the main branch. The branch name should follow [branch naming convention](#branch-naming-convention). +3. Make your changes and commit them to your branch. +4. If other code changes have merged into the upstream main branch, perform a rebase of those changes into your branch. +5. Open a [pull request](https://github.com/dell/ansible-powerflex/pulls) between your branch and the upstream main branch. +6. Once your pull request has merged, your branch can be deleted. diff --git a/ansible_collections/dellemc/powerflex/docs/CODE_OF_CONDUCT.md b/ansible_collections/dellemc/powerflex/docs/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..cfc4993c1 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,137 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Code of conduct - contributor covenant + +## Our pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at ansible.team@dell.com +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary ban + +**Community impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent ban + +**Community impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations.
\ No newline at end of file diff --git a/ansible_collections/dellemc/powerflex/docs/COMMITTER_GUIDE.md b/ansible_collections/dellemc/powerflex/docs/COMMITTER_GUIDE.md new file mode 100644 index 000000000..8af0752e8 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/COMMITTER_GUIDE.md @@ -0,0 +1,49 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Committer guidelines + +These are the guidelines for people with commit privileges on the GitHub repository. Committers act as members of the Core Team and not necessarily employees of Dell. + +These guidelines apply to everyone and as Committers you have been given access to commit changes because you exhibit good judgment and have demonstrated your commitment to the vision of the project. We trust that you will use these privileges wisely and not abuse it. + +If these privileges are abused in any way and the quality of the project is compromised, our trust will be diminished and you may be asked to not commit or lose these privileges all together. + +## General rules + +### Don't + +* Break the build. +* Commit directly. +* Compromise backward compatibility. +* Disrespect your Community Team members. Help them grow. +* Think it is someone elses job to test your code. Write tests for all the code you produce. +* Forget to keep thing simple. +* Create technical debt. Fix-in-place and make it the highest priority above everything else. + +### Do + +* Keep it simple. +* Good work, your best every time. +* Keep the design of your software clean and maintainable. +* Squash your commits, avoid merges. +* Be active. Committers that are not active may have their permissions suspended. +* Write tests for all your deliverables. +* Automate everything. +* Maintain a high code coverage. +* Keep an open communication with other Committers. +* Ask questions. +* Document your contributions and remember to keep it simple. + +## People + +| Name | GitHub ID | Nickname | +|-------|-------------|------------| +| | | | diff --git a/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md b/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md new file mode 100644 index 000000000..642f94d23 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md @@ -0,0 +1,173 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# How to contribute + +Become one of the contributors to this project! We thrive to build a welcoming and open community for anyone who wants to use the project or contribute to it. There are just a few small guidelines you need to follow. To help us create a safe and positive community experience for all, we require all participants to adhere to the [Code of Conduct](https://github.com/dell/ansible-powerflex/blob/1.6.0/CODE_OF_CONDUCT.md). + +## Table of contents + +* [Become a contributor](#Become-a-contributor) +* [Submitting issues](#Submitting-issues) +* [Triage issues](#Triage-issues) +* [Your first contribution](#Your-first-contribution) +* [Branching](#Branching) +* [Signing your commits](#Signing-your-commits) +* [Pull requests](#Pull-requests) +* [Code reviews](#Code-reviews) +* [TODOs in the code](#TODOs-in-the-code) + +## Become a contributor + +You can contribute to this project in several ways. Here are some examples: + +* Contribute to the Ansible modules for Dell PowerFlex documentation and codebase. +* Report and triage bugs. +* Feature requests. +* Write technical documentation and blog posts, for users and contributors. +* Help others by answering questions about this project. + +## Submitting issues + +All issues related to Ansible modules for Dell PowerFlex, regardless of the service/repository the issue belongs to (see table above), should be submitted [here](https://github.com/dell/ansible-powerflex/issues). Issues will be triaged and labels will be used to indicate the type of issue. This section outlines the types of issues that can be submitted. + +### Report bugs + +We aim to track and document everything related to Ansible modules for Dell PowerFlex via the Issues page. The code and documentation are released with no warranties or SLAs and are intended to be supported through a community driven process. + +Before submitting a new issue, make sure someone hasn't already reported the problem. Look through the [existing issues](https://github.com/dell/ansible-powerflex/issues) for similar issues. + +Report a bug by submitting a [bug report](https://github.com/dell/ansible-powerflex/issues/new?labels=type%2Fbug%2C+needs-triage&template=bug_report.md&title=%5BBUG%5D%3A). Make sure that you provide as much information as possible on how to reproduce the bug. + +When opening a Bug please include this information to help with debugging: + +1. Version of relevant software: this software, Ansible, Python, SDK, etc. +2. Details of the issue explaining the problem: what, when, where +3. The expected outcome that was not met (if any) +4. Supporting troubleshooting information. __Note: Do not provide private company information that could compromise your company's security.__ + +An Issue __must__ be created before submitting any pull request. Any pull request that is created should be linked to an Issue. + +### Feature request + +If you have an idea of how to improve this project, submit a [feature request](https://github.com/dell/ansible-powerflex/issues/new?labels=type%2Ffeature-request%2C+needs-triage&template=feature_request.md&title=%5BFEATURE%5D%3A). + +### Answering questions + +If you have a question and you can't find the answer in the documentation or issues, the next step is to submit a [question.](https://github.com/dell/ansible-powerflex/issues/new?labels=type%2Fquestion&template=ask-a-question.md&title=%5BQUESTION%5D%3A) + +We'd love your help answering questions being asked by other Ansible modules for Dell PowerFlex users. + +## Triage issues + +Triage helps ensure that issues resolve quickly by: + +* Ensuring the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences a problem and what actions they took. +* Giving a contributor the information they need before they commit to resolving an issue. +* Lowering the issue count by preventing duplicate issues. +* Streamlining the development process by preventing duplicate discussions. + +If you don't have the knowledge or time to code, consider helping with _issue triage_. The Ansible modules for Dell PowerFlex community will thank you for saving them time by spending some of yours. + +Read more about the ways you can [Triage issues](https://github.com/dell/ansible-powerflex/blob/1.6.0/ISSUE_TRIAGE.md). + +## Your first contribution + +Unsure where to begin contributing? Start by browsing issues labeled `beginner friendly` or `help wanted`. + +* [Beginner-friendly](https://github.com/dell/ansible-powerflex/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22) issues are generally straightforward to complete. +* [Help wanted](https://github.com/dell/ansible-powerflex/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) issues are problems we would like the community to help us with regardless of complexity. + +When you're ready to contribute, it's time to create a pull request. + +## Branching + +* [Branching Strategy for Ansible modules for Dell PowerFlex](https://github.com/dell/ansible-powerflex/blob/1.6.0/BRANCHING.md) + +## Signing your commits + +We require that developers sign off their commits to certify that they have permission to contribute the code in a pull request. This way of certifying is commonly known as the [Developer Certificate of Origin (DCO)](https://developercertificate.org/). We encourage all contributors to read the DCO text before signing a commit and making contributions. + +GitHub will prevent a pull request from being merged if there are any unsigned commits. + +### Signing a commit + +GPG (GNU Privacy Guard) will be used to sign commits. Follow the instructions [here](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/signing-commits) to create a GPG key and configure your GitHub account to use that key. + +Make sure you have your user name and e-mail set. This will be required for your signed commit to be properly verified. Check this references: + +* Setting up your github user name [reference](https://help.github.com/articles/setting-your-username-in-git/) +* Setting up your e-mail address [reference](https://help.github.com/articles/setting-your-commit-email-address-in-git/) + +Once Git and your GitHub account have been properly configured, you can add the -S flag to the git commits: + +```console +$ git commit -S -m your commit message +# Creates a signed commit +``` + +### Commit message format + +Ansible modules for Dell PowerFlex uses the guidelines for commit messages outlined in [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/) + +## Pull requests + +If this is your first time contributing to an open-source project on GitHub, make sure you read about [Creating a pull request](https://help.github.com/en/articles/creating-a-pull-request). + +A pull request must always link to at least one GitHub issue. If that is not the case, create a GitHub issue and link it. + +To increase the chance of having your pull request accepted, make sure your pull request follows these guidelines: + +* Title and description matches the implementation. +* Commits within the pull request follow the formatting guidelines. +* The pull request closes one related issue. +* The pull request contains necessary tests that verify the intended behavior. +* If your pull request has conflicts, rebase your branch onto the main branch. + +If the pull request fixes a bug: + +* The pull request description must include `Fixes #<issue number>`. +* To avoid regressions, the pull request should include tests that replicate the fixed bug. + +The team _squashes_ all commits into one when we accept a pull request. The title of the pull request becomes the subject line of the squashed commit message. We still encourage contributors to write informative commit messages, as they becomes a part of the Git commit body. + +We use the pull request title when we generate change logs for releases. As such, we strive to make the title as informative as possible. + +Make sure that the title for your pull request uses the same format as the subject line in the commit message. + +### Quality gates for pull requests + +GitHub Actions are used to enforce quality gates when a pull request is created or when any commit is made to the pull request. These GitHub Actions enforce our minimum code quality requirement for any code that get checked into the repository. If any of the quality gates fail, it is expected that the contributor will look into the check log, understand the problem and resolve the issue. If help is needed, please feel free to reach out the maintainers of the project for [support](https://github.com/dell/ansible-powerflex/blob/1.6.0/SUPPORT.md). + +#### Code sanitization + +[GitHub action](https://github.com/dell/ansible-powerflex/actions/workflows/ansible-test.yml) that analyzes source code to flag ansible sanity errors and runs Unit tests. + +## Code reviews + +All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. + +A pull request must satisfy following for it to be merged: + +* A pull request will require at least 2 maintainer approvals. +* Maintainers must perform a review to ensure the changes adhere to guidelines laid out in this document. +* If any commits are made after the PR has been approved, the PR approval will automatically be removed and the above process must happen again. + +## Code style + +Ensure the added code has the required documenation, examples and unit tests. + +### Sanity + +Run ansible-test sanity --docker default on your code to ensure sanity. Ensure the code does not have any Andersson script violations and not break any existing unit test workflows. + +### TODOs in the code + +We don't like TODOs in the code or documentation. It is really best if you sort out all issues you can see with the changes before we check the changes in. diff --git a/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md b/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md new file mode 100644 index 000000000..1dff703ec --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md @@ -0,0 +1,106 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Installation and execution of Ansible modules for Dell PowerFlex + +## Installation of SDK +* Install the python SDK named [PyPowerFlex](https://pypi.org/project/PyPowerFlex/). It can be installed using pip, based on appropriate python version. Execute this command: + + pip install PyPowerFlex +* Alternatively, Clone the repo "https://github.com/dell/python-powerflex" + using command: + + git clone https://github.com/dell/python-powerflex.git + * Go to the root directory of setup. + * Execute this command: + + pip install . + +## Building collections + * Use this command to build the collection from source code: + + ansible-galaxy collection build + + For more details on how to build a tar ball, please refer to: [Building the collection](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections_distributing.html#building-your-collection-tarball) + +## Installing collections + +#### Online installation of collections + * Use this command to install the latest collection hosted in [galaxy portal](https://galaxy.ansible.com/dellemc/powerflex): + + ansible-galaxy collection install dellemc.powerflex -p <install_path> + +#### Offline installation of collections + + * Download the latest tar build from any of the available distribution channel [Ansible Galaxy](https://galaxy.ansible.com/dellemc/powerflex) /[Automation Hub](https://console.redhat.com/ansible/automation-hub/repo/published/dellemc/powerflex) and use this command to install the collection anywhere in your system: + + ansible-galaxy collection install dellemc-powerflex-1.6.0.tar.gz -p <install_path> + + * Set the environment variable: + + export ANSIBLE_COLLECTIONS_PATHS=$ANSIBLE_COLLECTIONS_PATHS:<install_path> + +## Using collections + + * In order to use any Ansible module, ensure that the importing of proper FQCN (Fully Qualified Collection Name) must be embedded in the playbook. + This example can be referred to: + + collections: + - dellemc.powerflex + + * In order to use installed collection in a specific task use a proper FQCN (Fully Qualified Collection Name). Refer to this example: + + tasks: + - name: Get Volume details + dellemc.powerflex.volume + + * For generating Ansible documentation for a specific module, embed the FQCN before the module name. Refer to this example: + + ansible-doc dellemc.powerflex.volume + + +## Ansible modules execution + +The Ansible server must be configured with Python library for PowerFlex to run the Ansible playbooks. The [Documents](https://github.com/dell/ansible-powerflex/blob/1.6.0/docs/) provide information on different Ansible modules along with their functions and syntax. The parameters table in the Product Guide provides information on various parameters which needs to be configured before running the modules. + +## SSL certificate validation + +* Copy the CA certificate to the "/etc/pki/ca-trust/source/anchors" path of the host by any external means. +* Set the "REQUESTS_CA_BUNDLE" environment variable to the path of the SSL certificate using the command: + + export REQUESTS_CA_BUNDLE=/etc/pki/ca-trust/source/anchors/<<Certificate_Name>> +* Import the SSL certificate to host using the command: + + update-ca-trust extract +* If "TLS CA certificate bundle error" occurs, then follow these steps: + + cd /etc/pki/tls/certs/ + openssl x509 -in ca-bundle.crt -text -noout + +## Results +Each module returns the updated state and details of the entity, For example, if you are using the Volume module, all calls will return the updated details of the volume. Sample result is shown in each module's documentation. + +## Ansible execution environment +Ansible can also be installed in a container environment. Ansible Builder provides the ability to create reproducible, self-contained environments as container images that can be run as Ansible execution environments. +* Install the ansible builder package using: + + pip3 install ansible-builder +* Ensure the execution-environment.yml is at the root of collection and create the execution environment using: + + ansible-builder build --tag <tag_name> --container-runtime docker +* After the image is built, run the container using: + + docker run -it <tag_name> /bin/bash +* Verify collection installation using command: + + ansible-galaxy collection list +* The playbook can be run on the container using: + + docker run --rm -v $(pwd):/runner <tag_name> ansible-playbook info_test.yml diff --git a/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md b/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md new file mode 100644 index 000000000..18423aa1e --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md @@ -0,0 +1,306 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Triage issues + +The main goal of issue triage is to categorize all incoming issues and make sure each issue has all basic information needed for anyone else to understand and be able to start working on it. + +> **Note:** This information is for project Maintainers, Owners, and Admins. If you are a Contributor, then you will not be able to perform most of the tasks in this topic. + +The core maintainers of this project are responsible for categorizing all incoming issues and delegating any critical or important issue to other maintainers. Triage provides an important way to contribute to an open source project. + +Triage helps ensure issues resolve quickly by: + +- Ensuring the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences a problem and what actions they took. +- Giving a contributor the information they need before they commit to resolving an issue. +- Lowering the issue count by preventing duplicate issues. +- Streamlining the development process by preventing duplicate discussions. + +If you don't have the knowledge or time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. + +## 1. Find issues that need triage + +The easiest way to find issues that haven't been triaged is to search for issues with the `needs-triage` label. + +## 2. Ensure the issue contains basic information + +Make sure that the issue's author provided the standard issue information. This project utilizes GitHub issue templates to guide contributors to provide standard information that must be included for each type of template or type of issue. + +### Standard issue information that must be included + +This section describes the various issue templates and the expected content. + +#### Bug reports + +Should explain what happened, what was expected and how to reproduce it together with any additional information that may help giving a complete picture of what happened such as screenshots, output and any environment related information that's applicable and/or maybe related to the reported problem: + + - Ansible Version: [e.g. 2.14] + - Python Version [e.g. 3.11] + - Ansible modules for Dell PowerFlex Version: [e.g. 1.6.0] + - PowerFlex SDK version: [e.g. PyPowerFlex 1.7.0] + - Any other additional information... + +#### Feature requests + +Should explain what feature that the author wants to be added and why that is needed. + +#### Ask a question requests + +In general, if the issue description and title is perceived as a question no more information is needed. + +### Good practices + +To make it easier for everyone to understand and find issues they're searching for it's suggested as a general rule of thumbs to: + +- Make sure that issue titles are named to explain the subject of the issue, has a correct spelling and doesn't include irrelevant information and/or sensitive information. +- Make sure that issue descriptions doesn't include irrelevant information. +- Make sure that issues do not contain sensitive information. +- Make sure that issues have all relevant fields filled in. +- Do your best effort to change title and description or request suggested changes by adding a comment. + +> **Note:** Above rules are applicable to both new and existing issues. + +### Dealing with missing information + +Depending on the issue, you might not feel all this information is needed. Use your best judgement. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem. Label issue with `triage/needs-information`. + +If the author provides the standard information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time. Label issue with `triage/needs-information`. + +If the author does not respond to the requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided. + +If you receive a notification with additional information provided but you are not anymore on issue triage and you feel you do not have time to handle it, you should delegate it to the current person on issue triage. + +## 3. Categorizing an issue + +### Duplicate issues + +Make sure it's not a duplicate by searching existing issues using related terms from the issue title and description. If you think you know there is an existing issue, but can't find it, please reach out to one of the maintainers and ask for help. If you identify that the issue is a duplicate of an existing issue: + +1. Add a comment `duplicate of #<issue number>` +2. Add the `triage/duplicate` label + +### Bug reports + +If it's not perfectly clear that it's an actual bug, quickly try to reproduce it. + +**It's a bug/it can be reproduced:** + +1. Add a comment describing detailed steps for how to reproduce it, if applicable. +2. If you know that maintainers wont be able to put any resources into it for some time then label the issue with `help wanted` and optionally `beginner friendly` together with pointers on which code to update to fix the bug. This should signal to the community that we would appreciate any help we can get to resolve this. +3. Move on to [prioritizing the issue](#4-prioritization-of-issues). + +**It can't be reproduced:** + +1. Either [ask for more information](#2-ensure-the-issue-contains-basic-information) needed to investigate it more thoroughly. Provide details in a comment. +2. Either [delegate further investigations](#investigation-of-issues) to someone else. Provide details in a comment. + +**It works as intended/by design:** + +1. Kindly and politely add a comment explaining briefly why we think it works as intended and close the issue. +2. Label the issue `triage/works-as-intended`. +3. Remove the `needs-triage` label. + +**It does not work as intended/by design:** + +### Feature requests + +1. If the feature request does not align with the product vision, add a comment indicating so, remove the `needs-triage` label and close the issue +2. Otherwise, move on to [prioritizing the issue](#4-prioritization-of-issues). Assign the appropriate priority label to the issue, add the appropriate comments to the issue, and remove the `needs-triage` label. + +## 4. Prioritization of issues + +In general bugs and feature request issues should be labeled with a priority. + +Adding priority levels can be difficult. Ensure you have the knowledge, context, and the experience before prioritizing any issue. + +If you have any uncertainty as to which priority level to assign, please ask the maintainers for help. + +| Label | Description | +| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| `priority/critical` | Highest priority. Must be actively worked on as someone's top priority immediately. | +| `priority/high` | Must be worked on soon, ideally in time for the next release. | +| `priority/low` | Lowest priority. Possibly useful, but not yet enough interest in it. | + +### Critical priority + +1. If an issue has been categorized and any of this criteria apply, the issue should be labeled as critical and must be actively worked on as someone's top priority immediately. + + - Results in any data loss + - Critical security or performance issues + - Problem that makes a feature unusable + - Multiple users experience a severe problem affecting their business, users etc. + +2. Label the issue `priority/critical`. +3. Escalate the problem to the maintainers. +4. Assign or ask a maintainer for help assigning someone to make this issue their top priority immediately. +5. Add the issue to the next upcoming release milestone. + +### High priority + +1. Label the issue `priority/high`. +2. Add the issue to the next upcoming release milestone. +3. Prioritize it or assign someone to work on it now or very soon. +4. Consider requesting [help from the community](#5-requesting-help-from-the-community). + +### Low priority + +1. If the issue is deemed possibly useful but a low priority label the issue `priority/low`. +2. The amount of interest in the issue will determine if the priority elevated. +3. Consider requesting [help from the community](#5-requesting-help-from-the-community). + +## 5. Requesting help from the community + +Depending on the issue and/or priority, it's always a good idea to consider signalling to the community that help from community is appreciated and needed in case an issue is not prioritized to be worked on by maintainers. Use your best judgement. In general, requesting help from the community means that a contribution has a good chance of getting accepted and merged. + +In many cases the issue author or community as a whole is more suitable to contribute changes since they're experts in their domain. It's also quite common that someone has tried to get something to work using the documentation without success and made an effort to get it to work and/or reached out to the community to get the missing information. + +1. Kindly and politely add a comment to alert update subscribers. + - Explain the issue and need for resolution. Be sure and detail that the issue has not been prioritized and that the issue has not been scheduled for work by the maintainers. + - If possible or applicable, add pointers and references to the code/files that need to be revised. Provide any idea as to the solution. This will help the maintainers get started on resolving the issue. +2. Label the issue with `help wanted`. +3. If applicable, label the issue with `beginner friendly` to denote that the issue is suitable for a beginner to work on. + +## Investigation of issues + +When an issue has all basic information provided, but the reported problem cannot be reproduced at a first glance, the issue is labeled `triage/needs-information`. Depending on the perceived severity and/or number of [upvotes](https://help.github.com/en/articles/about-conversations-on-github#reacting-to-ideas-in-comments), the investigation will either be delegated to another maintainer for further investigation or put on hold until someone else (maintainer or contributor) picks it up and eventually starts investigating it. + +Even if you don't have the time or knowledge to investigate an issue we highly recommend that you [upvote](https://help.github.com/en/articles/about-conversations-on-github#reacting-to-ideas-in-comments) the issue if you happen to have the same problem. If you have further details that may help investigating the issue please provide as much information as possible. + +## External pull requests + +Part of issue triage should also be triaging of external PRs. Main goal should be to make sure PRs from external contributors have an owner/reviewer and are not forgotten. + +1. Check new external PRs which do not have a reviewer. +1. Check if there is a link to an existing issue. +1. If not and you know which issue it is solving, add the link yourself, otherwise ask the author to link the issue or create one. +1. Assign a reviewer based on who was handling the linked issue or what code or feature does the PR touches (look at who was the last to make changes there if all else fails). + +## GitHub issue management workflow + +This section describes the triage workflow for new GitGHub issues that get created. + +### GitHub Issue: Bug + +This workflow starts off with a GitHub issue of type bug being created. + +1. Collaborator or maintainer creates a GitHub bug using the appropriate GitHub issue template +2. By default a bug will be created with the `type/bug` and `needs-triage` labels + +The following flow chart outlines the triage process for bugs. + +<!-- https://textik.com/#38ec14781648871c --> +``` + +--------------------------+ + | New bug issue opened/more| + | information added | + +-------------|------------+ + | + | + +----------------------------------+ NO +--------------|-------------+ + | label: triage/needs-information --------- All required information | + | | | contained in issue? | + +-----------------------------|----+ +--------------|-------------+ + | | YES + | | + +--------------------------+ | +---------------------+ YES +---------------------------------------+ + |label: | | | Dupicate Issue? ------- Comment `Duplicate of #<issue number>` + |triage/needs-investigation| | NO | | | Remove needs-triage label | + +------|-------------------+ | +----------|----------+ | label: triage/duplicate | + | | | NO +-----------------|---------------------+ + YES | | | | + | +---------------|----+ NO +------------|------------+ | + | |Needs investigation?|---------- Can it be reproduced? | | + |------- | +------------|------------+ | + +--------------------+ | YES | + | +----------|----------+ + +-------------------------+ +------------|------------+ | Close Issue | + | Add release-found label |------------------ Works as intended? | | | + | label: release-found/* | NO | | +----------|----------+ + +------------|------------+ +------------|------------+ | + | | | + | | YES | + +-----------------------------+ +----------------|----------------+ | + | Add area label | | Add comment | | + | label: area/* | | Remove needs-triage label ------------------| + +------------|----------------+ | label: triage/works-as-intended | + | +---------------------------------+ + | + +------------|-------------+ +----------+ + | Add priority label | | Done ---------------------------------------- + | label: priority/* | +----|-----+ | + +------------|-------------+ |NO | + | | +------------------|------------------+ + +------------|-------------+ +----|----------------+ YES | Add details to issue | + | ------------ Signal Community? ---------- label: help wanted | + |Remove needs-triage label | | | | label: beginner friendly (optional)| + +--------------------------+ +---------------------+ +-------------------------------------+ + +``` + +If the author does not respond to a request for more information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided. + +### GitHub issue: feature request + +This workflow starts off with a GitHub issue of type feature request being created. + +1. Collaborator or maintainer creates a GitHub feature request using the appropriate GitHub issue template +2. By default a feature request will be created with the `type/feature-request` and `needs-triage` labels + +This flow chart outlines the triage process for feature requests. + +<!-- https://textik.com/#81e81fc717f63429 --> +``` + +---------------------------------+ + |New feature request issue opened/| + |more information added | + +----------------|----------------+ + | + | + +---------------------------------+ NO +-------------|------------+ + | label: triage/needs-information ---------- All required information | + | | | contained in issue? | + +---------------------------------+ +-------------|------------+ + | + | + +---------------------------------------+ | + |Comment `Duplicate of #<issue number>` | YES +----------|----------+ + |Remove needs-triage label ------- Duplicate issue? | + |label: triage/duplicate | | | + +-----|---------------------------------+ +-----------|---------+ + | |NO + | +-------------------------+ NO +-----------------------------+ + | |Add comment |-------- Does feature request align | + | |Remove needs-triage label| | with product vision? | + | +------|------------------+ +--------------|--------------+ + | | | YES + | | +-----------------|----------------+ + | | |Change feature-request to feature | + | | |Remove label: type/feature-request| + | | |Add label: type/feature | + | | +-----------------|----------------+ + | | | + | | +--------------|--------------+ + | | | Add area label | + | | | label: area/* | + | | +--------------|--------------+ + | | | + +-|---------|---+ +--------+ +--------------|--------------+ + | Close issue | | Done --------- Add priority label | + | | | | | label: priority/* | + +---------------+ +--------+ +-----------------------------+ +``` + +If the author does not respond to a request for more information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided. + +In some cases you may receive a request you do not wish to accept. Perhaps the request doesn't align with the project scope or vision. It is important to tactfully handle contributions that don't meet the project standards. + +1. Acknowledge the person behind the contribution and thank them for their interest and contribution +2. Explain why it didn't fit into the scope of the project or vision +3. Don't leave an unwanted contributions open. Immediately close the contribution you do not wish to accept diff --git a/ansible_collections/dellemc/powerflex/docs/MAINTAINERS.md b/ansible_collections/dellemc/powerflex/docs/MAINTAINERS.md new file mode 100644 index 000000000..4679f6d73 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/MAINTAINERS.md @@ -0,0 +1,18 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Maintainers + +* Ananthu Kuttattu (kuttattz) +* Bhavneet Sharma (Bhavneet-Sharma) +* Jennifer John (Jennifer-John) +* Meenakshi Dembi (meenakshidembi691) +* Pavan Mudunuri (Pavan-Mudunuri) +* Trisha Datta (trisha-dell) diff --git a/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md b/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md new file mode 100644 index 000000000..b92cebabe --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md @@ -0,0 +1,38 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Maintainer guidelines + +As a Maintainer of this project you have the responsibility of keeping true to the vision of the project with a high-degree quality. Being part of this group is a privilege that requires dedication and time to attend to the daily activities that are associated with the maintenance of this project. + +## Becoming a maintainer + +Most Maintainers started as Contributors that have demonstrated their commitment to the success of the project. Contributors wishing to become Maintainers, must demonstrate commitment to the success of the project by contributing code, reviewing others' work, and triaging issues on a regular basis for at least three months. + +The contributions alone don't make you a Maintainer. You need to earn the trust of the current Maintainers and other project Contributors, that your decisions and actions are in the best interest of the project. + +Periodically, the existing Maintainers curate a list of Contributors who have shown regular activity on the project over the prior months. It is from this list that Maintainer candidates are selected. + +After a candidate is selected, the existing Maintainers discuss the candidate over the next 5 business days, provide feedback, and vote. At least 75% of the current Maintainers must vote in the affirmative for a candidate to be moved to the role of Maintainer. + +If a candidate is approved, a Maintainer contacts the candidate to invite them to open a pull request that adds the contributor to the MAINTAINERS file. The candidate becomes a Maintainer once the pull request is merged. + +## Maintainer policies + +* Lead by example +* Follow the [Code of Conduct](https://github.com/dell/ansible-powerflex/blob/1.6.0/CODE_OF_CONDUCT.md) and the guidelines in the [Contributing](https://github.com/dell/ansible-powerflex/blob/1.6.0/CONTRIBUTING.md) and [Committer](https://github.com/dell/ansible-powerflex/blob/1.6.0/COMMITTER_GUIDE.md) guides +* Promote a friendly and collaborative environment within our community +* Be actively engaged in discussions, answering questions, updating defects, and reviewing pull requests +* Criticize code, not people. Ideally, tell the contributor a better way to do what they need. +* Clearly mark optional suggestions as such. Best practice, start your comment with *At your option: …* + +## Project decision making + +All project decisions should contribute to successfully executing on the project roadmap. Project milestones are established for each release.
\ No newline at end of file diff --git a/ansible_collections/dellemc/powerflex/docs/Release Notes.md b/ansible_collections/dellemc/powerflex/docs/Release Notes.md new file mode 100644 index 000000000..a45d82eb7 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/Release Notes.md @@ -0,0 +1,71 @@ +**Ansible Modules for Dell Technologies PowerFlex** +========================================= +### Release notes 1.6.0 + +> © 2023 Dell Inc. or its subsidiaries. All rights reserved. Dell +> and other trademarks are trademarks of Dell Inc. or its +> subsidiaries. Other trademarks may be trademarks of their respective +> owners. + +Contents +------- +These release notes contain supplemental information about Ansible +Modules for Dell Technologies (Dell) PowerFlex. + +- [Revision History](#revision-history) +- [Product Description](#product-description) +- [New Features](#new-features-and-enhancements) +- [Known issues](#known-issues) +- [Limitations](#limitations) +- [Distribution](#distribution) +- [Documentation](#documentation) + +Revision history +---------------- +The table in this section lists the revision history of this document. + +Table 1. Revision history + +| Revision | Date | Description | +|----------|----------------|-------------------------------------------------------------| +| 01 | March 2023 | Current release of Ansible Modules for Dell PowerFlex 1.6.0 | + +Product description +------------------- + +The Ansible modules for Dell PowerFlex are used to automate and orchestrate +the deployment, configuration, and management of Dell PowerFlex storage +systems. The capabilities of Ansible modules are managing volumes, +storage pools, SDCs, snapshots, SDSs, replication consistency groups, replication pairs, devices, protection domain and MDM +cluster, and obtaining high-level information about a PowerFlex system information. +The modules use playbooks to list, show, create, delete, and modify +each of the entities. + +New features and enhancements +----------------------------- +Along with the previous release deliverables, this release supports following features - +- Info module is enhanced to support the listing of replication pairs. +- Added new module for replication pairs. + +Known issues +------------ +- Setting the RF cache and performance profile of the SDS during its creation fails intermittently on PowerFlex version 3.5 +- The creation of replication pair fails when copy_type is specified as OfflineCopy on PowerFlex version 4.0 + +Limitations +----------- +- The API is accepting a negative integer value for overall_limit in the network_limits for a specific protection domain. + +Distribution +------------ +The software package is available for download from the [Ansible Modules +for PowerFlex GitHub](https://github.com/dell/ansible-powerflex/tree/1.6.0) page. + +Documentation +------------- +The documentation is available on [Ansible Modules for PowerFlex GitHub](https://github.com/dell/ansible-powerflex/tree/1.6.0/docs) +page. It includes the following: + + - README + - Release Notes (this document) + - Product Guide diff --git a/ansible_collections/dellemc/powerflex/docs/SECURITY.md b/ansible_collections/dellemc/powerflex/docs/SECURITY.md new file mode 100644 index 000000000..e34152322 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/SECURITY.md @@ -0,0 +1,22 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +# Security policy + +The Ansible modules for Dell PowerFlex repository are inspected for security vulnerabilities via blackduck scans and static code analysis. + +In addition to this, there are various security checks that get executed against a branch when a pull request is created/updated. Please refer to [pull request](https://github.com/dell/ansible-powerflex/blob/1.6.0/docs/CONTRIBUTING.md#Pull-requests) for more information. + +## Reporting a vulnerability + +Have you discovered a security vulnerability in this project? +We ask you to alert the maintainers by sending an email, describing the issue, impact, and fix - if applicable. + +You can reach the Ansible modules for Dell PowerFlex maintainers at ansible.team@dell.com. diff --git a/ansible_collections/dellemc/powerflex/docs/SUPPORT.md b/ansible_collections/dellemc/powerflex/docs/SUPPORT.md new file mode 100644 index 000000000..26e6f159e --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/SUPPORT.md @@ -0,0 +1,12 @@ +<!-- +Copyright (c) 2022 Dell Inc., or its subsidiaries. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +--> + +## Support +For all your support needs you can interact with us on [GitHub](https://github.com/dell/ansible-powerflex) by creating a [GitHub Issue](https://github.com/dell/ansible-powerflex/issues) or through the [Ansible Community](https://www.dell.com/community/Automation/bd-p/Automation). diff --git a/ansible_collections/dellemc/powerflex/docs/modules/device.rst b/ansible_collections/dellemc/powerflex/docs/modules/device.rst new file mode 100644 index 000000000..35ae246aa --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/device.rst @@ -0,0 +1,474 @@ +.. _device_module: + + +device -- Manage device on Dell PowerFlex +========================================= + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing device on PowerFlex storage system includes adding new device, getting details of device, and removing a device. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + current_pathname (optional, str, None) + Full path of the device to be added. + + Required while adding a device. + + + device_name (optional, str, None) + Device name. + + Mutually exclusive with *device_id*. + + + device_id (optional, str, None) + Device ID. + + Mutually exclusive with *device_name*. + + + sds_name (optional, str, None) + The name of the SDS. + + Required while adding a device. + + Mutually exclusive with *sds_id*. + + + sds_id (optional, str, None) + The ID of the SDS. + + Required while adding a device. + + Mutually exclusive with *sds_name*. + + + storage_pool_name (optional, str, None) + Storage Pool name. + + Used while adding a storage device. + + Mutually exclusive with *storage_pool_id*, *acceleration_pool_id* and *acceleration_pool_name*. + + + storage_pool_id (optional, str, None) + Storage Pool ID. + + Used while adding a storage device. + + Media type supported are ``SSD`` and ``HDD``. + + Mutually exclusive with *storage_pool_name*, *acceleration_pool_id* and *acceleration_pool_name*. + + + acceleration_pool_name (optional, str, None) + Acceleration Pool Name. + + Used while adding an acceleration device. + + Media type supported are ``SSD`` and ``NVDIMM``. + + Mutually exclusive with *storage_pool_id*, *storage_pool_name* and *acceleration_pool_name*. + + + acceleration_pool_id (optional, str, None) + Acceleration Pool ID. + + Used while adding an acceleration device. + + Media type supported are ``SSD`` and ``NVDIMM``. + + Mutually exclusive with *acceleration_pool_name*, *storage_pool_name* and *storage_pool_id*. + + + protection_domain_name (optional, str, None) + Protection domain name. + + Used while identifying a storage pool along with *storage_pool_name*. + + Mutually exclusive with *protection_domain_id*. + + + protection_domain_id (optional, str, None) + Protection domain ID. + + Used while identifying a storage pool along with *storage_pool_name*. + + Mutually exclusive with *protection_domain_name*. + + + external_acceleration_type (optional, str, None) + Device external acceleration types. + + Used while adding a device. + + + media_type (optional, str, None) + Device media types. + + Required while adding a device. + + + state (True, str, None) + State of the device. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The value for device_id is generated only after successful addition of the device. + - To uniquely identify a device, either *device_id* can be passed or one of *current_pathname* or *device_name* must be passed with *sds_id* or *sds_name*. + - It is recommended to install Rfcache driver for SSD device on SDS in order to add it to an acceleration pool. + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Add a device + dellemc.powerflex.device: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + current_pathname: "/dev/sdb" + sds_name: "node1" + media_type: "HDD" + device_name: "device2" + storage_pool_name: "pool1" + protection_domain_name: "domain1" + external_acceleration_type: "ReadAndWrite" + state: "present" + - name: Get device details using device_id + dellemc.powerflex.device: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + device_id: "d7fe088900000000" + state: "present" + - name: Get device details using (current_pathname, sds_name) + dellemc.powerflex.device: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + current_pathname: "/dev/sdb" + sds_name: "node0" + state: "present" + - name: Get device details using (current_pathname, sds_id) + dellemc.powerflex.device: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + current_pathname: "/dev/sdb" + sds_id: "5717d71800000000" + state: "present" + - name: Remove a device using device_id + dellemc.powerflex.device: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + device_id: "76eb7e2f00010000" + state: "absent" + - name: Remove a device using (current_pathname, sds_id) + dellemc.powerflex.device: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + current_pathname: "/dev/sdb" + sds_name: "node1" + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +device_details (When device exists, dict, {'accelerationPoolId': None, 'accelerationProps': None, 'aggregatedState': 'NeverFailed', 'ataSecurityActive': False, 'autoDetectMediaType': 'SSD', 'cacheLookAheadActive': False, 'capacity': 0, 'capacityLimitInKb': 365772800, 'deviceCurrentPathName': '/dev/sdb', 'deviceOriginalPathName': '/dev/sdb', 'deviceState': 'Normal', 'deviceType': 'Unknown', 'errorState': 'None', 'externalAccelerationType': 'None', 'fglNvdimmMetadataAmortizationX100': 150, 'fglNvdimmWriteCacheSize': 16, 'firmwareVersion': None, 'id': 'b6efa59900000000', 'ledSetting': 'Off', 'links': [{'href': '/api/instances/Device::b6efa59900000000', 'rel': 'self'}, {'href': '/api/instances/Device::b6efa59900000000/relationships /Statistics', 'rel': '/api/Device/relationship/Statistics'}, {'href': '/api/instances/Sds::8f3bb0ce00000000', 'rel': '/api/parent/relationship/sdsId'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000', 'rel': '/api/parent/relationship/storagePoolId'}, {'href': '/api/instances/SpSds::fedf6f2000000000', 'rel': '/api/parent/relationship/spSdsId'}], 'logicalSectorSizeInBytes': 0, 'longSuccessfulIos': {'longWindow': None, 'mediumWindow': None, 'shortWindow': None}, 'maxCapacityInKb': 365772800, 'mediaFailing': False, 'mediaType': 'HDD', 'modelName': None, 'name': 'device230', 'persistentChecksumState': 'Protected', 'physicalSectorSizeInBytes': 0, 'protectionDomainId': '9300c1f900000000', 'protectionDomainName': 'domain1', 'raidControllerSerialNumber': None, 'rfcacheErrorDeviceDoesNotExist': False, 'rfcacheProps': None, 'sdsId': '8f3bb0ce00000000', 'sdsName': 'node1', 'serialNumber': None, 'slotNumber': None, 'spSdsId': 'fedf6f2000000000', 'ssdEndOfLifeState': 'NeverFailed', 'storagePoolId': 'e0d8f6c900000000', 'storagePoolName': 'pool1', 'storageProps': {'destFglAccDeviceId': None, 'destFglNvdimmSizeMb': 0, 'fglAccDeviceId': None, 'fglNvdimmSizeMb': 0}, 'temperatureState': 'NeverFailed', 'vendorName': None, 'writeCacheActive': False}) + Details of the device. + + + accelerationPoolId (, str, ) + Acceleration pool ID. + + + accelerationPoolName (, str, ) + Acceleration pool name. + + + accelerationProps (, str, ) + Indicates acceleration props. + + + aggregatedState (, str, ) + Indicates aggregated state. + + + ataSecurityActive (, bool, ) + Indicates ATA security active state. + + + autoDetectMediaType (, str, ) + Indicates auto detection of media type. + + + cacheLookAheadActive (, bool, ) + Indicates cache look ahead active state. + + + capacity (, int, ) + Device capacity. + + + capacityLimitInKb (, int, ) + Device capacity limit in KB. + + + deviceCurrentPathName (, str, ) + Device current path name. + + + deviceOriginalPathName (, str, ) + Device original path name. + + + deviceState (, str, ) + Indicates device state. + + + deviceType (, str, ) + Indicates device type. + + + errorState (, str, ) + Indicates error state. + + + externalAccelerationType (, str, ) + Indicates external acceleration type. + + + fglNvdimmMetadataAmortizationX100 (, int, ) + Indicates FGL NVDIMM meta data amortization value. + + + fglNvdimmWriteCacheSize (, int, ) + Indicates FGL NVDIMM write cache size. + + + firmwareVersion (, str, ) + Indicates firmware version. + + + id (, str, ) + Device ID. + + + ledSetting (, str, ) + Indicates LED setting. + + + links (, list, ) + Device links. + + + href (, str, ) + Device instance URL. + + + rel (, str, ) + Relationship of device with different entities. + + + + logicalSectorSizeInBytes (, int, ) + Logical sector size in bytes. + + + longSuccessfulIos (, list, ) + Indicates long successful IOs. + + + maxCapacityInKb (, int, ) + Maximum device capacity limit in KB. + + + mediaFailing (, bool, ) + Indicates media failing. + + + mediaType (, str, ) + Indicates media type. + + + modelName (, str, ) + Indicates model name. + + + name (, str, ) + Device name. + + + persistentChecksumState (, str, ) + Indicates persistent checksum state. + + + physicalSectorSizeInBytes (, int, ) + Physical sector size in bytes. + + + protectionDomainId (, str, ) + Protection domain ID. + + + protectionDomainName (, str, ) + Protection domain name. + + + raidControllerSerialNumber (, str, ) + RAID controller serial number. + + + rfcacheErrorDeviceDoesNotExist (, bool, ) + Indicates RF cache error device does not exist. + + + rfcacheProps (, str, ) + RF cache props. + + + sdsId (, str, ) + SDS ID. + + + sdsName (, str, ) + SDS name. + + + serialNumber (, str, ) + Indicates Serial number. + + + spSdsId (, str, ) + Indicates SPs SDS ID. + + + ssdEndOfLifeState (, str, ) + Indicates SSD end of life state. + + + storagePoolId (, str, ) + Storage Pool ID. + + + storagePoolName (, str, ) + Storage Pool name. + + + storageProps (, list, ) + Storage props. + + + temperatureState (, str, ) + Indicates temperature state. + + + vendorName (, str, ) + Indicates vendor name. + + + writeCacheActive (, bool, ) + Indicates write cache active. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Rajshree Khare (@khareRajshree) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/info.rst b/ansible_collections/dellemc/powerflex/docs/modules/info.rst new file mode 100644 index 000000000..735fb04f4 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/info.rst @@ -0,0 +1,655 @@ +.. _info_module: + + +info -- Gathering information about Dell PowerFlex +================================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Gathering information about Dell PowerFlex storage system includes getting the api details, list of volumes, SDSs, SDCs, storage pools, protection domains, snapshot policies, and devices. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + gather_subset (optional, list, None) + List of string variables to specify the Powerflex storage system entities for which information is required. + + Volumes - ``vol``. + + Storage pools - ``storage_pool``. + + Protection domains - ``protection_domain``. + + SDCs - ``sdc``. + + SDSs - ``sds``. + + Snapshot policies - ``snapshot_policy``. + + Devices - ``device``. + + Replication consistency groups - ``rcg``. + + Replication pairs - ``replication_pair``. + + + filters (optional, list, None) + List of filters to support filtered output for storage entities. + + Each filter is a list of *filter_key*, *filter_operator*, *filter_value*. + + Supports passing of multiple filters. + + + filter_key (True, str, None) + Name identifier of the filter. + + + filter_operator (True, str, None) + Operation to be performed on filter key. + + + filter_value (True, str, None) + Value of the filter key. + + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The *check_mode* is supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Get detailed list of PowerFlex entities + dellemc.powerflex.info: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + gather_subset: + - vol + - storage_pool + - protection_domain + - sdc + - sds + - snapshot_policy + - device + - rcg + - replication_pair + + - name: Get a subset list of PowerFlex volumes + dellemc.powerflex.info: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + gather_subset: + - vol + filters: + - filter_key: "name" + filter_operator: "equal" + filter_value: "ansible_test" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +Array_Details (always, dict, {'addressSpaceUsage': 'Normal', 'authenticationMethod': 'Native', 'capacityAlertCriticalThresholdPercent': 90, 'capacityAlertHighThresholdPercent': 80, 'capacityTimeLeftInDays': '24', 'cliPasswordAllowed': True, 'daysInstalled': 66, 'defragmentationEnabled': True, 'enterpriseFeaturesEnabled': True, 'id': '4a54a8ba6df0690f', 'installId': '38622771228e56db', 'isInitialLicense': True, 'lastUpgradeTime': 0, 'managementClientSecureCommunicationEnabled': True, 'maxCapacityInGb': 'Unlimited', 'mdmCluster': {'clusterMode': 'ThreeNodes', 'clusterState': 'ClusteredNormal', 'goodNodesNum': 3, 'goodReplicasNum': 2, 'id': '5356091375512217871', 'master': {'id': '6101582c2ca8db00', 'ips': ['10.47.xxx.xxx'], 'managementIPs': ['10.47.xxx.xxx'], 'name': 'node0', 'opensslVersion': 'OpenSSL 1.0.2k-fips 26 Jan 2017', 'port': 9011, 'role': 'Manager', 'status': 'Normal', 'versionInfo': 'R3_6.0.0', 'virtualInterfaces': ['ens160']}, 'slaves': [{'id': '23fb724015661901', 'ips': ['10.47.xxx.xxx'], 'managementIPs': ['10.47.xxx.xxx'], 'opensslVersion': 'OpenSSL 1.0.2k-fips 26 Jan 2017', 'port': 9011, 'role': 'Manager', 'status': 'Normal', 'versionInfo': 'R3_6.0.0', 'virtualInterfaces': ['ens160']}], 'tieBreakers': [{'id': '6ef27eb20d0c1202', 'ips': ['10.47.xxx.xxx'], 'managementIPs': ['10.47.xxx.xxx'], 'opensslVersion': 'N/A', 'port': 9011, 'role': 'TieBreaker', 'status': 'Normal', 'versionInfo': 'R3_6.0.0'}]}, 'mdmExternalPort': 7611, 'mdmManagementPort': 6611, 'mdmSecurityPolicy': 'None', 'showGuid': True, 'swid': '', 'systemVersionName': 'DellEMC PowerFlex Version: R3_6.0.354', 'tlsVersion': 'TLSv1.2', 'upgradeState': 'NoUpgrade'}) + System entities of PowerFlex storage array. + + + addressSpaceUsage (, str, ) + Address space usage. + + + authenticationMethod (, str, ) + Authentication method. + + + capacityAlertCriticalThresholdPercent (, int, ) + Capacity alert critical threshold percentage. + + + capacityAlertHighThresholdPercent (, int, ) + Capacity alert high threshold percentage. + + + capacityTimeLeftInDays (, str, ) + Capacity time left in days. + + + cliPasswordAllowed (, bool, ) + CLI password allowed. + + + daysInstalled (, int, ) + Days installed. + + + defragmentationEnabled (, bool, ) + Defragmentation enabled. + + + enterpriseFeaturesEnabled (, bool, ) + Enterprise features enabled. + + + id (, str, ) + The ID of the system. + + + installId (, str, ) + installation Id. + + + isInitialLicense (, bool, ) + Initial license. + + + lastUpgradeTime (, int, ) + Last upgrade time. + + + managementClientSecureCommunicationEnabled (, bool, ) + Management client secure communication enabled. + + + maxCapacityInGb (, dict, ) + Maximum capacity in GB. + + + mdmCluster (, dict, ) + MDM cluster details. + + + mdmExternalPort (, int, ) + MDM external port. + + + mdmManagementPort (, int, ) + MDM management port. + + + mdmSecurityPolicy (, str, ) + MDM security policy. + + + showGuid (, bool, ) + Show guid. + + + swid (, str, ) + SWID. + + + systemVersionName (, str, ) + System version and name. + + + tlsVersion (, str, ) + TLS version. + + + upgradeState (, str, ) + Upgrade state. + + + +API_Version (always, str, 3.5) + API version of PowerFlex API Gateway. + + +Protection_Domains (always, list, [{'id': '9300e90900000001', 'name': 'domain2'}, {'id': '9300c1f900000000', 'name': 'domain1'}]) + Details of all protection domains. + + + id (, str, ) + protection domain id. + + + name (, str, ) + protection domain name. + + + +SDCs (always, list, [{'id': '07335d3d00000006', 'name': 'LGLAP203'}, {'id': '07335d3c00000005', 'name': 'LGLAP178'}, {'id': '0733844a00000003'}]) + Details of storage data clients. + + + id (, str, ) + storage data client id. + + + name (, str, ) + storage data client name. + + + +SDSs (always, list, [{'id': '8f3bb0cc00000002', 'name': 'node0'}, {'id': '8f3bb0ce00000000', 'name': 'node1'}, {'id': '8f3bb15300000001', 'name': 'node22'}]) + Details of storage data servers. + + + id (, str, ) + storage data server id. + + + name (, str, ) + storage data server name. + + + +Snapshot_Policies (always, list, [{'id': '2b380c5c00000000', 'name': 'sample_snap_policy'}, {'id': '2b380c5d00000001', 'name': 'sample_snap_policy_1'}]) + Details of snapshot policies. + + + id (, str, ) + snapshot policy id. + + + name (, str, ) + snapshot policy name. + + + +Storage_Pools (always, list, [{'addressSpaceUsage': 'Normal', 'addressSpaceUsageType': 'DeviceCapacityLimit', 'backgroundScannerBWLimitKBps': 3072, 'backgroundScannerMode': 'DataComparison', 'bgScannerCompareErrorAction': 'ReportAndFix', 'bgScannerReadErrorAction': 'ReportAndFix', 'capacityAlertCriticalThreshold': 90, 'capacityAlertHighThreshold': 80, 'capacityUsageState': 'Normal', 'capacityUsageType': 'NetCapacity', 'checksumEnabled': False, 'compressionMethod': 'Invalid', 'dataLayout': 'MediumGranularity', 'externalAccelerationType': 'None', 'fglAccpId': None, 'fglExtraCapacity': None, 'fglMaxCompressionRatio': None, 'fglMetadataSizeXx100': None, 'fglNvdimmMetadataAmortizationX100': None, 'fglNvdimmWriteCacheSizeInMb': None, 'fglOverProvisioningFactor': None, 'fglPerfProfile': None, 'fglWriteAtomicitySize': None, 'fragmentationEnabled': True, 'id': 'e0d8f6c900000000', 'links': [{'href': '/api/instances/StoragePool::e0d8f6c900000000', 'rel': 'self'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/Statistics', 'rel': '/api/StoragePool/relationship/Statistics'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/SpSds', 'rel': '/api/StoragePool/relationship/SpSds'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/Volume', 'rel': '/api/StoragePool/relationship/Volume'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/Device', 'rel': '/api/StoragePool/relationship/Device'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/VTree', 'rel': '/api/StoragePool/relationship/VTree'}, {'href': '/api/instances/ProtectionDomain::9300c1f900000000', 'rel': '/api/parent/relationship/protectionDomainId'}], 'statistics': {'BackgroundScannedInMB': 3466920, 'activeBckRebuildCapacityInKb': 0, 'activeEnterProtectedMaintenanceModeCapacityInKb': 0, 'aggregateCompressionLevel': 'Uncompressed', 'atRestCapacityInKb': 1248256, 'backgroundScanCompareErrorCount': 0, 'backgroundScanFixedCompareErrorCount': 0, 'bckRebuildReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'bckRebuildWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'capacityAvailableForVolumeAllocationInKb': 369098752, 'capacityInUseInKb': 2496512, 'capacityInUseNoOverheadInKb': 2496512, 'capacityLimitInKb': 845783040, 'compressedDataCompressionRatio': 0.0, 'compressionRatio': 1.0, 'currentFglMigrationSizeInKb': 0, 'deviceIds': [], 'enterProtectedMaintenanceModeCapacityInKb': 0, 'enterProtectedMaintenanceModeReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'enterProtectedMaintenanceModeWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'exitProtectedMaintenanceModeReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'exitProtectedMaintenanceModeWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'exposedCapacityInKb': 0, 'failedCapacityInKb': 0, 'fwdRebuildReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'fwdRebuildWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'inMaintenanceCapacityInKb': 0, 'inMaintenanceVacInKb': 0, 'inUseVacInKb': 184549376, 'inaccessibleCapacityInKb': 0, 'logWrittenBlocksInKb': 0, 'maxCapacityInKb': 845783040, 'migratingVolumeIds': [], 'migratingVtreeIds': [], 'movingCapacityInKb': 0, 'netCapacityInUseInKb': 1248256, 'normRebuildCapacityInKb': 0, 'normRebuildReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'normRebuildWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'numOfDeviceAtFaultRebuilds': 0, 'numOfDevices': 3, 'numOfIncomingVtreeMigrations': 0, 'numOfVolumes': 8, 'numOfVolumesInDeletion': 0, 'numOfVtrees': 8, 'overallUsageRatio': 73.92289, 'pendingBckRebuildCapacityInKb': 0, 'pendingEnterProtectedMaintenanceModeCapacityInKb': 0, 'pendingExitProtectedMaintenanceModeCapacityInKb': 0, 'pendingFwdRebuildCapacityInKb': 0, 'pendingMovingCapacityInKb': 0, 'pendingMovingInBckRebuildJobs': 0, 'persistentChecksumBuilderProgress': 100.0, 'persistentChecksumCapacityInKb': 414720, 'primaryReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'primaryReadFromDevBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'primaryReadFromRmcacheBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'primaryVacInKb': 92274688, 'primaryWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'protectedCapacityInKb': 2496512, 'protectedVacInKb': 184549376, 'provisionedAddressesInKb': 2496512, 'rebalanceCapacityInKb': 0, 'rebalanceReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'rebalanceWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'rfacheReadHit': 0, 'rfacheWriteHit': 0, 'rfcacheAvgReadTime': 0, 'rfcacheAvgWriteTime': 0, 'rfcacheIoErrors': 0, 'rfcacheIosOutstanding': 0, 'rfcacheIosSkipped': 0, 'rfcacheReadMiss': 0, 'rmPendingAllocatedInKb': 0, 'rmPendingThickInKb': 0, 'rplJournalCapAllowed': 0, 'rplTotalJournalCap': 0, 'rplUsedJournalCap': 0, 'secondaryReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'secondaryReadFromDevBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'secondaryReadFromRmcacheBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'secondaryVacInKb': 92274688, 'secondaryWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'semiProtectedCapacityInKb': 0, 'semiProtectedVacInKb': 0, 'snapCapacityInUseInKb': 0, 'snapCapacityInUseOccupiedInKb': 0, 'snapshotCapacityInKb': 0, 'spSdsIds': ['abdfe71b00030001', 'abdce71d00040001', 'abdde71e00050001'], 'spareCapacityInKb': 84578304, 'targetOtherLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'targetReadLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'targetWriteLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'tempCapacityInKb': 0, 'tempCapacityVacInKb': 0, 'thickCapacityInUseInKb': 0, 'thinAndSnapshotRatio': 73.92289, 'thinCapacityAllocatedInKm': 184549376, 'thinCapacityInUseInKb': 0, 'thinUserDataCapacityInKb': 2496512, 'totalFglMigrationSizeInKb': 0, 'totalReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'totalWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'trimmedUserDataCapacityInKb': 0, 'unreachableUnusedCapacityInKb': 0, 'unusedCapacityInKb': 758708224, 'userDataCapacityInKb': 2496512, 'userDataCapacityNoTrimInKb': 2496512, 'userDataReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcReadLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcTrimLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcWriteLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataTrimBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'volMigrationReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'volMigrationWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'volumeAddressSpaceInKb': '922XXXXX', 'volumeAllocationLimitInKb': '3707XXXXX', 'volumeIds': ['456afc7900XXXXXXXX'], 'vtreeAddresSpaceInKb': 92274688, 'vtreeIds': ['32b1681bXXXXXXXX']}, 'mediaType': 'HDD', 'name': 'pool1', 'numOfParallelRebuildRebalanceJobsPerDevice': 2, 'persistentChecksumBuilderLimitKb': 3072, 'persistentChecksumEnabled': True, 'persistentChecksumState': 'Protected', 'persistentChecksumValidateOnRead': False, 'protectedMaintenanceModeIoPriorityAppBwPerDeviceThresholdInKbps': None, 'protectedMaintenanceModeIoPriorityAppIopsPerDeviceThreshold': None, 'protectedMaintenanceModeIoPriorityBwLimitPerDeviceInKbps': 10240, 'protectedMaintenanceModeIoPriorityNumOfConcurrentIosPerDevice': 1, 'protectedMaintenanceModeIoPriorityPolicy': 'limitNumOfConcurrentIos', 'protectedMaintenanceModeIoPriorityQuietPeriodInMsec': None, 'protectionDomainId': '9300c1f900000000', 'protectionDomainName': 'domain1', 'rebalanceEnabled': True, 'rebalanceIoPriorityAppBwPerDeviceThresholdInKbps': None, 'rebalanceIoPriorityAppIopsPerDeviceThreshold': None, 'rebalanceIoPriorityBwLimitPerDeviceInKbps': 10240, 'rebalanceIoPriorityNumOfConcurrentIosPerDevice': 1, 'rebalanceIoPriorityPolicy': 'favorAppIos', 'rebalanceIoPriorityQuietPeriodInMsec': None, 'rebuildEnabled': True, 'rebuildIoPriorityAppBwPerDeviceThresholdInKbps': None, 'rebuildIoPriorityAppIopsPerDeviceThreshold': None, 'rebuildIoPriorityBwLimitPerDeviceInKbps': 10240, 'rebuildIoPriorityNumOfConcurrentIosPerDevice': 1, 'rebuildIoPriorityPolicy': 'limitNumOfConcurrentIos', 'rebuildIoPriorityQuietPeriodInMsec': None, 'replicationCapacityMaxRatio': 32, 'rmcacheWriteHandlingMode': 'Cached', 'sparePercentage': 10, 'useRfcache': False, 'useRmcache': False, 'vtreeMigrationIoPriorityAppBwPerDeviceThresholdInKbps': None, 'vtreeMigrationIoPriorityAppIopsPerDeviceThreshold': None, 'vtreeMigrationIoPriorityBwLimitPerDeviceInKbps': 10240, 'vtreeMigrationIoPriorityNumOfConcurrentIosPerDevice': 1, 'vtreeMigrationIoPriorityPolicy': 'favorAppIos', 'vtreeMigrationIoPriorityQuietPeriodInMsec': None, 'zeroPaddingEnabled': True}]) + Details of storage pools. + + + mediaType (, str, ) + Type of devices in the storage pool. + + + useRfcache (, bool, ) + Enable/Disable RFcache on a specific storage pool. + + + useRmcache (, bool, ) + Enable/Disable RMcache on a specific storage pool. + + + id (, str, ) + ID of the storage pool under protection domain. + + + name (, str, ) + Name of the storage pool under protection domain. + + + protectionDomainId (, str, ) + ID of the protection domain in which pool resides. + + + protectionDomainName (, str, ) + Name of the protection domain in which pool resides. + + + statistics (, dict, ) + Statistics details of the storage pool. + + + capacityInUseInKb (, str, ) + Total capacity of the storage pool. + + + unusedCapacityInKb (, str, ) + Unused capacity of the storage pool. + + + deviceIds (, list, ) + Device Ids of the storage pool. + + + + +Volumes (always, list, [{'accessModeLimit': 'ReadWrite', 'ancestorVolumeId': None, 'autoSnapshotGroupId': None, 'compressionMethod': 'Invalid', 'consistencyGroupId': None, 'creationTime': 1661234220, 'dataLayout': 'MediumGranularity', 'id': '456afd7XXXXXXX', 'lockedAutoSnapshot': False, 'lockedAutoSnapshotMarkedForRemoval': False, 'managedBy': 'ScaleIO', 'mappedSdcInfo': [{'accessMode': 'ReadWrite', 'isDirectBufferMapping': False, 'limitBwInMbps': 0, 'limitIops': 0, 'sdcId': 'c42425cbXXXXX', 'sdcIp': '10.XXX.XX.XX', 'sdcName': None}], 'name': 'vol-1', 'notGenuineSnapshot': False, 'originalExpiryTime': 0, 'pairIds': None, 'replicationJournalVolume': False, 'replicationTimeStamp': 0, 'retentionLevels': [], 'secureSnapshotExpTime': 0, 'sizeInKb': 8388608, 'snplIdOfAutoSnapshot': None, 'snplIdOfSourceVolume': None, 'statistics': {'childVolumeIds': [], 'descendantVolumeIds': [], 'initiatorSdcId': None, 'mappedSdcIds': ['c42425XXXXXX'], 'numOfChildVolumes': 0, 'numOfDescendantVolumes': 0, 'numOfMappedSdcs': 1, 'registrationKey': None, 'registrationKeys': [], 'replicationJournalVolume': False, 'replicationState': 'UnmarkedForReplication', 'reservationType': 'NotReserved', 'rplTotalJournalCap': 0, 'rplUsedJournalCap': 0, 'userDataReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcReadLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcTrimLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcWriteLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataTrimBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}}, 'storagePoolId': '7630a248XXXXXXX', 'timeStampIsAccurate': False, 'useRmcache': False, 'volumeReplicationState': 'UnmarkedForReplication', 'volumeType': 'ThinProvisioned', 'vtreeId': '32b168bXXXXXX'}]) + Details of volumes. + + + id (, str, ) + The ID of the volume. + + + mappedSdcInfo (, dict, ) + The details of the mapped SDC. + + + sdcId (, str, ) + ID of the SDC. + + + sdcName (, str, ) + Name of the SDC. + + + sdcIp (, str, ) + IP of the SDC. + + + accessMode (, str, ) + mapping access mode for the specified volume. + + + limitIops (, int, ) + IOPS limit for the SDC. + + + limitBwInMbps (, int, ) + Bandwidth limit for the SDC. + + + + name (, str, ) + Name of the volume. + + + sizeInKb (, int, ) + Size of the volume in Kb. + + + sizeInGb (, int, ) + Size of the volume in Gb. + + + storagePoolId (, str, ) + ID of the storage pool in which volume resides. + + + storagePoolName (, str, ) + Name of the storage pool in which volume resides. + + + protectionDomainId (, str, ) + ID of the protection domain in which volume resides. + + + protectionDomainName (, str, ) + Name of the protection domain in which volume resides. + + + snapshotPolicyId (, str, ) + ID of the snapshot policy associated with volume. + + + snapshotPolicyName (, str, ) + Name of the snapshot policy associated with volume. + + + snapshotsList (, str, ) + List of snapshots associated with the volume. + + + statistics (, dict, ) + Statistics details of the storage pool. + + + numOfChildVolumes (, int, ) + Number of child volumes. + + + numOfMappedSdcs (, int, ) + Number of mapped Sdcs of the volume. + + + + +Devices (always, list, [{'id': 'b6efa59900000000', 'name': 'device230'}, {'id': 'b6efa5fa00020000', 'name': 'device_node0'}, {'id': 'b7f3a60900010000', 'name': 'device22'}]) + Details of devices. + + + id (, str, ) + device id. + + + name (, str, ) + device name. + + + +Replication_Consistency_Groups (always, list, {'protectionDomainId': 'b969400500000000', 'peerMdmId': '6c3d94f600000000', 'remoteId': '2130961a00000000', 'remoteMdmId': '0e7a082862fedf0f', 'currConsistMode': 'Consistent', 'freezeState': 'Unfrozen', 'lifetimeState': 'Normal', 'pauseMode': 'None', 'snapCreationInProgress': False, 'lastSnapGroupId': 'e58280b300000001', 'lastSnapCreationRc': 'SUCCESS', 'targetVolumeAccessMode': 'NoAccess', 'remoteProtectionDomainId': '4eeb304600000000', 'remoteProtectionDomainName': 'domain1', 'failoverType': 'None', 'failoverState': 'None', 'activeLocal': True, 'activeRemote': True, 'abstractState': 'Ok', 'localActivityState': 'Active', 'remoteActivityState': 'Active', 'inactiveReason': 11, 'rpoInSeconds': 30, 'replicationDirection': 'LocalToRemote', 'disasterRecoveryState': 'None', 'remoteDisasterRecoveryState': 'None', 'error': 65, 'name': 'test_rcg', 'type': 'User', 'id': 'aadc17d500000000'}) + Details of rcgs. + + + id (, str, ) + The ID of the replication consistency group. + + + name (, str, ) + The name of the replication consistency group. + + + protectionDomainId (, str, ) + The Protection Domain ID of the replication consistency group. + + + peerMdmId (, str, ) + The ID of the peer MDM of the replication consistency group. + + + remoteId (, str, ) + The ID of the remote replication consistency group. + + + remoteMdmId (, str, ) + The ID of the remote MDM of the replication consistency group. + + + currConsistMode (, str, ) + The current consistency mode of the replication consistency group. + + + freezeState (, str, ) + The freeze state of the replication consistency group. + + + lifetimeState (, str, ) + The Lifetime state of the replication consistency group. + + + pauseMode (, str, ) + The Lifetime state of the replication consistency group. + + + snapCreationInProgress (, bool, ) + Whether the process of snapshot creation of the replication consistency group is in progress or not. + + + lastSnapGroupId (, str, ) + ID of the last snapshot of the replication consistency group. + + + lastSnapCreationRc (, int, ) + The return code of the last snapshot of the replication consistency group. + + + targetVolumeAccessMode (, str, ) + The access mode of the target volume of the replication consistency group. + + + remoteProtectionDomainId (, str, ) + The ID of the remote Protection Domain. + + + remoteProtectionDomainName (, str, ) + The Name of the remote Protection Domain. + + + failoverType (, str, ) + The type of failover of the replication consistency group. + + + failoverState (, str, ) + The state of failover of the replication consistency group. + + + activeLocal (, bool, ) + Whether the local replication consistency group is active. + + + activeRemote (, bool, ) + Whether the remote replication consistency group is active + + + abstractState (, str, ) + The abstract state of the replication consistency group. + + + localActivityState (, str, ) + The state of activity of the local replication consistency group. + + + remoteActivityState (, str, ) + The state of activity of the remote replication consistency group.. + + + inactiveReason (, int, ) + The reason for the inactivity of the replication consistency group. + + + rpoInSeconds (, int, ) + The RPO value of the replication consistency group in seconds. + + + replicationDirection (, str, ) + The direction of the replication of the replication consistency group. + + + disasterRecoveryState (, str, ) + The state of disaster recovery of the local replication consistency group. + + + remoteDisasterRecoveryState (, str, ) + The state of disaster recovery of the remote replication consistency group. + + + error (, int, ) + The error code of the replication consistency group. + + + type (, str, ) + The type of the replication consistency group. + + + +Replication_pairs (Always, list, {'copyType': 'OnlineCopy', 'id': '23aa0bc900000001', 'initialCopyPriority': -1, 'initialCopyState': 'Done', 'lifetimeState': 'Normal', 'localActivityState': 'RplEnabled', 'localVolumeId': 'e2bc1fab00000008', 'name': None, 'peerSystemName': None, 'remoteActivityState': 'RplEnabled', 'remoteCapacityInMB': 8192, 'remoteId': 'a058446700000001', 'remoteVolumeId': '1cda7af20000000d', 'remoteVolumeName': 'vol', 'replicationConsistencyGroupId': 'e2ce036b00000002', 'userRequestedPauseTransmitInitCopy': False}) + Details of the replication pairs. + + + id (, str, ) + The ID of the replication pair. + + + name (, str, ) + The name of the replication pair. + + + remoteId (, str, ) + The ID of the remote replication pair. + + + localVolumeId (, str, ) + The ID of the local volume. + + + replicationConsistencyGroupId (, str, ) + The ID of the replication consistency group. + + + copyType (, str, ) + The copy type of the replication pair. + + + initialCopyState (, str, ) + The inital copy state of the replication pair. + + + localActivityState (, str, ) + The state of activity of the local replication pair. + + + remoteActivityState (, str, ) + The state of activity of the remote replication pair. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Arindam Datta (@dattaarindam) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/mdm_cluster.rst b/ansible_collections/dellemc/powerflex/docs/modules/mdm_cluster.rst new file mode 100644 index 000000000..5131860e1 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/mdm_cluster.rst @@ -0,0 +1,549 @@ +.. _mdm_cluster_module: + + +mdm_cluster -- Manage MDM cluster on Dell PowerFlex +=================================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing MDM cluster and MDMs on PowerFlex storage system includes adding/removing standby MDM, modify MDM name and virtual interface. + +It also includes getting details of MDM cluster, modify MDM cluster ownership, cluster mode, and performance profile. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + mdm_name (optional, str, None) + The name of the MDM. It is unique across the PowerFlex array. + + Mutually exclusive with *mdm_id*. + + If mdm_name passed in add standby operation, then same name will be assigned to the new standby mdm. + + + mdm_id (optional, str, None) + The ID of the MDM. + + Mutually exclusive with *mdm_name*. + + + mdm_new_name (optional, str, None) + To rename the MDM. + + + standby_mdm (optional, dict, None) + Specifies add standby MDM parameters. + + + mdm_ips (True, list, None) + List of MDM IPs that will be assigned to new MDM. It can contain IPv4 addresses. + + + role (True, str, None) + Role of new MDM. + + + management_ips (optional, list, None) + List of management IPs to manage MDM. It can contain IPv4 addresses. + + + port (optional, int, None) + Specifies the port of new MDM. + + + allow_multiple_ips (optional, bool, None) + Allow the added node to have different number of IPs from the primary node. + + + virtual_interfaces (optional, list, None) + List of NIC interfaces that will be used for virtual IP addresses. + + + + is_primary (optional, bool, None) + Set *is_primary* as ``true`` to change MDM cluster ownership from the current master MDM to different MDM. + + Set *is_primary* as ``false``, will return MDM cluster details. + + New owner MDM must be an MDM with a manager role. + + + cluster_mode (optional, str, None) + Mode of the cluster. + + + mdm (optional, list, None) + Specifies parameters to add/remove MDMs to/from the MDM cluster. + + + mdm_id (optional, str, None) + ID of MDM that will be added/removed to/from the cluster. + + + mdm_name (optional, str, None) + Name of MDM that will be added/removed to/from the cluster. + + + mdm_type (True, str, None) + Type of the MDM. + + Either *mdm_id* or *mdm_name* must be passed with mdm_type. + + + + mdm_state (optional, str, None) + Mapping state of MDM. + + + virtual_ip_interfaces (optional, list, None) + List of interfaces to be used for virtual IPs. + + The order of interfaces must be matched with virtual IPs assigned to the cluster. + + Interfaces of the primary and secondary type MDMs are allowed to modify. + + The *virtual_ip_interfaces* is mutually exclusive with *clear_interfaces*. + + + clear_interfaces (optional, bool, None) + Clear all virtual IP interfaces. + + The *clear_interfaces* is mutually exclusive with *virtual_ip_interfaces*. + + + performance_profile (optional, str, None) + Apply performance profile to cluster MDMs. + + + state (True, str, None) + State of the MDM cluster. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - Parameters *mdm_name* or *mdm_id* are mandatory for rename and modify virtual IP interfaces. + - Parameters *mdm_name* or *mdm_id* are not required while modifying performance profile. + - For change MDM cluster ownership operation, only changed as True will be returned and for idempotency case MDM cluster details will be returned. + - Reinstall all SDC after changing ownership to some newly added MDM. + - To add manager standby MDM, MDM package must be installed with manager role. + - The *check_mode* is supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Add a standby MDM + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + mdm_name: "mdm_1" + standby_mdm: + mdm_ips: + - "10.x.x.x" + role: "TieBreaker" + management_ips: + - "10.x.y.z" + state: "present" + + - name: Remove a standby MDM + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + mdm_name: "mdm_1" + state: "absent" + + - name: Switch cluster mode from 3 node to 5 node MDM cluster + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + cluster_mode: "FiveNodes" + mdm: + - mdm_id: "5f091a8a013f1100" + mdm_type: "Secondary" + - mdm_name: "mdm_1" + mdm_type: "TieBreaker" + sdc_state: "present-in-cluster" + state: "present" + + - name: Switch cluster mode from 5 node to 3 node MDM cluster + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + cluster_mode: "ThreeNodes" + mdm: + - mdm_id: "5f091a8a013f1100" + mdm_type: "Secondary" + - mdm_name: "mdm_1" + mdm_type: "TieBreaker" + sdc_state: "absent-in-cluster" + state: "present" + + - name: Get the details of the MDM cluster + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + state: "present" + + - name: Change ownership of MDM cluster + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + mdm_name: "mdm_2" + is_primary: True + state: "present" + + - name: Modify performance profile + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + performance_profile: "HighPerformance" + state: "present" + + - name: Rename the MDM + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + mdm_name: "mdm_1" + mdm_new_name: "new_mdm_1" + state: "present" + + - name: Modify virtual IP interface of the MDM + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + mdm_name: "mdm_1" + virtual_ip_interface: + - "ens224" + state: "present" + + - name: Clear virtual IP interface of the MDM + dellemc.powerflex.mdm_cluster: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + mdm_name: "mdm_1" + clear_interfaces: True + state: "present" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +mdm_cluster_details (When MDM cluster exists, dict, {'clusterState': 'ClusteredNormal', 'clusterMode': 'ThreeNodes', 'goodNodesNum': 3, 'master': {'virtualInterfaces': ['ens1'], 'managementIPs': ['10.x.y.z'], 'ips': ['10.x.y.z'], 'versionInfo': 'R3_6.0.0', 'opensslVersion': 'OpenSSL 1.0.2k-fips 26 Jan 2017', 'role': 'Manager', 'status': 'Normal', 'name': 'sample_mdm', 'id': '5908d328581d1400', 'port': 9011}, 'perfProfile': 'HighPerformance', 'slaves': [{'virtualInterfaces': ['ens1'], 'managementIPs': ['10.x.x.z'], 'ips': ['10.x.x.z'], 'versionInfo': 'R3_6.0.0', 'opensslVersion': 'OpenSSL 1.0.2k-fips 26 Jan 2017', 'role': 'Manager', 'status': 'Normal', 'name': 'sample_mdm1', 'id': '5908d328581d1401', 'port': 9011}], 'tieBreakers': [{'virtualInterfaces': [], 'managementIPs': [], 'ips': ['10.x.y.y'], 'versionInfo': 'R3_6.0.0', 'opensslVersion': 'N/A', 'role': 'TieBreaker', 'status': 'Normal', 'id': '5908d328581d1402', 'port': 9011}], 'standbyMDMs': [{'virtualInterfaces': [], 'managementIPs': ['10.x.z.z'], 'ips': ['10.x.z.z'], 'versionInfo': 'R3_6.0.0', 'opensslVersion': 'N/A', 'role': 'TieBreaker', 'status': 'Normal', 'id': '5908d328581d1403', 'port': 9011}], 'goodReplicasNum': 2, 'id': 'cdd883cf00000002'}) + Details of the MDM cluster. + + + id (, str, ) + The ID of the MDM cluster. + + + name (, str, ) + Name of MDM cluster. + + + clusterMode (, str, ) + Mode of the MDM cluster. + + + master (, dict, ) + The details of the master MDM. + + + id (, str, ) + ID of the MDM. + + + name (, str, ) + Name of the MDM. + + + port (, str, ) + Port of the MDM. + + + ips (, list, ) + List of IPs for master MDM. + + + managementIPs (, list, ) + List of management IPs for master MDM. + + + role (, str, ) + Role of MDM. + + + status (, str, ) + Status of MDM. + + + versionInfo (, str, ) + Version of MDM. + + + virtualInterfaces (, list, ) + List of virtual interfaces + + + opensslVersion (, str, ) + OpenSSL version. + + + + slaves (, list, ) + The list of the secondary MDMs. + + + id (, str, ) + ID of the MDM. + + + name (, str, ) + Name of the MDM. + + + port (, str, ) + Port of the MDM. + + + ips (, list, ) + List of IPs for secondary MDM. + + + managementIPs (, list, ) + List of management IPs for secondary MDM. + + + role (, str, ) + Role of MDM. + + + status (, str, ) + Status of MDM. + + + versionInfo (, str, ) + Version of MDM. + + + virtualInterfaces (, list, ) + List of virtual interfaces + + + opensslVersion (, str, ) + OpenSSL version. + + + + tieBreakers (, list, ) + The list of the TieBreaker MDMs. + + + id (, str, ) + ID of the MDM. + + + name (, str, ) + Name of the MDM. + + + port (, str, ) + Port of the MDM. + + + ips (, list, ) + List of IPs for tie-breaker MDM. + + + managementIPs (, list, ) + List of management IPs for tie-breaker MDM. + + + role (, str, ) + Role of MDM. + + + status (, str, ) + Status of MDM. + + + versionInfo (, str, ) + Version of MDM. + + + opensslVersion (, str, ) + OpenSSL version. + + + + standbyMDMs (, list, ) + The list of the standby MDMs. + + + id (, str, ) + ID of the MDM. + + + name (, str, ) + Name of the MDM. + + + port (, str, ) + Port of the MDM. + + + ips (, list, ) + List of IPs for MDM. + + + managementIPs (, list, ) + List of management IPs for MDM. + + + role (, str, ) + Role of MDM. + + + status (, str, ) + Status of MDM. + + + versionInfo (, str, ) + Version of MDM. + + + virtualInterfaces (, list, ) + List of virtual interfaces. + + + opensslVersion (, str, ) + OpenSSL version. + + + + clusterState (, str, ) + State of the MDM cluster. + + + goodNodesNum (, int, ) + Number of Nodes in MDM cluster. + + + goodReplicasNum (, int, ) + Number of nodes for Replication. + + + virtualIps (, list, ) + List of virtual IPs. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Bhavneet Sharma (@sharmb5) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/protection_domain.rst b/ansible_collections/dellemc/powerflex/docs/modules/protection_domain.rst new file mode 100644 index 000000000..ca47cb518 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/protection_domain.rst @@ -0,0 +1,437 @@ +.. _protection_domain_module: + + +protection_domain -- Manage Protection Domain on Dell PowerFlex +=============================================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing Protection Domain on PowerFlex storage system includes creating, modifying attributes, deleting and getting details of Protection Domain. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + protection_domain_name (optional, str, None) + The name of the protection domain. + + Mandatory for create operation. + + It is unique across the PowerFlex array. + + Mutually exclusive with *protection_domain_id*. + + + protection_domain_id (optional, str, None) + The ID of the protection domain. + + Except for create operation, all other operations can be performed using protection_domain_id. + + Mutually exclusive with *protection_domain_name*. + + + protection_domain_new_name (optional, str, None) + Used to rename the protection domain. + + + is_active (optional, bool, None) + Used to activate or deactivate the protection domain. + + + network_limits (optional, dict, None) + Network bandwidth limit used by all SDS in protection domain. + + + rebuild_limit (optional, int, None) + Limit the network bandwidth for rebuild. + + + rebalance_limit (optional, int, None) + Limit the network bandwidth for rebalance. + + + vtree_migration_limit (optional, int, None) + Limit the network bandwidth for vtree migration. + + + overall_limit (optional, int, None) + Limit the overall network bandwidth. + + + bandwidth_unit (optional, str, KBps) + Unit for network bandwidth limits. + + + + rf_cache_limits (optional, dict, None) + Used to set the RFcache parameters of the protection domain. + + + is_enabled (optional, bool, None) + Used to enable or disable RFcache in the protection domain. + + + page_size (optional, int, None) + Used to set the cache page size in KB. + + + max_io_limit (optional, int, None) + Used to set cache maximum I/O limit in KB. + + + pass_through_mode (optional, str, None) + Used to set the cache mode. + + + + state (True, str, None) + State of the protection domain. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The protection domain can only be deleted if all its related objects have been dissociated from the protection domain. + - If the protection domain set to inactive, then no operation can be performed on protection domain. + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Create protection domain + dellemc.powerflex.protection_domain: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_name: "domain1" + state: "present" + + - name: Create protection domain with all parameters + dellemc.powerflex.protection_domain: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_name: "domain1" + is_active: true + network_limits: + rebuild_limit: 10 + rebalance_limit: 17 + vtree_migration_limit: 14 + overall_limit: 20 + bandwidth_unit: "MBps" + rf_cache_limits: + is_enabled: true + page_size: 16 + max_io_limit: 128 + pass_through_mode: "Read" + state: "present" + + - name: Get protection domain details using name + dellemc.powerflex.protection_domain: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_name: "domain1" + state: "present" + + - name: Get protection domain details using ID + dellemc.powerflex.protection_domain: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_id: "5718253c00000004" + state: "present" + + - name: Modify protection domain attributes + dellemc.powerflex.protection_domain: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_name: "domain1" + protection_domain_new_name: "domain1_new" + network_limits: + rebuild_limit: 14 + rebalance_limit: 20 + overall_limit: 25 + bandwidth_unit: "MBps" + rf_cache_limits: + page_size: 64 + pass_through_mode: "WriteMiss" + state: "present" + + - name: Delete protection domain using name + dellemc.powerflex.protection_domain: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_name: "domain1_new" + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +protection_domain_details (When protection domain exists, dict, {'fglDefaultMetadataCacheSize': 0, 'fglDefaultNumConcurrentWrites': 1000, 'fglMetadataCacheEnabled': False, 'id': '7bd6457000000000', 'links': [{'href': '/api/instances/ProtectionDomain::7bd6457000000000', 'rel': 'self'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/Statistics', 'rel': '/api/ProtectionDomain/relationship/Statistics'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/Sdr', 'rel': '/api/ProtectionDomain/relationship/Sdr'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/AccelerationPool', 'rel': '/api/ProtectionDomain/relationship/AccelerationPool'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/StoragePool', 'rel': '/api/ProtectionDomain/relationship/StoragePool'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/Sds', 'rel': '/api/ProtectionDomain/relationship/Sds'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/ReplicationConsistencyGroup', 'rel': '/api/ProtectionDomain/relationship/ ReplicationConsistencyGroup'}, {'href': '/api/instances/ProtectionDomain::7bd6457000000000/ relationships/FaultSet', 'rel': '/api/ProtectionDomain/relationship/FaultSet'}, {'href': '/api/instances/System::0989ce79058f150f', 'rel': '/api/parent/relationship/systemId'}], 'mdmSdsNetworkDisconnectionsCounterParameters': {'longWindow': {'threshold': 700, 'windowSizeInSec': 86400}, 'mediumWindow': {'threshold': 500, 'windowSizeInSec': 3600}, 'shortWindow': {'threshold': 300, 'windowSizeInSec': 60}}, 'name': 'domain1', 'overallIoNetworkThrottlingEnabled': False, 'overallIoNetworkThrottlingInKbps': None, 'protectedMaintenanceModeNetworkThrottlingEnabled': False, 'protectedMaintenanceModeNetworkThrottlingInKbps': None, 'protectionDomainState': 'Active', 'rebalanceNetworkThrottlingEnabled': False, 'rebalanceNetworkThrottlingInKbps': None, 'rebuildNetworkThrottlingEnabled': False, 'rebuildNetworkThrottlingInKbps': None, 'rfcacheAccpId': None, 'rfcacheEnabled': True, 'rfcacheMaxIoSizeKb': 128, 'rfcacheOpertionalMode': 'WriteMiss', 'rfcachePageSizeKb': 64, 'sdrSdsConnectivityInfo': {'clientServerConnStatus': 'CLIENT_SERVER_CONN_STATUS_ALL _CONNECTED', 'disconnectedClientId': None, 'disconnectedClientName': None, 'disconnectedServerId': None, 'disconnectedServerIp': None, 'disconnectedServerName': None}, 'sdsConfigurationFailureCounterParameters': {'longWindow': {'threshold': 700, 'windowSizeInSec': 86400}, 'mediumWindow': {'threshold': 500, 'windowSizeInSec': 3600}, 'shortWindow': {'threshold': 300, 'windowSizeInSec': 60}}, 'sdsDecoupledCounterParameters': {'longWindow': {'threshold': 700, 'windowSizeInSec': 86400}, 'mediumWindow': {'threshold': 500, 'windowSizeInSec': 3600}, 'shortWindow': {'threshold': 300, 'windowSizeInSec': 60}}, 'sdsReceiveBufferAllocationFailuresCounterParameters': {'longWindow': {'threshold': 2000000, 'windowSizeInSec': 86400}, 'mediumWindow': {'threshold': 200000, 'windowSizeInSec': 3600}, 'shortWindow': {'threshold': 20000, 'windowSizeInSec': 60}}, 'sdsSdsNetworkDisconnectionsCounterParameters': {'longWindow': {'threshold': 700, 'windowSizeInSec': 86400}, 'mediumWindow': {'threshold': 500, 'windowSizeInSec': 3600}, 'shortWindow': {'threshold': 300, 'windowSizeInSec': 60}}, 'storagePool': [{'id': '8d1cba1700000000', 'name': 'pool1'}], 'systemId': '0989ce79058f150f', 'vtreeMigrationNetworkThrottlingEnabled': False, 'vtreeMigrationNetworkThrottlingInKbps': None}) + Details of the protection domain. + + + fglDefaultMetadataCacheSize (, int, ) + FGL metadata cache size. + + + fglDefaultNumConcurrentWrites (, str, ) + FGL concurrent writes. + + + fglMetadataCacheEnabled (, bool, ) + Whether FGL cache enabled. + + + id (, str, ) + Protection domain ID. + + + links (, list, ) + Protection domain links. + + + href (, str, ) + Protection domain instance URL. + + + rel (, str, ) + Protection domain's relationship with different entities. + + + + mdmSdsNetworkDisconnectionsCounterParameters (, dict, ) + MDM's SDS counter parameter. + + + longWindow (, int, ) + Long window for Counter Parameters. + + + mediumWindow (, int, ) + Medium window for Counter Parameters. + + + shortWindow (, int, ) + Short window for Counter Parameters. + + + + name (, str, ) + Name of the protection domain. + + + overallIoNetworkThrottlingEnabled (, bool, ) + Whether overall network throttling enabled. + + + overallIoNetworkThrottlingInKbps (, int, ) + Overall network throttling in KBps. + + + protectedMaintenanceModeNetworkThrottlingEnabled (, bool, ) + Whether protected maintenance mode network throttling enabled. + + + protectedMaintenanceModeNetworkThrottlingInKbps (, int, ) + Protected maintenance mode network throttling in KBps. + + + protectionDomainState (, int, ) + State of protection domain. + + + rebalanceNetworkThrottlingEnabled (, int, ) + Whether rebalance network throttling enabled. + + + rebalanceNetworkThrottlingInKbps (, int, ) + Rebalance network throttling in KBps. + + + rebuildNetworkThrottlingEnabled (, int, ) + Whether rebuild network throttling enabled. + + + rebuildNetworkThrottlingInKbps (, int, ) + Rebuild network throttling in KBps. + + + rfcacheAccpId (, str, ) + Id of RF cache acceleration pool. + + + rfcacheEnabled (, bool, ) + Whether RF cache is enabled or not. + + + rfcacheMaxIoSizeKb (, int, ) + RF cache maximum I/O size in KB. + + + rfcacheOpertionalMode (, str, ) + RF cache operational mode. + + + rfcachePageSizeKb (, bool, ) + RF cache page size in KB. + + + sdrSdsConnectivityInfo (, dict, ) + Connectivity info of SDR and SDS. + + + clientServerConnStatus (, str, ) + Connectivity status of client and server. + + + disconnectedClientId (, str, ) + Disconnected client ID. + + + disconnectedClientName (, str, ) + Disconnected client name. + + + disconnectedServerId (, str, ) + Disconnected server ID. + + + disconnectedServerIp (, str, ) + Disconnected server IP. + + + disconnectedServerName (, str, ) + Disconnected server name. + + + + sdsSdsNetworkDisconnectionsCounterParameters (, dict, ) + Counter parameter for SDS-SDS network. + + + longWindow (, int, ) + Long window for Counter Parameters. + + + mediumWindow (, int, ) + Medium window for Counter Parameters. + + + shortWindow (, int, ) + Short window for Counter Parameters. + + + + storagePool (, list, ) + List of storage pools. + + + systemId (, str, ) + ID of system. + + + vtreeMigrationNetworkThrottlingEnabled (, bool, ) + Whether V-Tree migration network throttling enabled. + + + vtreeMigrationNetworkThrottlingInKbps (, int, ) + V-Tree migration network throttling in KBps. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Bhavneet Sharma (@sharmb5) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/replication_consistency_group.rst b/ansible_collections/dellemc/powerflex/docs/modules/replication_consistency_group.rst new file mode 100644 index 000000000..ceaca0d39 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/replication_consistency_group.rst @@ -0,0 +1,465 @@ +.. _replication_consistency_group_module: + + +replication_consistency_group -- Manage replication consistency groups on Dell PowerFlex +======================================================================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing replication consistency groups on PowerFlex storage system includes getting details, creating, modifying, creating snapshots, pause, resume, freeze, unfreeze, activate, inactivate and deleting a replication consistency group. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + rcg_name (optional, str, None) + The name of the replication consistency group. + + It is unique across the PowerFlex array. + + Mutually exclusive with *rcg_id*. + + + rcg_id (optional, str, None) + The ID of the replication consistency group. + + Mutually exclusive with *rcg_name*. + + + create_snapshot (optional, bool, None) + Whether to create the snapshot of the replication consistency group. + + + rpo (optional, int, None) + Desired RPO in seconds. + + + protection_domain_id (optional, str, None) + Protection domain id. + + Mutually exclusive with *protection_domain_name*. + + + protection_domain_name (optional, str, None) + Protection domain name. + + Mutually exclusive with *protection_domain_id*. + + + activity_mode (optional, str, None) + Activity mode of RCG. + + This parameter is supported for version 3.6 and above. + + + pause (optional, bool, None) + Pause or resume the RCG. + + + freeze (optional, bool, None) + Freeze or unfreeze the RCG. + + + pause_mode (optional, str, None) + Pause mode. + + It is required if pause is set as True. + + + target_volume_access_mode (optional, str, None) + Target volume access mode. + + + is_consistent (optional, bool, None) + Consistency of RCG. + + + new_rcg_name (optional, str, None) + Name of RCG to rename to. + + + remote_peer (optional, dict, None) + Remote peer system. + + + hostname (True, str, None) + IP or FQDN of the remote peer gateway host. + + + username (True, str, None) + The username of the remote peer gateway host. + + + password (True, str, None) + The password of the remote peer gateway host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with remote peer gateway host. + + + timeout (optional, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + protection_domain_id (optional, str, None) + Remote protection domain id. + + Mutually exclusive with *protection_domain_name*. + + + protection_domain_name (optional, str, None) + Remote protection domain name. + + Mutually exclusive with *protection_domain_id*. + + + + state (optional, str, present) + State of the replication consistency group. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The *check_mode* is supported. + - Idempotency is not supported for create snapshot operation. + - There is a delay in reflection of final state of RCG after few update operations on RCG. + - In 3.6 and above, the replication consistency group will return back to consistent mode on changing to inconsistent mode if consistence barrier arrives. Hence idempotency on setting to inconsistent mode will return changed as True. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + + - name: Get RCG details + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "{{rcg_name}}" + + - name: Create a snapshot of the RCG + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_id: "{{rcg_id}}" + create_snapshot: True + state: "present" + + - name: Create a replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + rpo: 60 + protection_domain_name: "domain1" + activity_mode: "active" + remote_peer: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + protection_domain_name: "domain1" + + - name: Modify replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + rpo: 60 + target_volume_access_mode: "ReadOnly" + activity_mode: "Inactive" + is_consistent: True + + - name: Rename replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + new_rcg_name: "rcg_test_rename" + + - name: Pause replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + pause: True + pause_mode: "StopDataTransfer" + + - name: Resume replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + pause: False + + - name: Freeze replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + freeze: True + + - name: UnFreeze replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + freeze: False + + - name: Delete replication consistency group + dellemc.powerflex.replication_consistency_group: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "rcg_test" + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +replication_consistency_group_details (When replication consistency group exists, dict, {'protectionDomainId': 'b969400500000000', 'peerMdmId': '6c3d94f600000000', 'remoteId': '2130961a00000000', 'remoteMdmId': '0e7a082862fedf0f', 'currConsistMode': 'Consistent', 'freezeState': 'Unfrozen', 'lifetimeState': 'Normal', 'pauseMode': 'None', 'snapCreationInProgress': False, 'lastSnapGroupId': 'e58280b300000001', 'lastSnapCreationRc': 'SUCCESS', 'targetVolumeAccessMode': 'NoAccess', 'remoteProtectionDomainId': '4eeb304600000000', 'remoteProtectionDomainName': 'domain1', 'failoverType': 'None', 'failoverState': 'None', 'activeLocal': True, 'activeRemote': True, 'abstractState': 'Ok', 'localActivityState': 'Active', 'remoteActivityState': 'Active', 'inactiveReason': 11, 'rpoInSeconds': 30, 'replicationDirection': 'LocalToRemote', 'disasterRecoveryState': 'None', 'remoteDisasterRecoveryState': 'None', 'error': 65, 'name': 'test_rcg', 'type': 'User', 'id': 'aadc17d500000000'}) + Details of the replication consistency group. + + + id (, str, ) + The ID of the replication consistency group. + + + name (, str, ) + The name of the replication consistency group. + + + protectionDomainId (, str, ) + The Protection Domain ID of the replication consistency group. + + + peerMdmId (, str, ) + The ID of the peer MDM of the replication consistency group. + + + remoteId (, str, ) + The ID of the remote replication consistency group. + + + remoteMdmId (, str, ) + The ID of the remote MDM of the replication consistency group. + + + currConsistMode (, str, ) + The current consistency mode of the replication consistency group. + + + freezeState (, str, ) + The freeze state of the replication consistency group. + + + lifetimeState (, str, ) + The Lifetime state of the replication consistency group. + + + pauseMode (, str, ) + The Lifetime state of the replication consistency group. + + + snapCreationInProgress (, bool, ) + Whether the process of snapshot creation of the replication consistency group is in progress or not. + + + lastSnapGroupId (, str, ) + ID of the last snapshot of the replication consistency group. + + + lastSnapCreationRc (, int, ) + The return code of the last snapshot of the replication consistency group. + + + targetVolumeAccessMode (, str, ) + The access mode of the target volume of the replication consistency group. + + + remoteProtectionDomainId (, str, ) + The ID of the remote Protection Domain. + + + remoteProtectionDomainName (, str, ) + The Name of the remote Protection Domain. + + + failoverType (, str, ) + The type of failover of the replication consistency group. + + + failoverState (, str, ) + The state of failover of the replication consistency group. + + + activeLocal (, bool, ) + Whether the local replication consistency group is active. + + + activeRemote (, bool, ) + Whether the remote replication consistency group is active + + + abstractState (, str, ) + The abstract state of the replication consistency group. + + + localActivityState (, str, ) + The state of activity of the local replication consistency group. + + + remoteActivityState (, str, ) + The state of activity of the remote replication consistency group.. + + + inactiveReason (, int, ) + The reason for the inactivity of the replication consistency group. + + + rpoInSeconds (, int, ) + The RPO value of the replication consistency group in seconds. + + + replicationDirection (, str, ) + The direction of the replication of the replication consistency group. + + + disasterRecoveryState (, str, ) + The state of disaster recovery of the local replication consistency group. + + + remoteDisasterRecoveryState (, str, ) + The state of disaster recovery of the remote replication consistency group. + + + error (, int, ) + The error code of the replication consistency group. + + + type (, str, ) + The type of the replication consistency group. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Trisha Datta (@Trisha-Datta) <ansible.team@dell.com> +- Jennifer John (@Jennifer-John) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/replication_pair.rst b/ansible_collections/dellemc/powerflex/docs/modules/replication_pair.rst new file mode 100644 index 000000000..c83241cd3 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/replication_pair.rst @@ -0,0 +1,432 @@ +.. _replication_pair_module: + + +replication_pair -- Manage replication pairs on Dell PowerFlex +============================================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing replication pairs on PowerFlex storage system includes getting details, creating, pause, resume initial copy and deleting a replication pair. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + pair_id (optional, str, None) + The ID of the replication pair. + + Mutually exclusive with *pair_name*. + + + pair_name (optional, str, None) + The name of the replication pair. + + Mutually exclusive with *pair_id*. + + + rcg_name (optional, str, None) + The name of the replication consistency group. + + Mutually exclusive with *rcg_id*. + + + rcg_id (optional, str, None) + The ID of the replication consistency group. + + Mutually exclusive with *rcg_name*. + + + pause (optional, bool, None) + Pause or resume the initial copy of replication pair. + + + pairs (optional, list, None) + List of replication pairs to add to rcg. + + + source_volume_id (optional, str, None) + Source volume ID. + + Mutually exclusive with *source_volume_name*. + + + source_volume_name (optional, str, None) + Source volume name. + + Mutually exclusive with *source_volume_id*. + + + target_volume_id (optional, str, None) + Target volume ID. + + Mutually exclusive with *target_volume_name*. + + + target_volume_name (optional, str, None) + Target volume name. + + If specified, *remote_peer* details should also be specified. + + Mutually exclusive with *target_volume_id*. + + + copy_type (True, str, None) + Copy type. + + + name (optional, str, None) + Name of replication pair. + + + + remote_peer (optional, dict, None) + Remote peer system. + + + hostname (True, str, None) + IP or FQDN of the remote peer gateway host. + + + username (True, str, None) + The username of the remote peer gateway host. + + + password (True, str, None) + The password of the remote peer gateway host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with remote peer gateway host. + + + timeout (optional, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + state (optional, str, present) + State of the replication pair. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The *check_mode* is supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + - In 4.0 the creation of replication pair fails when I(copy_type) is specified as C(OfflineCopy). + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + + - name: Get replication pair details + dellemc.powerflex.replication_pair: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + pair_id: "123" + + - name: Create a replication pair + dellemc.powerflex.replication_pair: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "test_rcg" + pairs: + - source_volume_id: "002" + target_volume_id: "001" + copy_type: "OnlineCopy" + name: "pair1" + + - name: Create a replication pair with target volume name + dellemc.powerflex.replication_pair: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + rcg_name: "test_rcg" + pairs: + - source_volume_name: "src_vol" + target_volume_name: "dest_vol" + copy_type: "OnlineCopy" + name: "pair1" + remote_peer: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + + - name: Pause replication pair + dellemc.powerflex.replication_pair: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + pair_name: "pair1" + pause: True + + - name: Resume replication pair + dellemc.powerflex.replication_pair: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + pair_name: "pair1" + pause: False + + - name: Delete replication pair + dellemc.powerflex.replication_pair: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + pair_name: "pair1" + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +replication_pair_details (When replication pair exists, dict, {'copyType': 'OnlineCopy', 'id': '23aa0bc900000001', 'initialCopyPriority': -1, 'initialCopyState': 'Done', 'lifetimeState': 'Normal', 'localActivityState': 'RplEnabled', 'localVolumeId': 'e2bc1fab00000008', 'localVolumeName': 'vol1', 'name': None, 'peerSystemName': None, 'remoteActivityState': 'RplEnabled', 'remoteCapacityInMB': 8192, 'remoteId': 'a058446700000001', 'remoteVolumeId': '1cda7af20000000d', 'remoteVolumeName': 'vol', 'replicationConsistencyGroupId': 'e2ce036b00000002', 'userRequestedPauseTransmitInitCopy': False}) + Details of the replication pair. + + + id (, str, ) + The ID of the replication pair. + + + name (, str, ) + The name of the replication pair. + + + remoteId (, str, ) + The ID of the remote replication pair. + + + localVolumeId (, str, ) + The ID of the local volume. + + + localVolumeName (, str, ) + The name of the local volume. + + + replicationConsistencyGroupId (, str, ) + The ID of the replication consistency group. + + + copyType (, str, ) + The copy type of the replication pair. + + + initialCopyState (, str, ) + The inital copy state of the replication pair. + + + localActivityState (, str, ) + The state of activity of the local replication pair. + + + remoteActivityState (, str, ) + The state of activity of the remote replication pair. + + + initialCopyPriority (, int, ) + Initial copy priority. + + + lifetimeState (, int, ) + Lifetime state of replication pair. + + + peerSystemName (, int, ) + Peer system name. + + + remoteCapacityInMB (, int, ) + Remote Capacity in MB. + + + userRequestedPauseTransmitInitCopy (, int, ) + Value of user requested pause transmit initial copy. + + + remoteVolumeId (, int, ) + Remote Volume ID. + + + remoteVolumeName (, int, ) + Remote Volume Name. + + + +rcg_replication_pairs (When rcg exists, list, [{'copyType': 'OnlineCopy', 'id': '23aa0bc900000001', 'initialCopyPriority': -1, 'initialCopyState': 'Done', 'lifetimeState': 'Normal', 'localActivityState': 'RplEnabled', 'localVolumeId': 'e2bc1fab00000008', 'localVolumeName': 'vol1', 'name': None, 'peerSystemName': None, 'remoteActivityState': 'RplEnabled', 'remoteCapacityInMB': 8192, 'remoteId': 'a058446700000001', 'remoteVolumeId': '1cda7af20000000d', 'remoteVolumeName': 'vol', 'replicationConsistencyGroupId': 'e2ce036b00000002', 'userRequestedPauseTransmitInitCopy': False}]) + Details of the replication pairs of rcg. + + + id (, str, ) + The ID of the replication pair. + + + name (, str, ) + The name of the replication pair. + + + remoteId (, str, ) + The ID of the remote replication pair. + + + localVolumeId (, str, ) + The ID of the local volume. + + + localVolumeName (, str, ) + The name of the local volume. + + + replicationConsistencyGroupId (, str, ) + The ID of the replication consistency group. + + + copyType (, str, ) + The copy type of the replication pair. + + + initialCopyState (, str, ) + The inital copy state of the replication pair. + + + localActivityState (, str, ) + The state of activity of the local replication pair. + + + remoteActivityState (, str, ) + The state of activity of the remote replication pair. + + + initialCopyPriority (, int, ) + Initial copy priority. + + + lifetimeState (, int, ) + Lifetime state of replication pair. + + + peerSystemName (, int, ) + Peer system name. + + + remoteCapacityInMB (, int, ) + Remote Capacity in MB. + + + userRequestedPauseTransmitInitCopy (, int, ) + Value of user requested pause transmit initial copy. + + + remoteVolumeId (, int, ) + Remote Volume ID. + + + remoteVolumeName (, int, ) + Remote Volume Name. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Jennifer John (@Jennifer-John) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/sdc.rst b/ansible_collections/dellemc/powerflex/docs/modules/sdc.rst new file mode 100644 index 000000000..585267891 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/sdc.rst @@ -0,0 +1,198 @@ +.. _sdc_module: + + +sdc -- Manage SDCs on Dell PowerFlex +==================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing SDCs on PowerFlex storage system includes getting details of SDC and renaming SDC. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + sdc_name (optional, str, None) + Name of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip* for get/rename operation. + + Mutually exclusive with *sdc_id* and *sdc_ip*. + + + sdc_id (optional, str, None) + ID of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip* for get/rename operation. + + Mutually exclusive with *sdc_name* and *sdc_ip*. + + + sdc_ip (optional, str, None) + IP of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip* for get/rename operation. + + Mutually exclusive with *sdc_id* and *sdc_name*. + + + sdc_new_name (optional, str, None) + New name of the SDC. Used to rename the SDC. + + + state (True, str, None) + State of the SDC. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Get SDC details using SDC ip + dellemc.powerflex.sdc: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + sdc_ip: "{{sdc_ip}}" + state: "present" + + - name: Rename SDC using SDC name + dellemc.powerflex.sdc: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + sdc_name: "centos_sdc" + sdc_new_name: "centos_sdc_renamed" + state: "present" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +sdc_details (When SDC exists, dict, {'id': '07335d3d00000006', 'installedSoftwareVersionInfo': 'R3_6.0.0', 'kernelBuildNumber': None, 'kernelVersion': '3.10.0', 'links': [{'href': '/api/instances/Sdc::07335d3d00000006', 'rel': 'self'}, {'href': '/api/instances/Sdc::07335d3d00000006/relationships/ Statistics', 'rel': '/api/Sdc/relationship/Statistics'}, {'href': '/api/instances/Sdc::07335d3d00000006/relationships/ Volume', 'rel': '/api/Sdc/relationship/Volume'}, {'href': '/api/instances/System::4a54a8ba6df0690f', 'rel': '/api/parent/relationship/systemId'}], 'mapped_volumes': [], 'mdmConnectionState': 'Disconnected', 'memoryAllocationFailure': None, 'name': 'LGLAP203', 'osType': 'Linux', 'peerMdmId': None, 'perfProfile': 'HighPerformance', 'sdcApproved': True, 'sdcApprovedIps': None, 'sdcGuid': 'F8ECB844-23B8-4629-92BB-B6E49A1744CB', 'sdcIp': 'N/A', 'sdcIps': None, 'sdcType': 'AppSdc', 'sdrId': None, 'socketAllocationFailure': None, 'softwareVersionInfo': 'R3_6.0.0', 'systemId': '4a54a8ba6df0690f', 'versionInfo': 'R3_6.0.0'}) + Details of the SDC. + + + id (, str, ) + The ID of the SDC. + + + name (, str, ) + Name of the SDC. + + + sdcIp (, str, ) + IP of the SDC. + + + osType (, str, ) + OS type of the SDC. + + + mapped_volumes (, list, ) + The details of the mapped volumes. + + + id (, str, ) + The ID of the volume. + + + name (, str, ) + The name of the volume. + + + volumeType (, str, ) + Type of the volume. + + + + sdcApproved (, bool, ) + Indicates whether an SDC has approved access to the system. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Akash Shendge (@shenda1) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/sds.rst b/ansible_collections/dellemc/powerflex/docs/modules/sds.rst new file mode 100644 index 000000000..81a1b3908 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/sds.rst @@ -0,0 +1,516 @@ +.. _sds_module: + + +sds -- Manage SDS on Dell PowerFlex +=================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing SDS on PowerFlex storage system includes creating new SDS, getting details of SDS, adding/removing IP to/from SDS, modifying attributes of SDS, and deleting SDS. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + sds_name (optional, str, None) + The name of the SDS. + + Mandatory for create operation. + + It is unique across the PowerFlex array. + + Mutually exclusive with *sds_id*. + + + sds_id (optional, str, None) + The ID of the SDS. + + Except create operation, all other operations can be performed using *sds_id*. + + Mutually exclusive with *sds_name*. + + + protection_domain_name (optional, str, None) + The name of the protection domain. + + Mutually exclusive with *protection_domain_id*. + + + protection_domain_id (optional, str, None) + The ID of the protection domain. + + Mutually exclusive with *protection_domain_name*. + + + sds_ip_list (optional, list, None) + Dictionary of IPs and their roles for the SDS. + + At least one IP-role is mandatory while creating a SDS. + + IP-roles can be updated as well. + + + ip (True, str, None) + IP address of the SDS. + + + role (True, str, None) + Role assigned to the SDS IP address. + + + + sds_ip_state (optional, str, None) + State of IP with respect to the SDS. + + + rfcache_enabled (optional, bool, None) + Whether to enable the Read Flash cache. + + + rmcache_enabled (optional, bool, None) + Whether to enable the Read RAM cache. + + + rmcache_size (optional, int, None) + Read RAM cache size (in MB). + + Minimum size is 128 MB. + + Maximum size is 3911 MB. + + + sds_new_name (optional, str, None) + SDS new name. + + + performance_profile (optional, str, None) + Performance profile to apply to the SDS. + + The HighPerformance profile configures a predefined set of parameters for very high performance use cases. + + Default value by API is ``HighPerformance``. + + + state (True, str, None) + State of the SDS. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The maximum limit for the IPs that can be associated with an SDS is 8. + - There needs to be at least 1 IP for SDS communication and 1 for SDC communication. + - If only 1 IP exists, it must be with role 'all'; else 1 IP can be with role 'all'and other IPs with role 'sdcOnly'; or 1 IP must be with role 'sdsOnly' and others with role 'sdcOnly'. + - There can be 1 or more IPs with role 'sdcOnly'. + - There must be only 1 IP with SDS role (either with role 'all' or 'sdsOnly'). + - SDS can be created with RF cache disabled, but, be aware that the RF cache is not always updated. In this case, the user should re-try the operation. + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Create SDS + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node0" + protection_domain_name: "domain1" + sds_ip_list: + - ip: "198.10.xxx.xxx" + role: "all" + sds_ip_state: "present-in-sds" + state: "present" + + - name: Create SDS with all parameters + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node1" + protection_domain_name: "domain1" + sds_ip_list: + - ip: "198.10.xxx.xxx" + role: "sdcOnly" + sds_ip_state: "present-in-sds" + rmcache_enabled: true + rmcache_size: 128 + performance_profile: "HighPerformance" + state: "present" + + - name: Get SDS details using name + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node0" + state: "present" + + - name: Get SDS details using ID + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_id: "5718253c00000004" + state: "present" + + - name: Modify SDS attributes using name + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node0" + sds_new_name: "node0_new" + rfcache_enabled: true + rmcache_enabled: true + rmcache_size: 256 + performance_profile: "HighPerformance" + state: "present" + + - name: Modify SDS attributes using ID + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_id: "5718253c00000004" + sds_new_name: "node0_new" + rfcache_enabled: true + rmcache_enabled: true + rmcache_size: 256 + performance_profile: "HighPerformance" + state: "present" + + - name: Add IP and role to an SDS + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node0" + sds_ip_list: + - ip: "198.10.xxx.xxx" + role: "sdcOnly" + sds_ip_state: "present-in-sds" + state: "present" + + - name: Remove IP and role from an SDS + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node0" + sds_ip_list: + - ip: "198.10.xxx.xxx" + role: "sdcOnly" + sds_ip_state: "absent-in-sds" + state: "present" + + - name: Delete SDS using name + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_name: "node0" + state: "absent" + + - name: Delete SDS using ID + dellemc.powerflex.sds: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + sds_id: "5718253c00000004" + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +sds_details (When SDS exists, dict, {'authenticationError': 'None', 'certificateInfo': None, 'configuredDrlMode': 'Volatile', 'drlMode': 'Volatile', 'faultSetId': None, 'fglMetadataCacheSize': 0, 'fglMetadataCacheState': 'Disabled', 'fglNumConcurrentWrites': 1000, 'id': '8f3bb0cc00000002', 'ipList': [{'ip': '10.47.xxx.xxx', 'role': 'all'}], 'lastUpgradeTime': 0, 'links': [{'href': '/api/instances/Sds::8f3bb0cc00000002', 'rel': 'self'}, {'href': '/api/instances/Sds::8f3bb0cc00000002/relationships /Statistics', 'rel': '/api/Sds/relationship/Statistics'}, {'href': '/api/instances/Sds::8f3bb0cc00000002/relationships /SpSds', 'rel': '/api/Sds/relationship/SpSds'}, {'href': '/api/instances/Sds::8f3bb0cc00000002/relationships /Device', 'rel': '/api/Sds/relationship/Device'}, {'href': '/api/instances/ProtectionDomain::9300c1f900000000', 'rel': '/api/parent/relationship/protectionDomainId'}], 'maintenanceState': 'NoMaintenance', 'maintenanceType': 'NoMaintenance', 'mdmConnectionState': 'Connected', 'membershipState': 'Joined', 'name': 'node0', 'numOfIoBuffers': None, 'numRestarts': 2, 'onVmWare': True, 'perfProfile': 'HighPerformance', 'port': 7072, 'protectionDomainId': '9300c1f900000000', 'protectionDomainName': 'domain1', 'raidControllers': None, 'rfcacheEnabled': True, 'rfcacheErrorApiVersionMismatch': False, 'rfcacheErrorDeviceDoesNotExist': False, 'rfcacheErrorInconsistentCacheConfiguration': False, 'rfcacheErrorInconsistentSourceConfiguration': False, 'rfcacheErrorInvalidDriverPath': False, 'rfcacheErrorLowResources': False, 'rmcacheEnabled': True, 'rmcacheFrozen': False, 'rmcacheMemoryAllocationState': 'AllocationPending', 'rmcacheSizeInKb': 131072, 'rmcacheSizeInMb': 128, 'sdsConfigurationFailure': None, 'sdsDecoupled': None, 'sdsReceiveBufferAllocationFailures': None, 'sdsState': 'Normal', 'softwareVersionInfo': 'R3_6.0.0'}) + Details of the SDS. + + + authenticationError (, str, ) + Indicates authentication error. + + + certificateInfo (, str, ) + Information about certificate. + + + configuredDrlMode (, str, ) + Configured DRL mode. + + + drlMode (, str, ) + DRL mode. + + + faultSetId (, str, ) + Fault set ID. + + + fglMetadataCacheSize (, int, ) + FGL metadata cache size. + + + fglMetadataCacheState (, str, ) + FGL metadata cache state. + + + fglNumConcurrentWrites (, int, ) + FGL concurrent writes. + + + id (, str, ) + SDS ID. + + + ipList (, list, ) + SDS IP list. + + + ip (, str, ) + IP present in the SDS. + + + role (, str, ) + Role of the SDS IP. + + + + lastUpgradeTime (, str, ) + Last time SDS was upgraded. + + + links (, list, ) + SDS links. + + + href (, str, ) + SDS instance URL. + + + rel (, str, ) + SDS's relationship with different entities. + + + + maintenanceState (, str, ) + Maintenance state. + + + maintenanceType (, str, ) + Maintenance type. + + + mdmConnectionState (, str, ) + MDM connection state. + + + membershipState (, str, ) + Membership state. + + + name (, str, ) + Name of the SDS. + + + numOfIoBuffers (, int, ) + Number of IO buffers. + + + numRestarts (, int, ) + Number of restarts. + + + onVmWare (, bool, ) + Presence on VMware. + + + perfProfile (, str, ) + Performance profile. + + + port (, int, ) + SDS port. + + + protectionDomainId (, str, ) + Protection Domain ID. + + + protectionDomainName (, str, ) + Protection Domain Name. + + + raidControllers (, int, ) + Number of RAID controllers. + + + rfcacheEnabled (, bool, ) + Whether RF cache is enabled or not. + + + rfcacheErrorApiVersionMismatch (, bool, ) + RF cache error for API version mismatch. + + + rfcacheErrorDeviceDoesNotExist (, bool, ) + RF cache error for device does not exist. + + + rfcacheErrorInconsistentCacheConfiguration (, bool, ) + RF cache error for inconsistent cache configuration. + + + rfcacheErrorInconsistentSourceConfiguration (, bool, ) + RF cache error for inconsistent source configuration. + + + rfcacheErrorInvalidDriverPath (, bool, ) + RF cache error for invalid driver path. + + + rfcacheErrorLowResources (, bool, ) + RF cache error for low resources. + + + rmcacheEnabled (, bool, ) + Whether Read RAM cache is enabled or not. + + + rmcacheFrozen (, bool, ) + RM cache frozen. + + + rmcacheMemoryAllocationState (, bool, ) + RM cache memory allocation state. + + + rmcacheSizeInKb (, int, ) + RM cache size in KB. + + + rmcacheSizeInMb (, int, ) + RM cache size in MB. + + + sdsConfigurationFailure (, str, ) + SDS configuration failure. + + + sdsDecoupled (, str, ) + SDS decoupled. + + + sdsReceiveBufferAllocationFailures (, str, ) + SDS receive buffer allocation failures. + + + sdsState (, str, ) + SDS state. + + + softwareVersionInfo (, str, ) + SDS software version information. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Rajshree Khare (@khareRajshree) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/snapshot.rst b/ansible_collections/dellemc/powerflex/docs/modules/snapshot.rst new file mode 100644 index 000000000..dafed946d --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/snapshot.rst @@ -0,0 +1,398 @@ +.. _snapshot_module: + + +snapshot -- Manage Snapshots on Dell PowerFlex +============================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing snapshots on PowerFlex Storage System includes creating, getting details, mapping/unmapping to/from SDC, modifying the attributes and deleting snapshot. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + snapshot_name (optional, str, None) + The name of the snapshot. + + Mandatory for create operation. + + Specify either *snapshot_name* or *snapshot_id* (but not both) for any operation. + + + snapshot_id (optional, str, None) + The ID of the Snapshot. + + + vol_name (optional, str, None) + The name of the volume for which snapshot will be taken. + + Specify either *vol_name* or *vol_id* while creating snapshot. + + + vol_id (optional, str, None) + The ID of the volume. + + + read_only (optional, bool, None) + Specifies whether mapping of the created snapshot volume will have read-write access or limited to read-only access. + + If ``true``, snapshot is created with read-only access. + + If ``false``, snapshot is created with read-write access. + + + size (optional, int, None) + The size of the snapshot. + + + cap_unit (optional, str, None) + The unit of the volume size. It defaults to ``GB``, if not specified. + + + snapshot_new_name (optional, str, None) + New name of the snapshot. Used to rename the snapshot. + + + allow_multiple_mappings (optional, bool, None) + Specifies whether to allow multiple mappings or not. + + + desired_retention (optional, int, None) + The retention value for the Snapshot. + + If the desired_retention is not mentioned during creation, snapshot will be created with unlimited retention. + + Maximum supported desired retention is 31 days. + + + retention_unit (optional, str, None) + The unit for retention. It defaults to ``hours``, if not specified. + + + sdc (optional, list, None) + Specifies SDC parameters. + + + sdc_name (optional, str, None) + Name of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip*. + + Mutually exclusive with *sdc_id* and *sdc_ip*. + + + sdc_id (optional, str, None) + ID of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip*. + + Mutually exclusive with *sdc_name* and *sdc_ip*. + + + sdc_ip (optional, str, None) + IP of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip*. + + Mutually exclusive with *sdc_id* and *sdc_ip*. + + + access_mode (optional, str, None) + Define the access mode for all mappings of the snapshot. + + + bandwidth_limit (optional, int, None) + Limit of snapshot network bandwidth. + + Need to mention in multiple of 1024 Kbps. + + To set no limit, 0 is to be passed. + + + iops_limit (optional, int, None) + Limit of snapshot IOPS. + + Minimum IOPS limit is 11 and specify 0 for unlimited iops. + + + + sdc_state (optional, str, None) + Mapping state of the SDC. + + + remove_mode (optional, str, None) + Removal mode for the snapshot. + + It defaults to ``ONLY_ME``, if not specified. + + + state (True, str, None) + State of the snapshot. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Create snapshot + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_name: "ansible_snapshot" + vol_name: "ansible_volume" + read_only: False + desired_retention: 2 + state: "present" + + - name: Get snapshot details using snapshot id + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + state: "present" + + - name: Map snapshot to SDC + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + sdc: + - sdc_ip: "198.10.xxx.xxx" + - sdc_id: "663ac0d200000001" + allow_multiple_mappings: True + sdc_state: "mapped" + state: "present" + + - name: Modify the attributes of SDC mapped to snapshot + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + sdc: + - sdc_ip: "198.10.xxx.xxx" + iops_limit: 11 + bandwidth_limit: 4096 + - sdc_id: "663ac0d200000001" + iops_limit: 20 + bandwidth_limit: 2048 + allow_multiple_mappings: True + sdc_state: "mapped" + state: "present" + + - name: Extend the size of snapshot + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + size: 16 + state: "present" + + - name: Unmap SDCs from snapshot + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + sdc: + - sdc_ip: "198.10.xxx.xxx" + - sdc_id: "663ac0d200000001" + sdc_state: "unmapped" + state: "present" + + - name: Rename snapshot + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + snapshot_new_name: "ansible_renamed_snapshot_10" + state: "present" + + - name: Delete snapshot + dellemc.powerflex.snapshot: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + snapshot_id: "fe6cb28200000007" + remove_mode: "ONLY_ME" + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +snapshot_details (When snapshot exists, dict, {'accessModeLimit': 'ReadOnly', 'ancestorVolumeId': 'cdd883cf00000002', 'ancestorVolumeName': 'ansible-volume-1', 'autoSnapshotGroupId': None, 'compressionMethod': 'Invalid', 'consistencyGroupId': '22f1e80c00000001', 'creationTime': 1631619229, 'dataLayout': 'MediumGranularity', 'id': 'cdd883d000000004', 'links': [{'href': '/api/instances/Volume::cdd883d000000004', 'rel': 'self'}, {'href': '/api/instances/Volume::cdd883d000000004/relationships /Statistics', 'rel': '/api/Volume/relationship/Statistics'}, {'href': '/api/instances/Volume::cdd883cf00000002', 'rel': '/api/parent/relationship/ancestorVolumeId'}, {'href': '/api/instances/VTree::6e86255c00000001', 'rel': '/api/parent/relationship/vtreeId'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000', 'rel': '/api/parent/relationship/storagePoolId'}], 'lockedAutoSnapshot': False, 'lockedAutoSnapshotMarkedForRemoval': False, 'managedBy': 'ScaleIO', 'mappedSdcInfo': None, 'name': 'ansible_vol_snap_1', 'notGenuineSnapshot': False, 'originalExpiryTime': 0, 'pairIds': None, 'replicationJournalVolume': False, 'replicationTimeStamp': 0, 'retentionInHours': 0, 'retentionLevels': [], 'secureSnapshotExpTime': 0, 'sizeInGb': 16, 'sizeInKb': 16777216, 'snplIdOfAutoSnapshot': None, 'snplIdOfSourceVolume': None, 'storagePoolId': 'e0d8f6c900000000', 'storagePoolName': 'pool1', 'timeStampIsAccurate': False, 'useRmcache': False, 'volumeReplicationState': 'UnmarkedForReplication', 'volumeType': 'Snapshot', 'vtreeId': '6e86255c00000001'}) + Details of the snapshot. + + + ancestorVolumeId (, str, ) + The ID of the root of the specified volume's V-Tree. + + + ancestorVolumeName (, str, ) + The name of the root of the specified volume's V-Tree. + + + creationTime (, int, ) + The creation time of the snapshot. + + + id (, str, ) + The ID of the snapshot. + + + mappedSdcInfo (, dict, ) + The details of the mapped SDC. + + + sdcId (, str, ) + ID of the SDC. + + + sdcName (, str, ) + Name of the SDC. + + + sdcIp (, str, ) + IP of the SDC. + + + accessMode (, str, ) + Mapping access mode for the specified snapshot. + + + limitIops (, int, ) + IOPS limit for the SDC. + + + limitBwInMbps (, int, ) + Bandwidth limit for the SDC. + + + + name (, str, ) + Name of the snapshot. + + + secureSnapshotExpTime (, int, ) + Expiry time of the snapshot. + + + sizeInKb (, int, ) + Size of the snapshot. + + + sizeInGb (, int, ) + Size of the snapshot. + + + retentionInHours (, int, ) + Retention of the snapshot in hours. + + + storagePoolId (, str, ) + The ID of the Storage pool in which snapshot resides. + + + storagePoolName (, str, ) + The name of the Storage pool in which snapshot resides. + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Akash Shendge (@shenda1) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/storagepool.rst b/ansible_collections/dellemc/powerflex/docs/modules/storagepool.rst new file mode 100644 index 000000000..9037ef73c --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/storagepool.rst @@ -0,0 +1,264 @@ +.. _storagepool_module: + + +storagepool -- Managing Dell PowerFlex storage pool +=================================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Dell PowerFlex storage pool module includes getting the details of storage pool, creating a new storage pool, and modifying the attribute of a storage pool. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + storage_pool_name (optional, str, None) + The name of the storage pool. + + If more than one storage pool is found with the same name then protection domain id/name is required to perform the task. + + Mutually exclusive with *storage_pool_id*. + + + storage_pool_id (optional, str, None) + The id of the storage pool. + + It is auto generated, hence should not be provided during creation of a storage pool. + + Mutually exclusive with *storage_pool_name*. + + + protection_domain_name (optional, str, None) + The name of the protection domain. + + During creation of a pool, either protection domain name or id must be mentioned. + + Mutually exclusive with *protection_domain_id*. + + + protection_domain_id (optional, str, None) + The id of the protection domain. + + During creation of a pool, either protection domain name or id must be mentioned. + + Mutually exclusive with *protection_domain_name*. + + + media_type (optional, str, None) + Type of devices in the storage pool. + + + storage_pool_new_name (optional, str, None) + New name for the storage pool can be provided. + + This parameter is used for renaming the storage pool. + + + use_rfcache (optional, bool, None) + Enable/Disable RFcache on a specific storage pool. + + + use_rmcache (optional, bool, None) + Enable/Disable RMcache on a specific storage pool. + + + state (True, str, None) + State of the storage pool. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - TRANSITIONAL media type is supported only during modification. + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + + - name: Get the details of storage pool by name + dellemc.powerflex.storagepool: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + storage_pool_name: "sample_pool_name" + protection_domain_name: "sample_protection_domain" + state: "present" + + - name: Get the details of storage pool by id + dellemc.powerflex.storagepool: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + storage_pool_id: "abcd1234ab12r" + state: "present" + + - name: Create a new storage pool by name + dellemc.powerflex.storagepool: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + storage_pool_name: "ansible_test_pool" + protection_domain_id: "1c957da800000000" + media_type: "HDD" + state: "present" + + - name: Modify a storage pool by name + dellemc.powerflex.storagepool: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + storage_pool_name: "ansible_test_pool" + protection_domain_id: "1c957da800000000" + use_rmcache: True + use_rfcache: True + state: "present" + + - name: Rename storage pool by id + dellemc.powerflex.storagepool: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + storage_pool_id: "abcd1234ab12r" + storage_pool_new_name: "new_ansible_pool" + state: "present" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +storage_pool_details (When storage pool exists, dict, {'addressSpaceUsage': 'Normal', 'addressSpaceUsageType': 'DeviceCapacityLimit', 'backgroundScannerBWLimitKBps': 3072, 'backgroundScannerMode': 'DataComparison', 'bgScannerCompareErrorAction': 'ReportAndFix', 'bgScannerReadErrorAction': 'ReportAndFix', 'capacityAlertCriticalThreshold': 90, 'capacityAlertHighThreshold': 80, 'capacityUsageState': 'Normal', 'capacityUsageType': 'NetCapacity', 'checksumEnabled': False, 'compressionMethod': 'Invalid', 'dataLayout': 'MediumGranularity', 'externalAccelerationType': 'None', 'fglAccpId': None, 'fglExtraCapacity': None, 'fglMaxCompressionRatio': None, 'fglMetadataSizeXx100': None, 'fglNvdimmMetadataAmortizationX100': None, 'fglNvdimmWriteCacheSizeInMb': None, 'fglOverProvisioningFactor': None, 'fglPerfProfile': None, 'fglWriteAtomicitySize': None, 'fragmentationEnabled': True, 'id': 'e0d8f6c900000000', 'links': [{'href': '/api/instances/StoragePool::e0d8f6c900000000', 'rel': 'self'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/Statistics', 'rel': '/api/StoragePool/relationship/Statistics'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/SpSds', 'rel': '/api/StoragePool/relationship/SpSds'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/Volume', 'rel': '/api/StoragePool/relationship/Volume'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/Device', 'rel': '/api/StoragePool/relationship/Device'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000 /relationships/VTree', 'rel': '/api/StoragePool/relationship/VTree'}, {'href': '/api/instances/ProtectionDomain::9300c1f900000000', 'rel': '/api/parent/relationship/protectionDomainId'}], 'statistics': {'BackgroundScannedInMB': 3466920, 'activeBckRebuildCapacityInKb': 0, 'activeEnterProtectedMaintenanceModeCapacityInKb': 0, 'aggregateCompressionLevel': 'Uncompressed', 'atRestCapacityInKb': 1248256, 'backgroundScanCompareErrorCount': 0, 'backgroundScanFixedCompareErrorCount': 0, 'bckRebuildReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'bckRebuildWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'capacityAvailableForVolumeAllocationInKb': 369098752, 'capacityInUseInKb': 2496512, 'capacityInUseNoOverheadInKb': 2496512, 'capacityLimitInKb': 845783040, 'compressedDataCompressionRatio': 0.0, 'compressionRatio': 1.0, 'currentFglMigrationSizeInKb': 0, 'deviceIds': [], 'enterProtectedMaintenanceModeCapacityInKb': 0, 'enterProtectedMaintenanceModeReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'enterProtectedMaintenanceModeWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'exitProtectedMaintenanceModeReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'exitProtectedMaintenanceModeWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'exposedCapacityInKb': 0, 'failedCapacityInKb': 0, 'fwdRebuildReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'fwdRebuildWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'inMaintenanceCapacityInKb': 0, 'inMaintenanceVacInKb': 0, 'inUseVacInKb': 184549376, 'inaccessibleCapacityInKb': 0, 'logWrittenBlocksInKb': 0, 'maxCapacityInKb': 845783040, 'migratingVolumeIds': [], 'migratingVtreeIds': [], 'movingCapacityInKb': 0, 'netCapacityInUseInKb': 1248256, 'normRebuildCapacityInKb': 0, 'normRebuildReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'normRebuildWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'numOfDeviceAtFaultRebuilds': 0, 'numOfDevices': 3, 'numOfIncomingVtreeMigrations': 0, 'numOfVolumes': 8, 'numOfVolumesInDeletion': 0, 'numOfVtrees': 8, 'overallUsageRatio': 73.92289, 'pendingBckRebuildCapacityInKb': 0, 'pendingEnterProtectedMaintenanceModeCapacityInKb': 0, 'pendingExitProtectedMaintenanceModeCapacityInKb': 0, 'pendingFwdRebuildCapacityInKb': 0, 'pendingMovingCapacityInKb': 0, 'pendingMovingInBckRebuildJobs': 0, 'persistentChecksumBuilderProgress': 100.0, 'persistentChecksumCapacityInKb': 414720, 'primaryReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'primaryReadFromDevBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'primaryReadFromRmcacheBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'primaryVacInKb': 92274688, 'primaryWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'protectedCapacityInKb': 2496512, 'protectedVacInKb': 184549376, 'provisionedAddressesInKb': 2496512, 'rebalanceCapacityInKb': 0, 'rebalanceReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'rebalanceWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'rfacheReadHit': 0, 'rfacheWriteHit': 0, 'rfcacheAvgReadTime': 0, 'rfcacheAvgWriteTime': 0, 'rfcacheIoErrors': 0, 'rfcacheIosOutstanding': 0, 'rfcacheIosSkipped': 0, 'rfcacheReadMiss': 0, 'rmPendingAllocatedInKb': 0, 'rmPendingThickInKb': 0, 'rplJournalCapAllowed': 0, 'rplTotalJournalCap': 0, 'rplUsedJournalCap': 0, 'secondaryReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'secondaryReadFromDevBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'secondaryReadFromRmcacheBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'secondaryVacInKb': 92274688, 'secondaryWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'semiProtectedCapacityInKb': 0, 'semiProtectedVacInKb': 0, 'snapCapacityInUseInKb': 0, 'snapCapacityInUseOccupiedInKb': 0, 'snapshotCapacityInKb': 0, 'spSdsIds': ['abdfe71b00030001', 'abdce71d00040001', 'abdde71e00050001'], 'spareCapacityInKb': 84578304, 'targetOtherLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'targetReadLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'targetWriteLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'tempCapacityInKb': 0, 'tempCapacityVacInKb': 0, 'thickCapacityInUseInKb': 0, 'thinAndSnapshotRatio': 73.92289, 'thinCapacityAllocatedInKm': 184549376, 'thinCapacityInUseInKb': 0, 'thinUserDataCapacityInKb': 2496512, 'totalFglMigrationSizeInKb': 0, 'totalReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'totalWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'trimmedUserDataCapacityInKb': 0, 'unreachableUnusedCapacityInKb': 0, 'unusedCapacityInKb': 758708224, 'userDataCapacityInKb': 2496512, 'userDataCapacityNoTrimInKb': 2496512, 'userDataReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcReadLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcTrimLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcWriteLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataTrimBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'volMigrationReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'volMigrationWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'volumeAddressSpaceInKb': '922XXXXX', 'volumeAllocationLimitInKb': '3707XXXXX', 'volumeIds': ['456afc7900XXXXXXXX'], 'vtreeAddresSpaceInKb': 92274688, 'vtreeIds': ['32b1681bXXXXXXXX']}, 'mediaType': 'HDD', 'name': 'pool1', 'numOfParallelRebuildRebalanceJobsPerDevice': 2, 'persistentChecksumBuilderLimitKb': 3072, 'persistentChecksumEnabled': True, 'persistentChecksumState': 'Protected', 'persistentChecksumValidateOnRead': False, 'protectedMaintenanceModeIoPriorityAppBwPerDeviceThresholdInKbps': None, 'protectedMaintenanceModeIoPriorityAppIopsPerDeviceThreshold': None, 'protectedMaintenanceModeIoPriorityBwLimitPerDeviceInKbps': 10240, 'protectedMaintenanceModeIoPriorityNumOfConcurrentIosPerDevice': 1, 'protectedMaintenanceModeIoPriorityPolicy': 'limitNumOfConcurrentIos', 'protectedMaintenanceModeIoPriorityQuietPeriodInMsec': None, 'protectionDomainId': '9300c1f900000000', 'protectionDomainName': 'domain1', 'rebalanceEnabled': True, 'rebalanceIoPriorityAppBwPerDeviceThresholdInKbps': None, 'rebalanceIoPriorityAppIopsPerDeviceThreshold': None, 'rebalanceIoPriorityBwLimitPerDeviceInKbps': 10240, 'rebalanceIoPriorityNumOfConcurrentIosPerDevice': 1, 'rebalanceIoPriorityPolicy': 'favorAppIos', 'rebalanceIoPriorityQuietPeriodInMsec': None, 'rebuildEnabled': True, 'rebuildIoPriorityAppBwPerDeviceThresholdInKbps': None, 'rebuildIoPriorityAppIopsPerDeviceThreshold': None, 'rebuildIoPriorityBwLimitPerDeviceInKbps': 10240, 'rebuildIoPriorityNumOfConcurrentIosPerDevice': 1, 'rebuildIoPriorityPolicy': 'limitNumOfConcurrentIos', 'rebuildIoPriorityQuietPeriodInMsec': None, 'replicationCapacityMaxRatio': 32, 'rmcacheWriteHandlingMode': 'Cached', 'sparePercentage': 10, 'useRfcache': False, 'useRmcache': False, 'vtreeMigrationIoPriorityAppBwPerDeviceThresholdInKbps': None, 'vtreeMigrationIoPriorityAppIopsPerDeviceThreshold': None, 'vtreeMigrationIoPriorityBwLimitPerDeviceInKbps': 10240, 'vtreeMigrationIoPriorityNumOfConcurrentIosPerDevice': 1, 'vtreeMigrationIoPriorityPolicy': 'favorAppIos', 'vtreeMigrationIoPriorityQuietPeriodInMsec': None, 'zeroPaddingEnabled': True}) + Details of the storage pool. + + + mediaType (, str, ) + Type of devices in the storage pool. + + + useRfcache (, bool, ) + Enable/Disable RFcache on a specific storage pool. + + + useRmcache (, bool, ) + Enable/Disable RMcache on a specific storage pool. + + + id (, str, ) + ID of the storage pool under protection domain. + + + name (, str, ) + Name of the storage pool under protection domain. + + + protectionDomainId (, str, ) + ID of the protection domain in which pool resides. + + + protectionDomainName (, str, ) + Name of the protection domain in which pool resides. + + + statistics (, dict, ) + Statistics details of the storage pool. + + + capacityInUseInKb (, str, ) + Total capacity of the storage pool. + + + unusedCapacityInKb (, str, ) + Unused capacity of the storage pool. + + + deviceIds (, list, ) + Device Ids of the storage pool. + + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- Arindam Datta (@dattaarindam) <ansible.team@dell.com> +- P Srinivas Rao (@srinivas-rao5) <ansible.team@dell.com> + diff --git a/ansible_collections/dellemc/powerflex/docs/modules/volume.rst b/ansible_collections/dellemc/powerflex/docs/modules/volume.rst new file mode 100644 index 000000000..10cf8de84 --- /dev/null +++ b/ansible_collections/dellemc/powerflex/docs/modules/volume.rst @@ -0,0 +1,476 @@ +.. _volume_module: + + +volume -- Manage volumes on Dell PowerFlex +========================================== + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- + +Managing volumes on PowerFlex storage system includes creating, getting details, modifying attributes and deleting volume. + +It also includes adding/removing snapshot policy, mapping/unmapping volume to/from SDC and listing associated snapshots. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- A Dell PowerFlex storage system version 3.5 or later. +- Ansible-core 2.12 or later. +- PyPowerFlex 1.6.0. +- Python 3.9, 3.10 or 3.11. + + + +Parameters +---------- + + vol_name (optional, str, None) + The name of the volume. + + Mandatory for create operation. + + It is unique across the PowerFlex array. + + Mutually exclusive with *vol_id*. + + + vol_id (optional, str, None) + The ID of the volume. + + Except create operation, all other operations can be performed using *vol_id*. + + Mutually exclusive with *vol_name*. + + + storage_pool_name (optional, str, None) + The name of the storage pool. + + Either name or the id of the storage pool is required for creating a volume. + + During creation, if storage pool name is provided then either protection domain name or id must be mentioned along with it. + + Mutually exclusive with *storage_pool_id*. + + + storage_pool_id (optional, str, None) + The ID of the storage pool. + + Either name or the id of the storage pool is required for creating a volume. + + Mutually exclusive with *storage_pool_name*. + + + protection_domain_name (optional, str, None) + The name of the protection domain. + + During creation of a volume, if more than one storage pool exists with the same name then either protection domain name or id must be mentioned along with it. + + Mutually exclusive with *protection_domain_id*. + + + protection_domain_id (optional, str, None) + The ID of the protection domain. + + During creation of a volume, if more than one storage pool exists with the same name then either protection domain name or id must be mentioned along with it. + + Mutually exclusive with *protection_domain_name*. + + + vol_type (optional, str, None) + Type of volume provisioning. + + + compression_type (optional, str, None) + Type of the compression method. + + + use_rmcache (optional, bool, None) + Whether to use RM Cache or not. + + + snapshot_policy_name (optional, str, None) + Name of the snapshot policy. + + To remove/detach snapshot policy, empty *snapshot_policy_id*/*snapshot_policy_name* is to be passed along with *auto_snap_remove_type*. + + + snapshot_policy_id (optional, str, None) + ID of the snapshot policy. + + To remove/detach snapshot policy, empty *snapshot_policy_id*/*snapshot_policy_name* is to be passed along with *auto_snap_remove_type*. + + + auto_snap_remove_type (optional, str, None) + Whether to remove or detach the snapshot policy. + + To remove/detach snapshot policy, empty *snapshot_policy_id*/*snapshot_policy_name* is to be passed along with *auto_snap_remove_type*. + + If the snapshot policy name/id is passed empty then *auto_snap_remove_type* is defaulted to ``detach``. + + + size (optional, int, None) + The size of the volume. + + Size of the volume will be assigned as higher multiple of 8 GB. + + + cap_unit (optional, str, None) + The unit of the volume size. It defaults to 'GB'. + + + vol_new_name (optional, str, None) + New name of the volume. Used to rename the volume. + + + allow_multiple_mappings (optional, bool, None) + Specifies whether to allow or not allow multiple mappings. + + If the volume is mapped to one SDC then for every new mapping *allow_multiple_mappings* has to be passed as True. + + + sdc (optional, list, None) + Specifies SDC parameters. + + + sdc_name (optional, str, None) + Name of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip*. + + Mutually exclusive with *sdc_id* and *sdc_ip*. + + + sdc_id (optional, str, None) + ID of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip*. + + Mutually exclusive with *sdc_name* and *sdc_ip*. + + + sdc_ip (optional, str, None) + IP of the SDC. + + Specify either *sdc_name*, *sdc_id* or *sdc_ip*. + + Mutually exclusive with *sdc_id* and *sdc_ip*. + + + access_mode (optional, str, None) + Define the access mode for all mappings of the volume. + + + bandwidth_limit (optional, int, None) + Limit of volume network bandwidth. + + Need to mention in multiple of 1024 Kbps. + + To set no limit, 0 is to be passed. + + + iops_limit (optional, int, None) + Limit of volume IOPS. + + Minimum IOPS limit is 11 and specify 0 for unlimited iops. + + + + sdc_state (optional, str, None) + Mapping state of the SDC. + + + delete_snapshots (optional, bool, None) + If ``True``, the volume and all its dependent snapshots will be deleted. + + If ``False``, only the volume will be deleted. + + It can be specified only when the *state* is ``absent``. + + It defaults to ``False``, if not specified. + + + state (True, str, None) + State of the volume. + + + hostname (True, str, None) + IP or FQDN of the PowerFlex host. + + + username (True, str, None) + The username of the PowerFlex host. + + + password (True, str, None) + The password of the PowerFlex host. + + + validate_certs (optional, bool, True) + Boolean variable to specify whether or not to validate SSL certificate. + + ``true`` - Indicates that the SSL certificate should be verified. + + ``false`` - Indicates that the SSL certificate should not be verified. + + + port (optional, int, 443) + Port number through which communication happens with PowerFlex host. + + + timeout (False, int, 120) + Time after which connection will get terminated. + + It is to be mentioned in seconds. + + + + + +Notes +----- + +.. note:: + - The *check_mode* is not supported. + - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform. + + + + +Examples +-------- + +.. code-block:: yaml+jinja + + + - name: Create a volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + storage_pool_name: "pool_1" + protection_domain_name: "pd_1" + vol_type: "THICK_PROVISIONED" + compression_type: "NORMAL" + use_rmcache: True + size: 16 + state: "present" + + - name: Map a SDC to volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + allow_multiple_mappings: True + sdc: + - sdc_id: "92A304DB-EFD7-44DF-A07E-D78134CC9764" + access_mode: "READ_WRITE" + sdc_state: "mapped" + state: "present" + + - name: Unmap a SDC to volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + sdc: + - sdc_id: "92A304DB-EFD7-44DF-A07E-D78134CC9764" + sdc_state: "unmapped" + state: "present" + + - name: Map multiple SDCs to a volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + protection_domain_name: "pd_1" + sdc: + - sdc_id: "92A304DB-EFD7-44DF-A07E-D78134CC9764" + access_mode: "READ_WRITE" + bandwidth_limit: 2048 + iops_limit: 20 + - sdc_ip: "198.10.xxx.xxx" + access_mode: "READ_ONLY" + allow_multiple_mappings: True + sdc_state: "mapped" + state: "present" + + - name: Get the details of the volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_id: "fe6c8b7100000005" + state: "present" + + - name: Modify the details of the Volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + storage_pool_name: "pool_1" + new_vol_name: "new_sample_volume" + size: 64 + state: "present" + + - name: Delete the Volume + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + delete_snapshots: False + state: "absent" + + - name: Delete the Volume and all its dependent snapshots + dellemc.powerflex.volume: + hostname: "{{hostname}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + port: "{{port}}" + vol_name: "sample_volume" + delete_snapshots: True + state: "absent" + + + +Return Values +------------- + +changed (always, bool, false) + Whether or not the resource has changed. + + +volume_details (When volume exists, dict, {'accessModeLimit': 'ReadWrite', 'ancestorVolumeId': None, 'autoSnapshotGroupId': None, 'compressionMethod': 'Invalid', 'consistencyGroupId': None, 'creationTime': 1631618520, 'dataLayout': 'MediumGranularity', 'id': 'cdd883cf00000002', 'links': [{'href': '/api/instances/Volume::cdd883cf00000002', 'rel': 'self'}, {'href': '/api/instances/Volume::cdd883cf00000002/relationships /Statistics', 'rel': '/api/Volume/relationship/Statistics'}, {'href': '/api/instances/VTree::6e86255c00000001', 'rel': '/api/parent/relationship/vtreeId'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000', 'rel': '/api/parent/relationship/storagePoolId'}], 'lockedAutoSnapshot': False, 'lockedAutoSnapshotMarkedForRemoval': False, 'managedBy': 'ScaleIO', 'mappedSdcInfo': None, 'name': 'ansible-volume-1', 'notGenuineSnapshot': False, 'originalExpiryTime': 0, 'pairIds': None, 'protectionDomainId': '9300c1f900000000', 'protectionDomainName': 'domain1', 'replicationJournalVolume': False, 'replicationTimeStamp': 0, 'retentionLevels': [], 'secureSnapshotExpTime': 0, 'sizeInGB': 16, 'sizeInKb': 16777216, 'snapshotPolicyId': None, 'snapshotPolicyName': None, 'snapshotsList': [{'accessModeLimit': 'ReadOnly', 'ancestorVolumeId': 'cdd883cf00000002', 'autoSnapshotGroupId': None, 'compressionMethod': 'Invalid', 'consistencyGroupId': '22f1e80c00000001', 'creationTime': 1631619229, 'dataLayout': 'MediumGranularity', 'id': 'cdd883d000000004', 'links': [{'href': '/api/instances/Volume::cdd883d000000004', 'rel': 'self'}, {'href': '/api/instances/Volume::cdd883d000000004 /relationships/Statistics', 'rel': '/api/Volume/relationship/Statistics'}, {'href': '/api/instances/Volume::cdd883cf00000002', 'rel': '/api/parent/relationship/ancestorVolumeId'}, {'href': '/api/instances/VTree::6e86255c00000001', 'rel': '/api/parent/relationship/vtreeId'}, {'href': '/api/instances/StoragePool::e0d8f6c900000000', 'rel': '/api/parent/relationship/storagePoolId'}], 'lockedAutoSnapshot': False, 'lockedAutoSnapshotMarkedForRemoval': False, 'managedBy': 'ScaleIO', 'mappedSdcInfo': None, 'name': 'ansible_vol_snap_1', 'notGenuineSnapshot': False, 'originalExpiryTime': 0, 'pairIds': None, 'replicationJournalVolume': False, 'replicationTimeStamp': 0, 'retentionLevels': [], 'secureSnapshotExpTime': 0, 'sizeInKb': 16777216, 'snplIdOfAutoSnapshot': None, 'snplIdOfSourceVolume': None, 'storagePoolId': 'e0d8f6c900000000', 'timeStampIsAccurate': False, 'useRmcache': False, 'volumeReplicationState': 'UnmarkedForReplication', 'volumeType': 'Snapshot', 'vtreeId': '6e86255c00000001'}], 'statistics': {'childVolumeIds': [], 'descendantVolumeIds': [], 'initiatorSdcId': None, 'mappedSdcIds': ['c42425XXXXXX'], 'numOfChildVolumes': 0, 'numOfDescendantVolumes': 0, 'numOfMappedSdcs': 1, 'registrationKey': None, 'registrationKeys': [], 'replicationJournalVolume': False, 'replicationState': 'UnmarkedForReplication', 'reservationType': 'NotReserved', 'rplTotalJournalCap': 0, 'rplUsedJournalCap': 0, 'userDataReadBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcReadLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcTrimLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataSdcWriteLatency': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataTrimBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}, 'userDataWriteBwc': {'numOccured': 0, 'numSeconds': 0, 'totalWeightInKb': 0}}, 'snplIdOfAutoSnapshot': None, 'snplIdOfSourceVolume': None, 'storagePoolId': 'e0d8f6c900000000', 'storagePoolName': 'pool1', 'timeStampIsAccurate': False, 'useRmcache': False, 'volumeReplicationState': 'UnmarkedForReplication', 'volumeType': 'ThinProvisioned', 'vtreeId': '6e86255c00000001'}) + Details of the volume. + + + id (, str, ) + The ID of the volume. + + + mappedSdcInfo (, dict, ) + The details of the mapped SDC. + + + sdcId (, str, ) + ID of the SDC. + + + sdcName (, str, ) + Name of the SDC. + + + sdcIp (, str, ) + IP of the SDC. + + + accessMode (, str, ) + Mapping access mode for the specified volume. + + + limitIops (, int, ) + IOPS limit for the SDC. + + + limitBwInMbps (, int, ) + Bandwidth limit for the SDC. + + + + name (, str, ) + Name of the volume. + + + sizeInKb (, int, ) + Size of the volume in Kb. + + + sizeInGb (, int, ) + Size of the volume in Gb. + + + storagePoolId (, str, ) + ID of the storage pool in which volume resides. + + + storagePoolName (, str, ) + Name of the storage pool in which volume resides. + + + protectionDomainId (, str, ) + ID of the protection domain in which volume resides. + + + protectionDomainName (, str, ) + Name of the protection domain in which volume resides. + + + snapshotPolicyId (, str, ) + ID of the snapshot policy associated with volume. + + + snapshotPolicyName (, str, ) + Name of the snapshot policy associated with volume. + + + snapshotsList (, str, ) + List of snapshots associated with the volume. + + + statistics (, dict, ) + Statistics details of the storage pool. + + + numOfChildVolumes (, int, ) + Number of child volumes. + + + numOfMappedSdcs (, int, ) + Number of mapped Sdcs of the volume. + + + + + + + +Status +------ + + + + + +Authors +~~~~~~~ + +- P Srinivas Rao (@srinivas-rao5) <ansible.team@dell.com> + |