Stile Java
Un plug-in personalizzato Java interagisce direttamente con un'applicazione come database, istanze e così via.
Limitazioni
Esistono alcune limitazioni che è necessario tenere presenti durante lo sviluppo di un plug-in utilizzando il linguaggio di programmazione Java.
Caratteristica del plug-in | Plug-in Java |
---|---|
Complessità |
Da basso a medio |
Impatto della memoria |
Fino a 10-20 MB |
Dipendenze da altre librerie |
Librerie per la comunicazione applicativa |
Numero di thread |
1 |
Runtime del thread |
Meno di un'ora |
Motivo delle limitazioni Java
L'obiettivo dell'agente SnapCenter è garantire un'integrazione applicativa continua, sicura e solida. Grazie al supporto dei plug-in Java, è possibile che i plug-in introducano perdite di memoria e altri problemi indesiderati. Questi problemi sono difficili da affrontare, soprattutto quando l'obiettivo è quello di mantenere le cose semplici da utilizzare. Se la complessità di un plug-in non è troppo complessa, è molto meno probabile che gli sviluppatori abbiano introdotto gli errori. Il pericolo che il plug-in Java venga eseguito nella stessa JVM dell'agente SnapCenter. In caso di crash o perdita di memoria, il plug-in potrebbe avere un impatto negativo sull'Agent.
Metodi supportati
Metodo | Obbligatorio | Descrizione | Chiamate quando e da chi? |
---|---|---|---|
Versione |
Sì |
Deve restituire la versione del plug-in. |
Dal server o dall'agente SnapCenter per richiedere la versione del plug-in. |
Quiesce |
Sì |
Deve eseguire un quiesce sull'applicazione. Nella maggior parte dei casi, ciò significa mettere l'applicazione in uno stato in cui il server SnapCenter può creare un backup (ad esempio, un'istantanea). |
Prima che il server SnapCenter crei una copia Snapshot o esegua un backup in generale. |
Senza richieste |
Sì |
Deve eseguire un'operazione senza domande sull'applicazione. Nella maggior parte dei casi, ciò significa riportare l'applicazione in uno stato operativo normale. |
Dopo che il server SnapCenter ha creato un'istantanea o ne ha creato uno eseguito un backup in generale. |
Pulizia |
No |
Responsabile della pulizia di qualsiasi elemento che il plug-in deve pulire. |
Al termine di un flusso di lavoro sul server SnapCenter (con esito positivo o con errore). |
ClonePre |
No |
Dovrebbe eseguire azioni che devono essere eseguite prima di eseguire un'operazione di clonazione. |
Quando un utente attiva un'azione "cloneVol" o "cloneLun" e utilizza la procedura guidata di cloning integrata (GUI/CLI). |
ClonePost |
No |
Dovrebbe eseguire azioni che devono avvenire dopo l'esecuzione di un'operazione di clonazione. |
Quando un utente attiva un'azione "cloneVol" o "cloneLun" e utilizza la procedura guidata di cloning integrata (GUI/CLI). |
RestorePre |
No |
Dovrebbe eseguire le azioni che devono essere eseguite prima di richiamare l'operazione di ripristino. |
Quando un utente attiva un'operazione di ripristino. |
Ripristinare |
No |
Responsabile dell'esecuzione di un ripristino/ripristino dell'applicazione. |
Quando un utente attiva un'operazione di ripristino. |
AppVersion |
No |
Per recuperare la versione dell'applicazione gestita dal plug-in. |
Come parte della raccolta di dati ASUP in ogni flusso di lavoro come Backup/Restore/Clone. |
Esercitazione
In questa sezione viene descritto come creare un plug-in personalizzato utilizzando il linguaggio di programmazione Java.
Configurare l'eclissi
-
Creare un nuovo progetto Java "TutorialPlugin" in Eclipse
-
Fare clic su fine
-
Fare clic con il pulsante destro del mouse su nuovo progetto → Proprietà → Java Build Path → Librerie → Aggiungi jar esterni
-
Accedere alla cartella ../lib/ dell'agente host e selezionare jars scAgent-5.0-core.jar e common-5.0.jar
-
Selezionare il progetto e fare clic con il pulsante destro del mouse sulla cartella src → New → Package e creare un nuovo pacchetto con il nome com.netapp.snapcreator.agent.plugin.TutorialPlugin
-
Fare clic con il pulsante destro del mouse sul nuovo pacchetto e selezionare New → Java Class.
-
Immettere il nome come TutorialPlugin.
-
Fare clic sul pulsante di ricerca delle superclassi e cercare "*AbstractPlugin". Dovrebbe essere visualizzato un solo risultato:
"AbstractPlugin - com.netapp.snapcreator.agent.nextgen.plugin". .. Fare clic su *fine*. .. Classe Java:
package com.netapp.snapcreator.agent.plugin.TutorialPlugin; import com.netapp.snapcreator.agent.nextgen.common.result.Describe Result; import com.netapp.snapcreator.agent.nextgen.common.result.Result; import com.netapp.snapcreator.agent.nextgen.common.result.VersionR esult; import com.netapp.snapcreator.agent.nextgen.context.Context; import com.netapp.snapcreator.agent.nextgen.plugin.AbstractPlugin; public class TutorialPlugin extends AbstractPlugin { @Override public DescribeResult describe(Context context) { // TODO Auto-generated method stub return null; } @Override public Result quiesce(Context context) { // TODO Auto-generated method stub return null; } @Override public Result unquiesce(Context context) { // TODO Auto-generated method stub return null; } @Override public VersionResult version() { // TODO Auto-generated method stub return null; } }
-
Implementazione dei metodi richiesti
Quiesce, unquiesce e version sono metodi obbligatori che ogni plug-in Java personalizzato deve implementare.
Di seguito viene riportato un metodo di versione per restituire la versione del plug-in.
@Override public VersionResult version() { VersionResult versionResult = VersionResult.builder() .withMajor(1) .withMinor(0) .withPatch(0) .withBuild(0) .build(); return versionResult; }
Below is the implementation of quiesce and unquiesce method. These will be interacting with the application, which is being protected by SnapCenter Server. As this is just a tutorial, the application part is not explained, and the focus is more on the functionality that SnapCenter Agent provides the following to the plug-in developers:
@Override public Result quiesce(Context context) { final Logger logger = context.getLogger(); /* * TODO: Add application interaction here */
logger.error("Something bad happened."); logger.info("Successfully handled application");
Result result = Result.builder() .withExitCode(0) .withMessages(logger.getMessages()) .build(); return result; }
Il metodo viene passato in un oggetto di contesto. Contiene più assistenti, ad esempio un Logger e un archivio di contesto, nonché le informazioni sull'operazione corrente (workflow-ID, job-ID). Possiamo ottenere il logger chiamando il logger finale = Context.GetLogger();. L'oggetto logger fornisce metodi simili noti da altri framework di logging, ad esempio logback. Nell'oggetto risultato, è anche possibile specificare il codice di uscita. In questo esempio, viene restituito zero, poiché non si è verificato alcun problema. Altri codici di uscita possono essere associati a diversi scenari di guasto.
Utilizzo dell'oggetto risultato
L'oggetto Result contiene i seguenti parametri:
Parametro | Predefinito | Descrizione |
---|---|---|
Config |
Config. Vuota |
Questo parametro può essere utilizzato per inviare nuovamente i parametri di configurazione al server. Possono essere parametri che il plug-in desidera aggiornare. Se questa modifica viene effettivamente riflessa nella configurazione sul server SnapCenter dipende dal parametro APP_CONF_PERSISTENCY=Y o N nella configurazione. |
ExitCode |
0 |
Indica lo stato dell'operazione. "0" indica che l'operazione è stata eseguita correttamente. Altri valori indicano errori o avvisi. |
Stdout |
Elenco vuoto |
Questa funzione può essere utilizzata per trasmettere messaggi stdout al server SnapCenter. |
Stderr |
Elenco vuoto |
Questa opzione può essere utilizzata per ritrasmettere i messaggi stderr al server SnapCenter. |
Messaggi |
Elenco vuoto |
Questo elenco contiene tutti i messaggi che un plug-in desidera restituire al server. Il server SnapCenter visualizza questi messaggi nella CLI o nella GUI. |
L'agente SnapCenter fornisce costruttori ("Modello di costruttore") per tutti i tipi di risultato. Questo rende l'utilizzo molto semplice:
Result result = Result.builder() .withExitCode(0) .withStdout(stdout) .withStderr(stderr) .withConfig(config) .withMessages(logger.getMessages()) .build()
Ad esempio, impostare il codice di uscita su 0, impostare gli elenchi per stdout e stderr, impostare i parametri di configurazione e aggiungere anche i messaggi di registro che verranno rinviati al server. Se non sono necessari tutti i parametri, inviare solo quelli necessari. Poiché ogni parametro ha un valore predefinito, se si rimuove .withExitCode(0) dal codice riportato di seguito, il risultato non viene influenzato:
Result result = Result.builder() .withExitCode(0) .withMessages(logger.getMessages()) .build();
VersionResult
VersionResult informa il server SnapCenter della versione del plug-in. Poiché eredita anche dal risultato, contiene i parametri config, exitCode, stdout, stderr e messaggi.
Parametro | Predefinito | Descrizione |
---|---|---|
Maggiore |
0 |
Principale campo di versione del plug-in. |
Minore |
0 |
Campo versione minore del plug-in. |
Patch |
0 |
Campo della versione della patch del plug-in. |
Costruire |
0 |
Campo della versione di build del plug-in. |
Ad esempio:
VersionResult result = VersionResult.builder() .withMajor(1) .withMinor(0) .withPatch(0) .withBuild(0) .build();
Utilizzo dell'oggetto di contesto
L'oggetto Context fornisce i seguenti metodi:
Metodo di contesto | Scopo |
---|---|
Stringa getWorkflowId(); |
Restituisce l'id del flusso di lavoro utilizzato dal server SnapCenter per il flusso di lavoro corrente. |
Config getConfig(); |
Restituisce la configurazione inviata dal server SnapCenter all'agente. |
ID flusso di lavoro
L'ID del flusso di lavoro è l'id utilizzato dal server SnapCenter per fare riferimento a un flusso di lavoro in esecuzione specifico.
Config
Questo oggetto contiene la maggior parte dei parametri che un utente può impostare nella configurazione sul server SnapCenter. Tuttavia, per motivi di sicurezza, alcuni di questi parametri potrebbero essere filtrati sul lato server. Di seguito viene riportato un esempio su come accedere alla configurazione e recuperare un parametro:
final Config config = context.getConfig(); String myParameter = config.getParameter("PLUGIN_MANDATORY_PARAMETER");
""// myParameter" contiene ora il parametro letto dalla configurazione sul server SnapCenter se una chiave del parametro di configurazione non esiste, restituirà una stringa vuota ("").
Esportazione del plug-in
È necessario esportare il plug-in per installarlo sull'host SnapCenter.
In Eclipse eseguire le seguenti operazioni:
-
Fare clic con il pulsante destro del mouse sul pacchetto di base del plug-in (nell'esempio com.netapp.snapcreator.agent.plugin.TutorialPlugin).
-
Selezionare Export → Java → jar file
-
Fare clic su Avanti.
-
Nella finestra seguente, specificare il percorso del file jar di destinazione: tutorial_plugin.jar la classe di base del plug-in è denominata TutorialPlugin.class, il plug-in deve essere aggiunto a una cartella con lo stesso nome.
Se il plug-in dipende da librerie aggiuntive, è possibile creare la seguente cartella: Lib/
È possibile aggiungere file jar, da cui dipende il plug-in (ad esempio, un driver di database). Quando SnapCenter carica il plug-in, associa automaticamente tutti i file jar presenti in questa cartella e li aggiunge al classpath.