openstack中创建虚拟机时使用秘钥,然后删除秘钥,重启,出错!!
查看日志,如下:
File "/usr/lib/python2.7/site-packages/nova/virt/configdrive.py", line 69, in __init__self.add_instance_metadata(instance_md)
File "/usr/lib/python2.7/site-packages/nova/virt/configdrive.py", line 90, in add_instance_metadata
for (path, data) in instance_md.metadata_for_config_drive():
File "/usr/lib/python2.7/site-packages/nova/api/metadata/base.py", line 450, in metadata_for_config_drive
yield (path, self.lookup(path))
File "/usr/lib/python2.7/site-packages/nova/api/metadata/base.py", line 418, in lookup
data = self.get_openstack_item(path_tokens[1:])
File "/usr/lib/python2.7/site-packages/nova/api/metadata/base.py", line 297, in get_openstack_item
return self._route_configuration().handle_path(path_tokens)
File "/usr/lib/python2.7/site-packages/nova/api/metadata/base.py", line 491, in handle_path
return path_handler(version, path)
File "/usr/lib/python2.7/site-packages/nova/api/metadata/base.py", line 316, in _metadata_as_json
# self.instance.key_name)
File "/usr/lib/python2.7/site-packages/nova/objects/base.py", line 161, in wrapper
args, kwargs)
File "/usr/lib/python2.7/site-packages/nova/conductor/rpcapi.py", line 335, in object_class_action
objver=objver, args=args, kwargs=kwargs)
File "/usr/lib/python2.7/site-packages/oslo_messaging/rpc/client.py", line 156, in call
retry=self.retry)
File "/usr/lib/python2.7/site-packages/oslo_messaging/transport.py", line 90, in _send
timeout=timeout, retry=retry)
File "/usr/lib/python2.7/site-packages/oslo_messaging/_drivers/amqpdriver.py", line 350, in send
retry=retry)
File "/usr/lib/python2.7/site-packages/oslo_messaging/_drivers/amqpdriver.py", line 341, in _send
raise result
KeypairNotFound_Remote: Keypair xxx not found for user f5817c8499eb4252b2a1ca8a2c2c4e66
秘钥已经删除了,还要去查找这个keypair,表示不解,跟踪代码,有如下一段:
def _metadata_as_json(self, version, path): metadata = {'uuid': self.uuid} ...... if self.instance.key_name: metadata['public_keys'] = { self.instance.key_name: self.instance.key_data } keypair = keypair_obj.KeyPair.get_by_name( context.get_admin_context(), self.instance.user_id, self.instance.key_name) metadata['keys'] = [ {'name': keypair.name, 'type': keypair.type, 'data': keypair.public_key} ]查看数据库中instance的数据,对应的虚拟机key_name与key_data字段分别对应秘钥的key跟value。以上代码中去了两次key,第一次从数据库instance表中取到key,第二次从key_pairs表中取得key,第二次取出出错。
感觉这两处有冲突的地方。再研究下设计看。