Example #1
0
 public FileController(
     IsoUploadOptions isoUploadOptions,
     IPlayerService playerService
     ) : base()
 {
     _isoUploadOptions = isoUploadOptions;
     _playerService    = playerService;
 }
Example #2
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton <TaskServiceHealthCheck>();
            services.AddSingleton <ConnectionServiceHealthCheck>();
            services.AddHealthChecks()
            .AddCheck <TaskServiceHealthCheck>(
                "task_service_responsive",
                failureStatus: HealthStatus.Unhealthy,
                tags: new[] { "live" })
            .AddCheck <ConnectionServiceHealthCheck>(
                "connection_service_responsive",
                failureStatus: HealthStatus.Unhealthy,
                tags: new[] { "live" });

            var provider = Configuration["Database:Provider"];

            switch (provider)
            {
            case "InMemory":
                services.AddDbContextPool <VmContext>((serviceProvider, optionsBuilder) => optionsBuilder
                                                      .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>())
                                                      .UseInMemoryDatabase("vm"));
                break;

            case "Sqlite":
            case "SqlServer":
            case "PostgreSQL":
                services.AddDbContextPool <VmContext>((serviceProvider, optionsBuilder) => optionsBuilder
                                                      .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>())
                                                      .UseConfiguredDatabase(Configuration));
                break;
            }

            var connectionString = Configuration.GetConnectionString(Configuration.GetValue <string>("Database:Provider", "Sqlite").Trim());

            switch (provider)
            {
            case "Sqlite":
                services.AddHealthChecks().AddSqlite(connectionString, tags: new[] { "ready", "live" });
                break;

            case "SqlServer":
                services.AddHealthChecks().AddSqlServer(connectionString, tags: new[] { "ready", "live" });
                break;

            case "PostgreSQL":
                services.AddHealthChecks().AddNpgSql(connectionString, tags: new[] { "ready", "live" });
                break;
            }

            services.AddOptions()
            .Configure <DatabaseOptions>(Configuration.GetSection("Database"))
            .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue);

            IConfiguration   isoConfig  = Configuration.GetSection("IsoUpload");
            IsoUploadOptions isoOptions = new IsoUploadOptions();

            isoConfig.Bind(isoOptions);

            services.AddOptions()
            .Configure <IsoUploadOptions>(isoConfig)
            .AddScoped(config => config.GetService <IOptionsMonitor <IsoUploadOptions> >().CurrentValue);

            services
            .Configure <ClientOptions>(Configuration.GetSection("ClientSettings"))
            .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue);

            services
            .Configure <VsphereOptions>(Configuration.GetSection("Vsphere"))
            .AddScoped(config => config.GetService <IOptionsSnapshot <VsphereOptions> >().Value);

            services
            .Configure <RewriteHostOptions>(Configuration.GetSection("RewriteHost"))
            .AddScoped(config => config.GetService <IOptionsSnapshot <RewriteHostOptions> >().Value);

            services
            .Configure <IdentityClientOptions>(Configuration.GetSection("IdentityClient"))
            .AddScoped(config => config.GetService <IOptionsSnapshot <IdentityClientOptions> >().Value);

            services
            .Configure <ConsoleUrlOptions>(Configuration.GetSection("ConsoleUrls"))
            .AddScoped(config => config.GetService <IOptionsSnapshot <ConsoleUrlOptions> >().Value);

            services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy")));
            services.AddMvc()
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
                options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
            });

            services.AddAuthorization(options =>
            {
                var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser();

                foreach (var scope in _authOptions.AuthorizationScope.Split(' '))
                {
                    policyBuilder.RequireScope(scope);
                }

                options.DefaultPolicy = policyBuilder.Build();

                options.AddPolicy(Constants.PrivilegedAuthorizationPolicy, builder => builder
                                  .RequireAuthenticatedUser()
                                  .RequireScope(_authOptions.PrivilegedScope)
                                  );
            });

            services.AddSignalR()
            .AddJsonProtocol(options =>
            {
                options.PayloadSerializerOptions.PropertyNameCaseInsensitive = true;
                options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter());
            });

            // allow upload of large files
            services.Configure <FormOptions>(x =>
            {
                x.ValueLengthLimit         = int.MaxValue;
                x.MultipartBodyLengthLimit = isoOptions.MaxFileSize;
            });

            services.AddSwagger(_authOptions);

            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority                 = _authOptions.Authority;
                options.RequireHttpsMetadata      = _authOptions.RequireHttpsMetadata;
                options.SaveToken                 = true;
                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidateAudience = false,
                    ValidateIssuer   = true
                };

                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        // If the request is for our hub...
                        var path        = context.HttpContext.Request.Path;
                        var accessToken = context.Request.Query["access_token"];

                        if (!string.IsNullOrEmpty(accessToken) &&
                            (path.StartsWithSegments("/hubs")))
                        {
                            // Read the token out of the query string
                            context.Token = accessToken;
                        }
                        return(Task.CompletedTask);
                    }
                };
            });

            services.AddRouting(options =>
            {
                options.LowercaseUrls = true;
            });

            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User);

            services.AddScoped <IVmService, VmService>();
            services.AddScoped <IPlayerService, PlayerService>();
            services.AddScoped <IViewService, ViewService>();
            services.AddScoped <IPermissionsService, PermissionsService>();
            services.AddSingleton <CallbackBackgroundService>();
            services.AddSingleton <IHostedService>(x => x.GetService <CallbackBackgroundService>());
            services.AddSingleton <ICallbackBackgroundService>(x => x.GetService <CallbackBackgroundService>());
            services.AddSingleton <IAuthenticationService, AuthenticationService>();
            services.AddSingleton <IActiveVirtualMachineService, ActiveVirtualMachineService>();

            // Vsphere Services
            services.AddSingleton <ConnectionService>();
            services.AddSingleton <IHostedService>(x => x.GetService <ConnectionService>());
            services.AddSingleton <IConnectionService>(x => x.GetService <ConnectionService>());
            services.AddScoped <IVsphereService, VsphereService>();
            services.AddSingleton <TaskService>();
            services.AddSingleton <IHostedService>(x => x.GetService <TaskService>());
            services.AddSingleton <ITaskService>(x => x.GetService <TaskService>());
            services.AddSingleton <MachineStateService>();
            services.AddSingleton <IHostedService>(x => x.GetService <MachineStateService>());
            services.AddSingleton <IMachineStateService>(x => x.GetService <MachineStateService>());

            services.AddTransient <EventTransactionInterceptor>();

            services.AddAutoMapper(typeof(Startup));
            services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);
            services.AddTransient(typeof(IPipelineBehavior <,>), typeof(CheckTasksBehavior <,>));

            services.AddMemoryCache();

            services.AddApiClients(identityClientOptions: _identityClientOptions, clientOptions: _clientOptions);
        }
