public void TestListSqlVirtualMachineGroup()
        {
            using (SqlVirtualMachineTestContext context = new SqlVirtualMachineTestContext(this))
            {
                // Create SQL VM group
                ISqlVirtualMachineGroupsOperations sqlOperations = context.getSqlClient().SqlVirtualMachineGroups;
                StorageAccount         storageAccount            = VirtualMachineTestBase.CreateStorageAccount(context);
                SqlVirtualMachineGroup group = SqlVirtualMachineTestBase.CreateSqlVirtualMachineGroup(context, storageAccount, "test-group");

                // List
                IPage <SqlVirtualMachineGroup>       list = sqlOperations.List();
                IEnumerator <SqlVirtualMachineGroup> iter = list.GetEnumerator();
                int count = 0;
                while (iter.MoveNext())
                {
                    SqlVirtualMachineGroup group2 = iter.Current;
                    if (group.Id.Equals(group2.Id))
                    {
                        SqlVirtualMachineTestBase.ValidateSqlVirtualMachineGroups(group, group2);
                        count++;
                    }
                }
                iter.Dispose();
                Assert.Equal(1, count);
            }
        }
        public void TestCreateUpdateGetSqlVirtualMachineGroup()
        {
            using (SqlVirtualMachineTestContext context = new SqlVirtualMachineTestContext(this))
            {
                // Create SQL VM group
                ISqlVirtualMachineGroupsOperations sqlOperations = context.getSqlClient().SqlVirtualMachineGroups;
                StorageAccount         storageAccount            = VirtualMachineTestBase.CreateStorageAccount(context);
                SqlVirtualMachineGroup group = SqlVirtualMachineTestBase.CreateSqlVirtualMachineGroup(context, storageAccount, "test-group");

                // Update
                string key = "test", value = "updateTag";
                sqlOperations.Update(context.resourceGroup.Name, group.Name, new SqlVirtualMachineGroupUpdate()
                {
                    Tags = new Dictionary <string, string>
                    {
                        { key, value }
                    }
                });

                // Get
                SqlVirtualMachineGroup group2 = sqlOperations.Get(context.resourceGroup.Name, group.Name);
                SqlVirtualMachineTestBase.ValidateSqlVirtualMachineGroups(group, group2, false);
                Assert.Equal(1, group2.Tags.Keys.Count);
                Assert.Equal(value, group2.Tags[key]);
            }
        }
コード例 #3
0
        public static SqlVirtualMachineGroup CreateSqlVirtualMachineGroup(SqlVirtualMachineTestContext context, StorageAccount storageAccount, string groupName = null, WsfcDomainProfile profile = null)
        {
            ISqlVirtualMachineGroupsOperations sqlOperations      = context.getSqlClient().SqlVirtualMachineGroups;
            StorageAccountListKeysResult       storageAccountKeys = context.client.storageClient.StorageAccounts.ListKeys(context.resourceGroup.Name, storageAccount.Name);
            IEnumerator <StorageAccountKey>    iter = storageAccountKeys.Keys.GetEnumerator();

            iter.MoveNext();
            string key         = iter.Current.Value;
            string blobAccount = storageAccount.PrimaryEndpoints.Blob;

            if (groupName == null)
            {
                groupName = context.generateResourceName();
            }
            SqlVirtualMachineGroup group = sqlOperations.CreateOrUpdate(context.resourceGroup.Name, groupName, new SqlVirtualMachineGroup
            {
                Location          = context.location,
                SqlImageOffer     = Constants.imageOffer,
                SqlImageSku       = Constants.imageSku,
                WsfcDomainProfile = (profile != null)? profile : new WsfcDomainProfile
                {
                    SqlServiceAccount        = getUsername(Constants.sqlService, Constants.domainName),
                    ClusterOperatorAccount   = getUsername(Constants.adminLogin, Constants.domainName),
                    DomainFqdn               = Constants.domainName + ".com",
                    StorageAccountUrl        = blobAccount,
                    StorageAccountPrimaryKey = key
                }
            });

            group.Validate();
            return(group);
        }
コード例 #4
0
 public static void ValidateSqlVirtualMachineGroups(SqlVirtualMachineGroup group1, SqlVirtualMachineGroup group2, bool sameTags = true)
 {
     Assert.Equal(group1.Id, group2.Id);
     Assert.Equal(group1.Name, group2.Name);
     Assert.Equal(group1.SqlImageOffer, group2.SqlImageOffer);
     if (sameTags)
     {
         Assert.True(ValidateTags(group1, group2));
     }
 }
