From 4690e82e58f790c3330059cda6e9bd5d55c6c59f Mon Sep 17 00:00:00 2001 From: Kosta Mushkin Date: Thu, 29 May 2025 19:19:25 -0400 Subject: [PATCH] first full version of the exersises --- README.md | 14 +- diagrams/vpg-structure.drawio | 148 +++++ diagrams/vpg-structure.png | Bin 0 -> 200839 bytes .../05_vpg_operations/solution/create_vpg.py | 130 +++- .../05_vpg_operations/solution/manage_vms.py | 162 ----- .../05_vpg_operations/working/create_vpg.py | 181 ++++-- .../05_vpg_operations/working/manage_vms.py | 70 --- .../06_failover_test/solution/failover.py | 180 ++++++ .../06_failover_test/working/failover.py | 209 +++++-- exercises/07_bulk_operations/README.md | 167 +++-- .../export_vpg_settings_nics_to_csv.py | 250 ++++++++ .../import_vpg_settings_nics_from_csv.py | 588 ++++++++++++++++++ .../07_bulk_operations/working/bulk_ip.py | 82 --- .../07_bulk_operations/working/vm_list.csv | 6 - .../__pycache__/config.cpython-313.pyc | Bin 450 -> 434 bytes 15 files changed, 1707 insertions(+), 480 deletions(-) create mode 100644 diagrams/vpg-structure.drawio create mode 100644 diagrams/vpg-structure.png delete mode 100644 exercises/05_vpg_operations/solution/manage_vms.py delete mode 100644 exercises/05_vpg_operations/working/manage_vms.py create mode 100644 exercises/06_failover_test/solution/failover.py create mode 100644 exercises/07_bulk_operations/export_vpg_settings_nics_to_csv.py create mode 100644 exercises/07_bulk_operations/import_vpg_settings_nics_from_csv.py delete mode 100644 exercises/07_bulk_operations/working/bulk_ip.py delete mode 100644 exercises/07_bulk_operations/working/vm_list.csv diff --git a/README.md b/README.md index e27a594..32caf67 100644 --- a/README.md +++ b/README.md @@ -57,16 +57,24 @@ The lab is divided into 7 exercises: cd Zerto-Python-SDK-Hands-On-Labs ``` -2. Install required packages: +2. Create and activate a virtual environment: + ```bash + python3 -m venv venv + source venv/bin/activate # On Windows, use: venv\Scripts\activate + ``` + +3. Install required packages: ```bash pip install -r prerequisites/requirements.txt ``` -3. Set up your environment: +4. Set up your environment: - Copy `prerequisites/config.example.py` to `prerequisites/config.py` - Update the configuration with your ZVM details -4. Start with Exercise 1 in the `exercises` directory +5. Start with Exercise 1 in the `exercises` directory + +**Note:** When you're done working on the project, you can deactivate the virtual environment by typing `deactivate` in your terminal. ## Lab Completion diff --git a/diagrams/vpg-structure.drawio b/diagrams/vpg-structure.drawio new file mode 100644 index 0000000..216eacd --- /dev/null +++ b/diagrams/vpg-structure.drawio @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/diagrams/vpg-structure.png b/diagrams/vpg-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..6877b9f936379f07cc9e7f911a69f93a898e707b GIT binary patch literal 200839 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

