private IEnumerable <IWorkerProvider> TestReadWorkerProviderFromConfig(IEnumerable <TestLanguageWorkerConfig> configs, ILogger testLogger, string language = null, Dictionary <string, string> keyValuePairs = null) { var workerPathSection = $"{LanguageWorkerConstants.LanguageWorkersSectionName}:{LanguageWorkerConstants.WorkersDirectorySectionName}"; try { foreach (var workerConfig in configs) { CreateWorkerFolder(rootPath, workerConfig); } IConfigurationRoot config = TestConfigBuilder(workerPathSection, keyValuePairs); var scriptHostConfig = new ScriptHostConfiguration(); var scriptSettingsManager = new ScriptSettingsManager(config); var configFactory = new WorkerConfigFactory(config, testLogger); return(configFactory.GetWorkerProviders(testLogger, scriptSettingsManager, language: language)); } finally { DeleteTestDir(rootPath); DeleteTestDir(customRootPath); } }
private IEnumerable <IWorkerProvider> TestReadWorkerProviderFromConfig(IEnumerable <TestLanguageWorkerConfig> configs, ILogger testLogger, string language = null, Dictionary <string, string> keyValuePairs = null, bool appSvcEnv = false) { var workerPathSection = $"{LanguageWorkerConstants.LanguageWorkersSectionName}:{LanguageWorkerConstants.WorkersDirectorySectionName}"; try { foreach (var workerConfig in configs) { CreateWorkerFolder(rootPath, workerConfig); } IConfigurationRoot config = TestConfigBuilder(workerPathSection, keyValuePairs); var scriptHostConfig = new ScriptHostConfiguration(); var scriptSettingsManager = new ScriptSettingsManager(config); var configFactory = new WorkerConfigFactory(config, testLogger); if (appSvcEnv) { var testEnvVariables = new Dictionary <string, string> { { EnvironmentSettingNames.AzureWebsiteInstanceId, "123" }, }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { return(configFactory.GetWorkerProviders(testLogger, scriptSettingsManager, language: language)); } } return(configFactory.GetWorkerProviders(testLogger, scriptSettingsManager, language: language)); } finally { DeleteTestDir(rootPath); DeleteTestDir(customRootPath); } }
public void SetsDebugPort() { var lang = "test"; var extension = ".test"; var defaultWorkerPath = "./test"; var workerPath = "/path/to/custom/worker"; var config = new ConfigurationBuilder() .AddInMemoryCollection(new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>($"workers:{lang}:debug", "1000"), new KeyValuePair <string, string>($"workers:{lang}:path", workerPath), }) .Build(); var logger = new TestLogger("test"); var workerConfigFactory = new WorkerConfigFactory(config, logger); var workerConfigs = workerConfigFactory.GetConfigs(new List <IWorkerProvider>() { new TestWorkerProvider() { Language = lang, Extension = extension, DefaultWorkerPath = defaultWorkerPath } }); Assert.Equal(workerConfigs.Single().Arguments.WorkerPath, workerPath); }
public void LanguageWorker_HydratedWorkerPath_UnsupportedEnvironmentRuntimeVersion() { _testEnvironment.SetEnvironmentVariable(LanguageWorkerConstants.FunctionWorkerRuntimeVersionSettingName, "3.4"); RpcWorkerDescription workerDescription = new RpcWorkerDescription() { Arguments = new List <string>(), DefaultExecutablePath = "python", SupportedRuntimeVersions = new List <string>() { "3.6", "3.7" }, DefaultWorkerPath = $"{LanguageWorkerConstants.RuntimeVersionPlaceholder}/worker.py", WorkerDirectory = string.Empty, Extensions = new List <string>() { ".py" }, Language = "python", DefaultRuntimeVersion = "3.7" // Ignore this if environment is set }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment); var ex = Assert.Throws <NotSupportedException>(() => configFactory.GetHydratedWorkerPath(workerDescription)); Assert.Equal(ex.Message, $"Version 3.4 is not supported for language {workerDescription.Language}"); }
public void DefaultLanguageWorkersDir() { var expectedWorkersDir = Path.Combine(Path.GetDirectoryName(new Uri(typeof(WorkerConfigFactory).Assembly.CodeBase).LocalPath), LanguageWorkerConstants.DefaultWorkersDirectoryName); var config = new ConfigurationBuilder().Build(); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); Assert.Equal(expectedWorkersDir, configFactory.WorkersDirPath); }
/// <summary> /// Initializes a new instance of the <see cref="IronClient" /> class. /// </summary> /// <param name="name">Client name</param> /// <param name="version">Version of the client</param> /// <param name="product">Iron.io product</param> /// <param name="host">hostname to use</param> /// <param name="port">port number</param> /// <param name="projectId">Project identifier available from the HUD</param> /// <param name="token">Token available from the HUD</param> /// <param name="protocol">Protocol e.g. http https</param> /// <param name="apiVersion">Version of the API to use (1,2)</param> /// <param name="configFile">Path to a specific JSON configuration file to load</param> public IronClient(string name, string version, string product, string host = null, int port = 0, string projectId = null, string token = null, string protocol = null, int apiVersion = 0, string configFile = null) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("Name cannot be null or empty"); } AutoMapper.Mapper.CreateMap <Configuration, Configuration>().ForMember(c => c.Port, opt => opt.Condition(s => s.Port > 0)) .ForMember(c => c.ApiVersion, opt => opt.Condition(s => s.ApiVersion > 0)) .ForMember(c => c.Host, opt => opt.Condition(s => !string.IsNullOrEmpty(s.Host))) .ForMember(c => c.ProjectId, opt => opt.Condition(s => !string.IsNullOrEmpty(s.ProjectId))) .ForMember(c => c.Token, opt => opt.Condition(s => !string.IsNullOrEmpty(s.Token))) .ForMember(c => c.Protocol, opt => opt.Condition(s => !string.IsNullOrEmpty(s.Protocol))); ConfigurationFactory configFactory = new DefaultConfigurationFactory(); if (product == "iron_mq") { configFactory = new MQConfigFactory(configFactory); } if (product == "iron_worker") { configFactory = new WorkerConfigFactory(configFactory); } if (product == "iron_cache") { configFactory = new CacheConfigFactory(configFactory); } string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) ? Environment.GetEnvironmentVariable("HOME") : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); configFactory = new JsonConfigFactory(configFactory, System.IO.Path.Combine(homePath, ".iron.json")); configFactory = new EnvConfigFactory(configFactory); configFactory = new JsonConfigFactory(configFactory, "iron.json"); configFactory = new JsonConfigFactory(configFactory, configFile); configFactory = new ArgsConfigFactory(configFactory, name, version, product, host, port, projectId, token, protocol, apiVersion); this.Config = configFactory.GetConfiguartion(); if (string.IsNullOrEmpty(this.Config.ProjectId)) { throw new Exception("No projectId set. projectId is a required field."); } if (string.IsNullOrEmpty(this.Config.Token)) { throw new Exception("No token set. token is a required field."); } this.BuildHeaders(); }
public void LanguageWorker_WorkersDir_Set() { var expectedWorkersDir = @"d:\testWorkersDir"; var config = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { [$"{LanguageWorkerConstants.LanguageWorkersSectionName}:{LanguageWorkerConstants.WorkersDirectorySectionName}"] = expectedWorkersDir }) .Build(); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); Assert.Equal(expectedWorkersDir, configFactory.WorkersDirPath); }
public void LanguageWorker_WorkersDir_NotSet() { var expectedWorkersDir = Path.Combine(Path.GetDirectoryName(new Uri(typeof(WorkerConfigFactory).Assembly.CodeBase).LocalPath), LanguageWorkerConstants.DefaultWorkersDirectoryName); var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); Assert.Equal(expectedWorkersDir, configFactory.WorkersDirPath); }
public void LanguageWorker_HydratedWorkerPath_UnsupportedArchitecture(Architecture unsupportedArch) { RpcWorkerDescription workerDescription = new RpcWorkerDescription() { Arguments = new List <string>(), DefaultExecutablePath = "python", DefaultWorkerPath = "{architecture}/worker.py", WorkerDirectory = string.Empty, SupportedArchitectures = new List <string>() { Architecture.X64.ToString(), Architecture.X86.ToString() }, SupportedRuntimeVersions = new List <string>() { "3.6", "3.7" }, SupportedOperatingSystems = new List <string>() { OSPlatform.Windows.ToString(), OSPlatform.OSX.ToString(), OSPlatform.Linux.ToString() }, Extensions = new List <string>() { ".py" }, Language = "python", DefaultRuntimeVersion = "3.7" }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); Mock <ISystemRuntimeInformation> mockRuntimeInfo = new Mock <ISystemRuntimeInformation>(); mockRuntimeInfo.Setup(r => r.GetOSArchitecture()).Returns(unsupportedArch); mockRuntimeInfo.Setup(r => r.GetOSPlatform()).Returns(OSPlatform.Linux); var configFactory = new WorkerConfigFactory(config, testLogger, mockRuntimeInfo.Object, _testEnvironment); var ex = Assert.Throws <PlatformNotSupportedException>(() => configFactory.GetHydratedWorkerPath(workerDescription)); Assert.Equal(ex.Message, $"Architecture {unsupportedArch.ToString()} is not supported for language {workerDescription.Language}"); }
public void FailsIfNoJavaHome() { var config = new ConfigurationBuilder() .AddInMemoryCollection(new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>($"{LanguageWorkerConstants.LanguageWorkersSectionName}:{LanguageWorkerConstants.JavaLanguageWorkerName}:debug", "1000") }) .Build(); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var provider = new JavaWorkerProvider(configFactory.WorkerDirPath); var args = new WorkerProcessArguments(); var result = provider.TryConfigureArguments(args, config, testLogger); Assert.False(result); }
public void DisablesDebugIfNotConfigured() { var config = new ConfigurationBuilder() .AddInMemoryCollection(new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("JAVA_HOME", "asdf"), }) .Build(); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var provider = new JavaWorkerProvider(configFactory.WorkerDirPath); var args = new WorkerProcessArguments(); var result = provider.TryConfigureArguments(args, config, testLogger); Assert.True(result); Assert.DoesNotContain(args.ExecutableArguments, (exeArg) => exeArg.Contains("address=")); }
public void LanguageWorker_HydratedWorkerPath_EnvironmentVersionNotSet(string defaultWorkerPath, string expectedPath) { // We fall back to the default version when this is not set // Environment.SetEnvironmentVariable(LanguageWorkerConstants.FunctionWorkerRuntimeVersionSettingName, "3.7"); RpcWorkerDescription workerDescription = new RpcWorkerDescription() { Arguments = new List <string>(), DefaultExecutablePath = "python", SupportedArchitectures = new List <string>() { Architecture.X64.ToString(), Architecture.X86.ToString() }, SupportedRuntimeVersions = new List <string>() { "3.6", "3.7" }, SupportedOperatingSystems = new List <string>() { OSPlatform.Windows.ToString(), OSPlatform.OSX.ToString(), OSPlatform.Linux.ToString() }, DefaultWorkerPath = defaultWorkerPath, WorkerDirectory = string.Empty, Extensions = new List <string>() { ".py" }, Language = "python", DefaultRuntimeVersion = "3.6" }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment); Assert.Equal(expectedPath, configFactory.GetHydratedWorkerPath(workerDescription)); }
public void SetsDebugAddress() { var config = new ConfigurationBuilder() .AddInMemoryCollection(new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("JAVA_HOME", "asdf"), new KeyValuePair <string, string>($"{LanguageWorkerConstants.LanguageWorkersSectionName}:{LanguageWorkerConstants.JavaLanguageWorkerName}:debug", "localhost:1000") }) .Build(); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var provider = new JavaWorkerProvider(configFactory.WorkerDirPath); var args = new WorkerProcessArguments(); var result = provider.TryConfigureArguments(args, config, testLogger); Assert.True(result); Assert.Contains(args.ExecutableArguments, (exeArg) => exeArg.Contains("address=localhost:1000")); }
public void OverridesJavaHomeInAzure() { var config = new ConfigurationBuilder() .AddInMemoryCollection(new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("JAVA_HOME", "d:/java/jdk1.7.0"), new KeyValuePair <string, string>("WEBSITE_INSTANCE_ID", "id"), }) .Build(); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var provider = new JavaWorkerProvider(configFactory.WorkerDirPath); var args = new WorkerProcessArguments(); var result = provider.TryConfigureArguments(args, config, testLogger); Assert.True(result); var exePath = Path.GetFullPath("d:/java/zulu8.23.0.3-jdk8.0.144-win_x64/bin/java"); Assert.Equal(exePath, args.ExecutablePath); }
public void JavaPath_JavaHome_NotSet() { var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment); var testEnvVariables = new Dictionary <string, string> { { "JAVA_HOME", string.Empty } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { var javaPath = configFactory.GetExecutablePathForJava("java"); Assert.Equal("java", javaPath); } }
public void AddArgumentsFromAppSettings_JavaOpts(string expectedArgument, string javaOpts) { WorkerDescription workerDescription = new WorkerDescription() { Arguments = new List <string>() { "-jar" }, DefaultExecutablePath = "java", DefaultWorkerPath = "javaworker.jar", Extensions = new List <string>() { ".jar" }, Language = "java" }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test", ["languageWorkers:java:arguments"] = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var languageSection = config.GetSection("languageWorkers:java"); var testEnvVariables = new Dictionary <string, string> { { "JAVA_OPTS", javaOpts } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { WorkerConfigFactory.AddArgumentsFromAppSettings(workerDescription, languageSection); Assert.Equal(2, workerDescription.Arguments.Count); Assert.Equal(expectedArgument, workerDescription.Arguments[1]); } }
public void JavaPath_JavaHome_Set() { var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var testEnvVariables = new Dictionary <string, string> { { "JAVA_HOME", @"D:\Program Files\Java\jdk1.7.0_51" } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { var javaPath = configFactory.GetExecutablePathForJava("java"); Assert.Equal(@"D:\Program Files\Java\jdk1.7.0_51\bin\java", javaPath); } }
private IEnumerable <WorkerConfig> TestReadWorkerProviderFromConfig(IEnumerable <TestLanguageWorkerConfig> configs, ILogger testLogger, string language = null, Dictionary <string, string> keyValuePairs = null, bool appSvcEnv = false) { Mock <IEnvironment> mockEnvironment = new Mock <IEnvironment>(); var workerPathSection = $"{LanguageWorkerConstants.LanguageWorkersSectionName}:{OutOfProcConstants.WorkersDirectorySectionName}"; try { foreach (var workerConfig in configs) { WorkerConfigTestUtilities.CreateWorkerFolder(rootPath, workerConfig); } IConfigurationRoot config = TestConfigBuilder(workerPathSection, keyValuePairs); var scriptHostOptions = new ScriptJobHostOptions(); var scriptSettingsManager = new ScriptSettingsManager(config); var configFactory = new WorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment); if (appSvcEnv) { var testEnvVariables = new Dictionary <string, string> { { EnvironmentSettingNames.AzureWebsiteInstanceId, "123" }, }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { configFactory.BuildWorkerProviderDictionary(); return(configFactory.GetConfigs()); } } configFactory.BuildWorkerProviderDictionary(); return(configFactory.GetConfigs()); } finally { WorkerConfigTestUtilities.DeleteTestDir(rootPath); WorkerConfigTestUtilities.DeleteTestDir(customRootPath); } }
public void JavaPath_AppServiceEnv() { var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new WorkerConfigFactory(config, testLogger); var testEnvVariables = new Dictionary <string, string> { { EnvironmentSettingNames.AzureWebsiteInstanceId, "123" }, { "JAVA_HOME", @"D:\Program Files\Java\jdk1.7.0_51" } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { var javaPath = configFactory.GetExecutablePathForJava("../../zulu8.23.0.3-jdk8.0.144-win_x64/bin/java"); Assert.Equal(@"D:\Program Files\Java\zulu8.23.0.3-jdk8.0.144-win_x64\bin\java", javaPath); } }