예제 #1
0
        public async Task NodeStartupScript_UsesSuppliedBindingPort_EvenIfPortEnvironmentVariableValue_IsPresent()
        {
            // Arrange
            var nodeVersion = "10.14";
            var appName     = "webfrontend";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"export PORT=9095")
                              .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                              .AddCommand(DefaultStartupFilePath)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Say It Again", data);
            });
        }
예제 #2
0
        public async Task CanBuildAndRun_ShapelyFlaskApp_PackageDir(string pythonVersion)
        {
            // Arrange
            const string packageDir = "orx_packages";
            var          appName    = "shapely-flask-app";
            var          hostDir    = Path.Combine(_hostSamplesDir, "python", appName);
            var          volume     = DockerVolume.Create(hostDir);
            var          appDir     = volume.ContainerDir;
            var          script     = new ShellScriptBuilder()
                                      .AddCommand($"cd {appDir}")
                                      .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort} -packagedir {packageDir}")
                                      .AddCommand(DefaultStartupFilePath)
                                      .ToString();
            var imageVersion = "oryxdevms/python-" + pythonVersion;

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "python", "--language-version", pythonVersion, "-p", $"packagedir={packageDir}" },
                imageVersion,
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello Shapely, Area is: 314", data);
            });
        }
예제 #3
0
        public async Task CanRun_NetCore30App_PublishedOnMacMachine_ButRunOnNetCore30RuntimeContainer()
        {
            // This test verifies that we fallback to using 'dotnet TodoAppFromMac.dll' since the executable
            // file 'TodoAppFromMac' was indeed generated from a Mac OS and cannot be run in a Linux container.

            // Arrange
            var hostDir            = Path.Combine(_hostSamplesDir, "DotNetCore", "TodoAppFromMac");
            var volume             = DockerVolume.Create(hostDir);
            var appDir             = volume.ContainerDir;
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.RunAndAssertAppAsync(
                "oryxdevms/dotnetcore-3.0",
                _output,
                new List <DockerVolume>() { volume },
                environmentVariables : null,
                ContainerPort,
                link : null,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            },
                new DockerCli());
        }
        public async Task CanBuildAndRun_NetCore11WebApp_HavingExplicitAssemblyName()
        {
            // Arrange
            var appName            = "NetCoreApp11WithExplicitAssemblyName";
            var dotnetcoreVersion  = "1.1";
            var hostDir            = Path.Combine(_hostSamplesDir, "DotNetCore", appName);
            var volume             = DockerVolume.Create(hostDir);
            var appDir             = volume.ContainerDir;
            var portMapping        = $"{HostPort}:{ContainerPort}";
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand($"oryx -sourcePath {appDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "dotnet", "--language-version", dotnetcoreVersion },
                $"oryxdevms/dotnetcore-{dotnetcoreVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
        public async Task DotNetCoreStartupScript_UsesSuppliedBindingPort_EvenIfPortEnvironmentVariableValue_IsPresent()
        {
            // Arrange
            var dotnetcoreVersion  = "2.2";
            var hostDir            = Path.Combine(_hostSamplesDir, "DotNetCore", NetCoreApp22WebApp);
            var volume             = DockerVolume.Create(hostDir);
            var appDir             = volume.ContainerDir;
            var portMapping        = $"{HostPort}:{ContainerPort}";
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand($"export PORT=9095")
                                     .AddCommand($"oryx -sourcePath {appDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                NetCoreApp22WebApp,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "dotnet", "--language-version", dotnetcoreVersion },
                $"oryxdevms/dotnetcore-{dotnetcoreVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #6
0
        public async Task PythonStartupScript_UsesSuppliedBindingPort_EvenIfPortEnvironmentVariableValue_IsPresent()
        {
            // Arrange
            var appName = "flask-app";
            var hostDir = Path.Combine(_hostSamplesDir, "python", appName);
            var volume  = DockerVolume.Create(hostDir);
            var appDir  = volume.ContainerDir;
            var script  = new ShellScriptBuilder()
                          .AddCommand($"cd {appDir}")
                          .AddCommand($"export PORT=9095")
                          .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                          .AddCommand(DefaultStartupFilePath)
                          .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir },
                "oryxdevms/python-3.7",
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #7
0
        public async Task Node_Lab2AppServiceApp()
        {
            // Arrange
            var appName     = "lab2-appservice";
            var nodeVersion = "10.14";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                              .AddCommand(DefaultStartupFilePath)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Welcome to Express", data);
            });
        }
예제 #8
0
        public async Task CanBuildAndRunPythonApp_UsingPython37_AndVirtualEnv()
        {
            // Arrange
            var appName        = "flask-app";
            var virtualEnvName = "antenv";
            var hostDir        = Path.Combine(_hostSamplesDir, "python", appName);
            var volume         = DockerVolume.Create(hostDir);
            var appDir         = volume.ContainerDir;
            var script         = new ShellScriptBuilder()
                                 .AddCommand($"cd {appDir}")
                                 .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort} -virtualEnvName {virtualEnvName}")
                                 .AddCommand(DefaultStartupFilePath)
                                 .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-p", $"virtualenv_name={virtualEnvName}" },
                "oryxdevms/python-3.7",
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #9
0
        public async Task RunNodeAppUsingConfigYml(string nodeVersion)
        {
            var appName       = "express-config-yaml";
            var hostDir       = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume        = DockerVolume.Create(hostDir);
            var dir           = volume.ContainerDir;
            int hostPort      = 8585;
            int containerPort = 80;

            var runAppScript = new ShellScriptBuilder()
                               .AddCommand($"cd {dir}/app")
                               .AddCommand("npm install")
                               .AddCommand("cd ..")
                               .AddCommand($"oryx -bindPort {containerPort} -userStartupCommand config.yml")
                               .AddCommand("./run.sh")
                               .ToString();

            await EndToEndTestHelper.RunAndAssertAppAsync(
                imageName : $"oryxdevms/node-{nodeVersion}",
                output : _output,
                volumes : new List <DockerVolume> {
                volume
            },
                environmentVariables : null,
                portMapping : $"{hostPort}:{containerPort}",
                link : null,
                runCmd : "/bin/sh",
                runArgs : new[] { "-c", runAppScript },
                assertAction : async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Equal("Hello World from express!", data);
            },
                dockerCli : _dockerCli);
        }
예제 #10
0
        public async Task Node_CreateReactAppSample()
        {
            // Arrange
            var appName     = "create-react-app-sample";
            var nodeVersion = "10.14";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:{ContainerPort}";
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                              .AddCommand(DefaultStartupFilePath)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("<title>React App</title>", data);
            });
        }
