コード例 #1
0
        protected override void ConfigureAutofacServices(ContainerBuilder containerBuilder, IConfigurationRoot configurationRoot)
        {
            containerBuilder
            .Register(c =>
            {
                var serviceBusConfiguration = c.Resolve <IOptionsSnapshot <ServiceBusConfiguration> >();
                var topicClient             = new TopicClientWrapper(serviceBusConfiguration.Value.ConnectionString, serviceBusConfiguration.Value.TopicPath);
                return(topicClient);
            })
            .Keyed <TopicClientWrapper>(PackageVerificationTopicClientBindingKey);

            containerBuilder
            .RegisterType <ProcessSignatureEnqueuer>()
            .WithParameter(new ResolvedParameter(
                               (pi, ctx) => pi.ParameterType == typeof(ITopicClient),
                               (pi, ctx) => ctx.ResolveKeyed <TopicClientWrapper>(PackageVerificationTopicClientBindingKey)))
            .WithParameter(new ResolvedParameter(
                               (pi, ctx) => pi.ParameterType == typeof(IBrokeredMessageSerializer <SignatureValidationMessage>),
                               (pi, ctx) => ctx.Resolve <SignatureValidationMessageSerializer>()))
            .As <IProcessSignatureEnqueuer>();

            containerBuilder
            .RegisterType <ScopedMessageHandler <PackageValidationMessageData> >()
            .Keyed <IMessageHandler <PackageValidationMessageData> >(OrchestratorBindingKey);

            containerBuilder
            .RegisterTypeWithKeyedParameter <
                ISubscriptionProcessor <PackageValidationMessageData>,
                SubscriptionProcessor <PackageValidationMessageData>,
                IMessageHandler <PackageValidationMessageData> >(
                OrchestratorBindingKey);

            // Configure the email enqueuer.
            containerBuilder
            .Register(c =>
            {
                var configuration = c.Resolve <IOptionsSnapshot <EmailConfiguration> >().Value.ServiceBus;
                return(new TopicClientWrapper(configuration.ConnectionString, configuration.TopicPath));
            })
            .Keyed <ITopicClient>(EmailBindingKey);

            containerBuilder
            .RegisterTypeWithKeyedParameter <
                IEmailMessageEnqueuer,
                EmailMessageEnqueuer,
                ITopicClient>(
                EmailBindingKey);

            // Configure Validators
            var validatingType = configurationRoot
                                 .GetSection(RunnerConfigurationSectionName)
                                 .GetValue(nameof(OrchestrationRunnerConfiguration.ValidatingType), ValidatingType.Package);

            switch (validatingType)
            {
            case ValidatingType.Package:
                ConfigurePackageSigningValidators(containerBuilder);
                ConfigurePackageCertificatesValidator(containerBuilder);
                ConfigureScanAndSignProcessor(containerBuilder);
                ConfigureFlatContainer(containerBuilder);
                break;

            case ValidatingType.SymbolPackage:
                ConfigureSymbolScanValidator(containerBuilder);
                ConfigureSymbolsValidator(containerBuilder);
                ConfigureSymbolsIngester(containerBuilder);
                break;

            default:
                throw new NotImplementedException($"Unknown type: {validatingType}");
            }

            ValidationJobBase.ConfigureFeatureFlagAutofacServices(containerBuilder);
            ConfigureLeaseService(containerBuilder);
        }
