public void willProvisionVM() { using (bladeDirectorDebugServices svc = new bladeDirectorDebugServices(basicBladeTests.WCFPath, basicBladeTests.WebURI)) { machinePools.bladeDirectorURL = svc.servicesURL; string hostip = "1.2.3.4"; // We will be using this blade for our tests. bladeSpec spec = svc.svcDebug.createBladeSpecForXDLNode(31, "xdl.hacks.the.planet", bladeLockType.lockAll, bladeLockType.lockAll); svc.svcDebug.initWithBladesFromBladeSpec(new[] { spec }, false, NASFaultInjectionPolicy.retunSuccessful); string debuggerHost = ipUtils.getBestRouteTo(IPAddress.Parse(spec.bladeIP)).ToString(); VMSoftwareSpec sw = new VMSoftwareSpec() { debuggerHost = debuggerHost, debuggerKey = "a.b.c.d", debuggerPort = 60234 }; VMHardwareSpec hw = new VMHardwareSpec() { cpuCount = 1, memoryMB = 4096 }; resultAndBladeName res = svc.svcDebug._requestAnySingleVM(hostip, hw, sw); testUtils.waitForSuccess(svc, res, TimeSpan.FromMinutes(15)); string VMName = res.bladeName; // Okay, we have our new VM allocated now. vmSpec createdBlade = svc.svc.getVMByIP_withoutLocking(VMName); bladeSpec parentBlade = svc.svc.getBladeByIP_withoutLocking(createdBlade.parentBladeIP); snapshotDetails snap = svc.svc.getCurrentSnapshotDetails(VMName); NASParams nas = svc.svc.getNASParams(); using (hypervisor_vmware_FreeNAS hyp = utils.createHypForVM(createdBlade, parentBlade, snap, nas)) { hyp.powerOn(new cancellableDateTime(TimeSpan.FromMinutes(2))); // Check that debugging has been provisioned correctly executionResult bcdEditRes = hyp.startExecutable("bcdedit", "/dbgsettings"); try { Assert.AreEqual(0, bcdEditRes.resultCode); Assert.IsTrue(Regex.IsMatch(bcdEditRes.stdout, "key\\s*a.b.c.d")); Assert.IsTrue(Regex.IsMatch(bcdEditRes.stdout, "debugtype\\s*NET")); Assert.IsTrue(Regex.IsMatch(bcdEditRes.stdout, "hostip\\s*" + hostip)); Assert.IsTrue(Regex.IsMatch(bcdEditRes.stdout, "port\\s*60234")); } catch (AssertFailedException) { Debug.WriteLine("bcdedit stdout " + bcdEditRes.stdout); Debug.WriteLine("bcdedit stderr " + bcdEditRes.stderr); throw; } executionResult wmicRes = hyp.startExecutable("wmic", "computersystem get totalPhysicalMemory,name,numberOfLogicalProcessors /format:value"); try { // We expect an response similar to: // // Name=ALIZANALYSIS // NumberOfLogicalProcessors=8 // TotalPhysicalMemory=17119825920 // Assert.AreEqual(0, wmicRes.resultCode); string[] lines = wmicRes.stdout.Split(new[] { '\n', 'r' }, StringSplitOptions.RemoveEmptyEntries); foreach (string line in lines) { if (line.Trim().Length == 0) { continue; } string[] parts = line.Split('='); string name = parts[0].ToLower().Trim(); string value = parts[1].ToLower().Trim(); switch (name) { case "name": Assert.AreEqual("VM_31_01", value, "Name is incorrect"); break; case "NumberOfLogicalProcessors": Assert.AreEqual("1", value, "CPU count is incorrect"); break; case "TotalPhysicalMemory": Assert.AreEqual((4096L * 1024L * 1024L).ToString(), value, "RAM size is incorrect"); break; default: break; } } } catch (AssertFailedException) { Debug.WriteLine("WMIC reported stdout '" + wmicRes.stdout + "'"); Debug.WriteLine("WMIC reported stderr '" + wmicRes.stderr + "'"); } } } }
public hypervisorCollection <hypSpec_vmware> requestVMs(VMSpec[] specs, bool allowPartialAllocation = false) { initialiseIfNeeded(); Stopwatch allocWatch = new Stopwatch(); using (BladeDirectorServices director = new BladeDirectorServices(machinePools.bladeDirectorURL)) { DateTime deadline = DateTime.Now + TimeSpan.FromMinutes(30); resultAndBladeName[] results = new resultAndBladeName[specs.Length]; for (int n = 0; n < specs.Length; n++) { results[n] = director.svc.RequestAnySingleVM(specs[n].hw, specs[n].sw); if (results[n].result.code == resultCode.bladeQueueFull) { if (allowPartialAllocation) { results[n] = null; break; } } if (results[n].result.code != resultCode.success && results[n].result.code != resultCode.pending) { throw new bladeAllocationException(results[n].result.code); } } hypervisorCollection <hypSpec_vmware> toRet = new hypervisorCollection <hypSpec_vmware>(); try { foreach (resultAndBladeName res in results) { if (res == null) { continue; } resultAndBladeName progress = director.waitForSuccessWithoutThrowing(res, deadline - DateTime.Now); if (progress == null) { throw new TimeoutException(); } if (progress.result.code == resultCode.bladeQueueFull) { if (allowPartialAllocation) { continue; } throw new Exception("Not enough blades available to accomodate new VMs"); } if (progress.result.code != resultCode.success) { if (allowPartialAllocation) { continue; } throw new Exception("Unexpected status while allocing: " + progress.result.code); } vmSpec vmSpec = director.svc.getVMByIP_withoutLocking(progress.bladeName); bladeSpec vmServerSpec = director.svc.getBladeByIP_withoutLocking(vmSpec.parentBladeIP); snapshotDetails snapshotInfo = director.svc.getCurrentSnapshotDetails(vmSpec.VMIP); NASParams nasParams = director.svc.getNASParams(); hypervisor_vmware_FreeNAS newVM = utils.createHypForVM(vmSpec, vmServerSpec, snapshotInfo, nasParams); ipUtils.ensurePortIsFree(vmSpec.kernelDebugPort); newVM.setDisposalCallback(onDestruction); if (!toRet.TryAdd(vmSpec.VMIP, newVM)) { throw new Exception(); } } } catch (Exception) { foreach (KeyValuePair <string, hypervisorWithSpec <hypSpec_vmware> > allocedBlades in toRet) { if (allocedBlades.Key != null) { try { director.svc.ReleaseBladeOrVM(allocedBlades.Key); } catch (Exception) { // ... } } } throw; } allocWatch.Stop(); Debug.WriteLine("Allocated all VMs, took " + allocWatch.Elapsed.ToString()); return(toRet); } }