diff --git a/Devantler.KubernetesProvisioner.GitOps.Core/IGitOpsProvisioner.cs b/Devantler.KubernetesProvisioner.GitOps.Core/IGitOpsProvisioner.cs index 0de7f67..4dad642 100644 --- a/Devantler.KubernetesProvisioner.GitOps.Core/IGitOpsProvisioner.cs +++ b/Devantler.KubernetesProvisioner.GitOps.Core/IGitOpsProvisioner.cs @@ -9,6 +9,18 @@ public interface IGitOpsProvisioner /// The Kubernetes context. /// public string? Context { get; set; } + + /// + /// Push manifests to an OCI registry + /// + /// + /// + /// + /// + /// + /// + public Task PushManifestsAsync(Uri registryUri, string manifestsDirectory, string? userName = default, string? password = default, CancellationToken cancellationToken = default); + /// /// Install the GitOps tooling on the Kubernetes cluster. /// diff --git a/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/Devantler.KubernetesProvisioner.GitOps.Flux.Tests.csproj b/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/Devantler.KubernetesProvisioner.GitOps.Flux.Tests.csproj index e128f32..466117e 100644 --- a/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/Devantler.KubernetesProvisioner.GitOps.Flux.Tests.csproj +++ b/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/Devantler.KubernetesProvisioner.GitOps.Flux.Tests.csproj @@ -21,6 +21,10 @@ + + + + @@ -33,4 +37,4 @@ - \ No newline at end of file + diff --git a/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/FluxProvisionerTests/AllMethodsTests.cs b/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/FluxProvisionerTests/AllMethodsTests.cs index 17a4d3f..5ee08f0 100644 --- a/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/FluxProvisionerTests/AllMethodsTests.cs +++ b/Devantler.KubernetesProvisioner.GitOps.Flux.Tests/FluxProvisionerTests/AllMethodsTests.cs @@ -1,4 +1,5 @@ using Devantler.KindCLI; +using Devantler.ContainerEngineProvisioner.Docker; namespace Devantler.KubernetesProvisioner.GitOps.Flux.Tests.FluxProvisionerTests; @@ -20,12 +21,17 @@ public async Task Flux_InstallsAndReconciles_KustomizationsAsync() string context = "kind-" + clusterName; string configPath = Path.Combine(AppContext.BaseDirectory, "assets/kind-config.yaml"); var fluxProvisioner = new FluxProvisioner(context); + var dockerProvisioner = new DockerProvisioner(); var cancellationToken = new CancellationToken(); // Act await Kind.DeleteClusterAsync(clusterName, cancellationToken); await Kind.CreateClusterAsync(clusterName, configPath, cancellationToken); + await dockerProvisioner.CreateRegistryAsync("ksail-registry", 5555, cancellationToken); await fluxProvisioner.InstallAsync(cancellationToken); + string testFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + await File.WriteAllTextAsync(testFile, "test"); + await fluxProvisioner.PushManifestsAsync(new Uri("oci://localhost:5555/test-manifest"), testFile, cancellationToken: cancellationToken); await FluxCLI.Flux.CreateOCISourceAsync("podinfo", new Uri("oci://ghcr.io/stefanprodan/manifests/podinfo"), context, cancellationToken: cancellationToken); await FluxCLI.Flux.CreateKustomizationAsync("podinfo", "OCIRepository/podinfo", "", context, cancellationToken: cancellationToken); await fluxProvisioner.ReconcileAsync(cancellationToken); @@ -33,5 +39,7 @@ public async Task Flux_InstallsAndReconciles_KustomizationsAsync() // Cleanup await Kind.DeleteClusterAsync(clusterName, cancellationToken); + await dockerProvisioner.DeleteRegistryAsync("ksail-registry", cancellationToken); + File.Delete(testFile); } } diff --git a/Devantler.KubernetesProvisioner.GitOps.Flux/FluxProvisioner.cs b/Devantler.KubernetesProvisioner.GitOps.Flux/FluxProvisioner.cs index 30c5a42..baad414 100644 --- a/Devantler.KubernetesProvisioner.GitOps.Flux/FluxProvisioner.cs +++ b/Devantler.KubernetesProvisioner.GitOps.Flux/FluxProvisioner.cs @@ -18,6 +18,10 @@ public class FluxProvisioner(string? context = default) : IGitOpsProvisioner /// public string? Context { get; set; } = context; + /// + public async Task PushManifestsAsync(Uri registryUri, string manifestsDirectory, string? userName = null, string? password = null, CancellationToken cancellationToken = default) => + await FluxCLI.Flux.PushArtifactAsync(registryUri, manifestsDirectory, cancellationToken: cancellationToken).ConfigureAwait(false); + /// /// Install Flux on the Kubernetes cluster. /// @@ -26,11 +30,7 @@ public class FluxProvisioner(string? context = default) : IGitOpsProvisioner public async Task InstallAsync(CancellationToken cancellationToken = default) => await FluxCLI.Flux.InstallAsync(Context, cancellationToken).ConfigureAwait(false); - /// - /// Reconcile resources on the Kubernetes cluster. - /// - /// - /// + /// public async Task ReconcileAsync(CancellationToken cancellationToken = default) { using var kubernetesResourceProvisioner = new KubernetesResourceProvisioner(Context);