コード例 #1
0
        public void TestToBuildConfiguration_containerConfigurationAdd()
        {
            FibContainerBuilder fibContainerBuilder =
                new FibContainerBuilder(RegistryImage.Named("base/image"), buildConfigurationBuilder)
                .SetEntrypoint("entry", "point")
                .SetEnvironment(ImmutableDic.Of("name", "value"))
                .AddEnvironmentVariable("environment", "variable")
                .SetExposedPorts(Port.Tcp(1234), Port.Udp(5678))
                .AddExposedPort(Port.Tcp(1337))
                .SetLabels(ImmutableDic.Of("key", "value"))
                .AddLabel("added", "label")
                .SetProgramArguments("program", "arguments");

            BuildConfiguration buildConfiguration =
                fibContainerBuilder.ToBuildConfiguration(
                    Containerizer.To(RegistryImage.Named("target/image")));
            IContainerConfiguration containerConfiguration = buildConfiguration.GetContainerConfiguration();

            Assert.AreEqual(new[] { "entry", "point" }, containerConfiguration.GetEntrypoint());
            Assert.AreEqual(
                ImmutableDic.Of("name", "value", "environment", "variable"),
                containerConfiguration.GetEnvironmentMap());
            Assert.AreEqual(
                ImmutableHashSet.Create(Port.Tcp(1234), Port.Udp(5678), Port.Tcp(1337)),
                containerConfiguration.GetExposedPorts());
            Assert.AreEqual(
                ImmutableDic.Of("key", "value", "added", "label"), containerConfiguration.GetLabels());
            Assert.AreEqual(
                new[] { "program", "arguments" }, containerConfiguration.GetProgramArguments());
            Assert.AreEqual(Instant.FromUnixTimeSeconds(0), containerConfiguration.GetCreationTime());
        }
コード例 #2
0
        public void TestGetters_default()
        {
            RegistryImage image = RegistryImage.Named("registry/image");

            Assert.AreEqual("registry/image", image.GetImageReference().ToString());
            Assert.AreEqual(0, image.GetCredentialRetrievers().Count);
        }
コード例 #3
0
        protected override IContainerizer CreateContainerizer(FibCliConfiguration configuration)
        {
            var toImage = RegistryImage.Named(configuration.GetTargetImageReference());

            if (configuration.TargetImageCredential != null && !string.IsNullOrEmpty(configuration.TargetImageCredential.UserName) &&
                !string.IsNullOrEmpty(configuration.TargetImageCredential.Password))
            {
                toImage.AddCredential(configuration.TargetImageCredential.UserName, configuration.TargetImageCredential.Password);
            }
            return(Containerizer.To(toImage));
        }
コード例 #4
0
        public void TestTo()
        {
            RegistryImage     registryImage     = RegistryImage.Named(ImageReference.Of(null, "repository", null));
            DockerDaemonImage dockerDaemonImage =
                DockerDaemonImage.Named(ImageReference.Of(null, "repository", null));
            TarImage tarImage =
                TarImage.Named(ImageReference.Of(null, "repository", null)).SaveTo(Paths.Get("ignored"));

            VerifyTo(Containerizer.To(registryImage));
            VerifyTo(Containerizer.To(dockerDaemonImage));
            VerifyTo(Containerizer.To(tarImage));
        }
コード例 #5
0
        public void TestGetters()
        {
            RegistryImage image =
                RegistryImage.Named("registry/image")
                .AddCredentialRetriever(mockCredentialRetriever)
                .AddCredential("username", "password");

            Assert.AreEqual(2, image.GetCredentialRetrievers().Count);
            Assert.AreSame(mockCredentialRetriever, image.GetCredentialRetrievers()[0]);
            Assert.AreEqual(
                Credential.From("username", "password"),
                image.GetCredentialRetrievers()[1].Retrieve().Get());
        }
コード例 #6
0
        public void TestGetImageConfiguration_registryImage()
        {
            CredentialRetriever credentialRetriever = Mock.Of <CredentialRetriever>();
            Containerizer       containerizer       =
                Containerizer.To(
                    RegistryImage.Named("registry/image").AddCredentialRetriever(credentialRetriever));

            ImageConfiguration imageConfiguration = containerizer.GetImageConfiguration();

            Assert.AreEqual("registry/image", imageConfiguration.GetImage().ToString());
            Assert.AreEqual(
                new[] { credentialRetriever }, imageConfiguration.GetCredentialRetrievers());
        }
