允许用户设置和检索服务器描述¶
Launchpad 蓝图位于
https://blueprints.launchpad.net/nova/+spec/user-settable-server-description
允许用户在创建、重建或更新服务器时设置服务器的描述。允许用户获取服务器描述。
问题描述¶
目前,当服务器创建时,描述会被硬编码为服务器显示名称。服务器重建时无法设置描述。
用户无法在服务器上设置或检索描述。目前,他们需要使用其他字段,例如服务器名称或元数据,来提供描述。这以一种非设计目的的方式重载了名称和元数据字段。提供长的人类可读描述的更好方法是使用单独的字段。描述可以轻松地在服务器列表显示中查看。
用例¶
最终用户希望在创建服务器时提供描述。
最终用户希望在重建服务器时提供描述。如果用户选择更改名称,则可能需要新的描述来匹配新名称。
最终用户希望获取服务器的描述。
最终用户希望更改服务器的描述。
提议的变更¶
Nova REST API
在创建服务器、重建服务器和更新服务器 API 中添加一个可选的描述参数。
在创建服务器时没有默认描述(在数据库中设置为 NULL)。
如果在服务器更新或重建时指定了 null 描述字符串,则描述在数据库中设置为 NULL(删除描述)。
如果在服务器更新或重建时未指定描述参数,则描述不会更改。
允许空描述字符串。
获取服务器详细信息 API 在 JSON 响应中返回描述。这可以是 NULL。
获取服务器列表详细信息 API 返回每个服务器的描述。描述可以是 NULL。
Nova V2 客户端
在服务器创建方法中添加一个可选的描述参数。
在服务器重建方法中添加一个可选的描述参数。
添加新的方法来设置和清除服务器描述。这些将实现一个新的 CLI 命令“nova describe”,具有以下位置参数
服务器
描述(传递 “” 以删除描述)
在服务器显示方法中返回描述。这可以是 null。
如果请求了详细信息,则在服务器列表方法返回的每个服务器中返回描述。描述可以是 null。
Openstack V2.1 compute 客户端
注意:对 Openstack V2 compute 客户端的更改将在 bug 报告下实现,而不是在此规范下实现。
在 CreateServer 中添加一个可选的描述参数。
在 RebuildServer 中添加一个可选的描述参数。
在 SetServer 和 UnsetServer 中添加一个可选的描述参数。
在 ShowServer 中返回描述。这可以是 null。
如果请求了详细信息,则在 ListServer 返回的每个服务器中返回描述。描述可以是 null。
注意:数据库中已经存在描述字段,因此更改是添加 API/CLI 支持来设置和获取描述。
可能受到影响的其他项目
Horizon 可以更改为设置和显示服务器描述。
备选方案¶
无
数据模型影响¶
无。描述字段的数据库列已经存在 255 个字符,并且可以为空。
REST API 影响¶
添加以下参数验证
valid_description_regex_base = '[%s]*'
valid_description_regex = valid_description_regex_base % (
re.escape(_get_printable()))
description = {
'type': ['string', 'null'], 'minLength': 0, 'maxLength': 255,
'pattern': valid_description_regex,
}
在新的微版本下更改以下 API
创建服务器¶
新的请求参数
参数 |
风格 |
类型 |
描述 |
|---|---|---|---|
描述(可选) |
plain |
csapi:string |
服务器描述 |
将描述添加到 json 请求模式定义中
base_create = {
'type': 'object',
'properties': {
'server': {
'type': 'object',
'properties': {
'name': parameter_types.hostname,
'description': parameter_types.description,
'imageRef': parameter_types.image_ref,
'flavorRef': parameter_types.flavor_ref,
'adminPass': parameter_types.admin_password,
'metadata': parameter_types.metadata,
'networks': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'fixed_ip': parameter_types.ip_address,
'port': {
'type': ['string', 'null'],
'format': 'uuid'
},
'uuid': {'type': 'string'},
},
'additionalProperties': False,
}
}
},
'required': ['name', 'flavorRef'],
'additionalProperties': False,
},
},
'required': ['server'],
'additionalProperties': False,
}
错误 http 响应代码
如果描述是无效的 unicode,或者长度超过 255 个字符,则返回 400(BadRequest)。
重建服务器¶
新的请求参数
参数 |
风格 |
类型 |
描述 |
|---|---|---|---|
描述(可选) |
plain |
csapi:string |
服务器描述 |
将描述添加到 json 请求模式定义中
base_rebuild = {
'type': 'object',
'properties': {
'rebuild': {
'type': 'object',
'properties': {
'name': parameter_types.name,
'description': parameter_types.description,
'imageRef': parameter_types.image_ref,
'adminPass': parameter_types.admin_password,
'metadata': parameter_types.metadata,
'preserve_ephemeral': parameter_types.boolean,
},
'required': ['imageRef'],
'additionalProperties': False,
},
},
'required': ['rebuild'],
'additionalProperties': False,
}
错误 http 响应代码
如果描述是无效的 unicode,或者长度超过 255 个字符,则返回 400(BadRequest)。
更新服务器¶
新的请求参数
参数 |
风格 |
类型 |
描述 |
|---|---|---|---|
描述(可选) |
plain |
csapi:ServerForUpdate |
服务器描述 |
将描述添加到 json 请求模式定义中
base_update = {
'type': 'object',
'properties': {
'server': {
'type': 'object',
'properties': {
'name': parameter_types.name,
'description': parameter_types.description,
},
响应
更新 API 当前返回已更新服务器的详细信息。作为此过程的一部分,描述现在将以 json 响应的形式返回。
错误 http 响应代码
如果描述是无效的 unicode,或者长度超过 255 个字符,则返回 400(BadRequest)。
获取服务器详细信息¶
将描述添加到 JSON 响应模式定义中。
server = {
"server": {
"id": instance["uuid"],
"name": instance["display_name"],
"description": instance["display_description"],
"status": self._get_vm_status(instance),
"tenant_id": instance.get("project_id") or "",
"user_id": instance.get("user_id") or "",
"metadata": self._get_metadata(instance),
"hostId": self._get_host_id(instance) or "",
"image": self._get_image(request, instance),
"flavor": self._get_flavor(request, instance),
"created": timeutils.isotime(instance["created_at"]),
"updated": timeutils.isotime(instance["updated_at"]),
"addresses": self._get_addresses(request, instance),
"accessIPv4": str(ip_v4) if ip_v4 is not None else '',
"accessIPv6": str(ip_v6) if ip_v6 is not None else '',
"links": self._get_links(request,
instance["uuid"],
self._collection_name),
},
安全影响¶
无
通知影响¶
此规范的通知更改将包含在版本化通知 API 规范的实现中:https://review.openstack.org/#/c/224755/
新的实例更新版本化通知将包含描述。
新的实例创建版本化通知将包含描述。
新的实例重建版本化通知将包含描述。
其他最终用户影响¶
对 python-novaclient 和 python-openstackclient 的更改如上所述。
Horizon 可以将描述添加到 GUI 中。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
chuckcarmack75
- 其他贡献者
无
工作项¶
实现 nova API 的更改。
实现 novaclient 和 openstackclient 的更改。
依赖项¶
无
测试¶
Nova 功能测试
将描述添加到使用 API 创建服务器的测试中。
检查默认描述是否为 NULL。
将描述添加到使用 API 重建服务器的测试中。
检查是否可以更改或删除描述。
检查如果未在 API 上指定描述,则描述是否未更改。
将描述添加到使用 API 更新服务器的测试中。
检查是否可以更改或删除描述。
检查如果未在 API 上指定描述,则描述是否未更改。
检查描述是否作为单个服务器或服务器列表的服务器详细信息的一部分返回。
Python nova-client 和 openstack-client。对于客户端测试和 CLI 测试
将描述添加到创建服务器的测试中。
将描述添加到重建服务器的测试中。
设置和删除现有服务器上的描述。
检查描述是否作为单个服务器或服务器列表的服务器详细信息的一部分返回。
错误情况
传递给 API 的描述长度超过 255 个字符。
传递给 API 的描述不是有效的可打印 unicode。
边缘情况
传递给 API 的描述是一个空字符串。这是允许的。
文档影响¶
文档更新到
API 规范:https://developer.openstack.org/api-ref-compute-v2.1.html 包括 API 示例。
客户端:novaclient 和 openstackclient
参考资料¶
此功能的请求最初出现在 ML 中
http://lists.openstack.org/pipermail/openstack-dev/2015-August/073052.html
历史¶
发布名称 |
描述 |
|---|---|
Mitaka |
引入 |
Mitaka |
重新提交以添加对重建描述的支持。 |