Merge pull request #916 from geosharath/VMSS

CA-198956: VM.set_snapshot_schedule throws exception "Object deleted: VMSS" in xapi
This commit is contained in:
Mihaela Stoica 2016-04-08 15:43:33 +01:00
commit a8d52960b5
4 changed files with 99 additions and 54 deletions

View File

@ -72,6 +72,31 @@ namespace XenAdmin.Dialogs.VMProtectionRecovery
}
private IVMPolicy _policy;
public void StartRefreshTab()
{
/* hoursFromNow has 3 possible values:
1) 0 -> top 10 messages (default)
2) 24 -> messages from past 24 Hrs
3) 7 * 24 -> messages from lst 7 days */
var hoursFromNow = 0;
switch (comboBox1.SelectedIndex)
{
case 0: /* default value*/
break;
case 1:
hoursFromNow = 24;
break;
case 2:
hoursFromNow = 7 * 24;
break;
}
PureAsyncAction action = _policy.getAlertsAction(_policy, hoursFromNow);
action.Completed += action_Completed;
action.RunAsync();
}
public void RefreshTab(IVMPolicy policy)
{
_policy = policy;
@ -83,7 +108,7 @@ namespace XenAdmin.Dialogs.VMProtectionRecovery
else
{
comboBox1.Enabled = true;
RefreshGrid(_policy.PolicyAlerts);
StartRefreshTab();
}
}
@ -168,24 +193,7 @@ namespace XenAdmin.Dialogs.VMProtectionRecovery
{
if (_policy != null)
{
if (comboBox1.SelectedIndex == 0)
RefreshGrid(_policy.PolicyAlerts);
else if (comboBox1.SelectedIndex == 1)
{
dataGridView1.Rows.Clear();
panelLoading.Visible = true;
PureAsyncAction action = _policy.getAlertsAction(_policy, 24) ;
action.Completed += action_Completed;
action.RunAsync();
}
else if (comboBox1.SelectedIndex == 2)
{
dataGridView1.Rows.Clear();
panelLoading.Visible = true;
PureAsyncAction action = _policy.getAlertsAction(_policy, 7 * 24);
action.Completed += action_Completed;
action.RunAsync();
}
StartRefreshTab();
}
}

View File