コード例 #7
0
        public void TestConfigureContainerizer_SetsBaseImageLayersCache()
        {
            var config = new FibCliConfiguration
            {
                BaseLayersCacheDirectory = "BaseCacheDirectory"
            };

            var containerizer = Containerizer.To(RegistryImage.Named("target-image:tag3"));

            config.ConfigureContainerizer(containerizer);

            Assert.AreEqual("BaseCacheDirectory", containerizer.GetBaseImageLayersCacheDirectory());
        }
コード例 #8
0
        public async Task TestContainerize_configuredExecutorAsync()
        {
            FibContainerBuilder fibContainerBuilder =
                new FibContainerBuilder(RegistryImage.Named("base/image"), buildConfigurationBuilder)
                .SetEntrypoint(new[] { "entry", "point" })
                .SetEnvironment(ImmutableDic.Of("name", "value"))
                .SetExposedPorts(ImmutableHashSet.Create(Port.Tcp(1234), Port.Udp(5678)))
                .SetLabels(ImmutableDic.Of("key", "value"))
                .SetProgramArguments(new[] { "program", "arguments" })
                .SetCreationTime(DateTimeOffset.FromUnixTimeMilliseconds(1000))
                .SetUser("user")
                .SetWorkingDirectory(AbsoluteUnixPath.Get("/working/directory"));
            IContainerizer mockContainerizer = CreateMockContainerizer();

            await fibContainerBuilder.ContainerizeAsync(mockContainerizer).ConfigureAwait(false);
        }
コード例 #9
0
        public async Task TestScratchAsync()
        {
            ImageReference targetImageReference =
                ImageReference.Of("localhost:5002", "fibdotnet-core", "basic-scratch");
            await FibContainerBuilder.FromScratch()
            .ContainerizeAsync(
                Containerizer.To(
                    RegistryImage.Named(targetImageReference)
                    .AddCredentialRetriever(
                        () => Maybe.Of(Credential.From("username", "password"))))
                .SetAllowInsecureRegistries(true)).ConfigureAwait(false);

            // Check that resulting image has no layers
            localRegistry.Pull(targetImageReference.ToString());
            string inspectOutput = new Command("docker", "inspect", targetImageReference.ToString()).Run();

            Assert.That(inspectOutput, Does.Not.Contain("\"Layers\": ["), "docker inspect output contained layers: " + inspectOutput);
        }
コード例 #10
0
        public async Task TestBasic_HelloWorldAsync()
        {
            ImageReference targetImageReference =
                ImageReference.Of("localhost:5002", "fibdotnet-core", "basic-helloworld");
            FibContainer fibContainer =
                await FibContainerBuilder.From("busybox")
                .SetEntrypoint("echo", "Hello World")
                .ContainerizeAsync(
                    Containerizer.To(
                        RegistryImage.Named(targetImageReference)
                        .AddCredentialRetriever(
                            () => Maybe.Of(Credential.From("username", "password"))))
                    .SetAllowInsecureRegistries(true)
                    .AddEventHandler <IFibEvent>(e => TestContext.Out.WriteLine(e))).ConfigureAwait(false);

            Assert.AreEqual("Hello World\n", PullAndRunBuiltImage(targetImageReference.ToString()));
            Assert.AreEqual(
                "Hello World\n",
                PullAndRunBuiltImage(
                    targetImageReference.WithTag(fibContainer.GetDigest().ToString()).ToString()));
        }
