private static Session OpenSessionAndLogin(ServerInfo hostInfo) { //Session session = new Session(string.Format("https://{0}", hostInfo.Hostname)); Session session = SessionFactory.CreateSession(hostInfo.Hostname); string version = Helper.APIVersionString(API_Version.API_2_5); string originator = "Conversion"; try { session.login_with_password(hostInfo.Username, hostInfo.Password, version, originator); } catch (Failure failure) { if (failure.ErrorDescription[0] != "HOST_IS_SLAVE") { throw; } //session = new Session(string.Format("https://{0}", failure.ErrorDescription[1])); session = SessionFactory.CreateSession(failure.ErrorDescription[1]); session.login_with_password(hostInfo.Username, hostInfo.Password, version, originator); return(session); } return(session); }
public void updateHealthCheckSettings(bool success, DateTime time, string uploadUuid = "") { Session session = new Session(connection.Hostname, 80); session.login_with_password(connection.Username, connection.Password, Helper.APIVersionString(API_Version.LATEST), Session.UserAgent); connection.LoadCache(session); // Round-trip format time DateTime rtime = DateTime.SpecifyKind(time, DateTimeKind.Utc); string stime = HealthCheckSettings.DateTimeToString(rtime); // record upload_uuid, // release the lock, // set the time of LAST_SUCCESSFUL_UPLOAD or LAST_FAILED_UPLOAD Dictionary <string, string> config = Pool.get_health_check_config(session, connection.Cache.Pools[0].opaque_ref); config[HealthCheckSettings.UPLOAD_LOCK] = ""; if (success) { config[HealthCheckSettings.LAST_SUCCESSFUL_UPLOAD] = stime; config[HealthCheckSettings.UPLOAD_UUID] = uploadUuid; // reset the NEW_UPLOAD_REQUEST field, if the current successful upload was started after the request DateTime newUploadRequestTime; if (HealthCheckSettings.TryParseStringToDateTime(config[HealthCheckSettings.NEW_UPLOAD_REQUEST], out newUploadRequestTime)) { if (rtime > newUploadRequestTime) { config[HealthCheckSettings.NEW_UPLOAD_REQUEST] = ""; } } } else { config[HealthCheckSettings.LAST_FAILED_UPLOAD] = stime; } Pool.set_health_check_config(session, connection.Cache.Pools[0].opaque_ref, config); if (session != null) { session.logout(); } session = null; }
public void runUpload(System.Threading.CancellationToken serviceStop) { DateTime startTime = DateTime.UtcNow; string uploadToken = ""; Session session = new Session(connection.Hostname, 80); session.APIVersion = API_Version.LATEST; try { session.login_with_password(connection.Username, connection.Password, Helper.APIVersionString(API_Version.LATEST), Session.UserAgent); connection.LoadCache(session); var pool = Helpers.GetPoolOfOne(connection); if (pool != null) { try { string opaqueref = Secret.get_by_uuid(session, pool.HealthCheckSettings.UploadTokenSecretUuid); uploadToken = Secret.get_value(session, opaqueref); } catch (Exception e) { log.Error("Exception getting the upload token from the xapi secret", e); uploadToken = null; } } if (string.IsNullOrEmpty(uploadToken)) { if (session != null) { session.logout(); } session = null; log.ErrorFormat("The upload token is not retrieved for {0}", connection.Hostname); updateHealthCheckSettings(false, startTime); server.task = null; ServerListHelper.instance.UpdateServerInfo(server); return; } } catch (Exception e) { if (session != null) { session.logout(); } session = null; log.Error(e, e); updateHealthCheckSettings(false, startTime); server.task = null; ServerListHelper.instance.UpdateServerInfo(server); return; } try { CancellationTokenSource cts = new CancellationTokenSource(); Func <string> upload = delegate() { try { return(bundleUpload(connection, session, uploadToken, cts.Token)); } catch (OperationCanceledException) { return(""); } }; System.Threading.Tasks.Task <string> task = new System.Threading.Tasks.Task <string>(upload); task.Start(); // Check if the task runs to completion before timeout. for (int i = 0; i < TIMEOUT; i += INTERVAL) { // If the task finishes, set HealthCheckSettings accordingly. if (task.IsCompleted || task.IsCanceled || task.IsFaulted) { if (task.Status == System.Threading.Tasks.TaskStatus.RanToCompletion) { string upload_uuid = task.Result; if (!string.IsNullOrEmpty(upload_uuid)) { updateHealthCheckSettings(true, startTime, upload_uuid); } else { updateHealthCheckSettings(false, startTime); } } else { updateHealthCheckSettings(false, startTime); } server.task = null; ServerListHelper.instance.UpdateServerInfo(server); return; } // If the main thread (XenServerHealthCheckService) stops, // set the cancel token to notify the working task to return. if (serviceStop.IsCancellationRequested) { cts.Cancel(); updateHealthCheckSettings(false, startTime); task.Wait(); server.task = null; ServerListHelper.instance.UpdateServerInfo(server); return; } System.Threading.Thread.Sleep(INTERVAL); } // The task has run for 24h, cancel the task and mark it as a failure upload. cts.Cancel(); updateHealthCheckSettings(false, startTime); task.Wait(); server.task = null; ServerListHelper.instance.UpdateServerInfo(server); return; } catch (Exception e) { if (session != null) { session.logout(); } session = null; log.Error(e, e); server.task = null; ServerListHelper.instance.UpdateServerInfo(server); } }
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args) { log.Info("XenServer Health Check Service start to refresh uploading tasks"); //We need to check if CIS can be accessed in current enviroment List <ServerInfo> servers = ServerListHelper.instance.GetServerList(); foreach (ServerInfo server in servers) { if (server.task != null && (!server.task.IsCompleted || !server.task.IsCanceled || !server.task.IsFaulted)) { continue; } bool needReconnect = false; log.InfoFormat("Check server {0} with user {1}", server.HostName, server.UserName); Session session = new Session(server.HostName, 80); session.APIVersion = API_Version.LATEST; try { session.login_with_password(server.UserName, server.Password, Helper.APIVersionString(API_Version.LATEST), Session.UserAgent); } catch (Exception exn) { if (exn is Failure && ((Failure)exn).ErrorDescription[0] == Failure.HOST_IS_SLAVE) { string masterName = ((Failure)exn).ErrorDescription[1]; if (ServerListHelper.instance.UpdateServerCredential(server, masterName)) { log.InfoFormat("Refresh credential to master {0} need refresh connection", masterName); server.HostName = masterName; needReconnect = true; } else { log.InfoFormat("Remove credential since it is the slave of master {0}", masterName); if (session != null) { session.logout(); } log.Error(exn, exn); continue; } } else { if (session != null) { session.logout(); } log.Error(exn, exn); continue; } } try { if (needReconnect) { if (session != null) { session.logout(); } log.InfoFormat("Reconnect to master {0}", server.HostName); session = new Session(server.HostName, 80); session.APIVersion = API_Version.LATEST; session.login_with_password(server.UserName, server.Password, Helper.APIVersionString(API_Version.LATEST), Session.UserAgent); } XenConnection connectionInfo = new XenConnection(); connectionInfo.Hostname = server.HostName; connectionInfo.Username = server.UserName; connectionInfo.Password = server.Password; connectionInfo.LoadCache(session); if (RequestUploadTask.Request(connectionInfo, session) || RequestUploadTask.OnDemandRequest(connectionInfo, session)) { // Create a task to collect server status report and upload to CIS server log.InfoFormat("Start to upload server status report for XenServer {0}", connectionInfo.Hostname); XenServerHealthCheckBundleUpload upload = new XenServerHealthCheckBundleUpload(connectionInfo); Action uploadAction = delegate() { upload.runUpload(cts.Token); }; System.Threading.Tasks.Task task = new System.Threading.Tasks.Task(uploadAction); task.Start(); server.task = task; ServerListHelper.instance.UpdateServerInfo(server); } session.logout(); session = null; } catch (Exception exn) { if (session != null) { session.logout(); } log.Error(exn, exn); } } }