标签(Tags)¶
目录
概览¶
ZStack提供两类标签来帮助用户和插件管理资源, 引入额外的资源属性, 以及指挥ZStack执行特殊的业务逻辑. 对于标签的架构设计请参见`The Tag System <http://zstack.org/blog/tag.html>`_.
用户标签(User Tags)¶
用户可以在他们所拥有的资源上创建用户标签,这对于管理相似资源的聚集特别有用; 例如, 用户可以为作为网页服务器(Web Server)的虚拟机设置一个标签’web’:
CreateUserTag resourceType=VmInstanceVO resourceUuid=613af3fe005914c1643a15c36fd578c6 tag=web
CreateUserTag resourceType=VmInstanceVO resourceUuid=5eb55c39db015c1782c7d814900a9609 tag=web
CreateUserTag resourceType=VmInstanceVO resourceUuid=0cd1ef8c9b9e0ba82e0cc9cc17226a26 tag=web
之后, 可以通过:ref:`Query API with tags <query with tags>`来获取这些虚拟机:
QueryVmInstance __userTag__=web
用户也可以通过用户标签和系统标签(system tags)合作来改变ZStack的业务逻辑; 例如, 用户可能想在所有作为网页服务器的虚拟机上在一个特定的通过SSD提高IO性能的主存储上创建他们的根存储云盘(root volumes); 要达到这个目的, 用户可以在主存储上创建一个用户标签’forWebTierVM’:
CreateUserTag tag=forWebTierVM resourceType=PrimaryStorageVO resourceUuid=6572ce44c3f6422d8063b0fb262cbc62
然后在计算规格(instance offering)上创建一个系统标签:
CreateSystemTag tag=primaryStorage::allocator::userTag::forWebTierVM resourceType=InstanceOfferingVO resourceUuid=8f69ef6c2c444cdf8c019fa0969d56a5
这样, 当用户创建通过计算规格[uuid:8f69ef6c2c444cdf8c019fa0969d56a5]创建虚拟机的, ZStack会保证虚拟机的根存储云盘都会被创建在拥有用户标签’forWebTierVM’的主存储上, 在这个例子中, 这个主存储的UUID为6572ce44c3f6422d8063b0fb262cbc62.
系统标签(System Tags)¶
系统标签相比用户标签有更广泛的用途; 就像上一节中的例子一样,用户可以使用它们来指导ZStack执行特殊的业务逻辑. 扩展ZStack功能的插件(Plugins)可以通过使用系统标签来引入额外的资源属性, 或记录和资源紧密相关的元数据.
例如, 要想在KVM主机上实施在线迁移(live migration)或者在线快照(live snapshot), ZStack需要知道KVM主机的libvirt版本和QEMU版本,这些信息都是元数据 因此ZStack将他们作为主机的系统标签存储起来. 例如, 管理员可以通过下面的命令查看一个KVM主机的系统标签:
QuerySystemTag fields=tag resourceUuid=d07066c4de02404a948772e131139eb4
*d07066c4de02404a948772e131139eb4*是某个云主机的UUID, 查询结果为:
{
"inventories": [
{
"tag": "capability:liveSnapshot"
},
{
"tag": "qemu-img::version::2.0.0"
},
{
"tag": "os::version::14.04"
},
{
"tag": "libvirt::version::1.2.2"
},
{
"tag": "os::release::trusty"
},
{
"tag": "os::distribution::Ubuntu"
}
],
"success": true
}
这一类的系统标签, 被称为内部系统标签(inherent system tags); 内部系统标签只能被ZStack的服务(services)或插件(plugins)创建, 并且不能被DeleteTag API删除.
为了增加新的功能, 插件通常需要为一个资源添加新的属性; 虽然插件不能通过改变一个资源的数据库模式(database schema)来增加一个新的列(column) , 但它可以为一个资源创建作为系统标签的新属性. 例如, 当创建一个虚拟机时, 用户可以为云主机某L3网络上的网卡绑定一个可以通过网络访问的机器名(hostname):
CreateVmInstance name=testTag systemTags=hostname::web-server-1 l3NetworkUuids=6572ce44c3f6422d8063b0fb262cbc62 instanceOfferingUuid=04b5419ca3134885be90a48e372d3895 imageUuid=f1205825ec405cd3f2d259730d47d1d8
这个机器名被实现为一个系统标签; 如果你查看 VM inventory in chapter ‘Virtual Machine’, 那里没有叫做’hostname’的属性; 然而, 你可以在 虚拟机的系统标签中发现它:
QuerySystemTag fields=tag,uuid resourceUuid=76e119bf9e16461aaf3d1b47c645c7b7
{
"inventories": [
{
"tag": "hostname::web-server-1",
"uuid": "596070a6276746edbf0f54ef721f654e"
}
],
"success": true
}
这类系统标签就是非内部的(non-inherent), 用户可以通过DeleteTag删除它; 例如, 如果用户想把一个之前的虚拟机的机器名更改为 ‘web-server-nginx’, 可以这样做:
DeleteTag uuid=596070a6276746edbf0f54ef721f654e
CreateSystemTag resourceType=VmInstanceVO tag=hostname::web-server-nginx resourceUuid=76e119bf9e16461aaf3d1b47c645c7b7
停止和启动虚拟机之后, 虚拟机中的系统(guest operating system)会接受到’web-server-nginx’作为新的机器名.
命名约定(Name Convention)¶
用户标签和系统标签最多都只能有2048个字符.
对于用户标签, 没有强制的命名约定, 但推荐使用可读的有意义的字符串.
对于系统标签, 和ZStack中服务和插件定义的一样, 他们使用 :: 作为分隔符(delimiters).
资源类型(Resource Type)¶
当创建一个标签时, 用户必须制定标签所关联的资源类型(resource type). 在当前版本中, 资源类型被列在下表中:
ZoneVO |
ClusterVO |
HostVO |
PrimaryStorageVO |
BackupStorageVO |
ImageVO |
InstanceOfferingVO |
DiskOfferingVO |
VolumeVO |
L2NetworkVO |
L3NetworkVO |
IpRangeVO |
VipVO |
EipVO |
VmInstanceVO |
VmNicVO |
SecurityGroupRuleVO |
SecurityGroupVO |
PortForwardingRuleVO |
VolumeSnapshotTreeVO |
VolumeSnapshotVO |
衍生出的资源使用他们的父类型; 例如, SftpBackupStorage的资源类型是’BackupStorageVO’. 在每个资源的对应*Tags*章节中, 我们有解释需用用什么资源类型来创建对应的标签.
操作(Operations)¶
创建标签(Create Tags)¶
有两种创建标签的方式; 对于已经创建的资源, 用户可以使用命令 CreateUserTag 或者 CreateSystemTag来创建用户标签或系统标签. 例如:
CreateUserTag resourceType=DiskOfferingVO resourceUuid=50fcc61947f7494db69436ebbbefda34 tag=for-large-DB
CreateSystemTag resourceType=HostVO resourceUuid=50fcc61947f7494db69436ebbbefda34 tag=reservedMemory::1G
对于一个将要被创建的资源, 因为它还没有被创建, 所以没有UUID可以被CreateUserTag和CreateSystemTag命令引用; 在这种情况下, 用户可以使用每个“创建类型的API命令”(creational API command)的*userTags*和*systemTags*域, 在创建时,用户可以通过传递列表的形式定义多个标签; 例如:
CreateVmInstance name=testTag systemTags=hostname::web-server-1
userTags=in-super-data-center,has-public-IP,hot-fix-applied-2015-5-1
l3NetworkUuids=6572ce44c3f6422d8063b0fb262cbc62
instanceOfferingUuid=04b5419ca3134885be90a48e372d3895 imageUuid=f1205825ec405cd3f2d259730d47d1d8
参数(Parameters)¶
CreateUserTag和CreateSystemTag有相同的API参数:
名字 | 描述 | 可选的 | 起始支持版本 |
---|---|---|---|
resourceUuid | 资源UUID; 例如, 虚拟机的UUID, 计算规格的UUID | 0.6 | |
resourceType | 资源类型; 参见 resource type | 0.6 | |
tag | 标签字符串 | 0.6 |
删除(Delete Tag)¶
用户可以使用DeleteTag来删除一个用户标签或者一个非内部的系统标签. 例如:
DeleteTag uuid=7813d03bb85840c489789f8df3a5915b
参数(Parameters)¶
名字 | 描述 | 可选的 | 可选的参数值 | 其实支持版本 |
---|---|---|---|---|
deleteMode | 参见 删除资源(Delete Resources) | 是 |
|
0.6 |
uuid | 标签的UUID | 0.6 |
查询标签(Query Tags)¶
用户可以使用QueryUserTag来查询用户标签, 例如:
QueryUserTag resourceUuid=0cd1ef8c9b9e0ba82e0cc9cc17226a26 tag~=web-server-%
或使用QuerySystemTag来查询系统标签, 例如:
QuerySystemTag resourceUuid=50fcc61947f7494db69436ebbbefda34