39ERZ*AKYp?i?c)$KXmjSSva+Uj#$r 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≠fb7 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 1: # Keep at least one VM - vm_to_remove = vpg_vms[-1] # Remove the last VM - vm_identifier = vm_to_remove.get('VmIdentifier') - - task_id = client.vpgs.remove_vm_from_vpg(vpg_name, vm_identifier) - logging.info(f"Task ID: {task_id} to remove VM {vm_to_remove.get('VmName')} from VPG") - else: - logging.info("Skipping VM removal to maintain at least one VM in the VPG") - - except Exception as e: - logging.error(f"VM management failed: {str(e)}") - sys.exit(1) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/exercises/05_vpg_operations/working/create_vpg.py b/exercises/05_vpg_operations/working/create_vpg.py index 3b2bd01..7a46247 100644 --- a/exercises/05_vpg_operations/working/create_vpg.py +++ b/exercises/05_vpg_operations/working/create_vpg.py @@ -1,69 +1,172 @@ #!/usr/bin/env python3 """ -Exercise 5: VPG Operations - VPG Creation -This script demonstrates how to create and configure a VPG. +Exercise 5: VPG Operations - Template +This script demonstrates how to create and configure VPGs in your Zerto environment. + +Prerequisites: +1. Install the zvml package in development mode: + cd /path/to/zvml-python-sdk + pip install -e . +2. Update prerequisites/config.py with your ZVM details + +Usage: + python create_vpg.py --vm-names "vm1" "vm2" "vm3" [--vpg-name "My-VPG"] + +Your task: +1. Implement the find_vms_by_names function to locate VMs by their names +2. Complete the VPG configuration with appropriate settings +3. Add the found VMs to the VPG +4. Implement VM removal functionality + +The script should: +- Create a new VPG with basic settings +- Configure journal, recovery, and network settings +- Add specified VMs to the VPG +- Allow removing VMs from the VPG """ import sys +import os +import logging +import json +import argparse from pathlib import Path +import urllib3 -# Add the parent directory to the Python path to import the SDK -sys.path.append(str(Path(__file__).parent.parent.parent.parent)) +# Suppress SSL warnings +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +# Add prerequisites to Python path +prerequisites_path = Path(__file__).parent.parent.parent.parent / "prerequisites" +sys.path.append(str(prerequisites_path)) # Import the SDK modules -from zvml import ZertoClient -from zvml.vpgs import VPG -from zvml.common import ZertoVPGError +from zvml import ZVMLClient # Import configuration try: - from prerequisites.config import ( + from config import ( ZVM_HOST, ZVM_PORT, ZVM_SSL_VERIFY, - KEYCLOAK_SERVER_URL, - KEYCLOAK_REALM, CLIENT_ID, CLIENT_SECRET ) except ImportError: print("Error: Please copy config.example.py to config.py and update with your values") + print("Expected path:", prerequisites_path / "config.py") sys.exit(1) +def parse_arguments(): + """Parse command line arguments.""" + # TODO: Implement argument parsing + # Required arguments: + # --vm-names: List of VM names to add to the VPG + # Optional arguments: + # --vpg-name: Name of the VPG to create (default: "Test-VPG-Python") + pass + +def find_vms_by_names(client, site_identifier, vm_names): + """ + Find VMs by their names in the specified site. + + Args: + client: ZVMLClient instance + site_identifier: Identifier of the site to search in + vm_names: List of VM names to find + + Returns: + tuple: (list of found VMs, list of not found VM names) + + TODO: Implement the function to: + 1. Get all unprotected VMs from the site + 2. Create a dictionary for easy lookup + 3. Find requested as an argument VMs + 4. Return found and not found VMs + """ + pass + +def remove_vm_from_vpg(client, vpg_name, vm): + """ + Remove a VM from the VPG. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG + vm: VM object to remove + + TODO: Implement the function to: + 1. Get VM identifier + 2. Call the appropriate API to remove the VM + 3. Log the operation + """ + pass + def main(): """ Main function to demonstrate VPG creation. + + TODO: Implement the following steps: + 1. Parse command line arguments + 2. Create ZVMLClient instance + 3. Identify local and peer sites + 4. Get peer site resources (datastores, folders, networks, hosts) + 5. Create VPG configuration + 6. Create VPG + 7. Find and add VMs to VPG + 8. Implement interactive VM removal """ - # Step 1: Create and authenticate ZertoClient - # TODO: Initialize ZertoClient and authenticate - # Hint: Reuse the authentication code from previous exercises + # Set up logging + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' + ) - # Step 2: Get source and target sites - # TODO: Get local site and a peer site - # Hint: Use client.sites.get_local() and client.sites.list() - - # Step 3: Configure VPG settings - # TODO: Create VPG settings with required parameters - # Required settings: - # - VPG name - # - Source site - # - Target site - # - Journal history - # - RPO - # - Test network - # - Recovery network - - # Step 4: Create the VPG - # TODO: Create a new VPG with the configured settings - # Hint: Use client.vpgs.create() method - - # Step 5: Validate the VPG - # TODO: Validate the VPG configuration - # Hint: Use vpg.validate() method - - # Step 6: Handle errors - # TODO: Add error handling for VPG operations - # Hint: Use try/except blocks for ZertoVPGError + try: + # TODO: Step 1: Parse command line arguments + # args = parse_arguments() + + # TODO: Step 2: Create ZVMLClient instance + # client = ZVMLClient(...) + + # TODO: Step 3: Identify local and peer sites + # local_site = client.localsite.get_local_site() + # sites = client.virtualization_sites.get_virtualization_sites() + + # TODO: Step 4: Get peer site resources + # peer_datastores = client.virtualization_sites.get_virtualization_site_datastores(...) + # peer_folders = client.virtualization_sites.get_virtualization_site_folders(...) + # peer_networks = client.virtualization_sites.get_virtualization_site_networks(...) + # peer_hosts = client.virtualization_sites.get_virtualization_site_hosts(...) + + # TODO: Step 5: Create VPG configuration + # basic = { + # "Name": "Your VPG Name", + # "VpgType": "Remote", + # "RpoInSeconds": 300, + # "JournalHistoryInHours": 24, + # "Priority": "Medium", + # "UseWanCompression": True, + # "ProtectedSiteIdentifier": local_site_identifier, + # "RecoverySiteIdentifier": peer_site_identifier + # } + + # TODO: Step 6: Create VPG + # vpg_id = client.vpgs.create_vpg(...) + + # TODO: Step 7: Find and add VMs to VPG + # found_vms, not_found = find_vms_by_names(...) + # for vm in found_vms: + # # Add VM to VPG + + # TODO: Step 8: Implement interactive VM removal + # if found_vms: + # # Ask user if they want to remove the last VM + # # If yes, remove it + + except Exception as e: + logging.error(f"VPG operation failed: {str(e)}") + sys.exit(1) if __name__ == "__main__": main() \ No newline at end of file diff --git a/exercises/05_vpg_operations/working/manage_vms.py b/exercises/05_vpg_operations/working/manage_vms.py deleted file mode 100644 index 7cc2e07..0000000 --- a/exercises/05_vpg_operations/working/manage_vms.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -""" -Exercise 5: VPG Operations - VM Management -This script demonstrates how to manage VMs within a VPG. -""" - -import sys -from pathlib import Path - -# Add the parent directory to the Python path to import the SDK -sys.path.append(str(Path(__file__).parent.parent.parent.parent)) - -# Import the SDK modules -from zvml import ZertoClient -from zvml.vpgs import VPG -from zvml.common import ZertoVPGError - -# Import configuration -try: - from prerequisites.config import ( - ZVM_HOST, - ZVM_PORT, - ZVM_SSL_VERIFY, - KEYCLOAK_SERVER_URL, - KEYCLOAK_REALM, - CLIENT_ID, - CLIENT_SECRET - ) -except ImportError: - print("Error: Please copy config.example.py to config.py and update with your values") - sys.exit(1) - -def main(): - """ - Main function to demonstrate VM management in VPGs. - """ - # Step 1: Create and authenticate ZertoClient - # TODO: Initialize ZertoClient and authenticate - # Hint: Reuse the authentication code from previous exercises - - # Step 2: Get the VPG - # TODO: Find and get the VPG you want to manage - # Hint: Use client.vpgs.list() and client.vpgs.get() - - # Step 3: List current VMs in the VPG - # TODO: Get a list of VMs currently in the VPG - # Hint: Use vpg.get_vms() method - - # Step 4: Add VMs to the VPG - # TODO: Add one or more VMs to the VPG - # Required steps: - # - Find eligible VMs - # - Configure VM settings - # - Add VMs to VPG - # Hint: Use vpg.add_vms() method - - # Step 5: Remove VMs from the VPG - # TODO: Remove one or more VMs from the VPG - # Hint: Use vpg.remove_vms() method - - # Step 6: Validate VPG after changes - # TODO: Validate the VPG after VM changes - # Hint: Use vpg.validate() method - - # Step 7: Handle errors - # TODO: Add error handling for VM operations - # Hint: Use try/except blocks for ZertoVPGError - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/exercises/06_failover_test/solution/failover.py b/exercises/06_failover_test/solution/failover.py new file mode 100644 index 0000000..41e859f --- /dev/null +++ b/exercises/06_failover_test/solution/failover.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +""" +Exercise 6: Failover Testing - Solution +This script demonstrates how to perform a failover test on a VPG. + +Prerequisites: +1. Install the zvml package in development mode: + cd /path/to/zvml-python-sdk + pip install -e . +2. Update prerequisites/config.py with your ZVM details + +Usage: + python failover.py --vpg-name "My-VPG" + +This solution demonstrates: +- Finding a VPG by name +- Starting a failover test with default settings +- Monitoring test progress +- Stopping the test when requested +""" + +import sys +import os +import logging +import json +import argparse +import time +from pathlib import Path +import urllib3 + +# Suppress SSL warnings +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +# Add prerequisites to Python path +prerequisites_path = Path(__file__).parent.parent.parent.parent / "prerequisites" +sys.path.append(str(prerequisites_path)) + +# Import the SDK modules +from zvml import ZVMLClient + +# Import configuration +try: + from config import ( + ZVM_HOST, + ZVM_PORT, + ZVM_SSL_VERIFY, + CLIENT_ID, + CLIENT_SECRET + ) +except ImportError: + print("Error: Please copy config.example.py to config.py and update with your values") + print("Expected path:", prerequisites_path / "config.py") + sys.exit(1) + +def parse_arguments(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser(description='Perform failover test on a VPG') + parser.add_argument('--vpg-name', required=True, + help='Name of the VPG to test') + return parser.parse_args() + +def find_vpg_by_name(client, vpg_name): + """ + Find a VPG by its name. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG to find + + Returns: + dict: VPG object if found, None otherwise + """ + vpg = client.vpgs.list_vpgs(vpg_name=vpg_name) + # logging.info(f"Found vpg {json.dumps(vpg, indent=4)}") + return vpg if vpg else None + +def start_failover_test(client, vpg_name): + """ + Start a failover test for the specified VPG using default settings. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG to test + + Returns: + str: Test identifier + """ + logging.info(f"Starting failover test for VPG '{vpg_name}'") + + # Start the test with default settings + response = client.vpgs.failover_test( + vpg_name=vpg_name, + sync=True # Wait for the test to start + ) + + logging.info(f"Faiolver test response: {response}") + return response + +def monitor_test_progress(client, vpg_name, test_id): + """ + Monitor the progress of a failover test. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG + test_id: Test identifier + + Returns: + bool: True if test completed successfully, False otherwise + """ + test_status = client.vpgs.get_vpg_test_status(vpg_name, test_id) + status = test_status.get('Status') + progress = test_status.get('Progress', 0) + + logging.info(f"Test status: {status} (Progress: {progress}%)") + + if status == 'Succeeded': + return True + elif status in ['Failed', 'Stopped']: + logging.error(f"Test {status.lower()}: {test_status.get('Message', 'No message')}") + return False + + return False # Test is still running + +def stop_failover_test(client, vpg_name): + """ + Stop a running failover test. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG + """ + logging.info(f"Stopping faiolver test for VPG '{vpg_name}'...") + response = client.vpgs.stop_failover_test(vpg_name=vpg_name) + + logging.info(f"Stop failover test response: {response}") + +def main(): + """ + Main function to demonstrate failover testing. + """ + # Set up logging + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' + ) + + try: + # Step 1: Parse command line arguments + args = parse_arguments() + + # Step 2: Create ZVMLClient instance + logging.info(f"Initializing ZVMLClient for ZVM at {ZVM_HOST}") + client = ZVMLClient( + zvm_address=ZVM_HOST, + client_id=CLIENT_ID, + client_secret=CLIENT_SECRET, + verify_certificate=ZVM_SSL_VERIFY + ) + + # Step 3: Find the VPG + vpg = find_vpg_by_name(client, args.vpg_name) + if not vpg: + logging.error(f"VPG '{args.vpg_name}' not found!") + sys.exit(1) + + # Step 4: Start failover test + response = start_failover_test(client, args.vpg_name) + + # Step 5: Handle test stop request + response = input("\nWould you like to stop the test? (yes/no): ").lower() + if response in ['yes', 'y']: + stop_failover_test(client, args.vpg_name) + + except Exception as e: + logging.error(f"Failover test failed: {str(e)}") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/exercises/06_failover_test/working/failover.py b/exercises/06_failover_test/working/failover.py index 72f6870..af3b1eb 100644 --- a/exercises/06_failover_test/working/failover.py +++ b/exercises/06_failover_test/working/failover.py @@ -1,74 +1,197 @@ #!/usr/bin/env python3 """ -Exercise 6: Failover Testing -This script demonstrates how to perform and manage failover tests. +Exercise 6: Failover Testing - Template +This script demonstrates how to perform a failover test on a VPG. + +Prerequisites: +1. Install the zvml package in development mode: + cd /path/to/zvml-python-sdk + pip install -e . +2. Update prerequisites/config.py with your ZVM details + +Usage: + python failover.py --vpg-name "My-VPG" + +Your task: +1. Implement VPG lookup by name using get_vpgs() +2. Start a failover test using failover_test() method +3. Monitor test progress using get_vpg_test_status() +4. Stop the test using stop_vpg_test() method when requested + +The script should: +- Find the VPG by name and verify it exists +- Start a failover test with default settings +- Monitor the test progress and status +- Allow stopping the test when requested """ import sys +import os +import logging +import json +import argparse import time from pathlib import Path +import urllib3 -# Add the parent directory to the Python path to import the SDK -sys.path.append(str(Path(__file__).parent.parent.parent.parent)) +# Suppress SSL warnings +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +# Add prerequisites to Python path +prerequisites_path = Path(__file__).parent.parent.parent.parent / "prerequisites" +sys.path.append(str(prerequisites_path)) # Import the SDK modules -from zvml import ZertoClient -from zvml.vpgs import VPG -from zvml.common import ZertoVPGError +from zvml import ZVMLClient # Import configuration try: - from prerequisites.config import ( + from config import ( ZVM_HOST, ZVM_PORT, ZVM_SSL_VERIFY, - KEYCLOAK_SERVER_URL, - KEYCLOAK_REALM, CLIENT_ID, CLIENT_SECRET ) except ImportError: print("Error: Please copy config.example.py to config.py and update with your values") + print("Expected path:", prerequisites_path / "config.py") sys.exit(1) +def parse_arguments(): + """Parse command line arguments.""" + # TODO: Implement argument parsing + # Required argument: + # --vpg-name: Name of the VPG to test + pass + +def find_vpg_by_name(client, vpg_name): + """ + Find a VPG by its name using get_vpgs() method. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG to find + + Returns: + dict: VPG object if found, None otherwise + + TODO: Implement the function to: + 1. Call client.vpgs.get_vpgs() to get all VPGs + 2. Find the VPG with matching name + 3. Log the VPG details if found + 4. Return the VPG object or None + """ + pass + +def start_failover_test(client, vpg_name): + """ + Start a failover test for the specified VPG using failover_test() method. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG to test + + Returns: + str: Test identifier (task_id) + + TODO: Implement the function to: + 1. Call client.vpgs.failover_test() with sync=True + 2. Log the test initiation + 3. Return the task_id + """ + pass + +def monitor_test_progress(client, vpg_name, test_id): + """ + Monitor the progress of a failover test using get_vpg_test_status(). + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG + test_id: Test identifier (task_id) + + Returns: + bool: True if test completed successfully, False otherwise + + TODO: Implement the function to: + 1. Call client.vpgs.get_vpg_test_status() to get test status + 2. Log the status and progress + 3. Return True for 'Succeeded', False for 'Failed' or 'Stopped' + 4. Return False if test is still running + """ + pass + +def stop_failover_test(client, vpg_name, test_id): + """ + Stop a running failover test using stop_vpg_test() method. + + Args: + client: ZVMLClient instance + vpg_name: Name of the VPG + test_id: Test identifier (task_id) + + TODO: Implement the function to: + 1. Call client.vpgs.stop_vpg_test() with sync=True + 2. Wait for the stop operation to complete + 3. Log the stop operation status + """ + pass + def main(): """ Main function to demonstrate failover testing. + + TODO: Implement the following steps: + 1. Parse command line arguments for VPG name + 2. Create ZVMLClient instance + 3. Find the VPG by name using find_vpg_by_name() + 4. Start failover test using start_failover_test() + 5. Monitor test progress and handle stop request: + - Monitor progress using monitor_test_progress() + - If test completes successfully, exit + - If user requests to stop, call stop_failover_test() """ - # Step 1: Create and authenticate ZertoClient - # TODO: Initialize ZertoClient and authenticate - # Hint: Reuse the authentication code from previous exercises + # Set up logging + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' + ) - # Step 2: Get the VPG - # TODO: Find and get the VPG you want to test - # Hint: Use client.vpgs.list() and client.vpgs.get() - - # Step 3: Initiate failover test - # TODO: Start a failover test for the VPG - # Required steps: - # - Configure test settings - # - Start the test - # Hint: Use vpg.start_test() method - - # Step 4: Monitor test progress - # TODO: Monitor the test status until completion - # Required steps: - # - Get test status - # - Check for completion - # - Handle any errors - # Hint: Use vpg.get_test_status() method - - # Step 5: Stop the test - # TODO: Stop the running test - # Hint: Use vpg.stop_test() method - - # Step 6: Clean up - # TODO: Ensure proper cleanup after the test - # Hint: Check if any cleanup is needed - - # Step 7: Handle errors - # TODO: Add error handling for test operations - # Hint: Use try/except blocks for ZertoVPGError + try: + # TODO: Step 1: Parse command line arguments + # args = parse_arguments() + + # TODO: Step 2: Create ZVMLClient instance + # client = ZVMLClient(...) + + # TODO: Step 3: Find the VPG + # vpg = find_vpg_by_name(client, args.vpg_name) + # if not vpg: + # logging.error(f"VPG '{args.vpg_name}' not found!") + # sys.exit(1) + + # TODO: Step 4: Start failover test + # test_id = start_failover_test(client, args.vpg_name) + + # TODO: Step 5: Monitor test progress and handle stop request + # while True: + # success = monitor_test_progress(client, args.vpg_name, test_id) + # if success: + # logging.info("Test completed successfully") + # break + # + # # Check if user wants to stop the test + # response = input("\nWould you like to stop the test? (yes/no): ").lower() + # if response in ['yes', 'y']: + # stop_failover_test(client, args.vpg_name, test_id) + # break + # + # time.sleep(10) # Wait before next status check + + except Exception as e: + logging.error(f"Failover test failed: {str(e)}") + sys.exit(1) if __name__ == "__main__": main() \ No newline at end of file diff --git a/exercises/07_bulk_operations/README.md b/exercises/07_bulk_operations/README.md index 14709c2..6332968 100644 --- a/exercises/07_bulk_operations/README.md +++ b/exercises/07_bulk_operations/README.md @@ -1,57 +1,130 @@ -# Exercise 7: Bulk Operations +# Exercise 7: Bulk VPG NIC Settings Management -## Overview -This final exercise covers bulk operations, focusing on managing multiple VMs efficiently. You'll learn how to perform operations on multiple VMs simultaneously. - -## Objectives -- Perform bulk IP modifications -- Manage multiple VMs -- Handle bulk operations efficiently -- Monitor bulk task progress - -## Time -5 minutes +This exercise demonstrates how to perform bulk operations on VPG NIC settings using two provided scripts: +1. `export_vpg_settings_nics_to_csv.py` - Exports current VPG NIC settings to a CSV file +2. `import_vpg_settings_nics_from_csv.py` - Imports and applies NIC settings from a CSV file ## Prerequisites -- Completed Exercise 6 -- Working VPGs with multiple VMs -- Access to VM management -## Exercise Steps -1. Prepare VM list -2. Configure bulk operations -3. Execute bulk IP changes -4. Monitor operation progress -5. Verify changes +1. Python 3.6 or higher +2. Zerto Python SDK (`zvml` package) installed in development mode: + ```bash + cd /path/to/zvml-python-sdk + pip install -e . + ``` +3. Access to a Zerto Virtual Manager (ZVM) with appropriate permissions +4. VPGs already created and configured in your environment -## Working Directory -The `working` directory contains: -- `bulk_ip.py` - Template to complete -- `vm_list.csv` - Sample VM list +## Exercise Overview -## Solution -The `solution` directory contains: -- `bulk_ip.py` - Complete working example -- `vm_list.csv` - Example VM list +This exercise will guide you through the process of: +1. Exporting current VPG NIC settings to a CSV file +2. Modifying the CSV file to update IP configurations +3. Importing and applying the updated settings back to the VPGs -## Key Concepts -- Bulk operations -- IP management -- Task monitoring -- Error handling +## Step 1: Export Current VPG Settings -## Common Issues -- Invalid IP configurations -- Operation timeouts -- Partial failures -- Resource constraints +Use the export script to save current VPG NIC settings to a CSV file: -## Lab Completion -Congratulations! You have completed all exercises in the Zerto Python SDK Hands-On Lab. You should now have a good understanding of: -- Zerto API basics -- Authentication and connection -- Site and resource management -- VPG operations -- Testing and bulk operations +```bash +python export_vpg_settings_nics_to_csv.py \ + --zvm_address "192.168.111.20" \ + --client_id "zerto-api" \ + --client_secret "your-secret-here" \ + --vpg_names "VpgTest1,VpgTest2" \ + --ignore_ssl +``` -Please complete the feedback form to help us improve the lab content. \ No newline at end of file +The script will create two files: +- `ExportedSettings_[timestamp].json` - Full VPG settings in JSON format +- `ExportedSettings_[timestamp].csv` - NIC settings in CSV format + +## Step 2: Modify the CSV File + +Open the generated CSV file in a spreadsheet application (e.g., Microsoft Excel, Google Sheets) and modify the following settings as needed: + +1. **Failover Network Settings**: + - `Failover ShouldReplaceIpConfiguration` - Set to "True" to modify IP settings + - `Failover Network` - Network identifier for failover + - `Failover DHCP` - Set to "True" for DHCP or "False" for static IP + - `Failover IP` - Static IP address (required if DHCP is False) + - `Failover Subnet` - Subnet mask (required if DHCP is False) + - `Failover Gateway` - Default gateway (optional) + - `Failover DNS1` - Primary DNS server (optional) + - `Failover DNS2` - Secondary DNS server (optional) + +2. **Failover Test Network Settings**: + - `Failover Test ShouldReplaceIpConfiguration` - Set to "True" to modify IP settings + - `Failover Test Network` - Network identifier for test failover + - `Failover Test DHCP` - Set to "True" for DHCP or "False" for static IP + - `Failover Test IP` - Static IP address (required if DHCP is False) + - `Failover Test Subnet` - Subnet mask (required if DHCP is False) + - `Failover Test Gateway` - Default gateway (optional) + - `Failover Test DNS1` - Primary DNS server (optional) + - `Failover Test DNS2` - Secondary DNS server (optional) + +## Step 3: Import Updated Settings + +Use the import script to apply the modified settings: + +```bash +python import_vpg_settings_nics_from_csv.py \ + --zvm_address "192.168.111.20" \ + --client_id "zerto-api" \ + --client_secret "your-secret-here" \ + --csv_file "ExportedSettings_2024-03-14_12-34-56.csv" \ + --vpg_names "VpgTest1,VpgTest2" \ + --ignore_ssl +``` + +The script will: +1. Validate the settings in the CSV file +2. Show a summary of changes to be applied +3. Ask for confirmation before applying changes +4. Apply the changes and commit them to the VPGs + +## Important Notes + +1. **Backup**: Always keep a backup of the original CSV file before making changes +2. **Validation**: The import script validates settings before applying them: + - Checks for conflicting DHCP and static IP settings + - Verifies required fields are present + - Ensures network identifiers are valid +3. **Safety**: The script requires explicit confirmation before applying changes +4. **Rollback**: If needed, you can re-import the original settings from the backup CSV + +## Common Use Cases + +1. **Bulk IP Address Changes**: + - Export current settings + - Update IP addresses in the CSV + - Import modified settings + +2. **Network Migration**: + - Export current settings + - Update network identifiers + - Import modified settings + +3. **DHCP to Static IP Conversion**: + - Export current settings + - Set `ShouldReplaceIpConfiguration` to "True" + - Set `DHCP` to "False" + - Add static IP settings + - Import modified settings + +## Troubleshooting + +1. **Validation Errors**: + - Ensure `ShouldReplaceIpConfiguration` is set to "True" when modifying IP settings + - Check that DHCP and static IP settings are not conflicting + - Verify all required fields are filled when using static IP + +2. **Import Failures**: + - Verify network identifiers exist in the target site + - Check that IP addresses are in the correct format + - Ensure you have sufficient permissions on the ZVM + +3. **CSV Format Issues**: + - Keep the original column headers + - Don't modify the `VPG Name`, `VM Identifier`, or `NIC Identifier` columns + - Use "True" or "False" (case-insensitive) for boolean values \ No newline at end of file diff --git a/exercises/07_bulk_operations/export_vpg_settings_nics_to_csv.py b/exercises/07_bulk_operations/export_vpg_settings_nics_to_csv.py new file mode 100644 index 0000000..2e38dbd --- /dev/null +++ b/exercises/07_bulk_operations/export_vpg_settings_nics_to_csv.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python3 + +# Legal Disclaimer +# This script is an example script and is not supported under any Zerto support program or service. +# The author and Zerto further disclaim all implied warranties including, without limitation, +# any implied warranties of merchantability or of fitness for a particular purpose. +# In no event shall Zerto, its authors or anyone else involved in the creation, +# production or delivery of the scripts be liable for any damages whatsoever (including, +# without limitation, damages for loss of business profits, business interruption, loss of business +# information, or other pecuniary loss) arising out of the use of or the inability to use the sample +# scripts or documentation, even if the author or Zerto has been advised of the possibility of such damages. +# The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. +import argparse +import logging +import json +import csv +import sys +import os +from pathlib import Path +import urllib3 +from typing import List, Dict +import codecs + +# Add parent directory to path to import zvml +sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) +from zvml import ZVMLClient + +# Disable SSL warnings +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +# Setup logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) + + +""" +Zerto VPG NIC Settings Export Script + +This script exports Virtual Protection Group (VPG) NIC settings to a CSV file, focusing on network +and IP configuration details. It's designed to help with bulk management of VPG NIC settings. + +Key Features: +1. VPG NIC Settings Export: + - Export NIC settings for specific VPGs or all VPGs + - Save settings to both JSON and CSV formats + - Include network and IP configuration details + - Capture DHCP and static IP settings + +2. CSV Format: + - Organized by VPG, VM, and NIC + - Includes network identifiers + - DHCP settings (True/False) + - Static IP configuration (IP, Subnet, Gateway, DNS) + - ShouldReplaceIpConfiguration flag + +3. Settings Management: + - Export current VPG settings + - Convert to CSV format + - Save with timestamp + - Support for Windows line endings + +Required Arguments: + --zvm_address: ZVM address + --client_id: Keycloak client ID + --client_secret: Keycloak client secret + --ignore_ssl: Ignore SSL certificate verification (optional) + --vpg_names: Comma-separated list of VPG names to export (optional) + +Example Usage: + python export_vpg_settings_nics_to_csv.py \ + --zvm_address "192.168.111.20" \ + --client_id "zerto-api" \ + --client_secret "your-secret-here" \ + --vpg_names "VpgTest1,VpgTest2" \ + --ignore_ssl + +Output Files: + - ExportedSettings_[timestamp].json: Full VPG settings in JSON format + - ExportedSettings_[timestamp].csv: NIC settings in CSV format + +Note: This script is part of a pair with import_vpg_settings_nics_from_csv.py, allowing for +export and import of VPG NIC settings in bulk. The CSV format is designed to be easily +editable in spreadsheet applications. +""" + +def setup_client(args): + """Initialize and return Zerto client""" + client = ZVMLClient( + zvm_address=args.zvm_address, + client_id=args.client_id, + client_secret=args.client_secret, + verify_certificate=not args.ignore_ssl + ) + return client + +def extract_nic_settings(json_data): + """Extract NIC settings from VPG JSON data.""" + nic_settings = [] + + for vpg in json_data: + vpg_name = vpg['Basic']['Name'] + + for vm in vpg['Vms']: + vm_id = vm['VmIdentifier'] + + for nic in vm['Nics']: + nic_id = nic['NicIdentifier'] + + # Extract failover settings + failover = nic['Failover']['Hypervisor'] if nic['Failover'] and nic['Failover']['Hypervisor'] else {} + failover_network = failover.get('NetworkIdentifier', '') + failover_ip_config = failover.get('IpConfig', {}) or {} + + # Extract failover test settings + failover_test = nic['FailoverTest']['Hypervisor'] if nic['FailoverTest'] and nic['FailoverTest']['Hypervisor'] else {} + failover_test_network = failover_test.get('NetworkIdentifier', '') + failover_test_ip_config = failover_test.get('IpConfig', {}) or {} + + # Create a row for each NIC + row = { + 'VPG Name': vpg_name, + 'VM Identifier': vm_id, + 'NIC Identifier': nic_id, + 'Failover Network': failover_network, + 'Failover ShouldReplaceIpConfiguration': str(failover.get('ShouldReplaceIpConfiguration', False)), + 'Failover DHCP': str(failover_ip_config.get('IsDhcp', False)), + 'Failover IP': failover_ip_config.get('StaticIp', ''), + 'Failover Subnet': failover_ip_config.get('SubnetMask', ''), + 'Failover Gateway': failover_ip_config.get('Gateway', ''), + 'Failover DNS1': failover_ip_config.get('PrimaryDns', ''), + 'Failover DNS2': failover_ip_config.get('SecondaryDns', ''), + 'Failover Test Network': failover_test_network, + 'Failover Test ShouldReplaceIpConfiguration': str(failover_test.get('ShouldReplaceIpConfiguration', False)), + 'Failover Test DHCP': str(failover_test_ip_config.get('IsDhcp', False)), + 'Failover Test IP': failover_test_ip_config.get('StaticIp', ''), + 'Failover Test Subnet': failover_test_ip_config.get('SubnetMask', ''), + 'Failover Test Gateway': failover_test_ip_config.get('Gateway', ''), + 'Failover Test DNS1': failover_test_ip_config.get('PrimaryDns', ''), + 'Failover Test DNS2': failover_test_ip_config.get('SecondaryDns', '') + } + nic_settings.append(row) + + return nic_settings + +def get_safe_filename(timestamp): + """Convert timestamp to a URL-safe filename.""" + # Replace colons with underscores and remove any other problematic characters + return timestamp.replace(':', '_').replace('/', '_').replace('\\', '_') + +def setup_argparse() -> argparse.ArgumentParser: + """Set up command line argument parsing.""" + parser = argparse.ArgumentParser(description="Export VPG settings to CSV") + parser.add_argument("--zvm_address", required=True, help="ZVM address") + parser.add_argument('--client_id', required=True, help='Keycloak client ID') + parser.add_argument('--client_secret', required=True, help='Keycloak client secret') + parser.add_argument("--ignore_ssl", action="store_true", help="Ignore SSL certificate verification") + parser.add_argument("--vpg_names", help="Comma-separated list of VPG names to export (optional)") + parser.add_argument("--output_dir", default='.', help="Directory to save exported files (default: current directory)") + return parser + +def ensure_output_dir(output_dir: str) -> None: + """Ensure the output directory exists.""" + if not os.path.exists(output_dir): + os.makedirs(output_dir) + logging.info(f"Created output directory: {output_dir}") + +def main(): + parser = setup_argparse() + args = parser.parse_args() + + try: + # Ensure output directory exists + ensure_output_dir(args.output_dir) + + # Setup client + client = setup_client(args) + + # Process VPG names if provided + vpg_names = None + if args.vpg_names: + vpg_names = [name.strip() for name in args.vpg_names.split(',')] + logging.info(f"Exporting settings for VPGs: {vpg_names}") + else: + logging.info("No VPG names provided, exporting all VPGs") + + # Export VPG settings + print("\nExporting VPG settings...") + export_result = client.vpgs.export_vpg_settings(vpg_names) + + if not export_result or 'TimeStamp' not in export_result: + logging.error("Failed to export VPG settings") + sys.exit(1) + + timestamp = export_result['TimeStamp'] + safe_timestamp = get_safe_filename(timestamp) + print(f"Export completed successfully. Timestamp: {timestamp}") + + # Get the exported settings + export_settings = client.vpgs.read_exported_vpg_settings(timestamp, vpg_names) + + # Save the JSON export + json_file_name = os.path.join(args.output_dir, f"ExportedSettings_{safe_timestamp}.json") + with open(json_file_name, 'w') as f: + json.dump(export_settings['ExportedVpgSettingsApi'], f, indent=2) + print(f"\nJSON export saved to: {json_file_name}") + + # Convert to CSV + nic_settings = extract_nic_settings(export_settings['ExportedVpgSettingsApi']) + + # Create CSV file with Windows line endings + csv_file_name = os.path.join(args.output_dir, f"ExportedSettings_{safe_timestamp}.csv") + fieldnames = [ + 'VPG Name', 'VM Identifier', 'NIC Identifier', + 'Failover Network', 'Failover ShouldReplaceIpConfiguration', 'Failover DHCP', + 'Failover IP', 'Failover Subnet', 'Failover Gateway', + 'Failover DNS1', 'Failover DNS2', + 'Failover Test Network', 'Failover Test ShouldReplaceIpConfiguration', 'Failover Test DHCP', + 'Failover Test IP', 'Failover Test Subnet', + 'Failover Test Gateway', 'Failover Test DNS1', 'Failover Test DNS2' + ] + + # Write CSV content directly + with open(csv_file_name, 'w', newline='') as f: + writer = csv.DictWriter( + f, + fieldnames=fieldnames, + delimiter=',', + quoting=csv.QUOTE_ALL, + quotechar='"', + lineterminator='\r\n' + ) + writer.writeheader() + for row in nic_settings: + # Ensure all fields are present and properly formatted + for field in fieldnames: + if field not in row: + row[field] = '' + # No need to convert boolean values since they're already strings + writer.writerow(row) + + print(f"CSV file created: {csv_file_name}") + + except Exception as e: + logging.exception("Error occurred:") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/exercises/07_bulk_operations/import_vpg_settings_nics_from_csv.py b/exercises/07_bulk_operations/import_vpg_settings_nics_from_csv.py new file mode 100644 index 0000000..b9b2926 --- /dev/null +++ b/exercises/07_bulk_operations/import_vpg_settings_nics_from_csv.py @@ -0,0 +1,588 @@ +#!/usr/bin/env python3 + +# Legal Disclaimer +# This script is an example script and is not supported under any Zerto support program or service. +# The author and Zerto further disclaim all implied warranties including, without limitation, +# any implied warranties of merchantability or of fitness for a particular purpose. +# In no event shall Zerto, its authors or anyone else involved in the creation, +# production or delivery of the scripts be liable for any damages whatsoever (including, +# without limitation, damages for loss of business profits, business interruption, loss of business +# information, or other pecuniary loss) arising out of the use of or the inability to use the sample +# scripts or documentation, even if the author or Zerto has been advised of the possibility of such damages. +# The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. +import argparse +import logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) +import json +import csv +import sys +import os +from pathlib import Path +import urllib3 +from typing import List, Dict, Tuple +from datetime import datetime + +# Add parent directory to path to import zvml +sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) +from zvml import ZVMLClient + +# Disable SSL warnings +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + +""" +Zerto VPG NIC Settings Import Script + +This script imports Virtual Protection Group (VPG) NIC settings from a CSV file, allowing for +bulk updates of network and IP configurations. It's designed to work with the exported CSV +from export_vpg_settings_nics_to_csv.py. + +Key Features: +1. VPG NIC Settings Import: + - Import NIC settings from CSV file + - Update specific VPGs or all VPGs + - Validate settings before applying + - Support for both DHCP and static IP configurations + +2. Settings Validation: + - Validate DHCP and static IP settings + - Check ShouldReplaceIpConfiguration flag + - Ensure no conflicting configurations + - Verify network identifiers + +3. Bulk Updates: + - Process multiple VPGs in one operation + - Show changes before applying + - Require confirmation before updates + - Detailed logging of changes + +Required Arguments: + --zvm_address: ZVM address + --client_id: Keycloak client ID + --client_secret: Keycloak client secret + --ignore_ssl: Ignore SSL certificate verification (optional) + --csv_file: Path to the CSV file with updated settings + --vpg_names: Comma-separated list of VPG names to update (optional) + +Example Usage: + python import_vpg_settings_nics_from_csv.py \ + --zvm_address "192.168.111.20" \ + --client_id "zerto-api" \ + --client_secret "your-secret-here" \ + --csv_file "ExportedSettings_2024-05-12.csv" \ + --vpg_names "VpgTest1,VpgTest2" \ + --ignore_ssl + +CSV Format Requirements: + - Must include VPG Name, VM Identifier, and NIC Identifier + - DHCP values must be "True" or "False" (case-insensitive) + - ShouldReplaceIpConfiguration must be "True" to modify IP settings + - Static IP settings (IP, Subnet, Gateway, DNS) are optional when DHCP is True + +Note: This script is part of a pair with export_vpg_settings_nics_to_csv.py. It's designed +to safely update VPG NIC settings in bulk, with validation and confirmation steps to +prevent unintended changes. +""" + +def setup_client(args): + """Initialize and return Zerto client""" + client = ZVMLClient( + zvm_address=args.zvm_address, + client_id=args.client_id, + client_secret=args.client_secret, + verify_certificate=not args.ignore_ssl + ) + return client + +def read_csv_settings(csv_path: str) -> List[Dict]: + """Read settings from CSV file.""" + settings = [] + with open(csv_path, 'r', newline='') as f: + reader = csv.DictReader(f) + for row in reader: + settings.append(row) + return settings + +def get_current_settings(client: ZVMLClient, vpg_names: List[str] = None) -> Tuple[str, List[Dict]]: + """Get current VPG settings and convert to CSV format.""" + # Export current settings + export_result = client.vpgs.export_vpg_settings(vpg_names) + if not export_result or 'TimeStamp' not in export_result: + raise Exception("Failed to export VPG settings") + + timestamp = export_result['TimeStamp'] + export_settings = client.vpgs.read_exported_vpg_settings(timestamp, vpg_names) + # logging.info(f"get_current_settings: export_settings: {json.dumps(export_settings, indent=4)}") + # Convert to CSV format + nic_settings = [] + for vpg in export_settings['ExportedVpgSettingsApi']: + vpg_name = vpg['Basic']['Name'] + for vm in vpg['Vms']: + vm_id = vm['VmIdentifier'] + for nic in vm['Nics']: + nic_id = nic['NicIdentifier'] + + # Extract failover settings + failover = nic['Failover']['Hypervisor'] if nic['Failover'] and nic['Failover']['Hypervisor'] else {} + failover_network = failover.get('NetworkIdentifier', '') + failover_ip_config = failover.get('IpConfig', {}) or {} + + # Extract failover test settings + failover_test = nic['FailoverTest']['Hypervisor'] if nic['FailoverTest'] and nic['FailoverTest']['Hypervisor'] else {} + failover_test_network = failover_test.get('NetworkIdentifier', '') + failover_test_ip_config = failover_test.get('IpConfig', {}) or {} + + row = { + 'VPG Name': vpg_name, + 'VM Identifier': vm_id, + 'NIC Identifier': nic_id, + 'Failover Network': failover_network, + 'Failover ShouldReplaceIpConfiguration': str(failover.get('ShouldReplaceIpConfiguration', False)), + 'Failover DHCP': str(failover_ip_config.get('IsDhcp', False)), + 'Failover IP': failover_ip_config.get('StaticIp', ''), + 'Failover Subnet': failover_ip_config.get('SubnetMask', ''), + 'Failover Gateway': failover_ip_config.get('Gateway', ''), + 'Failover DNS1': failover_ip_config.get('PrimaryDns', ''), + 'Failover DNS2': failover_ip_config.get('SecondaryDns', ''), + 'Failover Test Network': failover_test_network, + 'Failover Test ShouldReplaceIpConfiguration': str(failover_test.get('ShouldReplaceIpConfiguration', False)), + 'Failover Test DHCP': str(failover_test_ip_config.get('IsDhcp', False)), + 'Failover Test IP': failover_test_ip_config.get('StaticIp', ''), + 'Failover Test Subnet': failover_test_ip_config.get('SubnetMask', ''), + 'Failover Test Gateway': failover_test_ip_config.get('Gateway', ''), + 'Failover Test DNS1': failover_test_ip_config.get('PrimaryDns', ''), + 'Failover Test DNS2': failover_test_ip_config.get('SecondaryDns', '') + } + nic_settings.append(row) + + return timestamp, nic_settings + +def normalize_value(value): + """Normalize values for comparison.""" + # Treat None, empty string, and 'None' as the same + if value in ['', None, 'None', 'null']: + return '' + if isinstance(value, bool): + return str(value).lower() + if isinstance(value, str): + value = value.lower() + if value == 'true': + return 'true' + if value == 'false': + return 'false' + return str(value) + +def compare_settings(client, current: List[Dict], updated: List[Dict]) -> List[Dict]: + """Compare current and updated settings and return changes.""" + changes = [] + + # Create lookup dictionaries for faster comparison + current_lookup = { + (row['VPG Name'], row['VM Identifier'], row['NIC Identifier']): row + for row in current + } + + def validate_dhcp_settings(client, row: Dict, vpg_name: str, vm_id: str, nic_id: str): + """Validate that DHCP and IP settings are not conflicting.""" + vm_name = client.vms.list_vms(vm_identifier=vm_id).get('VmName') + + def validate_ip_settings(prefix: str): + should_replace = normalize_value(row.get(f'{prefix} ShouldReplaceIpConfiguration', '')) == 'true' + dhcp = normalize_value(row.get(f'{prefix} DHCP', '')) == 'true' + has_static_ip = any(row.get(f'{prefix} {field}') for field in ['IP', 'Subnet', 'Gateway', 'DNS1', 'DNS2']) + + if not should_replace and (dhcp or has_static_ip): + raise ValueError( + f"Invalid configuration for VPG '{vpg_name}', VM Name '{vm_name}', VM ID '{vm_id}', NIC '{nic_id}': " + f"{prefix} ShouldReplaceIpConfiguration is False but IP settings are present. " + f"Set ShouldReplaceIpConfiguration to True to modify IP settings." + ) + + if should_replace and not dhcp and not has_static_ip: + raise ValueError( + f"Invalid configuration for VPG '{vpg_name}', VM Name '{vm_name}', VM ID '{vm_id}', NIC '{nic_id}': " + f"{prefix} ShouldReplaceIpConfiguration is True but no IP configuration is provided. " + f"Either set DHCP=True or provide IP configuration (IP, Subnet, Gateway, DNS1, DNS2)." + ) + + if dhcp and has_static_ip: + raise ValueError( + f"Invalid configuration for VPG '{vpg_name}', VM Name '{vm_name}', VM ID '{vm_id}', NIC '{nic_id}': " + f"Cannot have {prefix} DHCP=True and static IP settings. " + f"Please remove static IP settings or set DHCP=False." + ) + + # Validate both failover and failover test settings + validate_ip_settings('Failover') + validate_ip_settings('Failover Test') + + for updated_row in updated: + key = (updated_row['VPG Name'], updated_row['VM Identifier'], updated_row['NIC Identifier']) + + # Validate DHCP settings before processing changes + validate_dhcp_settings( + client, + updated_row, + updated_row['VPG Name'], + updated_row['VM Identifier'], + updated_row['NIC Identifier'] + ) + + if key in current_lookup: + current_row = current_lookup[key] + row_changes = {} + + # Compare each field + for field in updated_row: + if field in ['VPG Name', 'VM Identifier', 'NIC Identifier']: + continue + + current_value = normalize_value(current_row.get(field, '')) + updated_value = normalize_value(updated_row.get(field, '')) + + # Only include the change if the values are different after normalization + if current_value != updated_value: + row_changes[field] = { + 'current': current_row.get(field, ''), + 'updated': updated_row.get(field, '') + } + + if row_changes: + vm_name = client.vms.list_vms(vm_identifier=updated_row['VM Identifier']).get('VmName') + logging.info(f"compare_settings: vm_name {vm_name}") + + changes.append({ + 'VPG Name': updated_row['VPG Name'], + 'VM Identifier': updated_row['VM Identifier'], + 'NIC Identifier': updated_row['NIC Identifier'], + 'VM Name': vm_name, + 'changes': row_changes + }) + + return changes + +def display_changes(client, changes: List[Dict]): + """Display changes in a user-friendly format.""" + if not changes: + print("\nNo changes found in the CSV file.") + return + + # Group changes by VPG + vpg_changes = {} + for change in changes: + vpg_name = change['VPG Name'] + if vpg_name not in vpg_changes: + vpg_changes[vpg_name] = {} + + vm_id = change['VM Identifier'] + if vm_id not in vpg_changes[vpg_name]: + vpg_changes[vpg_name][vm_id] = {} + + nic_id = change['NIC Identifier'] + vpg_changes[vpg_name][vm_id][nic_id] = change['changes'] + + print("\nThe following changes will be applied:") + print("=" * 80) + + for vpg_name, vm_changes in vpg_changes.items(): + # Skip VPGs with no actual changes + has_vpg_changes = False + for vm_id, nic_changes in vm_changes.items(): + for nic_id, changes in nic_changes.items(): + if any(values['current'] != values['updated'] for values in changes.values()): + has_vpg_changes = True + break + if has_vpg_changes: + break + + if not has_vpg_changes: + continue + + print(f"\nVPG: {vpg_name}") + print("-" * 40) + + for vm_id, nic_changes in vm_changes.items(): + # Skip VMs with no actual changes + has_vm_changes = False + for nic_id, changes in nic_changes.items(): + if any(values['current'] != values['updated'] for values in changes.values()): + has_vm_changes = True + break + + if not has_vm_changes: + continue + + vm_name = client.vms.list_vms(vm_identifier=vm_id).get('VmName') + print(f" VM name: {vm_name}, VM ID: {vm_id}") + + for nic_id, changes in nic_changes.items(): + # Skip NICs with no actual changes + if not any(values['current'] != values['updated'] for values in changes.values()): + continue + + print(f" NIC: {nic_id}") + print(" Changes:") + for field, values in changes.items(): + # Only show fields that have actual changes + if values['current'] != values['updated']: + print(f" {field}:") + print(f" Current: {values['current']}") + print(f" Updated: {values['updated']}") + print() + + print("=" * 80) + print(f"\nTotal changes: {len(changes)} NIC(s) across {len(vpg_changes)} VPG(s)") + +def update_vpg_settings(client: ZVMLClient, changes: List[Dict]): + """Update VPG settings based on changes.""" + # Group changes by VPG + vpg_changes = {} + for change in changes: + vpg_name = change['VPG Name'] + if vpg_name not in vpg_changes: + vpg_changes[vpg_name] = [] + vpg_changes[vpg_name].append(change) + + # Process each VPG + for vpg_name, vpg_change_list in vpg_changes.items(): + logging.info(f"update_vpg_settings: Processing VPG: {vpg_name}") + logging.info(f"update_vpg_settings: VPG change list: {json.dumps(vpg_change_list, indent=4)}") + + # Get VPG identifier + vpg_info = client.vpgs.list_vpgs(vpg_name=vpg_name) + if not vpg_info: + logging.error(f"update_vpg_settings: VPG {vpg_name} not found") + continue + vpg_identifier = vpg_info['VpgIdentifier'] + + # Create new VPG settings + vpg_settings_id = client.vpgs.create_vpg_settings(vpg_identifier=vpg_identifier) + vpg_settings = client.vpgs.get_vpg_settings_by_id(vpg_settings_id) + logging.info(f"update_vpg_settings: VPG settings: {json.dumps(vpg_settings, indent=4)}") + + # Process each NIC change + for change in vpg_change_list: + vm_id = change['VM Identifier'] + nic_id = change['NIC Identifier'] + vm_name = change['VM Name'] + logging.info(f"update_vpg_settings: Processing NIC: {nic_id} for VM: {vm_name} VM ID: {vm_id}") + # Find the VM and NIC in the settings + vm = None + for v in vpg_settings['Vms']: + if v['VmIdentifier'] == vm_id: + vm = v + # logging.info(f"update_vpg_settings: Found VM: {vm_id} in VPG {vpg_name} vm={json.dumps(vm, indent=4)}") + break + + if not vm: + logging.error(f"update_vpg_settings: VM {vm_id} not found in VPG {vpg_name}") + continue + + # Find the NIC + nic = None + for n in vm['Nics']: + if n['NicIdentifier'] == nic_id: + nic = n + logging.info(f"update_vpg_settings: Found NIC: {nic_id} in VM {vm_name} VPG {vpg_name} nic={json.dumps(nic, indent=4)}") + break + + if not nic: + logging.error(f"update_vpg_settings: NIC {nic_id} not found in VM {vm_id}") + continue + + # Initialize structures if needed + if not nic.get('Failover'): + nic['Failover'] = {'Hypervisor': {}} + if not nic.get('FailoverTest'): + nic['FailoverTest'] = {'Hypervisor': {}} + + # Process each change for this NIC + for field, values in change['changes'].items(): + # Handle Failover settings + if field in ['Failover Network', 'Failover ShouldReplaceIpConfiguration', 'Failover IP', + 'Failover Subnet', 'Failover Gateway', 'Failover DNS1', 'Failover DNS2', + 'Failover DHCP']: + if field == 'Failover ShouldReplaceIpConfiguration': + nic['Failover']['Hypervisor']['ShouldReplaceIpConfiguration'] = normalize_value(values['updated']) == 'true' + elif field == 'Failover Network': + nic['Failover']['Hypervisor']['NetworkIdentifier'] = values['updated'] + elif field == 'Failover DHCP': + if not nic['Failover']['Hypervisor'].get('IpConfig'): + nic['Failover']['Hypervisor']['IpConfig'] = { + 'StaticIp': None, + 'SubnetMask': None, + 'Gateway': None, + 'PrimaryDns': None, + 'SecondaryDns': None, + 'IsDhcp': False + } + nic['Failover']['Hypervisor']['IpConfig']['IsDhcp'] = normalize_value(values['updated']) == 'true' + # If DHCP is enabled, clear other IP settings + if normalize_value(values['updated']) == 'true': + nic['Failover']['Hypervisor']['IpConfig'].update({ + 'StaticIp': None, + 'SubnetMask': None, + 'Gateway': None, + 'PrimaryDns': None, + 'SecondaryDns': None + }) + elif field in ['Failover IP', 'Failover Subnet', 'Failover Gateway', + 'Failover DNS1', 'Failover DNS2']: + if not nic['Failover']['Hypervisor'].get('IpConfig'): + nic['Failover']['Hypervisor']['IpConfig'] = { + 'StaticIp': None, + 'SubnetMask': None, + 'Gateway': None, + 'PrimaryDns': None, + 'SecondaryDns': None, + 'IsDhcp': False + } + if field == 'Failover IP': + nic['Failover']['Hypervisor']['IpConfig']['StaticIp'] = values['updated'] if values['updated'] else None + elif field == 'Failover Subnet': + nic['Failover']['Hypervisor']['IpConfig']['SubnetMask'] = values['updated'] if values['updated'] else '255.255.255.0' + elif field == 'Failover Gateway': + nic['Failover']['Hypervisor']['IpConfig']['Gateway'] = values['updated'] if values['updated'] else None + elif field == 'Failover DNS1': + nic['Failover']['Hypervisor']['IpConfig']['PrimaryDns'] = values['updated'] if values['updated'] else None + elif field == 'Failover DNS2': + nic['Failover']['Hypervisor']['IpConfig']['SecondaryDns'] = values['updated'] if values['updated'] else None + + # Handle Failover Test settings + elif field in ['Failover Test Network', 'Failover Test ShouldReplaceIpConfiguration', + 'Failover Test IP', 'Failover Test Subnet', 'Failover Test Gateway', + 'Failover Test DNS1', 'Failover Test DNS2', 'Failover Test DHCP']: + if field == 'Failover Test ShouldReplaceIpConfiguration': + nic['FailoverTest']['Hypervisor']['ShouldReplaceIpConfiguration'] = normalize_value(values['updated']) == 'true' + elif field == 'Failover Test Network': + nic['FailoverTest']['Hypervisor']['NetworkIdentifier'] = values['updated'] + elif field == 'Failover Test DHCP': + if not nic['FailoverTest']['Hypervisor'].get('IpConfig'): + nic['FailoverTest']['Hypervisor']['IpConfig'] = { + 'StaticIp': None, + 'SubnetMask': None, + 'Gateway': None, + 'PrimaryDns': None, + 'SecondaryDns': None, + 'IsDhcp': False + } + nic['FailoverTest']['Hypervisor']['IpConfig']['IsDhcp'] = normalize_value(values['updated']) == 'true' + # If DHCP is enabled, clear other IP settings + if normalize_value(values['updated']) == 'true': + nic['FailoverTest']['Hypervisor']['IpConfig'].update({ + 'StaticIp': None, + 'SubnetMask': None, + 'Gateway': None, + 'PrimaryDns': None, + 'SecondaryDns': None + }) + elif field in ['Failover Test IP', 'Failover Test Subnet', 'Failover Test Gateway', + 'Failover Test DNS1', 'Failover Test DNS2']: + if not nic['FailoverTest']['Hypervisor'].get('IpConfig'): + nic['FailoverTest']['Hypervisor']['IpConfig'] = { + 'StaticIp': None, + 'SubnetMask': None, + 'Gateway': None, + 'PrimaryDns': None, + 'SecondaryDns': None, + 'IsDhcp': False + } + if field == 'Failover Test IP': + nic['FailoverTest']['Hypervisor']['IpConfig']['StaticIp'] = values['updated'] if values['updated'] else None + elif field == 'Failover Test Subnet': + nic['FailoverTest']['Hypervisor']['IpConfig']['SubnetMask'] = values['updated'] if values['updated'] else '255.255.255.0' + elif field == 'Failover Test Gateway': + nic['FailoverTest']['Hypervisor']['IpConfig']['Gateway'] = values['updated'] if values['updated'] else None + elif field == 'Failover Test DNS1': + nic['FailoverTest']['Hypervisor']['IpConfig']['PrimaryDns'] = values['updated'] if values['updated'] else None + elif field == 'Failover Test DNS2': + nic['FailoverTest']['Hypervisor']['IpConfig']['SecondaryDns'] = values['updated'] if values['updated'] else None + + logging.info(f"update_vpg_settings: Updated NIC structure: VPG {vpg_name} VM {vm_name} NIC {nic_id} nic={json.dumps(nic, indent=4)}") + + # Update VPG settings with all changes + logging.info(f"update_vpg_settings: Updating VPG settings for {vpg_name}") + logging.info(f"update_vpg_settings: VPG settings: {json.dumps(vpg_settings, indent=4)}") + client.vpgs.update_vpg_settings(vpg_settings_id, vpg_settings) + + # Commit changes + logging.info(f"update_vpg_settings: Committing changes for VPG: {vpg_name}") + client.vpgs.commit_vpg(vpg_settings_id, vpg_name, sync=False) + logging.info(f"update_vpg_settings: Successfully updated VPG: {vpg_name}") + +def main(): + parser = argparse.ArgumentParser(description="Import VPG settings from CSV") + parser.add_argument("--zvm_address", required=True, help="ZVM address") + parser.add_argument('--client_id', required=True, help='Keycloak client ID') + parser.add_argument('--client_secret', required=True, help='Keycloak client secret') + parser.add_argument("--ignore_ssl", action="store_true", help="Ignore SSL certificate verification") + parser.add_argument("--csv_file", required=True, help="Path to the CSV file with updated settings") + parser.add_argument("--vpg_names", help="Comma-separated list of VPG names to update (optional)") + args = parser.parse_args() + + try: + # Setup client + client = setup_client(args) + + # Process VPG names if provided + vpg_names = None + if args.vpg_names: + vpg_names = [name.strip() for name in args.vpg_names.split(',')] + logging.info(f"Updating settings for VPGs: {json.dumps(vpg_names, indent=4)}") + else: + logging.info("No VPG names provided, will update all VPGs in the CSV file") + + # Read updated settings from CSV + print("\nReading updated settings from CSV...") + updated_settings = read_csv_settings(args.csv_file) + # logging.info(f"Updated settings: {updated_settings}") + + # Get current settings + print("Getting current VPG settings...") + timestamp, current_settings = get_current_settings(client, vpg_names) + + # Compare settings + print("Comparing settings...") + try: + changes = compare_settings(client, current_settings, updated_settings) + except ValueError as e: + print(f"\nError: {str(e)}") + print("\nPlease fix the configuration in the CSV file and try again.") + return + + # Display changes + display_changes(client, changes) + + if not changes: + print("\nNo changes to apply.") + return + + # Ask for confirmation + while True: + response = input("\nDo you want to apply these changes? (yes/no): ").lower() + if response in ['yes', 'y']: + break + elif response in ['no', 'n']: + print("Changes cancelled.") + return + else: + print("Please answer 'yes' or 'no'.") + + # Apply changes + print("\nApplying changes...") + update_vpg_settings(client, changes) + print("\nAll changes have been applied successfully.") + + except Exception as e: + if isinstance(e, ValueError): + print(f"\nError: {str(e)}") + print("\nPlease fix the configuration in the CSV file and try again.") + else: + logging.exception("Error occurred:") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/exercises/07_bulk_operations/working/bulk_ip.py b/exercises/07_bulk_operations/working/bulk_ip.py deleted file mode 100644 index 199975d..0000000 --- a/exercises/07_bulk_operations/working/bulk_ip.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python3 -""" -Exercise 7: Bulk Operations -This script demonstrates how to perform bulk IP modifications on multiple VMs. -""" - -import sys -import csv -from pathlib import Path - -# Add the parent directory to the Python path to import the SDK -sys.path.append(str(Path(__file__).parent.parent.parent.parent)) - -# Import the SDK modules -from zvml import ZertoClient -from zvml.vpgs import VPG -from zvml.common import ZertoVPGError - -# Import configuration -try: - from prerequisites.config import ( - ZVM_HOST, - ZVM_PORT, - ZVM_SSL_VERIFY, - KEYCLOAK_SERVER_URL, - KEYCLOAK_REALM, - CLIENT_ID, - CLIENT_SECRET - ) -except ImportError: - print("Error: Please copy config.example.py to config.py and update with your values") - sys.exit(1) - -def read_vm_list(csv_file): - """ - Read VM list from CSV file. - Expected format: vm_name,ip_address,subnet_mask,gateway - """ - # TODO: Implement CSV reading - # Hint: Use csv.DictReader - pass - -def main(): - """ - Main function to demonstrate bulk IP operations. - """ - # Step 1: Create and authenticate ZertoClient - # TODO: Initialize ZertoClient and authenticate - # Hint: Reuse the authentication code from previous exercises - - # Step 2: Read VM list - # TODO: Read the VM list from CSV file - # Hint: Use the read_vm_list function - - # Step 3: Get VPG - # TODO: Find and get the VPG containing the VMs - # Hint: Use client.vpgs.list() and client.vpgs.get() - - # Step 4: Prepare IP changes - # TODO: Prepare the IP modification data - # Required for each VM: - # - VM identifier - # - New IP settings - # - Network information - - # Step 5: Apply IP changes - # TODO: Apply the IP changes to all VMs - # Hint: Use vpg.modify_vm_ips() method - - # Step 6: Monitor progress - # TODO: Monitor the bulk operation progress - # Required steps: - # - Track operation status - # - Handle any failures - # - Report results - - # Step 7: Handle errors - # TODO: Add error handling for bulk operations - # Hint: Use try/except blocks for ZertoVPGError - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/exercises/07_bulk_operations/working/vm_list.csv b/exercises/07_bulk_operations/working/vm_list.csv deleted file mode 100644 index ffe9f7a..0000000 --- a/exercises/07_bulk_operations/working/vm_list.csv +++ /dev/null @@ -1,6 +0,0 @@ -vm_name,ip_address,subnet_mask,gateway -vm-001,192.168.1.101,255.255.255.0,192.168.1.1 -vm-002,192.168.1.102,255.255.255.0,192.168.1.1 -vm-003,192.168.1.103,255.255.255.0,192.168.1.1 -vm-004,192.168.1.104,255.255.255.0,192.168.1.1 -vm-005,192.168.1.105,255.255.255.0,192.168.1.1 \ No newline at end of file diff --git a/prerequisites/__pycache__/config.cpython-313.pyc b/prerequisites/__pycache__/config.cpython-313.pyc index 4b452f1b819e4117d5a36bb1ee9a1a4f83b6f4fe..a1a31a096786cf80b60f7d0081bd177fc0f561ec 100644 GIT binary patch delta 28 icmX@ayos6nGcPX}0}#COGoQ$PlyT9-i#d~h8A}0qPzf{u delta 44 ycmdnQe2AI*GcPX}0}y0{=uPB4%D8Fb#T@>svfLcqg36MN{5;*_l