flux logo
Flux v0.22.2, Jan 3 23

Flux

The Pulumi Flux provider lets you manage Flux resources.

Example

import * as pulumi from "@pulumi/pulumi";
import * as tls from "@pulumi/tls";
import * as github from "@pulumi/github";
import * as k8s from "@pulumi/kubernetes";
import * as flux from "@worawat/flux";

// Required Github configuration
// export GITHUB_TOKEN=your-github-personal-access-token
// export GITHUB_OWNER=your-github-owner
const repoName = "pulumi-flux-sample";
const branch = "main";
const targetPath = "clusters/my-cluster";
const githubOwner = "oun";
const knownHosts =
  "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=";

const key = new tls.PrivateKey("key", {
  algorithm: "ECDSA",
  ecdsaCurve: "P256",
});

// Create Github repository
const repo = new github.Repository("repo", {
  name: repoName,
  visibility: "private",
  autoInit: true,
});

new github.BranchDefault("default", {
  repository: repo.name,
  branch: branch,
});

new github.RepositoryDeployKey("key", {
  title: "fluxcd",
  repository: repo.name,
  key: key.publicKeyOpenssh,
  readOnly: true,
});

const fluxInstall = await flux.getFluxInstall({
  targetPath: targetPath,
});

const fluxSync = await flux.getFluxSync({
  targetPath: targetPath,
  url: `ssh://git@github.com/${githubOwner}/${repoName}.git`,
  branch: branch,
});

// Create kubernetes resource from generated manifests
const install = new k8s.yaml.ConfigGroup("flux-install", {
  yaml: fluxInstall.content,
});

const sync = new k8s.yaml.ConfigGroup("flux-sync", {
  yaml: fluxSync.content,
});

new k8s.core.v1.Secret(
  "flux",
  {
    metadata: {
      name: fluxSync.secret,
      namespace: fluxSync.namespace,
    },
    stringData: {
      identity: key.privateKeyPem,
      "identity.pub": key.publicKeyPem,
      known_hosts: knownHosts,
    },
  },
  { dependsOn: install }
);

// Commit files to Github
new github.RepositoryFile(
  "install",
  {
    repository: repo.name,
    file: fluxInstall.path,
    content: fluxInstall.content,
    branch: branch,
  },
  { dependsOn: install }
);

new github.RepositoryFile(
  "sync",
  {
    repository: repo.name,
    file: fluxSync.path,
    content: fluxSync.content,
    branch: branch,
  },
  { dependsOn: install }
);

new github.RepositoryFile(
  "kustomize",
  {
    repository: repo.name,
    file: fluxSync.kustomizePath,
    content: fluxSync.kustomizeContent,
    branch: branch,
  },
  { dependsOn: install }
);
import pulumi
import pulumi_flux as flux
import pulumi_github as github
import pulumi_tls as tls
import pulumi_kubernetes as k8s

# Require Github configurations
# export GITHUB_TOKEN=your-github-personal-access-token
# export GITHUB_OWNER=your-github-owner
config = pulumi.Config()
branch = config.require("branch")
target_path = config.require("target_path")
repository_name = config.require("repository")
github_owner = pulumi.Config("github").require("owner")

ssh_key = tls.PrivateKey("key", algorithm="ECDSA", ecdsa_curve="P256")

# Create Github repository
repository = github.Repository(
    "flux", name=repository_name, visibility="private", auto_init=True
)
github.BranchDefault("default", repository=repository.name, branch=branch)
github.RepositoryDeployKey(
    "flux-key",
    title="flux",
    repository=repository.name,
    key=ssh_key.public_key_openssh,
    read_only=True,
)

flux_install = flux.get_flux_install(target_path=target_path)
flux_sync = flux.get_flux_sync(
    target_path=target_path,
    url=f"ssh://git@github.com/{github_owner}/{repository_name}.git",
    branch=branch,
)

# Create kubernetes resource from generated manifests
install = k8s.yaml.ConfigGroup("flux-install", yaml=[flux_install.content])
sync = k8s.yaml.ConfigGroup("flux-sync", yaml=[flux_sync.content])

k8s.core.v1.Secret(
    "flux",
    metadata=k8s.meta.v1.ObjectMetaArgs(
        name=flux_sync.secret, namespace=flux_sync.namespace
    ),
    string_data={
        "identity": ssh_key.private_key_pem,
        "identity.pub": ssh_key.public_key_pem,
        "known_hosts": config.require("known_hosts"),
    },
    opts=pulumi.ResourceOptions(depends_on=install)
)

# Commit files to Github
github.RepositoryFile(
    "install",
    repository=repository.name,
    file=flux_install.path,
    content=flux_install.content,
    branch=branch,
    opts=pulumi.ResourceOptions(depends_on=install)
)
github.RepositoryFile(
    "sync",
    repository=repository.name,
    file=flux_sync.path,
    content=flux_sync.content,
    branch=branch,
    opts=pulumi.ResourceOptions(depends_on=install)
)
github.RepositoryFile(
    "kustomize",
    repository=repository.name,
    file=flux_sync.kustomize_path,
    content=flux_sync.kustomize_content,
    branch=branch,
    opts=pulumi.ResourceOptions(depends_on=install)
)
import (
 "fmt"
 flux "github.com/oun/pulumi-flux/sdk/go/flux"
 "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
using Pulumi;
using Pulumi.Flux;