internal InsertInstanceEvent(LogRecord logRecord) : base(logRecord) { Debug.Assert(IsInsertInstanceEvent(logRecord)); var request = logRecord.ProtoPayload.Request; if (request != null) { var disks = request["disks"]; if (disks != null) { foreach (var disk in ((JArray)disks)) { if (disk["boot"] != null && (bool)disk["boot"]) { var initializeParams = disk["initializeParams"]; if (initializeParams != null) { this.Image = ImageLocator.FromString( initializeParams["sourceImage"].Value <string>()); } } } } } }
public void WhenCreatedFromPath_ThenToStringReturnsPath() { var path = "projects/project-1/global/images/image-1"; Assert.AreEqual( path, ImageLocator.FromString(path).ToString()); }
public void WhenPathInvalid_FromStringThrowsArgumentException() { Assert.Throws <ArgumentException>(() => ImageLocator.FromString( "projects/project-1/notglobal/images/image-1")); Assert.Throws <ArgumentException>(() => ImageLocator.FromString( "/project-1/global/images/image-1")); Assert.Throws <ArgumentException>(() => ImageLocator.FromString( "/")); }
public void WhenUsingBetaApi_FromStringReturnsObject() { var ref1 = ImageLocator.FromString( "https://compute.googleapis.com/compute/beta/projects/eip-images/global/images/debian-9-drawfork-v20191004"); Assert.AreEqual("images", ref1.ResourceType); Assert.AreEqual("debian-9-drawfork-v20191004", ref1.Name); Assert.AreEqual("eip-images", ref1.ProjectId); }
public void WhenQualifiedByGoogleapisHost_FromStringReturnsObject() { var ref1 = ImageLocator.FromString( "https://www.googleapis.com/compute/v1/projects/windows-cloud/global/images/windows-server-core"); Assert.AreEqual("images", ref1.ResourceType); Assert.AreEqual("windows-server-core", ref1.Name); Assert.AreEqual("windows-cloud", ref1.ProjectId); }
public void WhenQualifiedByComputeGoogleapisHost_FromStringReturnsObject() { var ref1 = ImageLocator.FromString( "https://compute.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9"); Assert.AreEqual("images", ref1.ResourceType); Assert.AreEqual("family/debian-9", ref1.Name); Assert.AreEqual("debian-cloud", ref1.ProjectId); }
public void WhenResourceNameCotainsSlash_FromStringReturnsObject() { var ref1 = ImageLocator.FromString( "projects/debian-cloud/global/images/family/debian-9"); Assert.AreEqual("images", ref1.ResourceType); Assert.AreEqual("family/debian-9", ref1.Name); Assert.AreEqual("debian-cloud", ref1.ProjectId); }
public void WhenPathIsValid_FromStringReturnsObject() { var ref1 = ImageLocator.FromString( "projects/project-1/global/images/image-1"); Assert.AreEqual("images", ref1.ResourceType); Assert.AreEqual("image-1", ref1.Name); Assert.AreEqual("project-1", ref1.ProjectId); }
public void WhenCreatedFromUrl_ThenToStringReturnsPath() { var path = "projects/project-1/global/images/image-1"; Assert.AreEqual( path, ImageLocator.FromString( "https://www.googleapis.com/compute/v1/" + path).ToString()); }
public void AddExistingInstances( IEnumerable <Instance> instances, IEnumerable <Disk> disks, string projectId) { using (TraceSources.IapDesktop.TraceMethod().WithParameters(projectId)) { // // NB. Instances.list returns the disks associated with each // instance, but lacks the information about the source image. // Therefore, we load disks first and then join the data. // var sourceImagesByDisk = disks .EnsureNotNull() .ToDictionary(d => d.SelfLink, d => d.SourceImage); TraceSources.IapDesktop.TraceVerbose("Found {0} existing disks", sourceImagesByDisk.Count()); TraceSources.IapDesktop.TraceVerbose("Found {0} existing instances", instances.Count()); foreach (var instance in instances) { TraceSources.IapDesktop.TraceVerbose("Adding {0}", instance.Id); var bootDiskUrl = instance.Disks .EnsureNotNull() .Where(d => d.Boot != null && d.Boot.Value) .EnsureNotNull() .Select(d => d.Source) .EnsureNotNull() .FirstOrDefault(); ImageLocator image = null; if (bootDiskUrl != null && sourceImagesByDisk.TryGetValue(bootDiskUrl, out string imageUrl) && imageUrl != null) { image = ImageLocator.FromString(imageUrl); } AddExistingInstance( (ulong)instance.Id.Value, new InstanceLocator( projectId, ShortZoneIdFromUrl(instance.Zone), instance.Name), image, instance.Status == "RUNNING" ? InstanceState.Running : InstanceState.Terminated, DateTime.Now, instance.Scheduling.NodeAffinities != null && instance.Scheduling.NodeAffinities.Any() ? Tenancies.SoleTenant : Tenancies.Fleet); } } }
public void WhenReadingSample3_ThenHistoryIsRestored() { var set = BuildHistoryFromResource("instance-3.json"); Assert.AreEqual(1, set.Instances.Count()); var instance = set.Instances.First(); Assert.AreEqual( ImageLocator.FromString("projects/project-1/global/images/windows-server"), instance.Image); Assert.AreEqual(2, instance.Placements.Count()); var firstPlacement = instance.Placements.First(); Assert.AreEqual("413db7b32a208e7ccb4ee62acedee725", firstPlacement.ServerId); Assert.AreEqual(Tenancies.SoleTenant, firstPlacement.Tenancy); // Insert.. Assert.AreEqual(DateTime.Parse("2020-05-05T08:31:40.864Z").ToUniversalTime(), firstPlacement.From); // ..till TerminateOnHostMaintenance. Assert.AreEqual(DateTime.Parse("2020-05-06T16:10:46.781Z").ToUniversalTime(), firstPlacement.To); var secondPlacement = instance.Placements.Last(); Assert.AreEqual("413db7b32a208e7ccb4ee62acedee725", secondPlacement.ServerId); Assert.AreEqual(Tenancies.SoleTenant, secondPlacement.Tenancy); // Insert.. Assert.AreEqual(DateTime.Parse("2020-05-06T16:36:01.441Z").ToUniversalTime(), secondPlacement.From); // ..till GuestTerminate. Assert.AreEqual(DateTime.Parse("2020-05-06T17:39:34.635Z").ToUniversalTime(), secondPlacement.To); }
public void WhenReadingSample2_ThenHistoryIsRestored() { var set = BuildHistoryFromResource("instance-2.json"); Assert.AreEqual(1, set.Instances.Count()); var instance = set.Instances.First(); Assert.AreEqual( ImageLocator.FromString("projects/windows-cloud/global/images/windows-server"), instance.Image); Assert.AreEqual(1, instance.Placements.Count()); var placement = instance.Placements.First(); Assert.AreEqual("15934ff9aee7d8c5719fad1053b7fc7d", placement.ServerId); Assert.AreEqual(Tenancies.SoleTenant, placement.Tenancy); // Insert.. Assert.AreEqual(DateTime.Parse("2020-05-06T14:57:46.557Z").ToUniversalTime(), placement.From); // ..till GuestTerminate. Assert.AreEqual(DateTime.Parse("2020-05-06T16:03:06.484Z").ToUniversalTime(), placement.To); }
public void AddExistingInstances( IEnumerable <Instance> instances, IEnumerable <NodeGroupNode> nodes, IEnumerable <Disk> disks, string projectId) { using (ApplicationTraceSources.Default.TraceMethod().WithParameters(projectId)) { // // NB. Instances.list returns the disks associated with each // instance, but lacks the information about the source image. // Therefore, we load disks first and then join the data. // var sourceImagesByDisk = disks .EnsureNotNull() .ToDictionary(d => d.SelfLink, d => d.SourceImage); ApplicationTraceSources.Default.TraceVerbose("Found {0} existing disks", sourceImagesByDisk.Count()); ApplicationTraceSources.Default.TraceVerbose("Found {0} existing instances", instances.Count()); foreach (var instance in instances) { ApplicationTraceSources.Default.TraceVerbose("Adding {0}", instance.Id); var bootDiskUrl = instance.Disks .EnsureNotNull() .Where(d => d.Boot != null && d.Boot.Value) .EnsureNotNull() .Select(d => d.Source) .EnsureNotNull() .FirstOrDefault(); ImageLocator image = null; if (bootDiskUrl != null && sourceImagesByDisk.TryGetValue(bootDiskUrl, out string imageUrl) && imageUrl != null) { image = ImageLocator.FromString(imageUrl); } var instanceLocator = new InstanceLocator( projectId, ShortZoneIdFromUrl(instance.Zone), instance.Name); if (instance.Scheduling.NodeAffinities != null && instance.Scheduling.NodeAffinities.Any()) { // This VM runs on a sole-tenant node. var node = nodes.FirstOrDefault(n => n.Instances .EnsureNotNull() .Select(uri => InstanceLocator.FromString(uri)) .Any(locator => locator == instanceLocator)); if (node == null) { ApplicationTraceSources.Default.TraceWarning( "Could not identify node {0} is scheduled on", instanceLocator); } AddExistingInstance( (ulong)instance.Id.Value, instanceLocator, image, instance.Status == "RUNNING" ? InstanceState.Running : InstanceState.Terminated, this.EndDate, Tenancies.SoleTenant, node?.ServerId, node?.NodeType != null ? NodeTypeLocator.FromString(node.NodeType) : null); } else { // Fleet VM. AddExistingInstance( (ulong)instance.Id.Value, instanceLocator, image, instance.Status == "RUNNING" ? InstanceState.Running : InstanceState.Terminated, this.EndDate, Tenancies.Fleet, null, null); } } } }
public void WhenPathLacksProject_FromStringThrowsArgumentException() { Assert.Throws <ArgumentException>(() => ImageLocator.FromString( "/project-1/project-1/global/images/image-1")); }