2018年12月9日日曜日

VDDK API の VixDiskLib_PrepareForAccess と VixDiskLib_EndAccess を試してみた

概要

VixDiskLib_PrepareForAccessMigrateVM_TaskRelocateVM_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", &params.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 に接続するためのパラメータ cnxParamsvmxSpec の指定をしつつ 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", &params.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 の情報を見てみてたら disabledMethodvim.VirtualMachine.relocate が追加されていました
vddk_prepare_access_api.png

また Web Client で確認してみると VM の右クリックして「移行」しようとしても disable な状態になっていて押せないようになっていました

最後に

VDDK API の VixDiskLib_PrepareForAccessVixDiskLib_EndAccess を試してみた
vMotion をできなくする API かなと思います

vSphere API にも同じような API があるのでわざわざ VDDK API で実施する必要もないような気がしますがもしかすると VDDK の処理に関する禁止事項も行っているのかもしれません
VDDK の Read/Write をするのであれば素直にこっちを使ったほうが良いかもしれません

0 件のコメント:

コメントを投稿