openSUSE:构建服务概念 AttributeStorage
注意:这几乎已经实现并在 opensuse.org 实例上运行。但是,接口和系统在 1.7 版本发布之前可能会发生变化!
OBS 的属性系统旨在允许将简单信息存储到软件包或项目中。首先需要指定一个属性才能允许使用它。属性定义在命名空间内组织。
属性的可能用途是任何类型的元信息,例如
- 软件包维护状态
- 指向外部资源的链接,例如错误报告或屏幕截图
- 对更新资源的引用
任何属性也可以用作高效搜索的标记。例如,给我所有名为“glibc”且应在安全更新中更新的软件包源。
这个概念的状态是 WIP(正在进行中),它在 svn 中已经实现了一半,但尚未部署到服务器上。
在最终 1.7 版本之前,一切都可能发生变化,但候选方案包括
- 将命名空间和属性类型定义移出项目 _meta 文件。
- 当前需要管理员权限才能定义属性的限制将消失。
属性定义
必须在项目元文件中指定命名空间和/或属性。看起来像这样
<project ...
...
<attributes>
<namespace name="OBS">
<modifiable_by group="Admin"/>
</namespace>
<definition name="maintained" namespace="OBS">
<default>
<value>no</value>
<value>0</value>
</default>
<allowed>
<value>0</value>
<value>no</value>
<value>security_only</value>
<value>full_maintenance</value>
</allowed>
<count>2</count> <! -- this attribute must always contain two values -->
<modifiable_by user="demouser"/>
<modifiable_by group="demogroup"/>
<modifiable_by role="demorole"/>
</definition>
</attributes>
...
</project>
命名空间只能在一个地方定义。要创建新的命名空间,您需要管理员权限。
命名空间元素内的 modifiable_by 权限指定谁将被允许修改此命名空间内的属性定义。“OBS”将被保留的命名空间,只有 OBS 开发人员才能修改它,因为已发布的工具和系统依赖于它。
定义元素定义一个属性。其中的所有元素都是可选的。
要查看 OBS 命名空间,您可以使用
osc meta prj OBS
设置属性
属性存储在软件包或项目的自己的文件中。可以通过以下方式访问它们
/source/<project>/<package>/_attribute
“GET”操作列出项目或软件包的所有属性,如下所示
<attributes>
<attribute name="OBS:maintained" />
<attribute name="OBS:maintained" binarypackage="blah-devel" />
<attribute name="OBS:bugnumbers">
<value>12345</value>
<value>0815</value>
</attribute>
</attributes>
“POST”操作用于修改或创建发送的属性,而“DELETE”用于再次删除它们。
API
读取和设置属性
属性是软件包元文件的一部分,可以通过它们进行修改。但是,为了避免仅读取一个属性而下载和解析整个元文件,将有一个属性 api 调用。
如果属性类型定义允许,它也允许修改属性,即使没有对元文件的写入权限。
GET /source/$PROJECT/_attribute[/$ATTRIBUTE_NAME]?with_default=1 GET /source/$PROJECT/$PACKAGE/_attribute[/$ATTRIBUTE_NAME]?with_default=1&with_project=1
POST /source/$PROJECT/_attribute POST /source/$PROJECT/$PACKAGE/_attribute
DELETE /source/$PROJECT/_attribute[/$ATTRIBUTE_NAME] DELETE /source/$PROJECT/$PACKAGE/_attribute[/$ATTRIBUTE_NAME]
对于 GET 和 DELETE 操作,前导 $ATTRIBUTE_NAME 是可选的。如果未设置,则会影响所有属性。请注意,这仅影响属性值,而不影响项目情况下的定义或命名空间声明。
GET 操作上允许使用 with_defaults 参数来提供默认值(如果未定义其他值)。with_project_value 的工作方式类似,但会回退到项目属性值。
按属性搜索
OBS 允许您搜索提供特定属性或甚至绑定到设置为特定值的软件包或项目,通过标准的搜索/XPath 接口
GET /search/package?match=[attribute/@name="OBS:maintained"]
结果是集合,如通常情况
<collection>
<package project="openSUSE:11.2" name="libtheora">
<attributes....
....
</attributes>
</package>
<package ....
...
</package>
</collection>
请注意,无论属性是在软件包中还是在项目中设置的,它都匹配软件包。
OSC 集成
此博客描述了如何使用 osc 中的属性。
示例定义,可能在 openSUSE.org 服务器上使用
这只是一个集合,基于与人交谈时的想法
<attributes>
<namespace name="OBS"> <! -- exists in all OBS instances -->
<modifiable_by role="Admin"/>
</namespace>
<namespace name="openSUSE"> <! -- exists only in opensuse.org OBS -->
<modifiable_by group="Admin"/>
</namespace>
<! -- OBS global attributes -->
<definition name="Maintained" namespace="OBS" >
<count>0</count>
<modifiable_by role="Admin"/>
</definition>
<definition name="UpdateProject" namespace="OBS" >
<count>1</count>
<modifiable_by role="Admin"/>
</definition>
<definition name="Screenshots" namespace="OBS" > <! -- unlimited number of values(URLs) -->
<modifiable_by role="maintainer"/>
</definition>
<! -- openSUSE attributes -->
<definition name="L3-Support" namespace="openSUSE" >
<allowed>
<value>no</value>
<value>upstream_only</value>
<value>security_only</value>
<value>full_maintenance</value>
</allowed>
<count>1<count>
<modifiable_by role="bugowner"/>
</definition>
</attributes>