CP-18028: For hosts with more than one control domain (dom0 and cvm at the moment) add an extra tab to display the console of the cvm.

This commit is contained in:
Konstantina Chremmou 2016-07-05 08:14:13 +01:00
parent 8991a257d2
commit 094e4c4c4f
6 changed files with 174 additions and 66 deletions

View File

@ -47,7 +47,7 @@ namespace XenAdmin.Controls
public VNCView activeVNCView; public VNCView activeVNCView;
private Dictionary<VM, VNCView> vncViews = new Dictionary<VM, VNCView>(); private Dictionary<VM, VNCView> vncViews = new Dictionary<VM, VNCView>();
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); protected static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public ConsolePanel() public ConsolePanel()
{ {
@ -153,7 +153,7 @@ namespace XenAdmin.Controls
ClearErrorMessage(); ClearErrorMessage();
} }
internal void setCurrentSource(Host source) internal virtual void setCurrentSource(Host source)
{ {
if (source == null) if (source == null)
{ {
@ -264,7 +264,7 @@ namespace XenAdmin.Controls
closeVNCForSource(source); closeVNCForSource(source);
} }
private void SetErrorMessage(string message) protected void SetErrorMessage(string message)
{ {
errorLabel.Text = message; errorLabel.Text = message;
tableLayoutPanelError.Visible = true; tableLayoutPanelError.Visible = true;
@ -356,4 +356,26 @@ namespace XenAdmin.Controls
#endregion #endregion
} }
internal class CvmConsolePanel : ConsolePanel
{
internal override void setCurrentSource(Host source)
{
if (source == null)
{
log.Error("No local copy of host information when connecting to host VNC console.");
SetErrorMessage(Messages.VNC_COULD_NOT_CONNECT_CONSOLE);
return;
}
VM cvm = source.OtherControlDomains.FirstOrDefault();
if (cvm == null)
{
log.Error("Could not find CVM console on host.");
SetErrorMessage(Messages.VNC_COULD_NOT_FIND_CONSOLES);
}
else
setCurrentSource(cvm);
}
}
} }

View File