コード例 #5
0
        /// <summary>
        /// Convert a Management.SqlVirtualMachine.Models.SqlVirtualMachineModel to AzureSqlVirtualMachineModel
        /// </summary>
        /// <param name="resourceGroupName">The resource group the sql virtual machine is in</param>
        /// <param name="resp">The management client sql virtual machine response to convert</param>
        /// <returns>The converted sql virtual machine model</returns>
        private AzureSqlVMModel CreateSqlVirtualMachineModelFromResponse(SqlVirtualMachineModel resp)
        {
            // Extract the resource group name from the ID.
            // ID is in the form:
            // /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rgName/providers/Microsoft.SqlVirtualMachine/SqlVirtualMachine/sqlVirtualMachineName
            string[] segments = resp.Id.Split('/');

            AzureSqlVMModel model = new AzureSqlVMModel(segments[4])
            {
                Name              = resp.Name,
                Location          = resp.Location,
                Sku               = resp.SqlImageSku,
                Offer             = resp.SqlImageOffer,
                VirtualMachineId  = resp.VirtualMachineResourceId,
                SqlManagementType = resp.SqlManagement,
                LicenseType       = resp.SqlServerLicenseType,
                Tags              = TagsConversionHelper.CreateTagDictionary(TagsConversionHelper.CreateTagHashtable(resp.Tags), false),
                ResourceId        = resp.Id
            };

            // Retrieve group
            if (!string.IsNullOrEmpty(resp.SqlVirtualMachineGroupResourceId))
            {
                var      client  = AzureSession.Instance.ClientFactory.CreateArmClient <SqlVirtualMachineManagementClient>(DefaultContext, AzureEnvironment.Endpoint.ResourceManager);
                string[] groupId = resp.SqlVirtualMachineGroupResourceId.Split('/');

                SqlVirtualMachineGroup group = client.SqlVirtualMachineGroups.Get(groupId[4], groupId[8]);
                model.SqlVirtualMachineGroup = new AzureSqlVMGroupModel(groupId[4])
                {
                    Name              = group.Name,
                    Location          = group.Location,
                    Sku               = group.SqlImageSku,
                    Offer             = group.SqlImageOffer,
                    ResourceId        = group.Id,
                    Tag               = TagsConversionHelper.CreateTagDictionary(TagsConversionHelper.CreateTagHashtable(group.Tags), false),
                    WsfcDomainProfile = group.WsfcDomainProfile
                };
            }

            return(model);
        }
        public void TestCreateGetDeleteSqlVirtualMachineGroup()
        {
            using (SqlVirtualMachineTestContext context = new SqlVirtualMachineTestContext(this))
            {
                // Create SQL VM group
                ISqlVirtualMachineGroupsOperations sqlOperations = context.getSqlClient().SqlVirtualMachineGroups;
                StorageAccount         storageAccount            = VirtualMachineTestBase.CreateStorageAccount(context);
                SqlVirtualMachineGroup group = SqlVirtualMachineTestBase.CreateSqlVirtualMachineGroup(context, storageAccount, "test-group");

                // Recover
                SqlVirtualMachineGroup group2 = sqlOperations.Get(context.resourceGroup.Name, group.Name);
                SqlVirtualMachineTestBase.ValidateSqlVirtualMachineGroups(group, group2);

                // Delete
                sqlOperations.Delete(context.resourceGroup.Name, group.Name);

                // Recover
                IPage <SqlVirtualMachineGroup>       list = sqlOperations.ListByResourceGroup(context.resourceGroup.Name);
                IEnumerator <SqlVirtualMachineGroup> iter = list.GetEnumerator();
                Assert.False(iter.MoveNext());
            }
        }
