概要
VixDiskLib_PrepareForAccess
は MigrateVM_Task
と RelocateVM_Task
を使用禁止にする API です
逆に VixDiskLib_EndAccess
は解除する API です
それぞれの使い方を紹介します
環境
- CentOS 7
- VCSA 6.5.0 9451637
- VDDK API 6.7.1
VixDiskLib_PrepareForAccess
#include <iostream>
#include <cstring>
#include "vixDiskLib.h"
#include <unistd.h>
using std::cout;
using std::endl;
#define VIXDISKLIB_VERSION_MAJOR 6
#define VIXDISKLIB_VERSION_MINOR 7
static struct {
VixDiskLibConnection connection;
char *libdir;
char *cfgFile;
} params;
int main() {
VixError err;
err = VixDiskLib_InitEx(VIXDISKLIB_VERSION_MAJOR, VIXDISKLIB_VERSION_MINOR, NULL, NULL, NULL, params.libdir, params.cfgFile);
printf("%lu\n", err);
VixDiskLibConnectParams cnxParams = {0};
cnxParams.vmxSpec = {(char*)"moref=vm-60"};
cnxParams.specType = VIXDISKLIB_SPEC_VMX;
cnxParams.serverName = {(char*)"192.168.100.20"};
cnxParams.credType = VIXDISKLIB_CRED_UID;
cnxParams.creds.uid.userName = {(char*)"administrator@vsphere.local"};
cnxParams.creds.uid.password = {(char*)"xxxxxxxxxxxxx"};
cnxParams.thumbPrint = {(char*)"96:09:d6:5b:e0:83:58:1b:ba:2b:cc:78:22:88:33:36:64:50:32:eb"};
err = VixDiskLib_ConnectEx(&cnxParams, 0, NULL, "nbd", ¶ms.connection);
printf("%lu\n", err);
retry:
err = VixDiskLib_PrepareForAccess(&cnxParams, "src");
printf("%lu\n", err);
for (int i = 0; i < 10; i++) {
if (err != VIX_OK) {
if (err == VIX_E_OPERATION_DISABLED) {
goto out;
}
sleep(5);
goto retry;
}
}
out:
VixDiskLib_Disconnect(params.connection);
return 0;
}
ディスクに対する操作をするわけではないのでディスクに対する handler
は不要です
vCenter に接続するためのパラメータ cnxParams
の vmxSpec
の指定をしつつ API をコールする際の第二引数で VM の名前も指定します
成功すると 0 (VIX_OK
) が返ってきます
もしすでに API を実行している場合は 20005 (VIX_E_OPERATION_DISABLED
) が返ってくるのでその場合も終了します
sleep の処理は不要かもしれませんがサンプルに含まれていたので使っています
VixDiskLib_EndAccess
#include <iostream>
#include <cstring>
#include "vixDiskLib.h"
#include <unistd.h>
using std::cout;
using std::endl;
#define VIXDISKLIB_VERSION_MAJOR 6
#define VIXDISKLIB_VERSION_MINOR 7
static struct {
VixDiskLibConnection connection;
char *libdir;
char *cfgFile;
} params;
int main() {
VixError err;
err = VixDiskLib_InitEx(VIXDISKLIB_VERSION_MAJOR, VIXDISKLIB_VERSION_MINOR, NULL, NULL, NULL, params.libdir, params.cfgFile);
printf("%lu\n", err);
VixDiskLibConnectParams cnxParams = {0};
cnxParams.vmxSpec = {(char*)"moref=vm-60"};
cnxParams.specType = VIXDISKLIB_SPEC_VMX;
cnxParams.serverName = {(char*)"192.168.100.20"};
cnxParams.credType = VIXDISKLIB_CRED_UID;
cnxParams.creds.uid.userName = {(char*)"administrator@vsphere.local"};
cnxParams.creds.uid.password = {(char*)"xxxxxxxxxxxxx"};
cnxParams.thumbPrint = {(char*)"96:09:d6:5b:e0:83:58:1b:ba:2b:cc:78:22:88:33:36:64:50:32:eb"};
err = VixDiskLib_ConnectEx(&cnxParams, 0, NULL, "nbd", ¶ms.connection);
printf("%lu\n", err);
err = VixDiskLib_EndAccess(&cnxParams, "src");
printf("%lu\n", err);
VixDiskLib_Disconnect(params.connection);
return 0;
}
先程よりもシンプルです
また呼び出し方も同じで第二引数に VM 名を指定します
VixDiskLib_EndAccess
は何回コールしても基本は 0 なのでコールして終了です
念の為エラーコードのチェックをしてもいいかもしれません
挙動確認
VixDiskLib_PrepareForAccess
を実行して mob で VM の情報を見てみてたら disabledMethod
に vim.VirtualMachine.relocate
が追加されていました
また Web Client で確認してみると VM の右クリックして「移行」しようとしても disable な状態になっていて押せないようになっていました
最後に
VDDK API の VixDiskLib_PrepareForAccess
と VixDiskLib_EndAccess
を試してみた
vMotion をできなくする API かなと思います
vSphere API にも同じような API があるのでわざわざ VDDK API で実施する必要もないような気がしますがもしかすると VDDK の処理に関する禁止事項も行っているのかもしれません
VDDK の Read/Write をするのであれば素直にこっちを使ったほうが良いかもしれません
0 件のコメント:
コメントを投稿