Ejemplo n.º 1
0
        public async Task <IActionResult> Post(string tenantName)
        {
            //TODO validations

            ActorId actorId            = new ActorId(tenantName);
            ITenantWorkflowActor actor = ActorProxy.Create <ITenantWorkflowActor>(actorId, TenantHelpers.GetWorkflowActorUri());
            var status = await actor.Create(tenantName);

            return(Ok(status));
        }
Ejemplo n.º 2
0
        public async Task <Object> Get(string tenantName)
        {
            try
            {
                ActorId actorId            = new ActorId(tenantName);
                ITenantWorkflowActor actor = ActorProxy.Create <ITenantWorkflowActor>(actorId, TenantHelpers.GetWorkflowActorUri());
                var status = await actor.GetStatus();

                return(Ok(status));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Ejemplo n.º 3
0
        public async Task <bool> TryDequeueAndProcessAsync(CancellationToken cancellationToken)
        {
            var queue = await this.StateManager.GetTenantDeloymentsQueue();

            Stopwatch sw = Stopwatch.StartNew();

            using (ITransaction tx = this.StateManager.CreateTransaction())
            {
                ConditionalValue <TenantDeployment> workItem = await queue.TryDequeueAsync(tx, cancellationToken);

                if (!workItem.HasValue)
                {
                    ServiceEventSource.Current.ServiceMessage(this.Context, "No new application deployment requests.");
                    return(false);
                }

                TenantDeployment processedDeployment = await this.ProcessTenantDeploymentAsync(workItem.Value, cancellationToken);

                if (processedDeployment.CreationStatus == CreationStatus.Created)
                {
                    //Trigger workflow
                    ActorId actorId            = new ActorId(processedDeployment.Name);
                    ITenantWorkflowActor actor = ActorProxy.Create <ITenantWorkflowActor>(actorId, TenantHelpers.GetWorkflowActorUri());
                    await actor.InternalCreated(processedDeployment.InternalMineCraftEndpoint, processedDeployment.InternalRconEndpoint);

                    ServiceEventSource.Current.ServiceMessage(this.Context, "Application Created");
                }
                else
                {
                    // The deployment hasn't completed or failed, so queue up the next stage of deployment
                    await queue.EnqueueAsync(tx, workItem.Value, cancellationToken);

                    ServiceEventSource.Current.ServiceMessage(this.Context, "Application enqueed again");
                }

                await tx.CommitAsync();
            }

            return(true);
        }
Ejemplo n.º 4
0
        public async Task <Object> Get()
        {
            var applicationList = await fabricClient.QueryManager.GetApplicationPagedListAsync(new ApplicationQueryDescription()
            {
                ApplicationTypeNameFilter = "mcType"
            });

            var tenants = applicationList
                          .Select(x => new
            {
                Name      = x.ApplicationName,
                Status    = x.ApplicationStatus,
                Version   = x.ApplicationTypeVersion,
                Health    = x.HealthState,
                Endpoints = new Dictionary <string, string>(),
                Services  = new List <Service>()
            }).ToList();

            foreach (var tenant in tenants)
            {
                var tenantName = tenant.Name.ToString().GetName();

                ActorId actorId            = new ActorId(tenantName);
                ITenantWorkflowActor actor = ActorProxy.Create <ITenantWorkflowActor>(actorId, TenantHelpers.GetWorkflowActorUri());
                var status = await actor.GetStatus();

                if (!string.IsNullOrEmpty(status.InternalIp) && !String.IsNullOrEmpty(status.RconEndpoint))
                {
                    // ports on external ip will be same as the internal as it is configured now.
                    var mcEndpoint   = new Uri(status.InternalIp);
                    var rconEndpoint = new Uri(status.RconEndpoint);

                    tenant.Endpoints.Add("minecraft", $"{status.ExternalEndPoint}:{mcEndpoint.Port}");
                    tenant.Endpoints.Add("rcon", $"{status.ExternalEndPoint}:{rconEndpoint.Port}");
                }
            }

            return(tenants);
        }