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); } }
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); }
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); }
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); }