Exemplo n.º 1
0
        public async Task PublishImageInfoCommand_ReplaceContent()
        {
            using (TempFolderContext tempFolderContext = TestHelper.UseTempFolder())
            {
                string   repo1Image1DockerfilePath = DockerfileHelper.CreateDockerfile("1.0/runtime/os", tempFolderContext);
                string   repo2Image2DockerfilePath = DockerfileHelper.CreateDockerfile("2.0/runtime/os", tempFolderContext);
                Manifest manifest = CreateManifest(
                    CreateRepo("repo1",
                               CreateImage(
                                   new Platform[]
                {
                    CreatePlatform(repo1Image1DockerfilePath, new string[] { "tag1" })
                },
                                   productVersion: "1.0")),
                    CreateRepo("repo2",
                               CreateImage(
                                   new Platform[]
                {
                    CreatePlatform(repo2Image2DockerfilePath, new string[] { "tag1" })
                },
                                   productVersion: "2.0"))
                    );

                RepoData repo2;

                ImageArtifactDetails srcImageArtifactDetails = new ImageArtifactDetails
                {
                    Repos =
                    {
                        new RepoData
                        {
                            Repo   = "repo1",
                            Images =
                            {
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath,
                                                                               simpleTags: new List <string>
                                        {
                                            "newtag"
                                        })
                                    },
                                    ProductVersion = "1.0",
                                    Manifest       = new ManifestData
                                    {
                                        SyndicatedDigests = new List <string>
                                        {
                                            "newdigest1",
                                            "newdigest2"
                                        }
                                    }
                                }
                            }
                        },
                        {
                            repo2 = new RepoData
                            {
                                Repo   = "repo2",
                                Images =
                                {
                                    new ImageData
                                    {
                                        Platforms =
                                        {
                                            Helpers.ImageInfoHelper.CreatePlatform(repo2Image2DockerfilePath,
                                                                                   simpleTags: new List <string>
                                            {
                                                "tag1"
                                            })
                                        },
                                        ProductVersion = "2.0"
                                    }
                                }
                            }
                        }
                    }
                };

                string file = Path.Combine(tempFolderContext.Path, "image-info.json");
                File.WriteAllText(file, JsonHelper.SerializeObject(srcImageArtifactDetails));

                ImageArtifactDetails targetImageArtifactDetails = new ImageArtifactDetails
                {
                    Repos =
                    {
                        new RepoData
                        {
                            Repo   = "repo1",
                            Images =
                            {
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath,
                                                                               simpleTags: new List <string>
                                        {
                                            "oldtag"
                                        })
                                    },
                                    ProductVersion = "1.0",
                                    Manifest       = new ManifestData
                                    {
                                        SyndicatedDigests = new List <string>
                                        {
                                            "olddigest1",
                                            "olddigest2"
                                        }
                                    }
                                }
                            }
                        }
                    }
                };

                GitOptions gitOptions = new GitOptions
                {
                    AuthToken = "token",
                    Repo      = "PublishImageInfoCommand_ReplaceContent",
                    Branch    = "testBranch",
                    Path      = "imageinfo.json",
                    Email     = "*****@*****.**",
                    Username  = "******"
                };

                AzdoOptions azdoOptions = new AzdoOptions
                {
                    AccessToken  = "azdo-token",
                    AzdoBranch   = "testBranch",
                    AzdoRepo     = "testRepo",
                    Organization = "azdo-org",
                    Project      = "azdo-project",
                    AzdoPath     = "imageinfo.json"
                };

                Mock <IRepository> repositoryMock = GetRepositoryMock();
                Mock <IGitService> gitServiceMock = GetGitServiceMock(repositoryMock.Object, gitOptions.Path, targetImageArtifactDetails);

                string actualImageArtifactDetailsContents = null;
                gitServiceMock
                .Setup(o => o.Stage(It.IsAny <IRepository>(), It.IsAny <string>()))
                .Callback((IRepository repo, string path) =>
                {
                    actualImageArtifactDetailsContents = File.ReadAllText(path);
                });

                PublishImageInfoCommand command = new PublishImageInfoCommand(gitServiceMock.Object, Mock.Of <ILoggerService>());
                command.Options.ImageInfoPath = file;
                command.Options.GitOptions    = gitOptions;
                command.Options.Manifest      = Path.Combine(tempFolderContext.Path, "manifest.json");

                File.WriteAllText(Path.Combine(tempFolderContext.Path, command.Options.Manifest), JsonConvert.SerializeObject(manifest));

                command.LoadManifest();
                await command.ExecuteAsync();

                ImageArtifactDetails expectedImageArtifactDetails = new ImageArtifactDetails
                {
                    Repos =
                    {
                        new RepoData
                        {
                            Repo   = "repo1",
                            Images =
                            {
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath,
                                                                               simpleTags: new List <string>
                                        {
                                            "newtag"
                                        })
                                    },
                                    ProductVersion = "1.0",
                                    Manifest       = new ManifestData
                                    {
                                        SyndicatedDigests = new List <string>
                                        {
                                            "newdigest1",
                                            "newdigest2"
                                        }
                                    }
                                }
                            }
                        },
                        repo2
                    }
                };

                Assert.Equal(JsonHelper.SerializeObject(expectedImageArtifactDetails), actualImageArtifactDetailsContents.Trim());

                VerifyMocks(repositoryMock);
            }
        }
