/// <summary>
        /// </summary>
        /// <param name="fg">The failover group to validate</param>
        /// <param name="failoverGroupName">The expected name of the failover group</param>
        /// <param name="readOnlyFailoverPolicy">The expected readonly failover policy of the failover group</param>
        /// <param name="readWriteFailoverPolicy">The expected readwrite failover policy of the failover group</param>
        /// <param name="gracePeriodWithDataLoss">The expected grace period with data loss in minuts of the failover group</param>
        /// <param name="replicationRole">The expected replication role for the partner server</param>
        /// <param name="id">The expected id for the partner server</param>
        private void ValidateFailoverGroup(FailoverGroup fg, string failoverGroupName, string readOnlyFailoverPolicy, string readWriteFailoverPolicy, int?gracePeriodWithDataLoss, string replicationRole, string id)
        {
            Assert.Equal(fg.Name, failoverGroupName);

            Assert.Equal(readOnlyFailoverPolicy, fg.Properties.ReadOnlyEndpoint.FailoverPolicy);
            Assert.Equal(readWriteFailoverPolicy, fg.Properties.ReadWriteEndpoint.FailoverPolicy);
            Assert.Equal(gracePeriodWithDataLoss, fg.Properties.ReadWriteEndpoint.FailoverWithDataLossGracePeriodMinutes);
            //Assert.Equal(replicationRole, fg.Properties.PartnerServers.First().ReplicationRole);
            Assert.Equal(id, fg.Properties.PartnerServers.First().Id);
        }
        public static void ValidateFailoverGroup(FailoverGroup expected, FailoverGroup actual, string name)
        {
            Assert.NotNull(actual);
            Assert.NotNull(actual.Id);
            Assert.NotNull(actual.Type);
            Assert.NotNull(actual.Location);

            Assert.Equal(name, actual.Name);
            Assert.Equal(expected.ReadOnlyEndpoint.FailoverPolicy, actual.ReadOnlyEndpoint.FailoverPolicy);
            Assert.Equal(expected.ReadWriteEndpoint.FailoverPolicy, actual.ReadWriteEndpoint.FailoverPolicy);
            Assert.Equal(expected.ReadWriteEndpoint.FailoverWithDataLossGracePeriodMinutes, actual.ReadWriteEndpoint.FailoverWithDataLossGracePeriodMinutes);

            AssertCollection(expected.Databases, actual.Databases);
            AssertCollection(expected.PartnerServers.Select(s => s.Id), actual.PartnerServers.Select(s => s.Id));
            AssertCollection(expected.Tags, actual.Tags);
        }
 /// <summary>
 /// Creates or updates a failover group.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group that contains the resource. You can obtain
 /// this value from the Azure Resource Manager API or the portal.
 /// </param>
 /// <param name='serverName'>
 /// The name of the server containing the failover group.
 /// </param>
 /// <param name='failoverGroupName'>
 /// The name of the failover group.
 /// </param>
 /// <param name='parameters'>
 /// The failover group parameters.
 /// </param>
 public static FailoverGroup CreateOrUpdate(this IFailoverGroupsOperations operations, string resourceGroupName, string serverName, string failoverGroupName, FailoverGroup parameters)
 {
     return(operations.CreateOrUpdateAsync(resourceGroupName, serverName, failoverGroupName, parameters).GetAwaiter().GetResult());
 }
 /// <summary>
 /// Creates or updates a failover group.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group that contains the resource. You can obtain
 /// this value from the Azure Resource Manager API or the portal.
 /// </param>
 /// <param name='serverName'>
 /// The name of the server containing the failover group.
 /// </param>
 /// <param name='failoverGroupName'>
 /// The name of the failover group.
 /// </param>
 /// <param name='parameters'>
 /// The failover group parameters.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <FailoverGroup> BeginCreateOrUpdateAsync(this IFailoverGroupsOperations operations, string resourceGroupName, string serverName, string failoverGroupName, FailoverGroup parameters, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.BeginCreateOrUpdateWithHttpMessagesAsync(resourceGroupName, serverName, failoverGroupName, parameters, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