コード例 #2
0
        protected override void ConfigureJobServices(IServiceCollection services, IConfigurationRoot configurationRoot)
        {
            services.Configure <ValidationConfiguration>(configurationRoot.GetSection(ConfigurationSectionName));
            services.Configure <ProcessSignatureConfiguration>(configurationRoot.GetSection(PackageSigningSectionName));
            services.Configure <ValidateCertificateConfiguration>(configurationRoot.GetSection(PackageCertificatesSectionName));
            services.Configure <OrchestrationRunnerConfiguration>(configurationRoot.GetSection(RunnerConfigurationSectionName));
            services.Configure <EmailConfiguration>(configurationRoot.GetSection(EmailConfigurationSectionName));
            services.Configure <ScanAndSignConfiguration>(configurationRoot.GetSection(ScanAndSignSectionName));
            services.Configure <SymbolScanOnlyConfiguration>(configurationRoot.GetSection(SymbolScanOnlySectionName));
            services.Configure <ScanAndSignEnqueuerConfiguration>(configurationRoot.GetSection(ScanAndSignSectionName));
            services.Configure <FlatContainerConfiguration>(configurationRoot.GetSection(FlatContainerConfigurationSectionName));
            services.Configure <LeaseConfiguration>(configurationRoot.GetSection(LeaseConfigurationSectionName));

            services.Configure <SymbolsValidationConfiguration>(configurationRoot.GetSection(SymbolsValidatorSectionName));
            services.Configure <SymbolsIngesterConfiguration>(configurationRoot.GetSection(SymbolsIngesterSectionName));

            services.AddTransient <ConfigurationValidator>();
            services.AddTransient <OrchestrationRunner>();

            services.AddScoped <IEntitiesContext>(p =>
            {
                var connectionFactory = p.GetRequiredService <ISqlConnectionFactory <GalleryDbConfiguration> >();
                var connection        = connectionFactory.CreateAsync().GetAwaiter().GetResult();

                return(new EntitiesContext(connection, readOnly: false));
            });

            services.AddScoped(p =>
            {
                var connectionFactory = p.GetRequiredService <ISqlConnectionFactory <ValidationDbConfiguration> >();
                var connection        = connectionFactory.CreateAsync().GetAwaiter().GetResult();

                return(new ValidationEntitiesContext(connection));
            });

            services.AddScoped <IValidationEntitiesContext>(serviceProvider =>
                                                            serviceProvider.GetRequiredService <ValidationEntitiesContext>());
            services.AddScoped <IValidationStorageService, ValidationStorageService>();
            services.Add(ServiceDescriptor.Transient(typeof(IEntityRepository <>), typeof(EntityRepository <>)));
            services.AddTransient <ICorePackageService, CorePackageService>();
            services.AddTransient <IEntityService <Package>, PackageEntityService>();
            services.AddTransient <ISubscriptionClient>(serviceProvider =>
            {
                var configuration = serviceProvider.GetRequiredService <IOptionsSnapshot <ServiceBusConfiguration> >().Value;
                return(new SubscriptionClientWrapper(
                           configuration.ConnectionString,
                           configuration.TopicPath,
                           configuration.SubscriptionName,
                           serviceProvider.GetRequiredService <ILogger <SubscriptionClientWrapper> >()));
            });
            services.AddTransient <ITopicClient>(serviceProvider =>
            {
                var configuration = serviceProvider.GetRequiredService <IOptionsSnapshot <ServiceBusConfiguration> >().Value;
                return(new TopicClientWrapper(configuration.ConnectionString, configuration.TopicPath));
            });
            services.AddTransient <IPackageValidationEnqueuer, PackageValidationEnqueuer>();
            services.AddTransient <IValidatorProvider, ValidatorProvider>();
            services.AddTransient <IValidationSetProvider <Package>, ValidationSetProvider <Package> >();
            // Only one Orchestrator Message Handler will be registered.
            ConfigureOrchestratorMessageHandler(services, configurationRoot);
            services.AddTransient <IServiceBusMessageSerializer, ServiceBusMessageSerializer>();
            services.AddTransient <IBrokeredMessageSerializer <PackageValidationMessageData>, PackageValidationMessageDataSerializationAdapter>();
            services.AddTransient <ICriteriaEvaluator <Package>, PackageCriteriaEvaluator>();
            services.AddTransient <IProcessSignatureEnqueuer, ProcessSignatureEnqueuer>();
            services.AddTransient <ICloudBlobClient>(c =>
            {
                var configurationAccessor = c.GetRequiredService <IOptionsSnapshot <ValidationConfiguration> >();
                return(new CloudBlobClientWrapper(
                           configurationAccessor.Value.ValidationStorageConnectionString,
                           readAccessGeoRedundant: false));
            });
            services.AddTransient <ICloudBlobContainerInformationProvider, GalleryCloudBlobContainerInformationProvider>();
            services.AddTransient <ICoreFileStorageService, CloudBlobCoreFileStorageService>();
            services.AddTransient <IFileDownloader, FileDownloader>();
            services.AddTransient <IStatusProcessor <Package>, PackageStatusProcessor>();
            services.AddTransient <IValidationSetProvider <Package>, ValidationSetProvider <Package> >();
            services.AddTransient <IValidationSetProcessor, ValidationSetProcessor>();
            services.AddTransient <IBrokeredMessageSerializer <SignatureValidationMessage>, SignatureValidationMessageSerializer>();
            services.AddTransient <IBrokeredMessageSerializer <CertificateValidationMessage>, CertificateValidationMessageSerializer>();
            services.AddTransient <IBrokeredMessageSerializer <ScanAndSignMessage>, ScanAndSignMessageSerializer>();
            services.AddTransient <IValidatorStateService, ValidatorStateService>();
            services.AddTransient <ISimpleCloudBlobProvider, SimpleCloudBlobProvider>();
            services.AddTransient <PackageSignatureProcessor>();
            services.AddTransient <PackageSignatureValidator>();
            services.AddTransient <Messaging.IServiceBusMessageSerializer, Messaging.ServiceBusMessageSerializer>();
            services.AddTransient <IMessageServiceConfiguration, CoreMessageServiceConfiguration>();
            services.AddTransient <IMessageService, AsynchronousEmailMessageService>();
            services.AddTransient <IMessageService <Package>, PackageMessageService>();
            services.AddTransient <ICommonTelemetryService, CommonTelemetryService>();
            services.AddTransient <ITelemetryService, TelemetryService>();
            services.AddTransient <ISubscriptionProcessorTelemetryService, TelemetryService>();
            services.AddTransient <ITelemetryClient, TelemetryClientWrapper>();
            services.AddTransient <IDiagnosticsService, LoggerDiagnosticsService>();
            services.AddSingleton(new TelemetryClient(ApplicationInsightsConfiguration.TelemetryConfiguration));
            services.AddTransient <IValidationOutcomeProcessor <Package>, ValidationOutcomeProcessor <Package> >();
            services.AddSingleton(p =>
            {
                var assembly        = Assembly.GetEntryAssembly();
                var assemblyName    = assembly.GetName().Name;
                var assemblyVersion = assembly.GetCustomAttribute <AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "0.0.0";

                var client = new HttpClient(new HttpClientHandler
                {
                    AutomaticDecompression = (DecompressionMethods.GZip | DecompressionMethods.Deflate),
                });

                client.Timeout = configurationRoot.GetValue <TimeSpan>(PackageDownloadTimeoutName);
                client.DefaultRequestHeaders.Add("User-Agent", $"{assemblyName}/{assemblyVersion}");

                return(client);
            });

            /// See <see cref="SubscriptionProcessorJob{T}.ConfigureDefaultJobServices(IServiceCollection, IConfigurationRoot)"/>
            /// for reasoning on why this is registered here.
            services.AddSingleton <IFeatureFlagRefresher, FeatureFlagRefresher>();

            ConfigureFileServices(services, configurationRoot);
            ConfigureOrchestratorSymbolTypes(services);
            ValidationJobBase.ConfigureFeatureFlagServices(services, configurationRoot);
        }