/// <summary> /// Sends a heartbeat payload with detailed platform information for processing by a listening CAST Server. /// </summary> public void SendHeartbeat() { using (Profiler.Measure("CastService.SendHeartbeat")) { if (!GetIsCastConfigured()) { return; } using (new SecurityBypassContext()) { var dbSettings = ConfigurationSettings.GetDatabaseConfigurationSection().ConnectionSettings; var dbInfo = DatabaseConfigurationHelper.Convert(dbSettings); var tenants = new TenantList(TenantService.GetTenants()); var apps = ApplicationService.GetApps().ToList(); var hostname = Dns.GetHostName(); var domainname = IPGlobalProperties.GetIPGlobalProperties().DomainName; var pi = new RemotePlatformInfo { Id = GetDatabaseId(), Tenants = tenants, Apps = apps, FrontEndHost = hostname, FrontEndDomain = domainname, DatabaseServer = dbInfo.Server, Database = dbInfo.Database }; HeartbeatSender.Send(SpecialStrings.CastHeartbeatKey, pi, false); } } }
public IManagedPlatform CreateOrUpdate(RemotePlatformInfo pi) { using (Profiler.Measure("PlatformService.CreateOrUpdate")) { if (pi == null || string.IsNullOrEmpty(pi.Id)) { throw new ArgumentException("Platform information was invalid."); } var entities = new EntityCollection <IEntity>(); IManagedPlatform mp; try { mp = GetPlatformByDatabaseId(pi.Id); // load or create the platform instance mp = mp != null?mp.AsWritable <ManagedPlatform>() : Create(pi.Id); if (mp == null) { throw new Exception(string.Format("Failed to create or update info for the platform instance '{0}'.", pi.Id)); } mp.LastContact = DateTime.UtcNow; entities.Add(mp); var fe = UpdateFrontEnds(mp, pi.FrontEndHost, pi.FrontEndDomain, entities); mp.FrontEndHistory.Add(fe); var db = UpdateDatabases(mp, pi.Database, pi.DatabaseServer, entities); mp.DatabaseHistory.Add(db); var apps = GetApps().ToList(); var appVersions = UpdateAvailableApps(mp, pi.Apps, entities, apps); mp.AvailableAppVersions.AddRange(appVersions); var tenants = UpdateTenants(mp, pi.Tenants, entities, apps); mp.ContainsTenants.AddRange(tenants); } finally { CastEntityHelper.Save(entities); } return(mp); } }
/// <summary> /// Handles the receipt of a heartbeat message. /// </summary> /// <param name="pi">The platform information received.</param> private void HandleHeartbeat(RemotePlatformInfo pi) { if (!CastService.GetIsCastConfigured() || !CastService.GetIsCastServer()) { return; } using (new DeferredChannelMessageContext()) using (CastService.GetCastContext()) using (CastService.GetCastUser()) { PlatformService.CreateOrUpdate(pi); } }
public void TestCastCreateOrUpdate() { // Arrange var knownAppId = Guid.NewGuid(); var knownAppVersionId = Guid.NewGuid(); var availableVersion = "1.0"; var installedVersion = "2.0"; var ps = new PlatformService(); var pi = new RemotePlatformInfo { Id = TestPlatformId, FrontEndHost = "test", FrontEndDomain = "platform.co", Database = "db", DatabaseServer = "ds", Apps = new List <AvailableApplication> { new AvailableApplication { Name = "testapp", ApplicationId = Guid.NewGuid(), ApplicationVersionId = Guid.NewGuid() }, new AvailableApplication { Name = "knownapp", ApplicationId = knownAppId, ApplicationVersionId = knownAppVersionId, PackageVersion = availableVersion } }, Tenants = new TenantList { new RemoteTenantInfo { Name = "ttt", Apps = new List <InstalledApplication> { new InstalledApplication { Name = "testinstalled", ApplicationId = Guid.NewGuid(), ApplicationVersionId = Guid.NewGuid() }, new InstalledApplication { Name = "knowninstalled", ApplicationId = knownAppId, ApplicationVersionId = knownAppVersionId, PackageVersion = availableVersion, SolutionVersion = installedVersion } }, Users = new UserList { new RemoteUserInfo { Name = "alex", RemoteId = 1 } } } } }; // Act var p = ps.CreateOrUpdate(pi); // Assert p.Should().NotBeNull(); p.DatabaseId.Should().Be(TestPlatformId); p.FrontEndHistory.Should().NotBeNullOrEmpty().And.NotContainNulls(); var fe = p.FrontEndHistory.FirstOrDefault(f => f.Host == "test" && f.Domain == "platform.co"); fe.Should().NotBeNull(); p.DatabaseHistory.Should().NotBeNullOrEmpty().And.NotContainNulls(); var db = p.DatabaseHistory.FirstOrDefault(f => f.Catalog == "db" && f.Server == "ds"); db.Should().NotBeNull(); p.ContainsTenants.Should().NotBeNullOrEmpty().And.NotContainNulls(); p.ContainsTenants.Count.Should().Be(1); var tn = p.ContainsTenants.FirstOrDefault(t => t.Name == "ttt"); tn.Should().NotBeNull(); tn.HasAppsInstalled.Should().NotBeNullOrEmpty().And.NotContainNulls(); tn.HasAppsInstalled.Count.Should().Be(2); var ia = tn.HasAppsInstalled.FirstOrDefault(i => i.Name == "testinstalled"); ia.Should().NotBeNull(); ia = tn.HasAppsInstalled.FirstOrDefault(i => i.Name == "knowninstalled"); ia.Should().NotBeNull(); ia.Version.Should().Be("2.0"); tn.Users.Should().NotBeNullOrEmpty().And.NotContainNulls(); tn.Users.Count.Should().Be(1); var us = tn.Users.FirstOrDefault(u => u.Name == "alex"); us.Should().NotBeNull(); p.AvailableAppVersions.Should().NotBeNullOrEmpty().And.NotContainNulls(); p.AvailableAppVersions.Count.Should().Be(2); var ap = p.AvailableAppVersions.FirstOrDefault(a => a.Name == "testapp"); ap.Should().NotBeNull(); ap = p.AvailableAppVersions.FirstOrDefault(a => a.Name == "knownapp"); ap.Should().NotBeNull(); ap.Version.Should().Be("1.0"); var apps = Entity.GetInstancesOfType <ManagedApp>().ToList(); apps.Where(a => a.Name == "testapp").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "testinstalled").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "knownapp").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "knowninstalled").Select(a => a).Count().Should().Be(0); var pu = new RemotePlatformInfo { Id = TestPlatformId, FrontEndHost = "test2", FrontEndDomain = "platform.co", Database = "db", DatabaseServer = "ds", Apps = new List <AvailableApplication> { new AvailableApplication { Name = "testapp2", ApplicationId = Guid.NewGuid(), ApplicationVersionId = Guid.NewGuid() }, new AvailableApplication { Name = "knownapp", ApplicationId = knownAppId, ApplicationVersionId = knownAppVersionId, PackageVersion = availableVersion } }, Tenants = new TenantList { new RemoteTenantInfo { Name = "ttt", Apps = new List <InstalledApplication> { new InstalledApplication { Name = "testinstalled2", ApplicationId = Guid.NewGuid(), ApplicationVersionId = Guid.NewGuid() }, new InstalledApplication { Name = "knowninstalled", ApplicationId = knownAppId, ApplicationVersionId = knownAppVersionId, PackageVersion = availableVersion, SolutionVersion = installedVersion } }, Users = new UserList { new RemoteUserInfo { Name = "alex", RemoteId = 1 }, new RemoteUserInfo { Name = "gary", RemoteId = 2 } } } } }; var p2 = ps.CreateOrUpdate(pu); p2.Should().NotBeNull(); p2.DatabaseId.Should().Be(TestPlatformId); p2.FrontEndHistory.Should().NotBeNullOrEmpty().And.NotContainNulls(); p2.FrontEndHistory.Count.Should().Be(2); var fe2 = p2.FrontEndHistory.FirstOrDefault(f => f.Host == "test2" && f.Domain == "platform.co"); fe2.Should().NotBeNull(); fe2 = p2.FrontEndHistory.FirstOrDefault(f => f.Host == "test" && f.Domain == "platform.co"); fe2.Should().NotBeNull(); p2.DatabaseHistory.Should().NotBeNullOrEmpty().And.NotContainNulls(); p2.DatabaseHistory.Count.Should().Be(1); db = p2.DatabaseHistory.FirstOrDefault(f => f.Catalog == "db" && f.Server == "ds"); db.Should().NotBeNull(); p2.ContainsTenants.Should().NotBeNullOrEmpty().And.NotContainNulls(); p2.ContainsTenants.Count.Should().Be(1); tn = p2.ContainsTenants.FirstOrDefault(t => t.Name == "ttt"); tn.Should().NotBeNull(); tn.HasAppsInstalled.Should().NotBeNullOrEmpty().And.NotContainNulls(); tn.HasAppsInstalled.Count.Should().Be(2); ia = tn.HasAppsInstalled.FirstOrDefault(i => i.Name == "testinstalled2"); ia.Should().NotBeNull(); ia = tn.HasAppsInstalled.FirstOrDefault(i => i.Name == "knowninstalled"); ia.Should().NotBeNull(); ia.Version.Should().Be("2.0"); tn.Users.Should().NotBeNullOrEmpty().And.NotContainNulls(); tn.Users.Count.Should().Be(2); us = tn.Users.FirstOrDefault(u => u.Name == "gary"); us.Should().NotBeNull(); us = tn.Users.FirstOrDefault(u => u.Name == "alex"); us.Should().NotBeNull(); p.AvailableAppVersions.Should().NotBeNullOrEmpty().And.NotContainNulls(); p.AvailableAppVersions.Count.Should().Be(2); ap = p.AvailableAppVersions.FirstOrDefault(a => a.Name == "testapp2"); ap.Should().NotBeNull(); ap = p.AvailableAppVersions.FirstOrDefault(a => a.Name == "knownapp"); ap.Should().NotBeNull(); ap.Version.Should().Be("1.0"); apps = Entity.GetInstancesOfType <ManagedApp>().ToList(); apps.Where(a => a.Name == "testapp").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "testinstalled").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "testapp2").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "testinstalled2").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "knownapp").Select(a => a).Count().Should().Be(1); apps.Where(a => a.Name == "knowninstalled").Select(a => a).Count().Should().Be(0); }
public void TestCreateOrUpdate() { ManagedPlatform p = null; PlatformFrontEnd fe = null; PlatformDatabase db = null; try { // Arrange var ps = new PlatformService(); var pi = new RemotePlatformInfo { Id = TestPlatformId, FrontEndHost = "test", FrontEndDomain = "platform.co", Database = "db", DatabaseServer = "ds", Apps = new List <AvailableApplication>(), Tenants = new TenantList() }; var t = DateTime.UtcNow; // Act p = (ManagedPlatform)ps.CreateOrUpdate(pi); // Assert p.Should().NotBeNull(); p.DatabaseId.Should().Be(pi.Id); p.Name.Should().Be(pi.Id.ToLowerInvariant()); p.LastContact.Should().BeBefore(DateTime.UtcNow).And.BeAfter(t); p.ContainsTenants.Should().NotBeNull().And.BeEmpty(); p.AvailableAppVersions.Should().NotBeNull().And.BeEmpty(); p.FrontEndHistory.Should().NotBeNullOrEmpty(); p.FrontEndHistory.Count.Should().Be(1); fe = p.FrontEndHistory.First(); fe.Name.Should().Be("test.platform.co"); fe.Host.Should().Be("test"); fe.Domain.Should().Be("platform.co"); fe.LastContact.Should().BeBefore(DateTime.UtcNow).And.BeAfter(t); p.DatabaseHistory.Should().NotBeNullOrEmpty(); p.DatabaseHistory.Count.Should().Be(1); db = p.DatabaseHistory.First(); db.Name.Should().Be("ds (db)"); db.Catalog.Should().Be("db"); db.Server.Should().Be("ds"); db.LastContact.Should().BeBefore(DateTime.UtcNow).And.BeAfter(t); } finally { if (db != null) { Entity.Delete(db); } if (fe != null) { Entity.Delete(fe); } if (p != null) { Entity.Delete(p); } } }