Ejemplo n.º 1
0
        public void AddServiceToConfigAndStart(ServiceFormViewModel service)
        {
            var config = this.config.Get();

            var sqlDServiceModel = new SqlDServiceModel()
            {
                Name     = service.Name,
                Database = service.Database,
                Host     = service.Host,
                Port     = service.Port,
                Tags     = (service.Tags ?? string.Empty).Split(',').ToList(),
            };

            var registryEntryViewModels = service.Forwards.Where(x => x.Selected).ToList();

            if (registryEntryViewModels.Any())
            {
                sqlDServiceModel.ForwardingTo.AddRange(registryEntryViewModels.Select(y => new SqlDForwardingModel()
                {
                    Host = y.Host,
                    Port = y.Port
                }));
            }

            config.Services.Add(sqlDServiceModel);

            this.config.Set(config);

            SqlDStart.SqlDGo(typeof(ServiceService).Assembly, config);
        }
Ejemplo n.º 2
0
        private static void WaitUntilServiceIsUp(SqlDServiceModel service)
        {
            var wait = new ManualResetEvent(false);

            using (var endPointMonitor = new EndPointMonitor(service.ToEndPoint()))
            {
                endPointMonitor.OnUp += (args) =>
                {
                    Log.Out.Info($"Child process {service.Host}:{service.Port}/{service.Database} is up!");
                    wait.Set();
                };

                try
                {
                    Log.Out.Info($"Waiting {Constants.END_POINT_UP_WAIT_FOR_TIMEOUT.TotalSeconds}s for child process {service.Host}:{service.Port}/{service.Database}");
                    wait.WaitOne(Constants.END_POINT_UP_WAIT_FOR_TIMEOUT);

                    var client = SqlDStart.NewClient().ConnectedTo(service.ToEndPoint());
                    if (!client.Ping(service.ToEndPoint()))
                    {
                        throw new ProcessStartFailedException($"Failed to launch child process {service.Host}:{service.Port}/{service.Database}");
                    }
                }
                catch (Exception err)
                {
                    Log.Out.Error($"Failed to start {service.Host}:{service.Port}/{service.Database} as a separate process");
                    Log.Out.Error(err.ToString());
                }
            }
        }
Ejemplo n.º 3
0
        public static System.Diagnostics.Process Start(Assembly startAssembly, SqlDServiceModel service)
        {
            var executable       = string.Empty;
            var workingDirectory = string.Empty;
            var arguments        = ParseArguments(service);
            var baseDirectory    = startAssembly.GetDirectory();

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                var winRumtimeX64 = "win-x64";
                workingDirectory = Path.Combine(baseDirectory, "sql-d.start", winRumtimeX64).Replace("/", "\\");
                executable       = Path.Combine(workingDirectory, $"SqlD.Start.{winRumtimeX64}.exe").Replace("/", "\\");
                if (!File.Exists(executable))
                {
                    throw new Exception($"Could not find '{executable}'. Please install the NuGet 'sql-d.start.win-x64'.");
                }
            }

            if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            {
                var osxRuntimeX64 = "osx-x64";
                workingDirectory = Path.Combine(baseDirectory, "sql-d.start", osxRuntimeX64);
                executable       = Path.Combine(workingDirectory, $"SqlD.Start.{osxRuntimeX64}");
                Command.Launch("/bin/chmod", $"+x {executable}", workingDirectory);
                if (!File.Exists(executable))
                {
                    throw new Exception($"Could not find '{executable}'. Please install the NuGet 'sql-d.start.osx-x64'.");
                }
            }

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                var linuxRuntimex64 = "linux-x64";
                workingDirectory = Path.Combine(baseDirectory, "sql-d.start", linuxRuntimex64);
                executable       = Path.Combine(workingDirectory, $"SqlD.Start.{linuxRuntimex64}");
                Command.Launch("/bin/chmod", $"+x {executable}", workingDirectory);
                if (!File.Exists(executable))
                {
                    throw new Exception($"Could not find '{executable}'. Please install the NuGet 'sql-d.start.linux-x64'.");
                }
            }

            Log.Out.Info($"Starting child process {service.Host}:{service.Port}/{service.Database}");

            var process = Command.Launch(executable, arguments, baseDirectory);

            WaitUntilServiceIsUp(service);

            return(process);
        }
Ejemplo n.º 4
0
        private static string ParseArguments(SqlDServiceModel service)
        {
            var nameArgs = $"-n {service.Name}";
            var pragmaJournalModelArgs = $"-pj \"{service.Pragma.JournalMode}\"";
            var pragmaSynchronousArgs  = $"-ps \"{service.Pragma.Synchronous}\"";
            var pragmaTempStoreArgs    = $"-pt \"{service.Pragma.TempStore}\"";
            var pragmaLockingModeArgs  = $"-pl \"{service.Pragma.LockingMode}\"";
            var pragmaCountChangesArgs = $"-pc \"{service.Pragma.CountChanges}\"";
            var pragmaPageSizeArgs     = $"-pps \"{service.Pragma.PageSize}\"";
            var pragmaCacheSizeArgs    = $"-pcs \"{service.Pragma.CacheSize}\"";
            var pragmaQueryOnlyArgs    = $"-pqo \"{service.Pragma.QueryOnly}\"";

            var registryArgs        = new List <string>();
            var availableRegistries = Registry.Get();

            if (availableRegistries.Any())
            {
                foreach (var endPoint in availableRegistries)
                {
                    registryArgs.Add($"-r \"{endPoint.Host}:{endPoint.Port}\"");
                }
            }

            var forwardArgs = new List <string>();

            if (service.ForwardingTo.Any())
            {
                foreach (var forwardArg in service.ForwardingTo)
                {
                    forwardArgs.Add($"-f \"{forwardArg.Host}:{forwardArg.Port}\"");
                }
            }

            var tagArgs = new List <string>();

            if (service.Tags.Any())
            {
                foreach (var tagArg in service.Tags)
                {
                    tagArgs.Add($"-t \"{tagArg}\"");
                }
            }

            return($"{nameArgs} {pragmaPageSizeArgs} {pragmaCacheSizeArgs} {pragmaQueryOnlyArgs} {pragmaCountChangesArgs} {pragmaJournalModelArgs} {pragmaLockingModeArgs} {pragmaSynchronousArgs} {pragmaTempStoreArgs} {string.Join(" ", registryArgs)} -s \"{service.Host}:{service.Port}\" -d \"{service.Database}\" {string.Join(" ", forwardArgs)} {string.Join(" ", tagArgs)} -w");
        }
Ejemplo n.º 5
0
        public void ShouldBeAbleToLaunchServiceInASeparateProcess()
        {
            R.GetOrAdd(WellKnown.Listeners.AlphaListener.EndPoint);

            var service = new SqlDServiceModel()
            {
                Name     = "separate-process",
                Database = SqlDStart.NewId(),
                Port     = WellKnown.EndPoints.Free2.Port - 100,
                Host     = WellKnown.EndPoints.Free2.Host,
                Pragma   = SqlDPragmaModel.Default
            };

            using (var process = SqlD.Process.Service.Start(typeof(StartTests).Assembly, service))
            {
                var wait = new ManualResetEvent(false);
                using (var endPointMonitor = new EndPointMonitor(service.ToEndPoint()))
                {
                    endPointMonitor.OnUp += (args) => wait.Set();
                    wait.WaitOne(TimeSpan.FromSeconds(30));
                }
                process.Kill();
            }
        }