public void FailoverGroupCrud()
        {
            var handler = new BasicDelegatingHandler();

            using (UndoContext context = UndoContext.Current)
            {
                context.Start();

                string failoverGroupName  = TestUtilities.GenerateName("csm-sql-fgcrud1");
                string failoverGroup2Name = TestUtilities.GenerateName("csm-sql-fgcrud2");
                string serverName         = TestUtilities.GenerateName("csm-sql-fgcrud-server");
                string partnerServerName  = TestUtilities.GenerateName("csm-sql-fgcrud-server");

                // Create the resource group.

                //resClient.ResourceGroups.CreateOrUpdate(resGroupName, new ResourceGroup()

                //{
                //    Location = serverLocation,
                //});

                Sql2ScenarioHelper.RunServerTestInEnvironment(
                    handler,
                    "12.0",
                    "North Europe",
                    (sqlClient, resGroupName, server) =>
                {
                    // Variables for partner server create

                    string serverLocation = "North Europe";
                    string adminLogin     = "******";
                    string adminPass      = "******";
                    string version        = "12.0";

                    // Create partner server for test.
                    var createServerResponse = sqlClient.Servers.CreateOrUpdate(resGroupName, partnerServerName, new ServerCreateOrUpdateParameters()
                    {
                        Location   = serverLocation,
                        Properties = new ServerCreateOrUpdateProperties()
                        {
                            AdministratorLogin         = adminLogin,
                            AdministratorLoginPassword = adminPass,
                            Version = version,
                        }
                    });


                    // Create Failover Group Test with all values specified (Default values)
                    ReadOnlyEndpoint readOnlyEndpoint   = new ReadOnlyEndpoint();
                    readOnlyEndpoint.FailoverPolicy     = "Disabled";
                    ReadWriteEndpoint readWriteEndpoint = new ReadWriteEndpoint();
                    readWriteEndpoint.FailoverPolicy    = "Automatic";
                    readWriteEndpoint.FailoverWithDataLossGracePeriodMinutes = 5;

                    FailoverGroupPartnerServer partnerServer = new FailoverGroupPartnerServer();
                    partnerServer.ReplicationRole            = "Secondary";
                    partnerServer.Id       = createServerResponse.Server.Id;
                    partnerServer.Location = "North Europe";

                    List <FailoverGroupPartnerServer> partnerServers = new List <FailoverGroupPartnerServer>();
                    partnerServers.Add(partnerServer);

                    var failoverGroup1Properties = new FailoverGroupCreateOrUpdateProperties()
                    {
                        ReadOnlyEndpoint  = readOnlyEndpoint,
                        ReadWriteEndpoint = readWriteEndpoint,
                        PartnerServers    = partnerServers,
                    };

                    var failoverGroup1 = sqlClient.FailoverGroups.CreateOrUpdate(resGroupName, server.Name, failoverGroupName, new FailoverGroupCreateOrUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = failoverGroup1Properties
                    });

                    TestUtilities.ValidateOperationResponse(failoverGroup1, HttpStatusCode.Created);

                    var failoverGroup2 = sqlClient.FailoverGroups.CreateOrUpdate(resGroupName, server.Name, failoverGroup2Name, new FailoverGroupCreateOrUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = failoverGroup1Properties
                    });

                    TestUtilities.ValidateOperationResponse(failoverGroup2, HttpStatusCode.Created);
                    ValidateFailoverGroup(
                        failoverGroup2.FailoverGroup,
                        failoverGroup2Name,
                        readOnlyEndpoint.FailoverPolicy,
                        readWriteEndpoint.FailoverPolicy,
                        readWriteEndpoint.FailoverWithDataLossGracePeriodMinutes,
                        partnerServer.ReplicationRole,
                        partnerServer.Id);

                    //////////////////////////////////////////////////////////////////////
                    // Update Failover Group Test
                    failoverGroup1Properties.ReadOnlyEndpoint.FailoverPolicy  = "Enabled";
                    failoverGroup1Properties.ReadWriteEndpoint.FailoverPolicy = "Manual";
                    failoverGroup1Properties.ReadWriteEndpoint.FailoverWithDataLossGracePeriodMinutes = null;

                    var failoverGroup3 = sqlClient.FailoverGroups.CreateOrUpdate(resGroupName, server.Name, failoverGroupName, new FailoverGroupCreateOrUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = failoverGroup1Properties
                    });


                    TestUtilities.ValidateOperationResponse(failoverGroup3, HttpStatusCode.Created);
                    ValidateFailoverGroup(
                        failoverGroup3.FailoverGroup,
                        failoverGroupName,
                        failoverGroup1Properties.ReadOnlyEndpoint.FailoverPolicy,
                        failoverGroup1Properties.ReadWriteEndpoint.FailoverPolicy,
                        failoverGroup1Properties.ReadWriteEndpoint.FailoverWithDataLossGracePeriodMinutes,
                        failoverGroup1Properties.PartnerServers.First().ReplicationRole,
                        failoverGroup1Properties.PartnerServers.First().Id);

                    //////////////////////////////////////////////////////////////////////
                    // Get Failover group.
                    var failoverGroup4 = sqlClient.FailoverGroups.Get(resGroupName, server.Name, failoverGroupName);


                    TestUtilities.ValidateOperationResponse(failoverGroup4, HttpStatusCode.Created);
                    ValidateFailoverGroup(
                        failoverGroup3.FailoverGroup,
                        failoverGroupName,
                        failoverGroup1Properties.ReadOnlyEndpoint.FailoverPolicy,
                        failoverGroup1Properties.ReadWriteEndpoint.FailoverPolicy,
                        failoverGroup1Properties.ReadWriteEndpoint.FailoverWithDataLossGracePeriodMinutes,
                        failoverGroup1Properties.PartnerServers.First().ReplicationRole,
                        failoverGroup1Properties.PartnerServers.First().Id);

                    //////////////////////////////////////////////////////////////////////
                    // Get Failover Groups Test.
                    var failoverGroups = sqlClient.FailoverGroups.List(resGroupName, server.Name);

                    TestUtilities.ValidateOperationResponse(failoverGroups, HttpStatusCode.OK);
                    Assert.Equal(2, failoverGroups.FailoverGroups.Count);

                    //////////////////////////////////////////////////////////////////////
                    // Delete Failover Group Test.
                    //var resp = sqlClient.FailoverGroups.Delete(resGroupName, server.Name, failoverGroupName);
                    //TestUtilities.ValidateOperationResponse(resp, HttpStatusCode.OK);

                    //var resp2 = sqlClient.FailoverGroups.Delete(resGroupName, server.Name, failoverGroup2Name);
                    //TestUtilities.ValidateOperationResponse(resp2, HttpStatusCode.OK);
                });
            }
        }
        public void FailoverGroupDatabaseOperations()
        {
            var handler = new BasicDelegatingHandler();

            using (UndoContext context = UndoContext.Current)
            {
                context.Start();

                string failoverGroupName = TestUtilities.GenerateName("csm-sql-fgdb");
                string serverName        = TestUtilities.GenerateName("csm-sql-fgdb-server");
                var    databaseName      = TestUtilities.GenerateName("csm-sql-fgdb-db");
                var    database2Name     = TestUtilities.GenerateName("csm-sql-fgdb-db");

                Sql2ScenarioHelper.RunServerTestInEnvironment(
                    handler,
                    "12.0",
                    "North Europe",
                    (sqlClient, resGroupName, server) =>
                {
                    // Variables for partner server create
                    string serverLocation = "North Europe";
                    string adminLogin     = "******";
                    string adminPass      = "******";
                    string version        = "12.0";

                    //////////////////////////////////////////////////////////////////////
                    // Create server for test.
                    var createServerResponse = sqlClient.Servers.CreateOrUpdate(resGroupName, serverName, new ServerCreateOrUpdateParameters()
                    {
                        Location   = serverLocation,
                        Properties = new ServerCreateOrUpdateProperties()
                        {
                            AdministratorLogin         = adminLogin,
                            AdministratorLoginPassword = adminPass,
                            Version = version,
                        }
                    });

                    //////////////////////////////////////////////////////////////////////
                    // Create Failover Group with all values specified (Default values)

                    ReadOnlyEndpoint readOnlyEndpoint   = new ReadOnlyEndpoint();
                    readOnlyEndpoint.FailoverPolicy     = "Disabled";
                    ReadWriteEndpoint readWriteEndpoint = new ReadWriteEndpoint();
                    readWriteEndpoint.FailoverPolicy    = "Automatic";
                    readWriteEndpoint.FailoverWithDataLossGracePeriodMinutes = 5;

                    FailoverGroupPartnerServer partnerServer = new FailoverGroupPartnerServer();
                    partnerServer.ReplicationRole            = "Secondary";
                    partnerServer.Id       = createServerResponse.Server.Id;
                    partnerServer.Location = "North Europe";

                    List <FailoverGroupPartnerServer> partnerServers = new List <FailoverGroupPartnerServer>();
                    partnerServers.Add(partnerServer);


                    var failoverGroup1Properties = new FailoverGroupCreateOrUpdateProperties()
                    {
                        ReadOnlyEndpoint  = readOnlyEndpoint,
                        ReadWriteEndpoint = readWriteEndpoint,
                        PartnerServers    = partnerServers,
                    };

                    var failoverGroup1 = sqlClient.FailoverGroups.CreateOrUpdate(resGroupName, server.Name, failoverGroupName, new FailoverGroupCreateOrUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = failoverGroup1Properties
                    });
                    TestUtilities.ValidateOperationResponse(failoverGroup1, HttpStatusCode.Created);

                    ////////////////////////////////////////////////////////////////////
                    // Create database
                    var db1 = sqlClient.Databases.CreateOrUpdate(resGroupName, server.Name, databaseName, new DatabaseCreateOrUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = new DatabaseCreateOrUpdateProperties()
                        {
                            Edition = "Premium"
                        }
                    });

                    TestUtilities.ValidateOperationResponse(db1, HttpStatusCode.Created);

                    var db2 = sqlClient.Databases.CreateOrUpdate(resGroupName, server.Name, database2Name, new DatabaseCreateOrUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = new DatabaseCreateOrUpdateProperties()
                        {
                            Edition = "Basic"
                        }
                    });

                    TestUtilities.ValidateOperationResponse(db2, HttpStatusCode.Created);

                    //Add database ids into a list
                    List <string> dbs = new List <string>();
                    dbs.Add(db1.Database.Id);
                    dbs.Add(db2.Database.Id);

                    //////////////////////////////////////////////////////////////////////
                    // Move database into failover group

                    var moveResult = sqlClient.FailoverGroups.PatchUpdate(resGroupName, server.Name, failoverGroupName, new FailoverGroupPatchUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = new FailoverGroupPatchUpdateProperties
                        {
                            Databases = dbs,
                        }
                    });

                    TestUtilities.ValidateOperationResponse(moveResult, HttpStatusCode.OK);
                    Assert.True(VerifyDbsEqual(moveResult.FailoverGroup.Properties.Databases, dbs));

                    //////////////////////////////////////////////////////////////////////
                    // Delete databases from failover group

                    dbs.RemoveAt(1);
                    var removeResult = sqlClient.FailoverGroups.PatchUpdate(resGroupName, server.Name, failoverGroupName, new FailoverGroupPatchUpdateParameters()
                    {
                        Location   = server.Location,
                        Properties = new FailoverGroupPatchUpdateProperties
                        {
                            Databases = dbs,
                        }
                    });

                    TestUtilities.ValidateOperationResponse(moveResult, HttpStatusCode.OK);
                    Assert.True(VerifyDbsEqual(removeResult.FailoverGroup.Properties.Databases, dbs));

                    //////////////////////////////////////////////////////////////////////
                    // Failover Test.
                    //var failoverResult = sqlClient.FailoverGroups.Failover(resGroupName, server.Name, failoverGroupName);
                    //TestUtilities.ValidateOperationResponse(failoverResult, HttpStatusCode.OK);

                    //var failoverWithDatalossResult = sqlClient.FailoverGroups.ForceFailoverAllowDataLoss(resGroupName, server.Name, failoverGroupName);
                    //TestUtilities.ValidateOperationResponse(failoverWithDatalossResult, HttpStatusCode.OK);
                });
            }
        }