コード例 #7
0
        /// <summary>
        /// Convert a Management.SqlVirtualMachine.Models.SqlVirtualMachineGroupModel to AzureSqlVirtualMachineGroupModel
        /// </summary>
        /// <param name="resourceGroupName">The resource group the sql virtual machine group is in</param>
        /// <param name="resp">The management client sql virtual machine group response to convert</param>
        /// <returns>The converted sql virtual machine group model</returns>
        private static AzureSqlVMGroupModel CreateSqlVirtualMachineGroupModelFromResponse(SqlVirtualMachineGroup resp)
        {
            // Extract the resource group name from the ID.
            string[] segments = resp.Id.Split('/');

            AzureSqlVMGroupModel model = new AzureSqlVMGroupModel(segments[4])
            {
                Name              = resp.Name,
                Location          = resp.Location,
                Sku               = resp.SqlImageSku,
                Offer             = resp.SqlImageOffer,
                WsfcDomainProfile = resp.WsfcDomainProfile,
                Tags              = TagsConversionHelper.CreateTagDictionary(TagsConversionHelper.CreateTagHashtable(resp.Tags), true),
                ResourceId        = resp.Id
            };

            return(model);
        }
コード例 #8
0
 /// <summary>
 /// Creates or updates a Sql Virtual Machine group
 /// </summary>
 public SqlVirtualMachineGroup CreateOrUpdate(string resourceGroupName, string groupName, SqlVirtualMachineGroup parameters)
 {
     return(GetCurrentSqlClient().SqlVirtualMachineGroups.CreateOrUpdate(resourceGroupName, groupName, parameters));
 }
 /// <summary>
 /// Creates or updates a SQL virtual machine group.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// 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='sqlVirtualMachineGroupName'>
 /// Name of the SQL virtual machine group.
 /// </param>
 /// <param name='parameters'>
 /// The SQL virtual machine group.
 /// </param>
 public static SqlVirtualMachineGroup CreateOrUpdate(this ISqlVirtualMachineGroupsOperations operations, string resourceGroupName, string sqlVirtualMachineGroupName, SqlVirtualMachineGroup parameters)
 {
     return(operations.CreateOrUpdateAsync(resourceGroupName, sqlVirtualMachineGroupName, parameters).GetAwaiter().GetResult());
 }
 /// <summary>
 /// Creates or updates a SQL virtual machine group.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// 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='sqlVirtualMachineGroupName'>
 /// Name of the SQL virtual machine group.
 /// </param>
 /// <param name='parameters'>
 /// The SQL virtual machine group.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <SqlVirtualMachineGroup> BeginCreateOrUpdateAsync(this ISqlVirtualMachineGroupsOperations operations, string resourceGroupName, string sqlVirtualMachineGroupName, SqlVirtualMachineGroup parameters, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.BeginCreateOrUpdateWithHttpMessagesAsync(resourceGroupName, sqlVirtualMachineGroupName, parameters, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
コード例 #11
0
        public static SqlVirtualMachineModel CreateSqlVirtualMachine(SqlVirtualMachineTestContext context, SqlVirtualMachineGroup group = null, VirtualMachine virtualMachine = null)
        {
            ISqlVirtualMachinesOperations sqlOperations = context.getSqlClient().SqlVirtualMachines;
            VirtualMachine vm = virtualMachine == null?VirtualMachineTestBase.CreateVM(context) : virtualMachine;

            SqlVirtualMachineModel sqlVM = sqlOperations.CreateOrUpdate(context.resourceGroup.Name, vm.Name, new SqlVirtualMachineModel()
            {
                Location = context.location,
                VirtualMachineResourceId = vm.Id,
                SqlServerLicenseType     = SqlServerLicenseType.PAYG,
                SqlManagement            = SqlManagementMode.Full,
                SqlImageSku   = Constants.imageSku,
                SqlImageOffer = Constants.imageOffer,
                SqlVirtualMachineGroupResourceId       = (group != null) ? group.Id : null,
                ServerConfigurationsManagementSettings = new ServerConfigurationsManagementSettings()
                {
                    SqlConnectivityUpdateSettings = new SqlConnectivityUpdateSettings()
                    {
                        SqlAuthUpdateUserName = Constants.sqlLogin,
                        SqlAuthUpdatePassword = Constants.adminPassword,
                        ConnectivityType      = "Private",
                        Port = 1433
                    },
                    SqlStorageUpdateSettings = new SqlStorageUpdateSettings()
                    {
                        DiskCount             = 1,
                        DiskConfigurationType = "NEW",
                        StartingDeviceId      = 2
                    },
                    SqlWorkloadTypeUpdateSettings = new SqlWorkloadTypeUpdateSettings()
                    {
                        SqlWorkloadType = "OLTP"
                    }
                },
                AutoPatchingSettings = new AutoPatchingSettings(false)
            });

            sqlVM.Validate();
            return(sqlVM);
        }
