Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
d7bcfe6
changing ContainerRepositoryClient to ContainerRepository
seankane-msft Apr 27, 2021
7a0b598
renaming files
seankane-msft Apr 27, 2021
15bbaaf
re-recording, commenting out tests that are not necessary
seankane-msft Apr 27, 2021
b91302c
working sync registry artifact class
seankane-msft Apr 28, 2021
6f7c55c
async registry artifact
seankane-msft Apr 28, 2021
22ecb18
issue with recording infra that is removing an acr specific oauth path
seankane-msft Apr 28, 2021
d5986dd
pylint issues
seankane-msft Apr 28, 2021
1287136
recording and processors
seankane-msft Apr 28, 2021
145949b
removing commented out code
seankane-msft Apr 28, 2021
09f3636
undoing changes to cache
seankane-msft Apr 28, 2021
6e38bf1
more lint fixes
seankane-msft Apr 28, 2021
d9659c0
help with logging output
seankane-msft Apr 28, 2021
941473a
change to list_repository_names
seankane-msft Apr 28, 2021
44ceace
renaming for consistency
seankane-msft Apr 28, 2021
4e5dbc8
all changes made, plus recordings
seankane-msft Apr 28, 2021
f7caebd
fixing up more tests again!
seankane-msft Apr 28, 2021
6ced986
formatting
seankane-msft Apr 28, 2021
5417f1d
merge conflicts
seankane-msft Apr 29, 2021
83c0d90
fixing up merge issues
seankane-msft May 3, 2021
c0ed9ff
merge conflicts
seankane-msft May 3, 2021
ed3f937
more conflicts
seankane-msft May 3, 2021
ccec23b
undoing changes to gen code
seankane-msft May 3, 2021
afa0c1b
pylint issues
seankane-msft May 4, 2021
0e2e335
consistent naming
seankane-msft May 4, 2021
24cb3a0
changes
seankane-msft May 4, 2021
0dcd6cd
anon test
seankane-msft May 4, 2021
62964e8
small changes to generated, eventually will be reflected in the swagger
seankane-msft May 5, 2021
64937b8
adding basics for anon
seankane-msft May 5, 2021
315c9f8
adding test infra
seankane-msft May 5, 2021
abd4e4e
adding async tests
seankane-msft May 5, 2021
119575e
adding more tests for anon container repo and reg artifact
seankane-msft May 5, 2021
7c31693
added async anon client
seankane-msft May 6, 2021
0c9e77a
asserting credential is false
seankane-msft May 6, 2021
7f57d03
fixing scrubber
seankane-msft May 6, 2021
d260ff9
new swagger
seankane-msft May 6, 2021
8fbf308
merge conflicts
seankane-msft May 6, 2021
dc033e9
merge conflicts reflected in tests
seankane-msft May 6, 2021
9a93a9c
lint
seankane-msft May 6, 2021
c06fecd
updating tests and resource for anonymous access
seankane-msft May 6, 2021
2b78a40
updating generated code
seankane-msft May 7, 2021
77aed4b
merge conflicts
seankane-msft May 9, 2021
67887d6
undoing generated code changes
seankane-msft May 9, 2021
4e7c9b6
shouldnt have done that oops
seankane-msft May 9, 2021
86f86aa
undoing unnecessary changes to recordings
seankane-msft May 9, 2021
87b1928
changelog
seankane-msft May 9, 2021
3255a2d
merge conflicts
seankane-msft May 11, 2021
68f7bfd
anna and mccoys comments
seankane-msft May 11, 2021
8a254ab
lint fixes
seankane-msft May 11, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
changing ContainerRepositoryClient to ContainerRepository
  • Loading branch information
seankane-msft committed Apr 27, 2021
commit d7bcfe6a1a4fbeb85b70beb8f93896a0955c3147
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# --------------------------------------------------------------------------

