Hello World, OpenNebula Cloud API 编程

先报告一下我们云计算项目的进度。去年休假前订购的服务器和部件已经陆续到货了,计算节点采用的是 Dell PowerEdge M710HD 刀片服务器,特别为数据中心级虚拟应用设计,海量内存、密集 IO 吞吐等优势,特别适合云计算、虚拟机等应用。现在正在等 Dell 的售后技术人员过来安装服务器和存储阵列,有些电源和机柜问题需要解决,顺利的话下周服务器可以上线。

dell poweredge m710hd

OpenNebula 提供了 XML-RPC 的方式访问 OpenNebula Cloud Api (OCA),这样就允许不同操作系统、不同语言编写的客户端程序可以通过 XML-RPC 远程调用的方式来访问 OpenNebula 服务。下面通过两个不同语言编写的最简单例子抛砖引玉一下,来看看如何是如何与 OCA 打交道的。

OpenNebula 绝大部分是由 Ruby 编写的,其提供的 Ruby OCA API 实现当然是最丰富和完整的。先安装 Ruby OCA Bindings:

$ sudo gem install oca

用 Ruby 编写一小段代码试验一下,以下代码用来打印当前云里每个计算结点的 hostname:

#!/usr/bin/ruby

require 'rubygems'
require 'oca'

include OpenNebula

# OpenNebula credentials
CREDENTIALS = "oneadmin:vpsee"

# XML_RPC endpoint where OpenNebula is listening
ENDPOINT    = "http://localhost:2633/RPC2"

client = Client.new(CREDENTIALS, ENDPOINT)
host_pool = HostPool.new(client)
rc = host_pool.info

# Print all the hostname from the host pool
host_pool.each do |host|
     puts host.name
end

再来看看用 Python 如何编写上面类似功能的代码。安装 Python OCA Bindings:

$ sudo easy_install oca

用 Python 编写一小段代码看一下:

#!/usr/bin/python

import oca

# OpenNebula credentials
CREDENTIALS = "oneadmin:vpsee"

# XML_RPC endpoint where OpenNebula is listening
ENDPOINT    = "http://localhost:2633/RPC2"

client = oca.Client(CREDENTIALS, ENDPOINT)
host_pool = oca.HostPool(client)
host_pool.info()

# Print all the hostname from the host pool
for host in host_pool:
    print host.name

应该没人会想在这种情况下用 Java 或 C++ 吧,Programming Examples 里面提供的 Java OCA 和 C++ 例子比 Ruby, Python 复杂得多。

评论 (9 Comments)

  1. 最终采用OpenNebula了?
    放弃openstack了?

  2. @babo
    首选 OpenStack,第二选择 OpenNebula,备份方案 VMware vSphere.

  3. LingCloud就是用OpenNebula作为执行引擎,不过现在新版本的OpenNebula本身的应用层工具已经做得不错了,LingCloud的发展方向需要进一步思考。

  4. 关注ING!

  5. 能说说选择OpenStack、OpenNebula的主要考虑吗?和商业软件比较有何优缺点?

  6. hi,问个问题:OpenNebula中
    onehost list
    ID NAME CLUSTER RVM TCPU FCPU ACPU TMEM FMEM STAT
    1 vm-container-26-2 default 5 1600 1598 1100 23.9G 22.4G on
    如上信息,CPU的统计都是*100,vpsee知道nebula为什么这么做吗?
    当我创建8CPU、8G内存的虚拟机后,onevm list 能看到虚拟机由pending变为prolog状态,对应所属主机内存会马上减掉8G,更新到nebula数据库host…表中. 但是CPU为什么只是减少了1个? 不应该是8个吗?请教下vpsee,盼复!!谢谢!

  7. 楼主试过用php xmlrpc 与opennebula的xmlrpc API进行对接吗?今天搞了一整天,返回的error no是512,也就是 0x0200 AUTHORIZATION User is not authorized to perform the requested action.
    这是用户认证的问题,还是认证后没有对这个操作进行授权呢?望解答一下。关注本贴!

    ======================================
    测试php文件如下:
    <?php
    require_once('/root/software/xmlrpc/xmlrpc-2.2.2/lib/xmlrpc.inc');
    $UserPwd = ":”;
    $m = new xmlrpcmsg(‘one.hostpool.info’,array(new xmlrpcval($HTTP_POST_VARS[“$UserPwd”], “string”)));
    $c = new xmlrpc_client(“/RPC2”, “localhost”, 2633);
    $r = $c->send($m);
    if (!$r->faultCode()) {
    $v = $r->value();
    print “State number ” .$HTTP_POST_VARS[$UserPwd] . ” is ” .$v->scalarval() . “\n”;
    print “I got this value back” .$r->serialize() . “\n”;
    } else {
    print “Fault\n”;
    print “Code: ” . $r->faultCode(). “\n” .
    “Reason: ” .$r->faultString() . “\n”;
    }
    print $r->faultCode().”\n”;

    ?>

  8. 楼上的为 $UserPwd = “oneadmin:password”;
    不知道怎么不见了

  9. 返回

    0
    [HostPoolInfo] User [-1] : Not authorized to perform INFO_POOL HOST.
    512

发表评论