コード例 #12
0
 public static bool ValidateTags(SqlVirtualMachineGroup group1, SqlVirtualMachineGroup group2)
 {
     return(ValidateTags(group1.Tags, group2.Tags));
 }
コード例 #13
0
        private static SqlVirtualMachineModel prepareMachine(SqlVirtualMachineTestContext context, SqlVirtualMachineGroup group, VirtualMachine vm, string domain, string login, string password)
        {
            // Create the sql virtual machine
            SqlVirtualMachineModel sqlVM = CreateSqlVirtualMachine(context, virtualMachine: vm);

            // Join domain
            IVirtualMachineExtensionsOperations operations = context.client.computeClient.VirtualMachineExtensions;
            VirtualMachineExtension             joinDomain = operations.CreateOrUpdate(context.resourceGroup.Name, vm.Name, "joindomain", new VirtualMachineExtension()
            {
                Location  = context.location,
                Publisher = "Microsoft.Compute",
                VirtualMachineExtensionType = "JsonADDomainExtension",
                TypeHandlerVersion          = "1.3",
                AutoUpgradeMinorVersion     = true,
                Settings = new JoinDomainSettings()
                {
                    Name    = domain + ".com",
                    OUPath  = "",
                    User    = domain + "\\" + login,
                    Restart = "true",
                    Options = "3"
                },
                ProtectedSettings = new JoinDomainProtectedSettings()
                {
                    Password = password
                }
            });

            // Join sql virtual machine group
            context.getSqlClient().SqlVirtualMachines.CreateOrUpdate(context.resourceGroup.Name, sqlVM.Name, new SqlVirtualMachineModel()
            {
                Location = context.location,
                SqlVirtualMachineGroupResourceId = group.Id,
                VirtualMachineResourceId         = sqlVM.VirtualMachineResourceId,
                WsfcDomainCredentials            = new WsfcDomainCredentials()
                {
                    ClusterBootstrapAccountPassword = password,
                    ClusterOperatorAccountPassword  = password,
                    SqlServiceAccountPassword       = password
                }
            });

            return(sqlVM);
        }
