FlashCopy マッピングを作成して、開始するためのサンプル・コード
以下の情報は、CIMOM メソッドでクラスター化システムを制御する方法を実際に示したものです。 サンプル・コードには、FlashCopy® マッピングを作成して開始するよう設計された Java™ クラスからの main メソッドと、main メソッドから呼び出されるその他のメソッドが含まれています。
このトピックでは、メソッドという語は Java メソッドを指しています。 メソッド (Method) (頭文字は大文字) という語は CIM メソッドを指しています。
Java main メソッド
この例では、FlashCopy マッピングを作成し、開始するための Java main メソッドが示されています。 この例では、Java プログラムが常に同じクラスター化システムを制御するように設計されていることを想定しています。 このプログラムにもっと柔軟性を持たせることは比較的簡単ですが、そうするかどうかはユーザー次第です。
/*
* FC Mapping states
*/
private static UnsignedInt16 INITIALIZED = new UnsignedInt16(2);
private static UnsignedInt16 PREPARING = new UnsignedInt16(3);
private static UnsignedInt16 PREPARED = new UnsignedInt16(4);
public static void main(String[] args) throws CIMException
{
/*
* First step is to connect to the CIMOM
*/
UserPrincipal user = new UserPrincipal("superuser");
PasswordCredential pwd = new PasswordCredential("itso13sj");
CIMNameSpace ns = new CIMNameSpace("https://9.43.86.115:5989/root/ibm");
CIMClient client = null;
client = new CIMClient(ns,user,pwd);
/*
* Next, select the clustered system that we are interested in
*/
CIMInstance chosenCluster = getCluster("ITSOCL1",client);
/*
* At this point, the relevant clustered system has been selected
* and 'chosenCluster' is a CIMInstance of this clustered system
*
* Get the Config Service of this clustered system
*/
CIMObjectPath cService = getConfigService(chosenCluster, client);
/*
* Now, get all of the Volumes in this clustered system
*/
Map<Integer,CIMObjectPath> volumesById = getVolumes(chosenCluster,client);
/*
* Select the FlashCopy Source
*
* In this case, Volume 10 is our source
* Volume 11 is our target
*/
CIMObjectPath fcSrc = volumesById.get(new Integer(10));
CIMObjectPath fcTgt = volumesById.get(new Integer(11));/*
/*
* Now create FC Mapping
*/
CIMValue rc = makeFlashCopyMapping("CIMOMTestMap", fcSrc, fcTgt, cService,
client,false);
/*
* Now that this has been created, we need to get an
* Object Path to the newly created Association
*/
List<CIMObjectPath> fcMaps = getFCMappings(fcSrc, client);
CIMObjectPath fcMapping = fcMaps.get(0);
/*
* Now we prepare the FC Mapping
*/
CIMArgument[] outArgs = new CIMArgument[2];
rc = prepareFCMapping(cService, fcMapping, client, outArgs);
System.out.println("Got value:"+
Integer.toHexString(Integer.parseInt(rc.toString())));
/*
* Loop until it is prepared
*/
CIMValue fcMapState = new CIMValue(PREPARING);
while(fcMapState.equals(new CIMValue(PREPARING)))
{
CIMInstance fcMapInfo = client.getInstance(fcMapping);
fcMapState = fcMapInfo.getProperty("SyncState").getValue();
}
/*
* Now start the FC Mapping
*/
rc = startFCMapping(cService, fcMapping, client, outArgs);
System.out.println("Got value:"+
Integer.toHexString(Integer.parseInt(rc.toString())));
}
getCluster メソッド
getCluster メソッドは、提示された名前のクラスター化システムに対応する CIM インスタンスを返します。 これは、クラス IBMTSSVC_Cluster のすべてのインスタンスを列挙して、各インスタンスの名前を検査することによって行われます。 提示された名前と一致するインスタンスが検出されると、そのインスタンスへのオブジェクト・パスが返されます。
static private CIMInstance getCluster(String clusterName, CIMClient client) throws
CIMException
{
CIMInstance chosenCluster = null;
Enumeration<CIMInstance> clusters =
client.enumerateInstances(new CIMObjectPath("/root/ibm:IBMTSSVC_Cluster"));
while(clusters.hasMoreElements())
{
CIMInstance possibleCluster = clusters.nextElement();
String possibleName =
possibleCluster.getProperty("ElementName").getValue().toString();
if(possibleName.equals("¥""+clusterName+"¥""))
{
chosenCluster = possibleCluster;
}
}
return chosenCluster;
}
getConfigService メソッド
CIM_StorageConfigurationService クラスと同等のものは、Storwize® V3700 上にはありませんが、このクラスのインスタンスはシステムに対してメソッドを呼び出すために必要です。
このメソッドでは、指定したクラスター化システムと関連付けられるすべてのインスタンスが要求されます。 クラスター化システムをその構成サービスに接続する関連は、CIM_HostedService です。 クラスター化システムは、それ自体と関連付けられた構成サービスのみを所有しているため、列挙された最初のオブジェクト・パスが選択されます。
static private CIMObjectPath getConfigService(CIMInstance cluster, CIMClient
client) throws CIMException
{
Enumeration<CIMObjectPath> configServices = null;
configServices = client.associatorNames(
cluster.getObjectPath(),
"CIM_HostedService",
"CIM_StorageConfigurationService",
null,
null);
return configServices.nextElement();
}
getVolumes メソッド
このメソッドは、Volume ID (整数で) を IBMTSSVC_StorageVolume オブジェクト・パスに関連付けるマップを返します。 このメソッドでは、提供されたクラスター化システムのインスタンスと関連付けられる、すべての IBMTSSVC_StorageVolume インスタンスが要求されます。
static private Map<Integer,CIMObjectPath> getVolumes(CIMInstance cluster, CIMClient
client) throws CIMException
{
Enumeration<CIMObjectPath> volumes = client.associatorNames(
cluster.getObjectPath(),
null,
"IBMTSSVC_StorageVolume",
null,
null);
Map<Integer,CIMObjectPath> volumesById = new HashMap<Integer, CIMObjectPath>();
while(volumes.hasMoreElements())
{
CIMObjectPath volumeOP = volumes.nextElement();
CIMValue volumesId = volumeOP.getKey("DeviceID").getValue();
String idAsString = volumeId.toString();
String idNoQuotes = idAsString.substring(1, idAsString.length()-1);
volumesById.put(Integer.parseInt(idNoQuotes), volumeOP);
}
return volumesById;
}
makeFlashCopyMapping メソッド
この例では、クラスター化システム構成サービスに対して AttachReplica を呼び出しています。 CIM メソッドは型付きパラメーターを使用します。このメソッドでは、argRef、argString、および argUint16 メソッドを使用します。 これらのメソッドは、CIM メソッドに必要な引数を生成するためのショートカットとして働きます。 AttachReplica メソッドは、FlashCopy。 CopyType 引数は、どのタイプが必要であるかを示します。
static private CIMValue makeFlashCopyMapping(
String name,
CIMObjectPath source,
CIMObjectPath target,
CIMObjectPath configService,
CIMClient client,
boolean autodelete) throws CIMException
{
CIMArgument src = argRef("SourceElement", source, "IBMTSSVC_StorageVolume");
CIMArgument tgt = argRef("TargetElement", target, "IBMTSSVC_StorageVolume");
CIMArgument fcName = argString("ElementName",name);
CIMArgument type = argUint16("CopyType",autodelete?5:4);
CIMArgument[] inArgs = {src,tgt,fcName,type};
CIMArgument[] outArgs = new CIMArgument[1];
CIMValue rc = client.invokeMethod(configService,
"AttachReplica",
inArgs,
outArgs);
return rc;
}
getFCMappings メソッド
getFCMappings メソッドは、指定したボリュームと関連付けられるすべての FCMappings のリストを返します。 このメソッドは、提示された IBMTSSVC_StorageVolume を参照するすべての関連付けのリストを要求します。 現時点では、このタイプの Java WBEM サービス・メソッドはすべて、列挙で返します。このメソッドでは、この列挙を使用しやすいようにリストに変換します。
static private List<CIMObjectPath> getFCMappings(CIMObjectPath volume, CIMClient
client) throws CIMException
{
Enumeration<CIMObjectPath> assocs = client.referenceNames(
volume,
"IBMTSSVC_LocalStorageSynchronized",
null);
return Collections.list(assocs);
}
prepareFCMapping メソッド
prepareFCMapping メソッドは、FlashCopy マッピングを作成します。 AttachReplica メソッドの場合と同様、ModifySynchronization メソッドは、FlashCopy。 operation パラメーターは、実際に実行される内容を指示します。
private static CIMValue prepareFCMapping(
CIMObjectPath configService,
CIMObjectPath fcMapping,
CIMClient client,
CIMArgument[] outArgs) throws CIMException
{
CIMArgument operation = argUint16("Operation", 6);
CIMArgument synch = argRef("Synchronization",
fcMapping,"IBMTSSVC_FlashCopyStorageSynchronized");
CIMArgument[] inArgs = new CIMArgument[]{operation,synch};
outArgs = new CIMArgument[2];
return client.invokeMethod(configService,
"ModifySynchronization",
inArgs,
outArgs);
startFCMapping メソッド
startFCMapping メソッドは、FlashCopy マッピングを開始します。 このメソッドは、prepareFCMapping メソッドと同様に ModifySynchronization メソッドを呼び出しますが、使用する operation パラメーターは異なります。
private static CIMValue startFCMapping(
CIMObjectPath configService,
CIMObjectPath fcMapping,
CIMClient client,
CIMArgument[] outArgs) throws CIMException
{
CIMArgument operation = argUint16("Operation", 4);
CIMArgument synch = argRef("Synchronization",
fcMapping,"IBMTSSVC_FlashCopyStorageSynchronized");
CIMArgument[] inArgs = new CIMArgument[]{operation,synch};
outArgs = new CIMArgument[2];
return client.invokeMethod(configService,
"ModifySynchronization",
inArgs,
outArgs);
}
引数の生成クラス
このクラスでは、次のような引数生成プログラムが使用されます。
- argUint16 メソッドは、符号なし、16 ビット、整数タイプの引数を返します。
static private CIMArgument argUint16(String name, int arg) { return new CIMArgument( name, new CIMValue( new UnsignedInt16(arg), new CIMDataType(CIMDataType.UINT16) ) ); }
- argString メソッドは、ストリング・タイプの引数を返します。
static private CIMArgument argString(String name, String str ) { return new CIMArgument( name, new CIMValue( str, new CIMDataType(CIMDataType.STRING) ) ); }
- argRef メソッドは、参照タイプの引数を返します。 提示されたオブジェクト・パスが示すインスタンスに対する参照です。
static private CIMArgument argRef( String name, CIMObjectPath path, String className ) { return new CIMArgument( name, new CIMValue( path, new CIMDataType(className) ) ); }