Java 模式
Java 自定义插件直接与数据库,实例等应用程序交互。
限制
在使用 Java 编程语言开发插件时,您应注意一些限制。
插件特征 | Java 插件 |
---|---|
复杂性 |
从低到中 |
内存占用空间 |
最多 10-20 MB |
其他库的依赖关系 |
用于应用程序通信的库 |
线程数 |
1 |
线程运行时 |
不到一小时 |
Java 限制的原因
SnapCenter 代理的目标是确保持续,安全且稳定可靠的应用程序集成。通过支持 Java 插件,插件可能会导致内存泄漏和其他不需要的问题。这些问题很难解决,尤其是在目标是让事情简单易用的情况下。如果插件的复杂性不是太复杂,开发人员可能会出现错误的可能性就会小得多。Java 插件的风险在于,它们与 SnapCenter 代理本身在同一 JVM 中运行。当插件崩溃或内存泄漏时,它也可能对代理产生负面影响。
支持的方法
方法 | 必填 | 说明 | 何时被调用?由谁调用? |
---|---|---|---|
版本 |
是 |
需要返回插件的版本。 |
由 SnapCenter 服务器或代理请求插件的版本。 |
暂停 |
是 |
需要对应用程序执行暂停。在大多数情况下、这意味着将应用程序置于SnapCenter服务器可以创建备份(例如Snapshot)的状态。 |
在 SnapCenter 服务器创建 Snapshot 副本或执行常规备份之前。 |
取消静默 |
是 |
需要对应用程序执行静默操作。在大多数情况下,这意味着将应用程序重新置于正常运行状态。 |
在SnapCenter服务器创建快照或执行常规备份之后。 |
清理 |
否 |
负责清理插件需要清理的任何内容。 |
SnapCenter 服务器上的工作流完成后(成功或出现故障)。 |
clonePre |
否 |
应在执行克隆操作之前执行需要执行的操作。 |
当用户触发 "cloneVol" 或 "cloneLun" 操作并使用内置克隆向导( GUI/CLI )时。 |
clonePost |
否 |
应在执行克隆操作后执行需要执行的操作。 |
当用户触发 "cloneVol" 或 "cloneLun" 操作并使用内置克隆向导( GUI/CLI )时。 |
还原前 |
否 |
应在调用还原操作之前执行需要执行的操作。 |
用户触发还原操作时。 |
还原 |
否 |
负责执行应用程序的还原 / 恢复。 |
用户触发还原操作时。 |
应用程序版本 |
否 |
以检索插件管理的应用程序版本。 |
作为备份 / 还原 / 克隆等每个工作流中 ASUP 数据收集的一部分。 |
教程
本节介绍如何使用 Java 编程语言创建自定义插件。
设置 Eclipse
-
在 Eclipse 中创建一个新的 Java 项目 "TuttorialPlug"
-
单击 * 完成 * 。
-
右键单击 * 新项目 * → * 属性 * → * Java 构建路径 * → * 库 * → * 添加外部 JAR *
-
导航到主机代理的 ./lib/ 文件夹,然后选择 JAR scAgent-5.0-core.jar 和 common-5.0.jar
-
选择项目并右键单击 * 源文件夹 * → * 新增 * → * 软件包 * ,然后创建一个名为 com.netapp.snapcreator.agent.plugin.TutorialPlugin 的新软件包
-
右键单击新软件包并选择新建 → Java 类。
-
输入名称作为 TuttorialPlugin 。
-
单击超类浏览按钮并搜索 "* 抽象插件 " 。只应显示一个结果:
"AbstractPlugin - com.netapp.snapcreator.agent.nextgen.plugin". .. 单击 * 完成 * 。 .. 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; } }
-
实施所需的方法
暂停,取消静默和版本是每个自定义 Java 插件必须实施的强制方法。
以下是返回插件版本的版本方法。
@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; }
方法在上下文对象中传递。其中包含多个帮助程序,例如 Logger 和上下文存储,以及有关当前操作的信息(工作流 ID ,作业 ID )。我们可以通过调用 final Logger logger = context.getLogger ()来获取此日志程序。logger 对象提供了其他日志记录框架中已知的类似方法,例如,登录回。在 result 对象中,您还可以指定退出代码。在此示例中,返回零,因为没有问题描述。其他退出代码可以映射到不同的故障情形。
正在使用结果对象
result 对象包含以下参数:
参数 | 默认 | 说明 |
---|---|---|
配置 |
空配置 |
此参数可用于将配置参数发送回服务器。它可以是插件要更新的参数。此更改是否实际反映在 SnapCenter 服务器的配置中取决于配置中的 APP_CONF_persistency=Y 或 N 参数。 |
ExitCode |
0 |
指示操作的状态。"0" 表示操作已成功执行。其他值表示错误或警告。 |
标准输出 |
空列表 |
这可用于将 stdout 消息传输回 SnapCenter 服务器。 |
标准 |
空列表 |
这可用于将 stderr 消息传输回 SnapCenter 服务器。 |
消息 |
空列表 |
此列表包含插件要返回到服务器的所有消息。SnapCenter 服务器会在命令行界面或图形用户界面中显示这些消息。 |
SnapCenter代理为其所有结果类型提供“构建者” ("构建程序模式"。这使得使用它们变得非常简单:
Result result = Result.builder() .withExitCode(0) .withStdout(stdout) .withStderr(stderr) .withConfig(config) .withMessages(logger.getMessages()) .build()
例如,将退出代码设置为 0 ,为 stdout 和 stderr 设置列表,设置配置参数,并附加要发送回服务器的日志消息。如果您不需要所有参数,请仅发送所需的参数。由于每个参数都有一个默认值,因此,如果从以下代码中删除 .withExitCode ( 0 ),则结果不会受到影响:
Result result = Result.builder() .withExitCode(0) .withMessages(logger.getMessages()) .build();
版本结果
VersionResult 会向 SnapCenter 服务器通知插件版本。由于它还会从结果继承,因此它包含 config , exitCode , stdout , stderr 和 messages 参数。
参数 | 默认 | 说明 |
---|---|---|
主要 |
0 |
插件的主要版本字段。 |
次要 |
0 |
插件的次要版本字段。 |
修补程序 |
0 |
插件的修补程序版本字段。 |
build |
0 |
此插件的 Build version 字段。 |
例如:
VersionResult result = VersionResult.builder() .withMajor(1) .withMinor(0) .withPatch(0) .withBuild(0) .build();
使用上下文对象
上下文对象提供了以下方法:
上下文方法 | 目的 |
---|---|
字符串 getWorkflowId( ); |
返回 SnapCenter 服务器在当前工作流中使用的工作流 ID 。 |
config getconfig( ); |
返回正在从 SnapCenter 服务器发送到代理的配置。 |
工作流 ID
工作流 ID 是 SnapCenter 服务器用于引用特定正在运行的工作流的 ID 。
配置
此对象包含(大多数)用户可在 SnapCenter 服务器的配置中设置的参数。但是,由于安全原因,其中某些参数可能会在服务器端进行筛选。以下是有关如何访问 Config 并检索参数的示例:
final Config config = context.getConfig(); String myParameter = config.getParameter("PLUGIN_MANDATORY_PARAMETER");
现在、"//myParameter"包含从SnapCenter服务器上的配置读取的参数如果配置参数密钥不存在、则会返回空字符串("")。
导出插件
要在 SnapCenter 主机上安装此插件,必须导出此插件。
在 Eclipse 中,执行以下任务:
-
右键单击插件的基础软件包(在我们的示例 com.netapp.snapcreator.agent.plugin.TutorialPlugin 中)。
-
选择 * 导出 * → * Java * → * JAR 文件 *
-
单击 * 下一步 * 。
-
在以下窗口中,指定目标 JAR 文件路径: tutorial_plugin.jar 插件的基础类名为 TuttorialPlugin 。 class ,必须将此插件添加到同名文件夹中。
如果插件依赖于其他库,则可以创建以下文件夹: lib/
您可以添加与插件相关的 JAR 文件(例如数据库驱动程序)。当 SnapCenter 加载此插件时,它会自动将此文件夹中的所有 JAR 文件与其关联,并将其添加到类路径中。