Esempio n. 1
0
        public async Task SendNotificationAsync(string method, YDeploymentStatePayloadState state, YEngine engine, string message, Guid?callerUserId = default, object resource = null, bool addMembers = false)
        {
            var groupUsers = GetNotifiersGroup(engine, callerUserId, addMembers);

            List <string> groups = null;

            if (groupUsers != null)
            {
                groups = groupUsers.Select(guid => $"{engine.Id}-{guid}").ToList();
            }

            if (groups == null || groups.Count <= 0)
            {
                return;
            }

            var hubContext = await serviceManager.CreateHubContextAsync("JobHub").ConfigureAwait(false);

            var deployState = new YDeploymentStatePayload(state)
            {
                Id      = engine.Id,
                Message = message
            };

            if (resource != null)
            {
                await hubContext.Clients.Groups(groups).SendAsync(method, deployState, resource, default).ConfigureAwait(false);
            }
            else
            {
                await hubContext.Clients.Groups(groups).SendAsync(method, deployState, default).ConfigureAwait(false);
            }
        }
Esempio n. 2
0
        public async Task <ActionResult <YDeploymentStatePayload> > DeployEngineAsync(Guid id, [FromBody] YEngine engine)
        {
            HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);

            if (!this.User.IsInRole("Admin"))
            {
                return(new UnauthorizedObjectResult("You should be admin to make a deployment"));
            }

            var userObjectId = this.User.GetObjectId();

            if (string.IsNullOrEmpty(userObjectId))
            {
                return(new UnauthorizedObjectResult("User unknown"));
            }

            var userId = new Guid(userObjectId);

            engine = await this.engineProvider.GetEngineAsync(id).ConfigureAwait(false);

            engine.ResourceGroupName.EnsureStringIsLetterOrDigit();
            engine.ClusterName.EnsureStringIsLetterOrDigit();
            engine.FactoryName.EnsureStringIsLetterOrDigit();
            engine.StorageName.EnsureStringIsLetterOrDigit();
            engine.AppInsightsName.EnsureStringIsLetterOrDigit();
            engine.KeyVaultName.EnsureStringIsLetterOrDigit();

            var job = this.hangFireService.GetProcessingJob(engine);

            if (job != null)
            {
                return(new YDeploymentStatePayload(YDeploymentStatePayloadState.Deploying)
                {
                    Id = id,
                    Message = $"Background process indicate your engine <strong>{engine.EngineName}</strong> has a deployment already in progress.<br />You'll receive a notification when the deployment is completed."
                });
            }

            var health = await this.notificationsService.IsServiceHealthyAsync();

            if (!health)
            {
                throw new Exception("Azure SignalR Service is not healthy");
            }

            var jobId = BackgroundJob.Enqueue(() => enginesService.CreateEngineDeploymentAsync(engine, userId, default));

            var deployingState = new YDeploymentStatePayload(YDeploymentStatePayloadState.Deploying)
            {
                Id      = id,
                Message = $"Deploying start. Background Job Id : {jobId}."
            };

            return(deployingState);
        }
Esempio n. 3
0
        public async Task <ActionResult <YDeploymentStatePayload> > DeleteEngineAsync(Guid id)
        {
            HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);

            if (!this.User.IsInRole("Admin"))
            {
                return(new UnauthorizedObjectResult("You should be admin to remove an engine and all its resources."));
            }

            var userObjectId = this.User.GetObjectId();

            if (string.IsNullOrEmpty(userObjectId))
            {
                return(new UnauthorizedObjectResult("User unknown"));
            }

            var userId = new Guid(userObjectId);

            YEngine engine = await this.engineProvider.GetEngineAsync(id);

            if (engine == null)
            {
                return(new NotFoundObjectResult($"No engine found with Id {id}"));
            }

            var health = await this.notificationsService.IsServiceHealthyAsync();

            if (!health)
            {
                throw new Exception("Azure SignalR Service is not healthy");
            }


            var jobId = BackgroundJob.Enqueue(() => enginesService.DeleteEngineDeploymentAsync(engine, userId, default));

            var deployingState = new YDeploymentStatePayload(YDeploymentStatePayloadState.Deploying)
            {
                Id      = id,
                Message = $"Removing engine deployment started. Background Job Id : {jobId}."
            };

            return(deployingState);
        }