コード例 #11
0
        public void TestToBuildConfiguration_containerConfigurationSet()
        {
            FibContainerBuilder fibContainerBuilder =
                new FibContainerBuilder(RegistryImage.Named("base/image"), buildConfigurationBuilder)
                .SetEntrypoint(new[] { "entry", "point" })
                .SetEnvironment(ImmutableDictionary.CreateRange(new Dictionary <string, string> {
                ["name"] = "value"
            }))
                .SetExposedPorts(ImmutableHashSet.Create(Port.Tcp(1234), Port.Udp(5678)))
                .SetLabels(ImmutableDictionary.CreateRange(new Dictionary <string, string> {
                ["key"] = "value"
            }))
                .SetProgramArguments(new[] { "program", "arguments" })
                .SetCreationTime(DateTimeOffset.FromUnixTimeMilliseconds(1000))
                .SetUser("user")
                .SetWorkingDirectory(AbsoluteUnixPath.Get("/working/directory"));

            BuildConfiguration buildConfiguration =
                fibContainerBuilder.ToBuildConfiguration(
                    Containerizer.To(RegistryImage.Named("target/image")));
            IContainerConfiguration containerConfiguration = buildConfiguration.GetContainerConfiguration();

            Assert.AreEqual(new[] { "entry", "point" }, containerConfiguration.GetEntrypoint());
            Assert.AreEqual(
                ImmutableDictionary.CreateRange(new Dictionary <string, string> {
                ["name"] = "value"
            }), containerConfiguration.GetEnvironmentMap());
            Assert.AreEqual(
                ImmutableHashSet.Create(Port.Tcp(1234), Port.Udp(5678)), containerConfiguration.GetExposedPorts());
            Assert.AreEqual(ImmutableDictionary.CreateRange(new Dictionary <string, string> {
                ["key"] = "value"
            }), containerConfiguration.GetLabels());
            Assert.AreEqual(
                new[] { "program", "arguments" }, containerConfiguration.GetProgramArguments());
            Assert.AreEqual(Instant.FromUnixTimeMilliseconds(1000), containerConfiguration.GetCreationTime());
            Assert.AreEqual("user", containerConfiguration.GetUser());
            Assert.AreEqual(
                AbsoluteUnixPath.Get("/working/directory"), containerConfiguration.GetWorkingDirectory());
        }
コード例 #12
0
 protected override IContainerizer CreateContainerizer(ImageReference imageReference)
 {
     return(Containerizer.To(RegistryImage.Named(imageReference)));
 }
コード例 #13
0
        public async Task TestOfflineAsync()
        {
            SystemPath cacheDirectory = cacheFolder.GetRoot().ToPath();

            ImageReference targetImageReferenceOnline =
                ImageReference.Of("localhost:5001", "fibdotnet-core", "basic-online");
            ImageReference targetImageReferenceOffline =
                ImageReference.Of("localhost:5001", "fibdotnet-core", "basic-offline");

            FibContainerBuilder fibContainerBuilder =
                FibContainerBuilder.From("localhost:5001/busybox").SetEntrypoint("echo", "Hello World");

            // Should fail since Fib can't build to registry offline
            try
            {
                await fibContainerBuilder.ContainerizeAsync(
                    Containerizer.To(RegistryImage.Named(targetImageReferenceOffline)).SetOfflineMode(true)).ConfigureAwait(false);

                Assert.Fail();
            }
            catch (InvalidOperationException ex)
            {
                Assert.AreEqual("Cannot build to a container registry in offline mode", ex.Message);
            }

            // Should fail since Fib hasn't cached the base image yet
            try
            {
                await fibContainerBuilder.ContainerizeAsync(
                    Containerizer.To(DockerDaemonImage.Named(targetImageReferenceOffline))
                    .SetBaseImageLayersCache(cacheDirectory)
                    .SetOfflineMode(true)).ConfigureAwait(false);

                Assert.Fail();
            }
            catch (IOException ex)
            {
                Assert.AreEqual(
                    "Cannot run Fib in offline mode; localhost:5001/busybox not found in local Fib cache",
                    ex.Message);
            }
            using (LocalRegistry tempRegistry = new LocalRegistry(5001))
            {
                await tempRegistry.StartAsync().ConfigureAwait(false);

                tempRegistry.PullAndPushToLocal("busybox", "busybox");

                // Run online to cache the base image
                await fibContainerBuilder.ContainerizeAsync(
                    Containerizer.To(DockerDaemonImage.Named(targetImageReferenceOnline))
                    .SetBaseImageLayersCache(cacheDirectory)
                    .SetAllowInsecureRegistries(true)).ConfigureAwait(false);
            }

            // Run again in offline mode, should succeed this time
            await fibContainerBuilder.ContainerizeAsync(
                Containerizer.To(DockerDaemonImage.Named(targetImageReferenceOffline))
                .SetBaseImageLayersCache(cacheDirectory)
                .SetOfflineMode(true)).ConfigureAwait(false);

            // Verify output
            Assert.AreEqual(
                "Hello World\n",
                new Command("docker", "run", "--rm", targetImageReferenceOffline.ToString()).Run());
        }