@ -44,7 +44,7 @@ using XenAdmin.Core;
using XenAdmin.Dialogs.VMProtectionRecovery;
using XenCenterLib;
using XenAdmin.Alerts;
using System.Linq;
namespace XenAdmin.Dialogs.VMProtection_Recovery
{
@ -201,43 +201,57 @@ namespace XenAdmin.Dialogs.VMPolicies
dataGridView1.SuspendLayout();
var selectedPolicy = currentSelected;
dataGridView1.Rows.Clear();
var policyList = VMGroup<T>.VMPolicies(Pool.Connection.Cache);
/* creating a dictionary to hold (policy_uuid, message list) */
Dictionary<string, List<XenAPI.Message>> policyMessage = new Dictionary<string, List<XenAPI.Message>>();
/* populate the dictionary with policy uuid */
foreach (var policy in policyList)
{
policy.PolicyAlerts.Clear();
List<XenAPI.Message> messageList = new List<XenAPI.Message>();
policyMessage.Add(policy.uuid, messageList);
}
/* iterate through all messages and populate the dictionary with message list */
/* filter out the messages for VMSS as the VMSS does not have recent alerts and that need to be populated below*/
List<XenAPI.Message> vmssMessages = new List<XenAPI.Message>();
if (!VMGroup<T>.isVMPolicyVMPP)
{
var messages = Pool.Connection.Cache.Messages;
List<XenAPI.Message> value = new List<XenAPI.Message>();
foreach (var message in messages)
{
if (message.cls == cls.VMSS)
{
vmssMessages.Add(message);
if (policyMessage.TryGetValue(message.obj_uuid, out value))
{
value.Add(message);
}
}
}
}
foreach (var policy in VMGroup<T>.VMPolicies(Pool.Connection.Cache))
{
if (!VMGroup<T>.isVMPolicyVMPP)
{
policy.PolicyAlerts.Clear();
List<XenAPI.Message> processedMessages = new List<XenAPI.Message>();
/*for VMSS: Populate the alerts from Messages by filtering out the alerts for this schedule
This is not required in VMPP as the VMPP record itself has the recentAlerts */
foreach (var message in vmssMessages)
{
if (message.obj_uuid == policy.uuid)
{
policy.PolicyAlerts.Add(new PolicyAlert(message.priority, message.name, message.timestamp));
processedMessages.Add(message);
}
}
vmssMessages.RemoveAll(message => processedMessages.Contains(message));
}
/* add only 10 messages for each policy and referesh the rows*/
foreach (var policy in policyList)
{
/* message list need not be always sorted */
var messageListSorted = policyMessage[policy.uuid].OrderByDescending(message => message.timestamp).ToList();
for (int messageCount = 0; messageCount < 10 && messageCount < messageListSorted.Count; messageCount++)
{
policy.PolicyAlerts.Add(new PolicyAlert(messageListSorted[messageCount].priority, messageListSorted[messageCount].name, messageListSorted[messageCount].timestamp));
}
if (dataGridView1.ColumnCount > 0)
dataGridView1.Rows.Add(new PolicyRow(policy));
}
RefreshButtons();
RefreshButtons();
if (selectedPolicy != null)
{
foreach (PolicyRow row in dataGridView1.Rows)

View File

@ -35,6 +35,7 @@ using System.Text;
using XenAdmin.Alerts;
using XenAPI;
using System.Diagnostics;
using System.Linq;
namespace XenAdmin.Actions
{
@ -52,18 +53,45 @@ namespace XenAdmin.Actions
protected override void Run()
{
var now = DateTime.Now;
var messages = Pool.Connection.Cache.Messages;
var messages = Pool.Connection.Cache.Messages.OrderByDescending(message => message.timestamp).ToList();
var listAlerts = new List<PolicyAlert>();
DateTime currentTime = DateTime.Now;
DateTime offset = currentTime.Add(new TimeSpan(- _hoursFromNow, 0, 0));
/*for VMSS: Populate the alerts from Messages by filtering out the alerts for this schedule
This is not required in VMPP as the VMPP record itself has the recentAlerts */
foreach (var message in messages)
/* _hoursFromNow has 3 possible values:
1) 0 -> top 10 messages
2) 24 -> messages from past 24 Hrs
3) 7 * 24 -> messages from lst 7 days */
if (_hoursFromNow == 0)
{
if (message.cls == cls.VMSS && message.obj_uuid == VMSS.uuid)
int messageCounter = 0;
foreach (var message in messages)
{
listAlerts.Add(new PolicyAlert(message.priority, message.name, message.timestamp));
if (message.cls == cls.VMSS && message.obj_uuid == VMSS.uuid && messageCounter < 10)
{
listAlerts.Add(new PolicyAlert(message.priority, message.name, message.timestamp));
messageCounter++;
}
else if (messageCounter >= 10)
break;
}
}
else
{
foreach (var message in messages)
{
if (message.cls == cls.VMSS && message.obj_uuid == VMSS.uuid && message.timestamp > offset)
{
listAlerts.Add(new PolicyAlert(message.priority, message.name, message.timestamp));
}
/* since the messages are sorted on timestamp you need not scan the entire message list */
else if (message.timestamp < offset)
break;
}
}
VMSS.Alerts = new List<PolicyAlert>(listAlerts);
Debug.WriteLine(string.Format("GetAlerts took: {0}", DateTime.Now - now));

View File

@ -306,11 +306,6 @@ namespace XenAPI
{
get
{
foreach (var recent in _alerts)
{
if (!_alerts.Contains(recent))
_alerts.Add(recent);
}
return _alerts;
}
set { _alerts = value; }