/// <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); }
/// <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; }