예제 #1
0
        /// <summary>
        /// Configures the host builder to host an Orleans silo.
        /// </summary>
        /// <param name="hostBuilder">The host builder.</param>
        /// <param name="configureDelegate">The delegate used to configure the silo.</param>
        /// <returns>The host builder.</returns>
        /// <remarks>
        /// Calling this method multiple times on the same <see cref="IHostBuilder"/> instance will result in one silo being configured.
        /// However, the effects of <paramref name="configureDelegate"/> will be applied once for each call.
        /// </remarks>
        public static IHostBuilder UseOrleans(
            this IHostBuilder hostBuilder,
            Action <HostBuilderContext, ISiloBuilder> configureDelegate)
        {
            if (configureDelegate == null)
            {
                throw new ArgumentNullException(nameof(configureDelegate));
            }

            const string siloBuilderKey = "SiloBuilder";
            SiloBuilder  siloBuilder;

            if (!hostBuilder.Properties.ContainsKey(siloBuilderKey))
            {
                siloBuilder = new SiloBuilder(hostBuilder);
                hostBuilder.Properties.Add(siloBuilderKey, siloBuilder);
                hostBuilder.ConfigureServices((context, services) =>
                {
                    siloBuilder.Build(context, services);
                });
            }
            else
            {
                siloBuilder = (SiloBuilder)hostBuilder.Properties[siloBuilderKey];
            }

            siloBuilder.ConfigureSilo(configureDelegate);
            return(hostBuilder);
        }
예제 #2
0
        /// <summary>
        /// Configures the service collection to host an Orleans silo.
        /// </summary>
        /// <param name="services">The service collection.</param>
        /// <param name="configureDelegate">The delegate used to configure the silo.</param>
        /// <returns>The service collection.</returns>
        /// <remarks>
        /// Calling this method multiple times on the same <see cref="IHostBuilder"/> instance will result in one silo being configured.
        /// However, the effects of <paramref name="configureDelegate"/> will be applied once for each call.
        /// </remarks>
        public static IServiceCollection AddOrleans(
            this IServiceCollection services,
            Action <ISiloBuilder> configureDelegate)
        {
            if (configureDelegate == null)
            {
                throw new ArgumentNullException(nameof(configureDelegate));
            }
            ISiloBuilder builder = default;

            foreach (var descriptor in services)
            {
                if (descriptor.ServiceType.Equals(typeof(OrleansBuilderMarker)))
                {
                    var instance = (OrleansBuilderMarker)descriptor.ImplementationInstance;
                    builder = instance.Instance switch
                    {
                        ISiloBuilder existingBuilder => existingBuilder,
                                     _ => throw GetOrleansClientAddedException()
                    };
                }
            }

            if (builder is null)
            {
                builder = new SiloBuilder(services);
                services.Add(new(typeof(OrleansBuilderMarker), new OrleansBuilderMarker(builder)));
            }

            configureDelegate(builder);
            return(services);
        }
예제 #3
0
                public ISiloBuilder CreateSiloBuilder(string siloName, ClusterConfiguration clusterConfiguration)
                {
                    ISiloBuilder builder = new SiloBuilder()
                                           .ConfigureSiloName(siloName)
                                           .UseConfiguration(clusterConfiguration);

                    // Setup storage feature infrastructure.
                    // - Setup infrastructure.
                    // - Set default feature implementation - optional

                    // Setup infrastructure
                    builder.UseExampleStorage();
                    // Default storage feature factory - optional
                    builder.UseAsDefaultExampleStorage <TableExampleStorageFactory>();

                    // Service will need to add types they want to use to collection
                    // - Call extension functions from each implementation assembly to register it's classes.

                    // Blob - from blob extension assembly
                    builder.UseBlobExampleStorage("Blob");
                    // Table - from table extension assembly
                    builder.UseTableExampleStorage("Table");
                    // Blarg - from blarg extension assembly
                    //builder.UseBlargExampleStorage("Blarg");

                    return(builder);
                }
예제 #4
0
        private static ISiloBuilder AddOrleans(IServiceCollection services)
        {
            ISiloBuilder builder = default;

            foreach (var descriptor in services)
            {
                if (descriptor.ServiceType.Equals(typeof(OrleansBuilderMarker)))
                {
                    var instance = (OrleansBuilderMarker)descriptor.ImplementationInstance;
                    builder = instance.Instance switch
                    {
                        ISiloBuilder existingBuilder => existingBuilder,
                                     _ => throw GetOrleansClientAddedException()
                    };
                }
            }

            if (builder is null)
            {
                builder = new SiloBuilder(services);
                services.Add(new(typeof(OrleansBuilderMarker), new OrleansBuilderMarker(builder)));
            }

            return(builder);
        }
예제 #5
0
        public ISiloBuilder CreateSiloBuilder(string siloName, ClusterConfiguration clusterConfiguration)
        {
            ISiloBuilder builder = new SiloBuilder();

            return(builder.ConfigureSiloName(siloName)
                   .UseConfiguration(clusterConfiguration)
                   .ConfigureLogging(loggingBuilder => TestingUtils.ConfigureDefaultLoggingBuilder(loggingBuilder,
                                                                                                   clusterConfiguration.GetOrCreateNodeConfigurationForSilo(siloName).TraceFileName)));
        }