예제 #11
0
        public async Task Node_CreateReactAppSample_singleImage()
        {
            // Arrange
            var appName     = "create-react-app-sample";
            var nodeVersion = "10";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:{ContainerPort}";
            var runScript   = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx run-script --appPath {appDir} --platform nodejs --platform-version {nodeVersion} --bindPort {ContainerPort}")
                              .AddCommand(DefaultStartupFilePath)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName : appName,
                output : _output,
                volume : volume,
                buildCmd : "oryx",
                buildArgs : new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                runtimeImageName : $"oryxdevms/build",
                portMapping : portMapping,
                runCmd : "/bin/sh",
                runArgs : new[]
            {
                "-c",
                runScript
            },
                assertAction : async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("<title>React App</title>", data);
            });
        }
예제 #12
0
        public async Task Tweeter3_Python37()
        {
            // Arrange
            var appName       = "tweeter3";
            var hostDir       = Path.Combine(_hostSamplesDir, "python", appName);
            var volume        = DockerVolume.Create(hostDir);
            var appDir        = volume.ContainerDir;
            var containerPort = 8000;
            var portMapping   = $"{HostPort}:{containerPort}";
            var script        = new ShellScriptBuilder()
                                .AddCommand($"cd {appDir}")
                                .AddCommand($"oryx -appPath {appDir} -output {startupFilePath} -hostBind=\":{containerPort}\"")
                                .AddCommand(startupFilePath)
                                .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir },
                "oryxdevms/python-3.7",
                portMapping,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("logged in as: bob", data);
            });
        }
