Skip to content

Commit 837169d

Browse files
authored
Merge pull request #1936 from paololazzari/1934-gcp-artifact-registry
Add support for Google Artifact Registry
2 parents eb02224 + ce612a5 commit 837169d

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

binderhub/registry.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,35 @@ async def get_credentials(self, image, tag):
339339
return None
340340

341341

342+
class GoogleArtifactRegistry(DockerRegistry):
343+
"""
344+
A registry for Google Artifact Registry.
345+
346+
At present, the only way to generate credentials without having to use the gcloud cli
347+
is the metadata server. The metadata server uses the Compute Engine default service account.
348+
349+
For more information, see https://cloud.google.com/docs/authentication/rest#metadata-server.
350+
"""
351+
352+
@default("token_url")
353+
def _default_token_url(self):
354+
return "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
355+
356+
async def _get_token(self, client, token_url, service, scope):
357+
auth_req = httpclient.HTTPRequest(
358+
token_url, headers={"Metadata-Flavor": "Google"}
359+
)
360+
self.log.debug(f"Getting registry token from {token_url}")
361+
auth_resp = await client.fetch(auth_req)
362+
response_body = json.loads(auth_resp.body.decode("utf-8", "replace"))
363+
364+
if "access_token" in response_body.keys():
365+
token = response_body["access_token"]
366+
else:
367+
raise ValueError(f"No token in response from registry: {response_body}")
368+
return token
369+
370+
342371
class FakeRegistry(DockerRegistry):
343372
"""
344373
Fake registry that contains no images

0 commit comments

Comments
 (0)