Auf dieser Seite wird beschrieben, wie Sie Peering für den ONTAP-Speicherpool in Google Cloud NetApp Volumes einrichten.
Cluster-Peering und Storage Virtual Machine-Peering (SVM-Peering) verbinden Ihren Flex Unified ONTAP-Speicherpool mit einem anderen Cluster. Dadurch können Dienste wie SnapMirror und FlexCache ausgeführt werden.
Verwenden Sie das Skript peer_cluster.py, um ein Angebot anzunehmen und eine Passphrase für einen Pool im ONTAP-Modus einzugeben. Weitere Informationen finden Sie unter Cluster-Peering-Skript.
Verfahren auswählen
Wählen Sie je nach Einrichtung eines der folgenden Peering-Verfahren aus:
Hybrid-Peering: Sie migrieren oder replizieren von einem Pool im ONTAP-Modus zu einem NetApp Volumes-Volume im Standardmodus (Standard, Premium, Extreme, oder Flex Unified im Standardmodus). NetApp Volumes startet das Peering vom Ziel aus. Sie schließen das Peering im Quellpool im ONTAP-Modus ab.
Manuelles Peering: Sie richten das Peering selbst ein und verwenden keinen Workflow für die Hybridmigration oder die externe Replikation. Wählen Sie ein Szenario aus:
Ein Pool im ONTAP-Modus und ein externer ONTAP-Cluster, der lokal oder außerhalb von NetApp Volumes ist.
Zwei Pools im ONTAP-Modus.
Weitere Informationen zu zusätzlichen Peering-Optionen für den externen ONTAP Cluster finden Sie in der NetApp ONTAP-Dokumentation.
Funktionsweise des Cluster-Peerings in einem Pool im ONTAP-Modus
Der Cluster-Peering-Prozess folgt einem Workflow für Angebot und Annahme:
Angebot: Ein Cluster initiiert das Peering mit den IC-LIF-Adressen des Peer-Clusters und erhält eine Passphrase.
Annahme: Der Peer-Cluster schließt das Peering mit den IC-LIF-Adressen des anbietenden Clusters und der Passphrase ab.
Der ONTAP CLI-Proxy ist nicht interaktiv. Der Befehl cluster peer create -generate-passphrase fordert keine Eingabe an. Sie können das Angebot also für einen Pool im ONTAP-Modus mit ontap_execute ausführen. Listen Sie alle IC-LIF-Adressen des Remote-Clusters als durch Kommas getrennten Wert für -peer-addrs auf. Der Befehl cluster peer accept fordert die Passphrase an, sodass dieser Schritt über den Proxy fehlschlägt. Verwenden Sie peer_cluster.py, wenn ein Pool im ONTAP-Modus ein Angebot annehmen muss.
Verwenden Sie eines der folgenden Szenarien, um die Cluster zu verbinden:
Szenario A (ONTAP-Modus und externer ONTAP-Cluster): Führen Sie
cluster peer create-generate-passphrasefür den Pool im ONTAP-Modus mitontap_executeund allen IC-LIF-Adressen des Peer-Clusters aus. Der Administrator des externen ONTAP-Clusters führt an der Cluster-Eingabeaufforderungcluster peer acceptmit allen IC-LIF-Adressen im ONTAP-Modus aus und gibt die Passphrase ein.Szenario B (zwei Pools im ONTAP-Modus): Führen Sie
cluster peer create-generate-passphrasefür Pool A mitontap_executeaus, und dannpeer_cluster.pymitPEER_MODE=acceptfür Pool B.
Führen Sie SVM-Peering aus, indem Sie vserver peer accept mit ontap_execute für den Pool im ONTAP-Modus ausführen. In Szenario A führt der externe ONTAP-Cluster vserver peer create aus.
Replikationsmethoden, für die Peering erforderlich ist
Für die folgenden Replikationsmethoden ist Peering erforderlich:
ONTAP-Quelle zu Flex Unified im ONTAP-Modus (SnapMirror): Peering für den Pool im ONTAP-Modus.
Flex Unified im ONTAP-Modus zu einem beliebigen ONTAP-Ziel (SnapMirror): Peering für den Pool im ONTAP-Modus.
ONTAP-Modus-Quelle zu NetApp Volumes im Standardmodus (Volumemigration oder externe Replikation): Hybrid-Peering für den Quellpool im ONTAP-Modus verwenden.
Für die Volumereplikation im Standardmodus in NetApp Volumes wird kein ONTAP-Cluster-Peering verwendet.
Hybrid-Peering
Verwenden Sie diesen Abschnitt, wenn die Quelle ein Pool im ONTAP-Modus und das Ziel ein Volume im Standardmodus in NetApp Volumes ist.
Funktionsweise von NetApp Volumes
Der Workflow für das Hybrid-Peering umfasst die folgenden Schritte:
Sie erstellen eine Volumemigration oder externe Replikation für das Ziel Volume in der Google Cloud Console oder mit der Google Cloud CLI. Sie geben den Namen des Quellclusters im ONTAP-Modus, die SVM, das Volume und die IC-LIF-Adressen der Quelle an.
Wenn das Cluster-Peering noch nicht eingerichtet ist, prüft NetApp Volumes die Verbindung am Ziel, generiert eine Passphrase und zeigt die Peering-Anleitung an.
Sie müssen die restlichen Peering-Schritte für Ihren Quellpool im ONTAP-Modus ausführen, da NetApp Volumes keine automatisierten Befehle für Ihren Quellpool ausführt.
Diese Reihenfolge kann nicht umgekehrt werden. Sie müssen zuerst das Ziel im Standardmodus erstellen.
Cluster-Peering für die ONTAP-Modus-Quelle abschließen
Rufen Sie die Passphrase und die IC-LIF-Adressen des Ziels in der Google Cloud Console auf dem Tab „Replication“ (Replikation) oder „Migration“ (Migration) oder mit der Google Cloud CLI ab:
gcloud netapp volumes replications list --volume=DESTINATION_VOLUME --location=LOCATION \ --format="table(hybridPeeringDetails.command,hybridPeeringDetails.passphrase,hybridPeeringDetails.subnetIp)"
Akzeptieren Sie im Quellpool im ONTAP-Modus das Peering, das NetApp Volumes für das Ziel angeboten hat. Richten Sie ontap_execute
wie unter Allgemeine Verfahren im ONTAP-Modus beschrieben ein.
Legen Sie POOL_NAME und LOCATION für den Quellpool fest. Listen Sie alle IC-LIF-Adressen des Ziels in
PEER_IC_LIF_IPS auf und führen Sie dann peer_cluster.py mit
PEER_MODE=accept aus:
export PROJECT_ID="myproject" export LOCATION="us-central1-a" export POOL_NAME="ontap-mode-source-pool" export PEER_MODE="accept" export PEER_IC_LIF_IPS="DESTINATION_IC_LIF_IP_1,DESTINATION_IC_LIF_IP_2" export PASSPHRASE="passphrase-from-gcnv-console" python3 peer_cluster.py
Prüfen Sie die Konfiguration im Quellpool:
ontap_execute "cluster peer show"
SVM-Peering für die ONTAP-Modus-Quelle abschließen
Wenn NetApp Volumes das SVM-Peering nicht automatisch abschließt, wird ein Befehl für das Vserver-Peering angezeigt. Führen Sie den Befehl mit ontap_execute aus oder akzeptieren Sie das ausstehende Peering:
ontap_execute "vserver peer accept -vserver SOURCE_SVM_NAME -peer-vserver PEER_SVM_NAME"
Konfiguration prüfen:
ontap_execute "vserver peer show"
Kehren Sie zum Hybrid-Workflow in der Google Cloud Console zurück oder führen Sie
gcloud netapp volumes replications list aus, um zu prüfen, ob die Replikation oder
Migration ausgeführt wird.
Manuelles Peering
Verwenden Sie diesen Abschnitt, wenn Sie das Peering selbst einrichten, ohne einen Hybrid-Workflow zu verwenden, z. B. vor SnapMirror zwischen einem Pool im ONTAP-Modus und einem externen ONTAP-Cluster oder zwischen zwei Pools im ONTAP-Modus.
Hinweis
Erfüllen Sie die folgenden Voraussetzungen:
Prüfen Sie, ob die IC-LIFs im Pool im ONTAP-Modus die IC-LIFs des Peer-Clusters erreichen. IC-LIFs in Pools im ONTAP-Modus befinden sich im IPspace
Gcnv. In externen ONTAP-Clustern befinden sie sich im IPspaceDefault. Testen Sie ICMP und die erforderlichen Intercluster-Ports.Richten Sie `ontap_execute` ein bevor Sie beginnen.
Erfassen Sie den Clusternamen, den SVM-Namen und alle IC-LIF-IP-Adressen des Peer-Clusters im Pool im ONTAP-Modus. Geben Sie eine Adresse pro Knoten an, getrennt durch Kommas. Die Anzahl der IC-LIFs entspricht der Anzahl der Knoten des Peer-Clusters.
Teilen Sie dem Administrator des Peer-Clusters den Clusternamen, den SVM-Namen und alle IC-LIF-Adressen Ihres Pools mit.
Übersicht
So führen Sie das Peering für Ihre Cluster und SVMs manuell aus:
Namen und IC-LIFs suchen
Führen Sie in jedem Pool im ONTAP-Modus die Suchbefehle aus, die unter Allgemeine Verfahren im ONTAP-Modus beschrieben sind.
Listen Sie die IC-LIF-Adressen auf, die von der Poolgröße abhängen, und geben Sie sie an den Administrator des Peer-Clusters weiter.
Konnektivität prüfen
Führen Sie einen Ping-Befehl aus, um IC-LIFs aus Ihrem Pool mit dem Flag -vserver Gcnv zu verbinden:
ontap_execute "network ping -vserver Gcnv -destination PEER_IC_LIF_IP -lif intercluster-1"
Beheben Sie Routing- oder Firewallprobleme, bevor Sie fortfahren. Wenn der Ping zwischen Pools fehlschlägt, finden Sie unter Why your NetApp Volumes can't reach Active Directory (and other networks behind your VPC) Anleitungen für VPC- und Partnernetzwerke.
Cluster-Peering ausführen
Verwenden Sie eines der folgenden Szenarien, um die Cluster zu verbinden:
Szenario A: Pool im ONTAP-Modus und externer ONTAP-Cluster
So führen Sie das Peering für einen Pool im ONTAP-Modus mit einem externen ONTAP-Cluster aus:
Angebot für den Pool im ONTAP-Modus: Führen Sie
cluster peer create -generate-passphraseBefehl mitontap_executeund allen IC-LIF-Adressen des Peer-Clusters aus. Kopieren Sie die Passphrase aus der Befehlsausgabe.Annahme für den externen ONTAP-Cluster: Der Administrator des Peer-Clusters führt an der ONTAP-Eingabeaufforderung den Befehl
cluster peer acceptmit allen IC-LIF-Adressen im ONTAP-Modus aus und gibt die Passphrase ein.
So bieten Sie Peering für den Pool im ONTAP-Modus an:
ontap_execute "cluster peer create -ipspace Gcnv -peer-addrs PEER_IC_LIF_1,PEER_IC_LIF_2 -generate-passphrase"
Listen Sie alle IC-LIF-Adressen für den Peer-Cluster im Flag -peer-addrs auf, getrennt durch Kommas. Fügen Sie weitere Adressen hinzu, wenn der Peer-Cluster mehr als zwei Knoten hat.
ONTAP zeigt die Passphrase in der Befehlsausgabe unter Passphrase: an. Kopieren Sie die Passphrase sofort. ONTAP warnt, dass sie nicht noch einmal angezeigt werden kann.
Wenn der Befehl fehlschlägt oder die Ausgabe keine Passphrase enthält, verwenden Sie stattdessen
peer_cluster.py mit PEER_MODE=offer. Weitere
Informationen finden Sie unter Cluster-Peering-Skript.
Kopieren Sie die Passphrase und senden Sie sie an den Administrator des externen ONTAP-Clusters. Nehmen Sie das Angebot innerhalb des Gültigkeitszeitraums der Passphrase an. Standardmäßig beträgt dieser eine Stunde.
Nehmen Sie das Angebot für den externen ONTAP-Cluster an der Eingabeaufforderung des Peer-Clusters an, indem Sie alle IC-LIF-Adressen im ONTAP-Modus auflisten:
cluster peer accept -ipspace Default -peer-addrs ONTAP_MODE_IC_LIF_1,ONTAP_MODE_IC_LIF_2
Geben Sie die Passphrase ein, wenn Sie von ONTAP dazu aufgefordert werden. Fügen Sie alle IC-LIF-Adressen aus dem Pool im ONTAP-Modus hinzu.
Prüfen Sie die Konfiguration im Pool im ONTAP-Modus:
ontap_execute "cluster peer show"
Szenario B: Zwei Pools im ONTAP-Modus
So führen Sie das Peering für zwei Pools im ONTAP-Modus aus:
Angebot für Pool A: Führen Sie den Befehl
cluster peer create -generate-passphrasemitontap_executefür Pool A aus. Listen Sie alle IC-LIF-Adressen aus Pool B in-peer-addrsauf. Kopieren Sie die Passphrase.Annahme für Pool B: Führen Sie
peer_cluster.pymitPEER_MODE=acceptfür Pool B aus und listen Sie alle IC-LIF Adressen aus Pool A inPEER_IC_LIF_IPSauf.
Angebot für Pool A:
ontap_execute "cluster peer create -ipspace Gcnv -peer-addrs POOL_B_IC_LIF_1,POOL_B_IC_LIF_2 -generate-passphrase"
Listen Sie alle IC-LIFs aus Pool B auf, getrennt durch Kommas. Fügen Sie weitere Adressen hinzu, wenn Pool B mehr als zwei Knoten hat. Kopieren Sie den Wert Passphrase: aus der Befehlsausgabe.
Wenn der Befehl fehlschlägt, verwenden Sie peer_cluster.py mit
PEER_MODE=offer für Pool A.
Annahme für Pool B:
export PROJECT_ID="myproject" export LOCATION="us-west1-b" export POOL_NAME="pool-b" export PEER_MODE="accept" export PEER_IC_LIF_IPS="POOL_A_IC_LIF_1,POOL_A_IC_LIF_2" export PASSPHRASE="passphrase-from-pool-a" python3 peer_cluster.py
Listen Sie alle IC-LIFs aus Pool A in PEER_IC_LIF_IPS auf.
Prüfen Sie die Konfiguration in jedem Pool:
ontap_execute "cluster peer show"
Prüfen Sie, ob die Verfügbarkeit „Available“ (Verfügbar) und die Authentifizierung „OK“ ist.
SVM-Peering ausführen
Nachdem das Cluster-Peering erfolgreich war, erstellen Sie ein SVM-Peering für SnapMirror. Wenn Sie FlexCache benötigen, fügen Sie es dem Flag -applications hinzu.
Szenario A: Pool im ONTAP-Modus und externer ONTAP-Cluster
So führen Sie das Peering für einen Pool im ONTAP-Modus mit einem externen ONTAP-Cluster aus:
Erstellen für den externen ONTAP-Cluster: Der Administrator des Peer-Clusters führt an der ONTAP-Eingabeaufforderung den Befehl
vserver peer createaus.Annahme für den Pool im ONTAP-Modus: Führen Sie den
vserver peer acceptBefehl mitontap_executeaus.
Erstellen Sie das Peering für den externen ONTAP-Cluster an der Eingabeaufforderung des Peer-Clusters:
vserver peer create -vserver PEER_SVM_NAME -peer-vserver ONTAP_MODE_SVM_NAME \ -peer-cluster ONTAP_MODE_CLUSTER_NAME -applications snapmirror
Nehmen Sie das Peering für den Pool im ONTAP-Modus an:
ontap_execute "vserver peer accept -vserver ONTAP_MODE_SVM_NAME -peer-vserver PEER_SVM_NAME"
Szenario B: Zwei Pools im ONTAP-Modus
So führen Sie das Peering für zwei Pools im ONTAP-Modus aus:
Erstellen für Pool A: Führen Sie den Befehl
vserver peer createmitontap_executefür Pool A aus (oderpeer_svm.py, wenn der Befehl „create“ nicht verfügbar ist).Annahme für Pool B: Führen Sie den
vserver peer acceptBefehl mitontap_executefür Pool B aus.
Erstellen Sie das Peering für Pool A:
ontap_execute "vserver peer create -vserver POOL_A_SVM -peer-vserver POOL_B_SVM -peer-cluster POOL_B_CLUSTER_NAME -applications snapmirror"
Nehmen Sie das Peering für Pool B an:
ontap_execute "vserver peer accept -vserver POOL_B_SVM -peer-vserver POOL_A_SVM"
Erstellen Sie nicht dasselbe SVM-Peering für beide Pools.
Peering prüfen
So prüfen Sie das Peering für den Pool im ONTAP-Modus:
ontap_execute "cluster peer show" ontap_execute "vserver peer show"
Prüfen Sie, ob die Verfügbarkeit des Cluster-Peerings „Available“ (Verfügbar) und der Status des SVM-Peerings „peered“ (Verbunden) ist.
Wiederholen Sie den Vorgang für Szenario B für
den zweiten Pool. Der Administrator des externen ONTAP-Clusters kann die Konfiguration prüfen, indem er cluster peer show und vserver peer show für den Peer-Cluster ausführt.
Wenn keine Cluster-Peers vorhanden sind, gibt der Befehl cluster peer show zurück, dass der Eintrag nicht vorhanden ist.
Peering löschen
Löschen Sie SVM-Peers vor Cluster-Peers.
Wenn Sie ein SVM-Peering für einen Pool löschen möchten, löschen Sie es, um die Beziehung auf beiden Seiten zu entfernen, wenn die Pools erreichbar sind.
ontap_execute "vserver peer delete -vserver LOCAL_SVM_NAME -peer-vserver PEER_SVM_NAME"
Der ONTAP CLI-Proxy unterstützt das Löschen von Cluster-Peers nicht. Wenn Sie ein Cluster-Peering löschen möchten, löschen Sie es anhand der UUID über die REST API.
Listen Sie zuerst die Peers auf, um die UUID zu finden:
TOKEN=$(gcloud auth print-access-token) curl -s -H "Authorization: Bearer $TOKEN" \ "https://netapp.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/storagePools/POOL_NAME/ontap/api/cluster/peers"
Löschen Sie jede zurückgegebene UUID:
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \ "https://netapp.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/storagePools/POOL_NAME/ontap/api/cluster/peers/PEER_UUID"
Wiederholen Sie diesen Vorgang für beide Pools im ONTAP-Modus in
Szenario B. Führen Sie für
Szenario A bei Bedarf
cluster peer delete für den externen ONTAP-Cluster aus.
Cluster-Peering-Skript
Speichern Sie den folgenden Code als peer_cluster.py. Verwenden Sie ihn für einen Pool im ONTAP-Modus, wenn dieser
ein Angebot für das Cluster-Peering annehmen muss (PEER_MODE=accept).
Für das Hybrid-Peering und Szenario B
wird der Modus accept verwendet. Verwenden Sie den Modus offer (PEER_MODE=offer) nur, wenn
cluster peer create -generate-passphrase über ontap_execute fehlschlägt oder
keine Passphrase zurückgibt. Für dieses Skript ist Python 3.8 oder höher und die Python-Standardbibliothek erforderlich.
#!/usr/bin/env python3
"""Cluster peer offer or accept on an ONTAP-mode pool through the NetApp Volumes REST proxy."""
import json
import os
import subprocess
import sys
import time
import urllib.error
import urllib.request
REQUIRED = ("PROJECT_ID", "LOCATION", "POOL_NAME", "PEER_MODE")
missing = [name for name in REQUIRED if not os.environ.get(name)]
if missing:
sys.exit(f"Set required environment variables: {', '.join(missing)}")
PROJECT_ID = os.environ["PROJECT_ID"]
LOCATION = os.environ["LOCATION"]
POOL_NAME = os.environ["POOL_NAME"]
PEER_MODE = os.environ["PEER_MODE"].lower()
POLL_INTERVAL = int(os.environ.get("POLL_INTERVAL", "10"))
API_ROOT = (
f"https://netapp.googleapis.com/v1/projects/{PROJECT_ID}"
f"/locations/{LOCATION}/storagePools/{POOL_NAME}/ontap/api"
)
def parse_ip_list(value: str) -> list:
return [ip.strip() for ip in value.replace("#", ",").split(",") if ip.strip()]
def get_access_token() -> str:
return subprocess.check_output(
["gcloud", "auth", "print-access-token"], text=True
).strip()
def api_request(method: str, path: str, body=None) -> dict:
headers = {
"Authorization": f"Bearer {get_access_token()}",
"Content-Type": "application/json",
}
data = json.dumps(body).encode() if body is not None else None
req = urllib.request.Request(f"{API_ROOT}{path}", data=data, headers=headers, method=method)
try:
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
except urllib.error.HTTPError as exc:
detail = exc.read().decode()
sys.exit(f"API request failed ({exc.code}): {detail}")
def job_record(response: dict) -> dict:
return response.get("rawResponse") or response.get("body") or response
def job_state(response: dict) -> str:
return job_record(response).get("state", "")
def format_job_error(response: dict) -> str:
record = job_record(response)
message = record.get("message") or record.get("error", {}).get("message")
if message:
return message
return json.dumps(response, indent=2)
def wait_for_job(job_uuid: str) -> None:
print(f"ONTAP job UUID: {job_uuid}")
while True:
response = api_request("GET", f"/cluster/jobs/{job_uuid}")
state = job_state(response)
print(f" Job state: {state}")
if state == "success":
return
if state in ("failure", "error"):
sys.exit(f"Job failed: {format_job_error(response)}")
time.sleep(POLL_INTERVAL)
def extract_passphrase(response: dict) -> str:
body = response.get("body") or response.get("rawResponse") or {}
records = body.get("records") or []
if records:
auth = records[0].get("authentication") or {}
if auth.get("passphrase"):
return auth["passphrase"]
auth = body.get("authentication") or {}
return auth.get("passphrase", "")
def build_offer_body() -> dict:
if not os.environ.get("PEER_IC_LIF_IPS"):
sys.exit("Set PEER_IC_LIF_IPS for offer mode")
payload = {
"remote": {"ip_addresses": parse_ip_list(os.environ["PEER_IC_LIF_IPS"])},
"authentication": {"generate_passphrase": True},
"ipspace": {"name": os.environ.get("IPSPACE", "Gcnv")},
}
expiry = os.environ.get("EXPIRY_TIME")
if expiry:
payload["authentication"]["expiry_time"] = expiry
local_svm = os.environ.get("LOCAL_SVM_NAME")
if local_svm:
payload["initial_allowed_svms"] = [{"name": local_svm}]
apps = os.environ.get("PEER_APPLICATIONS", "snapmirror")
payload["peer_applications"] = [a.strip() for a in apps.split(",") if a.strip()]
encryption = os.environ.get("ENCRYPTION_PROPOSED")
if encryption:
payload["encryption"] = {"proposed": encryption}
return {"body": payload}
def build_accept_body() -> dict:
for name in ("PEER_IC_LIF_IPS", "PASSPHRASE"):
if not os.environ.get(name):
sys.exit(f"Set {name} for accept mode")
return {
"body": {
"remote": {"ip_addresses": parse_ip_list(os.environ["PEER_IC_LIF_IPS"])},
"authentication": {"passphrase": os.environ["PASSPHRASE"]},
"ipspace": {"name": os.environ.get("IPSPACE", "Gcnv")},
}
}
def main() -> None:
if PEER_MODE == "offer":
body = build_offer_body()
print("Creating cluster peer offer...")
elif PEER_MODE == "accept":
body = build_accept_body()
print("Accepting cluster peer offer...")
else:
sys.exit("PEER_MODE must be 'offer' or 'accept'")
response = api_request("POST", "/cluster/peers?return_records=true", body)
job = (response.get("body") or {}).get("job") or response.get("job")
if job and job.get("uuid"):
wait_for_job(job["uuid"])
if PEER_MODE == "offer":
passphrase = extract_passphrase(response)
if passphrase:
print(f"\nPassphrase (provide to the peer pool): {passphrase}")
else:
print(json.dumps(response, indent=2))
if __name__ == "__main__":
main()
Optionale Umgebungsvariablen: EXPIRY_TIME, PEER_APPLICATIONS (Standardwert: snapmirror), ENCRYPTION_PROPOSED und IPSPACE (Standardwert: Gcnv).
SVM-Peering-Skript (Fallback)
Verwenden Sie peer_svm.py nur, wenn vserver peer create über den ONTAP CLI-Proxy nicht verfügbar ist. Verwenden Sie stattdessen vserver peer create und vserver peer accept wie
unter SVM-Peering ausführen beschrieben.
#!/usr/bin/env python3
"""Create an SVM peer on an ONTAP-mode pool (fallback when vserver peer create is unavailable)."""
import json
import os
import subprocess
import sys
import time
import urllib.error
import urllib.request
REQUIRED = (
"PROJECT_ID", "LOCATION", "POOL_NAME",
"LOCAL_SVM_NAME", "PEER_CLUSTER_NAME", "PEER_SVM_NAME",
)
missing = [name for name in REQUIRED if not os.environ.get(name)]
if missing:
sys.exit(f"Set required environment variables: {', '.join(missing)}")
PROJECT_ID = os.environ["PROJECT_ID"]
LOCATION = os.environ["LOCATION"]
POOL_NAME = os.environ["POOL_NAME"]
LOCAL_SVM_NAME = os.environ["LOCAL_SVM_NAME"]
PEER_CLUSTER_NAME = os.environ["PEER_CLUSTER_NAME"]
PEER_SVM_NAME = os.environ["PEER_SVM_NAME"]
APPLICATIONS = [
app.strip()
for app in os.environ.get("APPLICATIONS", "snapmirror").split(",")
if app.strip()
]
POLL_INTERVAL = int(os.environ.get("POLL_INTERVAL", "10"))
API_ROOT = (
f"https://netapp.googleapis.com/v1/projects/{PROJECT_ID}"
f"/locations/{LOCATION}/storagePools/{POOL_NAME}/ontap/api"
)
def get_access_token() -> str:
return subprocess.check_output(
["gcloud", "auth", "print-access-token"], text=True
).strip()
def api_request(method: str, path: str, body=None) -> dict:
headers = {
"Authorization": f"Bearer {get_access_token()}",
"Content-Type": "application/json",
}
data = json.dumps(body).encode() if body is not None else None
req = urllib.request.Request(f"{API_ROOT}{path}", data=data, headers=headers, method=method)
try:
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
except urllib.error.HTTPError as exc:
sys.exit(f"API request failed ({exc.code}): {exc.read().decode()}")
def format_job_error(response: dict) -> str:
record = response.get("rawResponse") or response.get("body") or response
message = record.get("message") or record.get("error", {}).get("message")
return message or json.dumps(response, indent=2)
def wait_for_job(job_uuid: str) -> None:
while True:
response = api_request("GET", f"/cluster/jobs/{job_uuid}")
record = response.get("rawResponse") or response.get("body") or response
state = record.get("state", "")
print(f" Job state: {state}")
if state == "success":
print("SVM peer relationship created.")
return
if state in ("failure", "error"):
sys.exit(f"Job failed: {format_job_error(response)}")
time.sleep(POLL_INTERVAL)
def main() -> None:
body = {
"body": {
"svm": {"name": LOCAL_SVM_NAME},
"peer": {
"cluster": {"name": PEER_CLUSTER_NAME},
"svm": {"name": PEER_SVM_NAME},
},
"applications": APPLICATIONS,
}
}
response = api_request("POST", "/svm/peers?return_records=true", body)
job = (response.get("body") or {}).get("job") or response.get("job")
if not job or not job.get("uuid"):
print(json.dumps(response, indent=2))
return
wait_for_job(job["uuid"])
if __name__ == "__main__":
main()
Nächste Schritte
Erstellen Sie SnapMirror-Beziehungen mit
snapmirror createundsnapmirror initializefür den Pool im ONTAP-Modus. Weitere Informationen finden Sie unter SnapMirror.Erstellen Sie FlexCache-Volumes nachdem Sie das Peering mit der FlexCache-Anwendung ausgeführt haben.
Kehren Sie für Hybrid-Workflows zu Externe Replikation erstellen oder Volumemigration erstellen zurück.