写在前面的话
一直想对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')