/// <summary>
        /// Walks through hosted services and returns back the ResourceExtensionStatus reported by Azure guest agent
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private List <NSM.ResourceExtensionStatus> GetResourceExtensionStatusList(VirtualMachineSqlServerExtensionContext context)
        {
            List <NSM.ResourceExtensionStatus> extensionStatusList = new List <NSM.ResourceExtensionStatus>();

            // List all hosted services
            WriteVerboseWithTimestamp("Listing hosted services...");
            NSM.HostedServiceListResponse response = this.ComputeClient.HostedServices.List();
            WriteVerboseWithTimestamp("Listing hosted services completed.");

            foreach (var service in response)
            {
                NSM.DeploymentGetResponse deployment = null;

                try
                {
                    deployment = this.ComputeClient.Deployments.GetBySlot(
                        service.ServiceName,
                        NSM.DeploymentSlot.Production);
                }
                catch (CloudException e)
                {
                    if (e.Response.StatusCode != HttpStatusCode.NotFound)
                    {
                        throw;
                    }
                }

                if (deployment != null)
                {
                    // Enumerate Role instances , check if role name exists
                    foreach (NSM.RoleInstance ri in deployment.RoleInstances)
                    {
                        if (ri.RoleName.Equals(context.RoleName, System.StringComparison.InvariantCulture))
                        {
                            WriteVerboseWithTimestamp("Found Role Instance:" + context.RoleName);
                            extensionStatusList = new List <NSM.ResourceExtensionStatus>(ri.ResourceExtensionStatusList);
                            return(extensionStatusList);
                        }
                    }
                }
            }

            if (extensionStatusList.Count == 0)
            {
                WriteVerboseWithTimestamp("Could not locate role instance for role name:" + context.RoleName);
            }

            return(extensionStatusList);
        }
        /// <summary>
        /// Get the SQL Extension's context
        /// </summary>
        /// <returns></returns>
        private VirtualMachineSqlServerExtensionContext GetExtensionContext(ResourceExtensionReference r)
        {
            string extensionName = VirtualMachineSqlServerExtensionCmdletBase.ExtensionPublishedNamespace + "."
                                   + VirtualMachineSqlServerExtensionCmdletBase.ExtensionPublishedName;

            VirtualMachineSqlServerExtensionContext context = new VirtualMachineSqlServerExtensionContext
            {
                ExtensionName        = r.Name,
                Publisher            = r.Publisher,
                ReferenceName        = r.ReferenceName,
                Version              = r.Version,
                State                = r.State,
                PublicConfiguration  = PublicConfiguration,
                PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration),
                RoleName             = VM.GetInstance().RoleName,
            };

            // gather extension status messages
            List <string> statusMessageList = new List <string>();

            List <NSM.ResourceExtensionStatus> extensionStatusList = this.GetResourceExtensionStatusList(context);

            // enumerate over extension status list and gather status for autopatching and autobackup
            // Note: valid reference to an extension status list is returned by GetResourceExtensionStatusList()
            foreach (NSM.ResourceExtensionStatus res in extensionStatusList)
            {
                // Expected ReferenceName = "Microsoft.SqlServer.Management.SqlIaaSAgent"
                if (!res.HandlerName.Equals(extensionName, System.StringComparison.InvariantCulture))
                {
                    // skip all non-sql extensions
                    continue;
                }

                WriteVerboseWithTimestamp("Found SQL Extension:" + r.ReferenceName);

                if (null != res.ExtensionSettingStatus)
                {
                    context.SubStatusList = res.ExtensionSettingStatus.SubStatusList;

                    foreach (NSM.ResourceExtensionSubStatus status in res.ExtensionSettingStatus.SubStatusList)
                    {
                        if (null != status.FormattedMessage)
                        {
                            string formattedMessage = status.FormattedMessage.Message;

                            // get current auto patching and auto backup config from extension status message
                            if (status.Name.Equals(AutoPatchingStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoPatchingSettings = DeSerializeAutoPatchingSettings(status.Name, formattedMessage);
                            }
                            else if (status.Name.Equals(AutoBackupStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoBackupSettings = DeSerializeAutoBackupSettings(status.Name, formattedMessage);
                            }
                            else if (status.Name.Equals(KeyVaultCredentialStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.KeyVaultCredentialSettings = DeSerializeKeyVaultCredentialSettings(status.Name, formattedMessage);
                            }

                            statusMessageList.Add(formattedMessage);
                        }
                    }
                }
            }

            context.StatusMessages = statusMessageList;
            return(context);
        }
Exemple #3
0
        /// <summary>
        /// Get the SQL Extension's context
        /// </summary>
        /// <returns></returns>
        private VirtualMachineSqlServerExtensionContext GetExtensionContext(ResourceExtensionReference r)
        {
            VirtualMachineSqlServerExtensionContext context = new VirtualMachineSqlServerExtensionContext
            {
                ExtensionName        = r.Name,
                Publisher            = r.Publisher,
                ReferenceName        = r.ReferenceName,
                Version              = r.Version,
                State                = r.State,
                PublicConfiguration  = PublicConfiguration,
                PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration),
                RoleName             = VM.GetInstance().RoleName,
            };

            // gather extension status messages
            List <string> statusMessageList = new List <string>();

            List <NSM.ResourceExtensionStatus> extensionStatusList = this.GetResourceExtensionStatusList(context);

            // enumerate over extension status list and gather status for autopatching and autobackup
            // Note: valid reference to an extension status list is returned by GetResourceExtensionStatusList()
            foreach (NSM.ResourceExtensionStatus res in extensionStatusList)
            {
                // Extension handler name  in format publisher.ReferenceName
                string extensionHandlerName = string.Format(CultureInfo.InvariantCulture,
                                                            "{0}.{1}",
                                                            r.Publisher,
                                                            r.ReferenceName);

                // skip all non-sql extensions
                if (!res.HandlerName.Equals(extensionHandlerName, System.StringComparison.InvariantCulture))
                {
                    continue;
                }

                if (null != res.ExtensionSettingStatus)
                {
                    context.SubStatusList = res.ExtensionSettingStatus.SubStatusList;

                    foreach (NSM.ResourceExtensionSubStatus status in res.ExtensionSettingStatus.SubStatusList)
                    {
                        if (null != status.FormattedMessage)
                        {
                            string formattedMessage = status.FormattedMessage.Message;

                            // get current auto patching and auto backup config from extension status message
                            if (status.Name.Equals(AutoPatchingStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoPatchingSettings = DeSerializeAutoPatchingSettings(status.Name, formattedMessage);
                            }

                            if (status.Name.Equals(AutoBackupStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoBackupSettings = DeSerializeAutoBackupSettings(status.Name, formattedMessage);
                            }

                            statusMessageList.Add(formattedMessage);
                        }
                    }
                }
            }

            context.StatusMessages = statusMessageList;
            return(context);
        }
        /// <summary>
        /// Get the SQL Extension's context
        /// </summary>
        /// <returns></returns>
        private VirtualMachineSqlServerExtensionContext GetExtensionContext(ResourceExtensionReference r)
        {
            string extensionName = VirtualMachineSqlServerExtensionCmdletBase.ExtensionPublishedNamespace + "."
                                   + VirtualMachineSqlServerExtensionCmdletBase.ExtensionPublishedName;

            VirtualMachineSqlServerExtensionContext context = new VirtualMachineSqlServerExtensionContext
            {
                ExtensionName        = r.Name,
                Publisher            = r.Publisher,
                ReferenceName        = r.ReferenceName,
                Version              = r.Version,
                State                = r.State,
                PublicConfiguration  = PublicConfiguration,
                PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration),
                RoleName             = VM.GetInstance().RoleName,
            };

            // gather extension status messages
            List <string> statusMessageList = new List <string>();

            List <NSM.ResourceExtensionStatus> extensionStatusList = this.GetResourceExtensionStatusList(context);

            // enumerate over extension status list and gather status for autopatching and autobackup
            // Note: valid reference to an extension status list is returned by GetResourceExtensionStatusList()
            foreach (NSM.ResourceExtensionStatus res in extensionStatusList)
            {
                // Expected ReferenceName = "Microsoft.SqlServer.Management.SqlIaaSAgent"
                if (!res.HandlerName.Equals(extensionName, System.StringComparison.InvariantCulture))
                {
                    // skip all non-sql extensions
                    continue;
                }

                WriteVerboseWithTimestamp("Found SQL Extension:" + r.ReferenceName);

                if (null != res.ExtensionSettingStatus)
                {
                    context.SubStatusList   = res.ExtensionSettingStatus.SubStatusList;
                    context.ExtensionStatus = res.Status;

                    // Gather status messages because
                    // #$ISSUE- extension.Statuses is always null, follow up with Azure team
                    foreach (NSM.ResourceExtensionSubStatus status in res.ExtensionSettingStatus.SubStatusList)
                    {
                        if (null != status.FormattedMessage)
                        {
                            statusMessageList.Add(status.FormattedMessage.Message);
                        }
                    }
                    context.StatusMessages = statusMessageList;

                    // Extract sql configuration information from one of the sub statuses
                    if (context.SubStatusList == null ||
                        context.SubStatusList.FirstOrDefault(s =>
                                                             s.Name.Equals(SqlConfigurationStatusMessageName, StringComparison.InvariantCultureIgnoreCase)) == null)
                    {
                        WriteWarning(
                            String.Format(
                                CultureInfo.CurrentUICulture,
                                Properties.Resources.AzureVMSqlServerSqlConfigurationNotFound,
                                context.SubStatusList));

                        continue;
                    }

                    string sqlConfiguration = context.SubStatusList.First(s => s.Name.Equals(SqlConfigurationStatusMessageName, StringComparison.InvariantCultureIgnoreCase)).FormattedMessage.Message;

                    try
                    {
                        AzureVMSqlServerConfiguration settings = JsonConvert.DeserializeObject <AzureVMSqlServerConfiguration>(sqlConfiguration);

                        context.AutoBackupSettings = settings.AutoBackup == null ? null : new AutoBackupSettings()
                        {
                            Enable                = settings.AutoBackup.Enable,
                            EnableEncryption      = settings.AutoBackup.EnableEncryption,
                            RetentionPeriod       = settings.AutoBackup.RetentionPeriod,
                            StorageUrl            = settings.AutoBackup.StorageAccountUrl,
                            BackupSystemDbs       = settings.AutoBackup.BackupSystemDbs,
                            BackupScheduleType    = string.IsNullOrEmpty(settings.AutoBackup.BackupScheduleType) ? null : AutoBackupScheduleTypeMap[settings.AutoBackup.BackupScheduleType],
                            FullBackupFrequency   = settings.AutoBackup.FullBackupFrequency,
                            FullBackupStartTime   = settings.AutoBackup.FullBackupStartTime,
                            FullBackupWindowHours = settings.AutoBackup.FullBackupWindowHours,
                            LogBackupFrequency    = settings.AutoBackup.LogBackupFrequency
                        };

                        context.AutoPatchingSettings = settings.AutoPatching == null ? null : new AutoPatchingSettings()
                        {
                            Enable    = settings.AutoPatching.Enable,
                            DayOfWeek = settings.AutoPatching.DayOfWeek,
                            MaintenanceWindowDuration     = settings.AutoPatching.MaintenanceWindowDuration,
                            MaintenanceWindowStartingHour = settings.AutoPatching.MaintenanceWindowStartingHour,
                            PatchCategory = string.IsNullOrEmpty(settings.AutoPatching.PatchCategory) ? null : AutoPatchingCategoryMap[settings.AutoPatching.PatchCategory]
                        };

                        context.KeyVaultCredentialSettings = settings.AzureKeyVault == null ? null : new KeyVaultCredentialSettings()
                        {
                            Enable      = settings.AzureKeyVault.Enable,
                            Credentials = settings.AzureKeyVault.CredentialsList
                        };

                        context.AutoTelemetrySettings = settings.AutoTelemetryReport == null ? null : new AutoTelemetrySettings()
                        {
                            Region = settings.AutoTelemetryReport.Location,
                        };
                    }
                    catch (JsonException)
                    {
                        WriteWarning(
                            String.Format(
                                CultureInfo.CurrentUICulture,
                                Properties.Resources.AzureVMSqlServerWrongConfigFormat,
                                sqlConfiguration));
                    }
                }
            }

            return(context);
        }
        /// <summary>
        /// Get the SQL Extension's context
        /// </summary>
        /// <returns></returns>
        private VirtualMachineSqlServerExtensionContext GetExtensionContext(ResourceExtensionReference r)
        {
            string extensionName = VirtualMachineSqlServerExtensionCmdletBase.ExtensionPublishedNamespace + "."
                               + VirtualMachineSqlServerExtensionCmdletBase.ExtensionPublishedName;

            VirtualMachineSqlServerExtensionContext context = new VirtualMachineSqlServerExtensionContext
            {
                ExtensionName = r.Name,
                Publisher = r.Publisher,
                ReferenceName = r.ReferenceName,
                Version = r.Version,
                State = r.State,
                PublicConfiguration = PublicConfiguration,
                PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration),
                RoleName = VM.GetInstance().RoleName,
            };

            // gather extension status messages
            List<string> statusMessageList = new List<string>();

            List<NSM.ResourceExtensionStatus> extensionStatusList = this.GetResourceExtensionStatusList(context);

            // enumerate over extension status list and gather status for autopatching and autobackup
            // Note: valid reference to an extension status list is returned by GetResourceExtensionStatusList()
            foreach (NSM.ResourceExtensionStatus res in extensionStatusList)
            {
                // Expected ReferenceName = "Microsoft.SqlServer.Management.SqlIaaSAgent"
                if (!res.HandlerName.Equals(extensionName, System.StringComparison.InvariantCulture))
                {
                    // skip all non-sql extensions
                    continue;
                }

                WriteVerboseWithTimestamp("Found SQL Extension:" + r.ReferenceName);

                if (null != res.ExtensionSettingStatus)
                {
                    context.SubStatusList = res.ExtensionSettingStatus.SubStatusList;

                    foreach (NSM.ResourceExtensionSubStatus status in res.ExtensionSettingStatus.SubStatusList)
                    {
                        if (null != status.FormattedMessage)
                        {
                            string formattedMessage = status.FormattedMessage.Message;

                            // get current auto patching and auto backup config from extension status message
                            if (status.Name.Equals(AutoPatchingStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoPatchingSettings = DeSerializeAutoPatchingSettings(status.Name, formattedMessage);
                            }
                            else if (status.Name.Equals(AutoBackupStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoBackupSettings = DeSerializeAutoBackupSettings(status.Name, formattedMessage);
                            }
                            else if (status.Name.Equals(KeyVaultCredentialStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.KeyVaultCredentialSettings = DeSerializeKeyVaultCredentialSettings(status.Name, formattedMessage);
                            }

                            statusMessageList.Add(formattedMessage);
                        }
                    }
                }
            }

            context.StatusMessages = statusMessageList;
            return context;
        }
        /// <summary>
        /// Walks through hosted services and returns back the ResourceExtensionStatus reported by Azure guest agent
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private List<NSM.ResourceExtensionStatus> GetResourceExtensionStatusList(VirtualMachineSqlServerExtensionContext context)
        {
            List<NSM.ResourceExtensionStatus> extensionStatusList = new List<NSM.ResourceExtensionStatus>();

            // List all hosted services
            WriteVerboseWithTimestamp("Listing hosted services...");
            NSM.HostedServiceListResponse response = this.ComputeClient.HostedServices.List();
            WriteVerboseWithTimestamp("Listing hosted services completed.");

            foreach (var service in response)
            {
                NSM.DeploymentGetResponse deployment = null;

                try
                {
                    deployment = this.ComputeClient.Deployments.GetBySlot(
                        service.ServiceName,
                        NSM.DeploymentSlot.Production);
                }
                catch (CloudException e)
                {
                    if (e.Response.StatusCode != HttpStatusCode.NotFound)
                    {
                        throw;
                    }
                }

                if (deployment != null)
                {
                    // Enumerate Role instances , check if role name exists
                    foreach (NSM.RoleInstance ri in deployment.RoleInstances)
                    {
                        if (ri.RoleName.Equals(context.RoleName, System.StringComparison.InvariantCulture))
                        {
                            WriteVerboseWithTimestamp("Found Role Instance:" + context.RoleName);
                            extensionStatusList = new List<NSM.ResourceExtensionStatus>(ri.ResourceExtensionStatusList);
                            return extensionStatusList;
                        }
                    }
                }
            }

            if (extensionStatusList.Count == 0)
            {
                WriteVerboseWithTimestamp("Could not locate role instance for role name:" + context.RoleName);
            }

            return extensionStatusList;
        }
 private void VerifySqlServerExtension(VirtualMachineSqlServerExtensionContext extension,bool disable=false)
 {
     Console.WriteLine("Verifying Sql Server extension info.");
     Assert.AreEqual(version, extension.Version);
     Assert.AreEqual(string.IsNullOrEmpty(referenceName) ? extensionName : referenceName, extension.ReferenceName);
     if (disable)
     {
         Assert.AreEqual(DisabledState, extension.State);
     }
     else
     {
         Assert.AreEqual(EnableState, extension.State);
     }
     Console.WriteLine("Sql Server extension verified successfully.");
 }
        /// <summary>
        /// Get the SQL Extension's context
        /// </summary>
        /// <returns></returns>
        private VirtualMachineSqlServerExtensionContext GetExtensionContext(ResourceExtensionReference r)
        {
            VirtualMachineSqlServerExtensionContext context = new VirtualMachineSqlServerExtensionContext
            {
                ExtensionName = r.Name,
                Publisher = r.Publisher,
                ReferenceName = r.ReferenceName,
                Version = r.Version,
                State = r.State,
                PublicConfiguration = PublicConfiguration,
                PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration),
                RoleName = VM.GetInstance().RoleName,
            };

            // gather extension status messages
            List<string> statusMessageList = new List<string>();

            List<NSM.ResourceExtensionStatus> extensionStatusList = this.GetResourceExtensionStatusList(context);

            // enumerate over extension status list and gather status for autopatching and autobackup
            // Note: valid reference to an extension status list is returned by GetResourceExtensionStatusList()
            foreach (NSM.ResourceExtensionStatus res in extensionStatusList)
            {
                // Extension handler name  in format publisher.ReferenceName
                string extensionHandlerName = string.Format(CultureInfo.InvariantCulture,
                    "{0}.{1}",
                    r.Publisher,
                    r.ReferenceName);

                // skip all non-sql extensions
                if (!res.HandlerName.Equals(extensionHandlerName, System.StringComparison.InvariantCulture))
                {
                    continue;
                }

                if (null != res.ExtensionSettingStatus)
                {
                    context.SubStatusList = res.ExtensionSettingStatus.SubStatusList;

                    foreach (NSM.ResourceExtensionSubStatus status in res.ExtensionSettingStatus.SubStatusList)
                    {
                        if (null != status.FormattedMessage)
                        {
                            string formattedMessage = status.FormattedMessage.Message;

                            // get current auto patching and auto backup config from extension status message
                            if (status.Name.Equals(AutoPatchingStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoPatchingSettings = DeSerializeAutoPatchingSettings(status.Name, formattedMessage);
                            }

                            if (status.Name.Equals(AutoBackupStatusMessageName, System.StringComparison.InvariantCulture))
                            {
                                context.AutoBackupSettings = DeSerializeAutoBackupSettings(status.Name, formattedMessage);
                            }

                            statusMessageList.Add(formattedMessage);
                        }
                    }
                }
            }

            context.StatusMessages = statusMessageList;
            return context;
        }