基於Perl的開發
使用Perl開發外掛程式時、您必須遵循特定慣例。
-
內容必須可讀取
-
必須實作必要的作業設定、靜止和取消靜止
-
必須使用特定語法將結果傳回代理程式
-
內容應儲存為<plugin_name>.PM檔案
可用的作業包括
-
設定
-
版本
-
靜止
-
取消靜止
-
Clone(克隆)_pre, clone(複製)_POST
-
reet_pre,還原
-
清理
一般外掛處理
使用結果物件
每個自訂外掛程式作業都必須定義結果物件。此物件會將訊息、結束程式碼、stdout和stderr傳回主機代理程式。
結果物件:
my $result = {
exit_code => 0, stdout => "", stderr => "", };
傳回結果物件:
return $result;
維持資料一致性
在執行相同工作流程時、可以保留作業之間的資料(清除除外)。這是使用金鑰值配對來完成。關鍵值資料配對會設定為結果物件的一部分、並保留在相同工作流程的後續作業中。
下列程式碼範例會設定要保留的資料:
my $result = { exit_code => 0, stdout => "", stderr => "", }; $result->{env}->{‘key1’} = ‘value1’; $result->{env}->{‘key2’} = ‘value2’; …. return $result
上述程式碼會設定兩個金鑰值配對、作為後續作業的輸入。可使用下列程式碼存取兩個金鑰值配對:
sub setENV { my ($self, $config) = @_; my $first_value = $config->{‘key1’}; my $second_value = $config->{‘key2’}; … }
=== Logging error messages 每項作業都能將訊息傳回主機代理程式、以顯示及儲存內容。訊息包含訊息層級、時間戳記及訊息文字。支援多行訊息。
Load the SnapCreator::Event Class: my $msgObj = new SnapCreator::Event(); my @message_a = ();
使用msgobj使用collect方法擷取訊息。
$msgObj->collect(\@message_a, INFO, "My INFO Message"); $msgObj->collect(\@message_a, WARN, "My WARN Message"); $msgObj->collect(\@message_a, ERROR, "My ERROR Message"); $msgObj->collect(\@message_a, DEBUG, "My DEBUG Message"); $msgObj->collect(\@message_a, TRACE, "My TRACE Message");
將訊息套用至結果物件:
$result->{message} = \@message_a;
使用外掛程式存根
自訂外掛程式必須公開外掛程式存根。這些是SnapCenter 根據工作流程、由伺服器呼叫的方法。
外掛程式Stub | 選用/必要 | 目的 | ||
---|---|---|---|---|
設定 |
必要 |
此存根會設定環境和組態物件。 任何環境剖析或處理都應在此處完成。每次呼叫一個存根時、就會先呼叫setenv存根。只有Perl型外掛程式才需要。 |
||
版本 |
選用 |
此存根可用來取得應用程式版本。 |
||
探索 |
選用 |
此存根可用來探索代理程式或主機上裝載的執行個體或資料庫等應用程式物件。 外掛程式預期會以特定格式傳回探索到的應用程式物件、做為回應的一部分。只有在應用程式與SnapDrive 適用於Unix的解決方法整合時、才會使用此存根。
|
||
探索完成 |
選用 |
此存根可用來探索代理程式或主機上裝載的執行個體或資料庫等應用程式物件。 外掛程式預期會以特定格式傳回探索到的應用程式物件、做為回應的一部分。只有在應用程式與SnapDrive 適用於Unix的解決方法整合時、才會使用此存根。
|
||
靜止 |
必要 |
此存根負責執行一項「冷場」、也就是將應用程式置於可建立 Snapshot 的狀態。這在 Snapshot 作業之前稱為。應將要保留的應用程式中繼資料設為回應的一部分、並在後續的複製或還原作業中以組態參數的形式、在對應的儲存 Snapshot 上傳回。 |
||
取消靜止 |
必要 |
此存根負責執行靜止、也就是將應用程式置於正常狀態。這是在您建立 Snapshot 之後才會呼叫的。 |
||
Clone預先複製 |
選用 |
此存根負責執行預先複製工作。這假設您使用內建SnapCenter 的「還原伺服器複製」介面、並在執行複製作業時觸發。 |
||
Clone複製POST |
選用 |
此存根負責執行複製後的工作。這假設您使用內建SnapCenter 的「還原伺服器複製」介面、而且只有在執行複製作業時才會觸發。 |
||
reet_pre |
選用 |
此存根負責執行預先儲存的工作。這假設您使用內建SnapCenter 的還原伺服器介面、並在執行還原作業時觸發。 |
||
還原 |
選用 |
此存根負責執行應用程式還原工作。這是假設您使用內建SnapCenter 的「還原伺服器」介面、而且只有在執行還原作業時才會觸發。 |
||
清理 |
選用 |
此存根負責在備份、還原或複製作業之後執行清除作業。清除作業可以是在正常工作流程執行期間、或是在工作流程失敗時進行。您可以參照組態參數動作來推斷呼叫清除的工作流程名稱、此動作可以是備份、cloneVolAndLun或fileVolRestore。組態參數error_message會指出執行工作流程時是否有任何錯誤。如果已定義「錯誤」訊息而非「空」、則會在工作流程失敗執行期間呼叫清除。 |
||
app_version |
選用 |
這個虛設常式是SnapCenter 由效能分析用來取得外掛程式所管理的應用程式版本詳細資料。 |
外掛程式套件資訊
每個外掛程式都必須具備下列資訊:
package MOCK; our @ISA = qw(SnapCreator::Mod); =head1 NAME MOCK - class which represents a MOCK module. =cut =head1 DESCRIPTION MOCK implements methods which only log requests. =cut use strict; use warnings; use diagnostics; use SnapCreator::Util::Generic qw ( trim isEmpty ); use SnapCreator::Util::OS qw ( isWindows isUnix getUid createTmpFile ); use SnapCreator::Event qw ( INFO ERROR WARN DEBUG COMMENT ASUP CMD DUMP ); my $msgObj = new SnapCreator::Event(); my %config_h = ();
營運
您可以對自訂外掛程式所支援的各種作業進行程式碼處理、例如:setenv、Version、Quiesce和unquiesce。
setenv作業
使用Perl建立的外掛程式需要設定作業。您可以設定ENV並輕鬆存取外掛程式參數。
sub setENV { my ($self, $obj) = @_; %config_h = %{$obj}; my $result = { exit_code => 0, stdout => "", stderr => "", }; return $result; }
版本作業
版本作業會傳回應用程式版本資訊。
sub version { my $version_result = { major => 1, minor => 2, patch => 1, build => 0 }; my @message_a = (); $msgObj->collect(\@message_a, INFO, "VOLUMES $config_h{'VOLUMES'}"); $msgObj->collect(\@message_a, INFO, "$config_h{'APP_NAME'}::quiesce"); $version_result->{message} = \@message_a; return $version_result; }
靜止作業
靜止作業會對資源參數中所列的資源執行應用程式靜止作業。
sub quiesce { my $result = { exit_code => 0, stdout => "", stderr => "", }; my @message_a = (); $msgObj->collect(\@message_a, INFO, "VOLUMES $config_h{'VOLUMES'}"); $msgObj->collect(\@message_a, INFO, "$config_h{'APP_NAME'}::quiesce"); $result->{message} = \@message_a; return $result; }
取消靜止作業
若要取消靜止應用程式、必須執行「取消靜止」作業。資源清單可在資源參數中找到。
sub unquiesce { my $result = { exit_code => 0, stdout => "", stderr => "", }; my @message_a = (); $msgObj->collect(\@message_a, INFO, "VOLUMES $config_h{'VOLUMES'}"); $msgObj->collect(\@message_a, INFO, "$config_h{'APP_NAME'}::unquiesce"); $result->{message} = \@message_a; return $result; }