public bool Connect(string server, int port, string vm_uuid, string username, string password, int width, int height, bool show_border) { // reinitiailize the VNC Control initSubControl(width, height, true, show_border); m_vncClient.ErrorOccurred += ConnectionErrorHandler; try { // Create a new XenAPI session m_session = new Session(Session.STANDARD_TIMEOUT, server, port); // Authenticate with username and password passed in. // The third parameter tells the server which API version we support. m_session.login_with_password(username, password, API_Version.LATEST); m_vncPassword = password.ToCharArray(); // Find the VM in question XenRef <VM> vmRef = VM.get_by_uuid(m_session, vm_uuid); m_sourceVM = VM.get_record(m_session, vmRef); // Check if this VM is PV or HVM m_sourceIsPV = (m_sourceVM.PV_bootloader.Length != 0); /* No PV bootloader specified implies HVM */ // Get the console that uses the RFB (VNC) protocol List <XenRef <XenAPI.Console> > consoleRefs = VM.get_consoles(m_session, vmRef); XenAPI.Console console = null; foreach (XenRef <XenAPI.Console> consoleRef in consoleRefs) { console = XenAPI.Console.get_record(m_session, consoleRef); if (console.protocol == console_protocol.rfb) { break; } console = null; } if (console != null) { //ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToConsole), new KeyValuePair<VNCGraphicsClient, XenAPI.Console>(m_vncClient, console)); ConnectHostedConsole(m_vncClient, console, m_session.uuid); } // done with this session, log it out m_session.logout(); } catch (Exception exn) { // call the expcetion handler directly this.ConnectionErrorHandler(this, exn); } return(m_vncClient.Connected); }
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); 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 string bundleUpload(IXenConnection connection, Session session, string uploadToken, System.Threading.CancellationToken cancel) { // Collect the server status report and generate zip file to upload. XenServerHealthCheckBugTool bugTool = new XenServerHealthCheckBugTool(); try { bugTool.RunBugtool(connection, session); } catch (Exception e) { if (session != null) session.logout(); session = null; log.Error(e, e); return ""; } string bundleToUpload = bugTool.outputFile; if(string.IsNullOrEmpty(bundleToUpload) || !File.Exists(bundleToUpload)) { log.ErrorFormat("Server Status Report is NOT collected"); return ""; } // Upload the zip file to CIS uploading server. string upload_url = Registry.HealthCheckUploadDomainName; log.InfoFormat("Upload report to {0}", upload_url); XenServerHealthCheckUpload upload = new XenServerHealthCheckUpload(uploadToken, VERBOSITY_LEVEL, upload_url, connection); string upload_uuid = ""; try { upload_uuid = upload.UploadZip(bundleToUpload, cancel); } catch (Exception e) { if (session != null) session.logout(); session = null; log.Error(e, e); return ""; } if (File.Exists(bundleToUpload)) File.Delete(bundleToUpload); // Return the uuid of upload. if(string.IsNullOrEmpty(upload_uuid)) { // Fail to upload the zip to CIS server. log.ErrorFormat("Fail to upload the Server Status Report {0} to CIS server", bundleToUpload); return ""; } return upload_uuid; }
public void updateHealthCheckSettings(bool success, DateTime time, string uploadUuid = "") { Session session = new Session(connection.Hostname, 80); session.login_with_password(connection.Username, connection.Password); 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 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; } XenConnection connectionInfo = new XenConnection(); connectionInfo.Hostname = server.HostName; connectionInfo.Username = server.UserName; connectionInfo.Password = server.Password; log.InfoFormat("Check server {0} with user {1}", connectionInfo.Hostname, connectionInfo.Username); Session session = new Session(server.HostName, 80); session.APIVersion = API_Version.LATEST; try { session.login_with_password(server.UserName, 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); } } }
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); } } }
/// <summary> /// Try and run the delegate. /// If it fails with a web exception or invalid session, try again. /// Only retry 60 times. /// </summary> /// <param name="connection"></param> /// <param name="session"></param> /// <param name="f"></param> /// <param name="p"></param> /// <returns></returns> public static Object DoWithSessionRetry(IXenConnection connection, ref Session session, Delegate f, params object[] p) { int retries = 60; while (true) { try { object[] ps = new object[p.Length + 1]; ps[0] = session; for (int i = 0; i < p.Length; i++) { ps[i + 1] = p[i]; } try { return(f.DynamicInvoke(ps)); } catch (TargetInvocationException exn) { throw exn.InnerException; } } catch (WebException we) { log.ErrorFormat("WebException in DoWithSessionRetry, retry {0}", retries); log.Error(we, we); if (retries <= 0) { throw; } } catch (Failure failure) { log.ErrorFormat("Failure in DoWithSessionRetry, retry {0}", retries); log.Error(failure, failure); if (retries <= 0) { throw; } if (failure.ErrorDescription.Count < 1 || failure.ErrorDescription[0] != XenAPI.Failure.SESSION_INVALID) { throw; } } Session newSession = connection.DuplicateSession(); try { // Try and logout the old session using the new session newSession.logout(session.opaque_ref); } catch { } session = newSession; retries--; Thread.Sleep(connection.ExpectDisruption ? 500 : 100); } }
public void updateCallHomeSettings(bool success, DateTime time, string uploadUuid = "") { Session session = new Session(connection.Hostname, 80); session.login_with_password(connection.Username, connection.Password); connection.LoadCache(session); // Round-trip format time DateTime rtime = DateTime.SpecifyKind(time, DateTimeKind.Utc); string stime = CallHomeSettings.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[CallHomeSettings.UPLOAD_LOCK] = ""; if (success) { config[CallHomeSettings.LAST_SUCCESSFUL_UPLOAD] = stime; config[CallHomeSettings.UPLOAD_UUID] = uploadUuid; } else config[CallHomeSettings.LAST_FAILED_UPLOAD] = stime; Pool.set_health_check_config(session, connection.Cache.Pools[0].opaque_ref, config); if (session != null) session.logout(); session = null; }
/// <summary> /// /// </summary> /// <param name="text"></param> /// <param name="hosts"></param> /// <returns></returns> private void btnSnapshotRevert_Click(object sender, EventArgs e) { ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); }; ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00); string ipAddr = string.Empty; if (!string.IsNullOrEmpty(this.txtBxIPAddr.Text)) { ipAddr = this.txtBxIPAddr.Text; } else { ipAddr = string.Empty; } XenAPI.Session session = new XenAPI.Session(ipAddr, 443); session.login_with_password("root", "dpsvl123", "", "XenSDKSample"); var vmRecords = VM.get_all_records(session); var vmRef = (from KeyValuePair <XenRef <VM>, VM> kvp in vmRecords let theVm = kvp.Value where !theVm.is_a_template && !theVm.is_control_domain && theVm.name_label.ToLower().Contains("Window_7_64_M1".ToLower()) select kvp.Key).FirstOrDefault(); var vmRefValue = (from KeyValuePair <XenRef <VM>, VM> kvp in vmRecords let theVm = kvp.Value where !theVm.is_a_template && !theVm.is_control_domain && theVm.name_label.ToLower().Contains("window") select kvp.Value).FirstOrDefault(); var vmRefSnapShot = (from KeyValuePair <XenRef <VM>, VM> kvp in vmRecords let theVm = kvp.Value where !theVm.is_a_template && !theVm.is_control_domain && theVm.name_label.ToLower().Contains("inita") select kvp.Value).FirstOrDefault(); if (vmRef == null) { MessageBox.Show("Cannot find a halted linux VM. Please create one."); } VM vm = VM.get_record(session, vmRef); var snapshotRef = VM.get_snapshots(session, vmRef).FirstOrDefault(); //var snapshotUUID = VM.get_uuid(session, snapshotRef); //VM.destroy(session, snapshotRef); //MessageBox.Show("Here is the vm I destroyed! "); //var newVM = VM.snapshot(session, vmRef, "inita"); //VM vm = VM.get_record(session, newVM); //VM.shutdown(session, vmRef); //VM.start(session, vmRef, false, true); VM.revert(session, snapshotRef); //MessageBox.Show("The current state " + VM.get_power_state(session, vmRef)); VM.resume(session, vmRef, false, true); //VM.start(session, vmRef, false, true); //MessageBox.Show("The current state " + VM.get_power_state(session, vmRef)); //MessageBox.Show("Here is the vm I want to revert "+vm.name_label); //MessageBox.Show("Here is the vm I created" + vm.name_label); MessageBox.Show("Here is the vm I rebooted" + vm.name_label); session.logout(); //GC.SuppressFinalize(this); }
public bool Connect(string server, int port, string vm_uuid, string username, string password, int width, int height, bool show_border) { // reinitiailize the VNC Control initSubControl(width, height, true, show_border); m_vncClient.ErrorOccurred += ConnectionErrorHandler; try { // Create a new XenAPI session m_session = new Session(Session.STANDARD_TIMEOUT, server, port); // Authenticate with username and password passed in. // The third parameter tells the server which API version we support. m_session.login_with_password(username, password, API_Version.LATEST); m_vncPassword = password.ToCharArray(); // Find the VM in question XenRef<VM> vmRef = VM.get_by_uuid(m_session, vm_uuid); m_sourceVM = VM.get_record(m_session, vmRef); // Check if this VM is PV or HVM m_sourceIsPV = (m_sourceVM.PV_bootloader.Length != 0); /* No PV bootloader specified implies HVM */ // Get the console that uses the RFB (VNC) protocol List<XenRef<XenAPI.Console>> consoleRefs = VM.get_consoles(m_session, vmRef); XenAPI.Console console = null; foreach (XenRef<XenAPI.Console> consoleRef in consoleRefs) { console = XenAPI.Console.get_record(m_session, consoleRef); if (console.protocol == console_protocol.rfb) break; console = null; } if (console != null) //ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToConsole), new KeyValuePair<VNCGraphicsClient, XenAPI.Console>(m_vncClient, console)); ConnectHostedConsole(m_vncClient, console, m_session.uuid); // done with this session, log it out m_session.logout(); } catch (Exception exn) { // call the expcetion handler directly this.ConnectionErrorHandler(this, exn); } return m_vncClient.Connected; }