예제 #13
0
        public async Task CanBuildAndRunNodeApp_UsingYarnForBuild_AndExplicitOutputFile()
        {
            // Arrange
            var appName         = "webfrontend-yarnlock";
            var nodeVersion     = "10.14";
            var hostDir         = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume          = DockerVolume.Create(hostDir);
            var appDir          = volume.ContainerDir;
            var portMapping     = $"{HostPort}:{ContainerPort}";
            var startupFilePath = "/tmp/startup.sh";
            var script          = new ShellScriptBuilder()
                                  .AddCommand($"cd {appDir}")
                                  .AddCommand($"oryx -appPath {appDir} -output {startupFilePath} -bindPort {ContainerPort}")
                                  .AddCommand(startupFilePath)
                                  .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx", new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh", new[] { "-c", script },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Say It Again", data);
            });
        }
예제 #14
0
        public void MultiPlatformBuild_IsDisabled()
        {
            // Arrange
            var appName      = "dotnetreact";
            var hostDir      = Path.Combine(_hostSamplesDir, "multilanguage", appName);
            var volume       = DockerVolume.Create(hostDir);
            var appDir       = volume.ContainerDir;
            var appOutputDir = $"{appDir}/myoutputdir";
            var buildScript  = new ShellScriptBuilder()
                               .AddCommand("export ENABLE_MULTIPLATFORM_BUILD=true")
                               .AddBuildCommand($"{appDir} -o {appOutputDir} -l dotnet --language-version 2.2")
                               .ToString();

            // Act
            var result = _dockerCli.Run(
                Settings.BuildImageName,
                SampleAppsTestBase.CreateAppNameEnvVar(appName),
                volume,
                commandToExecuteOnRun: "/bin/bash",
                commandArguments:
                new[]
            {
                "-c",
                buildScript
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
                Assert.DoesNotContain(@"npm install", result.StdOut);
            },
                result.GetDebugInfo());
        }
예제 #15
0
        public async Task FlaskApp_Python36()
        {
            // Arrange
            var appName     = "flask-app";
            var hostDir     = Path.Combine(_hostSamplesDir, "python", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:5000";
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx -appPath {appDir} -output {startupFilePath} -hostBind=:5000")
                              .AddCommand(startupFilePath)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "python", "--language-version", "3.6" },
                "oryxdevms/python-3.6",
                portMapping,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #16
0
        public async Task RunNodeAppUsingProcessJson_withDebugging(string nodeVersion)
        {
            var appName            = "express-process-json";
            var hostDir            = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume             = DockerVolume.Create(hostDir);
            var dir                = volume.ContainerDir;
            int hostPort           = 8585;
            int containerDebugPort = 8080;

            var runAppScript = new ShellScriptBuilder()
                               .AddCommand($"cd {dir}/app")
                               .AddCommand("npm install")
                               .AddCommand("cd ..")
                               .AddCommand($"oryx -remoteDebug -debugPort={containerDebugPort}")
                               .AddCommand("./run.sh")
                               .ToString();

            await EndToEndTestHelper.RunAndAssertAppAsync(
                imageName : $"oryxdevms/node-{nodeVersion}",
                output : _output,
                volumes : new List <DockerVolume> {
                volume
            },
                environmentVariables : null,
                portMapping : $"{hostPort}:{containerDebugPort}",
                link : null,
                runCmd : "/bin/sh",
                runArgs : new[] { "-c", runAppScript },
                assertAction : async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Say It Again", data);
            },
                dockerCli : _dockerCli);
        }
