/// <summary>
        /// Validates whether the Azure VM Network is associated with the subscription or not.
        /// </summary>
        /// <param name="azureSubscriptionId">Subscription Id</param>
        /// <param name="azureVMNetworkId">Azure VM Network Id</param>
        /// <param name="azureVMNetworkName">Azure VM Network name</param>
        public void ValidateVMNetworkSubscriptionAssociation(
            string azureSubscriptionId,
            string azureVMNetworkId,
            out string azureVMNetworkName)
        {
            bool associatedVMNetwork = false;

            azureVMNetworkName = string.Empty;

            AzureNetworkListResponse azureNetworkListResponse =
                this.GetSiteRecoveryClient().Networks.ListAzureNetworks(azureSubscriptionId);

            foreach (AzureNetworkListResponse.VirtualNetworkSite site in azureNetworkListResponse.VirtualNetworkSites)
            {
                if (azureVMNetworkId.Equals(site.Id))
                {
                    associatedVMNetwork = true;
                    azureVMNetworkName  = site.Name;
                    break;
                }
            }

            if (!associatedVMNetwork)
            {
                throw new InvalidOperationException(
                          string.Format(
                              Properties.Resources.AzureVMNetworkIsNotAssociatedWithTheSubscription,
                              azureVMNetworkId,
                              azureSubscriptionId));
            }
        }
        /// <summary>
        /// Get the list of all Azure VM networks under the vault.
        /// </summary>
        /// <param name='subscriptionId'>
        /// Optional.
        /// </param>
        /// <param name='cancellationToken'>
        /// Cancellation token.
        /// </param>
        /// <returns>
        /// The response structure for the Network Operations List operation.
        /// </returns>
        public async Task <AzureNetworkListResponse> ListAzureNetworksAsync(string subscriptionId, CancellationToken cancellationToken)
        {
            // Validate

            // Tracing
            bool   shouldTrace  = TracingAdapter.IsEnabled;
            string invocationId = null;

            if (shouldTrace)
            {
                invocationId = TracingAdapter.NextInvocationId.ToString();
                Dictionary <string, object> tracingParameters = new Dictionary <string, object>();
                tracingParameters.Add("subscriptionId", subscriptionId);
                TracingAdapter.Enter(invocationId, this, "ListAzureNetworksAsync", tracingParameters);
            }

            // Construct URL
            string url = "";

            url = url + "/";
            if (subscriptionId != null)
            {
                url = url + Uri.EscapeDataString(subscriptionId);
            }
            url = url + "/services/networking/virtualnetwork";
            string baseUrl = this.Client.BaseUri.AbsoluteUri;

            // Trim '/' character from the end of baseUrl and beginning of url.
            if (baseUrl[baseUrl.Length - 1] == '/')
            {
                baseUrl = baseUrl.Substring(0, baseUrl.Length - 1);
            }
            if (url[0] == '/')
            {
                url = url.Substring(1);
            }
            url = baseUrl + "/" + url;
            url = url.Replace(" ", "%20");

            // Create HTTP transport objects
            HttpRequestMessage httpRequest = null;

            try
            {
                httpRequest            = new HttpRequestMessage();
                httpRequest.Method     = HttpMethod.Get;
                httpRequest.RequestUri = new Uri(url);

                // Set Headers
                httpRequest.Headers.Add("x-ms-version", "2013-03-01");

                // Set Credentials
                cancellationToken.ThrowIfCancellationRequested();
                await this.Client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false);

                // Send Request
                HttpResponseMessage httpResponse = null;
                try
                {
                    if (shouldTrace)
                    {
                        TracingAdapter.SendRequest(invocationId, httpRequest);
                    }
                    cancellationToken.ThrowIfCancellationRequested();
                    httpResponse = await this.Client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);

                    if (shouldTrace)
                    {
                        TracingAdapter.ReceiveResponse(invocationId, httpResponse);
                    }
                    HttpStatusCode statusCode = httpResponse.StatusCode;
                    if (statusCode != HttpStatusCode.OK)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        CloudException ex = CloudException.Create(httpRequest, null, httpResponse, await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false));
                        if (shouldTrace)
                        {
                            TracingAdapter.Error(invocationId, ex);
                        }
                        throw ex;
                    }

                    // Create Result
                    AzureNetworkListResponse result = null;
                    // Deserialize Response
                    if (statusCode == HttpStatusCode.OK)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                        result = new AzureNetworkListResponse();
                        XDocument responseDoc = XDocument.Parse(responseContent);

                        XElement virtualNetworkSitesSequenceElement = responseDoc.Element(XName.Get("VirtualNetworkSites", "http://schemas.microsoft.com/windowsazure"));
                        if (virtualNetworkSitesSequenceElement != null)
                        {
                            foreach (XElement virtualNetworkSitesElement in virtualNetworkSitesSequenceElement.Elements(XName.Get("VirtualNetworkSite", "http://schemas.microsoft.com/windowsazure")))
                            {
                                AzureNetworkListResponse.VirtualNetworkSite virtualNetworkSiteInstance = new AzureNetworkListResponse.VirtualNetworkSite();
                                result.VirtualNetworkSites.Add(virtualNetworkSiteInstance);

                                XElement nameElement = virtualNetworkSitesElement.Element(XName.Get("Name", "http://schemas.microsoft.com/windowsazure"));
                                if (nameElement != null)
                                {
                                    string nameInstance = nameElement.Value;
                                    virtualNetworkSiteInstance.Name = nameInstance;
                                }

                                XElement labelElement = virtualNetworkSitesElement.Element(XName.Get("Label", "http://schemas.microsoft.com/windowsazure"));
                                if (labelElement != null)
                                {
                                    string labelInstance = labelElement.Value;
                                    virtualNetworkSiteInstance.Label = labelInstance;
                                }

                                XElement idElement = virtualNetworkSitesElement.Element(XName.Get("Id", "http://schemas.microsoft.com/windowsazure"));
                                if (idElement != null)
                                {
                                    string idInstance = idElement.Value;
                                    virtualNetworkSiteInstance.Id = idInstance;
                                }

                                XElement affinityGroupElement = virtualNetworkSitesElement.Element(XName.Get("AffinityGroup", "http://schemas.microsoft.com/windowsazure"));
                                if (affinityGroupElement != null)
                                {
                                    string affinityGroupInstance = affinityGroupElement.Value;
                                    virtualNetworkSiteInstance.AffinityGroup = affinityGroupInstance;
                                }

                                XElement locationElement = virtualNetworkSitesElement.Element(XName.Get("Location", "http://schemas.microsoft.com/windowsazure"));
                                if (locationElement != null)
                                {
                                    string locationInstance = locationElement.Value;
                                    virtualNetworkSiteInstance.Location = locationInstance;
                                }

                                XElement stateElement = virtualNetworkSitesElement.Element(XName.Get("State", "http://schemas.microsoft.com/windowsazure"));
                                if (stateElement != null)
                                {
                                    string stateInstance = stateElement.Value;
                                    virtualNetworkSiteInstance.State = stateInstance;
                                }

                                XElement addressSpaceElement = virtualNetworkSitesElement.Element(XName.Get("AddressSpace", "http://schemas.microsoft.com/windowsazure"));
                                if (addressSpaceElement != null)
                                {
                                    AzureNetworkListResponse.AddressSpace addressSpaceInstance = new AzureNetworkListResponse.AddressSpace();
                                    virtualNetworkSiteInstance.AddressSpace = addressSpaceInstance;

                                    XElement addressPrefixesSequenceElement = addressSpaceElement.Element(XName.Get("AddressPrefixes", "http://schemas.microsoft.com/windowsazure"));
                                    if (addressPrefixesSequenceElement != null)
                                    {
                                        foreach (XElement addressPrefixesElement in addressPrefixesSequenceElement.Elements(XName.Get("AddressPrefix", "http://schemas.microsoft.com/windowsazure")))
                                        {
                                            addressSpaceInstance.AddressPrefixes.Add(addressPrefixesElement.Value);
                                        }
                                    }
                                }

                                XElement subnetsSequenceElement = virtualNetworkSitesElement.Element(XName.Get("Subnets", "http://schemas.microsoft.com/windowsazure"));
                                if (subnetsSequenceElement != null)
                                {
                                    foreach (XElement subnetsElement in subnetsSequenceElement.Elements(XName.Get("Subnet", "http://schemas.microsoft.com/windowsazure")))
                                    {
                                        AzureNetworkListResponse.Subnet subnetInstance = new AzureNetworkListResponse.Subnet();
                                        virtualNetworkSiteInstance.Subnets.Add(subnetInstance);

                                        XElement nameElement2 = subnetsElement.Element(XName.Get("Name", "http://schemas.microsoft.com/windowsazure"));
                                        if (nameElement2 != null)
                                        {
                                            string nameInstance2 = nameElement2.Value;
                                            subnetInstance.Name = nameInstance2;
                                        }

                                        XElement addressPrefixElement = subnetsElement.Element(XName.Get("AddressPrefix", "http://schemas.microsoft.com/windowsazure"));
                                        if (addressPrefixElement != null)
                                        {
                                            string addressPrefixInstance = addressPrefixElement.Value;
                                            subnetInstance.AddressPrefix = addressPrefixInstance;
                                        }

                                        XElement networkSecurityGroupElement = subnetsElement.Element(XName.Get("NetworkSecurityGroup", "http://schemas.microsoft.com/windowsazure"));
                                        if (networkSecurityGroupElement != null)
                                        {
                                            string networkSecurityGroupInstance = networkSecurityGroupElement.Value;
                                            subnetInstance.NetworkSecurityGroup = networkSecurityGroupInstance;
                                        }
                                    }
                                }

                                XElement dnsElement = virtualNetworkSitesElement.Element(XName.Get("Dns", "http://schemas.microsoft.com/windowsazure"));
                                if (dnsElement != null)
                                {
                                    XElement dnsServersSequenceElement = dnsElement.Element(XName.Get("DnsServers", "http://schemas.microsoft.com/windowsazure"));
                                    if (dnsServersSequenceElement != null)
                                    {
                                        foreach (XElement dnsServersElement in dnsServersSequenceElement.Elements(XName.Get("DnsServer", "http://schemas.microsoft.com/windowsazure")))
                                        {
                                            AzureNetworkListResponse.DnsServer dnsServerInstance = new AzureNetworkListResponse.DnsServer();
                                            virtualNetworkSiteInstance.DnsServers.Add(dnsServerInstance);

                                            XElement nameElement3 = dnsServersElement.Element(XName.Get("Name", "http://schemas.microsoft.com/windowsazure"));
                                            if (nameElement3 != null)
                                            {
                                                string nameInstance3 = nameElement3.Value;
                                                dnsServerInstance.Name = nameInstance3;
                                            }

                                            XElement addressElement = dnsServersElement.Element(XName.Get("Address", "http://schemas.microsoft.com/windowsazure"));
                                            if (addressElement != null)
                                            {
                                                string addressInstance = addressElement.Value;
                                                dnsServerInstance.Address = addressInstance;
                                            }
                                        }
                                    }
                                }

                                XElement gatewayElement = virtualNetworkSitesElement.Element(XName.Get("Gateway", "http://schemas.microsoft.com/windowsazure"));
                                if (gatewayElement != null)
                                {
                                    AzureNetworkListResponse.Gateway gatewayInstance = new AzureNetworkListResponse.Gateway();
                                    virtualNetworkSiteInstance.Gateway = gatewayInstance;

                                    XElement profileElement = gatewayElement.Element(XName.Get("Profile", "http://schemas.microsoft.com/windowsazure"));
                                    if (profileElement != null)
                                    {
                                        GatewayProfile profileInstance = ((GatewayProfile)Enum.Parse(typeof(GatewayProfile), profileElement.Value, true));
                                        gatewayInstance.Profile = profileInstance;
                                    }

                                    XElement sitesSequenceElement = gatewayElement.Element(XName.Get("Sites", "http://schemas.microsoft.com/windowsazure"));
                                    if (sitesSequenceElement != null)
                                    {
                                        foreach (XElement sitesElement in sitesSequenceElement.Elements(XName.Get("LocalNetworkSite", "http://schemas.microsoft.com/windowsazure")))
                                        {
                                            AzureNetworkListResponse.LocalNetworkSite localNetworkSiteInstance = new AzureNetworkListResponse.LocalNetworkSite();
                                            gatewayInstance.Sites.Add(localNetworkSiteInstance);

                                            XElement nameElement4 = sitesElement.Element(XName.Get("Name", "http://schemas.microsoft.com/windowsazure"));
                                            if (nameElement4 != null)
                                            {
                                                string nameInstance4 = nameElement4.Value;
                                                localNetworkSiteInstance.Name = nameInstance4;
                                            }

                                            XElement vpnGatewayAddressElement = sitesElement.Element(XName.Get("VpnGatewayAddress", "http://schemas.microsoft.com/windowsazure"));
                                            if (vpnGatewayAddressElement != null)
                                            {
                                                string vpnGatewayAddressInstance = vpnGatewayAddressElement.Value;
                                                localNetworkSiteInstance.VpnGatewayAddress = vpnGatewayAddressInstance;
                                            }

                                            XElement addressSpaceElement2 = sitesElement.Element(XName.Get("AddressSpace", "http://schemas.microsoft.com/windowsazure"));
                                            if (addressSpaceElement2 != null)
                                            {
                                                AzureNetworkListResponse.AddressSpace addressSpaceInstance2 = new AzureNetworkListResponse.AddressSpace();
                                                localNetworkSiteInstance.AddressSpace = addressSpaceInstance2;

                                                XElement addressPrefixesSequenceElement2 = addressSpaceElement2.Element(XName.Get("AddressPrefixes", "http://schemas.microsoft.com/windowsazure"));
                                                if (addressPrefixesSequenceElement2 != null)
                                                {
                                                    foreach (XElement addressPrefixesElement2 in addressPrefixesSequenceElement2.Elements(XName.Get("AddressPrefix", "http://schemas.microsoft.com/windowsazure")))
                                                    {
                                                        addressSpaceInstance2.AddressPrefixes.Add(addressPrefixesElement2.Value);
                                                    }
                                                }
                                            }

                                            XElement connectionsSequenceElement = sitesElement.Element(XName.Get("Connections", "http://schemas.microsoft.com/windowsazure"));
                                            if (connectionsSequenceElement != null)
                                            {
                                                foreach (XElement connectionsElement in connectionsSequenceElement.Elements(XName.Get("Connection", "http://schemas.microsoft.com/windowsazure")))
                                                {
                                                    AzureNetworkListResponse.Connection connectionInstance = new AzureNetworkListResponse.Connection();
                                                    localNetworkSiteInstance.Connections.Add(connectionInstance);

                                                    XElement typeElement = connectionsElement.Element(XName.Get("Type", "http://schemas.microsoft.com/windowsazure"));
                                                    if (typeElement != null)
                                                    {
                                                        LocalNetworkConnectionType typeInstance = SiteRecoveryManagementClient.ParseLocalNetworkConnectionType(typeElement.Value);
                                                        connectionInstance.Type = typeInstance;
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    XElement vPNClientAddressPoolElement = gatewayElement.Element(XName.Get("VPNClientAddressPool", "http://schemas.microsoft.com/windowsazure"));
                                    if (vPNClientAddressPoolElement != null)
                                    {
                                        AzureNetworkListResponse.VPNClientAddressPool vPNClientAddressPoolInstance = new AzureNetworkListResponse.VPNClientAddressPool();
                                        gatewayInstance.VPNClientAddressPool = vPNClientAddressPoolInstance;

                                        XElement addressPrefixesSequenceElement3 = vPNClientAddressPoolElement.Element(XName.Get("AddressPrefixes", "http://schemas.microsoft.com/windowsazure"));
                                        if (addressPrefixesSequenceElement3 != null)
                                        {
                                            foreach (XElement addressPrefixesElement3 in addressPrefixesSequenceElement3.Elements(XName.Get("AddressPrefix", "http://schemas.microsoft.com/windowsazure")))
                                            {
                                                vPNClientAddressPoolInstance.AddressPrefixes.Add(addressPrefixesElement3.Value);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    result.StatusCode = statusCode;
                    if (httpResponse.Headers.Contains("x-ms-request-id"))
                    {
                        result.RequestId = httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault();
                    }

                    if (shouldTrace)
                    {
                        TracingAdapter.Exit(invocationId, result);
                    }
                    return(result);
                }
                finally
                {
                    if (httpResponse != null)
                    {
                        httpResponse.Dispose();
                    }
                }
            }
            finally
            {
                if (httpRequest != null)
                {
                    httpRequest.Dispose();
                }
            }
        }