Beispiel #1
0
        private void InitializeHelpers(HttpClient client = null)
        {
            var triggerHelper = new TriggerHooksHelper(client ?? A.Fake <HttpClient>(), A.Fake <IMetrics>());

            fakeGit     = A.Fake <Func <string, Task <string> > >();
            hooksHelper = new HooksHelper(fakeGit, triggerHelper, A.Fake <IMetrics>());
        }
Beispiel #2
0
 public HooksHelper(Func <string, Task <string> > gitExecutor, TriggerHooksHelper triggerHelper, IMetrics metrics, ILogger logger = null)
 {
     this._logger        = logger ?? NullLogger.Instance;
     this._git           = gitExecutor;
     this._metrics       = metrics;
     this._triggerHelper = triggerHelper;
     this._keysRegex     = new Regex(@"(?:implementations/jpad/|manifests/)(.*)\..*", RegexOptions.Compiled);
 }
Beispiel #3
0
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory,
                              IHostApplicationLifetime lifetime)
        {
            Log.Logger = new LoggerConfiguration()
                         .ReadFrom.Configuration(_configuration)
                         .WriteTo.Console(new JsonFormatter())
                         .Enrich.FromLogContext()
                         .CreateLogger();

            _logger.LogInformation("Starting service");
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            RunSSHDeamon(lifetime, loggerFactory.CreateLogger("sshd"));

            var executor = ShellHelper.Executor.WithWorkingDirectory(_configuration.GetValue <string>("REPO_LOCATION"))
                           .ForwardEnvVariable("GIT_SSH");



            var gitValidationFlow = new GitValidationFlow
            {
                Validators =
                {
                    (Patterns.Manifests,              new CircularDependencyValidator()),
                    (Patterns.Manifests,              new ManifestStructureValidator()),
                    (Patterns.Manifests,              new NestedKeysValidator()),
                    (Patterns.JPad,                   new CompileJPadValidator()),
                    (Patterns.SubjectExtractionRules, new SubjectExtractionValidator()),
                    (Patterns.Policy,                 new PolicyValidator()),
                }
            };

            var minioConfig    = _configuration.GetSection("Minio");
            var metricsService = app.ApplicationServices.GetService <IMetrics>();

            var storageClient = Polly.Policy.Handle <Exception>()
                                .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))
                                .ExecuteAsync(() =>
                                              MinioBucketStorage.GetOrCreateBucket(CreateMinioClient(minioConfig),
                                                                                   minioConfig.GetValue("Bucket", DEFAULT_MINIO_BUCKET_NAME)))
                                .Result;

            var natsClient       = new NatsPublisher(_configuration.GetSection("Nats").GetValue <string>("Endpoint"));
            var versionPublisher = natsClient.GetSubjectPublisher("version");

            var repoSynchronizer    = new RepoSynchronizer(executor.WithUser("git").CreateCommandExecutor("git"));
            var storageSynchronizer = CreateStorageSynchronizer(storageClient, executor.WithUser("git"), metricsService);

            storageSynchronizer.Sync(repoSynchronizer.CurrentHead().Result, checkForStaleRevision: false).Wait();
            RunIntervalPublisher(lifetime, versionPublisher, repoSynchronizer, storageSynchronizer);

            var syncActor = SyncActor.Create(storageSynchronizer, repoSynchronizer, natsClient, lifetime.ApplicationStopping, loggerFactory.CreateLogger("SyncActor"));

            var triggerHelper = new TriggerHooksHelper(new HttpClient(), metricsService, loggerFactory.CreateLogger("TriggerHooksHelper"));
            var hooksHelper   = new HooksHelper(
                executor.WithUser("git").CreateCommandExecutor("git"),
                triggerHelper,
                metricsService,
                loggerFactory.CreateLogger("HooksHelper")
                );

            app.UseRouter(router =>
            {
                router.MapGet("validate",
                              ValidationHandler.Create(executor, gitValidationFlow,
                                                       loggerFactory.CreateLogger <ValidationHandler>(),
                                                       metricsService));
                router.MapGet("sync",
                              SyncHandler.Create(syncActor, _syncPolicy, metricsService));
                router.MapGet("push", PushHandler.Create(syncActor, metricsService, hooksHelper));
                router.MapGet("log", async(req, res, routedata) => _logger.LogInformation(req.Query["message"]));
                router.MapGet("health", async(req, res, routedata) => await res.WriteAsync(JsonConvert.SerializeObject(new { })));
                router.MapGet("version", async(req, res, routedata) => await res.WriteAsync(Assembly.GetEntryAssembly()
                                                                                            .GetCustomAttribute <AssemblyInformationalVersionAttribute>().InformationalVersion));
            });
        }