예제 #17
0
        // Twig does not support PHP < 7
        public async Task TwigExample(string phpVersion)
        {
            // Arrange
            var appName = "twig-example";
            var hostDir = Path.Combine(_hostSamplesDir, "php", appName);
            var volume  = DockerVolume.Create(hostDir);
            var appDir  = volume.ContainerDir;
            var script  = new ShellScriptBuilder()
                          .AddCommand($"cd {appDir}")
                          .AddCommand($"oryx -appPath {appDir} -output {RunScriptPath}")
                          .AddCommand(RunScriptPath)
                          .ToString();

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName, _output, volume,
                "oryx", new[] { "build", appDir, "-l", "php", "--language-version", phpVersion },
                $"oryxdevms/php-{phpVersion}",
                ContainerPort,
                "/bin/sh", new[] { "-c", script },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("<h1>Hello World!</h1>", data);
            });
        }
예제 #18
0
        public async Task CanBuildAndRun_Tweeter3App()
        {
            // Arrange
            var appName = "tweeter3";
            var hostDir = Path.Combine(_hostSamplesDir, "python", appName);
            var volume  = DockerVolume.Create(hostDir);
            var appDir  = volume.ContainerDir;
            var script  = new ShellScriptBuilder()
                          .AddCommand($"cd {appDir}")
                          .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                          .AddCommand(DefaultStartupFilePath)
                          .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir },
                "oryxdevms/python-3.7",
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("logged in as: bob", data);
            });
        }
예제 #19
0
        public async Task CanBuildAndRunPythonApp_UsingPython27_AndExplicitOutputStartupFile()
        {
            // Arrange
            var appName     = "python2-flask-app";
            var hostDir     = Path.Combine(_hostSamplesDir, "python", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var startupFile = "/tmp/startup.sh";
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx -appPath {appDir} -output {startupFile} -bindPort {ContainerPort}")
                              .AddCommand(startupFile)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "python", "--language-version", "2.7" },
                "oryxdevms/python-2.7",
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #20
0
        public async Task CanBuildAndRunNodeApp_OnSecondBuild_AfterNotZippingNodeModules_InFirstBuild()
        {
            // NOTE:
            // 1. Use intermediate directory(which here is local to container) to avoid errors like
            //      "tar: node_modules/form-data: file changed as we read it"
            //    related to zipping files on a folder which is volume mounted.
            // 2. Use output directory within the container due to 'rsync'
            //    having issues with volume mounted directories

            // Arrange
            var appOutputDirPath = Directory.CreateDirectory(Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N")))
                                   .FullName;
            var appOutputDirVolume = DockerVolume.Create(appOutputDirPath);
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var nodeVersion        = "10.14";
            var appName            = "webfrontend";
            var hostDir            = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume             = DockerVolume.Create(hostDir);
            var appDir             = volume.ContainerDir;
            var portMapping        = $"{HostPort}:{ContainerPort}";
            var script             = new ShellScriptBuilder()
                                     .AddCommand($"cd {appDir}")
                                     .AddCommand($"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            var buildScript = new ShellScriptBuilder()
                              .AddCommand($"oryx build {appDir} -i /tmp/int -o /tmp/out -l nodejs --language-version {nodeVersion}")
                              .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o /tmp/out -l nodejs " +
                $"--language-version {nodeVersion} -p compress_node_modules=tar-gz")
                              .AddCommand($"cp -rf /tmp/out/* {appOutputDir}")
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                appOutputDirVolume, volume
            },
                "/bin/sh",
                new[]
            {
                "-c",
                buildScript
            },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Say It Again", data);
            });
        }
예제 #21
0
        public async Task ImagickExample(string phpVersion)
        {
            // Arrange
            var appName   = "imagick-example";
            var hostDir   = Path.Combine(_hostSamplesDir, "php", appName);
            var volume    = DockerVolume.Create(hostDir);
            var appDir    = volume.ContainerDir;
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"cd {appDir}")
                            .AddCommand($"oryx -appPath {appDir} -output {RunScriptPath}")
                            .AddCommand(RunScriptPath)
                            .ToString();

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName, _output, volume,
                "oryx", new[] { "build", appDir, "-l", "php", "--language-version", phpVersion },
                $"oryxdevms/php-{phpVersion}",
                $"{HostPort}:80",
                "/bin/sh", new[] { "-c", runScript },
                async() =>
            {
                string imagickOutput = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Equal("64x64", imagickOutput);
            });
        }