コード例 #14
0
        public static AvailabilityGroupListener CreateAGListener(SqlVirtualMachineTestContext context, string agListenerName, string groupName)
        {
            MockClient client = context.client;

            string domainName    = Constants.domainName;
            string adminLogin    = Constants.adminLogin;
            string adminPassword = Constants.adminPassword;

            // Create domain
            NetworkSecurityGroup    nsg    = CreateNsg(context);
            VirtualNetwork          vnet   = CreateVirtualNetwork(context, networkSecurityGroup: nsg);
            NetworkInterface        nic    = CreateNetworkInterface(context, virtualNetwork: vnet, networkSecurityGroup: nsg);
            VirtualMachine          vm     = CreateVM(context, nic: nic);
            VirtualMachineExtension domain = CreateDomain(context, vm, domainName, adminLogin, adminPassword);

            Assert.NotNull(domain);

            // Update DNS
            Subnet subnet = vnet.Subnets[0];

            UpdateVnetDNS(context, vnet, nsg, nic, subnet);

            // Create SqlVirtualMachineGroup
            StorageAccount storageAccount = CreateStorageAccount(context);
            StorageAccountListKeysResult    storageAccountKeys = client.storageClient.StorageAccounts.ListKeys(context.resourceGroup.Name, storageAccount.Name);
            IEnumerator <StorageAccountKey> iter = storageAccountKeys.Keys.GetEnumerator();

            iter.MoveNext();
            string            key     = iter.Current.Value;
            WsfcDomainProfile profile = new WsfcDomainProfile()
            {
                ClusterBootstrapAccount  = getUsername(adminLogin, domainName),
                ClusterOperatorAccount   = getUsername(adminLogin, domainName),
                SqlServiceAccount        = getUsername(Constants.sqlService, domainName),
                StorageAccountUrl        = "https://" + storageAccount.Name + ".blob.core.windows.net/",
                StorageAccountPrimaryKey = key,
                DomainFqdn = domainName + ".com",
                OuPath     = ""
            };
            SqlVirtualMachineGroup group = CreateSqlVirtualMachineGroup(context, storageAccount, groupName: groupName, profile: profile);

            // Create availability set
            AvailabilitySet availabilitySet = client.computeClient.AvailabilitySets.CreateOrUpdate(context.resourceGroup.Name, context.generateResourceName(), new AvailabilitySet()
            {
                Location = context.location,
                PlatformFaultDomainCount  = 3,
                PlatformUpdateDomainCount = 2,
                Sku = new Microsoft.Azure.Management.Compute.Models.Sku
                {
                    Name = "Aligned"
                }
            });

            // Create two sql virtual machines
            NetworkInterface nic1 = CreateNetworkInterface(context, virtualNetwork: vnet);
            NetworkInterface nic2 = CreateNetworkInterface(context, virtualNetwork: vnet);

            VirtualMachine vm1 = CreateVM(context, nic: nic1, availabilitySet: availabilitySet);
            VirtualMachine vm2 = CreateVM(context, nic: nic2, availabilitySet: availabilitySet);

            SqlVirtualMachineModel sqlVM1 = prepareMachine(context, group, vm1, domainName, adminLogin, adminPassword);
            SqlVirtualMachineModel sqlVM2 = prepareMachine(context, group, vm2, domainName, adminLogin, adminPassword);

            // Create load balancer
            LoadBalancer loadBalancer = client.networkClient.LoadBalancers.CreateOrUpdate(context.resourceGroup.Name, context.generateResourceName(), new LoadBalancer()
            {
                Location = context.location,
                Sku      = new LoadBalancerSku("Basic"),
                FrontendIPConfigurations = new List <FrontendIPConfiguration> (new FrontendIPConfiguration[]
                {
                    new FrontendIPConfiguration()
                    {
                        Name = "LoadBalancerFrontEnd",
                        PrivateIPAllocationMethod = "Dynamic",
                        Subnet = subnet
                    }
                })
            });

            // Run deployment to create an availability group with the two machines created
            string AgName = "AvGroup";
            VirtualMachineExtension availabilityGroup = context.client.computeClient.VirtualMachineExtensions.CreateOrUpdate(context.resourceGroup.Name, vm1.Name, "agCreation", new VirtualMachineExtension(context.location, name: AgName)
            {
                VirtualMachineExtensionType = "CustomScriptExtension",

                Publisher               = "Microsoft.Compute",
                TypeHandlerVersion      = "1.9",
                AutoUpgradeMinorVersion = true,

                Settings = new CustomScriptExtensionSettings
                {
                    FileUris = new List <string>(new string[] {
                        "https://agtemplatestorage.blob.core.windows.net/templates/Deploy.ps1",
                        "https://agtemplatestorage.blob.core.windows.net/templates/sqlvm6.sql",
                        "https://agtemplatestorage.blob.core.windows.net/templates/sqlvm7.sql",
                        "https://agtemplatestorage.blob.core.windows.net/templates/sqlvm8.sql",
                        "https://agtemplatestorage.blob.core.windows.net/test/sqlvm9.sql",
                        "https://agtemplatestorage.blob.core.windows.net/templates/sqlvm10.sql"
                    }),
                    CommandToExecute = "powershell -ExecutionPolicy Unrestricted -File Deploy.ps1 " + AgName + " " + vm1.Name + " " + vm2.Name + " " + Constants.sqlLogin + " " + adminPassword + " " + domainName + "\\" + Constants.sqlService,
                    ContentVersion   = "1.0.0.0"
                }
            });

            // Create availability group listener
            return(context.getSqlClient().AvailabilityGroupListeners.CreateOrUpdate(context.resourceGroup.Name, group.Name, agListenerName, new AvailabilityGroupListener()
            {
                LoadBalancerConfigurations = new List <LoadBalancerConfiguration>(new LoadBalancerConfiguration[]
                {
                    new LoadBalancerConfiguration()
                    {
                        PrivateIpAddress = new PrivateIPAddress(ipAddress: "10.0.0.11", subnetResourceId: subnet.Id),
                        ProbePort = 59999,
                        LoadBalancerResourceId = loadBalancer.Id,
                        SqlVirtualMachineInstances = new List <string>()
                        {
                            sqlVM1.Id, sqlVM2.Id
                        }
                    }
                }),
                AvailabilityGroupName = AgName,
                Port = 1433
            }));
        }