예제 #5
0
        public void TestCrudFailoverGroup()
        {
            using (SqlManagementTestContext context = new SqlManagementTestContext(this))
            {
                ResourceGroup       resourceGroup = context.CreateResourceGroup();
                SqlManagementClient sqlClient     = context.GetClient <SqlManagementClient>();

                // Create primary and partner servers
                //
                var sourceServer = context.CreateServer(resourceGroup);
                var targetServer = context.CreateServer(resourceGroup, location: TestEnvironmentUtilities.DefaultSecondaryLocationId);

                // Create a failover group
                //
                string failoverGroupName = SqlManagementTestUtilities.GenerateName();
                var    fgInput           = new FailoverGroup()
                {
                    ReadOnlyEndpoint = new FailoverGroupReadOnlyEndpoint()
                    {
                        FailoverPolicy = ReadOnlyEndpointFailoverPolicy.Disabled,
                    },
                    ReadWriteEndpoint = new FailoverGroupReadWriteEndpoint()
                    {
                        FailoverPolicy = ReadWriteEndpointFailoverPolicy.Manual,
                    },
                    PartnerServers = new List <PartnerInfo>()
                    {
                        new PartnerInfo()
                        {
                            Id = targetServer.Id
                        },
                    },
                    Databases = new List <string>(),
                };
                var failoverGroup = sqlClient.FailoverGroups.CreateOrUpdate(resourceGroup.Name, sourceServer.Name, failoverGroupName, fgInput);
                SqlManagementTestUtilities.ValidateFailoverGroup(fgInput, failoverGroup, failoverGroupName);

                var failoverGroupOnPartner = sqlClient.FailoverGroups.Get(resourceGroup.Name, targetServer.Name, failoverGroupName);
                Assert.NotNull(failoverGroupOnPartner);

                // Update a few settings
                //
                var fgPatchInput = new FailoverGroupUpdate
                {
                    ReadOnlyEndpoint = new FailoverGroupReadOnlyEndpoint
                    {
                        FailoverPolicy = ReadOnlyEndpointFailoverPolicy.Enabled
                    },
                    ReadWriteEndpoint = new FailoverGroupReadWriteEndpoint
                    {
                        FailoverPolicy = ReadWriteEndpointFailoverPolicy.Automatic,
                        FailoverWithDataLossGracePeriodMinutes = 120
                    },
                    Tags = new Dictionary <string, string> {
                        { "tag1", "value1" }
                    }
                };

                var failoverGroupUpdated2 = sqlClient.FailoverGroups.Update(resourceGroup.Name, sourceServer.Name, failoverGroupName, fgPatchInput);

                // Set expectations and verify update
                //
                fgInput.ReadWriteEndpoint = fgPatchInput.ReadWriteEndpoint;
                fgInput.ReadOnlyEndpoint  = fgPatchInput.ReadOnlyEndpoint;
                fgInput.Tags = fgPatchInput.Tags;
                SqlManagementTestUtilities.ValidateFailoverGroup(fgInput, failoverGroupUpdated2, failoverGroupName);

                // Create a database in the primary server
                //
                string databaseName = "testdb";
                var    dbInput      = new Database()
                {
                    Location = sourceServer.Location
                };
                Database database = sqlClient.Databases.CreateOrUpdate(resourceGroup.Name, sourceServer.Name, databaseName, dbInput);
                Assert.NotNull(database);

                // Update failover group to add database and change read-write endpoint's failover policy.
                //
                var fgUpdateInput = new FailoverGroup()
                {
                    ReadOnlyEndpoint = new FailoverGroupReadOnlyEndpoint()
                    {
                        FailoverPolicy = ReadOnlyEndpointFailoverPolicy.Disabled,
                    },
                    ReadWriteEndpoint = new FailoverGroupReadWriteEndpoint()
                    {
                        FailoverPolicy = ReadWriteEndpointFailoverPolicy.Manual,
                    },
                    PartnerServers = new List <PartnerInfo>()
                    {
                        new PartnerInfo()
                        {
                            Id = targetServer.Id
                        },
                    },
                    Databases = new List <string>()
                    {
                        database.Id,
                    },
                };
                failoverGroup = sqlClient.FailoverGroups.CreateOrUpdate(resourceGroup.Name, sourceServer.Name, failoverGroupName, fgUpdateInput);
                SqlManagementTestUtilities.ValidateFailoverGroup(fgUpdateInput, failoverGroup, failoverGroupName);

                // List failover groups on the secondary server and verify
                //
                var failoverGroupsOnSecondary = sqlClient.FailoverGroups.ListByServer(resourceGroup.Name, targetServer.Name);
                Assert.NotNull(failoverGroupsOnSecondary);
                Assert.Equal(1, failoverGroupsOnSecondary.Count());

                var primaryDatabase = sqlClient.Databases.Get(resourceGroup.Name, sourceServer.Name, databaseName);

                // A brief wait may be needed until the secondary database is fully created
                Database secondaryDatabase = new Database();

                SqlManagementTestUtilities.ExecuteWithRetry(() =>
                {
                    secondaryDatabase = sqlClient.Databases.Get(resourceGroup.Name, targetServer.Name, databaseName);
                },
                                                            TimeSpan.FromMinutes(2), TimeSpan.FromSeconds(5),
                                                            (CloudException e) =>
                {
                    return(e.Response.StatusCode == HttpStatusCode.NotFound);
                });

                Assert.NotNull(primaryDatabase.FailoverGroupId);
                Assert.NotNull(secondaryDatabase.FailoverGroupId);

                // Failover failover group
                //
                failoverGroup = sqlClient.FailoverGroups.Failover(resourceGroup.Name, targetServer.Name, failoverGroupName);

                // Get failover group on the new secondary server and verify its replication role
                //
                var failoverGroupOnSecondary = sqlClient.FailoverGroups.Get(resourceGroup.Name, sourceServer.Name, failoverGroupName);
                Assert.Equal(FailoverGroupReplicationRole.Secondary, failoverGroupOnSecondary.ReplicationRole);
                Assert.Equal(FailoverGroupReplicationRole.Primary, failoverGroupOnSecondary.PartnerServers.First().ReplicationRole);

                // Delete failover group and verify that databases are removed from the failover group
                //
                sqlClient.FailoverGroups.Delete(resourceGroup.Name, targetServer.Name, failoverGroupName);
                primaryDatabase   = sqlClient.Databases.Get(resourceGroup.Name, targetServer.Name, databaseName);
                secondaryDatabase = sqlClient.Databases.Get(resourceGroup.Name, sourceServer.Name, databaseName);
                Assert.Null(primaryDatabase.FailoverGroupId);
                Assert.Null(secondaryDatabase.FailoverGroupId);
                Assert.Throws <Microsoft.Rest.Azure.CloudException>(() => sqlClient.FailoverGroups.Get(resourceGroup.Name, sourceServer.Name, failoverGroupName));
                Assert.Throws <Microsoft.Rest.Azure.CloudException>(() => sqlClient.FailoverGroups.Get(resourceGroup.Name, targetServer.Name, failoverGroupName));
            }
        }