예제 #22
0
        public async Task CanBuildAndRun_NodeApp_WithAppInsights_Configured(string nodeVersion)
        {
            // Arrange
            var appName     = "linxnodeexpress";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:{ContainerPort}";
            var spcifyNodeVersionCommand = "-l nodejs --language-version=" + nodeVersion;
            var aIKey       = "APPINSIGHTS_INSTRUMENTATIONKEY";
            var buildScript = new ShellScriptBuilder()
                              .AddCommand($"oryx build {appDir} -o {appDir} {spcifyNodeVersionCommand} --log-file {appDir}/1.log")
                              .AddDirectoryExistsCheck($"{appDir}/node_modules")
                              .AddFileExistsCheck($"{appDir}/oryx-appinsightsloader.js")
                              .AddFileExistsCheck($"{appDir}/oryx-manifest.toml")
                              .AddStringExistsInFileCheck("injectedAppInsights=\"True\"", $"{appDir}/oryx-manifest.toml")
                              .ToString();

            var runScript = new ShellScriptBuilder()
                            .AddCommand($"export {aIKey}=asdas")
                            .AddCommand($"cd {appDir}")
                            .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                            .AddCommand(DefaultStartupFilePath)
                            .AddFileExistsCheck($"{appDir}/oryx-appinsightsloader.js")
                            .AddFileExistsCheck($"{appDir}/oryx-manifest.toml")
                            .AddStringExistsInFileCheck("injectedAppInsights=\"True\"", $"{appDir}/oryx-manifest.toml")
                            .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                volume
            },
                "/bin/bash",
                new[]
            {
                "-c",
                buildScript
            },
                $"oryxdevms/node-{nodeVersion}",
                new List <EnvironmentVariable> {
                new EnvironmentVariable(aIKey, "asdasda")
            },
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                runScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World from express!", data);
            });
        }
예제 #23
0
        public async Task CanBuildAndRunNodeApp_UsingZippedNodeModules(string compressFormat, string nodeVersion)
        {
            // NOTE:
            // 1. Use intermediate directory(which here is local to container) to avoid errors like
            //      "tar: node_modules/form-data: file changed as we read it"
            //    related to zipping files on a folder which is volume mounted.
            // 2. Use output directory within the container due to 'rsync'
            //    having issues with volume mounted directories

            // Arrange
            var appOutputDirPath = Directory.CreateDirectory(Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N")))
                                   .FullName;
            var appOutputDirVolume = DockerVolume.Create(appOutputDirPath);
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var appName            = "linxnodeexpress";
            var hostDir            = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume             = DockerVolume.Create(hostDir);
            var appDir             = volume.ContainerDir;
            var runAppScript       = new ShellScriptBuilder()
                                     .AddCommand($"cd {appDir}")
                                     .AddCommand($"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            var buildScript = new ShellScriptBuilder()
                              .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o /tmp/out -l nodejs " +
                $"--language-version {nodeVersion} -p compress_node_modules={compressFormat}")
                              .AddCommand($"cp -rf /tmp/out/* {appOutputDir}")
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                appOutputDirVolume, volume
            },
                "/bin/sh",
                new[]
            {
                "-c",
                buildScript
            },
                $"oryxdevms/node-{nodeVersion}",
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                runAppScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Equal("Hello World from express!", data);
            });
        }