Esempio n. 4
0
        public async Task <ActionResult <YDeploymentStatePayload> > DeployEngineAsync(Guid id, [FromBody] YEngine engine)
        {
            HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);

            if (!this.User.IsInRole("Admin"))
            {
                return(new UnauthorizedObjectResult("You should be admin to make a deployment"));
            }

            var userObjectId = this.User.GetObjectId();

            if (string.IsNullOrEmpty(userObjectId))
            {
                return(new UnauthorizedObjectResult("User unknown"));
            }

            var userId = new Guid(userObjectId);

            engine = await this.engineProvider.GetEngineAsync(id).ConfigureAwait(false);

            var settings = await this.settingsProvider.GetSettingsAsync().ConfigureAwait(false);

            if (settings != null)
            {
                if (string.IsNullOrEmpty(engine.ResourceGroupName))
                {
                    string prefix = settings.FirstOrDefault(s => s.Name == "ResourceGroupPrefix")?.Value ?? "rg";
                    string suffix = settings.FirstOrDefault(s => s.Name == "ResourceGroupSuffix")?.Value;

                    string name = $"{prefix}{engine.EngineName}{suffix}";
                    engine.ResourceGroupName = name;
                }
                if (string.IsNullOrEmpty(engine.ClusterName))
                {
                    string prefix = settings.FirstOrDefault(s => s.Name == "DatabricksWorkspacePrefix")?.Value ?? "dw";
                    string suffix = settings.FirstOrDefault(s => s.Name == "DatabricksWorkspaceSuffix")?.Value;

                    string name = $"{prefix}{engine.EngineName}{suffix}";
                    engine.ClusterName = name;
                }
                if (string.IsNullOrEmpty(engine.FactoryName))
                {
                    string prefix = settings.FirstOrDefault(s => s.Name == "DataFactoryPrefix")?.Value ?? "df";
                    string suffix = settings.FirstOrDefault(s => s.Name == "DataFactorySuffix")?.Value;

                    string name = $"{prefix}{engine.EngineName}{suffix}";
                    engine.FactoryName = name;
                }
                if (string.IsNullOrEmpty(engine.KeyVaultName))
                {
                    string prefix = settings.FirstOrDefault(s => s.Name == "KeyVaultPrefix")?.Value ?? "kv";
                    string suffix = settings.FirstOrDefault(s => s.Name == "KeyVaultSuffix")?.Value;

                    string name = $"{prefix}{engine.EngineName}{suffix}";
                    engine.KeyVaultName = name;
                }
                if (string.IsNullOrEmpty(engine.StorageName))
                {
                    string prefix = settings.FirstOrDefault(s => s.Name == "StoragePrefix")?.Value ?? "stor";
                    string suffix = settings.FirstOrDefault(s => s.Name == "StorageSuffix")?.Value;

                    string name = $"{prefix}{engine.EngineName}{suffix}";
                    engine.StorageName = name;
                }
                if (string.IsNullOrEmpty(engine.AppInsightsName))
                {
                    string prefix = settings.FirstOrDefault(s => s.Name == "AppInsightsPrefix")?.Value ?? "ai";
                    string suffix = settings.FirstOrDefault(s => s.Name == "AppInsightsSuffix")?.Value;

                    string name = $"{prefix}{engine.EngineName}{suffix}";
                    engine.AppInsightsName = name;
                }

                if (string.IsNullOrEmpty(engine.Location))
                {
                    string location = settings.FirstOrDefault(s => s.Name == "DefaultLocation")?.Value ?? "northeurope";
                    engine.Location = location;
                }
            }

            engine.ResourceGroupName.EnsureStringIsLetterOrDigit();
            engine.ClusterName.EnsureStringIsLetterOrDigit();
            engine.FactoryName.EnsureStringIsLetterOrDigit();
            engine.StorageName.EnsureStringIsLetterOrDigit();
            engine.AppInsightsName.EnsureStringIsLetterOrDigit();
            engine.KeyVaultName.EnsureStringIsLetterOrDigit();

            var job = this.hangFireService.GetProcessingJob(engine);

            if (job != null)
            {
                return(new YDeploymentStatePayload(YDeploymentStatePayloadState.Deploying)
                {
                    Id = id,
                    Message = $"Background process indicate your engine <strong>{engine.EngineName}</strong> has a deployment already in progress.<br />You'll receive a notification when the deployment is completed."
                });
            }

            var health = await this.notificationsService.IsServiceHealthyAsync();

            if (!health)
            {
                throw new Exception("Azure SignalR Service is not healthy");
            }

            var jobId = BackgroundJob.Enqueue(() => enginesService.CreateEngineDeploymentAsync(engine, userId, default));

            var deployingState = new YDeploymentStatePayload(YDeploymentStatePayloadState.Deploying)
            {
                Id      = id,
                Message = $"Deploying start. Background Job Id : {jobId}."
            };

            return(deployingState);
        }