예제 #6
0
        /// <summary>
        /// Creates an returns a new silo.
        /// </summary>
        /// <param name="hostName">The silo name if it is not already specified in the configuration.</param>
        /// <param name="configuration">The configuration.</param>
        /// <returns>A new silo.</returns>
        public static ISiloHost CreateSiloHost(string hostName, IConfiguration configuration)
        {
            string siloName = configuration[nameof(TestSiloSpecificOptions.SiloName)] ?? hostName;

            var hostBuilder     = new HostBuilder();
            var siloBuilder     = new SiloBuilder(hostBuilder);
            var siloHostBuilder = new SiloHostBuilderAdaptor(hostBuilder, siloBuilder);

            // Add the silo builder to the host builder so that it is executed during configuration time.
            hostBuilder.Properties[nameof(SiloBuilder)] = siloBuilder;
            hostBuilder.ConfigureServices((context, services) =>
            {
                siloBuilder.Build(context, services);
            });

            siloBuilder
            .Configure <ClusterOptions>(configuration)
            .Configure <SiloOptions>(options => options.SiloName = siloName);

            hostBuilder.ConfigureHostConfiguration(cb => cb.AddConfiguration(configuration));

            hostBuilder.Properties["Configuration"] = configuration;
            ConfigureAppServices(configuration, hostBuilder, siloBuilder, siloHostBuilder);

            hostBuilder.ConfigureServices((context, services) =>
            {
                services.AddSingleton <TestHooksHostEnvironmentStatistics>();
                services.AddFromExisting <IHostEnvironmentStatistics, TestHooksHostEnvironmentStatistics>();
                services.AddSingleton <TestHooksSystemTarget>();
                ConfigureListeningPorts(context.Configuration, services);

                TryConfigureClusterMembership(context.Configuration, services);
                TryConfigureFileLogging(configuration, services, siloName);

                if (Debugger.IsAttached)
                {
                    // Test is running inside debugger - Make timeout ~= infinite
                    services.Configure <SiloMessagingOptions>(op => op.ResponseTimeout = TimeSpan.FromMilliseconds(1000000));
                }
            });

            var host = hostBuilder.Build();
            var silo = host.Services.GetRequiredService <ISiloHost>();

            InitializeTestHooksSystemTarget(silo);
            return(silo);
        }
예제 #7
0
        public ISiloBuilder CreateSiloBuilder(string siloName, ClusterConfiguration clusterConfiguration)
        {
            ISiloBuilder builder = new SiloBuilder();

            return(builder.ConfigureSiloName(siloName).UseConfiguration(clusterConfiguration));
        }
예제 #8
0
        /// <summary>
        /// Creates an returns a new silo.
        /// </summary>
        /// <param name="hostName">The silo name if it is not already specified in the configuration.</param>
        /// <param name="configurationSources">The configuration.</param>
        /// <returns>A new silo.</returns>
        public static ISiloHost CreateSiloHost(string hostName, IEnumerable <IConfigurationSource> configurationSources)
        {
            var configBuilder = new ConfigurationBuilder();

            foreach (var source in configurationSources)
            {
                configBuilder.Add(source);
            }
            var configuration = configBuilder.Build();

            string siloName = configuration[nameof(TestSiloSpecificOptions.SiloName)] ?? hostName;

            var hostBuilder     = new HostBuilder();
            var siloBuilder     = new SiloBuilder(hostBuilder);
            var siloHostBuilder = new SiloHostBuilderAdaptor(hostBuilder, siloBuilder);

            // Add the silo builder to the host builder so that it is executed during configuration time.
            hostBuilder.Properties[nameof(SiloBuilder)] = siloBuilder;
            hostBuilder.ConfigureServices((context, services) =>
            {
                siloBuilder.Build(context, services);
            });

            siloBuilder
            .Configure <ClusterOptions>(configuration)
            .Configure <SiloOptions>(options => options.SiloName = siloName);

            hostBuilder
            .ConfigureHostConfiguration(cb =>
            {
                // TODO: Instead of passing the sources individually, just chain the pre-built configuration once we upgrade to Microsoft.Extensions.Configuration 2.1
                foreach (var source in configBuilder.Sources)
                {
                    cb.Add(source);
                }
            });

            hostBuilder.Properties["Configuration"] = configuration;
            ConfigureAppServices(configuration, hostBuilder, siloBuilder, siloHostBuilder);

            hostBuilder.ConfigureServices((context, services) =>
            {
                services.AddSingleton <TestHooksHostEnvironmentStatistics>();
                services.AddFromExisting <IHostEnvironmentStatistics, TestHooksHostEnvironmentStatistics>();
                services.AddSingleton <TestHooksSystemTarget>();
                ConfigureListeningPorts(context.Configuration, services);

                TryConfigureClusterMembership(context.Configuration, services);
                TryConfigureFileLogging(configuration, services, siloName);

                if (Debugger.IsAttached)
                {
                    // Test is running inside debugger - Make timeout ~= infinite
                    services.Configure <SiloMessagingOptions>(op => op.ResponseTimeout = TimeSpan.FromMilliseconds(1000000));
                }
            });

            siloBuilder.GetApplicationPartManager().ConfigureDefaults();

            var host = hostBuilder.Build();
            var silo = host.Services.GetRequiredService <ISiloHost>();

            InitializeTestHooksSystemTarget(silo);
            return(silo);
        }