예제 #24
0
        public async Task GeneratesScript_CanRun_AppInsightsModule_NotFound(string nodeVersion)
        {
            // This test is for the following scenario:
            // When we find injectedAppInsight=True in the manifest file, we assume that appinsights
            // has been injected and it's installed during build (npm install). But for some reason if we
            // don't see the appinsights node_module we shouldn't break the app. We should run the app
            // and additionally print the exception message

            // Arrange
            var imageName              = string.Concat("oryxdevms/node-", nodeVersion);
            var hostSamplesDir         = Path.Combine(Directory.GetCurrentDirectory(), "SampleApps");
            var volume                 = DockerVolume.Create(Path.Combine(hostSamplesDir, "nodejs", "linxnodeexpress"));
            var appDir                 = volume.ContainerDir;
            var manifestFileContent    = "injectedAppInsight=\"True\"";
            var aiNodesdkLoaderContent = @"try {
                var appInsights = require('applicationinsights');  
                if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY)
                { 
                    appInsights.setup().start();
                } 
                }catch (e) { 
                    console.log(e); 
                } ";

            int hostPort           = 8585;
            int containerDebugPort = 8080;

            var script = new ShellScriptBuilder()
                         .CreateFile(appDir + "/oryx-manifest.toml", manifestFileContent)
                         .CreateFile(appDir + "/oryx-appinsightsloader.js", aiNodesdkLoaderContent)
                         .AddCommand($"cd {appDir}")
                         .AddCommand("npm install")
                         .AddCommand($"oryx -appPath {appDir}")
                         .AddDirectoryExistsCheck($"{appDir}/node_modules")
                         .AddDirectoryDoesNotExistCheck($"{appDir}/node_modules/applicationinsights")
                         .AddCommand("./run.sh")
                         .ToString();

            await EndToEndTestHelper.RunAndAssertAppAsync(
                imageName : $"oryxdevms/node-{nodeVersion}",
                output : _output,
                volumes : new List <DockerVolume> {
                volume
            },
                environmentVariables : null,
                portMapping : $"{hostPort}:{containerDebugPort}",
                link : null,
                runCmd : "/bin/sh",
                runArgs : new[] { "-c", script },
                assertAction : async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World from express!", data);
            },
                dockerCli : _dockerCli);
        }
예제 #25
0
        public async Task CanBuildAndRunPythonApp_UsingPython37_AndCompressedVirtualEnv(
            string compressOption,
            string expectedCompressFileNameExtension)
        {
            // Arrange
            var appName          = "flask-app";
            var virtualEnvName   = "antenv";
            var hostDir          = Path.Combine(_hostSamplesDir, "python", appName);
            var volume           = DockerVolume.Create(hostDir);
            var appDir           = volume.ContainerDir;
            var portMapping      = $"{HostPort}:{ContainerPort}";
            var appOutputDirPath = Directory.CreateDirectory(
                Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N"))).FullName;
            var appOutputDirVolume = DockerVolume.Create(appOutputDirPath);
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var tempOutputDir      = "/tmp/output";
            var buildScript        = new ShellScriptBuilder()
                                     .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o {tempOutputDir}" +
                $" -p virtualenv_name={virtualEnvName} -p compress_virtualenv={compressOption}")
                                     .AddDirectoryDoesNotExistCheck($"{tempOutputDir}/{virtualEnvName}")
                                     .AddFileExistsCheck($"{tempOutputDir}/{virtualEnvName}.{expectedCompressFileNameExtension}")
                                     .AddCommand($"cp -rf {tempOutputDir}/* {appOutputDir}")
                                     .ToString();
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"cd {appDir}")
                            .AddCommand($"oryx -appPath {appOutputDir} -bindPort {ContainerPort} -virtualEnvName {virtualEnvName}")
                            .AddCommand(DefaultStartupFilePath)
                            .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                appOutputDirVolume, volume
            },
                "/bin/bash",
                new[]
            {
                "-c",
                buildScript
            },
                "oryxdevms/python-3.7",
                portMapping,
                "/bin/bash",
                new[]
            {
                "-c",
                runScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #26
0
        protected async Task RunTestAsync(
            string language,
            string languageVersion,
            string samplePath,
            string databaseServerContainerName)
        {
            var volume           = DockerVolume.Create(samplePath);
            var appDir           = volume.ContainerDir;
            var portMapping      = $"{HostPort}:8000";
            var entrypointScript = "./start.sh";
            var script           = new ShellScriptBuilder()
                                   .AddCommand($"cd {appDir}")
                                   .AddCommand($"oryx -appPath {appDir} -output {entrypointScript}")
                                   .AddCommand(entrypointScript)
                                   .ToString();

            var runtimeImageName = $"oryxdevms/{language}-{languageVersion}";

            if (string.Equals(language, "nodejs", StringComparison.OrdinalIgnoreCase))
            {
                runtimeImageName = $"oryxdevms/node-{languageVersion}";
            }

            // For SqlLite scenarios where there is no database container, there wouldn't be any link
            string link = null;

            if (!string.IsNullOrEmpty(databaseServerContainerName))
            {
                link = $"{databaseServerContainerName}:{Constants.InternalDbLinkName}";
            }

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                OutputHelper,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", language, "--language-version", languageVersion },
                runtimeImageName,
                new List <EnvironmentVariable>() { new EnvironmentVariable(Constants.DatabaseUserPwdEnvVar, Constants.DatabaseUserPwd) },
                portMapping,
                link,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await HttpClient.GetStringAsync($"http://localhost:{HostPort}/");

                // Python samples are appending newline character at the end of their response.
                data = data.TrimEnd('\n');

                Assert.Equal(expectedOutput, data);
            });
        }