from ._container_registry_client import ContainerRegistryClient
from ._container_repository_client import ContainerRepositoryClient
from ._container_repository_client import ContainerRepository
from ._models import (
ContentPermissions,
DeletedRepositoryResult,
Expand All @@ -23,7 +23,7 @@

__all__ = [
"ContainerRegistryClient",
"ContainerRepositoryClient",
"ContainerRepository",
"ContentPermissions",
"DeletedRepositoryResult",
"RegistryArtifactOrderBy",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class ContainerRegistryApiVersion(str, Enum):


class ContainerRegistryBaseClient(object):
"""Base class for ContainerRegistryClient and ContainerRepositoryClient
"""Base class for ContainerRegistryClient and ContainerRepository

:param str endpoint: Azure Container Registry endpoint
:param credential: AAD Token for authenticating requests with Azure
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from azure.core.tracing.decorator import distributed_trace

from ._base_client import ContainerRegistryBaseClient, TransportWrapper
from ._container_repository_client import ContainerRepositoryClient
from ._container_repository_client import ContainerRepository
from ._generated.models import AcrErrors
from ._helpers import _parse_next_link
from ._models import DeletedRepositoryResult
Expand Down Expand Up @@ -166,17 +166,17 @@ def get_next(next_link=None):

@distributed_trace
def get_repository_client(self, repository, **kwargs):
# type: (str, Dict[str, Any]) -> ContainerRepositoryClient
# type: (str, Dict[str, Any]) -> ContainerRepository
"""Get a repository client

:param str repository: The repository to create a client for
:returns: :class:`~azure.containerregistry.ContainerRepositoryClient`
:returns: :class:`~azure.containerregistry.ContainerRepository`
:raises: None
"""
_pipeline = Pipeline(
transport=TransportWrapper(self._client._client._pipeline._transport), # pylint: disable=protected-access
policies=self._client._client._pipeline._impl_policies, # pylint: disable=protected-access
)
return ContainerRepositoryClient(
return ContainerRepository(
self._endpoint, repository, credential=self._credential, pipeline=_pipeline, **kwargs
)

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,14 @@ def __init__(self, endpoint, credential, **kwargs):
def get_acr_access_token(self, challenge, **kwargs):
# type: (str, Dict[str, Any]) -> str
parsed_challenge = _parse_challenge(challenge)
refresh_token = self.get_refresh_token(parsed_challenge["service"], **kwargs)
# refresh_token = self.get_refresh_token(parsed_challenge["service"], **kwargs) # TODO: This is interfering with recordings
refresh_token = self.exchange_aad_token_for_refresh_token(parsed_challenge["service"], **kwargs)
return self.exchange_refresh_token_for_access_token(
refresh_token, service=parsed_challenge["service"], scope=parsed_challenge["scope"], **kwargs
)

def get_refresh_token(self, service, **kwargs):
# type: (str, **Any) -> str
# type: (str, Dict[str, Any]) -> str
if not self._refresh_token or time.time() - self._last_refresh_time > 300:
self._refresh_token = self.exchange_aad_token_for_refresh_token(service, **kwargs)
self._last_refresh_time = time.time()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
from enum import Enum
from typing import TYPE_CHECKING
from ._generated.models import ContentProperties
from ._generated.models import RepositoryProperties as GeneratedRepositoryProperties

if TYPE_CHECKING:
from ._generated.models import ManifestAttributesBase
from ._generated.models import RepositoryProperties as GeneratedRepositoryProperties
from ._generated.models import ArtifactTagProperties as GeneratedTagProperties


Expand Down Expand Up @@ -152,6 +152,17 @@ def _from_generated(cls, generated):
registry=generated.additional_properties.get("registry", None),
)

def _to_generated(self):
# type: () -> GeneratedRepositoryProperties
return GeneratedRepositoryProperties(
name=self.name,
created_on=self.created_on,
last_updated_on=self.last_updated_on,
manifest_count=self.manifest_count,
tag_count=self.tag_count,
writeable_propertie=self.content_permissions._to_generated()
)


class RegistryArtifactOrderBy(str, Enum):
"""Enum for ordering registry artifacts"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
# --------------------------------------------------------------------------

from ._async_container_registry_client import ContainerRegistryClient
from ._async_container_repository_client import ContainerRepositoryClient
from ._async_container_repository_client import ContainerRepository

__all__ = [
"ContainerRegistryClient",
"ContainerRepositoryClient",
"ContainerRepository",
]
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class ContainerRegistryApiVersion(str, Enum):


class ContainerRegistryBaseClient(object):
"""Base class for ContainerRegistryClient and ContainerRepositoryClient
"""Base class for ContainerRegistryClient and ContainerRepository

:param endpoint: Azure Container Registry endpoint
:type endpoint: str
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from azure.core.tracing.decorator_async import distributed_trace_async

from ._async_base_client import ContainerRegistryBaseClient, AsyncTransportWrapper
from ._async_container_repository_client import ContainerRepositoryClient
from ._async_container_repository_client import ContainerRepository
from .._generated.models import AcrErrors
from .._helpers import _parse_next_link
from .._models import RepositoryProperties, DeletedRepositoryResult
Expand Down Expand Up @@ -162,19 +162,19 @@ async def get_next(next_link=None):
return AsyncItemPaged(get_next, extract_data)

@distributed_trace
def get_repository_client(self, repository: str, **kwargs: Dict[str, Any]) -> ContainerRepositoryClient:
def get_repository_client(self, repository: str, **kwargs: Dict[str, Any]) -> ContainerRepository:
"""Get a repository client

:param repository: The repository to create a client for
:type repository: str
:returns: :class:`~azure.containerregistry.aio.ContainerRepositoryClient`
:returns: :class:`~azure.containerregistry.aio.ContainerRepository`
"""
_pipeline = AsyncPipeline(
transport=AsyncTransportWrapper(
self._client._client._pipeline._transport # pylint: disable=protected-access
),
policies=self._client._client._pipeline._impl_policies, # pylint: disable=protected-access
)
return ContainerRepositoryClient(
return ContainerRepository(
self._endpoint, repository, credential=self._credential, pipeline=_pipeline, **kwargs
)
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@
from azure.core.credentials_async import AsyncTokenCredential


class ContainerRepositoryClient(ContainerRegistryBaseClient):
class ContainerRepository(ContainerRegistryBaseClient):
def __init__(
self, endpoint: str, repository: str, credential: "AsyncTokenCredential", **kwargs: Dict[str, Any]
) -> None:
"""Create a ContainerRepositoryClient from an endpoint, repository name, and credential
"""Create a ContainerRepository from an endpoint, repository name, and credential

:param endpoint: An ACR endpoint
:type endpoint: str
Expand All @@ -51,7 +51,7 @@ def __init__(
self._endpoint = endpoint
self._credential = credential
self.repository = repository
super(ContainerRepositoryClient, self).__init__(endpoint=self._endpoint, credential=credential, **kwargs)
super(ContainerRepository, self).__init__(endpoint=self._endpoint, credential=credential, **kwargs)

async def _get_digest_from_tag(self, tag: str) -> None:
tag_props = await self.get_tag_properties(tag)
Expand Down Expand Up @@ -405,3 +405,15 @@ async def set_tag_properties(
self.repository, tag, value=permissions._to_generated(), **kwargs # pylint: disable=protected-access
)
)

@distributed_trace_async
async def set_properties(self, properties, **kwargs):
# type: (RepositoryProperties, Dict[str, Any]) -> RepositoryProperties
"""Set the properties of a repository

:returns: :class:`~azure.containerregistry.RepositoryProperties`
:raises: :class:`~azure.core.exceptions.ResourceNotFoundError`
"""
return RepositoryProperties._from_generated( # pylint: disable=protected-access
await self._client.container_registry.set_properties(self.repository, properties._to_generated(), **kwargs)
)
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ def __init__(

async def get_acr_access_token(self, challenge: str, **kwargs: Dict[str, Any]) -> str:
parsed_challenge = _parse_challenge(challenge)
refresh_token = await self.get_refresh_token(parsed_challenge["service"], **kwargs)
# refresh_token = await self.get_refresh_token(parsed_challenge["service"], **kwargs) # TODO: This is interfering with recordings
refresh_token = await self.exchange_aad_token_for_refresh_token(parsed_challenge["service"], **kwargs)
return await self.exchange_refresh_token_for_access_token(
refresh_token, service=parsed_challenge["service"], scope=parsed_challenge["scope"], **kwargs
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
FILE: sample_create_client_async.py

DESCRIPTION:
These samples demonstrate creating a ContainerRegistryClient and a ContainerRepositoryClient
These samples demonstrate creating a ContainerRegistryClient and a ContainerRepository

USAGE:
python sample_create_client_async.py
Expand Down Expand Up @@ -40,10 +40,10 @@ def create_registry_client(self):
def create_repository_client(self):
# Instantiate the ContainerRegistryClient
# [START create_repository_client]
from azure.containerregistry.aio import ContainerRepositoryClient
from azure.containerregistry.aio import ContainerRepository
from azure.identity.aio import DefaultAzureCredential

client = ContainerRepositoryClient(self.account_url, "my_repository", DefaultAzureCredential())
client = ContainerRepository(self.account_url, "my_repository", DefaultAzureCredential())
# [END create_repository_client]

async def basic_sample(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
FILE: sample_create_client.py

DESCRIPTION:
These samples demonstrate creating a ContainerRegistryClient and a ContainerRepositoryClient
These samples demonstrate creating a ContainerRegistryClient and a ContainerRepository

USAGE:
python sample_create_client.py
Expand Down Expand Up @@ -40,10 +40,10 @@ def create_registry_client(self):
def create_repository_client(self):
# Instantiate the ContainerRegistryClient
# [START create_repository_client]
from azure.containerregistry import ContainerRepositoryClient
from azure.containerregistry import ContainerRepository
from azure.identity import DefaultAzureCredential

client = ContainerRepositoryClient(self.account_url, "my_repository", DefaultAzureCredential())
client = ContainerRepository(self.account_url, "my_repository", DefaultAzureCredential())
# [END create_repository_client]

def basic_sample(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import six

from azure.containerregistry.aio import (
ContainerRepositoryClient,
ContainerRepository,
ContainerRegistryClient,
)
from azure.containerregistry import (
Expand Down Expand Up @@ -56,8 +56,8 @@ def create_registry_client(self, endpoint, **kwargs):
**kwargs,
)

def create_repository_client(self, endpoint, name, **kwargs):
return ContainerRepositoryClient(
def create_container_repository(self, endpoint, name, **kwargs):
return ContainerRepository(
endpoint=endpoint,
repository=name,
credential=self.get_credential(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ interactions:
content-type:
- application/json; charset=utf-8
date:
- Tue, 13 Apr 2021 15:59:17 GMT
- Tue, 27 Apr 2021 21:52:55 GMT
docker-distribution-api-version:
- registry/2.0
server:
Expand Down Expand Up @@ -72,53 +72,15 @@ interactions:
content-type:
- application/json; charset=utf-8
date:
- Tue, 13 Apr 2021 15:59:19 GMT
- Tue, 27 Apr 2021 21:52:57 GMT
server:
- openresty
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
x-ms-ratelimit-remaining-calls-per-second:
- '165.883333'
status:
code: 200
message: OK
- request:
body: grant_type=refresh_token&service=fake_url.azurecr.io&scope=repository%3Alibrary%2Fhello-world%3Ametadata_read&refresh_token=REDACTED
headers:
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
Content-Length:
- '1089'
Content-Type:
- application/x-www-form-urlencoded
User-Agent:
- azsdk-python-azure-containerregistry/1.0.0b1 Python/3.9.0rc1 (Windows-10-10.0.19041-SP0)
method: POST
uri: https://fake_url.azurecr.io/oauth2/token
response:
body:
string: '{"access_token": "REDACTED"}'
headers:
connection:
- keep-alive
content-type:
- application/json; charset=utf-8
date:
- Tue, 13 Apr 2021 15:59:19 GMT
server:
- openresty
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
x-ms-ratelimit-remaining-calls-per-second:
- '165.766667'
- '166.65'
status:
code: 200
message: OK
Expand All @@ -138,9 +100,10 @@ interactions:
response:
body:
string: '{"registry": "fake_url.azurecr.io", "imageName": "library/hello-world",
"createdTime": "2021-04-13T15:10:43.6788287Z", "lastUpdateTime": "2021-04-13T15:26:48.3839908Z",
"manifestCount": 10, "tagCount": 5, "changeableAttributes": {"deleteEnabled":
true, "writeEnabled": true, "readEnabled": true, "listEnabled": true}}'
"createdTime": "2021-04-13T15:10:43.6788287Z", "lastUpdateTime": "2021-04-20T12:50:15.1385136Z",
"manifestCount": 12, "tagCount": 5, "changeableAttributes": {"deleteEnabled":
false, "writeEnabled": false, "readEnabled": false, "listEnabled": false,
"teleportEnabled": false}}'
headers:
access-control-expose-headers:
- Docker-Content-Digest
Expand All @@ -150,11 +113,11 @@ interactions:
connection:
- keep-alive
content-length:
- '298'
- '326'
content-type:
- application/json; charset=utf-8
date:
- Tue, 13 Apr 2021 15:59:19 GMT
- Tue, 27 Apr 2021 21:52:57 GMT
docker-distribution-api-version:
- registry/2.0
server:
Expand Down
Loading