Exemplo n.º 2
0
        public async Task PublishImageInfoCommand_RemoveOutOfDateContent()
        {
            using (TempFolderContext tempFolderContext = TestHelper.UseTempFolder())
            {
                string   repo1Image1DockerfilePath = DockerfileHelper.CreateDockerfile("1.0/runtime/os", tempFolderContext);
                string   repo2Image2DockerfilePath = DockerfileHelper.CreateDockerfile("2.0/runtime/os", tempFolderContext);
                Manifest manifest = CreateManifest(
                    CreateRepo("repo1",
                               CreateImage(
                                   new Platform[]
                {
                    CreatePlatform(repo1Image1DockerfilePath, new string[0])
                },
                                   productVersion: "1.0")),
                    CreateRepo("repo2",
                               CreateImage(
                                   new Platform[]
                {
                    CreatePlatform(repo2Image2DockerfilePath, new string[0])
                },
                                   productVersion: "2.0"))
                    );
                manifest.Registry = "mcr.microsoft.com";

                RepoData repo2;

                ImageArtifactDetails srcImageArtifactDetails = new ImageArtifactDetails
                {
                    Repos =
                    {
                        new RepoData
                        {
                            Repo   = "repo1",
                            Images =
                            {
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath)
                                    },
                                    ProductVersion = "1.0"
                                }
                            }
                        },
                        {
                            repo2 = new RepoData
                            {
                                Repo   = "repo2",
                                Images =
                                {
                                    new ImageData
                                    {
                                        Platforms =
                                        {
                                            Helpers.ImageInfoHelper.CreatePlatform(repo2Image2DockerfilePath)
                                        },
                                        ProductVersion = "2.0"
                                    }
                                }
                            }
                        }
                    }
                };

                string file = Path.Combine(tempFolderContext.Path, "image-info.json");
                File.WriteAllText(file, JsonHelper.SerializeObject(srcImageArtifactDetails));

                ImageArtifactDetails targetImageArtifactDetails = new ImageArtifactDetails
                {
                    Repos =
                    {
                        new RepoData
                        {
                            Repo   = "repo1",
                            Images =
                            {
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath)
                                    },
                                    ProductVersion = "1.0"
                                },
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(
                                            DockerfileHelper.CreateDockerfile("1.0/runtime2/os", tempFolderContext))
                                    },
                                    ProductVersion = "1.0"
                                }
                            }
                        },
                        new RepoData
                        {
                            Repo = "repo4"
                        }
                    }
                };

                GitOptions gitOptions = new GitOptions
                {
                    AuthToken = "token",
                    Repo      = "repo",
                    Owner     = "owner",
                    Path      = "imageinfo.json",
                    Branch    = "branch",
                    Email     = "*****@*****.**",
                    Username  = "******"
                };

                AzdoOptions azdoOptions = new AzdoOptions
                {
                    AccessToken  = "azdo-token",
                    Branch       = "testBranch",
                    Repo         = "testRepo",
                    Organization = "azdo-org",
                    Project      = "azdo-project",
                    Path         = "imageinfo.json"
                };

                Mock <IRepository> repositoryMock = GetRepositoryMock();
                Mock <IGitService> gitServiceMock = GetGitServiceMock(repositoryMock.Object, gitOptions.Path, targetImageArtifactDetails);


                PublishImageInfoCommand command = new PublishImageInfoCommand(gitServiceMock.Object, Mock.Of <ILoggerService>());
                command.Options.ImageInfoPath = file;
                command.Options.GitOptions    = gitOptions;
                command.Options.AzdoOptions   = azdoOptions;
                command.Options.Manifest      = Path.Combine(tempFolderContext.Path, "manifest.json");

                File.WriteAllText(Path.Combine(tempFolderContext.Path, command.Options.Manifest), JsonConvert.SerializeObject(manifest));

                command.LoadManifest();
                await command.ExecuteAsync();

                ImageArtifactDetails expectedImageArtifactDetails = new ImageArtifactDetails
                {
                    Repos =
                    {
                        new RepoData
                        {
                            Repo   = "repo1",
                            Images =
                            {
                                new ImageData
                                {
                                    Platforms =
                                    {
                                        Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath)
                                    },
                                    ProductVersion = "1.0"
                                }
                            }
                        },
                        repo2
                    }
                };

                VerifyMocks(repositoryMock);
            }
        }