예제 #6
0
        /// <summary>
        /// Gets the status of an Azure Sql Database Failover Group Force
        /// Failover operation.
        /// </summary>
        /// <param name='operationStatusLink'>
        /// Required. Location value returned by the Begin operation
        /// </param>
        /// <param name='cancellationToken'>
        /// Cancellation token.
        /// </param>
        /// <returns>
        /// Response for long running Azure Sql Database Failover Group
        /// operation.
        /// </returns>
        public async Task <FailoverGroupForceFailoverResponse> GetFailoverGroupForceFailoverAllowDataLossOperationStatusAsync(string operationStatusLink, CancellationToken cancellationToken)
        {
            // Validate
            if (operationStatusLink == null)
            {
                throw new ArgumentNullException("operationStatusLink");
            }

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

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

            // Construct URL
            string url = "";

            url = url + operationStatusLink;
            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

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

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

                    if (shouldTrace)
                    {
                        TracingAdapter.ReceiveResponse(invocationId, httpResponse);
                    }
                    HttpStatusCode statusCode = httpResponse.StatusCode;
                    if (statusCode != HttpStatusCode.OK && statusCode != HttpStatusCode.Accepted && statusCode != HttpStatusCode.NoContent)
                    {
                        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
                    FailoverGroupForceFailoverResponse result = null;
                    // Deserialize Response
                    if (statusCode == HttpStatusCode.OK || statusCode == HttpStatusCode.Accepted || statusCode == HttpStatusCode.NoContent)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                        result = new FailoverGroupForceFailoverResponse();
                        JToken responseDoc = null;
                        if (string.IsNullOrEmpty(responseContent) == false)
                        {
                            responseDoc = JToken.Parse(responseContent);
                        }

                        if (responseDoc != null && responseDoc.Type != JTokenType.Null)
                        {
                            ErrorResponse errorInstance = new ErrorResponse();
                            result.Error = errorInstance;

                            JToken codeValue = responseDoc["code"];
                            if (codeValue != null && codeValue.Type != JTokenType.Null)
                            {
                                string codeInstance = ((string)codeValue);
                                errorInstance.Code = codeInstance;
                            }

                            JToken messageValue = responseDoc["message"];
                            if (messageValue != null && messageValue.Type != JTokenType.Null)
                            {
                                string messageInstance = ((string)messageValue);
                                errorInstance.Message = messageInstance;
                            }

                            JToken targetValue = responseDoc["target"];
                            if (targetValue != null && targetValue.Type != JTokenType.Null)
                            {
                                string targetInstance = ((string)targetValue);
                                errorInstance.Target = targetInstance;
                            }

                            FailoverGroup failoverGroupInstance = new FailoverGroup();
                            result.FailoverGroup = failoverGroupInstance;

                            JToken propertiesValue = responseDoc["properties"];
                            if (propertiesValue != null && propertiesValue.Type != JTokenType.Null)
                            {
                                FailoverGroupProperties propertiesInstance = new FailoverGroupProperties();
                                failoverGroupInstance.Properties = propertiesInstance;

                                JToken readOnlyEndpointValue = propertiesValue["readOnlyEndpoint"];
                                if (readOnlyEndpointValue != null && readOnlyEndpointValue.Type != JTokenType.Null)
                                {
                                    ReadOnlyEndpoint readOnlyEndpointInstance = new ReadOnlyEndpoint();
                                    propertiesInstance.ReadOnlyEndpoint = readOnlyEndpointInstance;

                                    JToken failoverPolicyValue = readOnlyEndpointValue["failoverPolicy"];
                                    if (failoverPolicyValue != null && failoverPolicyValue.Type != JTokenType.Null)
                                    {
                                        string failoverPolicyInstance = ((string)failoverPolicyValue);
                                        readOnlyEndpointInstance.FailoverPolicy = failoverPolicyInstance;
                                    }
                                }

                                JToken readWriteEndpointValue = propertiesValue["readWriteEndpoint"];
                                if (readWriteEndpointValue != null && readWriteEndpointValue.Type != JTokenType.Null)
                                {
                                    ReadWriteEndpoint readWriteEndpointInstance = new ReadWriteEndpoint();
                                    propertiesInstance.ReadWriteEndpoint = readWriteEndpointInstance;

                                    JToken failoverPolicyValue2 = readWriteEndpointValue["failoverPolicy"];
                                    if (failoverPolicyValue2 != null && failoverPolicyValue2.Type != JTokenType.Null)
                                    {
                                        string failoverPolicyInstance2 = ((string)failoverPolicyValue2);
                                        readWriteEndpointInstance.FailoverPolicy = failoverPolicyInstance2;
                                    }

                                    JToken failoverWithDataLossGracePeriodMinutesValue = readWriteEndpointValue["failoverWithDataLossGracePeriodMinutes"];
                                    if (failoverWithDataLossGracePeriodMinutesValue != null && failoverWithDataLossGracePeriodMinutesValue.Type != JTokenType.Null)
                                    {
                                        int failoverWithDataLossGracePeriodMinutesInstance = ((int)failoverWithDataLossGracePeriodMinutesValue);
                                        readWriteEndpointInstance.FailoverWithDataLossGracePeriodMinutes = failoverWithDataLossGracePeriodMinutesInstance;
                                    }
                                }

                                JToken replicationRoleValue = propertiesValue["replicationRole"];
                                if (replicationRoleValue != null && replicationRoleValue.Type != JTokenType.Null)
                                {
                                    string replicationRoleInstance = ((string)replicationRoleValue);
                                    propertiesInstance.ReplicationRole = replicationRoleInstance;
                                }

                                JToken replicationStateValue = propertiesValue["replicationState"];
                                if (replicationStateValue != null && replicationStateValue.Type != JTokenType.Null)
                                {
                                    string replicationStateInstance = ((string)replicationStateValue);
                                    propertiesInstance.ReplicationState = replicationStateInstance;
                                }

                                JToken partnerServersArray = propertiesValue["partnerServers"];
                                if (partnerServersArray != null && partnerServersArray.Type != JTokenType.Null)
                                {
                                    foreach (JToken partnerServersValue in ((JArray)partnerServersArray))
                                    {
                                        FailoverGroupPartnerServer failoverGroupPartnerServerInstance = new FailoverGroupPartnerServer();
                                        propertiesInstance.PartnerServers.Add(failoverGroupPartnerServerInstance);

                                        JToken idValue = partnerServersValue["id"];
                                        if (idValue != null && idValue.Type != JTokenType.Null)
                                        {
                                            string idInstance = ((string)idValue);
                                            failoverGroupPartnerServerInstance.Id = idInstance;
                                        }

                                        JToken locationValue = partnerServersValue["location"];
                                        if (locationValue != null && locationValue.Type != JTokenType.Null)
                                        {
                                            string locationInstance = ((string)locationValue);
                                            failoverGroupPartnerServerInstance.Location = locationInstance;
                                        }

                                        JToken replicationRoleValue2 = partnerServersValue["replicationRole"];
                                        if (replicationRoleValue2 != null && replicationRoleValue2.Type != JTokenType.Null)
                                        {
                                            string replicationRoleInstance2 = ((string)replicationRoleValue2);
                                            failoverGroupPartnerServerInstance.ReplicationRole = replicationRoleInstance2;
                                        }
                                    }
                                }

                                JToken databasesArray = propertiesValue["databases"];
                                if (databasesArray != null && databasesArray.Type != JTokenType.Null)
                                {
                                    foreach (JToken databasesValue in ((JArray)databasesArray))
                                    {
                                        propertiesInstance.Databases.Add(((string)databasesValue));
                                    }
                                }
                            }

                            JToken idValue2 = responseDoc["id"];
                            if (idValue2 != null && idValue2.Type != JTokenType.Null)
                            {
                                string idInstance2 = ((string)idValue2);
                                failoverGroupInstance.Id = idInstance2;
                            }

                            JToken nameValue = responseDoc["name"];
                            if (nameValue != null && nameValue.Type != JTokenType.Null)
                            {
                                string nameInstance = ((string)nameValue);
                                failoverGroupInstance.Name = nameInstance;
                            }

                            JToken typeValue = responseDoc["type"];
                            if (typeValue != null && typeValue.Type != JTokenType.Null)
                            {
                                string typeInstance = ((string)typeValue);
                                failoverGroupInstance.Type = typeInstance;
                            }

                            JToken locationValue2 = responseDoc["location"];
                            if (locationValue2 != null && locationValue2.Type != JTokenType.Null)
                            {
                                string locationInstance2 = ((string)locationValue2);
                                failoverGroupInstance.Location = locationInstance2;
                            }

                            JToken tagsSequenceElement = ((JToken)responseDoc["tags"]);
                            if (tagsSequenceElement != null && tagsSequenceElement.Type != JTokenType.Null)
                            {
                                foreach (JProperty property in tagsSequenceElement)
                                {
                                    string tagsKey   = ((string)property.Name);
                                    string tagsValue = ((string)property.Value);
                                    failoverGroupInstance.Tags.Add(tagsKey, tagsValue);
                                }
                            }
                        }
                    }
                    result.StatusCode = statusCode;
                    if (httpResponse.Headers.Contains("x-ms-request-id"))
                    {
                        result.RequestId = httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault();
                    }
                    if (statusCode == HttpStatusCode.NoContent)
                    {
                        result.Status = OperationStatus.Succeeded;
                    }
                    if (statusCode == HttpStatusCode.OK)
                    {
                        result.Status = OperationStatus.Succeeded;
                    }
                    if (statusCode == HttpStatusCode.Accepted)
                    {
                        result.Status = OperationStatus.Succeeded;
                    }

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