initial commit
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
# 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.
|
||||
|
||||
"""
|
||||
Zerto VPG Settings Export/Import Example Script
|
||||
|
||||
This script demonstrates how to export and import Virtual Protection Group (VPG) settings
|
||||
using the Zerto Virtual Manager (ZVM) API. It allows for backup and restoration of VPG
|
||||
configurations, which is useful for disaster recovery planning and VPG replication.
|
||||
|
||||
Key Features:
|
||||
1. VPG Settings Export:
|
||||
- Export settings for specific VPGs or all VPGs
|
||||
- Save exported settings to a JSON file
|
||||
- Include all VPG configuration parameters
|
||||
- Capture recovery site mappings
|
||||
|
||||
2. Settings Verification:
|
||||
- List all available exported settings
|
||||
- Read and display detailed settings
|
||||
- Show summary of exported VPG configurations
|
||||
- Verify export timestamp and status
|
||||
|
||||
3. VPG Settings Import:
|
||||
- Import settings back to create new VPGs
|
||||
- Restore original VPG configurations
|
||||
- Support for multiple VPGs in single operation
|
||||
- Validate import results
|
||||
|
||||
Required Arguments:
|
||||
--zvm_address: Protected site ZVM address
|
||||
--client_id: Protected site Keycloak client ID
|
||||
--client_secret: Protected site Keycloak client secret
|
||||
--ignore_ssl: Ignore SSL certificate verification (optional)
|
||||
--vpg_names: Comma-separated list of VPG names to export (optional)
|
||||
--output_file: File path to save exported settings (optional)
|
||||
|
||||
Example Usage:
|
||||
python examples/vpg_setting_export_example.py \
|
||||
--zvm_address "192.168.111.20" \
|
||||
--client_id "zerto-api" \
|
||||
--client_secret "your-secret-here" \
|
||||
--vpg_names "VpgTest1,VpgTest2" \
|
||||
--output_file "vpg_settings.json" \
|
||||
--ignore_ssl
|
||||
|
||||
Script Flow:
|
||||
1. Connects to protected site ZVM
|
||||
2. Exports VPG settings:
|
||||
- For specified VPGs if vpg_names provided
|
||||
- For all VPGs if no vpg_names specified
|
||||
3. Saves settings to file if output_file specified
|
||||
4. Verifies export by reading settings
|
||||
5. Displays VPG configuration summaries:
|
||||
- VPG names
|
||||
- Source and target sites
|
||||
- RPO and journal history
|
||||
6. Pauses for manual VPG deletion
|
||||
7. Imports settings to recreate VPGs
|
||||
8. Verifies import success
|
||||
|
||||
Note: This script requires only protected site credentials. It's designed for VPG
|
||||
configuration backup and restore scenarios, allowing you to quickly recreate VPGs
|
||||
with identical settings after changes or in disaster recovery situations.
|
||||
"""
|
||||
import argparse
|
||||
import logging
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
format='%(asctime)s - %(levelname)s - %(message)s'
|
||||
)
|
||||
import urllib3
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from zvml import ZVMLClient
|
||||
|
||||
# Disable SSL warningss
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
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 main():
|
||||
parser = argparse.ArgumentParser(description="Export and Import VPG settings example")
|
||||
parser.add_argument("--zvm_address", required=True, help="Site 1 ZVM address")
|
||||
parser.add_argument('--client_id', required=True, help='Site 1 Keycloak client ID')
|
||||
parser.add_argument('--client_secret', required=True, help='Site 1 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 settings for")
|
||||
parser.add_argument("--output_file", help="Optional file to save the exported settings")
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
# Setup client
|
||||
client = setup_client(args)
|
||||
|
||||
# If no VPG names provided, get all VPGs
|
||||
if not args.vpg_names:
|
||||
vpgs = client.vpgs.list_vpgs()
|
||||
vpg_names = [vpg['VpgName'] for vpg in vpgs]
|
||||
logging.info(f"No VPG names provided, exporting all {len(vpg_names)} VPGs")
|
||||
else:
|
||||
# Split the comma-separated string and strip whitespace
|
||||
vpg_names = [name.strip() for name in args.vpg_names.split(',')]
|
||||
logging.info(f"Exporting settings for VPGs: {vpg_names}")
|
||||
|
||||
# Step 1: Export VPG settings
|
||||
print("\nStep 1: Exporting VPG settings...")
|
||||
result = client.vpgs.export_vpg_settings(vpg_names)
|
||||
|
||||
print("Export Result:")
|
||||
print(f"Timestamp: {result.get('TimeStamp')}")
|
||||
print(f"Result: {result.get('ExportResult', {}).get('Result')}")
|
||||
print(f"Message: {result.get('ExportResult', {}).get('Message')}")
|
||||
|
||||
# Save to file if specified
|
||||
if args.output_file:
|
||||
with open(args.output_file, 'w') as f:
|
||||
json.dump(result, f, indent=2)
|
||||
print(f"\nExported settings saved to: {args.output_file}")
|
||||
|
||||
# Step 2: Verify export and read settings
|
||||
print("\nStep 2: Reading exported settings...")
|
||||
exported_settings = client.vpgs.list_exported_vpg_settings()
|
||||
export_timestamp = result.get('TimeStamp', '').split('.')[0] + '.000Z'
|
||||
|
||||
if any(setting.get('TimeStamp') == export_timestamp for setting in exported_settings):
|
||||
print(f"Found export with timestamp {export_timestamp}")
|
||||
settings = client.vpgs.read_exported_vpg_settings(export_timestamp)
|
||||
|
||||
# Display summary of exported VPG settings
|
||||
vpg_settings = settings.get('ExportedVpgSettingsApi', [])
|
||||
print(f"\nFound settings for {len(vpg_settings)} VPGs:")
|
||||
for vpg in vpg_settings:
|
||||
basic = vpg.get('Basic', {})
|
||||
print(f"\nVPG Name: {basic.get('Name')}")
|
||||
print(f"Source Site: {vpg.get('SourceSiteName')}")
|
||||
print(f"Target Site: {vpg.get('TargetSiteName')}")
|
||||
print(f"RPO (seconds): {basic.get('RpoInSeconds')}")
|
||||
print(f"Journal History (hours): {basic.get('JournalHistoryInHours')}")
|
||||
|
||||
#pause
|
||||
input("Delte VPG manually and Press Enter to continue...")
|
||||
|
||||
# Step 3: Import the settings back
|
||||
print("\nStep 3: Importing VPG settings...")
|
||||
import_result = client.vpgs.import_vpg_settings(settings)
|
||||
print("\nImport Result:")
|
||||
print(f"Result: {import_result.get('Result')}")
|
||||
print(f"Message: {import_result.get('Message')}")
|
||||
if import_result.get('VpgSettingsIds'):
|
||||
print(f"Created VPG Settings IDs: {', '.join(import_result.get('VpgSettingsIds'))}")
|
||||
|
||||
#pause
|
||||
input("Look at the VPG and verify whether the manual channges are reverted back to the original settings. Press Enter to continue...")
|
||||
else:
|
||||
print(f"\nWarning: Export with timestamp {export_timestamp} not found in exported settings list")
|
||||
|
||||
except Exception as e:
|
||||
logging.exception("Error occurred:")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user