internal ContainerRegistryBlobClient(
            Uri endpoint,
            TokenCredential credential,
            string repository,
            IContainerRegistryAuthenticationClient authenticationClient,
            ContainerRegistryClientOptions options)
        {
            Argument.AssertNotNull(endpoint, nameof(endpoint));
            Argument.AssertNotNull(credential, nameof(credential));
            Argument.AssertNotNull(repository, nameof(repository));

            if (options.Audience == null)
            {
                throw new InvalidOperationException($"{nameof(ContainerRegistryClientOptions.Audience)} property must be set to initialize a {nameof(ContainerRegistryBlobClient)}.");
            }

            _endpoint          = endpoint;
            _registryName      = endpoint.Host.Split('.')[0];
            _repositoryName    = repository;
            _clientDiagnostics = new ClientDiagnostics(options);

            _acrAuthPipeline = HttpPipelineBuilder.Build(options);
            _acrAuthClient   = authenticationClient ?? new AuthenticationRestClient(_clientDiagnostics, _acrAuthPipeline, endpoint.AbsoluteUri);

            string defaultScope = options.Audience + "/.default";

            _pipeline       = HttpPipelineBuilder.Build(options, new ContainerRegistryChallengeAuthenticationPolicy(credential, defaultScope, _acrAuthClient));
            _restClient     = new ContainerRegistryRestClient(_clientDiagnostics, _pipeline, _endpoint.AbsoluteUri);
            _blobRestClient = new ContainerRegistryBlobRestClient(_clientDiagnostics, _pipeline, _endpoint.AbsoluteUri);
        }
Beispiel #2
0
        private static void ProcessContainerRegistry(IRegistry containerRegistry, ILogger log)
        {
            log.LogInformation($"Processing container registry {containerRegistry.Name} ...");
            var clientOptions = new ContainerRegistryClientOptions()
            {
                Retry =
                {
                    Delay      = TimeSpan.FromSeconds(2),
                    MaxDelay   = TimeSpan.FromSeconds(30),
                    MaxRetries =                       25,
                    Mode       = RetryMode.Exponential
                },
                Audience = ContainerRegistryAudience.AzureResourceManagerPublicCloud
            };
            var client          = new ContainerRegistryClient(new Uri($"https://{containerRegistry.Name}.azurecr.io"), DefaultCredential, clientOptions);
            var repositoryNames = client.GetRepositoryNames();
            var tasks           = new List <Task>();

            foreach (var repositoryName in repositoryNames)
            {
                tasks.Add(Task.Run(() => ProcessRepository(client, repositoryName, log)));
            }
            try
            {
                Task.WaitAll(tasks.ToArray());
            }
            catch (AggregateException ae)
            {
                foreach (var e in ae.InnerExceptions)
                {
                    log.LogError(e.Message);
                }
            }
        }
        public ContainerRegistryBlobClient CreateAnonymouosBlobClient(RootConfiguration configuration, Uri registryUri, string repository)
        {
            var options = new ContainerRegistryClientOptions();

            options.Diagnostics.ApplySharedContainerRegistrySettings();
            options.Audience = new ContainerRegistryAudience(configuration.Cloud.ResourceManagerAudience);

            return(new(registryUri, repository, options));
        }
        public ContainerRegistryBlobClient CreateAuthenticatedBlobClient(RootConfiguration configuration, Uri registryUri, string repository)
        {
            var options = new ContainerRegistryClientOptions();

            options.Diagnostics.ApplySharedContainerRegistrySettings();
            options.Audience = new ContainerRegistryAudience(configuration.Cloud.ResourceManagerAudience);

            var credential = this.credentialFactory.CreateChain(configuration.Cloud.CredentialPrecedence, configuration.Cloud.ActiveDirectoryAuthorityUri);

            return(new(registryUri, credential, repository, options));
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="ContainerRegistryBlobClient"/> for managing container images and artifacts.
 /// </summary>
 /// <param name="endpoint">The URI endpoint of the container registry.  This is likely to be similar
 /// to "https://{registry-name}.azurecr.io".</param>
 /// <param name="credential">The API key credential used to authenticate requests
 /// against the container registry.  </param>
 /// <param name="repository">The name of the repository that logically groups the artifact parts.</param>
 /// <param name="options">Client configuration options for connecting to Azure Container Registry.</param>
 /// <exception cref="ArgumentNullException"> Thrown when the <paramref name="endpoint"/>, <paramref name="credential"/>, or <paramref name="repository"/> is null. </exception>
 public ContainerRegistryBlobClient(Uri endpoint, TokenCredential credential, string repository, ContainerRegistryClientOptions options) : this(endpoint, credential, repository, null, options)
 {
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="ContainerRegistryBlobClient"/> for managing container images and artifacts,
 /// using anonymous access to the registry.  Only operations that support anonymous access are enabled.  Other service
 /// methods will throw <see cref="RequestFailedException"/> if called from this client.
 /// </summary>
 /// <param name="endpoint">The URI endpoint of the container registry.  This is likely to be similar
 /// to "https://{registry-name}.azurecr.io".</param>
 /// <param name="repository">The name of the repository that logically groups the artifact parts.</param>
 /// <param name="options">Client configuration options for connecting to Azure Container Registry.</param>
 /// <exception cref="ArgumentNullException"> Thrown when the <paramref name="endpoint"/> or <paramref name="repository"/> is null. </exception>
 public ContainerRegistryBlobClient(Uri endpoint, string repository, ContainerRegistryClientOptions options) :
     this(endpoint, new ContainerRegistryAnonymousAccessCredential(), repository, options)
 {
 }