コード例 #14
0
        public void TestToBuildConfiguration()
        {
            RegistryImage targetImage =
                RegistryImage.Named(ImageReference.Of("gcr.io", "my-project/my-app", null))
                .AddCredential("username", "password");
            IContainerizer containerizer =
                Containerizer.To(targetImage)
                .SetBaseImageLayersCache(Paths.Get("base/image/layers"))
                .SetApplicationLayersCache(Paths.Get("application/layers"))
                .AddEventHandler(mockFibEventConsumer);

            RegistryImage baseImage =
                RegistryImage.Named("base/image").AddCredentialRetriever(mockCredentialRetriever);
            FibContainerBuilder fibContainerBuilder =
                new FibContainerBuilder(baseImage, buildConfigurationBuilder)
                .SetLayers(new[] { mockLayerConfiguration1, mockLayerConfiguration2 });
            BuildConfiguration buildConfiguration =
                fibContainerBuilder.ToBuildConfiguration(
                    containerizer);

            Assert.AreEqual(
                buildConfigurationBuilder.Build().GetContainerConfiguration(),
                buildConfiguration.GetContainerConfiguration());

            Assert.AreEqual(
                "base/image", buildConfiguration.GetBaseImageConfiguration().GetImage().ToString());
            Assert.AreEqual(
                new[] { mockCredentialRetriever },
                buildConfiguration.GetBaseImageConfiguration().GetCredentialRetrievers());

            Assert.AreEqual(
                "gcr.io/my-project/my-app",
                buildConfiguration.GetTargetImageConfiguration().GetImage().ToString());
            Assert.AreEqual(
                1, buildConfiguration.GetTargetImageConfiguration().GetCredentialRetrievers().Length);
            Assert.AreEqual(
                Credential.From("username", "password"),
                buildConfiguration
                .GetTargetImageConfiguration()
                .GetCredentialRetrievers()
                [0]
                .Retrieve()
                .OrElseThrow(() => new AssertionException("")));

            Assert.AreEqual(ImmutableHashSet.Create("latest"), buildConfiguration.GetAllTargetImageTags());

            Assert.AreEqual(
                new[] { mockLayerConfiguration1, mockLayerConfiguration2 },
                buildConfiguration.GetLayerConfigurations());

            buildConfiguration.GetEventHandlers().Dispatch(mockFibEvent);
            Mock.Get(mockFibEventConsumer).Verify(m => m(mockFibEvent));

            Assert.AreEqual("fibdotnet-core", buildConfiguration.GetToolName());

            Assert.AreEqual(ManifestFormat.V22, buildConfiguration.GetTargetFormat());

            Assert.AreEqual("fibdotnet-core", buildConfiguration.GetToolName());

            // Changes fibContainerBuilder.
            buildConfiguration =
                fibContainerBuilder
                .SetFormat(ImageFormat.OCI)
                .ToBuildConfiguration(
                    containerizer
                    .WithAdditionalTag("tag1")
                    .WithAdditionalTag("tag2")
                    .SetToolName("toolName"));
            Assert.AreEqual(ManifestFormat.OCI, buildConfiguration.GetTargetFormat());
            Assert.AreEqual(
                ImmutableHashSet.Create("latest", "tag1", "tag2"), buildConfiguration.GetAllTargetImageTags());
            Assert.AreEqual("toolName", buildConfiguration.GetToolName());
        }
コード例 #15
0
 private async Task <FibContainer> BuildRegistryImageAsync(
     ImageReference baseImage, ImageReference targetImage, IList <string> additionalTags)
 {
     return(await BuildImageAsync(
                baseImage, Containerizer.To(RegistryImage.Named(targetImage)), additionalTags).ConfigureAwait(false));
 }