Ejemplo n.º 1
0
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        /// <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);
                    }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
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);
                }
            }
        }