基于openstack二次开发IaaS平台:Solid

写在前面的话

一直想对2016进行总结一下,可是没有时间,现在刚好有时间就把自己2016年做的工作总结一下吧。

2016年主要做了一个项目,项目代号为Solid的Iaas平台,这个平台主要是把硬件资源暴露给租户进行使用,使租户可以充分的申请资源,然后调用或者查看自己已有的资源。

  • 硬件即服务平台以下简称(solid)有三个系统组成:
    – 采购系统,设备管理系统,IDC系统
  • 以下主要介绍一下设备管理系统和IDC系统,

设备管理系统

设备管理系统的功能:

1.添加设备,记录设备的硬件信息;
2.对于服务器可以远程进行开机与关机,并获取console
3.对于裸机可以安装租户上传镜像,进行远程的装机

服务器的来源有两个地方,一个是走采购系统进行自动的生成,另外就是直接在设备管理进行添加。

对于设备的管理,我们分为两种权限,一种是admin权限,管理员可以查看所有的物理设备,对于普通用户则只能查看属于他名下的设备,或者说用户所在组的设备,这里的分组是用project_id来进行分组的。
这里写图片描述
对于设备我们在设备管理页面可以清晰的看到所有设本,看到他所属的人,所属的IDC 并且可以对设备进行管理。

设备管理我们使用的是openstack的组件ironic,下面我们主要介绍一下我们在solid项目中怎么实现远程的开机,关机,装操作系统。
这里写图片描述
ironic的逻辑主要实在服务器的controller这里进行实现的,安装了ironic的客户端放在了common这个目录中

ironic

#这个是ironic的控制节点
class Controller(rest.RestController):

    def __init__(self):      
        #实例化ironic的客户端
        super(Controller, self).__init__()
        self.ironicclient = client_wrapper.IronicClientWrapper()

    def _wait_for_power_state(self, ironic_node_id): 
    #这里是判断node的状态是不是关机,如果状态为None,则跳出循环
        """Wait for the node to complete a power state change."""
        node = self.ironicclient.call('node.get', ironic_node_id)

        if node.target_power_state is None:
            raise loopingcall.LoopingCallDone()

    def _wait_for_provision_manageable(self, ironic_node_id):
       #这里是检查node节点到没有到可manageable的状态,就是可以操作的状态
        node = self.ironicclient.call('node.get', ironic_node_id)
        if node.provision_state == 'manageable':
            raise loopingcall.LoopingCallDone()

    def _wait_for_provison_available_or_error(self, ironic_node_id):
       # 这里是个检查,如果不是available专业并且不是错误的状态,这样代表node进入
       #可以操作的状态
        node = self.ironicclient.call('node.get', ironic_node_id)
        if node.provision_state != 'available' and node.provision_state != 'error':
            raise loopingcall.LoopingCallDone()

    def _get_project(self):
    #从keystone获取project的列表,获取用户的id和用户名
        project_list = keystone_client.get_client().projects.list()
        # print dir(project_list)
        project_dict = dict((project.id, project.name)
                            for project in project_list)
        return project_dict
上面是几个状态的检查,判断服务器到没到可以被操作的状态
#这里是删除ironic的node节点信息
def _delete_ironic_node(self, ironic_node_id):
        try:

            ironic_node = self.ironicclient.call('node.get', ironic_node_id)
            #传入ironic节点的id,获取一个实例
        except Exception, msg:
            LOG.info(msg)
            return None

         #这里是先判断的node的状态,如果node节点是clean wait状态则必须把node的状态
         #转变为可操作的状态才能删除ironic节点 
        if ironic_node.provision_state == 'clean wait':
            self.ironicclient.call(
                'node.set_provision_state', ironic_node.uuid, 'abort')
                #先置为abort(中止)状态
            self.ironicclient.call(
                'node.wait_for_provision_state', ironic_node.uuid, 'clean failed')  
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值