@ -32,8 +32,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
@ -113,7 +111,7 @@ namespace XenAdmin.Controls
} }
comboBoxDrive.Items.Clear(); comboBoxDrive.Items.Clear();
if (VM != null) if (VM != null && !VM.is_control_domain)
{ {
List<VBD> vbds = VM.Connection.ResolveAll(VM.VBDs); List<VBD> vbds = VM.Connection.ResolveAll(VM.VBDs);
if (vbds == null) if (vbds == null)

View File

@ -83,6 +83,7 @@ namespace XenAdmin
this.TabPageWLB = new System.Windows.Forms.TabPage(); this.TabPageWLB = new System.Windows.Forms.TabPage();
this.TabPageWLBUpsell = new System.Windows.Forms.TabPage(); this.TabPageWLBUpsell = new System.Windows.Forms.TabPage();
this.TabPageAD = new System.Windows.Forms.TabPage(); this.TabPageAD = new System.Windows.Forms.TabPage();
this.TabPageADUpsell = new System.Windows.Forms.TabPage();
this.TabPageGPU = new System.Windows.Forms.TabPage(); this.TabPageGPU = new System.Windows.Forms.TabPage();
this.TabPageSearch = new System.Windows.Forms.TabPage(); this.TabPageSearch = new System.Windows.Forms.TabPage();
this.TabPageDockerProcess = new System.Windows.Forms.TabPage(); this.TabPageDockerProcess = new System.Windows.Forms.TabPage();
@ -280,7 +281,7 @@ namespace XenAdmin
this.StatusStrip = new System.Windows.Forms.StatusStrip(); this.StatusStrip = new System.Windows.Forms.StatusStrip();
this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.statusProgressBar = new System.Windows.Forms.ToolStripProgressBar(); this.statusProgressBar = new System.Windows.Forms.ToolStripProgressBar();
this.TabPageADUpsell = new System.Windows.Forms.TabPage(); this.TabPageCvmConsole = new System.Windows.Forms.TabPage();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout();
@ -342,6 +343,7 @@ namespace XenAdmin
this.TheTabControl.Controls.Add(this.TabPageBallooning); this.TheTabControl.Controls.Add(this.TabPageBallooning);
this.TheTabControl.Controls.Add(this.TabPageBallooningUpsell); this.TheTabControl.Controls.Add(this.TabPageBallooningUpsell);
this.TheTabControl.Controls.Add(this.TabPageConsole); this.TheTabControl.Controls.Add(this.TabPageConsole);
this.TheTabControl.Controls.Add(this.TabPageCvmConsole);
this.TheTabControl.Controls.Add(this.TabPageStorage); this.TheTabControl.Controls.Add(this.TabPageStorage);
this.TheTabControl.Controls.Add(this.TabPagePhysicalStorage); this.TheTabControl.Controls.Add(this.TabPagePhysicalStorage);
this.TheTabControl.Controls.Add(this.TabPageSR); this.TheTabControl.Controls.Add(this.TabPageSR);
@ -471,6 +473,12 @@ namespace XenAdmin
this.TabPageAD.Name = "TabPageAD"; this.TabPageAD.Name = "TabPageAD";
this.TabPageAD.UseVisualStyleBackColor = true; this.TabPageAD.UseVisualStyleBackColor = true;
// //
// TabPageADUpsell
//
resources.ApplyResources(this.TabPageADUpsell, "TabPageADUpsell");
this.TabPageADUpsell.Name = "TabPageADUpsell";
this.TabPageADUpsell.UseVisualStyleBackColor = true;
//
// TabPageGPU // TabPageGPU
// //
resources.ApplyResources(this.TabPageGPU, "TabPageGPU"); resources.ApplyResources(this.TabPageGPU, "TabPageGPU");
@ -1839,11 +1847,11 @@ namespace XenAdmin
this.statusProgressBar.Name = "statusProgressBar"; this.statusProgressBar.Name = "statusProgressBar";
this.statusProgressBar.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; this.statusProgressBar.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
// //
// TabPageADUpsell // TabPageCvmConsole
// //
resources.ApplyResources(this.TabPageADUpsell, "TabPageADUpsell"); resources.ApplyResources(this.TabPageCvmConsole, "TabPageCvmConsole");
this.TabPageADUpsell.Name = "TabPageADUpsell"; this.TabPageCvmConsole.Name = "TabPageCvmConsole";
this.TabPageADUpsell.UseVisualStyleBackColor = true; this.TabPageCvmConsole.UseVisualStyleBackColor = true;
// //
// MainWindow // MainWindow
// //
@ -2107,6 +2115,7 @@ namespace XenAdmin
private CommandToolStripButton restartContainerToolStripButton; private CommandToolStripButton restartContainerToolStripButton;
private CommandToolStripMenuItem healthCheckToolStripMenuItem1; private CommandToolStripMenuItem healthCheckToolStripMenuItem1;
private TabPage TabPageADUpsell; private TabPage TabPageADUpsell;
private TabPage TabPageCvmConsole;
} }
} }

View File

