public async Task <ActionResult> ScheduleImageFixedRate([FromBody] ScheduledImageFixedRate scheduledImageFixedRate) { try { await _containerService.RunScheduledImageAsync(scheduledImageFixedRate); return(Ok(JsonConvert.SerializeObject("Started image schedule successfully"))); } catch (InexistentTaskDefinition ex) { return(BadRequest(ex.Message)); } catch (InexistentCluster ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } catch (AmazonCloudWatchEventsException ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } catch (AmazonIdentityManagementServiceException ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } }
/// <summary> /// Schedules the image to run at fixed interval /// </summary> /// <param name="scheduledImageFixedRate"></param> /// <returns></returns> public async System.Threading.Tasks.Task RunScheduledImageAsync(ScheduledImageFixedRate scheduledImageFixedRate) { // get latest revision task definition ARN var taskDefinitionsResponse = await _ecsClient.ListTaskDefinitionsAsync(new ListTaskDefinitionsRequest { FamilyPrefix = scheduledImageFixedRate.ConfigName, Sort = SortOrder.DESC }); string taskDefinitionArn; try { taskDefinitionArn = taskDefinitionsResponse.TaskDefinitionArns.First(); } catch (Exception) { throw new InexistentTaskDefinition($"Configuration does not exists: {scheduledImageFixedRate.ConfigName}"); } // get ECS cluster ARN var clustersResponse = await _ecsClient.ListClustersAsync(new ListClustersRequest()); string clusterArn; try { clusterArn = clustersResponse.ClusterArns.First(); } catch (Exception) { throw new InexistentCluster("No ECS clusters have been found"); } // get target role ARN string targetRoleArn; try { targetRoleArn = await _iamService.GetRoleArnFromNameAsync(_ecsRole); } catch (AmazonIdentityManagementServiceException) { throw; } try { // create event rule // rule name basically will be userId + ruleName await _cloudWatchService.CreateSchedulerRuleAsync(scheduledImageFixedRate.RuleName, scheduledImageFixedRate.ToString()); // create target for rule await _cloudWatchService.CreateTargetForRuleAsync(scheduledImageFixedRate.RuleName, targetRoleArn, clusterArn, taskDefinitionArn, scheduledImageFixedRate.TasksGroupName); } catch (AmazonCloudWatchEventsException ex) { _logger.LogError(ex.Message); throw; } }