예제 #27
0
        public async Task CanRun_SelfContainedApp_TargetedForLinux()
        {
            // ****************************************************************
            // A self-contained app is an app which does not depend on whether a .NET Core runtime is present on the
            // target machine or not. It has all the required dependencies (.dlls etc.) in its published output itself,
            // hence it is called self-contained app.
            //
            // To test if our runtime images run self-contained apps correctly (i.e not using the dotnet runtime
            // installed in the runtime image itself), in this test we publish a self-contained 3.0 app and run it in
            // a 1.1 runtime container. This is because 1.1 runtime container does not have 3.0 bits at all and hence
            // if the app fails to run in that container, then we are doing something wrong. If all is well, this 3.0
            // app should run fine.
            // ****************************************************************

            // Arrange
            var hostDir          = Path.Combine(_hostSamplesDir, "DotNetCore", NetCoreApp30WebApp);
            var volume           = DockerVolume.Create(hostDir);
            var appDir           = volume.ContainerDir;
            var appOutputDir     = $"{appDir}/myoutputdir";
            var buildImageScript = new ShellScriptBuilder()
                                   .AddCommand($"source benv dotnet=3")
                                   .AddCommand($"cd {appDir}")
                                   .AddCommand($"dotnet publish -c release -r linux-x64 -o {appOutputDir}")
                                   .ToString();
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand(
                $"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                NetCoreApp30WebApp,
                _output,
                volume,
                "/bin/bash",
                new[]
            {
                "-c",
                buildImageScript
            },
                "oryxdevms/dotnetcore-1.1",
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #28
0
        public async Task CanBuildAndRunNodeApp_WithDebugger(string nodeVersion)
        {
            // Arrange
            var appOutputDirPath = Directory.CreateDirectory(Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N")))
                                   .FullName;
            var       appOutputDirVolume = DockerVolume.Create(appOutputDirPath);
            var       appOutputDir       = appOutputDirVolume.ContainerDir;
            var       appName            = "linxnodeexpress";
            var       hostDir            = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var       volume             = DockerVolume.Create(hostDir);
            var       appDir             = volume.ContainerDir;
            const int localPort          = 9393;
            const int containerDebugPort = 9595;
            var       portMapping        = $"{localPort}:{containerDebugPort}";
            var       runAppScript       = new ShellScriptBuilder()
                                           .AddCommand($"cd {appDir}")
                                           .AddCommand($"oryx -appPath {appOutputDir} -remoteDebug -debugPort {containerDebugPort}")
                                           .AddCommand(DefaultStartupFilePath)
                                           .ToString();

            var buildScript = new ShellScriptBuilder()
                              .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o /tmp/out -l nodejs " +
                $"--language-version {nodeVersion} -p compress_node_modules=tar-gz")
                              .AddCommand($"cp -rf /tmp/out/* {appOutputDir}")
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                appOutputDirVolume, volume
            },
                "/bin/sh",
                new[]
            {
                "-c",
                buildScript
            },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                runAppScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{localPort}/json/list");
                Assert.Contains("devtoolsFrontendUrl", data);
            });
        }
