1 什么是zManager 以及其REST API 接口
zEnterprise System由三大部分组成:IBM zEnterprise 大型机、IBM zEnterprise BladeCenter Extension (zBX)刀片扩展机柜和IBM zEnterprise Unified Resource Manager (Unified Resource Manager,zManager)管理固件,zManager能够管理跨越System Z、特定的POWER7和System x服务器上运行的工作负载,实现资源的统一管理。
HMC是管理zManager的访问点。在这个范围内,HMC提供了一个基于WEB的,可以远程操作的图形用户界面(UI),让用户可以操作zManager的。另外,HMC也具备zManager webservice API的实现,这些API与UI的操作是相对应的。
Webservice API是一个面向WEB的编程接口,它可以让潜在的zManager的功能能够被一些高级的应用程序、系统自动化方法,或者例行脚本所使用。
2 API的组件
Web Services API包括两个主要的组件,分别是Web services接口和异步通知(Asynchronous Notification),这两个组件都是通过客户端应用程序对HMC发起TCP/IP网络连接去访问的。
2.1 Web services接口
Web services接口是一个面向request和response的编程接口,通过它,客户端应用程序可以获取zManager所管理的系统资源的信息,并可以对这些资源进行配置和控制等各种动作。
正如任何面向web的接口,客户端应用程序通过位于TCP/IP socket连接之上的HTTP传输协议与Web services接口进行交互。客户端应用程序通过组装并发送基于文本的消息发起一个HTTP request,同样,Web services API返回一个基于文本的HTTP response。使用HTTP让客户端API编程语言变得多元化。Java,Perl和Python等广泛支持HTTP操作的语言都可以被用来实现客户端应用程序。
Web service API的设计受到了表示状态转移(Representational State Transfer,REST)接口设计思想的影响。可管理的系统资源被关联到持久的URI,并可以通过URI进行标识。REST风格下的get,put,post和delete操作恰好对应HTTP的GET, PUT, POST和Delete方法。Request和Response的数据使用Javascript Object Notaion(JSON)来表示。将API方法映射到HTTP的做法简化了客户端应用程序的开发过程,使得客户端不必像使用其他web service接口设计方法那样,需要有额外的工具和库才可以访问API。
2.2 异步通知
Web Services接口大多应用在客户端应用程序与zManager之间的交互是短期行为的场景下:客户端发送一个request,获得一个response,处理这个response,然后就会“忘记”与它进行交互的zManager资源。也就是说,此时客户端并不试图长期保持(或者缓存)zManager资源且维护缓存使其具有时效性。
然而对于一些比较高级的管理应用程序,包括discovery,monitoring和高级的provisioning,并非基于它们对zManager的需求去“请求并忘记”zManager资源。取而代之,它们需要长期保存(如缓存)很多zManager资源的目录信息、配置和状态等等,并使其具有时效性。
为了支持这种更高级的应用程序,Web services API提供了一个异步通知模块,通过它,zManager可以及时通知感兴趣的客户端资源的更新。异步通知模块使用Java Message Serive(JMS)开发,它是一个开源的可以用来在各个应用之间传递消息的标准的API和框架。
3 如何使用zManager API?
调用API即通过编程的手段操作该接口。通过编程的方式访问 zManage web service API, 所选的编程语言无论内建还是扩展,必须支持如下特性:
支持HTTP
支持SSL
创建和解析JSON对象
支持JMS链接或者STOMP协议(可选)
3.1 Python以及其优点
而Python能够很好的支持以上特性,此外还成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。
Python是一种面向对象、直译式计算机程序设计语言。Python语法简洁而清晰,具有丰富和强大的类库。Python也翻译作“蟒蛇”,该语言的特性是善于将不同的系统缠绕在一起。因此它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
3.2 操作zManager API的基本流程
API是基于会话的(session), 所有的请求都是在一个API session中完成的。
操作API的流程如下:
1 . 与HMC建立SSL socket
# Connect to HMC at address
conn = httplib.HTTPSConnection(HMCserver, 6794, timeout=100)
conn.connect()
2. 登录到HMC打开一个API session
logon_req = {"userid": userid, "password": password}
req_body = json.dumps(logon_req)
req_hdrs = {"Content-Type": "application/json"}
conn.request("POST", "/api/sessions", req_body, req_hdrs)
response = conn.getresponse()
if response.status != 204:
# If the response provides a body, always read it.
resp_body = response.read()
if response.status != 200:
# Handle failure (eg. wrong psasword)
raise Exception("Request failed (status: %d)" % response.status)
# Retrieve session id from response for later use
logon_resp = json.loads(resp_body)
session_id = logon_resp["api-session"]
3 . 发起一个API请求
# 获取HMC的特性,其中session id是上一步创建的
req_hdrs = {"X-API-Session": session_id}
conn.request("GET", "/api/console", None, req_hdrs)
response = conn.getresponse()
if response.status != 204:
resp_body = response.read()
if response.status != 200:
raise Exception("Request failed (status: %d)" % response.status)
# Convert result JSON into Python objects for processing
console_props = json.loads(resp_body)
print "HMC name is %s." % console_props["name"]
4. 退出登录,关闭API session
req_hdrs = {"X-API-Session": session_id}
conn.request("DELETE", "/api/sessions/this-session", None, req_hdrs)
response = conn.getresponse()
if response.status != 204:
resp_body = response.read()
if response.status != 204:
raise Exception("Request failed (status: %d)" % response.status)
4 应用实例:使用API激活一个LPAR
通过API去激活一个LPAR需要使用HTTP方法POST, 请求的URI为/api/logical-partitions/{logical-partition-id}/operations/activate
在请求的实体中需要构建一个JSON对象包含如下内容:
activation-profile-name:所使用的activation profile的名字
在这个请求的URI中{logical-partition-id}是所要激活的LPAR的id,要获取这个ID
1.首先需要列出当前HMC所管理的CPC,返回结果包含{cpc-id}
GET /api/cpcs
2.接着列出当前CPC下的LPAR,返回结果包含{logical-partition-id}
GET /api/cpcs/{cpc-id}/logical-partitions
获取到LPAR的id就可以发起激活LAPR的请求了, 通常{logical-partition-id}的格式类似如下字符串“fd0255cc-bf90-3295-b8e6-ba61ddc0c08f”。
body_dict = { activation-profile-name : DEFAULT }
body = json.dumps(body_dict)
conn.post("api/logical-partitions/fd0255cc-bf90-3295-b8e6-ba61ddc0c08f/operations/activate", body)
激活一个logical partition 将包含以下操作:
初始化logical partition
给logical partition 分配系统资源
为logical partition 加载CP(control program)或者是操作系统
可见该操作需要一定时间才能完成,当激活LPAR的操作发起后,后台会返回状态码为202(Accepted)的响应。该响应的实体包含一个URI,查询该URI会得到激活LPAR操作的状态: "running" 或者"completed" .当状态为“completed”时激活LPAR的操作完成,同时响应中包含操作的结果。
通过上面的例子展示了通过zManager API 管理主机的方法,事实上zManager 提供了相当丰富的API,几乎涵盖了HMC里涉及到的所有操作,可以参考System z Hardware Management Console Web Services API (Version 2.11.1)了解API的细节。
参考资料:
关于z/OS的信息请访问http://www-03.ibm.com/systems/z/os/zos/
关于zManager API 请参考Hardware Management Console Web Services API Version 2.11.1, IBM System z (SC27-2616-00)
原文链接: https://www.ibm.com/developerworks/community/blogs/IBMzOS/entry/20131207?lang=en