< Summary

Class:Microsoft.Azure.Batch.CertificateOperations
Assembly:Microsoft.Azure.Batch
File(s):C:\Git\azure-sdk-for-net\sdk\batch\Microsoft.Azure.Batch\src\CertificateOperations.cs
Covered lines:42
Uncovered lines:42
Coverable lines:84
Total lines:392
Line coverage:50% (42 of 84)
Covered branches:0
Total branches:4
Branch coverage:0% (0 of 4)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor()-0%100%
.ctor(...)-100%100%
get_CustomBehaviors()-100%100%
set_CustomBehaviors(...)-100%100%
GetCertificateAsync()-42.86%100%
GetCertificate(...)-0%100%
CreateCertificateFromCer(...)-0%0%
CreateCertificateFromCer(...)-100%100%
CreateCertificateFromPfx(...)-0%0%
CreateCertificateFromPfx(...)-0%100%
GetCertificateInfo(...)-0%100%
GetCertificateInfo(...)-0%100%
GetCertificateInfo(...)-0%100%
GetCertificateInfo(...)-100%100%
CreateAddCertificateEntity(...)-100%100%
ListCertificates(...)-100%100%
DeleteCertificateAsync()-75%100%
DeleteCertificate(...)-0%100%
CancelDeleteCertificateAsync()-75%100%
CancelDeleteCertificate(...)-0%100%
get_ParentBatchClient()-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\batch\Microsoft.Azure.Batch\src\CertificateOperations.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License. See License.txt in the project root for license information.
 3
 4namespace Microsoft.Azure.Batch
 5{
 6    using System;
 7    using System.Collections.Generic;
 8    using System.Globalization;
 9    using System.IO;
 10    using System.Security.Cryptography.X509Certificates;
 11    using System.Threading;
 12    using System.Threading.Tasks;
 13    using Microsoft.Rest.Azure;
 14    using Models = Microsoft.Azure.Batch.Protocol.Models;
 15
 16    /// <summary>
 17    /// Performs certificate-related operations on an Azure Batch account.
 18    /// </summary>
 19    public class CertificateOperations : IInheritedBehaviors
 20    {
 21        private readonly BatchClient _parentBatchClient;
 22
 23        /// <summary>
 24        /// The one and only thumbprint algorithm we support. Note that this is the thumbprint algorithm NOT the signatu
 25        /// X509Certificate2 also only supports sha1 based thumbprints.
 26        /// </summary>
 27        private const string KnownCertificateAlgorithm = "sha1";
 28
 29#region constructors
 30
 031        private CertificateOperations()
 32        {
 033        }
 34
 1135        internal CertificateOperations(BatchClient batchClient, IEnumerable<BatchClientBehavior> inheritedBehaviors)
 36        {
 1137            _parentBatchClient = batchClient;
 38
 39            // inherit from instantiating parent
 1140            InheritUtil.InheritClientBehaviorsAndSetPublicProperty(this, inheritedBehaviors);
 1141        }
 42
 43#endregion constructors
 44
 45#region IInheritedBehaviors
 46
 47        private IList<BatchClientBehavior> _customBehaviors;
 48
 49        /// <summary>
 50        /// Gets or sets a list of behaviors that modify or customize requests to the Batch service
 51        /// made via this <see cref="CertificateOperations"/>.
 52        /// </summary>
 53        /// <remarks>
 54        /// <para>These behaviors are inherited by child objects.</para>
 55        /// <para>Modifications are applied in the order of the collection. The last write wins.</para>
 56        /// </remarks>
 57        public IList<BatchClientBehavior> CustomBehaviors
 58        {
 59            get
 60            {
 11161                return _customBehaviors;
 62            }
 63            set
 64            {
 1165                _customBehaviors = value;
 1166            }
 67        }
 68
 69#endregion IInheritedBehaviors
 70
 71#region CertificateOperations
 72
 73        /// <summary>
 74        /// Gets the specified <see cref="Certificate"/>.
 75        /// </summary>
 76        /// <param name="thumbprintAlgorithm">The algorithm used to derive the <paramref name="thumbprint"/> parameter. 
 77        /// <param name="thumbprint">The thumbprint of the certificate to get.</param>
 78        /// <param name="detailLevel">A <see cref="DetailLevel"/> used for controlling which properties are retrieved fr
 79        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 80        /// <param name="cancellationToken">A <see cref="CancellationToken"/> for controlling the lifetime of the asynch
 81        /// <returns>A <see cref="Certificate"/> containing information about the specified certificate in the Azure Bat
 82        /// <remarks>The get certificate operation runs asynchronously.</remarks>
 83        public async Task<Certificate> GetCertificateAsync(
 84            string thumbprintAlgorithm,
 85            string thumbprint,
 86            DetailLevel detailLevel = null,
 87            IEnumerable<BatchClientBehavior> additionalBehaviors = null,
 88            CancellationToken cancellationToken = default(CancellationToken))
 89        {
 90            // set up behavior manager
 191            BehaviorManager bhMgr = new BehaviorManager(this.CustomBehaviors, additionalBehaviors, detailLevel);
 92
 93            // start operation
 194            Task<AzureOperationResponse<Models.Certificate, Models.CertificateGetHeaders>> asyncTask = _parentBatchClien
 95
 96            // wait for operation to complete
 197            var response = await asyncTask.ConfigureAwait(continueOnCapturedContext: false);
 98
 99            // extract results
 0100            Models.Certificate protoCert = response.Body;
 101
 102            // wrap protocol object
 0103            Certificate omCert = new Certificate(this.ParentBatchClient, protoCert, this.CustomBehaviors);
 104
 0105            return omCert;
 0106        }
 107
 108        /// <summary>
 109        /// Gets the specified <see cref="Certificate"/>.
 110        /// </summary>
 111        /// <param name="thumbprintAlgorithm">The algorithm used to derive the <paramref name="thumbprint"/> parameter. 
 112        /// <param name="thumbprint">The thumbprint of the certificate to get.</param>
 113        /// <param name="detailLevel">A <see cref="DetailLevel"/> used for controlling which properties are retrieved fr
 114        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 115        /// <returns>A <see cref="Certificate"/> containing information about the specified certificate in the Azure Bat
 116        /// <remarks>This is a blocking operation. For a non-blocking equivalent, see <see cref="GetCertificateAsync"/>.
 117        public Certificate GetCertificate(string thumbprintAlgorithm, string thumbprint, DetailLevel detailLevel = null,
 118        {
 0119            Task<Certificate> asyncTask = GetCertificateAsync(thumbprintAlgorithm, thumbprint, detailLevel, additionalBe
 0120            Certificate omCert = asyncTask.WaitAndUnaggregateException(this.CustomBehaviors, additionalBehaviors);
 121
 0122            return omCert;
 123        }
 124
 125        /// <summary>
 126        /// Creates a new <see cref="Certificate"/> from a .cer file.
 127        /// </summary>
 128        /// <param name="path">The path to the .cer file.</param>
 129        /// <returns>A <see cref="Certificate"/> representing a new certificate that has not been added to the Batch ser
 130        public Certificate CreateCertificateFromCer(string path)
 131        {
 0132            if (string.IsNullOrWhiteSpace(path))
 133            {
 0134                throw new ArgumentOutOfRangeException(nameof(path));
 135            }
 136
 0137            Models.CertificateAddParameter protoCert = GetCertificateInfo(path);
 0138            Certificate omCert = new Certificate(
 0139                this.ParentBatchClient,
 0140                protoCert,
 0141                this.CustomBehaviors);
 142
 0143            return omCert;
 144        }
 145
 146        /// <summary>
 147        /// Creates a new <see cref="Certificate"/> from .cer format data in memory.
 148        /// </summary>
 149        /// <param name="data">The certificate data in .cer format.</param>
 150        /// <returns>A <see cref="Certificate"/> representing a new certificate that has not been added to the Batch ser
 151        public Certificate CreateCertificateFromCer(byte[] data)
 152        {
 8153            Models.CertificateAddParameter protoCert = GetCertificateInfo(data);
 8154            Certificate omCert = new Certificate(this.ParentBatchClient, protoCert, this.CustomBehaviors);
 155
 8156            return omCert;
 157        }
 158
 159        /// <summary>
 160        /// Creates a new <see cref="Certificate"/> from a .pfx file.
 161        /// </summary>
 162        /// <param name="path">The path to the .pfx file.</param>
 163        /// <param name="password">The password to access the certificate private key. This can be null if the PFX is no
 164        /// <returns>A <see cref="Certificate"/> representing a new certificate that has not been added to the Batch ser
 165        public Certificate CreateCertificateFromPfx(string path, string password = null)
 166        {
 0167            if (string.IsNullOrWhiteSpace(path))
 168            {
 0169                throw new ArgumentOutOfRangeException(nameof(path));
 170            }
 171
 0172            Models.CertificateAddParameter protoCert = GetCertificateInfo(path, password);
 0173            Certificate omCert = new Certificate(this.ParentBatchClient, protoCert, this.CustomBehaviors);
 174
 0175            return omCert;
 176        }
 177
 178        /// <summary>
 179        /// Creates a new <see cref="Certificate"/> from .pfx format data in memory.
 180        /// </summary>
 181        /// <param name="data">The certificate data in .pfx format.</param>
 182        /// <param name="password">The password to access the certificate private key. This can be null if the PFX is no
 183        /// <returns>A <see cref="Certificate"/> representing a new certificate that has not been added to the Batch ser
 184        public Certificate CreateCertificateFromPfx(byte[] data, string password = null)
 185        {
 0186            Models.CertificateAddParameter protoCert = GetCertificateInfo(data, password);
 0187            Certificate omCert = new Certificate(this.ParentBatchClient, protoCert, this.CustomBehaviors);
 188
 0189            return omCert;
 190        }
 191
 192        #region Private
 193
 194        private Models.CertificateAddParameter GetCertificateInfo(string pfxPath, string password)
 195        {
 0196            byte[] rawData = System.IO.File.ReadAllBytes(pfxPath);
 197
 0198            return GetCertificateInfo(rawData, password);
 199        }
 200
 201        private Models.CertificateAddParameter GetCertificateInfo(byte[] rawData, string password)
 202        {
 0203            var certificate = new X509Certificate2(rawData, password);
 204
 0205            Models.CertificateAddParameter cert = CreateAddCertificateEntity(rawData, certificate);
 206
 0207            cert.Password = password;
 0208            cert.CertificateFormat = Models.CertificateFormat.Pfx;
 209
 0210            return cert;
 211        }
 212
 213        private Models.CertificateAddParameter GetCertificateInfo(string certFilePath)
 214        {
 0215            byte[] rawData = System.IO.File.ReadAllBytes(certFilePath);
 0216            return GetCertificateInfo(rawData);
 217        }
 218
 219        private Models.CertificateAddParameter GetCertificateInfo(byte[] rawData)
 220        {
 8221            var certificate = new X509Certificate2(rawData);
 222
 8223            Models.CertificateAddParameter cert = CreateAddCertificateEntity(rawData, certificate);
 224
 8225            cert.CertificateFormat = Models.CertificateFormat.Cer;
 8226            return cert;
 227        }
 228
 229        private static Models.CertificateAddParameter CreateAddCertificateEntity(byte[] rawData, X509Certificate2 certif
 230        {
 8231            Models.CertificateAddParameter cert = new Models.CertificateAddParameter();
 8232            cert.Thumbprint = certificate.Thumbprint.ToLowerInvariant();
 233
 234            //ThumbprintAlgorithm is always SHA1 since thumbprint is dynamically generated from the cert body
 8235            cert.ThumbprintAlgorithm = KnownCertificateAlgorithm;
 8236            cert.Data = Convert.ToBase64String(rawData);
 237
 8238            return cert;
 239        }
 240
 241        #endregion
 242
 243        /// <summary>
 244        /// Enumerates the <see cref="Certificate">certificates</see> in the Batch account.
 245        /// </summary>
 246        /// <param name="detailLevel">A <see cref="DetailLevel"/> used for filtering the list and for controlling which 
 247        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 248        /// <returns>An <see cref="IPagedEnumerable{Certificate}"/> that can be used to enumerate certificates asynchron
 249        /// <remarks>This method returns immediately; the certificates are retrieved from the Batch service only when th
 250        /// Retrieval is non-atomic; certificates are retrieved in pages during enumeration of the collection.</remarks>
 251        public IPagedEnumerable<Certificate> ListCertificates(DetailLevel detailLevel = null, IEnumerable<BatchClientBeh
 252        {
 253            // set up behavior manager
 2254            BehaviorManager bhMgr = new BehaviorManager(this.CustomBehaviors, additionalBehaviors);
 255
 2256            PagedEnumerable<Certificate> enumerable = new PagedEnumerable<Certificate>( // the lamda will be the enumera
 2257                () =>
 2258                {
 2259                    // here is the actual strongly typed enumerator
 4260                    AsyncListCertificatesEnumerator typedEnumerator = new AsyncListCertificatesEnumerator(this, bhMgr, d
 2261
 2262                    // here is the base
 2263                    PagedEnumeratorBase<Certificate> enumeratorBase = typedEnumerator;
 2264
 4265                    return enumeratorBase;
 2266                });
 267
 2268            return enumerable;
 269        }
 270
 271        /// <summary>
 272        /// Deletes the certificate from the Batch account.
 273        /// </summary>
 274        /// <param name="thumbprintAlgorithm">The algorithm used to derive the <paramref name="thumbprint"/> parameter. 
 275        /// <param name="thumbprint">The thumbprint of the certificate to delete.</param>
 276        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 277        /// <param name="cancellationToken">A <see cref="CancellationToken"/> for controlling the lifetime of the asynch
 278        /// <returns>A <see cref="System.Threading.Tasks.Task"/> that represents the asynchronous operation.</returns>
 279        /// <remarks>
 280        /// <para>The delete operation requests that the certificate be deleted.  The request puts the certificate in th
 281        /// The Batch service will perform the actual certificate deletion without any further client action.</para>
 282        /// <para>You cannot delete a certificate if a resource (pool or compute node) is using it. Before you can delet
 283        /// <list type="bullet">
 284        /// <item><description>The certificate is not associated with any pools.</description></item>
 285        /// <item><description>The certificate is not installed on any compute nodes.  (Even if you remove a certificate
 286        /// </list>
 287        /// <para>If you try to delete a certificate that is in use, the deletion fails. The certificate state changes t
 288        /// You can use <see cref="CancelDeleteCertificateAsync"/> to set the status back to Active if you decide that y
 289        /// <para>The delete operation runs asynchronously.</para>
 290        /// </remarks>
 291        public async Task DeleteCertificateAsync(
 292            string thumbprintAlgorithm,
 293            string thumbprint,
 294            IEnumerable<BatchClientBehavior> additionalBehaviors = null,
 295            CancellationToken cancellationToken = default(CancellationToken))
 296        {
 297            // create the behavior manager
 1298            BehaviorManager bhMgr = new BehaviorManager(this.CustomBehaviors, additionalBehaviors);
 299
 1300            Task asyncTask = _parentBatchClient.ProtocolLayer.DeleteCertificate(thumbprintAlgorithm, thumbprint, bhMgr, 
 301
 1302            await asyncTask.ConfigureAwait(continueOnCapturedContext: false);
 0303        }
 304
 305        /// <summary>
 306        /// Deletes the certificate from the Batch account.
 307        /// </summary>
 308        /// <param name="thumbprintAlgorithm">The algorithm used to derive the <paramref name="thumbprint"/> parameter. 
 309        /// <param name="thumbprint">The thumbprint of the certificate to delete.</param>
 310        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 311        /// <remarks>
 312        /// <para>The delete operation requests that the certificate be deleted.  The request puts the certificate in th
 313        /// The Batch service will perform the actual certificate deletion without any further client action.</para>
 314        /// <para>You cannot delete a certificate if a resource (pool or compute node) is using it. Before you can delet
 315        /// <list type="bullet">
 316        /// <item><description>The certificate is not associated with any pools.</description></item>
 317        /// <item><description>The certificate is not installed on any compute nodes.  (Even if you remove a certificate
 318        /// </list>
 319        /// <para>If you try to delete a certificate that is in use, the deletion fails. The certificate state changes t
 320        /// You can use <see cref="CancelDeleteCertificateAsync"/> to set the status back to Active if you decide that y
 321        /// <para>This is a blocking operation. For a non-blocking equivalent, see <see cref="DeleteCertificateAsync"/>.
 322        /// </remarks>
 323        public void DeleteCertificate(string thumbprintAlgorithm, string thumbprint, IEnumerable<BatchClientBehavior> ad
 324        {
 0325            Task asyncTask = DeleteCertificateAsync(thumbprintAlgorithm, thumbprint, additionalBehaviors);
 0326            asyncTask.WaitAndUnaggregateException(this.CustomBehaviors, additionalBehaviors);
 0327        }
 328
 329        /// <summary>
 330        /// Cancels a failed deletion of the specified certificate.  This can be done only when
 331        /// the certificate is in the <see cref="Common.CertificateState.DeleteFailed"/> state, and restores the certifi
 332        /// </summary>
 333        /// <param name="thumbprintAlgorithm">The algorithm used to derive the <paramref name="thumbprint"/> parameter. 
 334        /// <param name="thumbprint">The thumbprint of the certificate that failed to delete.</param>
 335        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 336        /// <param name="cancellationToken">A <see cref="CancellationToken"/> for controlling the lifetime of the asynch
 337        /// <returns>A <see cref="System.Threading.Tasks.Task"/> object that represents the asynchronous operation.</ret
 338        /// <remarks>
 339        /// <para>If you still wish to delete the certificate (instead of returning it to Active), you do not need to ca
 340        /// the failed deletion. You must make sure that the certificate is not being used by any resources, and then yo
 341        /// can try again to delete the certificate (see <see cref="DeleteCertificateAsync"/>.</para>
 342        /// <para>The cancel delete operation runs asynchronously.</para>
 343        /// </remarks>
 344        public async Task CancelDeleteCertificateAsync(
 345            string thumbprintAlgorithm,
 346            string thumbprint,
 347            IEnumerable<BatchClientBehavior> additionalBehaviors = null,
 348            CancellationToken cancellationToken = default(CancellationToken))
 349        {
 350            // create the behavior manager
 1351            BehaviorManager bhMgr = new BehaviorManager(this.CustomBehaviors, additionalBehaviors);
 352
 353            // start operation
 1354            Task asyncTask = _parentBatchClient.ProtocolLayer.CancelDeleteCertificate(thumbprintAlgorithm, thumbprint, b
 355
 356            // wait for operation complete
 1357            await asyncTask.ConfigureAwait(continueOnCapturedContext: false);
 0358        }
 359
 360        /// <summary>
 361        /// Cancels a failed deletion of the specified certificate.  This can be done only when
 362        /// the certificate is in the <see cref="Common.CertificateState.DeleteFailed"/> state, and restores the certifi
 363        /// </summary>
 364        /// <param name="thumbprintAlgorithm">The algorithm used to derive the <paramref name="thumbprint"/> parameter. 
 365        /// <param name="thumbprint">The thumbprint of the certificate that failed to delete.</param>
 366        /// <param name="additionalBehaviors">A collection of <see cref="BatchClientBehavior"/> instances that are appli
 367        /// <returns>A <see cref="System.Threading.Tasks.Task"/> object that represents the asynchronous operation.</ret
 368        /// <remarks>
 369        /// <para>If you still wish to delete the certificate (instead of returning it to Active), you do not need to ca
 370        /// the failed deletion. You must make sure that the certificate is not being used by any resources, and then yo
 371        /// can try again to delete the certificate (see <see cref="DeleteCertificateAsync"/>.</para>
 372        /// <para>This is a blocking operation. For a non-blocking equivalent, see <see cref="CancelDeleteCertificateAsy
 373        /// </remarks>
 374        public void CancelDeleteCertificate(string thumbprintAlgorithm, string thumbprint, IEnumerable<BatchClientBehavi
 375        {
 0376            Task asyncTask = CancelDeleteCertificateAsync(thumbprintAlgorithm, thumbprint, additionalBehaviors);
 0377            asyncTask.WaitAndUnaggregateException(this.CustomBehaviors, additionalBehaviors);
 0378        }
 379
 380#endregion CertificateOperations
 381
 382#region Internal/private stuff
 383
 384        /// <summary>
 385        /// allows child objects to access the protocol wrapper and secrets to make verb calls
 386        /// </summary>
 11387        internal BatchClient ParentBatchClient { get { return _parentBatchClient; }}
 388
 389#endregion
 390
 391    }
 392}