在开发自动化和可视化应用程序时,经常需要与存储系统进行交互。EMC的Isilon是一个可扩展的网络附加存储(NAS)平台,它提供了一个REST API,允许通过编程方式管理集群。本文将介绍如何使用C#和.NET框架来访问Isilon的API,包括认证、授权以及如何获取集群数据。
IsilonAPI的主要组成部分包括认证/授权,它决定了提供的用户名和密码是否有效,并且是否有权使用API。API分为两个子部分:平台部分和命名空间部分。平台部分允许查看和修改集群的配置,而命名空间部分则根据访问级别,允许访问集群上的文件系统和文件。
如果打算使用API在集群上进行配置更改,强烈建议将所有请求发送到单个节点,以避免配置冲突。
有两种方式可以对Isilon API进行认证。第一种是使用基本认证,这意味着必须在每个请求的HTTP头中包含凭据。每个请求都需要针对集群进行认证,这会带来一些开销。
string IsilonServerAddress = "https://10.20.30.160:8080";
string ResourceString = "/platform/1/dedupe/dedupe-summary";
string UserName = "*username*";
string Password = "*password*";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(IsilonServerAddress + ResourceString);
request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(UserName + ":" + Password)));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
上述代码创建了一个HTTP Web请求对象,并指定了集群节点的IP地址。它还指定了要获取的资源,在这个例子中是/platform/1/dedupe/dedupe-summary,它是平台部分的一部分。这个API调用将返回一个包含集群去重统计信息的响应。
返回的页面包含以JavaScript对象表示法(JSON)格式请求的数据,如下所示:
{
"summary": {
"block_size": 8192,
"estimated_physical_blocks": 0.0,
"estimated_saved_blocks": 0.0,
"logical_blocks": 0.0,
"saved_logical_blocks": 0.0,
"total_blocks": 18609648,
"used_blocks": 1406655.0
}
}
第二种对Isilon API进行认证的方式是使用会话cookie。在这种方法中,使用HTTP POST命令将JSON认证对象传递给Isilon API。集群的响应将包含一个会话cookie,该cookie可以在一段时间内用于访问集群上的资源。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(IsilonServerAddress + ResourceString);
request.Method = "POST";
request.ContentType = "application/json";
StringBuilder builder = new StringBuilder();
builder.Append("{\r\n");
builder.Append("\"username\": \"" + UserName + "\", \r\n");
builder.Append("\"password\": \"" + Password + "\",\r\n");
builder.Append("\"services\": [\"platform\"] \r\n");
builder.Append("}");
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(builder.ToString());
writer.Flush();
writer.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string cookie = response.Headers["Set-Cookie"];
response.Close();
现在已经获得了cookie,可以使用它来请求与前面示例中相同的去重统计信息。这次将cookie放在请求流上,以对集群的请求进行认证。响应将与前面示例中返回的JSON对象相同。
ResourceString = "/platform/1/dedupe/dedupe-summary";
request = (HttpWebRequest)WebRequest.Create(IsilonServerAddress + ResourceString);
request.Headers.Add("Cookie", cookie);
response = (HttpWebResponse)request.GetResponse();
现在已经成功连接、认证,并且可以从集群请求资源,下一步是将数据序列化为.NET对象,以便在应用程序中使用。上述示例返回了一个Summary类型的对象,详细的信息可以在EMC提供的API参考文档中找到。
为了将返回的数据序列化为.NET对象,需要定义一个带有适当数据合同定义的.NET类。
[DataContract]
public class DeduplicationStats
{
[DataMember(Name = "block_size")]
public int BlockSize;
[DataMember(Name = "estimated_physical_blocks")]
public int EstimatedPhysicalBlocks;
[DataMember(Name = "estimated_saved_blocks")]
public int EstimatedSavedBlocks;
[DataMember(Name = "logical_blocks")]
public int LogicalBlocks;
[DataMember(Name = "saved_logical_blocks")]
public int SavedLogicalBlocks;
[DataMember(Name = "total_blocks")]
public int TotalBlocks;
[DataMember(Name = "used_blocks")]
public int UsedBlocks;
}
[DataContract]
public class IsilonResponse
{
[DataMember(Name = "summary")]
public DeduplicationStats DedupeStats;
}
现在可以使用System.Runtime.Serialization.Json命名空间中的DataContractJsonSerializer对象将JSON对象序列化为IsilonResponse对象。完成以下代码后,可以访问对象以获取集群去重统计信息。
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(IsilonResponse));
IsilonResponse stats = (IsilonResponse)js.ReadObject(response.GetResponseStream());
这是一个简单的示例,展示了如何使用C#和.NET框架连接到Isilon集群并对其执行基本命令。API具有丰富的功能,包括配置和文件系统访问。可以使用API执行审计、配置协议、作业、池、配额和快照设置等配置任务,以及目录和文件级别的操作。