예제 #29
0
        public async Task CanBuildAndRun_NetCore21WebApp_UsingExplicitStartupCommand()
        {
            // Arrange
            var dotnetcoreVersion = "2.1";
            var hostDir           = Path.Combine(_hostSamplesDir, "DotNetCore", NetCoreApp21WebApp);
            var volume            = DockerVolume.Create(hostDir);
            var appDir            = volume.ContainerDir;
            var portMapping       = $"{HostPort}:{ContainerPort}";
            var startupFilePath   = "/tmp/run.sh";
            var startupCommand    = "\"dotnet foo.dll\"";
            var appOutputDir      = $"{appDir}/myoutputdir";
            var buildImageScript  = new ShellScriptBuilder()
                                    .AddCommand($"oryx build {appDir} -l dotnet --language-version {dotnetcoreVersion} -o {appOutputDir}")
                                    .ToString();
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand(
                $"cp {appOutputDir}/{NetCoreApp21WebApp}.dll {appOutputDir}/foo.dll")
                                     .AddCommand($"rm -f {appOutputDir}/{NetCoreApp21WebApp}.dll")
                                     .AddCommand(
                $"cp {appOutputDir}/{NetCoreApp21WebApp}.runtimeconfig.json {appOutputDir}/foo.runtimeconfig.json")
                                     .AddCommand($"rm -f {appOutputDir}/{NetCoreApp21WebApp}.runtimeconfig.json")
                                     .AddCommand(
                $"oryx -appPath {appOutputDir} -output {startupFilePath} " +
                $"-userStartupCommand {startupCommand} -bindPort {ContainerPort}")
                                     .AddCommand(startupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                NetCoreApp21WebApp,
                _output,
                volume,
                "/bin/sh",
                new[]
            {
                "-c",
                buildImageScript
            },
                $"oryxdevms/dotnetcore-{dotnetcoreVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
예제 #30
0
        public async Task CanBuildAndRun_DjangoPython36App_UsingVirtualEnv()
        {
            // Arrange
            var          appName        = "django-app";
            var          hostDir        = Path.Combine(_hostSamplesDir, "python", appName);
            var          volume         = DockerVolume.Create(hostDir);
            var          appDir         = volume.ContainerDir;
            var          portMapping    = $"{HostPort}:{ContainerPort}";
            const string virtualEnvName = "antenv3.6";
            var          buildScript    = new ShellScriptBuilder()
                                          .AddBuildCommand($"{appDir} -l python --language-version 3.6 -p virtualenv_name={virtualEnvName}")
                                          .ToString();
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"cd {appDir}")
                            .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                            .AddCommand(DefaultStartupFilePath)
                            .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "/bin/bash",
                new[]
            {
                "-c",
                buildScript
            },
                "oryxdevms/python-3.6",
                portMapping,
                "/bin/bash",
                new[]
            {
                "-c",
                runScript
            },
                async() =>
            {
                var data = await GetResponseDataAsync($"http://localhost:{HostPort}/staticfiles/css/boards.css");
                Assert.Contains("CSS file from Boards app module", data);

                data = await GetResponseDataAsync($"http://localhost:{HostPort}/staticfiles/css/uservoice.css");
                Assert.Contains("CSS file from UserVoice app module", data);

                data = await GetResponseDataAsync($"http://localhost:{HostPort}/boards/");
                Assert.Contains("Hello, World! from Boards app", data);

                data = await GetResponseDataAsync($"http://localhost:{HostPort}/uservoice/");
                Assert.Contains("Hello, World! from Uservoice app", data);
            });
        }