openubmc 新建一个组件
新建组件框架
openUBMC CLI支持一键创建新组件,简化组件框架搭建流程。
组件初始化
通过bingo执行新建组件命令,组件名称为my_app,使用openUBMC的Lua SDK作为组件SDK
# 进入到工作目录
cd /home/workspace
# 创建新组件
bingo new -n my_app -t application -l lua -conan 2.0
执行完毕后,我们便可以在工作目录下看到一个新的文件夹my_app,其中包括了组件需要的所有基础内容。
> ls -l my_app
total 40
-rw-r--r-- 1 root root 0 Jan 17 07:22 CHANGELOG.md
-rw-r--r-- 1 root root 1273 Jan 17 07:22 CMakeLists.txt
-rw-r--r-- 1 root root 673 Jan 17 07:22 Makefile
-rw-r--r-- 1 root root 0 Jan 17 07:22 README.md
-rw-r--r-- 1 root root 102 Jan 17 07:22 conanfile.py
-rw-r--r-- 1 root root 141 Jan 17 07:22 config.cfg
drwxr-xr-x 2 root root 4096 Jan 17 07:22 mds
-rw-r--r-- 1 root root 624 Jan 17 07:22 permissions.ini
drwxr-xr-x 4 root root 4096 Jan 17 07:22 src
drwxr-xr-x 3 root root 4096 Jan 17 07:22 temp
drwxr-xr-x 4 root root 4096 Jan 17 07:22 test
drwxr-xr-x 3 root root 4096 Jan 17 07:22 user_conf
为了后续方便版本管理,需要进行git初始化(必须要做,不做构建会失败)
# 进入到my_app项目路径
cd /home/workspace/my_app
# git初始化
git init .
git add -A
git commit -m "init"
新增MDS资源对象定义
openUBMC系统中,每个组件都拥有自己的业务资源,通过遵循MDS模型定义,openUBMC即可以完成BMC整体资源的建模,统一系统内的交互规范。同时基于相同的模型基础,openUBMC运行框架简化了组件间的交互逻辑,组件开发人员仅需围绕着自身的资源对象进行业务逻辑代码编写。
首先进入到新建的my_app项目中打开mds/model.json,粘贴以下配置
{
"MyMDSModel": {
"path": "/bmc/demo/MyMDSModel/${id}",
"interfaces": {
"bmc.demo.OpenUBMC.Community": {
"properties":{
"WelcomeMessage": {}
}
}
},
"properties": {
"SecretNumber": {
"baseType": "U32"
}
}
}
}
模型代码生成
mds/model.json仅定义了资源对象的含义,但并不能直接使用。因此我们需要通过自动生成代码的方式,将模型转换成实际的代码。
通过CLI进行模型代码生成
bingo gen
运行结束后,我们在组件的文件目录中可以看到gen文件夹,里面是基于mds新建的模型生成出来的辅助代码。利用这些代码,我们便可以很轻易地在openUBMC中创建系统资源。具体自动生成的代码含义,以及详细介绍,请参考《代码自动生成》
创建资源对象
自动生成代码仅仅生成了管理代码,但并没有真正的创建实例。因此我们需要在组件的代码中去创建实例对象。
打开src/lualib/my_app_app.lua,粘贴下方代码
local class = require 'mc.class' -- lua开发框架提供的增强类型系统
local c_service = require 'my_app.service' -- 自动生成代码生成的组件基类
local app = class(c_service) -- 创建一个组件类型
function app:ctor() -- 组件的构造函数
end
function app:init() -- 组件的初始化函数
app.super.init(self) -- 先调用基类的初始化函数
self.my_mds_model = self:CreateMyMDSModel(1, function(object) -- 创建一个mds对象实例,名字为1
object.ObjectName = "MyMDSModel_1" -- 在回调函数中进行对象的属性赋值
object.WelcomeMessage = "Hello OpenUBMC!"
object.SecretNumber = 330
end)
end
return app
openUBMC基于Lua语言创建了一套面向对象编程框架,简化Lua类的创建和管理。
ctor函数即代表类的构造函数,用于创建具体的内存对象实例。
init函数用于初始化对象的属性,会在ctor函数调用后立即调用。
app类是基于openUBMC SDK框架创建的子类,因此可以调用框架的代码进行MDS对象操作。self:CreateMyMdsModel便是基于mds/model.json中定义的对象生成的辅助代码,帮助开发者快速创建对象。
组件SDK框架更多细节请参考此章节。《组件开发》
组件构建
代码写完后,我们需要在真实环境上测试一下我们写的代码。因此需要将my_app组件打包到BMC版本中。
openUBMC拥有组件级构建和产品级构建的两层构建体系,利用业界成熟的开源软件Conan进行组件构建包的管理。
因此需要先将组件构建后,再进行整包构建。
bingo build --stage=stable
构建成功后,我们可以看到打印了许多my_app/0.0.1@openubmc/stable的文字,这个就是my_app版本0.0.1的构建标签。后续在任何和组件构建产物相关的地方,我们都会使用此标签来指向这次的组件构建包。
整包构建
由于我们新建了一个组件,当前的manifest中并不包含这个新组件。
所以第一步,我们需要将组件添加至manifest组件列表中。
首先我们需要找到产品对应的定义文件:
> cd /home/workspace/manifest
> ls build/product/
ca BMC
> ls build/product/BMC
openUBMC
> ls build/product/BMC/openUBMC
archive.ini manifest.yml permissions.ini rootfs update_ext4.cfg version.xml
manifest/build/product/BMC/openUBMC/manifest.yml便是定义产品的基础信息,包括具体包括的组件。
打开manifest.yml,在dependencies:下面添加my_app
dependencies:
- conan: "my_app/0.0.1@openubmc/stable"
添加完成后,我们便可以按照之前的方式进行整包构建。
bingo build -b openUBMC
构建完成后,便可在manifest/output中查看构建包。
整包测试
无硬件环境验证组件集成
如果您当前没有真实的BMC硬件,可以通过检查整包构建产物的方式,验证新组件已被正确集成到产品包中。
整包构建过程中,会先在temp构建工作区生成集成后的rootfs目录(tmp_root),它就是hpm包内rootfs镜像的直接来源,其中的文件会原样打包进升级包。因此只需检查该目录:
# 进入manifest工作目录
cd /home/workspace/manifest
# 确认组件部署文件已集成到rootfs
ls temp/build_openUBMC_debug_dev/tmp_root/opt/bmc/apps/my_app
# 确认组件服务单元文件已集成到rootfs
ls temp/build_openUBMC_debug_dev/tmp_root/etc/systemd/system/my_app.service
可以看到my_app的部署文件,包括业务代码lualib/my_app_app.lua、mds编译产物mds/、自动生成的模型代码class/等,以及组件服务单元文件my_app.service,说明组件已随整包构建打入升级包。
build_openUBMC_debug_dev目录名与构建类型相关,如果您使用了其他构建类型,请将路径中的debug替换为对应类型,或使用temp/build_openUBMC_/tmp_root通配匹配。*

浙公网安备 33010602011771号