diff --git a/doc/api_samples/os-keypairs/keypairs-get-resp.json b/doc/api_samples/os-keypairs/keypairs-get-resp.json
new file mode 100644
index 000000000000..6c1c5d3f2435
--- /dev/null
+++ b/doc/api_samples/os-keypairs/keypairs-get-resp.json
@@ -0,0 +1,13 @@
+{
+ "keypair": {
+ "created_at": "2014-05-07T12:06:13.681238",
+ "deleted": false,
+ "deleted_at": null,
+ "fingerprint": "9d:00:f4:d7:26:6e:52:06:4c:c1:d3:1d:fd:06:66:01",
+ "id": 1,
+ "name": "keypair-3582d8b7-e588-4aad-b7f7-f4e76f0e4314",
+ "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYJrTVpcMwFqQy/oMvtUSRofZdSRHEwrsX8AYkRvn2ZnCXM+b6+GZ2NQuuWj+ocznlnwiGFQDsL/yeE+/kurqcPJFKKp60mToXIMyzioFxW88fJtwEWawHKAclbHWpR1t4fQ4DS+/sIbX/Yd9btlVQ2tpQjodGDbM9Tr9/+/3i6rcR+EoLqmbgCgAiGiVV6VbM2Zx79yUwd+GnQejHX8BlYZoOjCnt3NREsITcmWE9FVFy6TnLmahs3FkEO/QGgWGkaohAJlsgaVvSWGgDn2AujKYwyDokK3dXyeX3m2Vmc3ejiqPa/C4nRrCOlko5nSgV/9IXRx1ERImsqZnE9usB Generated by Nova\n",
+ "updated_at": null,
+ "user_id": "fake"
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-keypairs/keypairs-get-resp.xml b/doc/api_samples/os-keypairs/keypairs-get-resp.xml
new file mode 100644
index 000000000000..76eba36bb2a7
--- /dev/null
+++ b/doc/api_samples/os-keypairs/keypairs-get-resp.xml
@@ -0,0 +1,13 @@
+
+
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTWIBcXl7SSxGWOmzryHuYFYFQajo7uZXACg2juI92lRnQt1yy8aJ1710QZWaBlfluJYaOqBMccYXGxAR1vmZTONuW+lpBjRMqYgNG6ZC46p6z+Akp7Okbf1w1aqZ2rF2kq9OsjpU1x1SuB+xwC9stDv5MXEW2Gt/VPVcl3fVQLgvIoANhQPA5UJU5fRoeWgq0F/GCQtEGo7cQOQO3PC6IOshUPWAI/vRHt1dFGKnJjKJTkTbAuQkH2AnkMEWn6DvFFy8frBl3PwCYWnrResmOuPLvL5MG+Q5c1IrXpQm9ifTpEAstMalLJfHA0h5amQvIeWsj2y2yWyttcHoHg9K5 Generated by Nova
+
+ fake
+ keypair-8cabfb98-b13f-48cb-af1a-068b585eaaf5
+ False
+ 2014-05-07 12:06:00.402696+00:00
+ None
+ ee:f5:79:02:69:af:ee:07:0f:ce:79:37:fd:5d:94:25
+ None
+ 1
+
\ No newline at end of file
diff --git a/doc/v3/api_samples/keypairs/keypairs-get-resp.json b/doc/v3/api_samples/keypairs/keypairs-get-resp.json
new file mode 100644
index 000000000000..6b6e5eabd480
--- /dev/null
+++ b/doc/v3/api_samples/keypairs/keypairs-get-resp.json
@@ -0,0 +1,7 @@
+{
+ "keypair": {
+ "fingerprint": "44:fe:29:6e:23:14:b9:53:5b:65:82:58:1c:fe:5a:c3",
+ "name": "keypair-6638abdb-c4e8-407c-ba88-c8dd7cc3c4f1",
+ "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1HTrHCbb9NawNLSV8N6tSa8i637+EC2dA+lsdHHfQlT54t+N0nHhJPlKWDLhc579j87vp6RDFriFJ/smsTnDnf64O12z0kBaJpJPH2zXrBkZFK6q2rmxydURzX/z0yLSCP77SFJ0fdXWH2hMsAusflGyryHGX20n+mZK6mDrxVzGxEz228dwQ5G7Az5OoZDWygH2pqPvKjkifRw0jwUKf3BbkP0QvANACOk26cv16mNFpFJfI1N3OC5lUsZQtKGR01ptJoWijYKccqhkAKuo902tg/qup58J5kflNm7I61sy1mJon6SGqNUSfoQagqtBH6vd/tU1jnlwZ03uUroAL Generated by Nova\n"
+ }
+}
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-keypairs/keypairs-get-resp.json.tpl b/nova/tests/integrated/api_samples/os-keypairs/keypairs-get-resp.json.tpl
new file mode 100644
index 000000000000..3a188cfc817a
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-keypairs/keypairs-get-resp.json.tpl
@@ -0,0 +1,13 @@
+{
+ "keypair": {
+ "public_key": "%(public_key)s",
+ "name": "%(keypair_name)s",
+ "fingerprint": "%(fingerprint)s",
+ "user_id": "fake",
+ "deleted": false,
+ "created_at": "%(timestamp)s",
+ "updated_at": null,
+ "deleted_at": null,
+ "id": 1
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-keypairs/keypairs-get-resp.xml.tpl b/nova/tests/integrated/api_samples/os-keypairs/keypairs-get-resp.xml.tpl
new file mode 100644
index 000000000000..bdaebc47d6db
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-keypairs/keypairs-get-resp.xml.tpl
@@ -0,0 +1,13 @@
+
+
+ %(public_key)s
+
+ %(keypair_name)s
+ %(fingerprint)s
+ fake
+ False
+ %(timestamp)s
+ None
+ None
+ 1
+
diff --git a/nova/tests/integrated/api_samples_test_base.py b/nova/tests/integrated/api_samples_test_base.py
index e8bf32b33b46..a1e94baffd79 100644
--- a/nova/tests/integrated/api_samples_test_base.py
+++ b/nova/tests/integrated/api_samples_test_base.py
@@ -271,7 +271,8 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
# shouldn't be an issue for this case.
timestamp_re = ('\d{4}-[0,1]\d-[0-3]\d[ ,T]'
'\d{2}:\d{2}:\d{2}'
- '(Z|(\+|-)\d{2}:\d{2}|\.\d{6}|)')
+ '(Z|(\+|-)\d{2}:\d{2}|\.\d{6}|'
+ '\.\d{6}(Z|(\+|-)\d{2}:\d{2})|)')
return {
'isotime': isotime_re,
'timestamp': timestamp_re,
diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py
index 9e412a7c9a5d..fd13d4f7246f 100644
--- a/nova/tests/integrated/test_api_samples.py
+++ b/nova/tests/integrated/test_api_samples.py
@@ -1118,6 +1118,14 @@ class KeyPairsSampleJsonTest(ApiSampleTestBaseV2):
subs['keypair_name'] = '(%s)' % key_name
self._verify_response('keypairs-list-resp', subs, response, 200)
+ def test_keypairs_get(self):
+ # Get api sample of key pairs get request.
+ key_name = self.test_keypairs_post()
+ response = self._do_get('os-keypairs/%s' % key_name)
+ subs = self._get_regexes()
+ subs['keypair_name'] = '(%s)' % key_name
+ self._verify_response('keypairs-get-resp', subs, response, 200)
+
class KeyPairsSampleXmlTest(KeyPairsSampleJsonTest):
ctype = 'xml'
diff --git a/nova/tests/integrated/v3/api_samples/keypairs/keypairs-get-resp.json.tpl b/nova/tests/integrated/v3/api_samples/keypairs/keypairs-get-resp.json.tpl
new file mode 100644
index 000000000000..228c8412a99d
--- /dev/null
+++ b/nova/tests/integrated/v3/api_samples/keypairs/keypairs-get-resp.json.tpl
@@ -0,0 +1,7 @@
+{
+ "keypair": {
+ "public_key": "%(public_key)s",
+ "name": "%(keypair_name)s",
+ "fingerprint": "%(fingerprint)s"
+ }
+}
diff --git a/nova/tests/integrated/v3/test_keypairs.py b/nova/tests/integrated/v3/test_keypairs.py
index 8f71aff34d74..b78112d6368b 100644
--- a/nova/tests/integrated/v3/test_keypairs.py
+++ b/nova/tests/integrated/v3/test_keypairs.py
@@ -62,3 +62,11 @@ class KeyPairsSampleJsonTest(api_sample_base.ApiSampleTestBaseV3):
subs = self._get_regexes()
subs['keypair_name'] = '(%s)' % key_name
self._verify_response('keypairs-list-resp', subs, response, 200)
+
+ def test_keypairs_get(self):
+ # Get api sample of key pairs get request.
+ key_name = self.test_keypairs_post()
+ response = self._do_get('keypairs/%s' % key_name)
+ subs = self._get_regexes()
+ subs['keypair_name'] = '(%s)' % key_name
+ self._verify_response('keypairs-get-resp', subs, response, 200)