public async Task Assignment_Succeeds_With_Encryption_Key() { var environment = new TestEnvironment(); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); var scriptWebEnvironment = new ScriptWebHostEnvironment(environment); var loggerFactory = new LoggerFactory(); var loggerProvider = new TestLoggerProvider(); loggerFactory.AddProvider(loggerProvider); var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict); handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.OK }); var instanceManager = new InstanceManager(_optionsFactory, TestHelpers.CreateHttpClientFactory(handlerMock.Object), scriptWebEnvironment, environment, loggerFactory.CreateLogger <InstanceManager>(), new TestMetricsLogger(), null, new Mock <IRunFromPackageHandler>().Object, new Mock <IPackageDownloadHandler>(MockBehavior.Strict).Object); var startupContextProvider = new StartupContextProvider(environment, loggerFactory.CreateLogger <StartupContextProvider>()); InstanceManager.Reset(); var podController = new KubernetesPodController(environment, instanceManager, loggerFactory, startupContextProvider); const string podEncryptionKey = "/a/vXvWJ3Hzgx4PFxlDUJJhQm5QVyGiu0NNLFm/ZMMg="; var hostAssignmentContext = new HostAssignmentContext { Environment = new Dictionary <string, string>() { [EnvironmentSettingNames.AzureWebsiteRunFromPackage] = "http://localhost:1234" } }; hostAssignmentContext.Secrets = new FunctionAppSecrets(); hostAssignmentContext.IsWarmupRequest = false; var encryptedHostAssignmentValue = SimpleWebTokenHelper.Encrypt(JsonConvert.SerializeObject(hostAssignmentContext), podEncryptionKey.ToKeyBytes()); var encryptedHostAssignmentContext = new EncryptedHostAssignmentContext() { EncryptedContext = encryptedHostAssignmentValue }; environment.SetEnvironmentVariable(EnvironmentSettingNames.PodEncryptionKey, podEncryptionKey); environment.SetEnvironmentVariable(EnvironmentSettingNames.KubernetesServiceHost, "http://localhost:80"); environment.SetEnvironmentVariable(EnvironmentSettingNames.PodNamespace, "k8se-apps"); var result = await podController.Assign(encryptedHostAssignmentContext); Assert.NotNull(startupContextProvider.Context); Assert.IsType <AcceptedResult>(result); }
public async Task Assign_MSISpecializationFailure_ReturnsError() { var environment = new TestEnvironment(); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); var scriptWebEnvironment = new ScriptWebHostEnvironment(environment); var loggerFactory = new LoggerFactory(); var loggerProvider = new TestLoggerProvider(); loggerFactory.AddProvider(loggerProvider); var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict); handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest }); var instanceManager = new InstanceManager(_optionsFactory, new HttpClient(handlerMock.Object), scriptWebEnvironment, environment, loggerFactory.CreateLogger <InstanceManager>(), new TestMetricsLogger(), null, _runFromPackageHandler.Object); var startupContextProvider = new StartupContextProvider(environment, loggerFactory.CreateLogger <StartupContextProvider>()); InstanceManager.Reset(); var instanceController = new InstanceController(environment, instanceManager, loggerFactory, startupContextProvider); const string containerEncryptionKey = "/a/vXvWJ3Hzgx4PFxlDUJJhQm5QVyGiu0NNLFm/ZMMg="; var hostAssignmentContext = new HostAssignmentContext { Environment = new Dictionary <string, string>(), MSIContext = new MSIContext() }; hostAssignmentContext.Environment[EnvironmentSettingNames.MsiEndpoint] = "http://localhost:8081"; hostAssignmentContext.Environment[EnvironmentSettingNames.MsiSecret] = "secret"; var encryptedHostAssignmentValue = SimpleWebTokenHelper.Encrypt(JsonConvert.SerializeObject(hostAssignmentContext), containerEncryptionKey.ToKeyBytes()); var encryptedHostAssignmentContext = new EncryptedHostAssignmentContext() { EncryptedContext = encryptedHostAssignmentValue }; environment.SetEnvironmentVariable(EnvironmentSettingNames.ContainerEncryptionKey, containerEncryptionKey); IActionResult result = await instanceController.Assign(encryptedHostAssignmentContext); var objectResult = result as ObjectResult; Assert.Equal(objectResult.StatusCode, 500); Assert.Equal(objectResult.Value, "Specialize MSI sidecar call failed. StatusCode=BadRequest"); }
public async Task Assignment_Does_Not_Set_Secrets_Context_For_Warmup_Request() { var environment = new TestEnvironment(); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); var scriptWebEnvironment = new ScriptWebHostEnvironment(environment); var loggerFactory = new LoggerFactory(); var loggerProvider = new TestLoggerProvider(); loggerFactory.AddProvider(loggerProvider); var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict); handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.OK }); var instanceManager = new InstanceManager(_optionsFactory, new HttpClient(handlerMock.Object), scriptWebEnvironment, environment, loggerFactory.CreateLogger <InstanceManager>(), new TestMetricsLogger(), null, _runFromPackageHandler.Object); var startupContextProvider = new StartupContextProvider(environment, loggerFactory.CreateLogger <StartupContextProvider>()); InstanceManager.Reset(); var instanceController = new InstanceController(environment, instanceManager, loggerFactory, startupContextProvider); const string containerEncryptionKey = "/a/vXvWJ3Hzgx4PFxlDUJJhQm5QVyGiu0NNLFm/ZMMg="; var hostAssignmentContext = new HostAssignmentContext { Environment = new Dictionary <string, string>() { [EnvironmentSettingNames.AzureWebsiteRunFromPackage] = "http://localhost:1234" } }; hostAssignmentContext.Secrets = new FunctionAppSecrets(); hostAssignmentContext.IsWarmupRequest = true; // Warmup Request var encryptedHostAssignmentValue = SimpleWebTokenHelper.Encrypt(JsonConvert.SerializeObject(hostAssignmentContext), containerEncryptionKey.ToKeyBytes()); var encryptedHostAssignmentContext = new EncryptedHostAssignmentContext() { EncryptedContext = encryptedHostAssignmentValue }; environment.SetEnvironmentVariable(EnvironmentSettingNames.ContainerEncryptionKey, containerEncryptionKey); await instanceController.Assign(encryptedHostAssignmentContext); Assert.Null(startupContextProvider.Context); }
public async Task ValidateContext_InvalidZipUrl_WebsiteUseZip_ReturnsError() { var environmentSettings = new Dictionary <string, string>() { { EnvironmentSettingNames.AzureWebsiteZipDeployment, "http://invalid.com/invalid/dne" } }; var environment = new TestEnvironment(); foreach (var(key, value) in environmentSettings) { environment.SetEnvironmentVariable(key, value); } var scriptWebEnvironment = new ScriptWebHostEnvironment(environment); var loggerFactory = new LoggerFactory(); var loggerProvider = new TestLoggerProvider(); loggerFactory.AddProvider(loggerProvider); var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict); handlerMock.Protected().Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>()).ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.NotFound }); var instanceManager = new InstanceManager(_optionsFactory, new HttpClient(handlerMock.Object), scriptWebEnvironment, environment, loggerFactory.CreateLogger <InstanceManager>(), new TestMetricsLogger(), null); var assignmentContext = new HostAssignmentContext { SiteId = 1234, SiteName = "TestSite", Environment = environmentSettings, IsWarmupRequest = false }; string error = await instanceManager.ValidateContext(assignmentContext); Assert.Equal("Invalid zip url specified (StatusCode: NotFound)", error); var logs = loggerProvider.GetAllLogMessages().Select(p => p.FormattedMessage).ToArray(); Assert.Collection(logs, p => Assert.StartsWith("Validating host assignment context (SiteId: 1234, SiteName: 'TestSite'. IsWarmup: 'False')", p), p => Assert.StartsWith($"Will be using {EnvironmentSettingNames.AzureWebsiteZipDeployment} app setting as zip url. IsWarmup: 'False'", p), p => Assert.StartsWith("linux.container.specialization.zip.head failed", p), p => Assert.StartsWith("linux.container.specialization.zip.head failed", p), p => Assert.StartsWith("linux.container.specialization.zip.head failed", p), p => Assert.StartsWith("ValidateContext failed", p)); }
public InstanceManagerTests() { _httpClient = new HttpClient(); _loggerProvider = new TestLoggerProvider(); _loggerFactory.AddProvider(_loggerProvider); _environment = new TestEnvironmentEx(); _scriptWebEnvironment = new ScriptWebHostEnvironment(_environment); _instanceManager = new InstanceManager(_optionsFactory, _httpClient, _scriptWebEnvironment, _environment, _loggerFactory.CreateLogger <InstanceManager>(), new TestMetricsLogger(), null); InstanceManager.Reset(); }
public InstanceManagerTests() { _httpClient = new HttpClient(); _loggerProvider = new TestLoggerProvider(); var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(_loggerProvider); _environment = new TestEnvironment(); _scriptWebEnvironment = new ScriptWebHostEnvironment(_environment); _instanceManager = new InstanceManager(new OptionsWrapper <ScriptApplicationHostOptions>(new ScriptApplicationHostOptions()), loggerFactory, _httpClient, _scriptWebEnvironment); }
public InstanceManagerTests() { _httpClient = new HttpClient(); _loggerProvider = new TestLoggerProvider(); _loggerFactory.AddProvider(_loggerProvider); _environment = new TestEnvironmentEx(); _scriptWebEnvironment = new ScriptWebHostEnvironment(_environment); _meshServiceClientMock = new Mock <IMeshServiceClient>(MockBehavior.Strict); _instanceManager = new InstanceManager(_optionsFactory, _httpClient, _scriptWebEnvironment, _environment, _loggerFactory.CreateLogger <InstanceManager>(), new TestMetricsLogger(), _meshServiceClientMock.Object); InstanceManager.Reset(); }
public void ReadRuntimeAssemblyFiles_VerifyLogs() { var environment = new TestEnvironment(); var hostEnvironment = new ScriptWebHostEnvironment(environment); var testLoggerFactory = new LoggerFactory(); TestLoggerProvider testLoggerProvider = new TestLoggerProvider(); testLoggerFactory.AddProvider(testLoggerProvider); ILogger <HostWarmupMiddleware> testLogger = testLoggerFactory.CreateLogger <HostWarmupMiddleware>(); HostWarmupMiddleware hostWarmupMiddleware = new HostWarmupMiddleware(null, new Mock <IScriptWebHostEnvironment>().Object, environment, new Mock <IScriptHostManager>().Object, testLogger); hostWarmupMiddleware.ReadRuntimeAssemblyFiles(); // Assert var traces = testLoggerProvider.GetAllLogMessages(); Assert.True(traces.Any(m => m.FormattedMessage.Contains("Number of files read:"))); }
public InstanceManagerTests() { _httpClient = new HttpClient(); _loggerProvider = new TestLoggerProvider(); var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(_loggerProvider); _environment = new TestEnvironmentEx(); _scriptWebEnvironment = new ScriptWebHostEnvironment(_environment); var optionsFactory = new TestOptionsFactory <ScriptApplicationHostOptions>(new ScriptApplicationHostOptions()); _instanceManager = new InstanceManager(optionsFactory, _httpClient, _scriptWebEnvironment, _environment, loggerFactory.CreateLogger <InstanceManager>()); InstanceManager.Reset(); }
public void InStandbyMode_ReturnsExpectedValue() { var environment = new Tests.TestEnvironment(); var mockStandbyManager = new Mock <IStandbyManager>(); var scriptHostEnvironment = new ScriptWebHostEnvironment(environment); // initially false Assert.Equal(false, scriptHostEnvironment.InStandbyMode); scriptHostEnvironment = new ScriptWebHostEnvironment(environment); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); Assert.Equal(true, scriptHostEnvironment.InStandbyMode); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "0"); Assert.Equal(false, scriptHostEnvironment.InStandbyMode); // test only set one way environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); Assert.Equal(false, scriptHostEnvironment.InStandbyMode); }
public void IsWarmUpRequest_ReturnsExpectedValue() { var environment = new TestEnvironment(); var hostEnvironment = new ScriptWebHostEnvironment(environment); var request = HttpTestHelpers.CreateHttpRequest("POST", "http://azure.com/api/warmup"); Assert.False(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); // Reset environment environment.Clear(); hostEnvironment = new ScriptWebHostEnvironment(environment); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); Assert.False(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId, "12345"); Assert.True(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); request = HttpTestHelpers.CreateHttpRequest("POST", "http://azure.com/api/csharphttpwarmup"); Assert.True(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); request = HttpTestHelpers.CreateHttpRequest("POST", "http://azure.com/api/warmup"); request.Headers.Add(ScriptConstants.AntaresLogIdHeaderName, "xyz123"); Assert.False(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); request = HttpTestHelpers.CreateHttpRequest("POST", "http://azure.com/api/foo"); Assert.False(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); // Reset environment environment.Clear(); hostEnvironment = new ScriptWebHostEnvironment(environment); environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); Assert.False(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); request = HttpTestHelpers.CreateHttpRequest("POST", "http://azure.com/api/warmup"); environment.SetEnvironmentVariable(EnvironmentSettingNames.ContainerName, "TestContainer"); Assert.True(environment.IsLinuxConsumption()); Assert.True(HostWarmupMiddleware.IsWarmUpRequest(request, hostEnvironment, environment)); }