@ -85,6 +85,7 @@ namespace XenAdmin
internal readonly BallooningPage BallooningPage = new BallooningPage(); internal readonly BallooningPage BallooningPage = new BallooningPage();
internal readonly BallooningUpsellPage BallooningUpsellPage = new BallooningUpsellPage(); internal readonly BallooningUpsellPage BallooningUpsellPage = new BallooningUpsellPage();
internal readonly ConsolePanel ConsolePanel = new ConsolePanel(); internal readonly ConsolePanel ConsolePanel = new ConsolePanel();
internal readonly CvmConsolePanel CvmConsolePanel = new CvmConsolePanel();
internal readonly HAPage HAPage = new HAPage(); internal readonly HAPage HAPage = new HAPage();
internal readonly HAUpsellPage HAUpsellPage = new HAUpsellPage(); internal readonly HAUpsellPage HAUpsellPage = new HAUpsellPage();
internal readonly HomePage HomePage = new HomePage(); internal readonly HomePage HomePage = new HomePage();
@ -153,6 +154,7 @@ namespace XenAdmin
components.Add(GeneralPage); components.Add(GeneralPage);
components.Add(BallooningPage); components.Add(BallooningPage);
components.Add(ConsolePanel); components.Add(ConsolePanel);
components.Add(CvmConsolePanel);
components.Add(NetworkPage); components.Add(NetworkPage);
components.Add(HAPage); components.Add(HAPage);
components.Add(HomePage); components.Add(HomePage);
@ -171,6 +173,7 @@ namespace XenAdmin
AddTabContents(BallooningPage, TabPageBallooning); AddTabContents(BallooningPage, TabPageBallooning);
AddTabContents(BallooningUpsellPage, TabPageBallooningUpsell); AddTabContents(BallooningUpsellPage, TabPageBallooningUpsell);
AddTabContents(ConsolePanel, TabPageConsole); AddTabContents(ConsolePanel, TabPageConsole);
AddTabContents(CvmConsolePanel, TabPageCvmConsole);
AddTabContents(NetworkPage, TabPageNetwork); AddTabContents(NetworkPage, TabPageNetwork);
AddTabContents(HAPage, TabPageHA); AddTabContents(HAPage, TabPageHA);
AddTabContents(HAUpsellPage, TabPageHAUpsell); AddTabContents(HAUpsellPage, TabPageHAUpsell);
@ -246,8 +249,8 @@ namespace XenAdmin
if (SelectionManager.Selection.FirstIsRealVM) if (SelectionManager.Selection.FirstIsRealVM)
ConsolePanel.setCurrentSource((VM)SelectionManager.Selection.First); ConsolePanel.setCurrentSource((VM)SelectionManager.Selection.First);
else if (SelectionManager.Selection.FirstIsHost) else if (SelectionManager.Selection.FirstIsHost)
ConsolePanel.setCurrentSource((Host)SelectionManager.Selection.First); ConsolePanel.setCurrentSource((Host)SelectionManager.Selection.First);
UnpauseVNC(sender == TheTabControl); UnpauseVNC(sender == TheTabControl);
} }
@ -765,12 +768,17 @@ namespace XenAdmin
foreach (VM vm in connection.Cache.VMs) foreach (VM vm in connection.Cache.VMs)
{ {
this.ConsolePanel.closeVNCForSource(vm); ConsolePanel.closeVNCForSource(vm);
} }
foreach (Host host in connection.Cache.Hosts) foreach (Host host in connection.Cache.Hosts)
{
ConsolePanel.closeVNCForSource(host.ControlDomainZero); ConsolePanel.closeVNCForSource(host.ControlDomainZero);
foreach (VM vm in host.OtherControlDomains)
CvmConsolePanel.closeVNCForSource(vm);
}
connection.EndConnect(); connection.EndConnect();
RequestRefreshTreeView(); RequestRefreshTreeView();
@ -1372,6 +1380,7 @@ namespace XenAdmin
bool isTemplateSelected = SelectionManager.Selection.FirstIsTemplate; bool isTemplateSelected = SelectionManager.Selection.FirstIsTemplate;
bool isHostLive = SelectionManager.Selection.FirstIsLiveHost; bool isHostLive = SelectionManager.Selection.FirstIsLiveHost;
bool isDockerContainerSelected = SelectionManager.Selection.First is DockerContainer; bool isDockerContainerSelected = SelectionManager.Selection.First is DockerContainer;
bool hasManyControlDomains = isHostSelected && ((Host)SelectionManager.Selection.First).HasManyControlDomains;
bool selectedTemplateHasProvisionXML = SelectionManager.Selection.FirstIsTemplate && ((VM)SelectionManager.Selection[0].XenObject).HasProvisionXML; bool selectedTemplateHasProvisionXML = SelectionManager.Selection.FirstIsTemplate && ((VM)SelectionManager.Selection[0].XenObject).HasProvisionXML;
@ -1401,6 +1410,7 @@ namespace XenAdmin
} }
ShowTab(TabPageConsole, !shownConsoleReplacement && !multi && !SearchMode && (isRealVMSelected || (isHostSelected && isHostLive))); ShowTab(TabPageConsole, !shownConsoleReplacement && !multi && !SearchMode && (isRealVMSelected || (isHostSelected && isHostLive)));
ShowTab(TabPageCvmConsole, !shownConsoleReplacement && !multi && !SearchMode && isHostLive && hasManyControlDomains);
ShowTab(TabPagePeformance, !multi && !SearchMode && (isRealVMSelected || (isHostSelected && isHostLive))); ShowTab(TabPagePeformance, !multi && !SearchMode && (isRealVMSelected || (isHostSelected && isHostLive)));
ShowTab(ha_upsell ? TabPageHAUpsell : TabPageHA, !multi && !SearchMode && isPoolSelected); ShowTab(ha_upsell ? TabPageHAUpsell : TabPageHA, !multi && !SearchMode && isPoolSelected);
ShowTab(TabPageSnapshots, !multi && !SearchMode && isRealVMSelected); ShowTab(TabPageSnapshots, !multi && !SearchMode && isRealVMSelected);
@ -1766,13 +1776,23 @@ namespace XenAdmin
UnpauseVNC(e != null && sender == TheTabControl); UnpauseVNC(e != null && sender == TheTabControl);
} }
} }
else if (t == TabPageCvmConsole)
{
if (SelectionManager.Selection.FirstIsHost)
{
CvmConsolePanel.setCurrentSource((Host)SelectionManager.Selection.First);
UnpauseVNC(e != null && sender == TheTabControl);
}
}
else else
{ {
ConsolePanel.PauseAllViews(); ConsolePanel.PauseAllViews();
CvmConsolePanel.PauseAllViews();
// Start timer for closing the VNC connection after an interval (20 seconds) // Start timer for closing the VNC connection after an interval (20 seconds)
// when the console tab is not selected // when the console tab is not selected
ConsolePanel.StartCloseVNCTimer(ConsolePanel.activeVNCView); ConsolePanel.StartCloseVNCTimer(ConsolePanel.activeVNCView);
CvmConsolePanel.StartCloseVNCTimer(CvmConsolePanel.activeVNCView);
if (t == TabPageGeneral) if (t == TabPageGeneral)
{ {
@ -1965,10 +1985,14 @@ namespace XenAdmin
private void UnpauseVNC(bool focus) private void UnpauseVNC(bool focus)
{ {
ConsolePanel.UnpauseActiveView(); ConsolePanel.UnpauseActiveView();
CvmConsolePanel.UnpauseActiveView();
if (focus) if (focus)
{ {
ConsolePanel.FocusActiveView(); ConsolePanel.FocusActiveView();
CvmConsolePanel.FocusActiveView();
ConsolePanel.SwitchIfRequired(); ConsolePanel.SwitchIfRequired();
CvmConsolePanel.SwitchIfRequired();
} }
} }
@ -1977,7 +2001,7 @@ namespace XenAdmin
/// </summary> /// </summary>
public enum Tab public enum Tab
{ {
Overview, Home, Settings, Storage, Network, Console, Performance, NICs, SR, DockerProcess, DockerDetails Overview, Home, Settings, Storage, Network, Console, CvmConsole, Performance, NICs, SR, DockerProcess, DockerDetails
} }
public void SwitchToTab(Tab tab) public void SwitchToTab(Tab tab)
@ -2002,6 +2026,9 @@ namespace XenAdmin
case Tab.Console: case Tab.Console:
TheTabControl.SelectedTab = TabPageConsole; TheTabControl.SelectedTab = TabPageConsole;
break; break;
case Tab.CvmConsole:
TheTabControl.SelectedTab = TabPageCvmConsole;
break;
case Tab.Performance: case Tab.Performance:
TheTabControl.SelectedTab = TabPagePeformance; TheTabControl.SelectedTab = TabPagePeformance;
break; break;
@ -2366,6 +2393,8 @@ namespace XenAdmin
return "TabPageSearch" + modelObj; return "TabPageSearch" + modelObj;
if (TheTabControl.SelectedTab == TabPageConsole) if (TheTabControl.SelectedTab == TabPageConsole)
return "TabPageConsole" + modelObj; return "TabPageConsole" + modelObj;
if (TheTabControl.SelectedTab == TabPageCvmConsole)
return "TabPageCvmConsole" + modelObj;
if (TheTabControl.SelectedTab == TabPageGeneral) if (TheTabControl.SelectedTab == TabPageGeneral)
return "TabPageSettings" + modelObj; return "TabPageSettings" + modelObj;
if (TheTabControl.SelectedTab == TabPagePhysicalStorage || TheTabControl.SelectedTab == TabPageStorage || TheTabControl.SelectedTab == TabPageSR) if (TheTabControl.SelectedTab == TabPagePhysicalStorage || TheTabControl.SelectedTab == TabPageStorage || TheTabControl.SelectedTab == TabPageSR)

View File

@ -318,6 +318,30 @@
<data name="&gt;&gt;TabPageConsole.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageConsole.ZOrder" xml:space="preserve">
<value>4</value> <value>4</value>
</data> </data>
<data name="TabPageCvmConsole.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value>
</data>
<data name="TabPageCvmConsole.Size" type="System.Drawing.Size, System.Drawing">
<value>753, 592</value>
</data>
<data name="TabPageCvmConsole.TabIndex" type="System.Int32, mscorlib">
<value>22</value>
</data>
<data name="TabPageCvmConsole.Text" xml:space="preserve">
<value>CVM Console</value>
</data>
<data name="&gt;&gt;TabPageCvmConsole.Name" xml:space="preserve">
<value>TabPageCvmConsole</value>
</data>
<data name="&gt;&gt;TabPageCvmConsole.Type" xml:space="preserve">
<value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TabPageCvmConsole.Parent" xml:space="preserve">
<value>TheTabControl</value>
</data>
<data name="&gt;&gt;TabPageCvmConsole.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="TabPageStorage.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="TabPageStorage.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
</data> </data>
@ -349,7 +373,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageStorage.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageStorage.ZOrder" xml:space="preserve">
<value>5</value> <value>6</value>
</data> </data>
<data name="TabPagePhysicalStorage.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPagePhysicalStorage.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -376,7 +400,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPagePhysicalStorage.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPagePhysicalStorage.ZOrder" xml:space="preserve">
<value>6</value> <value>7</value>
</data> </data>
<data name="TabPageSR.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms"> <data name="TabPageSR.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value> <value>Top, Bottom, Left, Right</value>
@ -406,7 +430,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageSR.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageSR.ZOrder" xml:space="preserve">
<value>7</value> <value>8</value>
</data> </data>
<data name="TabPageNetwork.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="TabPageNetwork.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@ -436,7 +460,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageNetwork.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageNetwork.ZOrder" xml:space="preserve">
<value>8</value> <value>9</value>
</data> </data>
<data name="TabPageNICs.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="TabPageNICs.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@ -469,7 +493,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageNICs.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageNICs.ZOrder" xml:space="preserve">
<value>9</value> <value>10</value>
</data> </data>
<data name="TabPagePeformance.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="TabPagePeformance.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@ -499,7 +523,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPagePeformance.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPagePeformance.ZOrder" xml:space="preserve">
<value>10</value> <value>11</value>
</data> </data>
<data name="TabPageHA.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageHA.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -526,7 +550,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageHA.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageHA.ZOrder" xml:space="preserve">
<value>11</value> <value>12</value>
</data> </data>
<data name="TabPageHAUpsell.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageHAUpsell.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -553,7 +577,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageHAUpsell.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageHAUpsell.ZOrder" xml:space="preserve">
<value>12</value> <value>13</value>
</data> </data>
<data name="snapshotPage.AutoScroll" type="System.Boolean, mscorlib"> <data name="snapshotPage.AutoScroll" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
@ -610,7 +634,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageSnapshots.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageSnapshots.ZOrder" xml:space="preserve">
<value>13</value> <value>14</value>
</data> </data>
<data name="TabPageWLB.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageWLB.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -634,7 +658,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageWLB.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageWLB.ZOrder" xml:space="preserve">
<value>14</value> <value>15</value>
</data> </data>
<data name="TabPageWLBUpsell.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageWLBUpsell.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -658,7 +682,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageWLBUpsell.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageWLBUpsell.ZOrder" xml:space="preserve">
<value>15</value> <value>16</value>
</data> </data>
<data name="TabPageAD.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageAD.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -682,7 +706,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageAD.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageAD.ZOrder" xml:space="preserve">
<value>16</value> <value>17</value>
</data> </data>
<data name="TabPageADUpsell.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageADUpsell.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -709,7 +733,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageADUpsell.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageADUpsell.ZOrder" xml:space="preserve">
<value>17</value> <value>18</value>
</data> </data>
<data name="TabPageGPU.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageGPU.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -733,7 +757,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageGPU.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageGPU.ZOrder" xml:space="preserve">
<value>18</value> <value>19</value>
</data> </data>
<data name="TabPageSearch.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="TabPageSearch.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@ -763,7 +787,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageSearch.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageSearch.ZOrder" xml:space="preserve">
<value>19</value> <value>20</value>
</data> </data>
<data name="TabPageDockerProcess.Location" type="System.Drawing.Point, System.Drawing"> <data name="TabPageDockerProcess.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value> <value>4, 22</value>
@ -793,7 +817,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageDockerProcess.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageDockerProcess.ZOrder" xml:space="preserve">
<value>20</value> <value>21</value>
</data> </data>
<data name="TabPageDockerDetails.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="TabPageDockerDetails.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@ -823,7 +847,7 @@
<value>TheTabControl</value> <value>TheTabControl</value>
</data> </data>
<data name="&gt;&gt;TabPageDockerDetails.ZOrder" xml:space="preserve"> <data name="&gt;&gt;TabPageDockerDetails.ZOrder" xml:space="preserve">
<value>21</value> <value>22</value>
</data> </data>
<data name="TheTabControl.Font" type="System.Drawing.Font, System.Drawing"> <data name="TheTabControl.Font" type="System.Drawing.Font, System.Drawing">
<value>Verdana, 8.25pt</value> <value>Verdana, 8.25pt</value>
@ -1985,23 +2009,22 @@
</data> </data>
<data name="powerOnToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="powerOnToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
AAAASUVORK5CYII=
</value> </value>
</data> </data>
<data name="powerOnToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing"> <data name="powerOnToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
@ -2015,22 +2038,21 @@
</data> </data>
<data name="ShutdownHostToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="ShutdownHostToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
SUVORK5CYII=
</value> </value>
</data> </data>
<data name="ShutdownHostToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing"> <data name="ShutdownHostToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">

View File

@ -1053,6 +1053,34 @@ namespace XenAPI
} }
} }
public bool HasManyControlDomains
{
get
{
if (Connection == null)
return false;
var vms = Connection.ResolveAll(resident_VMs);
return vms.FindAll(v => v.is_control_domain).Count > 1;
}
}
public IEnumerable<VM> OtherControlDomains
{
get
{
if (Connection == null)
return null;
var vms = Connection.ResolveAll(resident_VMs);
if (Helpers.DundeePlusOrGreater(Connection))
return vms.Where(v => v.is_control_domain && v.opaque_ref != control_domain);
return vms.Where(v => v.is_control_domain && v.domid != 0);
}
}
/// <summary> /// <summary>
/// Interpret a value from the software_version dictionary as a int, or 0 if we couldn't parse it. /// Interpret a value from the software_version dictionary as a int, or 0 if we couldn't parse it.
/// </summary> /// </summary>