public async Task <IActionResult> Create(string registry, string repository) { var viewModel = new CreateSpiderViewModel(); registry = registry?.Trim(); repository = repository?.Trim(); var dockerRepository = await _dbContext.DockerRepositories.FirstOrDefaultAsync(x => x.Registry == registry && x.Repository == repository); if (dockerRepository == null) { return(NotFound()); } if (!string.IsNullOrWhiteSpace(dockerRepository.Registry)) { viewModel.Tags = await GetRepositoryTagsAsync(dockerRepository.Schema, dockerRepository.Registry, dockerRepository.Repository, dockerRepository.UserName, dockerRepository.Password); } return(View(viewModel)); }
public async Task <IActionResult> CreateAsync(CreateSpiderViewModel viewModel) { // POST 过来的镜像仓库是选择出来的,如果不正确表明可能是其它 HACK 过来的数据, 直接抛 404即可 var dockerRepository = await _dbContext.DockerRepositories.FirstOrDefaultAsync(x => x.Registry == viewModel.Registry && x.Repository == viewModel.Repository); if (dockerRepository == null) { return(NotFound()); } if (ModelState.IsValid) { var exists = await _dbContext.Spiders.AnyAsync(x => x.Name == viewModel.Name); if (exists) { ModelState.AddModelError("Name", "名称已经存在"); } try { TriggerBuilder.Create().WithCronSchedule(viewModel.Cron).Build(); } catch { ModelState.AddModelError("Cron", "Cron 表达式不正确"); } if (ModelState.IsValid) { var transaction = await _dbContext.Database.BeginTransactionAsync(); try { var spider = new Portal.Entity.Spider { Name = viewModel.Name, Cron = viewModel.Cron, Type = viewModel.Type, Registry = dockerRepository.Registry, Repository = viewModel.Repository, Environment = viewModel.Environment, Tag = viewModel.Tag, CreationTime = DateTime.Now }; await _dbContext.Spiders.AddAsync(spider); await _dbContext.SaveChangesAsync(); var id = spider.Id.ToString(); await ScheduleJobAsync(viewModel.Cron, id, spider.Name); transaction.Commit(); return(Redirect("/spider")); } catch (Exception e) { _logger.LogError($"添加任务失败: {e}"); try { transaction.Rollback(); } catch (Exception re) { _logger.LogError($"回滚添加任务失败: {re}"); } } } } if (!string.IsNullOrWhiteSpace(viewModel.Registry)) { viewModel.Tags = await GetRepositoryTagsAsync(dockerRepository.Schema, dockerRepository.Registry, dockerRepository.Repository, dockerRepository.UserName, dockerRepository.Password); } return(View("Create", viewModel)); }