Skip to content

Commit

Permalink
Added Xen Tools Installer logic for custom packages.
Browse files Browse the repository at this point in the history
  • Loading branch information
chri4799 committed Mar 23, 2016
1 parent d1abbfa commit 0ed6ff2
Show file tree
Hide file tree
Showing 17 changed files with 269 additions and 29 deletions.
2 changes: 1 addition & 1 deletion Properties.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
COMPANY = "Rackspace Cloud"
DESCRIPTION = "C#.NET Agent for Windows Virtual Machines"
CLR_VERSION = 'v3.5'
RELEASE_BUILD_NUMBER = "1.3.0.3"
RELEASE_BUILD_NUMBER = "1.3.1.0"

#Paths
SLN_FILE = File.join(ABSOLUTE_PATH,'src','WindowsConfigurationAgent.sln')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
[assembly: AssemblyCompany("Rackspace Cloud")]
[assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
[assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud. All Rights Reserved")]
[assembly: AssemblyVersion("1.3.0.3")]
[assembly: AssemblyVersion("1.3.1.0")]

Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
[assembly: AssemblyCompany("Rackspace Cloud")]
[assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
[assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud. All Rights Reserved")]
[assembly: AssemblyVersion("1.3.0.3")]
[assembly: AssemblyVersion("1.3.1.0")]

7 changes: 7 additions & 0 deletions src/Rackspace.Cloud.Server.Agent.Service/ServerClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public class ServerClass {
StructureMapConfiguration.BuildInstancesOf<ITimer>().TheDefaultIs(Registry.Object(_timer));
IoC.Register();

RunXenToolsUpgradeChecks();
RunCloudAutomation();
CheckAgentUpdater();

Expand Down Expand Up @@ -103,5 +104,11 @@ private void RunCloudAutomation()
var cloudAutomationActions = ObjectFactory.GetInstance<ICloudAutomationActions>();
cloudAutomationActions.RunPostRebootCloudAutomationScripts();
}

private void RunXenToolsUpgradeChecks()
{
var xenToolsUpdateActions = ObjectFactory.GetInstance<IXenToolsUpdateActions>();
xenToolsUpdateActions.ProcessXenToolsPostUpgradeActions();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
[assembly: AssemblyCompany("Rackspace Cloud")]
[assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
[assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud. All Rights Reserved")]
[assembly: AssemblyVersion("1.3.0.3")]
[assembly: AssemblyVersion("1.3.1.0")]

6 changes: 4 additions & 2 deletions src/Rackspace.Cloud.Server.Agent.Specs/XentoolsUpdateSpec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class XentoolsUpdateSpec
private IConnectionChecker _connectionChecker;
private IServiceRestarter _serviceRestarter;
private ILogger _logger;
private MockRepository _mockRepo;
private MockRepository _mockRepo;
private IXenToolsUpdateSubActions _xenToolsUpdateSubActions;

[SetUp]
public void Setup()
Expand All @@ -40,12 +41,13 @@ public void Setup()
_connectionChecker = MockRepository.GenerateMock<IConnectionChecker>();
_sleeper = MockRepository.GenerateMock<ISleeper>();
_logger = MockRepository.GenerateMock<ILogger>();
_xenToolsUpdateSubActions = MockRepository.GenerateMock<IXenToolsUpdateSubActions>();
_serviceRestarter = _mockRepo.StrictMock<IServiceRestarter>();
_agentUpdateMessageHandler = new AgentUpdateMessageHandler();

_logger.Stub(x => x.Log(Arg<string>.Is.Anything));

_xentoolsUpdate = new XentoolsUpdate(_sleeper, _downloader, _checksumValidator, _unzipper, _installer, _finalizer, _serviceRestarter, _connectionChecker, _agentUpdateMessageHandler, _logger);
_xentoolsUpdate = new XentoolsUpdate(_sleeper, _downloader, _checksumValidator, _unzipper, _installer, _finalizer, _serviceRestarter, _connectionChecker, _agentUpdateMessageHandler, _logger, _xenToolsUpdateSubActions);

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
[assembly: AssemblyCompany("Rackspace Cloud")]
[assembly: AssemblyProduct("Rackspace Cloud Server Agent")]
[assembly: AssemblyCopyright("Copyright (c) 2009 2010 2011, Rackspace Cloud. All Rights Reserved")]
[assembly: AssemblyVersion("1.3.0.3")]
[assembly: AssemblyVersion("1.3.1.0")]

101 changes: 101 additions & 0 deletions src/Rackspace.Cloud.Server.Agent/Actions/XenToolsUpdateActions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Text;
using Rackspace.Cloud.Server.Agent.Configuration;
using Rackspace.Cloud.Server.Agent.Interfaces;
using Rackspace.Cloud.Server.Agent.Utilities;
using Rackspace.Cloud.Server.Common.Logging;

namespace Rackspace.Cloud.Server.Agent.Actions
{
public interface IXenToolsUpdateActions
{
void ProcessXenToolsPostUpgradeActions();
}

public class XenToolsUpdateActions : IXenToolsUpdateActions
{
private readonly ILogger _logger;
private readonly IXenToolsUpdateSubActions _xenToolsUpdateSubActions;
private readonly ICommandFactory _factory;

public XenToolsUpdateActions(ILogger logger, IXenToolsUpdateSubActions xenToolsUpdateSubActions, ICommandFactory commandFactory)
{
_logger = logger;
_xenToolsUpdateSubActions = xenToolsUpdateSubActions;
_factory = commandFactory;
}


public void ProcessXenToolsPostUpgradeActions()
{
if (_xenToolsUpdateSubActions.IsXenToolsUpdateSignalPresent())
{
_logger.Log("Xen Tools update signal was detected");
if (XenStoreWmi.IsWmiEnabled())
{
_logger.Log("Xen Store WMI Interface successfully detected, running resetnetwork");
if (RunResetNetworkCommand())
{
_logger.Log("Reset Netowrk successfully executed");
if (_xenToolsUpdateSubActions.RemoveXenToolsUpdateSignal())
{
_logger.Log("Xen Tools update signal successfully removed");
}
else
{
_logger.Log("Error removing Xen Tools update signal, please manually remove before reboot..");
_logger.Log(Constants.RackspaceRegKey);
_logger.Log(Constants.XenToolsUpdateSignalKey);
}
}
else
{
_logger.Log("Error running reset-network for post Xen Tools Upgrade process, will retry at next service startup");
}
}
else
{
_logger.Log("WMI is not active yet, not processing Xen Tools Post Upgrade Command");
}
}
else
{
_logger.Log("Xen Tools update signal is not present");
}
}

public bool RunResetNetworkCommand()
{
var success = false;

try
{
var executableCommand = _factory.CreateCommand("resetnetwork");
var executableResult = executableCommand.Execute("nohostname");
_logger.Log(executableResult.Output.Value());
success = true;
}
catch (InvalidCommandException exception)
{
_logger.Log(exception.Message);
}
catch (UnsuccessfulCommandExecutionException exception)
{
var result = (ExecutableResult)exception.Data["result"];
var output = "";
var error = "";
if (result.Output != null && !string.IsNullOrEmpty(result.Output.Value()))
output = ", Output:" + result.Output.Value();
if (result.Error != null && !string.IsNullOrEmpty(result.Error.Value()))
error = ", Error:" + result.Error.Value();

_logger.Log(string.Format("{0}{1}{2}", exception.Message, output, error));

}

return success;
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using Rackspace.Cloud.Server.Common.Logging;

namespace Rackspace.Cloud.Server.Agent.Actions
{
public interface IXenToolsUpdateSubActions
{
bool IsXenToolsUpdateSignalPresent();
bool RemoveXenToolsUpdateSignal();
bool WriteXenToolsUpdateSignal();
}

public class XenToolsUpdateSubActions : IXenToolsUpdateSubActions
{
private readonly ILogger _logger;

public XenToolsUpdateSubActions(ILogger logger)
{
_logger = logger;
}

public bool IsXenToolsUpdateSignalPresent()
{
using (var rk = Registry.LocalMachine.OpenSubKey(Constants.RackspaceRegKey))
{
if (rk != null)
{
var signal = rk.GetValue(Constants.XenToolsUpdateSignalKey);

if (signal != null)
{
return true;
}
}
}

return false;
}

public bool RemoveXenToolsUpdateSignal()
{
try
{
using (var rk = Registry.LocalMachine.OpenSubKey(Constants.RackspaceRegKey, true))
{
if (rk != null)
{
rk.DeleteValue(Constants.XenToolsUpdateSignalKey);
}
}

return true;
}
catch (Exception ex)
{
_logger.Log(ex.ToString());
return false;
}
}

public bool WriteXenToolsUpdateSignal()
{
try
{
using (var rsrk = Registry.LocalMachine.CreateSubKey(Constants.RackspaceRegKey))
{
if (rsrk != null)
{
rsrk.SetValue(Constants.XenToolsUpdateSignalKey, "True");
}
else
{
return false;
}
}

return true;
}
catch (Exception ex)
{
_logger.Log(ex.ToString());
return false;
}
}

}
}
12 changes: 8 additions & 4 deletions src/Rackspace.Cloud.Server.Agent/Commands/ResetNetwork.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,14 @@ public ExecutableResult Execute(string keyValue)
var userMetadata = _xenUserMetadata.GetKeys();
_setProviderData.Execute(providerData, userMetadata);

var hostname = _xenStore.ReadVmData("hostname");
var hostnameResult = _setHostname.SetHostname(hostname);

return new ExecutableResult() { ExitCode = hostnameResult };
if (string.IsNullOrEmpty(keyValue) || !keyValue.StartsWith("nohostname"))
{
var hostname = _xenStore.ReadVmData("hostname");
var hostnameResult = _setHostname.SetHostname(hostname);
return new ExecutableResult() { ExitCode = hostnameResult };
}

return new ExecutableResult() { ExitCode = "0" };
}
}
}
60 changes: 45 additions & 15 deletions src/Rackspace.Cloud.Server.Agent/Commands/XentoolsUpdate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ public class XentoolsUpdate : IExecutableCommand
private readonly IServiceRestarter _serviceRestarter;
private readonly IConnectionChecker _connectionChecker;
private readonly IAgentUpdateMessageHandler _agentUpdateMessageHandler;
private readonly ILogger _logger;

public XentoolsUpdate(ISleeper sleeper, IDownloader downloader, IChecksumValidator checksumValidator, IUnzipper unzipper, IInstaller installer, IFinalizer finalizer, IServiceRestarter _serviceRestarter,IConnectionChecker connectionChecker, IAgentUpdateMessageHandler agentUpdateMessageHandler, ILogger logger)
private readonly ILogger _logger;
private readonly IXenToolsUpdateSubActions _xenToolsUpdateSubActions;

public XentoolsUpdate(ISleeper sleeper, IDownloader downloader, IChecksumValidator checksumValidator, IUnzipper unzipper, IInstaller installer, IFinalizer finalizer, IServiceRestarter _serviceRestarter,IConnectionChecker connectionChecker, IAgentUpdateMessageHandler agentUpdateMessageHandler, ILogger logger, IXenToolsUpdateSubActions xenToolsUpdateSubActions)
{
_sleeper = sleeper;
_downloader = downloader;
Expand All @@ -49,7 +50,8 @@ public XentoolsUpdate(ISleeper sleeper, IDownloader downloader, IChecksumValidat
this._serviceRestarter = _serviceRestarter;
_connectionChecker = connectionChecker;
_agentUpdateMessageHandler = agentUpdateMessageHandler;
_logger = logger;
_logger = logger;
_xenToolsUpdateSubActions = xenToolsUpdateSubActions;
}

public ExecutableResult Execute(string value)
Expand All @@ -60,17 +62,20 @@ public ExecutableResult Execute(string value)
_logger.Log(String.Format("XenTools Update value: {0}\r\nWill resume in 60 seconds", value));
_sleeper.Sleep(60);
var agentUpdateInfo = _agentUpdateMessageHandler.Handle(value);
_finalizer.Finalize(new List<string> { Constants.XenToolsUnzipPath, Constants.XenToolsReleasePackage });
_downloader.Download(agentUpdateInfo.url, Constants.XenToolsReleasePackage);
_checksumValidator.Validate(agentUpdateInfo.signature, Constants.XenToolsReleasePackage);
_unzipper.Unzip(Constants.XenToolsReleasePackage, Constants.XenToolsUnzipPath, "");
_installer.Install(new Dictionary<string, string>
{
{Constants.XenToolsSetupExecutablePath,
String.Format("/S /norestart /D={0}", Constants.XenToolsPath)}
});
_serviceRestarter.Restart("xensvc");
if (_serviceRestarter.ServiceExists("XenServerVssProvider"))
_serviceRestarter.Restart("XenServerVssProvider");
_unzipper.Unzip(Constants.XenToolsReleasePackage, Constants.XenToolsUnzipPath, "");

if (IsCustomPackage())
{
RunCustomPackage();
}
else
{
RunLegacyUpdate();
}

return new ExecutableResult();
}
catch (Exception ex)
Expand All @@ -80,9 +85,34 @@ public ExecutableResult Execute(string value)
}
finally
{
Statics.ShouldPollXenStore = true;
_finalizer.Finalize(new List<string>{Constants.XenToolsUnzipPath,Constants.XenToolsReleasePackage});
Statics.ShouldPollXenStore = true;
}
}

public void RunLegacyUpdate()
{
_installer.Install(new Dictionary<string, string>
{
{Constants.XenToolsSetupExecutablePath,
String.Format("/S /norestart /D={0}", Constants.XenToolsPath)}
});
_serviceRestarter.Restart("xensvc");
if (_serviceRestarter.ServiceExists("XenServerVssProvider"))
_serviceRestarter.Restart("XenServerVssProvider");
}

public void RunCustomPackage()
{
_xenToolsUpdateSubActions.WriteXenToolsUpdateSignal();
_installer.Install(new Dictionary<string, string>
{
{Constants.XenToolsSetupScriptPath, ""}
});
}

public bool IsCustomPackage()
{
return System.IO.File.Exists(Constants.XenToolsSetupScriptPath);
}
}
}
Loading

0 comments on commit 0ed6ff2

Please sign in to comment.