/// <summary>
        /// Method to get Cloud Service object for a given vault
        /// </summary>
        /// <param name="vault">vault object</param>
        /// <returns>cloud service object.</returns>
        public CloudService GetCloudServiceForVault(ASRVault vault)
        {
            IEnumerable<CloudService> cloudServiceList = this.GetCloudServices();

            foreach (var cloudService in cloudServiceList)
            {
                Vault selectedVault = null;
                if (cloudService.GeoRegion.Equals(vault.Location, StringComparison.InvariantCultureIgnoreCase))
                {
                    foreach (var resource in cloudService.Resources)
                    {
                        if (resource.Name.Equals(vault.Name, StringComparison.InvariantCultureIgnoreCase))
                        {
                            selectedVault = resource;
                            return cloudService;
                        }
                    }
                }
            }

            throw new ArgumentException(
                string.Format(
                Properties.Resources.InCorrectVaultInformation,
                vault.Name,
                vault.Location));
        }
        /// <summary>
        /// Method to get the Azure site recovery sites
        /// </summary>
        /// <param name="vault">vault object</param>
        /// <returns>Site list response</returns>
        public SiteListResponse GetAzureSiteRecoverySites(ASRVault vault = null)
        {
            if (vault != null)
            {
                Utilities.UpdateVaultSettings(new ASRVaultCreds()
                {
                    CloudServiceName = vault.CloudServiceName,
                    ResourceName = vault.Name
                });
            }

            return this.GetSiteRecoveryClient().Sites.List(this.GetRequestHeaders(false));
        }
        /// <summary>
        /// Gets the vault credential object
        /// </summary>
        /// <param name="managementCert">certificate to be uploaded</param>
        /// <param name="vault">vault object</param>
        /// <param name="site">site object </param>
        /// <returns>credential object</returns>
        public ASRVaultCreds GenerateVaultCredential(X509Certificate2 managementCert, ASRVault vault, Site site)
        {
            string currentResourceName = PSRecoveryServicesClient.asrVaultCreds.ResourceName;
            string currentCloudServiceName = PSRecoveryServicesClient.asrVaultCreds.CloudServiceName;

            // Update vault settings with the working vault to generate file
            Utilities.UpdateVaultSettings(new ASRVaultCreds()
            {
                CloudServiceName = vault.CloudServiceName,
                ResourceName = vault.Name
            });

            // Get Channel Integrity key
            string channelIntegrityKey;
            Task<string> getChannelIntegrityKey = this.GetChannelIntegrityKey();

            // Making sure we can generate the file, once the SDK and portal are inter-operable
            // upload certificate and fetch of ACIK can be made parallel to improvve the performace.
            getChannelIntegrityKey.Wait();

            // Upload certificate
            UploadCertificateResponse acsDetails;
            Task<UploadCertificateResponse> uploadCertificate = this.UpdateVaultCertificate(managementCert);
            uploadCertificate.Wait();

            acsDetails = uploadCertificate.Result;
            channelIntegrityKey = getChannelIntegrityKey.Result;

            ASRVaultCreds asrVaultCreds = this.GenerateCredentialObject(
                                                managementCert,
                                                acsDetails,
                                                channelIntegrityKey,
                                                vault,
                                                site);

            // Update back the original vault settings
            Utilities.UpdateVaultSettings(new ASRVaultCreds()
            {
                CloudServiceName = currentCloudServiceName,
                ResourceName = currentResourceName
            });

            return asrVaultCreds;
        }
        /// <summary>
        /// Method to create a Site
        /// </summary>
        /// <param name="siteName">name of the site</param>
        /// <param name="siteType">type of the site</param>
        /// <param name="vault">vault object</param>
        /// <returns>job object for the creation.</returns>
        public JobResponse CreateAzureSiteRecoverySite(string siteName, string siteType = null, ASRVault vault = null)
        {
            if (vault != null)
            {
                Utilities.UpdateVaultSettings(new ASRVaultCreds()
                {
                    CloudServiceName = vault.CloudServiceName,
                    ResourceName = vault.Name
                });
            }

            if (string.IsNullOrEmpty(siteType))
            {
                siteType = FabricProviders.HyperVSite;
            }

            SiteCreationInput input = new SiteCreationInput()
            {
                Name = siteName,
                FabricType = siteType
            };

            return this.GetSiteRecoveryClient().Sites.Create(input, this.GetRequestHeaders(false));
        }
        /// <summary>
        /// Method to generate the credential file content
        /// </summary>
        /// <param name="managementCert">management cert</param>
        /// <param name="acsDetails">ACS details</param>
        /// <param name="channelIntegrityKey">Integrity key</param>
        /// <param name="vault">vault object</param>
        /// <param name="site">site object</param>
        /// <returns>vault credential object</returns>
        private ASRVaultCreds GenerateCredentialObject(X509Certificate2 managementCert, UploadCertificateResponse acsDetails, string channelIntegrityKey, ASRVault vault, Site site)
        {
            string serializedCertifivate = Convert.ToBase64String(managementCert.Export(X509ContentType.Pfx));

            AcsNamespace acsNamespace = new AcsNamespace(acsDetails);

            ASRVaultCreds vaultCreds = new ASRVaultCreds(
                                            vault.SubscriptionId,
                                            vault.Name,
                                            serializedCertifivate,
                                            acsNamespace,
                                            channelIntegrityKey,
                                            vault.CloudServiceName,
                                            site.ID,
                                            site.Name);

            return vaultCreds;
        }