Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd3fac50

Browse files
authored
Merge pull request#1490 from benjamb/benbrown/keys
feat: add keys endpoint
2 parents74f5e62 +a81525a commitd3fac50

File tree

7 files changed

+153
-0
lines changed

7 files changed

+153
-0
lines changed

‎docs/api-objects.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ API examples
2525
gl_objects/geo_nodes
2626
gl_objects/groups
2727
gl_objects/issues
28+
gl_objects/keys
2829
gl_objects/boards
2930
gl_objects/labels
3031
gl_objects/notifications

‎docs/gl_objects/keys.rst

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
####
2+
Keys
3+
####
4+
5+
Keys
6+
====
7+
8+
Reference
9+
---------
10+
11+
* v4 API
12+
13+
+:class:`gitlab.v4.objects.Key`
14+
+:class:`gitlab.v4.objects.KeyManager`
15+
+:attr:`gitlab.Gitlab.keys`
16+
17+
* GitLab API: https://docs.gitlab.com/ce/api/keys.html
18+
19+
Examples
20+
--------
21+
22+
Get an ssh key by its id (requires admin access)::
23+
24+
key = gl.keys.get(key_id)
25+
26+
Get an ssh key (requires admin access) or a deploy key by its fingerprint::
27+
28+
key = gl.keys.get(fingerprint="SHA256:ERJJ/OweAM6jA8OjJ/gXs4N5fqUaREEJnz/EyfywfXY")

‎gitlab/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ def __init__(
119119
self.hooks=objects.HookManager(self)
120120
self.issues=objects.IssueManager(self)
121121
self.issues_statistics=objects.IssuesStatisticsManager(self)
122+
self.keys=objects.KeyManager(self)
122123
self.ldapgroups=objects.LDAPGroupManager(self)
123124
self.licenses=objects.LicenseManager(self)
124125
self.namespaces=objects.NamespaceManager(self)

‎gitlab/v4/objects/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
from .hooksimport*
4444
from .issuesimport*
4545
from .jobsimport*
46+
from .keysimport*
4647
from .labelsimport*
4748
from .ldapimport*
4849
from .membersimport*

‎gitlab/v4/objects/keys.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
fromgitlab.baseimportRESTManager,RESTObject
2+
fromgitlab.mixinsimportGetMixin
3+
4+
__all__= [
5+
"Key",
6+
"KeyManager",
7+
]
8+
9+
10+
classKey(RESTObject):
11+
pass
12+
13+
14+
classKeyManager(GetMixin,RESTManager):
15+
_path="/keys"
16+
_obj_cls=Key
17+
18+
defget(self,id=None,**kwargs):
19+
ifidisnotNone:
20+
returnsuper(KeyManager,self).get(id,**kwargs)
21+
22+
if"fingerprint"notinkwargs:
23+
raiseAttributeError("Missing attribute: id or fingerprint")
24+
25+
server_data=self.gitlab.http_get(self.path,**kwargs)
26+
returnself._obj_cls(self,server_data)

‎tests/functional/api/test_keys.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
GitLab API:
3+
https://docs.gitlab.com/ce/api/keys.html
4+
"""
5+
importbase64
6+
importhashlib
7+
8+
9+
defkey_fingerprint(key):
10+
key_part=key.split()[1]
11+
decoded=base64.b64decode(key_part.encode("ascii"))
12+
digest=hashlib.sha256(decoded).digest()
13+
return"SHA256:"+base64.b64encode(digest).rstrip(b"=").decode("utf-8")
14+
15+
16+
deftest_keys_ssh(gl,user,SSH_KEY):
17+
key=user.keys.create({"title":"foo@bar","key":SSH_KEY})
18+
19+
# Get key by ID (admin only).
20+
key_by_id=gl.keys.get(key.id)
21+
assertkey_by_id.title==key.title
22+
assertkey_by_id.key==key.key
23+
24+
fingerprint=key_fingerprint(SSH_KEY)
25+
# Get key by fingerprint (admin only).
26+
key_by_fingerprint=gl.keys.get(fingerprint=fingerprint)
27+
assertkey_by_fingerprint.title==key.title
28+
assertkey_by_fingerprint.key==key.key
29+
30+
key.delete()
31+
32+
33+
deftest_keys_deploy(gl,project,DEPLOY_KEY):
34+
key=project.keys.create({"title":"foo@bar","key":DEPLOY_KEY})
35+
36+
fingerprint=key_fingerprint(DEPLOY_KEY)
37+
key_by_fingerprint=gl.keys.get(fingerprint=fingerprint)
38+
assertkey_by_fingerprint.title==key.title
39+
assertkey_by_fingerprint.key==key.key
40+
assertlen(key_by_fingerprint.deploy_keys_projects)==1
41+
42+
key.delete()

‎tests/unit/objects/test_keys.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
GitLab API: https://docs.gitlab.com/ce/api/keys.html
3+
"""
4+
importpytest
5+
importresponses
6+
7+
fromgitlab.v4.objectsimportKey
8+
9+
key_content= {"id":1,"title":"title","key":"ssh-keytype AAAAC3Nza/key comment"}
10+
11+
12+
@pytest.fixture
13+
defresp_get_key_by_id():
14+
withresponses.RequestsMock()asrsps:
15+
rsps.add(
16+
method=responses.GET,
17+
url="http://localhost/api/v4/keys/1",
18+
json=key_content,
19+
content_type="application/json",
20+
status=200,
21+
)
22+
yieldrsps
23+
24+
25+
@pytest.fixture
26+
defresp_get_key_by_fingerprint():
27+
withresponses.RequestsMock()asrsps:
28+
rsps.add(
29+
method=responses.GET,
30+
url="http://localhost/api/v4/keys?fingerprint=foo",
31+
json=key_content,
32+
content_type="application/json",
33+
status=200,
34+
)
35+
yieldrsps
36+
37+
38+
deftest_get_key_by_id(gl,resp_get_key_by_id):
39+
key=gl.keys.get(1)
40+
assertisinstance(key,Key)
41+
assertkey.id==1
42+
assertkey.title=="title"
43+
44+
45+
deftest_get_key_by_fingerprint(gl,resp_get_key_by_fingerprint):
46+
key=gl.keys.get(fingerprint="foo")
47+
assertisinstance(key,Key)
48+
assertkey.id==1
49+
assertkey.title=="title"
50+
51+
52+
deftest_get_key_missing_attrs(gl):
53+
withpytest.raises(AttributeError):
54+
gl.keys.get()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp