Ejemplo n.º 1
0
        public async Task <GameState> Start(GamespaceSpec spec)
        {
            var result = await Client.PostAsync("gamespace", Json(spec));

            if (!result.IsSuccessStatusCode)
            {
                throw new Exception();
            }

            string data = await result.Content.ReadAsStringAsync();

            var game = JsonConvert.DeserializeObject <GameState>(data);


            if (spec.AppendMarkdown)
            {
                try
                {
                    string mdText = "> Gamespace Resources: " + String.Join(" | ", game.Vms.Select(v => $"[{v.Name}](/console/{v.Id}/{v.Name}/{spec.IsolationId})"));

                    data = await Client.GetStringAsync(game.WorkspaceDocument);

                    mdText += "\n\n" + data;

                    game.Markdown = mdText;
                }
                catch
                {
                }
            }

            return(game);
        }
Ejemplo n.º 2
0
        public async Task <GameState> Start(GamespaceSpec spec)
        {
            var result = await Client.PostAsync("gamespace", Json(spec));

            if (!result.IsSuccessStatusCode)
            {
                throw new Exception();
            }

            string data = await result.Content.ReadAsStringAsync();

            var game = JsonConvert.DeserializeObject <GameState>(data);


            if (spec.AppendMarkdown)
            {
                try
                {
                    data = await Client.GetStringAsync(game.WorkspaceDocument);

                    game.Markdown = data;
                }
                catch
                {
                }
            }

            return(game);
        }
Ejemplo n.º 3
0
        public async Task <GameState> Launch(GamespaceSpec spec)
        {
            var game = await _gamespaceStore.Load(spec.IsolationId);

            if (game == null)
            {
                var workspace = await _workspaceStore.Load(spec.WorkspaceId);

                if (workspace == null || !workspace.HasScope(Client.Scope))
                {
                    _logger.LogInformation($"No audience match for workspace {spec?.WorkspaceId}: [{workspace?.Audience}] [{Client?.Scope}]");
                    throw new InvalidOperationException();
                }

                game = new Data.Gamespace
                {
                    GlobalId  = spec.IsolationId,
                    Name      = workspace.Name,
                    Workspace = workspace,
                    Audience  = Client.Id.Untagged()
                                // ShareCode = Guid.NewGuid().ToString("N")
                };

                await _gamespaceStore.Add(game);
            }

            return(await Deploy(await _gamespaceStore.Load(game.Id), spec));
        }
Ejemplo n.º 4
0
        private void ApplyIso(ICollection <ConvergedTemplate> templates, GamespaceSpec spec)
        {
            if (string.IsNullOrEmpty(spec.Iso))
            {
                return;
            }

            string[] targets = spec.IsoTarget?.Split(' ', StringSplitOptions.RemoveEmptyEntries) ?? new string[] {};

            foreach (var template in templates.Where(t => string.IsNullOrEmpty(t.Iso)))
            {
                if (targets.Length > 0 && !targets.Contains(template.Name))
                {
                    continue;
                }

                var vmspec = spec.Vms.FirstOrDefault(v => v.Name == template.Name);

                if (vmspec != null && vmspec.SkipIso)
                {
                    continue;
                }

                template.Iso = $"{_pod.Options.IsoStore}/{_options.GameEngineIsoFolder}/{spec.Iso}";
            }
        }
Ejemplo n.º 5
0
        // private async Task AddNetworkServer(ICollection<ConvergedTemplate> templates, GamespaceSpec spec)
        // {
        //     if (spec.Network == null)
        //         return;

        //     var settings = new KeyValuePair<string,string>[]
        //     {
        //         new KeyValuePair<string,string>("newip", spec.Network.IpAddress),
        //         new KeyValuePair<string,string>("hosts", String.Join(";", spec.Network.HostFileEntries)),
        //         new KeyValuePair<string,string>("dhcp", String.Join(";", spec.Network.Dnsmasq))
        //     };

        //     var netServerTemplateEntity = await _templateStore.Load(_options.NetworkHostTemplateId);

        //     if (netServerTemplateEntity != null)
        //     {
        //         var netServerTemplate = Mapper.Map<ConvergedTemplate>(netServerTemplateEntity);

        //         netServerTemplate.AddSettings(settings);

        //         templates.Add(netServerTemplate);
        //     }
        // }

        private void ExpandTemplates(ICollection <ConvergedTemplate> templates, GamespaceSpec spec)
        {
            foreach (var t in templates.ToList())
            {
                var vmspec = spec.Vms?.SingleOrDefault(v => v.Name == t.Name);

                if (vmspec == null || vmspec.Replicas < 2)
                {
                    continue;
                }

                int total = Math.Min(vmspec.Replicas, _options.ReplicaLimit);

                for (int i = 1; i < total; i++)
                {
                    var tt = t.Clone <ConvergedTemplate>();

                    tt.Name += $"_{i}";

                    templates.Add(tt);
                }

                t.Name += "_0";
            }
        }
Ejemplo n.º 6
0
        public async Task <ActionResult <GameState> > Launch([FromBody] GamespaceSpec model)
        {
            var result = await _engineService.Launch(model);

            Log("launched", result);

            return(Ok(result));
        }
Ejemplo n.º 7
0
        private async Task <GameState> Deploy(Data.Gamespace gamespace, GamespaceSpec spec)
        {
            var deployTasks = new List <Task <Vm> >();

            try
            {
                var templates = String.IsNullOrEmpty(spec.Templates)
                    ? Mapper.Map <List <ConvergedTemplate> >(gamespace.Workspace.Templates)
                    : JsonSerializer.Deserialize <List <ConvergedTemplate> >(spec.Templates);

                ApplyIso(templates, spec);

                ExpandTemplates(templates, spec);

                // await AddNetworkServer(templates, spec);

                foreach (var template in templates)
                {
                    var virtualTemplate = template.ToVirtualTemplate(gamespace.GlobalId);

                    if (spec.HostAffinity)
                    {
                        virtualTemplate.AutoStart = false;
                    }

                    deployTasks.Add(_pod.Deploy(virtualTemplate));
                }

                Task.WaitAll(deployTasks.ToArray());

                if (spec.HostAffinity)
                {
                    await _pod.SetAffinity(gamespace.GlobalId, deployTasks.Select(t => t.Result).ToArray(), true);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error deploying Engine mojo");

                throw ex;
            }

            return(await LoadState(gamespace, gamespace.WorkspaceId));
        }
Ejemplo n.º 8
0
        public async Task <GameState> Start(GamespaceSpec spec)
        {
            await Task.Delay(0);

            return(new GameState
            {
                Id = 1,
                Name = "Mock Gamespace",
                GlobalId = spec.IsolationId,
                Vms = new VmState[]
                {
                    new VmState
                    {
                        Id = Guid.NewGuid().ToString(),
                        Name = "mock-vm",
                        TemplateId = 1,
                        IsRunning = true
                    }
                }
            });
        }
Ejemplo n.º 9
0
        public async Task <string> Start(string isolationTag, GamespaceSpec spec)
        {
            string mdText = "";

            var model = new NewGamespace
            {
                Id        = isolationTag,
                Workspace = spec
            };

            var result = await Client.PostAsync("gamespace", Json(model));

            if (result.IsSuccessStatusCode)
            {
                string data = await result.Content.ReadAsStringAsync();

                var game = JsonConvert.DeserializeObject <GameState>(data);

                mdText = "> Gamespace Resources: " + String.Join(" | ", game.Vms.Select(v => $"[{v.Name}](/console/{v.Id}/{v.Name}/{isolationTag})"));

                if (spec.AppendMarkdown)
                {
                    try
                    {
                        data = await Client.GetStringAsync(game.WorkspaceDocument);

                        mdText += "\n\n" + data;
                    }
                    catch
                    {
                    }
                }
            }

            return(mdText);
        }
Ejemplo n.º 10
0
        public async Task <string> Start(string problemId, GamespaceSpec workspace)
        {
            await Task.Delay(0);

            return("mock gamespace markdown document");
        }