Skip to content

Commit 9fba82f

Browse files
[Container Registry] Update API for Beta 2 (Azure#18392)
1 parent 0c8125f commit 9fba82f

File tree

81 files changed

+11098
-1929
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+11098
-1929
lines changed

sdk/containerregistry/azure-containerregistry/azure/containerregistry/__init__.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,30 @@
77
# --------------------------------------------------------------------------
88

99
from ._container_registry_client import ContainerRegistryClient
10-
from ._container_repository_client import ContainerRepositoryClient
10+
from ._container_repository import ContainerRepository
1111
from ._models import (
1212
DeleteRepositoryResult,
1313
ContentProperties,
14-
ManifestOrderBy,
14+
ManifestOrder,
1515
ArtifactManifestProperties,
1616
RepositoryProperties,
17-
TagOrderBy,
17+
TagOrder,
1818
ArtifactTagProperties,
1919
)
20+
from ._registry_artifact import RegistryArtifact
2021
from ._version import VERSION
2122

2223
__version__ = VERSION
2324

2425
__all__ = [
2526
"ContainerRegistryClient",
26-
"ContainerRepositoryClient",
27-
"DeleteRepositoryResult",
27+
"ContainerRepository",
2828
"ContentProperties",
29-
"ManifestOrderBy",
29+
"DeleteRepositoryResult",
30+
"RegistryArtifact",
31+
"ManifestOrder",
3032
"ArtifactManifestProperties",
3133
"RepositoryProperties",
32-
"TagOrderBy",
34+
"TagOrder",
3335
"ArtifactTagProperties",
3436
]

sdk/containerregistry/azure-containerregistry/azure/containerregistry/_base_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class ContainerRegistryApiVersion(str, Enum):
2323

2424

2525
class ContainerRegistryBaseClient(object):
26-
"""Base class for ContainerRegistryClient and ContainerRepositoryClient
26+
"""Base class for ContainerRegistryClient, ContainerRepository, and RegistryArtifact
2727
2828
:param str endpoint: Azure Container Registry endpoint
2929
:param credential: AAD Token for authenticating requests with Azure

sdk/containerregistry/azure-containerregistry/azure/containerregistry/_container_registry_client.py

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
from azure.core.tracing.decorator import distributed_trace
1717

1818
from ._base_client import ContainerRegistryBaseClient, TransportWrapper
19-
from ._container_repository_client import ContainerRepositoryClient
19+
from ._container_repository import ContainerRepository
2020
from ._generated.models import AcrErrors
2121
from ._helpers import _parse_next_link
22+
from ._registry_artifact import RegistryArtifact
2223
from ._models import DeleteRepositoryResult
2324

2425
if TYPE_CHECKING:
@@ -53,11 +54,11 @@ def __init__(self, endpoint, credential, **kwargs):
5354
super(ContainerRegistryClient, self).__init__(endpoint=endpoint, credential=credential, **kwargs)
5455

5556
@distributed_trace
56-
def delete_repository(self, repository, **kwargs):
57+
def delete_repository(self, repository_name, **kwargs):
5758
# type: (str, Dict[str, Any]) -> DeleteRepositoryResult
5859
"""Delete a repository
5960
60-
:param str repository: The repository to delete
61+
:param str repository_name: The repository to delete
6162
:returns: Object containing information about the deleted repository
6263
:rtype: :class:`~azure.containerregistry.DeleteRepositoryResult`
6364
:raises: :class:`~azure.core.exceptions.ResourceNotFoundError`
@@ -72,11 +73,11 @@ def delete_repository(self, repository, **kwargs):
7273
:caption: Delete a repository from the `ContainerRegistryClient`
7374
"""
7475
return DeleteRepositoryResult._from_generated( # pylint: disable=protected-access
75-
self._client.container_registry.delete_repository(repository, **kwargs)
76+
self._client.container_registry.delete_repository(repository_name, **kwargs)
7677
)
7778

7879
@distributed_trace
79-
def list_repositories(self, **kwargs):
80+
def list_repository_names(self, **kwargs):
8081
# type: (Dict[str, Any]) -> ItemPaged[str]
8182
"""List all repositories
8283
@@ -162,7 +163,7 @@ def extract_data(pipeline_response):
162163
deserialized = self._client._deserialize( # pylint: disable=protected-access
163164
"Repositories", pipeline_response
164165
)
165-
list_of_elem = deserialized.repositories
166+
list_of_elem = deserialized.repositories or []
166167
if cls:
167168
list_of_elem = cls(list_of_elem)
168169
link = None
@@ -192,12 +193,12 @@ def get_next(next_link=None):
192193
return ItemPaged(get_next, extract_data)
193194

194195
@distributed_trace
195-
def get_repository_client(self, repository, **kwargs):
196-
# type: (str, Dict[str, Any]) -> ContainerRepositoryClient
197-
"""Get a repository client
196+
def get_repository(self, repository_name, **kwargs):
197+
# type: (str, Any) -> ContainerRepository
198+
"""Get a Container Repository object
198199
199-
:param str repository: The repository to create a client for
200-
:returns: :class:`~azure.containerregistry.ContainerRepositoryClient`
200+
:param str repository_name: The repository to create a client for
201+
:returns: :class:`~azure.containerregistry.ContainerRepository`
201202
:raises: None
202203
203204
Example
@@ -215,6 +216,29 @@ def get_repository_client(self, repository, **kwargs):
215216
transport=TransportWrapper(self._client._client._pipeline._transport), # pylint: disable=protected-access
216217
policies=self._client._client._pipeline._impl_policies, # pylint: disable=protected-access
217218
)
218-
return ContainerRepositoryClient(
219-
self._endpoint, repository, credential=self._credential, pipeline=_pipeline, **kwargs
219+
return ContainerRepository(
220+
self._endpoint, repository_name, credential=self._credential, pipeline=_pipeline, **kwargs
221+
)
222+
223+
@distributed_trace
224+
def get_artifact(self, repository_name, tag_or_digest, **kwargs):
225+
# type: (str, str, Dict[str, Any]) -> RegistryArtifact
226+
"""Get a Registry Artifact object
227+
228+
:param str repository_name: Name of the repository
229+
:param str tag_or_digest: The tag or digest of the artifact
230+
:returns: :class:`~azure.containerregistry.RegistryArtifact`
231+
:raises: None
232+
"""
233+
_pipeline = Pipeline(
234+
transport=TransportWrapper(self._client._client._pipeline._transport), # pylint: disable=protected-access
235+
policies=self._client._client._pipeline._impl_policies, # pylint: disable=protected-access
236+
)
237+
return RegistryArtifact(
238+
self._endpoint,
239+
repository_name,
240+
tag_or_digest,
241+
self._credential,
242+
pipeline=_pipeline,
243+
**kwargs
220244
)
Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
# coding=utf-8
2+
# ------------------------------------
3+
# Copyright (c) Microsoft Corporation.
4+
# Licensed under the MIT License.
5+
# ------------------------------------
6+
from typing import TYPE_CHECKING
7+
8+
from azure.core.exceptions import (
9+
ClientAuthenticationError,
10+
ResourceNotFoundError,
11+
ResourceExistsError,
12+
HttpResponseError,
13+
map_error,
14+
)
15+
from azure.core.paging import ItemPaged
16+
from azure.core.pipeline import Pipeline
17+
from azure.core.tracing.decorator import distributed_trace
18+
19+
from ._base_client import ContainerRegistryBaseClient, TransportWrapper
20+
from ._generated.models import AcrErrors
21+
from ._helpers import _parse_next_link
22+
from ._models import (
23+
DeleteRepositoryResult,
24+
ArtifactManifestProperties,
25+
RepositoryProperties,
26+
)
27+
from ._registry_artifact import RegistryArtifact
28+
29+
if TYPE_CHECKING:
30+
from typing import Any, Dict
31+
from azure.core.credentials import TokenCredential
32+
from ._models import ContentProperties
33+
34+
35+
class ContainerRepository(ContainerRegistryBaseClient):
36+
def __init__(self, endpoint, name, credential, **kwargs):
37+
# type: (str, str, TokenCredential, Dict[str, Any]) -> None
38+
"""Create a ContainerRepository from an endpoint, repository name, and credential
39+
40+
:param str endpoint: An ACR endpoint
41+
:param str name: The name of a repository
42+
:param credential: The credential with which to authenticate
43+
:type credential: :class:`~azure.core.credentials.TokenCredential`
44+
:returns: None
45+
:raises: None
46+
"""
47+
if not endpoint.startswith("https://") and not endpoint.startswith("http://"):
48+
endpoint = "https://" + endpoint
49+
self._endpoint = endpoint
50+
self.name = name
51+
self._credential = credential
52+
self.fully_qualified_name = self._endpoint + self.name
53+
super(ContainerRepository, self).__init__(endpoint=self._endpoint, credential=credential, **kwargs)
54+
55+
@distributed_trace
56+
def delete(self, **kwargs):
57+
# type: (Dict[str, Any]) -> DeleteRepositoryResult
58+
"""Delete a repository
59+
60+
:returns: Object containing information about the deleted repository
61+
:rtype: :class:`~azure.containerregistry.DeleteRepositoryResult`
62+
:raises: :class:`~azure.core.exceptions.ResourceNotFoundError`
63+
"""
64+
return DeleteRepositoryResult._from_generated( # pylint: disable=protected-access
65+
self._client.container_registry.delete_repository(self.name, **kwargs)
66+
)
67+
68+
@distributed_trace
69+
def get_properties(self, **kwargs):
70+
# type: (Dict[str, Any]) -> RepositoryProperties
71+
"""Get the properties of a repository
72+
73+
:returns: :class:`~azure.containerregistry.RepositoryProperties`
74+
:raises: :class:`~azure.core.exceptions.ResourceNotFoundError`
75+
"""
76+
return RepositoryProperties._from_generated( # pylint: disable=protected-access
77+
self._client.container_registry.get_properties(self.name, **kwargs)
78+
)
79+
80+
@distributed_trace
81+
def list_manifests(self, **kwargs):
82+
# type: (Dict[str, Any]) -> ItemPaged[ArtifactManifestProperties]
83+
"""List the artifacts for a repository
84+
85+
:keyword last: Query parameter for the last item in the previous call. Ensuing
86+
call will return values after last lexically
87+
:paramtype last: str
88+
:keyword order_by: Query parameter for ordering by time ascending or descending
89+
:paramtype order_by: :class:`~azure.containerregistry.ManifestOrder`
90+
:keyword results_per_page: Number of repositories to return per page
91+
:paramtype results_per_page: int
92+
:return: ItemPaged[:class:`ArtifactManifestProperties`]
93+
:rtype: :class:`~azure.core.paging.ItemPaged`
94+
:raises: :class:`~azure.core.exceptions.ResourceNotFoundError`
95+
"""
96+
name = self.name
97+
last = kwargs.pop("last", None)
98+
n = kwargs.pop("results_per_page", None)
99+
orderby = kwargs.pop("order_by", None)
100+
cls = kwargs.pop(
101+
"cls",
102+
lambda objs: [
103+
ArtifactManifestProperties._from_generated(x, repository_name=self.name) # pylint: disable=protected-access
104+
for x in objs
105+
],
106+
)
107+
108+
error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError}
109+
error_map.update(kwargs.pop("error_map", {}))
110+
accept = "application/json"
111+
112+
def prepare_request(next_link=None):
113+
# Construct headers
114+
header_parameters = {} # type: Dict[str, Any]
115+
header_parameters["Accept"] = self._client._serialize.header( # pylint: disable=protected-access
116+
"accept", accept, "str"
117+
)
118+
119+
if not next_link:
120+
# Construct URL
121+
url = "/acr/v1/{name}/_manifests"
122+
path_format_arguments = {
123+
"url": self._client._serialize.url( # pylint: disable=protected-access
124+
"self._client._config.url",
125+
self._client._config.url, # pylint: disable=protected-access
126+
"str",
127+
skip_quote=True,
128+
),
129+
"name": self._client._serialize.url("name", name, "str"), # pylint: disable=protected-access
130+
}
131+
url = self._client._client.format_url(url, **path_format_arguments) # pylint: disable=protected-access
132+
# Construct parameters
133+
query_parameters = {} # type: Dict[str, Any]
134+
if last is not None:
135+
query_parameters["last"] = self._client._serialize.query( # pylint: disable=protected-access
136+
"last", last, "str"
137+
)
138+
if n is not None:
139+
query_parameters["n"] = self._client._serialize.query( # pylint: disable=protected-access
140+
"n", n, "int"
141+
)
142+
if orderby is not None:
143+
query_parameters["orderby"] = self._client._serialize.query( # pylint: disable=protected-access
144+
"orderby", orderby, "str"
145+
)
146+
147+
request = self._client._client.get( # pylint: disable=protected-access
148+
url, query_parameters, header_parameters
149+
)
150+
else:
151+
url = next_link
152+
query_parameters = {} # type: Dict[str, Any]
153+
path_format_arguments = {
154+
"url": self._client._serialize.url( # pylint: disable=protected-access
155+
"self._client._config.url",
156+
self._client._config.url, # pylint: disable=protected-access
157+
"str",
158+
skip_quote=True,
159+
),
160+
"name": self._client._serialize.url("name", name, "str"), # pylint: disable=protected-access
161+
}
162+
url = self._client._client.format_url(url, **path_format_arguments) # pylint: disable=protected-access
163+
request = self._client._client.get( # pylint: disable=protected-access
164+
url, query_parameters, header_parameters
165+
)
166+
return request
167+
168+
def extract_data(pipeline_response):
169+
deserialized = self._client._deserialize( # pylint: disable=protected-access
170+
"AcrManifests", pipeline_response
171+
)
172+
list_of_elem = deserialized.manifests
173+
if cls:
174+
list_of_elem = cls(list_of_elem)
175+
link = None
176+
if "Link" in pipeline_response.http_response.headers.keys():
177+
link = _parse_next_link(pipeline_response.http_response.headers["Link"])
178+
return link, iter(list_of_elem)
179+
180+
def get_next(next_link=None):
181+
request = prepare_request(next_link)
182+
183+
pipeline_response = self._client._client._pipeline.run( # pylint: disable=protected-access
184+
request, stream=False, **kwargs
185+
)
186+
response = pipeline_response.http_response
187+
188+
if response.status_code not in [200]:
189+
error = self._client._deserialize.failsafe_deserialize( # pylint: disable=protected-access
190+
AcrErrors, response
191+
)
192+
map_error(status_code=response.status_code, response=response, error_map=error_map)
193+
raise HttpResponseError(response=response, model=error)
194+
195+
return pipeline_response
196+
197+
return ItemPaged(get_next, extract_data)
198+
199+
@distributed_trace
200+
def set_properties(self, properties, **kwargs):
201+
# type: (RepositoryProperties, Dict[str, Any]) -> RepositoryProperties
202+
"""Set the properties of a repository
203+
204+
:returns: :class:`~azure.containerregistry.RepositoryProperties`
205+
:raises: :class:`~azure.core.exceptions.ResourceNotFoundError`
206+
"""
207+
return RepositoryProperties._from_generated( # pylint: disable=protected-access
208+
self._client.container_registry.set_properties(
209+
self.name, properties._to_generated(), **kwargs # pylint: disable=protected-access
210+
)
211+
)
212+
213+
@distributed_trace
214+
def get_artifact(self, tag_or_digest, **kwargs):
215+
# type: (str, str, Dict[str, Any]) -> RegistryArtifact
216+
"""Get a Registry Artifact object
217+
218+
:param str repository_name: Name of the repository
219+
:param str tag_or_digest: The tag or digest of the artifact
220+
:returns: :class:`~azure.containerregistry.RegistryArtifact`
221+
:raises: None
222+
"""
223+
_pipeline = Pipeline(
224+
transport=TransportWrapper(self._client._client._pipeline._transport), # pylint: disable=protected-access
225+
policies=self._client._client._pipeline._impl_policies, # pylint: disable=protected-access
226+
)
227+
return RegistryArtifact(
228+
self._endpoint, self.name, tag_or_digest, self._credential, pipeline=_pipeline, **kwargs
229+
)

sdk/containerregistry/azure-containerregistry/azure/containerregistry/_exchange_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def get_acr_access_token(self, challenge, **kwargs):
7070
)
7171

7272
def get_refresh_token(self, service, **kwargs):
73-
# type: (str, **Any) -> str
73+
# type: (str, Dict[str, Any]) -> str
7474
if not self._refresh_token or time.time() - self._last_refresh_time > 300:
7575
self._refresh_token = self.exchange_aad_token_for_refresh_token(service, **kwargs)
7676
self._last_refresh_time = time.time()

0 commit comments

Comments
 (0)