Heat提供了一种开放式的资源接入框架,通过资源接入框架为所有的资源提供资源接入支持。当需要接入一种新的资源时,只需要实现所提供的资源接口,并完成对应的资源操作逻辑即可。
目前,Heat的所有资源模块实现均在engine/resources目录下,为了了解Heat的资源类型是如何工作的,我们以OS::Nova::Server资源类型为例子,讲解Heat通用的资源类型的实现模式。
OS::Nova::Server这个资源类型在Heat中完成了虚拟机创建和相应的初始化工作。如云磁盘挂载、调用cloud-init/heat-cfntool和虚拟机交互等。为了实现这个功能,需要完成以下工作。
1)在engine/resources目录下创建一个server.py文件,这个文件首先要定义一个resource_mapping方法来确定资源类型名称和实现类的映射关系,如下:
def resource_mapping: return {'OS::Nova::Server': Server, }
这样,Heat引擎就可以识别这个资源类型的具体实现。
2)如上面定义的类型映射关系所示,需要在Server.py中定义一个Server类,继承engine.resource.resource.Resource,并重写具体逻辑,作为资源类型的具体实现,如下:
class Server(stack_user.StackUser):
这里的父类stack_user.StackUser是engine.resource.resource.Resource的一个子类。
3)在Server类中,实现资源类型的生成周期管理操作,如handle_create()完成资源的创建操作。如果此时需要调用OpenStack的其他组件,则可通过Heat内置的Clients组件进行调用。在一个资源操作中,可能会与多个组件发生多次交互,直至完成资源的创建,如这里的虚拟机创建过程,先会调用Glance进行镜像信息获取和验证,然后再调用Nova进行虚拟机创建。创建过程中,还是调用Neutron组件进行网络初始化。
4)资源接入的具体调用流程如下:
总体上,我们也可以将一个Heat模板理解为一个最大的资源,将Heat模板丢给Heat引擎执行时,模板首先会被解析成一个大的资源类型,然后再依次将模板内的资源解析成小资源模板进行处理。
完整的Heat内置资源类型与OpenStack各组件之间的整体交互关系如图6-2所示。