Example #3
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var provider = Configuration["Database:Provider"];

            switch (provider)
            {
            case "InMemory":
                services.AddDbContextPool <Context>(opt => opt.UseInMemoryDatabase("vm"));
                break;

            case "Sqlite":
            case "SqlServer":
            case "PostgreSQL":
                services.AddDbProvider(Configuration);
                services.AddDbContextPool <Context>(builder => builder.UseConfiguredDatabase(Configuration));
                break;
            }

            services.AddOptions()
            .Configure <DatabaseOptions>(Configuration.GetSection("Database"))
            .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue);

            IConfiguration   isoConfig  = Configuration.GetSection("IsoUpload");
            IsoUploadOptions isoOptions = new IsoUploadOptions();

            isoConfig.Bind(isoOptions);

            services.AddOptions()
            .Configure <IsoUploadOptions>(isoConfig)
            .AddScoped(config => config.GetService <IOptionsMonitor <IsoUploadOptions> >().CurrentValue);

            services
            .Configure <ClientOptions>(Configuration.GetSection("ClientSettings"))
            .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue);

            services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy")));
            services.AddMvc(options =>
            {
                options.Filters.Add(typeof(ValidateModelStateFilter));
                options.Filters.Add(typeof(JsonExceptionFilter));

                // Require all scopes in authOptions
                var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser();
                Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x));

                var policy = policyBuilder.Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.Converters.Add(new StringEnumConverter());
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            // allow upload of large files
            services.Configure <FormOptions>(x => {
                x.ValueLengthLimit         = int.MaxValue;
                x.MultipartBodyLengthLimit = isoOptions.MaxFileSize;
            });

            services.AddSwagger(_authOptions);

            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority                 = _authOptions.Authority;
                options.RequireHttpsMetadata      = _authOptions.RequireHttpsMetadata;
                options.SaveToken                 = true;
                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidAudiences = _authOptions.AuthorizationScope.Split(' ')
                };
            });

            services.AddRouting(options =>
            {
                options.LowercaseUrls = true;
            });

            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User);

            services.AddScoped <IVmService, VmService>();
            services.AddScoped <IPlayerService, PlayerService>();

            services.AddAutoMapper();

            services.AddHttpClient();

            services.AddScoped <IS3PlayerApiClient, S3PlayerApiClient>(p =>
            {
                var httpContextAccessor = p.GetRequiredService <IHttpContextAccessor>();
                var httpClientFactory   = p.GetRequiredService <IHttpClientFactory>();
                var clientOptions       = p.GetRequiredService <ClientOptions>();

                var playerUri = new Uri(clientOptions.urls.playerApi);

                string authHeader = httpContextAccessor.HttpContext.Request.Headers["Authorization"];

                var httpClient         = httpClientFactory.CreateClient();
                httpClient.BaseAddress = playerUri;
                httpClient.DefaultRequestHeaders.Add("Authorization", authHeader);

                var s3PlayerApiClient     = new S3PlayerApiClient(httpClient, true);
                s3PlayerApiClient.BaseUri = playerUri;

                return(s3PlayerApiClient);
            });
        }