Showing preview only (4,384K chars total). Download the full file or copy to clipboard to get everything.
Repository: cnoe-io/idpbuilder
Branch: main
Commit: 50580da36900
Files: 186
Total size: 4.1 MB
Directory structure:
gitextract_a87kr30h/
├── .devcontainer/
│ ├── devcontainer.json
│ ├── postCreateCommand.sh
│ └── postStartCommand.sh
├── .github/
│ ├── CODEOWNERS
│ └── workflows/
│ ├── code-scanner.yaml
│ ├── codespell.yaml
│ ├── e2e.yaml
│ ├── nightly.yaml
│ ├── pr.yaml
│ ├── release.yaml
│ └── slash-commands.yaml
├── .gitignore
├── .goreleaser.yaml
├── .pre-commit-config.yaml
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── api/
│ └── v1alpha1/
│ ├── custom_package_types.go
│ ├── gitrepository_types.go
│ ├── groupversion_info.go
│ ├── localbuild_types.go
│ └── zz_generated.deepcopy.go
├── docs/
│ ├── images/
│ │ └── source/
│ │ └── idpbuilder.excalidraw
│ ├── minimum-requirements.md
│ ├── pluggable-packages.md
│ └── private-registries.md
├── globals/
│ └── project.go
├── go.mod
├── go.sum
├── hack/
│ ├── argo-cd/
│ │ ├── argocd-application-controller.yaml
│ │ ├── argocd-applicationset-controller.yaml
│ │ ├── argocd-cm.yaml
│ │ ├── argocd-rbac-dev.yaml
│ │ ├── argocd-redis.yaml
│ │ ├── argocd-repo-server.yaml
│ │ ├── argocd-server.yaml
│ │ ├── argocd-tls-certs-cm.yaml.tmpl
│ │ ├── dex-server.yaml
│ │ ├── generate-manifests.sh
│ │ ├── ingress.yaml.tmpl
│ │ ├── kustomization.yaml
│ │ └── notifications-controller.yaml
│ ├── boilerplate.go.txt
│ ├── embedded-resources.sh
│ ├── gitea/
│ │ ├── generate-manifests.sh
│ │ ├── ingress.yaml.tmpl
│ │ └── values.yaml
│ ├── ingress-nginx/
│ │ ├── cm-ingress-nginx-controller.yaml
│ │ ├── deployment-ingress-nginx.yaml
│ │ ├── generate-manifests.sh
│ │ ├── kustomization.yaml
│ │ └── service-ingress-nginx.yaml.tmpl
│ └── install.sh
├── main.go
├── pkg/
│ ├── build/
│ │ ├── build.go
│ │ ├── build_test.go
│ │ ├── coredns.go
│ │ ├── templates/
│ │ │ └── coredns/
│ │ │ ├── cm-coredns-custom.yaml
│ │ │ ├── cm-coredns-default.yaml.tmpl
│ │ │ ├── cm-coredns.yaml
│ │ │ └── deployment-coredns.yaml
│ │ ├── tls.go
│ │ └── tls_test.go
│ ├── cmd/
│ │ ├── create/
│ │ │ ├── root.go
│ │ │ └── root_test.go
│ │ ├── delete/
│ │ │ └── root.go
│ │ ├── get/
│ │ │ ├── clusters.go
│ │ │ ├── packages.go
│ │ │ ├── root.go
│ │ │ ├── secrets.go
│ │ │ └── secrets_test.go
│ │ ├── helpers/
│ │ │ ├── logger.go
│ │ │ ├── test-data/
│ │ │ │ ├── notk8s.yaml
│ │ │ │ ├── notyaml.yaml
│ │ │ │ └── valid.yaml
│ │ │ ├── validation.go
│ │ │ └── validation_test.go
│ │ ├── root.go
│ │ └── version/
│ │ └── root.go
│ ├── controllers/
│ │ ├── crd.go
│ │ ├── custompackage/
│ │ │ ├── controller.go
│ │ │ ├── controller_test.go
│ │ │ └── test/
│ │ │ └── resources/
│ │ │ └── customPackages/
│ │ │ ├── applicationSet/
│ │ │ │ ├── generator-matrix.yaml
│ │ │ │ ├── generator-multi-sources.yaml
│ │ │ │ ├── generator-single-source.yaml
│ │ │ │ ├── no-generator-single-source.yaml
│ │ │ │ └── test1/
│ │ │ │ └── apps/
│ │ │ │ ├── guestbook/
│ │ │ │ │ ├── guestbook-ui-deployment.yaml
│ │ │ │ │ ├── guestbook-ui-svc.yaml
│ │ │ │ │ └── kustomization.yaml
│ │ │ │ └── guestbook2/
│ │ │ │ ├── guestbook-ui-deployment.yaml
│ │ │ │ ├── guestbook-ui-svc.yaml
│ │ │ │ └── kustomization.yaml
│ │ │ ├── helm/
│ │ │ │ ├── app.yaml
│ │ │ │ └── test/
│ │ │ │ ├── Chart.yaml
│ │ │ │ ├── templates/
│ │ │ │ │ └── cm.yaml
│ │ │ │ └── values.yaml
│ │ │ ├── testDir/
│ │ │ │ ├── app.yaml
│ │ │ │ ├── app1/
│ │ │ │ │ └── cm.yaml
│ │ │ │ ├── app2/
│ │ │ │ │ ├── one/
│ │ │ │ │ │ └── cm.yaml
│ │ │ │ │ └── two/
│ │ │ │ │ └── cm.yaml
│ │ │ │ └── app2.yaml
│ │ │ └── testDir2/
│ │ │ ├── exampleApp.yaml
│ │ │ └── exampleApp2.yaml
│ │ ├── doc.go
│ │ ├── gitrepository/
│ │ │ ├── controller.go
│ │ │ ├── controller_test.go
│ │ │ ├── git_repository.go
│ │ │ ├── gitea.go
│ │ │ ├── github.go
│ │ │ ├── github_test.go
│ │ │ └── test/
│ │ │ └── resources/
│ │ │ └── file1
│ │ ├── localbuild/
│ │ │ ├── argo.go
│ │ │ ├── argo_test.go
│ │ │ ├── controller.go
│ │ │ ├── gitea.go
│ │ │ ├── gitea_test.go
│ │ │ ├── installer.go
│ │ │ ├── nginx.go
│ │ │ └── resources/
│ │ │ ├── argo/
│ │ │ │ ├── ingress.yaml
│ │ │ │ └── install.yaml
│ │ │ ├── gitea/
│ │ │ │ └── k8s/
│ │ │ │ └── install.yaml
│ │ │ └── nginx/
│ │ │ └── k8s/
│ │ │ └── ingress-nginx.yaml
│ │ ├── resources/
│ │ │ ├── idpbuilder.cnoe.io_custompackages.yaml
│ │ │ ├── idpbuilder.cnoe.io_gitrepositories.yaml
│ │ │ └── idpbuilder.cnoe.io_localbuilds.yaml
│ │ └── run.go
│ ├── k8s/
│ │ ├── client.go
│ │ ├── deserialize.go
│ │ ├── deserialize_test.go
│ │ ├── schema.go
│ │ ├── test-resources/
│ │ │ ├── input/
│ │ │ │ ├── argocd/
│ │ │ │ │ └── install.yaml
│ │ │ │ ├── argocd-cm.yaml
│ │ │ │ ├── extra.yaml
│ │ │ │ ├── extra.yaml.tmpl
│ │ │ │ └── nginx/
│ │ │ │ └── install.yaml
│ │ │ └── output/
│ │ │ ├── argocd/
│ │ │ │ └── install.yaml
│ │ │ └── nginx/
│ │ │ ├── install-tmpl.yaml
│ │ │ └── install.yaml
│ │ ├── util.go
│ │ └── util_test.go
│ ├── kind/
│ │ ├── cluster.go
│ │ ├── cluster_test.go
│ │ ├── config.go
│ │ ├── config_integration_test.go
│ │ ├── config_test.go
│ │ ├── kindlogger.go
│ │ ├── resources/
│ │ │ ├── hosts-mirror.toml.tmpl
│ │ │ ├── hosts.toml.tmpl
│ │ │ └── kind.yaml.tmpl
│ │ └── testdata/
│ │ ├── custom-kind.yaml.tmpl
│ │ ├── empty.json
│ │ ├── expected/
│ │ │ ├── label-only.yaml
│ │ │ ├── no-port-multi.yaml
│ │ │ ├── no-port.yaml
│ │ │ └── port-only.yaml
│ │ ├── label-only.yaml
│ │ ├── no-node.yaml
│ │ ├── no-port-multi.yaml
│ │ ├── no-port.yaml
│ │ └── port-only.yaml
│ ├── logger/
│ │ └── handler.go
│ ├── printer/
│ │ ├── cluster.go
│ │ ├── package.go
│ │ ├── printer.go
│ │ ├── secret.go
│ │ └── types/
│ │ └── internal_types.go
│ ├── resources/
│ │ └── localbuild/
│ │ └── application.go
│ └── util/
│ ├── argocd.go
│ ├── files/
│ │ └── files.go
│ ├── fs/
│ │ ├── fs.go
│ │ └── fs_test.go
│ ├── git_repository.go
│ ├── git_repository_test.go
│ ├── gitea.go
│ ├── gitea_test.go
│ ├── idp.go
│ ├── k8s.go
│ ├── secret.go
│ ├── url.go
│ ├── url_test.go
│ ├── util.go
│ └── util_test.go
└── tests/
└── e2e/
├── docker/
│ ├── docker_test.go
│ └── test-dockerfile
└── e2e.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"image": "mcr.microsoft.com/vscode/devcontainers/base:ubuntu",
"features": {
"ghcr.io/devcontainers/features/go:1": {
"version": "1.26"
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"postCreateCommand": ".devcontainer/postCreateCommand.sh",
"postStartCommand": ".devcontainer/postStartCommand.sh",
"workspaceFolder": "/home/vscode/idpbuilder",
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/idpbuilder,type=bind",
"hostRequirements": {
"cpus": 4
},
"remoteEnv": {
"PATH": "${containerEnv:PATH}:/home/vscode/idpbuilder"
}
}
================================================
FILE: .devcontainer/postCreateCommand.sh
================================================
#!/usr/bin/env bash
# For Kubectl AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -sLO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# For Kubectl ARM64
[ $(uname -m) = aarch64 ] && curl -sLO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
# For Kind AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -sLo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
# For Kind ARM64
[ $(uname -m) = aarch64 ] && curl -sLo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# setup autocomplete for kubectl and alias k
sudo apt-get update -y && sudo apt-get install bash-completion -y
mkdir $HOME/.kube
echo "source <(kubectl completion bash)" >> $HOME/.bashrc
echo "alias k=kubectl" >> $HOME/.bashrc
echo "complete -F __start_kubectl k" >> $HOME/.bashrc
# Configure git if environment variables are set
if [ -n "$GIT_COMMITER_NAME" ]; then
echo "Configuring git user.name to: $GIT_COMMITER_NAME"
git config --global user.name "$GIT_COMMITER_NAME"
fi
if [ -n "$GIT_COMMITER_EMAIL" ]; then
echo "Configuring git user.email to: $GIT_COMMITER_EMAIL"
git config --global user.email "$GIT_COMMITER_EMAIL"
fi
# 1. Configure GPG agent
mkdir -p ~/.gnupg
echo "pinentry-program /usr/bin/pinentry" > ~/.gnupg/gpg-agent.conf
echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
# 2. Configure GPG client
echo "use-agent" > ~/.gnupg/gpg.conf
echo "pinentry-mode loopback" >> ~/.gnupg/gpg.conf
# 3. Restart GPG agent and set environment
gpgconf --kill gpg-agent
export GPG_TTY=$(tty)
echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
# 4. Configure Git for GPG signing
git config --global commit.gpgsign true
git config --global tag.gpgsign true
git config --global gpg.program gpg
================================================
FILE: .devcontainer/postStartCommand.sh
================================================
#!/bin/bash
# Import GPG key if both parts are available
if [ -n "$GPG_SECRET_KEY_PART1" ] && [ -n "$GPG_SECRET_KEY_PART2" ]; then
echo "Importing GPG key..."
echo "$GPG_SECRET_KEY_PART1$GPG_SECRET_KEY_PART2" | tr -d "'" | base64 -d | gunzip | gpg --batch --yes --no-tty --import
if [ $? -eq 0 ]; then
echo "GPG key imported successfully"
# Automatically configure Git to use the imported key for signing
echo "Configuring Git to use the imported GPG key..."
GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep -E "^sec" | head -1 | awk '{print $2}' | cut -d'/' -f2)
if [ -n "$GPG_KEY_ID" ]; then
git config --global user.signingkey "$GPG_KEY_ID"
echo "Git configured to use GPG key: $GPG_KEY_ID"
else
echo "Warning: Could not detect GPG key ID for Git configuration"
fi
else
echo "Failed to import GPG key"
fi
else
echo "GPG key parts not found, skipping GPG import"
fi
================================================
FILE: .github/CODEOWNERS
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Any committer can add themselves to any of the path patterns
# and will subsequently get requested as a reviewer for any PRs
# that change matching files.
/* @cnoe-io/idpbuilder-approvers
/* @cnoe-io/idpbuilder-admin
================================================
FILE: .github/workflows/code-scanner.yaml
================================================
name: code-scanner
on:
push:
branches: [ "main" ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ "main" ]
types: [opened, ready_for_review, synchronize]
permissions:
contents: write
security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
jobs:
code-analysis:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- run: ls -al
- name: Scan current project
id: scan
uses: anchore/scan-action@v7
with:
fail-build: false
path: "."
- name: Upload scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: ${{ steps.scan.outputs.sarif }}
================================================
FILE: .github/workflows/codespell.yaml
================================================
---
name: Codespell
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
codespell:
name: Check for spelling errors
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Codespell
uses: codespell-project/actions-codespell@v2
with:
check_filenames: true
# When using this Action in other repos, the --skip option below can be removed
skip: "*.excalidraw,*.git,*.png,*.jpg,*.svg,go.mod,go.sum,./pkg/controllers/localbuild/resources"
continue-on-error: true # The PR checks will not fail, but the possible spelling issues will still be reported for review and correction
================================================
FILE: .github/workflows/e2e.yaml
================================================
name: E2E
on:
push:
branches:
- 'main'
paths:
- '**.go'
- 'go.sum'
- 'go.mod'
repository_dispatch:
types: [e2e-command]
jobs:
e2e:
runs-on: ubuntu-22.04
if: ${{ github.event.ref != '' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.26'
- name: Run tests
run: |
make e2e
# invoked by slash command workflow
e2e-slash-command:
runs-on: ubuntu-22.04
if: ${{ github.event.action == 'e2e-command' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }}
ref: ${{ github.event.client_payload.pull_request.head.ref }}
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.26'
- name: Run tests
run: |
make e2e
================================================
FILE: .github/workflows/nightly.yaml
================================================
name: nightly
on:
# This can be used to automatically publish nightlies at UTC nighttime
schedule:
- cron: '0 7 * * *' # run at 7 AM UTC
# This can be used to allow manually triggering nightlies from the web interface
workflow_dispatch:
jobs:
nightly:
runs-on: ubuntu-22.04
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.CNOE_GH_WORKFLOW_TOKEN_APP_ID }}
private-key: ${{ secrets.CNOE_GH_WORKFLOW_TOKEN_PRIVATE_KEY }}
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
token: ${{ steps.generate-token.outputs.token }}
fetch-depth: 0
- run: git fetch --force --tags
-
name: 'Push new tag'
run: |
git config user.name "${GITHUB_ACTOR}"
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
# A previous release was created using a lightweight tag
# git describe by default includes only annotated tags
# git describe --tags includes lightweight tags as well
DESCRIBE=`git tag -l --sort=-v:refname | grep -v nightly | head -n 1`
MAJOR_VERSION=`echo $DESCRIBE | awk '{split($0,a,"."); print a[1]}'`
MINOR_VERSION=`echo $DESCRIBE | awk '{split($0,a,"."); print a[2]}'`
MINOR_VERSION="$((${MINOR_VERSION} + 1))"
TAG="${MAJOR_VERSION}.${MINOR_VERSION}.0-nightly.$(date +'%Y%m%d')"
git tag -a $TAG -m "$TAG: nightly build"
git push origin $TAG
- name: Find previous nightly
run: |
prev_tag=$(git tag | grep "nightly" | sort -r --version-sort | head -n 2 | tail -n 1)
echo "PREVIOUS_NIGHTLY_TAG=$prev_tag" >> $GITHUB_ENV
git push --delete origin $prev_tag
- name: 'Clean up nightly releases'
uses: actions/github-script@v8
with:
github-token: ${{ steps.generate-token.outputs.token }}
script: |
const latestRelease = await github.rest.repos.getReleaseByTag({
owner: "${{ github.repository_owner }}",
repo: "${{ github.event.repository.name }}",
tag: "${{ env.PREVIOUS_NIGHTLY_TAG }}"
});
console.log(`Release ${latestRelease}`);
if (latestRelease && latestRelease.data && latestRelease.data.id) {
await github.rest.repos.deleteRelease({
owner: "${{ github.repository_owner }}",
repo: "${{ github.event.repository.name }}",
release_id: latestRelease.data.id,
});
console.log(`Release id ${latestRelease.data.id} has been deleted.`);
} else {
console.log("No latest release found or failed to retrieve it.");
}
================================================
FILE: .github/workflows/pr.yaml
================================================
name: PR
on:
pull_request:
types: [opened, ready_for_review, synchronize]
jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Go
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.26'
- name: Run tests
run: |
make build
if [[ -n $(git status --porcelain) ]]; then
echo "git is in dirty state";
git status --porcelain=2 --branch
exit 1
fi
make test
================================================
FILE: .github/workflows/release.yaml
================================================
name: release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-nightly.[0-9]+'
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- run: git fetch --force --tags
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.26'
- name: Set GORELEASER_PREVIOUS_TAG in actual release
if: ${{ !contains(github.ref, '-nightly') }}
# find previous tag by filtering out nightly tags and choosing the
# second to last tag (last one is the current release)
run: |
prev_tag=$(git tag | grep -v "nightly" | sort -r --version-sort | head -n 2 | tail -n 1)
echo "GORELEASER_PREVIOUS_TAG=$prev_tag" >> $GITHUB_ENV
# Ensure generation tools run
- name: build
run: |
OUT_FILE=/tmp/idpbuilder make build
- name: Generate a homebrew tap update token
id: generate-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.CNOE_HOMEBREW_APP_ID }}
private-key: ${{ secrets.CNOE_HOMEBREW_PRIVATE_KEY }}
repositories: |
homebrew-tap
- name: GoReleaser
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
id: run-goreleaser
with:
version: latest
args: release --clean --timeout 30m
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HOMEBREW_TOKEN: ${{ steps.generate-token.outputs.token }}
GORELEASER_CURRENT_TAG: ${{ github.ref_name }}
================================================
FILE: .github/workflows/slash-commands.yaml
================================================
name: slash-commands
on:
issue_comment:
types: [created]
jobs:
slash_command_dispatch:
runs-on: ubuntu-22.04
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.CNOE_GH_WORKFLOW_TOKEN_APP_ID }}
private-key: ${{ secrets.CNOE_GH_WORKFLOW_TOKEN_PRIVATE_KEY }}
- name: Slash Command Dispatch
uses: peter-evans/slash-command-dispatch@v5
with:
token: ${{ steps.generate-token.outputs.token }}
commands: |
e2e
permission: write
issue-type: pull-request
================================================
FILE: .gitignore
================================================
idpbuilder
bin/*
.DS_Store
cover.out
__debug*
.vscode
.idea
================================================
FILE: .goreleaser.yaml
================================================
version: 2
project_name: idpbuilder
before:
hooks:
- go mod tidy
release:
# Mark nightly build as prerelease based on tag
prerelease: auto
builds:
- env:
- CGO_ENABLED=0
goos:
- linux
- darwin
goarch:
- amd64
- arm64
ldflags:
- -X github.com/cnoe-io/idpbuilder/pkg/cmd/version.idpbuilderVersion={{ .Version }}
- -X github.com/cnoe-io/idpbuilder/pkg/cmd/version.gitCommit={{ .FullCommit }}
- -X github.com/cnoe-io/idpbuilder/pkg/cmd/version.buildDate={{ .CommitDate }}
- -w
- -s
binary: idpbuilder
ignore:
- goos: linux
goarch: '386'
brews:
# For non version installations
- name: "idpbuilder"
homepage: "https://cnoe.io"
skip_upload: "{{ contains .Tag \"nightly\" }}" # Don't upload this formula if the build is nightly
repository:
owner: cnoe-io
name: homebrew-tap
token: "{{ .Env.HOMEBREW_TOKEN }}"
commit_author:
name: "CNOEAutomation"
email: "noreply@cnoe.io"
directory: Formula
install: |
bin.install "idpbuilder"
test: |
system "#{bin}/idpbuilder version"
# For versioned and nightly installations
- name: "{{ if contains .Tag \"nightly\" }}idpbuilder-nightly{{ else }}idpbuilder@{{ .Major }}.{{ .Minor }}.{{ .Patch }}{{ end }}"
homepage: "https://cnoe.io"
repository:
owner: cnoe-io
name: homebrew-tap
token: "{{ .Env.HOMEBREW_TOKEN }}"
commit_author:
name: "CNOEAutomation"
email: "noreply@cnoe.io"
directory: Formula
install: |
bin.install "idpbuilder"
test: |
system "#{bin}/idpbuilder version"
archives:
- format: tar.gz
name_template: >-
{{ .ProjectName }}-{{ .Os }}-{{ .Arch }}
checksum:
name_template: 'checksums.txt'
snapshot:
version_template: "{{ incpatch .Version }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
use: github
format: "{{.SHA}}: {{.Message}} [{{.AuthorName}}](@{{.AuthorUsername}})"
groups:
- title: "✨ Features"
regexp: '^.*?feat(\([[:word:]]+\))??!?:.+$'
order: 0
- title: "🐛 Bug fixes"
regexp: '^.*?(fix|bug)(\([[:word:]]+\))??!?:.+$'
order: 1
- title: "🔧 Others"
order: 999
================================================
FILE: .pre-commit-config.yaml
================================================
# For more information, visit: https://pre-commit.com
# To run locally:
# 1. Install pre-commit: pip install pre-commit
# 2. Run pre-commit checks on all files: pre-commit run --all-files
repos:
- repo: https://github.com/codespell-project/codespell
rev: v2.2.6
hooks:
- id: codespell
args: ["--skip=*.excalidraw,*.git,*.png,*.jpg,*.svg,go.sum,go.mod,./pkg/controllers/localbuild/resources"]
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing guide
Welcome to the project, and thanks for considering contributing to this project.
If you have any questions or need clarifications on topics covered here, please feel free to reach out to us on the [#cnoe-interest](https://cloud-native.slack.com/archives/C05TN9WFN5S) channel on CNCF Slack.
## Setting up a development environment
To get started with the project on your machine, you need to install the following tools:
1. Go 1.21+. See [this official guide](https://go.dev/doc/install) from Go authors.
2. Make. You can install it through a package manager on your system. E.g. Install `build-essential` for Ubuntu systems.
3. Docker. Similar to Make, you can install it through your package manager or [Docker Desktop](https://www.docker.com/products/docker-desktop/).
Once required tools are installed, clone this repository. `git clone https://github.com/cnoe-io/idpbuilder.git`.
Then change your current working directory to the repository root. e.g. `cd idpbuilder`.
All subsequent commands described in this document assumes they are executed from the repository root.
Ensure your docker daemon is running and available. e.g. `docker images` command should not error out.
## Building from the main branch
1. Checkout the main branch. `git checkout main`
2. Build the binary. `make build`. This compiles the project. It will take several minutes for the first time. Example output shown below:
```
~/idpbuilder$ make build
test -s /home/ubuntu/idpbuilder/bin/controller-gen && /home/ubuntu/idpbuilder/bin/controller-gen --version | grep -q v0.12.0 || \
GOBIN=/home/ubuntu/idpbuilder/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.12.0
/home/ubuntu/idpbuilder/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./api/..." output:crd:artifacts:config=pkg/controllers/resources
/home/ubuntu/idpbuilder/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go build -o idpbuilder main.go
```
3. Once build finishes, you should have an executable file called `idpbuilder` in the root of the repository.
4. The file is ready to use. Execute this command to confirm: `./idpbuilder --help`
### Testing basic functionalities
To test the very basic functionality of idpbuilder, Run the following command: `./idpbuilder create`
This command creates a kind cluster, expose associated endpoints to your local machine using an ingress controller and deploy the following packages:
1. [Kind](https://kind.sigs.k8s.io/) cluster.
2. [ArgoCD](https://argo-cd.readthedocs.io/en/stable/) resources.
3. [Gitea](https://about.gitea.com/) resources.
4. [Backstage](https://backstage.io/) resources.
They are deployed as ArgoCD Applications with the Gitea repositories set as their sources.
UIs for Backstage, Gitea, and ArgoCD are accessible on the machine:
* Gitea: https://gitea.cnoe.localtest.me:8443/explore/repos
* Backstage: https://backstage.cnoe.localtest.me:8443/
* ArgoCD: https://argocd.cnoe.localtest.me:8443/applications
#### Getting credentials for packages
Credentials for core packages can be obtained with:
```bash
idpbuilder get secrets
```
As described in the main readme file, the above command is equivalent to running:
```bash
kubectl -n argocd get secret argocd-initial-admin-secret
kubectl get secrets -n gitea gitea-admin-secret
kubectl get secrets -A -l cnoe.io/cli-secret=true
```
All ArgoCD applications should be synced and healthy. You can check them in the UI or
```
kubectl get application -n argocd
```
### Upgrading a core component
The process to upgrade a core component: Argo CD, Gitea, Ingress is not so complex but requires to take care about the following points:
- Select the core component to be upgraded and get its current version. See the kustomization file under the `hack/<core-component>` folder and the resource YAML file of the resources to be installed
- Create a ticket describing the new sibling version of the core component to be bumped
- Bump the version part of the kustomization file. Example for argocd: https://github.com/cnoe-io/idpbuilder/blob/main/hack/argo-cd/kustomization.yaml#L4
- Review the patched files to see if changes are needed (new file(s), files to be deleted or files to be changed). Example for argocd: https://github.com/cnoe-io/idpbuilder/blob/main/hack/argo-cd/kustomization.yaml#L7-L16
- Generate the new resources YAML files using the bash script: `generate-manifests.sh`
- Build a new idpbuilder binary
- Test it locally like also using the e2e integration test: `make e2e`
- Review the test cases if changes are needed too
- Update the documentation to detail which version of the core component has been bumped like also for which version (or range of versions) of idpbuilder the new version of the component apply for.
**NOTES**:
- For some components, it could be possible that you also have to upgrade the version of the go library within the `go.mod` file. Example for gitea: `code.gitea.io/sdk/gitea v0.16.0`
- For Argo CD, we use a separate GitHub project (till a better solution is implemented) packaging a subset of the Argo CD API. Review carefully this file please: https://github.com/cnoe-io/argocd-api?tab=readme-ov-file#read-this-first
## Preparing a Pull Request
This repository requires a [Developer Certificate of Origin (DCO)](https://developercertificate.org/) signature.
When preparing to send in a pull request, please make sure your commit is signed. You can achieve this by doing a `git commit --sign` or `git commit -s` when making the commit.
## Project Information
### Default manifests installed by idpbuilder
The default manifests for the core packages are available [here](pkg/controllers/localbuild/resources).
These are generated by scripts. If you want to make changes to them, see below.
#### ArgoCD
ArgoCD manifests are generated using a bash script available [here](./hack/argo-cd/generate-manifests.sh).
This script runs kustomize to modify the basic installation manifests provided by ArgoCD. Modifications include:
1. Prevent notification and dex pods from running. This is done to keep the number of pods running low by default.
2. Use the annotation tracking instead of the default label tracking. Annotation tracking allows you to avoid [problems caused by the label tracking method](https://argo-cd.readthedocs.io/en/stable/user-guide/resource_tracking/). In addition, this configuration is required when using Crossplane.
3. Support for path based routing.
#### Gitea
Gitea manifests are generated using a bash script available [here](./hack/gitea/generate-manifests.sh).
This script runs helm template to generate most files. See the values file for more information.
#### Ingress-nginx
ingress-nginx manifests are generated using a bash script available [here](./hack/ingress-nginx/generate-manifests.sh).
This script runs kustomize to modify the basic installation manifests provided by ingress-nginx.
## Architecture
idpbuilder is made of two phases: CLI and Kubernetes controllers.

### CLI
When the idpbuilder binary is executed, it starts with the CLI phase.
1. This is the phase where command flags are parsed and translated into relevant Go structs' fields. Most notably the [`LocalBuild`](https://github.com/cnoe-io/idpbuilder/blob/main/api/v1alpha1/localbuild_types.go) struct.
2. Create a Kind cluster, then update the kubeconfig file.
3. Once the kind cluster is started and relevant fields are populated, Kubernetes controllers are started:
* `LocalbuildReconciler` responsible for bootstrapping the cluster with absolute necessary packages. Creates Custom Resources (CRs) and installs embedded manifests.
* `RepositoryReconciler` responsible for creating and managing Gitea repository and repository contents.
* `CustomPackageReconciler` responsible for managing custom packages.
4. They are all managed by a single Kubernetes controller manager.
5. Once controllers are started, CRs corresponding to these controllers are created. For example for Backstage, it creates a GitRepository CR and ArgoCD Application.
6. CLI then waits for these CRs to be ready.
### Controllers
During this phase, controllers act on CRs created by the CLI phase. Resources such as Gitea repositories and ArgoCD applications are created.
#### LocalbuildReconciler
`LocalbuildReconciler` bootstraps the cluster using embedded manifests. Embedded manifests are yaml files that are baked into the binary at compile time.
1. Install core packages. They are essential services that are needed for the user experiences we want to enable:
* Gitea. This is the in-cluster Git server that hosts Git repositories.
* Ingress-nginx. This is necessary to expose services inside the cluster to the users.
* ArgoCD. This is used as the packaging mechanism. Its primary purpose is to deploy manifests from gitea repositories.
2. Once they are installed, it creates `GitRepository` CRs for core packages. This CR represents the git repository on the Gitea server.
3. Create ArgoCD applications for the apps. Point them to the Gitea repositories. From here on, ArgoCD manages the core packages.
Once core packages are installed, it creates the other embedded applications: Backstage and Crossplane.
1. Create `GitRepository` CRs for the apps.
2. Create ArgoCD applications for the apps. Point them to the Gitea repositories.
#### RepositoryReconciler
`RepositoryReconciler` creates Gitea repositories.
The content of the repositories can either be sourced from Embedded file system or local file system.
#### CustomPackageReconciler
`CustomPackageReconciler` parses the specified ArgoCD application files. If they specify repository URL with the scheme `cnoe://`,
it creates `GitRepository` CR with source specified as local, then creates ArgoCD application with the repository URL replaced.
For example, if an ArgoCD application is specified as the following.
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
source:
repoURL: cnoe://busybox
```
Then, the actual object created is this.
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
source:
repoURL: http://my-gitea-http.gitea.svc.cluster.local:3000/giteaAdmin/idpbuilder-localdev-my-app-busybox.git
```
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [2023] Autodesk
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Makefile
================================================
LD_FLAGS=-ldflags " \
-X github.com/cnoe-io/idpbuilder/pkg/cmd/version.idpbuilderVersion=$(shell git describe --always --tags --dirty --broken) \
-X github.com/cnoe-io/idpbuilder/pkg/cmd/version.gitCommit=$(shell git rev-parse HEAD) \
-X github.com/cnoe-io/idpbuilder/pkg/cmd/version.buildDate=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ') \
"
# The name of the binary. Defaults to idpbuilder
OUT_FILE ?= idpbuilder
.PHONY: build
build: manifests generate fmt vet embedded-resources
go build $(LD_FLAGS) -o $(OUT_FILE) main.go
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.29.1
## Location to install dependencies to
LOCALBIN ?= $(shell pwd)/bin
$(LOCALBIN):
mkdir -p $(LOCALBIN)
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
ENVTEST ?= $(LOCALBIN)/setup-envtest
KUSTOMIZE ?= $(LOCALBIN)/kustomize
HELM_TGZ ?= $(LOCALBIN)/helm.tar.gz
HELM ?= $(LOCALBIN)/helm
## Tool Versions
CONTROLLER_TOOLS_VERSION ?= v0.20.0
.PHONY: fmt
fmt: ## Run go fmt against code.
go fmt ./...
.PHONY: vet
vet: ## Run go vet against code.
go vet ./...
.PHONY: test
test: manifests generate fmt vet envtest ## Run tests.
ifeq ($(RUN),)
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test -p 1 --tags=integration ./... -coverprofile cover.out
else
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test -p 1 --tags=integration ./... -coverprofile cover.out -run $(RUN)
endif
.PHONY: generate
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./api/..."
.PHONY: manifests
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
$(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./api/..." output:crd:artifacts:config=pkg/controllers/resources
.PHONY: controller-gen
controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. If wrong version is installed, it will be overwritten.
$(CONTROLLER_GEN): $(LOCALBIN)
test -s $(LOCALBIN)/controller-gen && $(LOCALBIN)/controller-gen --version | grep -q $(CONTROLLER_TOOLS_VERSION) || \
GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION)
.PHONY: kustomize
kustomize: ## Download kustomize if necessary
ifeq (,$(wildcard $(KUSTOMIZE)))
cd $(LOCALBIN) && curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
endif
helm_os := $(shell uname | tr '[:upper:]' '[:lower:]')
helm_version ?= 3.15.0
ifeq ($(shell uname -m), x86_64)
helm_arch ?= amd64
endif
ifeq ($(shell uname -m), arm64)
helm_arch ?= arm64
endif
ifeq ($(shell uname -m), aarch64)
helm_arch ?= arm64
endif
.PHONY: helm
helm: ## Download helm if necessary
ifeq (,$(wildcard $(HELM)))
curl https://get.helm.sh/helm-v$(helm_version)-$(helm_os)-$(helm_arch).tar.gz -o $(HELM_TGZ)
tar xvzf $(HELM_TGZ) -C $(LOCALBIN) --strip-components 1 $(helm_os)-$(helm_arch)/helm
chmod +x $(HELM)
endif
.PHONY: envtest
envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
$(ENVTEST): $(LOCALBIN)
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
.PHONY: embedded-resources
embedded-resources: kustomize helm
export PATH=$(LOCALBIN):$$PATH; ./hack/embedded-resources.sh;
.PHONY: e2e
e2e: build
go test -v -p 1 -timeout 15m --tags=e2e ./tests/e2e/...
================================================
FILE: README.md
================================================
[![Codespell][codespell-badge]][codespell-link]
[![E2E][e2e-badge]][e2e-link]
[![Go Report Card][report-badge]][report-link]
[![Commit Activity][commit-activity-badge]][commit-activity-link]
# IDP Builder
Internal development platform binary launcher.
## About
Spin up a complete internal developer platform using industry standard technologies like Kubernetes, Argo, and backstage with only Docker required as a dependency.
This can be useful in several ways:
* Create a single binary which can demonstrate an IDP reference implementation.
* Use within CI to perform integration testing.
* Use as a local development environment for platform engineers.
## Installation
### Using [Homebrew](https://brew.sh)
+ Stable Version
```bash
brew install cnoe-io/tap/idpbuilder
```
+ Specific Stable Version
```bash
brew install cnoe-io/tap/idpbuilder@<version>
```
+ Nightly Version
```bash
brew install cnoe-io/tap/idpbuilder-nightly
```
### From Releases
Another way to get started is to grab the idpbuilder binary for your platform and run it. You can visit our [releases](https://github.com/cnoe-io/idpbuilder/releases) page to download the version for your system, or run the following commands:
```bash
arch=$(if [[ "$(uname -m)" == "x86_64" ]]; then echo "amd64"; else uname -m; fi)
os=$(uname -s | tr '[:upper:]' '[:lower:]')
idpbuilder_latest_tag=$(curl --silent "https://api.github.com/repos/cnoe-io/idpbuilder/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
curl -LO https://github.com/cnoe-io/idpbuilder/releases/download/$idpbuilder_latest_tag/idpbuilder-$os-$arch.tar.gz
tar xvzf idpbuilder-$os-$arch.tar.gz
```
Download latest extract idpbuilder binary
```bash
cd ~/bin
curl -vskL -O https://github.com/cnoe-io/idpbuilder/releases/latest/download/idpbuilder-linux-amd64.tar.gz
tar xvzf idpbuilder-linux-amd64.tar.gz idpbuilder
```
## Getting Started
You can then run idpbuilder with the create argument to spin up your CNOE IDP:
```bash
./idpbuilder create
```
For more detailed information, checkout our [documentation](https://cnoe.io/docs/idpbuilder) on getting started with idpbuilder.
## Community
- If you have questions or concerns about this tool, please feel free to reach out to us on the [CNCF Slack Channel](https://cloud-native.slack.com/archives/C05TN9WFN5S).
- You can also join our community meetings to meet the team and ask any questions. Checkout [this calendar](https://calendar.google.com/calendar/embed?src=064a2adfce866ccb02e61663a09f99147f22f06374e7a8994066bdc81e066986%40group.calendar.google.com&ctz=America%2FLos_Angeles) for more information.
## Contribution
Checkout the [contribution doc](./CONTRIBUTING.md) for contribution guidelines and more information on how to set up your local environment.
<!-- JUST BADGES & LINKS -->
[codespell-badge]: https://github.com/cnoe-io/idpbuilder/actions/workflows/codespell.yaml/badge.svg
[codespell-link]: https://github.com/cnoe-io/idpbuilder/actions/workflows/codespell.yaml
[e2e-badge]: https://github.com/cnoe-io/idpbuilder/actions/workflows/e2e.yaml/badge.svg
[e2e-link]: https://github.com/cnoe-io/idpbuilder/actions/workflows/e2e.yaml
[report-badge]: https://goreportcard.com/badge/github.com/cnoe-io/idpbuilder
[report-link]: https://goreportcard.com/report/github.com/cnoe-io/idpbuilder
[commit-activity-badge]: https://img.shields.io/github/commit-activity/m/cnoe-io/idpbuilder
[commit-activity-link]: https://github.com/cnoe-io/idpbuilder/pulse
================================================
FILE: api/v1alpha1/custom_package_types.go
================================================
package v1alpha1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
CNOEURIScheme = "cnoe://"
)
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
type CustomPackage struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec CustomPackageSpec `json:"spec,omitempty"`
Status CustomPackageStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
type CustomPackageList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []CustomPackage `json:"items"`
}
// CustomPackageSpec controls the installation of the custom applications.
type CustomPackageSpec struct {
ArgoCD ArgoCDPackageSpec `json:"argoCD,omitempty"`
// GitServerURL specifies the base URL for the git server for API calls.
// for example, https://gitea.cnoe.localtest.me:8443
GitServerURL string `json:"gitServerURL"`
GitServerAuthSecretRef SecretReference `json:"gitServerAuthSecretRef"`
// InternalGitServeURL specifies the base URL for the git server accessible within the cluster.
// for example, http://my-gitea-http.gitea.svc.cluster.local:3000
InternalGitServeURL string `json:"internalGitServeURL"`
RemoteRepository RemoteRepositorySpec `json:"remoteRepository"`
// Replicate specifies whether to replicate remote or local contents to the local gitea server.
// +kubebuilder:default:=false
Replicate bool `json:"replicate"`
}
// RemoteRepositorySpec specifies information about remote repositories.
type RemoteRepositorySpec struct {
CloneSubmodules bool `json:"cloneSubmodules"`
Path string `json:"path"`
// Url specifies the url to the repository containing the ArgoCD application file
Url string `json:"url"`
// Ref specifies the specific ref supported by git fetch
Ref string `json:"ref"`
}
type ArgoCDPackageSpec struct {
// ApplicationFile specifies the absolute path to the ArgoCD application file
ApplicationFile string `json:"applicationFile"`
Name string `json:"name"`
Namespace string `json:"namespace"`
// +kubebuilder:validation:Enum:=Application;ApplicationSet
Type string `json:"type"`
}
type CustomPackageStatus struct {
// A Custom package is considered synced when the in-cluster repository url is set as the repository URL
// This only applies for a package that references local directories
Synced bool `json:"synced,omitempty"`
GitRepositoryRefs []ObjectRef `json:"gitRepositoryRefs,omitempty"`
}
type ObjectRef struct {
APIVersion string `json:"apiVersion,omitempty"`
Name string `json:"name,omitempty"`
Namespace string `json:"namespace,omitempty"`
Kind string `json:"kind,omitempty"`
UID string `json:"uid,omitempty"`
}
================================================
FILE: api/v1alpha1/gitrepository_types.go
================================================
package v1alpha1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
GitProviderGitea = "gitea"
GitProviderGitHub = "github"
GiteaAdminUserName = "giteaAdmin"
SourceTypeLocal = "local"
SourceTypeRemote = "remote"
SourceTypeEmbedded = "embedded"
)
type GitRepositorySpec struct {
// +kubebuilder:validation:Optional
Customization PackageCustomization `json:"customization,omitempty"`
// SecretRef is the reference to secret that contain Git server credentials
// +kubebuilder:validation:Optional
SecretRef SecretReference `json:"secretRef"`
Source GitRepositorySource `json:"source,omitempty"`
Provider Provider `json:"provider"`
}
type GitRepositorySource struct {
// +kubebuilder:validation:Enum:=argocd;gitea;nginx
// +kubebuilder:validation:Optional
EmbeddedAppName string `json:"embeddedAppName,omitempty"`
// Path is the absolute path to directory that contains Kustomize structure or raw manifests.
// This is required when Type is set to local.
// +kubebuilder:validation:Optional
Path string `json:"path"`
RemoteRepository RemoteRepositorySpec `json:"remoteRepository"`
// Type is the source type.
// +kubebuilder:validation:Enum:=local;embedded;remote
// +kubebuilder:default:=embedded
Type string `json:"type"`
}
type Provider struct {
// +kubebuilder:validation:Enum:=gitea;github
// +kubebuilder:validation:Required
Name string `json:"name"`
// GitURL is the base URL of Git server used for API calls.
// +kubebuilder:validation:Required
// +kubebuilder:validation:Pattern=`^https?:\/\/.+$`
GitURL string `json:"gitURL"`
// InternalGitURL is the base URL of Git server accessible within the cluster only.
InternalGitURL string `json:"internalGitURL"`
OrganizationName string `json:"organizationName"`
}
type SecretReference struct {
Name string `json:"name"`
Namespace string `json:"namespace"`
}
type Commit struct {
// Hash is the digest of the most recent commit
// +kubebuilder:validation:Optional
Hash string `json:"hash"`
}
type GitRepositoryStatus struct {
// LatestCommit is the most recent commit known to the controller
// +kubebuilder:validation:Optional
LatestCommit Commit `json:"commit"`
// ExternalGitRepositoryUrl is the url for the in-cluster repository accessible from local machine.
// +kubebuilder:validation:Optional
ExternalGitRepositoryUrl string `json:"externalGitRepositoryUrl"`
// InternalGitRepositoryUrl is the url for the in-cluster repository accessible within the cluster.
// +kubebuilder:validation:Optional
InternalGitRepositoryUrl string `json:"internalGitRepositoryUrl"`
// Path is the path within the repository that contains the files.
// +kubebuilder:validation:Optional
Path string `json:"path"`
Synced bool `json:"synced"`
}
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
type GitRepository struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec GitRepositorySpec `json:"spec,omitempty"`
Status GitRepositoryStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
type GitRepositoryList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []GitRepository `json:"items"`
}
================================================
FILE: api/v1alpha1/groupversion_info.go
================================================
// +kubebuilder:object:generate=true
// +groupName=idpbuilder.cnoe.io
package v1alpha1
import (
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/scheme"
)
var (
// GroupVersion is group version used to register these objects
GroupVersion = schema.GroupVersion{Group: "idpbuilder.cnoe.io", Version: "v1alpha1"}
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
)
func init() {
SchemeBuilder.Register(&Localbuild{}, &LocalbuildList{})
SchemeBuilder.Register(&GitRepository{}, &GitRepositoryList{})
SchemeBuilder.Register(&CustomPackage{}, &CustomPackageList{})
}
================================================
FILE: api/v1alpha1/localbuild_types.go
================================================
package v1alpha1
import (
"fmt"
"github.com/cnoe-io/idpbuilder/globals"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
// LastObservedCLIStartTimeAnnotation indicates when the controller acted on a resource.
LastObservedCLIStartTimeAnnotation = "cnoe.io/last-observed-cli-start-time"
// CliStartTimeAnnotation indicates when the CLI was invoked.
CliStartTimeAnnotation = "cnoe.io/cli-start-time"
// PackagePriorityAnnotation indicates the priority of a package (higher = wins conflicts).
PackagePriorityAnnotation = "cnoe.io/package-priority"
// PackageSourcePathAnnotation indicates the source path of a package.
PackageSourcePathAnnotation = "cnoe.io/package-source-path"
FieldManager = "idpbuilder"
// If GetSecretLabelKey is set to GetSecretLabelValue on a kubernetes secret, secret key and values can be used by the get command.
CLISecretLabelKey = "cnoe.io/cli-secret"
CLISecretLabelValue = "true"
PackageNameLabelKey = "cnoe.io/package-name"
PackageTypeLabelKey = "cnoe.io/package-type"
PackageTypeLabelCore = "core"
PackageTypeLabelCustom = "custom"
ArgoCDPackageName = "argocd"
GiteaPackageName = "gitea"
IngressNginxPackageName = "nginx"
)
// ArgoPackageConfigSpec Allows for configuration of the ArgoCD Installation.
// If no fields are specified then the binary embedded resources will be used to install ArgoCD.
type ArgoPackageConfigSpec struct {
// Enabled controls whether to install ArgoCD.
Enabled bool `json:"enabled,omitempty"`
}
// EmbeddedArgoApplicationsPackageConfigSpec Controls the installation of the embedded argo applications.
type EmbeddedArgoApplicationsPackageConfigSpec struct {
// Enabled controls whether to install the embedded argo applications and the associated GitServer
Enabled bool `json:"enabled,omitempty"`
}
type PackageConfigsSpec struct {
Argo ArgoPackageConfigSpec `json:"argoPackageConfigs,omitempty"`
EmbeddedArgoApplications EmbeddedArgoApplicationsPackageConfigSpec `json:"embeddedArgoApplicationsPackageConfigs,omitempty"`
CustomPackageFiles []string `json:"customPackageFiles,omitempty"`
CustomPackageDirs []string `json:"customPackageDirs,omitempty"`
CustomPackageUrls []string `json:"customPackageUrls,omitempty"`
// +kubebuilder:validation:Optional
CorePackageCustomization map[string]PackageCustomization `json:"packageCustomization,omitempty"`
}
// RegistryMirror defines an external registry mirror configuration
type RegistryMirror struct {
// TargetRegistry is the registry that should be mirrored (e.g., "docker.io", "ghcr.io")
TargetRegistry string `json:"targetRegistry,omitempty"`
// RegistryAddress is the address of the mirror registry (e.g., "http://kind-registry:5000")
RegistryAddress string `json:"registryAddress,omitempty"`
}
// BuildCustomizationSpec fields cannot change once a cluster is created
type BuildCustomizationSpec struct {
Protocol string `json:"protocol,omitempty"`
Host string `json:"host,omitempty"`
IngressHost string `json:"ingressHost,omitempty"`
Port string `json:"port,omitempty"`
UsePathRouting bool `json:"usePathRouting,omitempty"`
SelfSignedCert string `json:"selfSignedCert,omitempty"`
StaticPassword bool `json:"staticPassword,omitempty"`
RegistryMirrors []RegistryMirror `json:"registryMirrors,omitempty"`
InsecureRegistryMirrors bool `json:"insecureRegistryMirrors,omitempty"`
}
type LocalbuildSpec struct {
PackageConfigs PackageConfigsSpec `json:"packageConfigs,omitempty"`
BuildCustomization BuildCustomizationSpec `json:"buildCustomization,omitempty"`
}
// PackageCustomization defines how packages are customized
type PackageCustomization struct {
// Name is the name of the package to be customized. e.g. argocd
Name string `json:"name,omitempty'"`
// FilePath is the absolute file path to a YAML file that contains Kubernetes manifests.
FilePath string `json:"filePath,omitempty"`
}
type LocalbuildStatus struct {
// ObservedGeneration is the 'Generation' of the Service that was last processed by the controller.
// +optional
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
ArgoCD ArgoCDStatus `json:"ArgoCD,omitempty"`
Nginx NginxStatus `json:"nginx,omitempty"`
Gitea GiteaStatus `json:"gitea,omitempty"`
}
type GiteaStatus struct {
Available bool `json:"available,omitempty"`
ExternalURL string `json:"externalURL,omitempty"`
InternalURL string `json:"internalURL,omitempty"`
AdminUserSecretName string `json:"adminUserSecretNameecret,omitempty"`
AdminUserSecretNamespace string `json:"adminUserSecretNamespace,omitempty"`
}
type ArgoCDStatus struct {
Available bool `json:"available,omitempty"`
AppsCreated bool `json:"appsCreated,omitempty"`
}
type NginxStatus struct {
Available bool `json:"available,omitempty"`
}
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:resource:path=localbuilds,scope=Cluster
type Localbuild struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec LocalbuildSpec `json:"spec,omitempty"`
Status LocalbuildStatus `json:"status,omitempty"`
}
func (l *Localbuild) GetArgoProjectName() string {
return fmt.Sprintf("%s-%s-gitserver", globals.ProjectName, l.Name)
}
func (l *Localbuild) GetArgoApplicationName(name string) string {
return fmt.Sprintf("%s-%s-gitserver-%s", globals.ProjectName, l.Name, name)
}
// +kubebuilder:object:root=true
type LocalbuildList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Localbuild `json:"items"`
}
================================================
FILE: api/v1alpha1/zz_generated.deepcopy.go
================================================
//go:build !ignore_autogenerated
/*
Copyright 2023.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by controller-gen. DO NOT EDIT.
package v1alpha1
import (
runtime "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ArgoCDPackageSpec) DeepCopyInto(out *ArgoCDPackageSpec) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArgoCDPackageSpec.
func (in *ArgoCDPackageSpec) DeepCopy() *ArgoCDPackageSpec {
if in == nil {
return nil
}
out := new(ArgoCDPackageSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ArgoCDStatus) DeepCopyInto(out *ArgoCDStatus) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArgoCDStatus.
func (in *ArgoCDStatus) DeepCopy() *ArgoCDStatus {
if in == nil {
return nil
}
out := new(ArgoCDStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ArgoPackageConfigSpec) DeepCopyInto(out *ArgoPackageConfigSpec) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArgoPackageConfigSpec.
func (in *ArgoPackageConfigSpec) DeepCopy() *ArgoPackageConfigSpec {
if in == nil {
return nil
}
out := new(ArgoPackageConfigSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BuildCustomizationSpec) DeepCopyInto(out *BuildCustomizationSpec) {
*out = *in
if in.RegistryMirrors != nil {
in, out := &in.RegistryMirrors, &out.RegistryMirrors
*out = make([]RegistryMirror, len(*in))
copy(*out, *in)
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildCustomizationSpec.
func (in *BuildCustomizationSpec) DeepCopy() *BuildCustomizationSpec {
if in == nil {
return nil
}
out := new(BuildCustomizationSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Commit) DeepCopyInto(out *Commit) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Commit.
func (in *Commit) DeepCopy() *Commit {
if in == nil {
return nil
}
out := new(Commit)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CustomPackage) DeepCopyInto(out *CustomPackage) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
in.Status.DeepCopyInto(&out.Status)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomPackage.
func (in *CustomPackage) DeepCopy() *CustomPackage {
if in == nil {
return nil
}
out := new(CustomPackage)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *CustomPackage) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CustomPackageList) DeepCopyInto(out *CustomPackageList) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]CustomPackage, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomPackageList.
func (in *CustomPackageList) DeepCopy() *CustomPackageList {
if in == nil {
return nil
}
out := new(CustomPackageList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *CustomPackageList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CustomPackageSpec) DeepCopyInto(out *CustomPackageSpec) {
*out = *in
out.ArgoCD = in.ArgoCD
out.GitServerAuthSecretRef = in.GitServerAuthSecretRef
out.RemoteRepository = in.RemoteRepository
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomPackageSpec.
func (in *CustomPackageSpec) DeepCopy() *CustomPackageSpec {
if in == nil {
return nil
}
out := new(CustomPackageSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CustomPackageStatus) DeepCopyInto(out *CustomPackageStatus) {
*out = *in
if in.GitRepositoryRefs != nil {
in, out := &in.GitRepositoryRefs, &out.GitRepositoryRefs
*out = make([]ObjectRef, len(*in))
copy(*out, *in)
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomPackageStatus.
func (in *CustomPackageStatus) DeepCopy() *CustomPackageStatus {
if in == nil {
return nil
}
out := new(CustomPackageStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EmbeddedArgoApplicationsPackageConfigSpec) DeepCopyInto(out *EmbeddedArgoApplicationsPackageConfigSpec) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmbeddedArgoApplicationsPackageConfigSpec.
func (in *EmbeddedArgoApplicationsPackageConfigSpec) DeepCopy() *EmbeddedArgoApplicationsPackageConfigSpec {
if in == nil {
return nil
}
out := new(EmbeddedArgoApplicationsPackageConfigSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *GitRepository) DeepCopyInto(out *GitRepository) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
out.Status = in.Status
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepository.
func (in *GitRepository) DeepCopy() *GitRepository {
if in == nil {
return nil
}
out := new(GitRepository)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *GitRepository) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *GitRepositoryList) DeepCopyInto(out *GitRepositoryList) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]GitRepository, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositoryList.
func (in *GitRepositoryList) DeepCopy() *GitRepositoryList {
if in == nil {
return nil
}
out := new(GitRepositoryList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *GitRepositoryList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *GitRepositorySource) DeepCopyInto(out *GitRepositorySource) {
*out = *in
out.RemoteRepository = in.RemoteRepository
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositorySource.
func (in *GitRepositorySource) DeepCopy() *GitRepositorySource {
if in == nil {
return nil
}
out := new(GitRepositorySource)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *GitRepositorySpec) DeepCopyInto(out *GitRepositorySpec) {
*out = *in
out.Customization = in.Customization
out.SecretRef = in.SecretRef
out.Source = in.Source
out.Provider = in.Provider
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositorySpec.
func (in *GitRepositorySpec) DeepCopy() *GitRepositorySpec {
if in == nil {
return nil
}
out := new(GitRepositorySpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *GitRepositoryStatus) DeepCopyInto(out *GitRepositoryStatus) {
*out = *in
out.LatestCommit = in.LatestCommit
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositoryStatus.
func (in *GitRepositoryStatus) DeepCopy() *GitRepositoryStatus {
if in == nil {
return nil
}
out := new(GitRepositoryStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *GiteaStatus) DeepCopyInto(out *GiteaStatus) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GiteaStatus.
func (in *GiteaStatus) DeepCopy() *GiteaStatus {
if in == nil {
return nil
}
out := new(GiteaStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Localbuild) DeepCopyInto(out *Localbuild) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
out.Status = in.Status
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Localbuild.
func (in *Localbuild) DeepCopy() *Localbuild {
if in == nil {
return nil
}
out := new(Localbuild)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *Localbuild) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LocalbuildList) DeepCopyInto(out *LocalbuildList) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]Localbuild, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalbuildList.
func (in *LocalbuildList) DeepCopy() *LocalbuildList {
if in == nil {
return nil
}
out := new(LocalbuildList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *LocalbuildList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LocalbuildSpec) DeepCopyInto(out *LocalbuildSpec) {
*out = *in
in.PackageConfigs.DeepCopyInto(&out.PackageConfigs)
in.BuildCustomization.DeepCopyInto(&out.BuildCustomization)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalbuildSpec.
func (in *LocalbuildSpec) DeepCopy() *LocalbuildSpec {
if in == nil {
return nil
}
out := new(LocalbuildSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LocalbuildStatus) DeepCopyInto(out *LocalbuildStatus) {
*out = *in
out.ArgoCD = in.ArgoCD
out.Nginx = in.Nginx
out.Gitea = in.Gitea
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalbuildStatus.
func (in *LocalbuildStatus) DeepCopy() *LocalbuildStatus {
if in == nil {
return nil
}
out := new(LocalbuildStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NginxStatus) DeepCopyInto(out *NginxStatus) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NginxStatus.
func (in *NginxStatus) DeepCopy() *NginxStatus {
if in == nil {
return nil
}
out := new(NginxStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ObjectRef) DeepCopyInto(out *ObjectRef) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectRef.
func (in *ObjectRef) DeepCopy() *ObjectRef {
if in == nil {
return nil
}
out := new(ObjectRef)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PackageConfigsSpec) DeepCopyInto(out *PackageConfigsSpec) {
*out = *in
out.Argo = in.Argo
out.EmbeddedArgoApplications = in.EmbeddedArgoApplications
if in.CustomPackageFiles != nil {
in, out := &in.CustomPackageFiles, &out.CustomPackageFiles
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.CustomPackageDirs != nil {
in, out := &in.CustomPackageDirs, &out.CustomPackageDirs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.CustomPackageUrls != nil {
in, out := &in.CustomPackageUrls, &out.CustomPackageUrls
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.CorePackageCustomization != nil {
in, out := &in.CorePackageCustomization, &out.CorePackageCustomization
*out = make(map[string]PackageCustomization, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PackageConfigsSpec.
func (in *PackageConfigsSpec) DeepCopy() *PackageConfigsSpec {
if in == nil {
return nil
}
out := new(PackageConfigsSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PackageCustomization) DeepCopyInto(out *PackageCustomization) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PackageCustomization.
func (in *PackageCustomization) DeepCopy() *PackageCustomization {
if in == nil {
return nil
}
out := new(PackageCustomization)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Provider) DeepCopyInto(out *Provider) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Provider.
func (in *Provider) DeepCopy() *Provider {
if in == nil {
return nil
}
out := new(Provider)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RegistryMirror) DeepCopyInto(out *RegistryMirror) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryMirror.
func (in *RegistryMirror) DeepCopy() *RegistryMirror {
if in == nil {
return nil
}
out := new(RegistryMirror)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RemoteRepositorySpec) DeepCopyInto(out *RemoteRepositorySpec) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteRepositorySpec.
func (in *RemoteRepositorySpec) DeepCopy() *RemoteRepositorySpec {
if in == nil {
return nil
}
out := new(RemoteRepositorySpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SecretReference) DeepCopyInto(out *SecretReference) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretReference.
func (in *SecretReference) DeepCopy() *SecretReference {
if in == nil {
return nil
}
out := new(SecretReference)
in.DeepCopyInto(out)
return out
}
================================================
FILE: docs/images/source/idpbuilder.excalidraw
================================================
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"type": "rectangle",
"version": 724,
"versionNonce": 1733856607,
"isDeleted": false,
"id": "rn5VxKirQVQTGadXpV6do",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 290.851641955539,
"y": -205.70273211471522,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"width": 734.3860626220707,
"height": 402.964050292969,
"seed": 1808569105,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"id": "14YqOkt6L4M1dDmR0ETLV",
"type": "arrow"
},
{
"id": "QKW8LI503Bc2mGvHDoU9l",
"type": "arrow"
},
{
"id": "Bvu5NEGthDTE0Lox0pKMY",
"type": "arrow"
},
{
"id": "nHmMkx97YgjINcsVC4VlS",
"type": "arrow"
}
],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "text",
"version": 1208,
"versionNonce": 990927288,
"isDeleted": false,
"id": "ZGIq8yJ3BbmfwBJLKF255",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 335.41134196774556,
"y": -142.72070696823084,
"strokeColor": "#f08c00",
"backgroundColor": "transparent",
"width": 128.3000030517578,
"height": 45,
"seed": 1137314033,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500158952,
"link": null,
"locked": false,
"fontSize": 36,
"fontFamily": 1,
"text": "ArgoCD",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "ArgoCD",
"lineHeight": 1.25,
"baseline": 32
},
{
"type": "line",
"version": 943,
"versionNonce": 1893290495,
"isDeleted": false,
"id": "c2F8xEpYpiskw9d3M9a8w",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 316.71289927073803,
"y": -244.03680215324493,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 95.45497317148764,
"height": 92.84673785134679,
"seed": 207471313,
"groupIds": [
"ErJ6hMmjgHu3hLAgUD5mh",
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
-2.460961781613241,
0.6518708205633831
],
[
-35.78710995652396,
16.547951146090107
],
[
-35.78710995652396,
16.547951146090107
],
[
-37.99651824523383,
18.295368383544606
],
[
-39.22587770163469,
20.829964132840722
],
[
-47.38323404404179,
56.50643421214563
],
[
-47.38323404404179,
56.50643421214563
],
[
-47.44490761168415,
59.02869632175984
],
[
-46.486164083674566,
61.371546036703016
],
[
-46.127336086160476,
61.87390302314864
],
[
-23.102541153377942,
90.5023995445162
],
[
-23.102541153377942,
90.5023995445162
],
[
-20.88341281591535,
92.2385995862048
],
[
-18.13277162331118,
92.84673785134694
],
[
18.796609460770327,
92.84673785134657
],
[
18.796609460770327,
92.84673785134657
],
[
21.553601408419915,
92.21505588002745
],
[
23.7723561720563,
90.47548511877764
],
[
46.7851882763901,
61.84101141619088
],
[
46.7851882763901,
61.84101141619088
],
[
48.01006555980353,
59.31202497770516
],
[
47.98128041322563,
56.5004570309265
],
[
39.770104899555754,
20.794081083564848
],
[
39.770104899555754,
20.794081083564848
],
[
38.538497583853335,
18.259485334268803
],
[
36.33133216395502,
16.51206809681414
],
[
3.0590107017396324,
0.6548610152590679
],
[
3.0590107017396324,
0.6548610152590679
],
[
-0.029900164639430578,
1.0408340855860843e-17
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1459,
"versionNonce": 1660729887,
"isDeleted": false,
"id": "-sn-l6KrmGQBkTSK90eC2",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 316.71182092183017,
"y": -232.215284031392,
"strokeColor": "#326ce5",
"backgroundColor": "#fff",
"width": 69.89576554459413,
"height": 68.58285031337438,
"seed": 1646215345,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
-1.432324825301546,
0.706068790071741
],
[
-1.9586047951674281,
2.2127733048543057
],
[
-1.9586047951674281,
2.7749363239961387
],
[
-1.9586047951674281,
2.7749363239961387
],
[
-1.6835033185244077,
4.667755053539658
],
[
-1.4861479733611118,
8.285937332102842
],
[
-2.138020041547117,
9.317567156587057
],
[
-2.1828717143605587,
10.1608131111541
],
[
-2.1828717143605587,
10.1608131111541
],
[
-5.780122451821784,
10.716997523222345
],
[
-9.423676381772387,
11.828850188102779
],
[
-12.844922516336029,
13.45792009292789
],
[
-15.98864037024059,
15.574210114965936
],
[
-18.799598051379608,
18.14772598319378
],
[
-19.517253333480934,
17.639386112111524
],
[
-19.517253333480934,
17.639386112111524
],
[
-20.698396813851012,
17.519776898427985
],
[
-23.380636924047703,
15.0976867567003
],
[
-24.687368225174932,
13.707230717019739
],
[
-25.129922030633214,
13.354383108896979
],
[
-25.129922030633214,
13.354383108896979
],
[
-26.51439946324018,
12.831091729640708
],
[
-28.102213699792635,
13.536786945886227
],
[
-28.46477993081394,
15.107405379598852
],
[
-27.611815353348355,
16.476185582233697
],
[
-27.199163138383813,
16.805110206936313
],
[
-27.199163138383813,
16.805110206936313
],
[
-25.548554278525646,
17.770955391650862
],
[
-22.56430111765615,
19.864120908675922
],
[
-22.166601836719924,
21.01236993037974
],
[
-21.51472976853398,
21.610415998797468
],
[
-21.51472976853398,
21.610415998797468
],
[
-23.76100352013141,
25.760906759200605
],
[
-25.20355599831609,
30.21443718537146
],
[
-25.816881521396525,
34.85579539828312
],
[
-25.57546727840974,
39.56975526036552
],
[
-26.4127317741946,
39.808973687732575
],
[
-26.4127317741946,
39.808973687732575
],
[
-27.26793922047171,
40.67016116693759
],
[
-30.838276958048898,
41.25923861181782
],
[
-32.75202722869432,
41.40874799014082
],
[
-33.281297215024175,
41.528360055533014
],
[
-33.34110182186594,
41.528360055533014
],
[
-33.34110182186594,
41.528360055533014
],
[
-34.32277541514808,
41.949032700926544
],
[
-34.92197214798472,
42.75908334157035
],
[
-34.64656696437611,
44.74352461662653
],
[
-34.4983223188159,
44.91330393965695
],
[
-33.54564347269364,
45.450098159119925
],
[
-32.45300276863114,
45.406689450856575
],
[
-32.414129702891266,
45.406689450856575
],
[
-31.875888241315288,
45.34688912157768
],
[
-31.875888241315288,
45.34688912157768
],
[
-30.087728643135613,
44.695017053391766
],
[
-26.613077135821825,
43.67833731122727
],
[
-25.4708081470459,
44.08201947679996
],
[
-24.57373904441927,
43.93250439505977
],
[
-24.57373904441927,
43.93250439505977
],
[
-22.726614667579607,
48.26815659466553
],
[
-20.14894100821738,
52.1676114472755
],
[
-16.913041673915092,
55.54003062724162
],
[
-13.09124454981824,
58.29459862258373
],
[
-13.456052223796778,
59.05710557749845
],
[
-13.456052223796778,
59.05710557749845
],
[
-13.27663697741718,
60.18143161578213
],
[
-15.079749509625142,
63.44676913793114
],
[
-16.15025239984924,
65.04056055570291
],
[
-16.404422335390343,
65.5788034431332
],
[
-16.404422335390343,
65.5788034431332
],
[
-16.674844158225717,
66.61201739174305
],
[
-16.40310484601853,
67.58225991111416
],
[
-15.697771796764803,
68.30179161747229
],
[
-14.667403853334795,
68.58285031337438
],
[
-14.460769048396918,
68.57203093095742
],
[
-13.451326942651566,
68.15994192844089
],
[
-12.807171597929074,
67.28024686044131
],
[
-12.55898169531586,
66.77190698935901
],
[
-12.55898169531586,
66.77190698935901
],
[
-11.984855758609651,
64.94786291604923
],
[
-11.287758443784064,
62.994870283400545
],
[
-10.44488748889749,
61.37154657139842
],
[
-9.58968004262038,
60.95291574936029
],
[
-9.14114620423424,
60.13657994296869
],
[
-9.14114620423424,
60.13657994296869
],
[
-4.608275541477875,
61.41782409851035
],
[
0.04370528595749003,
61.85256707412143
],
[
4.697756453834344,
61.440535105776746
],
[
9.236826731080514,
60.18143161578213
],
[
9.634531715433956,
60.94394427411406
],
[
9.634531715433956,
60.94394427411406
],
[
10.651205754181227,
61.55694185070587
],
[
12.014755923249211,
64.90599983384534
],
[
12.594861892883253,
66.73303249776492
],
[
12.843051795496526,
67.24137236884712
],
[
12.843051795496526,
67.24137236884712
],
[
13.470404873165572,
68.10570813434327
],
[
14.392915494040242,
68.51092451914111
],
[
16.267309334338545,
67.80347835381698
],
[
16.392453714408873,
67.63309446856408
],
[
16.712478156580296,
66.59177596412158
],
[
16.440299681249144,
65.53694036092938
],
[
16.180149712780135,
64.9986974734991
],
[
16.180149712780135,
64.9986974734991
],
[
15.109646822556089,
63.41088323694667
],
[
13.315505765594258,
60.25020912372438
],
[
13.518843995393977,
59.05411698688884
],
[
13.186927928373212,
58.24974124635304
],
[
16.998681334791385,
55.478405204460664
],
[
20.222572124191764,
52.091733184926845
],
[
22.78655473057989,
48.18083157400843
],
[
24.618589291378605,
43.83681816479638
],
[
25.46781100131068,
43.98633324653653
],
[
25.46781100131068,
43.98633324653653
],
[
26.583171267765383,
43.573679605717764
],
[
30.057824200933453,
44.590359347882234
],
[
31.845982373258824,
45.27811161363543
],
[
32.36029942556033,
45.38875220378148
],
[
32.39917391715455,
45.38875220378148
],
[
32.39917391715455,
45.38875220378148
],
[
33.46608365454636,
45.437236953347536
],
[
34.358103807102054,
44.968701230862074
],
[
34.91430675527615,
44.12855365768571
],
[
34.97379339660941,
43.06219715176162
],
[
34.913958846827356,
42.844064257760614
],
[
34.28972553836342,
41.946580231533176
],
[
33.287275822097925,
41.5104171050407
],
[
32.707169852463785,
41.372867792573494
],
[
32.707169852463785,
41.372867792573494
],
[
30.79341673010979,
41.22335271083331
],
[
27.223083270095493,
40.63428096937031
],
[
26.361895790890525,
39.77309349016526
],
[
25.55453145974511,
39.53387506279818
],
[
25.55453145974511,
39.53387506279818
],
[
25.766601621268805,
34.82487147025736
],
[
25.129050833656983,
30.192795568828938
],
[
23.668126222836204,
25.751142508964527
],
[
21.410069211315992,
21.61340744111573
],
[
22.11576442756147,
20.961535372929777
],
[
22.11576442756147,
20.961535372929777
],
[
22.486549282759302,
19.831226450009634
],
[
25.446879460208716,
17.75002385054896
],
[
27.09748832006682,
16.784178665834418
],
[
27.534062092597303,
16.431331057711628
],
[
27.534062092597303,
16.431331057711628
],
[
28.479973834218885,
14.665236554801158
],
[
28.198555823033498,
13.697754489351949
],
[
27.423444316119998,
12.963008917628864
],
[
27.136362811661037,
12.837071762568605
],
[
26.02624968902474,
12.777268581581119
],
[
25.05516306390892,
13.318500059621057
],
[
24.612606406742078,
13.67134766774382
],
[
24.612606406742078,
13.67134766774382
],
[
23.30587367976053,
15.06180655913298
],
[
20.695402519824324,
17.52276834074621
],
[
19.487344613715795,
17.654337620285542
],
[
18.730820543437513,
18.19258050771583
],
[
18.730820543437513,
18.19258050771583
],
[
15.189352077842008,
15.094883527149458
],
[
11.181977165087368,
12.698025303087958
],
[
6.811283170241874,
11.052463967446453
],
[
2.1798802720422907,
10.208656226285797
],
[
2.135022895811664,
9.320557173051004
],
[
1.4831508276257466,
8.327800414306662
],
[
1.7104091891370812,
4.718588185135307
],
[
1.9855135174886707,
2.825770881446082
],
[
1.9855135174886707,
2.227724813028326
],
[
1.9855135174886707,
2.227724813028326
],
[
1.4603542691014244,
0.7210202982457582
],
[
0.026908722321194466,
0.0149515081740186
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1107,
"versionNonce": 1757290047,
"isDeleted": false,
"id": "0zj6xQuydJV84vNPw3a0y",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 314.2267921933967,
"y": -216.52528173709106,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 11.99681582446548,
"height": 11.951961299943425,
"seed": 1656095377,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
-0.598046068417764,
10.444884637188963
],
[
-0.6429005929397977,
10.444884637189041
],
[
-0.6429005929397977,
10.444884637189041
],
[
-1.635657351684161,
11.95196129994343
],
[
-3.4297984086460485,
11.790489004056063
],
[
-11.99681582446549,
5.720316419125781
],
[
-11.99681582446549,
5.720316419125781
],
[
-7.434318761095046,
2.340488500224822
],
[
-2.120077091054865,
0.3408846905583963
],
[
-0.005980032927881736,
9.941700240823081e-15
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1105,
"versionNonce": 1425931871,
"isDeleted": false,
"id": "BDoCa--PCN_pGPu0n0vxp",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 319.34931079417174,
"y": -216.7677382571792,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 11.93102975884153,
"height": 11.999804415075133,
"seed": 182028401,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
6.437595275692294,
1.8965544678055735
],
[
11.931029758841582,
5.753208026083467
],
[
3.4447499168200473,
11.784508971128222
],
[
3.4447499168200473,
11.784508971128222
],
[
1.596785711798569,
11.999804415075136
],
[
0.8701589544511403,
11.359895264453584
],
[
0.5920660354898679,
10.432921719624602
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1109,
"versionNonce": 1250744959,
"isDeleted": false,
"id": "aM2pb5buDydJO5vIZU7Xh",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 299.2709047804233,
"y": -207.02849463627263,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 11.300092083466069,
"height": 12.977612517354048,
"seed": 1414615633,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
7.8344106255441055,
6.991163245122797
],
[
7.8344106255441455,
7.03601776964485
],
[
7.8344106255441455,
7.03601776964485
],
[
8.390593611758083,
8.752412695127
],
[
7.143666917472586,
10.053165389180608
],
[
7.143666917472592,
10.083062702111473
],
[
-2.909498471708001,
12.974621075035827
],
[
-2.909498471708001,
12.974621075035827
],
[
-2.534264951098859,
6.243208559178456
],
[
0.0029885906096372024,
-0.002991442318245268
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1107,
"versionNonce": 1043018399,
"isDeleted": false,
"id": "ZMKPKTRRnwiHqgBmqk9Ku",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 334.25551510026025,
"y": -207.02430181169802,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 11.315043591640089,
"height": 12.938735174051288,
"seed": 334815281,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
2.5544065689194433,
6.224917700237365
],
[
2.996216078433857,
12.938735174051327
],
[
-7.071900818920772,
10.038211029298026
],
[
-7.071900818920771,
9.99933653770387
],
[
-7.071900818920771,
9.99933653770387
],
[
-8.318827513206253,
8.69858669535882
],
[
-7.7626416752837,
6.9821946215852595
],
[
0.011960065855774405,
0.023920131711560263
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1106,
"versionNonce": 948537023,
"isDeleted": false,
"id": "nxsrvolaIiv2iExwpG_vq",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 315.10606373478595,
"y": -199.58286886808946,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 7.1556269833283865,
"height": 6.982197473293844,
"seed": 397128209,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
3.2055314894529396,
-1.1102230246251565e-15
],
[
5.164130581203231,
2.487876207351637
],
[
4.452458183738401,
5.597715763123981
],
[
1.5728627283784298,
6.98219747329385
],
[
-1.312712759909417,
5.597715763123977
],
[
-1.9914964021251595,
2.4878762073516323
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1108,
"versionNonce": 1481135839,
"isDeleted": false,
"id": "Paw3M3HwuulNv623fueDx",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 325.3745245679115,
"y": -191.0965890260677,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 12.304808908066201,
"height": 12.19417402133738,
"seed": 74270705,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
0.4036821655727135,
2.7755575615628914e-15
],
[
10.770817819573345,
1.7492893841484127
],
[
10.770817819573345,
1.7492893841484127
],
[
9.385126984958402,
4.851794345409312
],
[
7.505486000841536,
7.663596132293022
],
[
5.18403550721024,
10.129462852693091
],
[
2.472921847469034,
12.1941740213374
],
[
-1.5339910884928634,
2.49385909198812
],
[
-1.5339910884928634,
2.49385909198812
],
[
-1.4077573557385041,
0.8748471633845953
],
[
-0.011960065855776133,
0.044857376230654375
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1106,
"versionNonce": 335028991,
"isDeleted": false,
"id": "sEZR59QTYvH1q70VhVpuN",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 308.1107476911061,
"y": -190.8484195689607,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 12.230054218904701,
"height": 12.107453562902904,
"seed": 1950425553,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
1.4472734817670032,
0.801381446508931
],
[
1.5878142365524563,
2.446007421730604
],
[
1.587814236552457,
2.4848819133247853
],
[
-2.395178567697883,
12.107453562902913
],
[
-2.395178567697883,
12.107453562902913
],
[
-7.370925278983947,
7.620609476901985
],
[
-10.642239982352251,
1.7702152218331175
],
[
-0.3648076739785433,
0.026908722321190404
],
[
-0.3648076739785433,
0.026908722321190404
],
[
-0.017942950492249525,
0.026908722321187968
],
[
0,
0
]
]
},
{
"type": "line",
"version": 1110,
"versionNonce": 1008298783,
"isDeleted": false,
"id": "2SpVvudZ8y4_Re0DhpGuH",
"fillStyle": "cross-hatch",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 316.75014343286284,
"y": -186.8614219006986,
"strokeColor": "#326ce5",
"backgroundColor": "#326ce5",
"width": 13.261688320951794,
"height": 11.151697723204514,
"seed": 1413398449,
"groupIds": [
"yCr05koDdbRalXjQDOhWf"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
0,
0
],
[
0.9333756306292258,
0.23297888895687952
],
[
1.6057571870447254,
0.9209935119010776
],
[
1.6446316786388921,
0.9209935119010871
],
[
6.710087438969065,
10.062134012718186
],
[
4.685699429886235,
10.660182932844489
],
[
4.685699429886235,
10.660182932844489
],
[
-0.9721987914686103,
11.151697723204538
],
[
-6.5516008819827345,
10.080076963210427
],
[
-1.4682021711602933,
0.9389307589761464
],
[
-1.4682021711602933,
0.9389307589761464
],
[
0.026914425738386212,
0.05681173866922885
],
[
0,
0
]
]
},
{
"type": "rectangle",
"version": 747,
"versionNonce": 1025290047,
"isDeleted": false,
"id": "ovJ_8JRWUYtl5SwIsoTD6",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 692.0446732665741,
"y": -115.22070696823084,
"strokeColor": "#1e1e1e",
"backgroundColor": "#b2f2bb",
"width": 304.9999999999999,
"height": 257.9999999999999,
"seed": 42836369,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"id": "Bvu5NEGthDTE0Lox0pKMY",
"type": "arrow"
},
{
"id": "6KxS52QdlYIpoAD1U0DXi",
"type": "arrow"
}
],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "rectangle",
"version": 267,
"versionNonce": 518480799,
"isDeleted": false,
"id": "gO4o6gRc5z57hSlRJcNHT",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 564.7363621104851,
"y": 276.1118915651209,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 189,
"height": 116,
"seed": 744834929,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"type": "text",
"id": "b0yoow8nriD3ymO5GaMiK"
},
{
"id": "tJR6pa6ndvgR0PAy_y0T6",
"type": "arrow"
},
{
"id": "QKW8LI503Bc2mGvHDoU9l",
"type": "arrow"
}
],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "text",
"version": 294,
"versionNonce": 758987192,
"isDeleted": false,
"id": "b0yoow8nriD3ymO5GaMiK",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 595.203029285778,
"y": 299.1118915651209,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 128.06666564941406,
"height": 70,
"seed": 1812803921,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500141084,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "Core \nPackages",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "gO4o6gRc5z57hSlRJcNHT",
"originalText": "Core Packages",
"lineHeight": 1.25,
"baseline": 60
},
{
"type": "rectangle",
"version": 96,
"versionNonce": 414522399,
"isDeleted": false,
"id": "-TheK_iiszzs08UFHds1X",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 534.7363621104846,
"y": 631.1118915651214,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 275.0000000000001,
"height": 121,
"seed": 652009265,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"type": "text",
"id": "BEuOD-IEnvFbbjGNWOgDJ"
},
{
"id": "14YqOkt6L4M1dDmR0ETLV",
"type": "arrow"
},
{
"id": "tJR6pa6ndvgR0PAy_y0T6",
"type": "arrow"
},
{
"id": "Bvu5NEGthDTE0Lox0pKMY",
"type": "arrow"
},
{
"id": "nHmMkx97YgjINcsVC4VlS",
"type": "arrow"
},
{
"id": "4AOkOmojUQrdiA36lQ8DU",
"type": "arrow"
}
],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "text",
"version": 110,
"versionNonce": 1293566015,
"isDeleted": false,
"id": "BEuOD-IEnvFbbjGNWOgDJ",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 546.3696934093127,
"y": 674.1118915651214,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 251.73333740234375,
"height": 35,
"seed": 725340433,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "IDPBUILDER CLI",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "-TheK_iiszzs08UFHds1X",
"originalText": "IDPBUILDER CLI",
"lineHeight": 1.25,
"baseline": 25
},
{
"type": "arrow",
"version": 249,
"versionNonce": 1259703281,
"isDeleted": false,
"id": "14YqOkt6L4M1dDmR0ETLV",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 549.7363621104851,
"y": 626.1118915651214,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 168,
"height": 419,
"seed": 245466865,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "iCi0zfwHPwogLyCB1WOxr"
}
],
"updated": 1702423269709,
"link": null,
"locked": false,
"startBinding": {
"elementId": "-TheK_iiszzs08UFHds1X",
"focus": -0.2645777715329469,
"gap": 5
},
"endBinding": {
"elementId": "rn5VxKirQVQTGadXpV6do",
"focus": 0.14877182187672447,
"gap": 9.850573386867609
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
-168,
-159
],
[
-53.026868283065824,
-419
]
]
},
{
"type": "text",
"version": 47,
"versionNonce": 52195519,
"isDeleted": false,
"id": "iCi0zfwHPwogLyCB1WOxr",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1331.7446934093132,
"y": 446.11189156512137,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 165.98333740234375,
"height": 70,
"seed": 1268089041,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423259436,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "1. Craete\nKind Cluster",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "14YqOkt6L4M1dDmR0ETLV",
"originalText": "1. Craete\nKind Cluster",
"lineHeight": 1.25,
"baseline": 60
},
{
"type": "arrow",
"version": 296,
"versionNonce": 2024145841,
"isDeleted": false,
"id": "tJR6pa6ndvgR0PAy_y0T6",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 662.3990797216493,
"y": 627.1118915651214,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 9.749588133858879,
"height": 228,
"seed": 531578545,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "mcDZHNEZRhnaca9qy1QuG"
}
],
"updated": 1702423269709,
"link": null,
"locked": false,
"startBinding": {
"elementId": "-TheK_iiszzs08UFHds1X",
"focus": -0.08991115524671474,
"gap": 4
},
"endBinding": {
"elementId": "gO4o6gRc5z57hSlRJcNHT",
"focus": -0.16180416542442702,
"gap": 7.000000000000455
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
9.749588133858879,
-228
]
]
},
{
"type": "text",
"version": 25,
"versionNonce": 777321311,
"isDeleted": false,
"id": "mcDZHNEZRhnaca9qy1QuG",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1633.0822081391648,
"y": 509.61189156512137,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 134.38333129882812,
"height": 35,
"seed": 697712785,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423259438,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "2. Install",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "tJR6pa6ndvgR0PAy_y0T6",
"originalText": "2. Install",
"lineHeight": 1.25,
"baseline": 25
},
{
"type": "arrow",
"version": 337,
"versionNonce": 181111665,
"isDeleted": false,
"id": "QKW8LI503Bc2mGvHDoU9l",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 664.3720761060194,
"y": 270.1118915651209,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 3.197125404118765,
"height": 71.85057338686784,
"seed": 1191315057,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1702423269709,
"link": null,
"locked": false,
"startBinding": {
"elementId": "gO4o6gRc5z57hSlRJcNHT",
"focus": 0.08223574565392806,
"gap": 6
},
"endBinding": {
"elementId": "rn5VxKirQVQTGadXpV6do",
"focus": 0.015630487251397887,
"gap": 1
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
-3.197125404118765,
-71.85057338686784
]
]
},
{
"type": "arrow",
"version": 832,
"versionNonce": 193078065,
"isDeleted": false,
"id": "Bvu5NEGthDTE0Lox0pKMY",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 810.7363621104851,
"y": 676.1118915651214,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 90,
"height": 525.9999999999991,
"seed": 851054673,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "ZsF0PE77YsQf6RTxSi4T7"
}
],
"updated": 1702423269709,
"link": null,
"locked": false,
"startBinding": {
"elementId": "-TheK_iiszzs08UFHds1X",
"focus": 0.8084116201763285,
"gap": 1.000000000000398
},
"endBinding": {
"elementId": "ovJ_8JRWUYtl5SwIsoTD6",
"focus": 0.0439116734429434,
"gap": 7.332598533353234
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
90,
-212
],
[
45.5918098316173,
-525.9999999999991
]
]
},
{
"type": "text",
"version": 100,
"versionNonce": 972830591,
"isDeleted": false,
"id": "ZsF0PE77YsQf6RTxSi4T7",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1782.6363560069694,
"y": 408.11189156512137,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 302.20001220703125,
"height": 140,
"seed": 1653988913,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423259439,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "3. Create \nRepositories and hand\nover control to \nArgoCD",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "Bvu5NEGthDTE0Lox0pKMY",
"originalText": "3. Create Repositories and hand over control to ArgoCD",
"lineHeight": 1.25,
"baseline": 130
},
{
"type": "text",
"version": 247,
"versionNonce": 343496,
"isDeleted": false,
"id": "n4KQJWFb5VyJNlsy8wI_H",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 795.7363621104851,
"y": -34.88810843487863,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 164.06666564941406,
"height": 150,
"seed": 628944913,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500158953,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Git Repositories:\n- ArgoCD\n- Ingress-nginx\n- Gitea\n- Backstage\n- Crossplane",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Git Repositories:\n- ArgoCD\n- Ingress-nginx\n- Gitea\n- Backstage\n- Crossplane",
"lineHeight": 1.25,
"baseline": 143
},
{
"type": "text",
"version": 198,
"versionNonce": 1548509880,
"isDeleted": false,
"id": "J6fygoVPW4s-Zz324ipKh",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 346.73636211048506,
"y": -75.88810843487863,
"strokeColor": "#f08c00",
"backgroundColor": "transparent",
"width": 142.3000030517578,
"height": 150,
"seed": 23512561,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500158953,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "ArgoCD Apps:\n- ArgoCD\n- Ingress-nginx\n- Gitea\n- Backstage\n- Crossplane",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "ArgoCD Apps:\n- ArgoCD\n- Ingress-nginx\n- Gitea\n- Backstage\n- Crossplane",
"lineHeight": 1.25,
"baseline": 143
},
{
"type": "rectangle",
"version": 179,
"versionNonce": 2047916479,
"isDeleted": false,
"id": "axsfnFtRU5tBoleN1koKQ",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 322.73636211048506,
"y": -149.88810843487863,
"strokeColor": "#f08c00",
"backgroundColor": "transparent",
"width": 184.00000000000003,
"height": 253,
"seed": 1364910033,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"id": "6KxS52QdlYIpoAD1U0DXi",
"type": "arrow"
}
],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "text",
"version": 106,
"versionNonce": 1838061055,
"isDeleted": false,
"id": "JX7B2x-Lgx3YrqjriOdqF",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 713.7363621104851,
"y": -107.88810843487863,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"width": 100.33333587646484,
"height": 45,
"seed": 594591153,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false,
"fontSize": 36,
"fontFamily": 1,
"text": "Gitea",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Gitea",
"lineHeight": 1.25,
"baseline": 32
},
{
"type": "arrow",
"version": 174,
"versionNonce": 902154993,
"isDeleted": false,
"id": "6KxS52QdlYIpoAD1U0DXi",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 510.7363621104846,
"y": -42.88810843487863,
"strokeColor": "#f08c00",
"backgroundColor": "transparent",
"width": 176,
"height": 8,
"seed": 1456463761,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [],
"updated": 1702423269710,
"link": null,
"locked": false,
"startBinding": {
"elementId": "axsfnFtRU5tBoleN1koKQ",
"focus": -0.18260869565217372,
"gap": 3.9999999999995453
},
"endBinding": {
"elementId": "ovJ_8JRWUYtl5SwIsoTD6",
"focus": 0.3052581578699753,
"gap": 5.308311156089587
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
176,
8
]
]
},
{
"type": "text",
"version": 87,
"versionNonce": 657081544,
"isDeleted": false,
"id": "F-QKzwRSJ7Pb6RMm1vBsC",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 560.7363621104851,
"y": -74.88810843487863,
"strokeColor": "#f08c00",
"backgroundColor": "transparent",
"width": 66.69999694824219,
"height": 25,
"seed": 2041562481,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500158954,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "GitOps",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "GitOps",
"lineHeight": 1.25,
"baseline": 18
},
{
"type": "rectangle",
"version": 399,
"versionNonce": 1762247263,
"isDeleted": false,
"id": "a1YtLmme14ISmpN-GNiiT",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 32.23636211048506,
"y": 216.1118915651209,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 240,
"height": 126.00000000000014,
"seed": 1733816145,
"groupIds": [
"3NGajuyekE1K_G5zxIRhq"
],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "text",
"version": 263,
"versionNonce": 268271288,
"isDeleted": false,
"id": "Ph6f2fAmMNTsoBkG0jrmd",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 45.73636211048506,
"y": 229.1118915651209,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"width": 149.8000030517578,
"height": 100,
"seed": 639622449,
"groupIds": [
"3NGajuyekE1K_G5zxIRhq"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500151458,
"link": null,
"locked": false,
"fontSize": 20,
"fontFamily": 1,
"text": "Core Packages:\n- ArgoCD\n- Gitea\n- Ingress-nginx",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Core Packages:\n- ArgoCD\n- Gitea\n- Ingress-nginx",
"lineHeight": 1.25,
"baseline": 93
},
{
"type": "arrow",
"version": 381,
"versionNonce": 898794161,
"isDeleted": false,
"id": "nHmMkx97YgjINcsVC4VlS",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 820.0363651622429,
"y": 721.0370993829702,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 364,
"height": 609,
"seed": 91164433,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "lvC-UeX1cG3atJnWyQWAR"
}
],
"updated": 1702423269710,
"link": null,
"locked": false,
"startBinding": {
"elementId": "-TheK_iiszzs08UFHds1X",
"focus": 0.8139142814386041,
"gap": 10.30000305175821
},
"endBinding": {
"elementId": "rn5VxKirQVQTGadXpV6do",
"focus": -0.7932071699015981,
"gap": 18.798660584633126
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
364,
-201
],
[
224,
-609
]
]
},
{
"type": "text",
"version": 109,
"versionNonce": 1849081503,
"isDeleted": false,
"id": "lvC-UeX1cG3atJnWyQWAR",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 2105.81969798695,
"y": 499.03709938297015,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 222.43333435058594,
"height": 70,
"seed": 2075985137,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423259436,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "5. Sync Custom \nPackages",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "nHmMkx97YgjINcsVC4VlS",
"originalText": "5. Sync Custom Packages",
"lineHeight": 1.25,
"baseline": 60
},
{
"type": "rectangle",
"version": 209,
"versionNonce": 628869823,
"isDeleted": false,
"id": "K1xk0WFzyBRPJQ1A3rvF9",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1092.763637889515,
"y": 639.2189175647882,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"width": 321.00000000000017,
"height": 207.99999999999994,
"seed": 1150369489,
"groupIds": [
"fqu4sqeMOTfqdQqVK5MTz"
],
"frameId": null,
"roundness": {
"type": 3
},
"boundElements": [
{
"id": "4AOkOmojUQrdiA36lQ8DU",
"type": "arrow"
}
],
"updated": 1702423269501,
"link": null,
"locked": false
},
{
"type": "text",
"version": 212,
"versionNonce": 1797213112,
"isDeleted": false,
"id": "B1TLthmjZljTpu4TvrlaW",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1113.763637889515,
"y": 653.2189175647882,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"width": 212.23333740234375,
"height": 35,
"seed": 1048788145,
"groupIds": [
"fqu4sqeMOTfqdQqVK5MTz"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500158954,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "Local Directory",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "Local Directory",
"lineHeight": 1.25,
"baseline": 25
},
{
"type": "text",
"version": 239,
"versionNonce": 1377201096,
"isDeleted": false,
"id": "IF1D9aqYp7FoVsn6gx45t",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1124.763637889515,
"y": 715.2189175647882,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"width": 238.06666564941406,
"height": 105,
"seed": 154828433,
"groupIds": [
"fqu4sqeMOTfqdQqVK5MTz"
],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702500158954,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "contents:\n- argocd-app.yaml\n- manifest files",
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "contents:\n- argocd-app.yaml\n- manifest files",
"lineHeight": 1.25,
"baseline": 95
},
{
"type": "arrow",
"version": 313,
"versionNonce": 1743014513,
"isDeleted": false,
"id": "4AOkOmojUQrdiA36lQ8DU",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 815.0363651622429,
"y": 674.3529600675256,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 262.7272727272725,
"height": 61.65717237957415,
"seed": 1668187249,
"groupIds": [],
"frameId": null,
"roundness": {
"type": 2
},
"boundElements": [
{
"type": "text",
"id": "Lza-c0b-WjRNgd-m1X43U"
}
],
"updated": 1702423269710,
"link": null,
"locked": false,
"startBinding": {
"elementId": "-TheK_iiszzs08UFHds1X",
"focus": -0.547290541551879,
"gap": 5.30000305175821
},
"endBinding": {
"elementId": "K1xk0WFzyBRPJQ1A3rvF9",
"focus": -0.2398436923984328,
"gap": 14.999999999999432
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
262.7272727272725,
61.65717237957415
]
]
},
{
"type": "text",
"version": 18,
"versionNonce": 564588447,
"isDeleted": false,
"id": "Lza-c0b-WjRNgd-m1X43U",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 2,
"opacity": 100,
"angle": 0,
"x": 1925.1500015258791,
"y": 701.6815462573127,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"width": 108.5,
"height": 35,
"seed": 1223085649,
"groupIds": [],
"frameId": null,
"roundness": null,
"boundElements": [],
"updated": 1702423259439,
"link": null,
"locked": false,
"fontSize": 28,
"fontFamily": 1,
"text": "4. Read",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "4AOkOmojUQrdiA36lQ8DU",
"originalText": "4. Read",
"lineHeight": 1.25,
"baseline": 25
}
],
"appState": {
"gridSize": null,
"viewBackgroundColor": "#ffffff"
},
"files": {}
}
================================================
FILE: docs/minimum-requirements.md
================================================
# Minimum Requirements
The requirements for your cluster will depend on what it is running but we
recommend a minimum of 4 CPU cores and 4GiB of RAM.
================================================
FILE: docs/pluggable-packages.md
================================================
# Pluggable and configurable packaging proposal
## Background
`idpbuilder` is a tool that aims to:
- Allow developers to stand up a Kubernetes cluster with components that make up a Internal Developer Platform (IDP).
- Allow for tests to run against IDPs in Continuous Integration systems.
- Standup a working IDP for demo purposes.
It also aims to achieve the above goals while having a single dependency, Docker, at run time.
When implementing IDPs using open source projects, there is no one set of projects that fit the needs of all organizations because:
1. No organization went through the same path to reach the point of needing a IDP.
1. Past technology choices were made for specific needs of each organization. This results in organizationally unique technology inertia that may not be correctable in the near future.
1. No industry consensus and standards for choosing specific IDP components.
To fit the needs from different organizations, idpbuilder needs to be flexible in the what and how it can deploy different packages. Currently idpbuilder uses ArgoCD to install a [set of application](https://github.com/cnoe-io/idpbuilder/blob/56089e4ae3b27cf90641bfbff2a96c36dd5263e1/pkg/apps/resources.go#L20-L32), and they cannot be changed without modifying the source code.
In addition, the git server uses Go's embed capability to serve contents to ArgoCD. Because of this, to update package configurations in idpbuilder, it requires compiling the Go application. For Go developers this approach is straightforward to work with. For non-Go developers, this approach may be frustrating when needing to debug errors from an unfamiliar language while compiling the program.
## Goals
The proposal in this document should:
1. Make the packages installed by `idpbuilder` configurable.
1. Minimize the number of runtime dependencies necessary.
1. Define an easy way to declare the packages to be installed.
1. Allow for fast local development feedback loop.
## Proposal
This document proposes the following:
- Make ArgoCD a hard requirement for now.
- Define packages as Argo CD Applications (Helm, Kustomize, and raw manifests)
- Use a more configurable Git server, Gitea.
- Imperative pipelines for configuring packages are handled with ArgoCD resource hooks.
In this implementation, we will make ArgoCD the technology of choice. However, we will strive to maintain separation between packages and specific CD technologies (Argo) to allow for future CD plug-ability.

### Essential Packages
For `idpbuilder` to make the cluster ready to be used for non-essential packages, it must install:
1. In-cluster git server
2. ArgoCD
3. Ingress for git server and ArgoCD
Once they are installed and ready, the manifests used should be pushed to an in-cluster git repository.
The packages then can be managed by ArgoCD from that point.
This allows for end users to make changes to them through GitOps by either using the Git UI or locally through Git pull / push.
### ArgoCD
Currently, ArgoCD is a base requirement for both the AWS reference implementation and idpbuilder but not yet officially made a hard requirement. ArgoCD is the CD of choice for CNOE members and it should be the focus over other GitOps solutions.
Packages then become the formats that ArgoCD supports natively: Helm charts, Kustomize, and raw manifests.
#### Support for imperative pipelines
Regardless of how applications are delivered declaratively, custom scripts are often needed before, during, and after application syncing to ensure applications reach the desired state. idpbuilder needs to provide a way to run custom scripts in a defined order.
We could define a spec to support such cases, but considering the main use cases of idpbuilder center around everything being local, it doesn't require overly complex tasks. For example, in the reference implementation for AWS, the majority of scripting are done to manage authentication mechanisms. Another task that the scripts do is domain name configuration for each package such as setting the `baseUrl` field in the Backstage configuration file. In local environments, tasks like these are likely unnecessary because authentication is not necessary and domain names are predictable.
ArgoCD supports resource hooks which allow users to define tasks to be run during application syncing. While there are some limitations to what it can do, for the majority of simple tasks resource hooks should suffice.
### The in-cluster git server
The primary purpose of the in-cluster git server is to sync local files to it, then make them available for ArgoCD to use.
As documented in [this issue](https://github.com/cnoe-io/idpbuilder/issues/32), using `gitea` offers more configurable and user friendly experience. In short, using it enables:
- Git UI and ssh access for end users.
- More configurable git server.
- Include the source control system as a core component for a developer platform.
- Move the outdated git dependency to a more modern and actively supported dependency.
`gittea` offers installation into Kubernetes cluster using a helm chart. It should be leveraged to install it to the local cluster. The ideal way to install this would be to use ArgoCD. However, ArgoCD requires a Git server to read Helm values from. It is possible to host the values file on a public repository, but the idpbuilder core components should avoid depending on external systems. In secured environments, it may be impossible for ArgoCD to reach the public repository.
It should follow the same pattern of installing ArgoCD by embedding them in the application binary. The manifests should be rendered at build time by using the `helm template` command with values checked into the repository.
In case the embedded configuration does not work for some reason, we should provide a flag, `--git-manifest-file`. When used, it specifies a single file that contains manifests necessary to configure a git server.
It is important to note that the file contains raw manifests that will be applied as-is, not helm values. Supporting manifest rendering mechanisms come with a cost of needing to include and maintain libraries and light logic to render these manifests. One of the goals of this proposal is to minimize dependencies.
It's also difficult to ensure rendered manifests are what users intended to use. Users may have different versions of helm from our version. This may cause slight differences in manifests due to a bug or a feature differences.
Users are expected to run the `helm template` command to generate manifests.
### Runtime Git server content generation
As mentioned earlier, Git server contents are generated at compile time and cannot be changed at run time.
To solve this, Git content should be created at run time by introducing a new flag, `--package`, to idpbuilder. This flag takes a directory that contains ArgoCD Applications.
If this flag is not specified, use the embedded FS to provide the "default experience" where it uses the manifests provided at compile time to bootstrap and add predetermined packages to the cluster.
Because Helm and Kustomize can reference remote repositories, this approach introduces a use case where secrets must be passed to the cluster from local machine. Kubernetes resource YAML files are often stored on a private Git server and require credentials to access. For ArgoCD to access the Git server, the credentials must be passed to ArgoCD as Kubernetes Secrets.
To accomplish this, idpbuilder will provide a flag to pass secrets and other ArgoCD configuration options. `--argocd-config` flag should point to a directory with manifests for configuring ArgoCD, ConfigMaps and Secrets. These manifests will be applied after ArgoCD is deployed and ready. An example directory contents are shown below.
```yaml
# --argocd-config ./configs
apiVersion: v1
kind: Secret
metadata:
name: argo-helm
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
name: argo
url: https://argoproj.github.io/argo-helm
type: helm
username: my-username
password: my-password
---
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
data:
url: https://argo-cd-demo.argoproj.io
```
#### Local file handling
To allow for faster feedback loop when developing Kubernetes applications and manifests, idpbuilder should support pushing local files to the in-cluster git repository if sources are specified using `files://`.
Given the following application:
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
sources:
- path: argo-workflows
repoURL: "files://test-package"
targetRevision: HEAD
```
idpbuilder must:
* Take and validate all manifests under the `test-package` directory.
* Create a new repository in the in-cluster git server.
* Push the files to the repository.
* Replace `files://` with `https://git-server.git.svc.cluster.local`
## Future improvements
- Extend support for using different tools for CD and imperative workflows. For example, we may consider supporting Tekton or Flagger for running imperative workflows.
- Extend support for other GitOps solutions such as Flux CD.
- Add support for authentication. As use cases grow, it will be necessary to support authentication mechanisms. Example use cases: GitHub credentials for ArgoCD, AWS credentials to pull images from a ECR registry.
- Add support for capturing Kubernetes job outputs that were launched by ArgoCD Resource Hooks. Stdout and stderr are not saved for completed jobs by default. This will help debug problems when running imperative commands in Kubernetes Jobs.
- Support for ArgoCD App of Apps. An App of Apps is an ArgoCD application that contains other ArgoCD applications. Support for this would require:
- Rendering Helm charts and Kustomize.
- Sync repository contents, then parse and replace URLs as described above.
## Alternatives Considered
#### Use OCI images as applications
Projects such as Sealer and Kapp aim to use OCI images as the artifact to define and deploy multiple Kubernetes resources. This has a few advantages.
- Immutable single artifact that can be used to deploy to different clusters.
- Simplicity. Application dependencies and supporting resources are defined and confined in the image.
- Can use standard Kubernetes YAML files, Helm Charts, and Kustomize.
- Native support for signing and verification through industry standard tools like cosign.
In addition, both tools support applying changes in particular order. For example, you can run a Kubernetes Job to migrate database schema before rolling out a new image.
Since many of the goals are covered by both projects, it is possible to incorporate some of their tools and libraries to implement our goals.
While this approach addresses most of our goals, there are drawbacks.
Firstly, it introduces a new layer for end users to debug. For end users to debug an issue related to Kubernetes manifest rendering, they now need to:
1. Figure out which OCI image contains the package with the problem. The problem may reside in one of dependent OCI images.
2. Extract the contents of the OCI image. Determine which one file is responsible for the issue.
3. Correct the issue.
4. Publish a new image.
Secondly, these tools and using OCI images as packages are not well adopted by CNOE members as evidenced by the tech radar. idpbuilder should be useful and relevant to CNOE members.
#### Define specs for imperative work
To support use cases where more complex steps are needed to orchestrate different services in to the cluster, idpbuilder could define a configuration spec where end users can define their own steps. For example, a spec may look something like the following.
```yaml
apiVersion: idpbuilder.cnoe.io/v1alpha1
kind: Config
metadata:
name: test
spec:
packages:
- name: crossplane
preCreation:
- name: job1
secretRef:
name: job1
path: ./secret1
type: helm
chart:
values: ./values.yaml
url: "https://somewhere.cnoe.io/charts"
spec:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
postCreation:
...
```
This introduces a few problems.
1. Complexity.
This introduces a completely new mechanisms to manage applications. Current idpbuilder design is very simple with no concept of pipelining. It allows end users to define manifests at compile time, and apply them as Argo CD applications. Introducing this feature and maintaining it may involve significant time commitment.
2. Yet another configuration format.
With the explosion of Kubernetes based projects, a large number of configuration formats were created. Developers and operators are already needing to write and manage configuration files that look similar but slightly different.
3. No clear needs for task orchestration capabilities.
We have so far not had a request for this capability with concrete needs and investing time and effort to implement and maintain this feature doesn't work.
#### Git Repository Mirroring
Another approach is to mirror contents from repositories using credentials from local machine, then push them to the in-cluster git server. This does not require credentials to be replicated to the cluster. A few consideration for this approach:
1. Kustomize references to private remotes.
kustomize can reference remote repositories:
```yaml
# kustomization.yaml
resources:
- https://github.com/kubernetes-sigs/kustomize//examples/multibases?timeout=120&ref=v3.3.1
namePrefix: remote-
```
In this example, to ensure the local git server has everything ArgoCD needs, idpbuilder must:
* Pull manifests from `github.com/kubernetes-sigs/kustomize`
* Create a new repository in in-cluster git server.
* Push contents to the in-cluster repository.
* Replace `github.com` with `git-server.git.svc.cluster.local`
2. Helm subcharts from private repositories.
Helm subcharts may look like
```
# Chart.yaml
dependencies:
- name: nginx
version: "1.2.3"
repository: "https://example.com/charts"
```
In this example, idpbuilder must:
* Pull `chart.tgz` for the nginx chart.
* Push it to a in-cluster http server.
* Replace `example.com` with `http-endpoint.git.svc.cluster.local`
Given the complexity involved with this approach, the first iteration should focus on passing secrets to ArgoCD. When concrete use cases arise, approaches similar to this should be considered.
###### ArgoCD Application handling
Consider a case where idpbuilder is given the flag `--package ./packages`, and the `packages` directory contains a yaml file for a ArgoCD application.
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
sources:
- chart: argo-workflows
repoURL: https://argoproj.github.io/argo-helm
targetRevision: 0.31.0
helm:
releaseName: argo-workflows
valueFiles:
- $values/packages/argo-workflows/dev/values.yaml
- repoURL: https://github.com/cnoe-io/argo-helm
targetRevision: HEAD
ref: values
```
In the above file, it instructs ArgoCD to use the charts from `argoproj.github.io/argo-helm` and use values stored at `https://github.com/cnoe-io/argo-helm/packages/argo-workflows/dev/values.yaml`
In this case, idpbuilder must:
* Replace `argoproj.github.io` with `http-endpoint.git.svc.cluster.local`.
* Replace `github.com` with `git-server.git.svc.cluster.local`.
================================================
FILE: docs/private-registries.md
================================================
# Private registry authentication
idpbuilder can be configured to use private registry authentication from the
host filesystem by using the `--registry-config` flag with the `create` command.
By default this will look for a registry config file in the default
podman and docker paths (see the help text for details). You can optionally
specify a file by doing the following:
`--registry-config=$HOME/path/to/auth.json`
================================================
FILE: globals/project.go
================================================
package globals
import "fmt"
const (
ProjectName string = "idpbuilder"
NginxNamespace string = "ingress-nginx"
ArgoCDNamespace string = "argocd"
SelfSignedCertSecretName = "idpbuilder-cert"
SelfSignedCertCMName = "idpbuilder-cert"
SelfSignedCertCMKeyName = "ca.crt"
DefaultSANWildcard = "*.cnoe.localtest.me"
DefaultHostName = "cnoe.localtest.me"
)
func GetProjectNamespace(name string) string {
return fmt.Sprintf("%s-%s", ProjectName, name)
}
================================================
FILE: go.mod
================================================
module github.com/cnoe-io/idpbuilder
go 1.22.0
toolchain go1.24.7
require (
code.gitea.io/sdk/gitea v0.16.0
github.com/cnoe-io/argocd-api v0.0.0-20241031202925-3091d64cb3c4
github.com/docker/docker v25.0.6+incompatible
github.com/go-git/go-billy/v5 v5.5.0
github.com/go-git/go-git/v5 v5.12.0
github.com/go-logr/logr v1.4.2
github.com/google/go-cmp v0.6.0
github.com/google/go-github/v61 v61.0.0
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.9.0
k8s.io/api v0.30.5
k8s.io/apiextensions-apiserver v0.30.5
k8s.io/apimachinery v0.30.5
k8s.io/cli-runtime v0.30.5
k8s.io/client-go v0.30.5
k8s.io/klog/v2 v2.120.1
sigs.k8s.io/controller-runtime v0.18.5
sigs.k8s.io/kind v0.29.0
sigs.k8s.io/kustomize/kyaml v0.16.0
sigs.k8s.io/yaml v1.4.0
)
require (
al.essio.dev/pkg/shellescape v1.5.1 // indirect
dario.cat/mergo v1.0.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v1.0.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/evanphx/json-patch v5.7.0+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-errors/errors v1.4.2 // indirect
github.com/go-fed/httpsig v1.1.0 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.6.8 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/go-version v1.5.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
github.com/moby/term v0.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.45.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.2.2 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xlab/treeprint v1.2.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect
go.opentelemetry.io/otel v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
go.opentelemetry.io/otel/metric v1.31.0 // indirect
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
go.opentelemetry.io/otel/trace v1.31.0 // indirect
golang.org/x/crypto v0.28.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/oauth2 v0.22.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/term v0.25.0 // indirect
golang.org/x/text v0.19.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/grpc v1.67.1 // indirect
google.golang.org/protobuf v1.35.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.1 // indirect
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
)
================================================
FILE: go.sum
================================================
al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
code.gitea.io/sdk/gitea v0.16.0 h1:gAfssETO1Hv9QbE+/nhWu7EjoFQYKt6kPoyDytQgw00=
code.gitea.io/sdk/gitea v0.16.0/go.mod h1:ndkDk99BnfiUCCYEUhpNzi0lpmApXlwRFqClBlOlEBg=
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/cnoe-io/argocd-api v0.0.0-20241031202925-3091d64cb3c4 h1:gjpMCcU3hPy1dShDW8bLGjUmIojB3Bn9rjZbAiBp5V0=
github.com/cnoe-io/argocd-api v0.0.0-20241031202925-3091d64cb3c4/go.mod h1:qItVgtDzIzaRvo82IfN9Is9+cTBz6dVETxBftESVXoY=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0=
github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/docker v25.0.6+incompatible h1:5cPwbwriIcsua2REJe8HqQV+6WlWc1byg2QSXzBxBGg=
github.com/docker/docker v25.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI=
github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys=
github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github/v61 v61.0.0 h1:VwQCBwhyE9JclCI+22/7mLB1PuU9eowCXKY5pNlu1go=
github.com/google/go-github/v61 v61.0.0/go.mod h1:0WR+KmsWX75G2EbpyGsGmradjo3IiciuI4BmdVCobQY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk=
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
github.com/hashicorp/go-version v1.5.0 h1:O293SZ2Eg+AAYijkVK3jR786Am1bhDEh2GHT0tIVE5E=
github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8=
github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk=
github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48=
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g=
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg=
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M=
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
k8s.io/api v0.30.5 h1:Coz05sfEVywzGcA96AJPUfs2B8LBMnh+IIsM+HCfaz8=
k8s.io/api v0.30.5/go.mod h1:HfNBGFvq9iNK8dmTKjYIdAtMxu8BXTb9c1SJyO6QjKs=
k8s.io/apiextensions-apiserver v0.30.5 h1:JfXTIyzXf5+ryncbp7T/uaVjLdvkwtqoNG2vo7S2a6M=
k8s.io/apiextensions-apiserver v0.30.5/go.mod h1:uVLEME2UPA6UN22i+jTu66B9/0CnsjlHkId+Awo0lvs=
k8s.io/apimachinery v0.30.5 h1:CQZO19GFgw4zcOjY2H+mJ3k1u1o7zFACTNCB7nu4O18=
k8s.io/apimachinery v0.30.5/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
k8s.io/cli-runtime v0.30.5 h1:MWY6efoBVH3h0O6p2DgaQszabV5ZntHZwTHBkiz+PSI=
k8s.io/cli-runtime v0.30.5/go.mod h1:AKMWLDIJQUA5a7yEh5gmzkhpZqYpuDEVovanugfSnQk=
k8s.io/client-go v0.30.5 h1:vEDSzfTz0F8TXcWVdXl+aqV7NAV8M3UvC2qnGTTCoKw=
k8s.io/client-go v0.30.5/go.mod h1:/q5fHHBmhAUesOOFJACpD7VJ4e57rVtTPDOsvXrPpMk=
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/controller-runtime v0.18.5 h1:nTHio/W+Q4aBlQMgbnC5hZb4IjIidyrizMai9P6n4Rk=
sigs.k8s.io/controller-runtime v0.18.5/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/kind v0.29.0 h1:3T
gitextract_a87kr30h/
├── .devcontainer/
│ ├── devcontainer.json
│ ├── postCreateCommand.sh
│ └── postStartCommand.sh
├── .github/
│ ├── CODEOWNERS
│ └── workflows/
│ ├── code-scanner.yaml
│ ├── codespell.yaml
│ ├── e2e.yaml
│ ├── nightly.yaml
│ ├── pr.yaml
│ ├── release.yaml
│ └── slash-commands.yaml
├── .gitignore
├── .goreleaser.yaml
├── .pre-commit-config.yaml
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── api/
│ └── v1alpha1/
│ ├── custom_package_types.go
│ ├── gitrepository_types.go
│ ├── groupversion_info.go
│ ├── localbuild_types.go
│ └── zz_generated.deepcopy.go
├── docs/
│ ├── images/
│ │ └── source/
│ │ └── idpbuilder.excalidraw
│ ├── minimum-requirements.md
│ ├── pluggable-packages.md
│ └── private-registries.md
├── globals/
│ └── project.go
├── go.mod
├── go.sum
├── hack/
│ ├── argo-cd/
│ │ ├── argocd-application-controller.yaml
│ │ ├── argocd-applicationset-controller.yaml
│ │ ├── argocd-cm.yaml
│ │ ├── argocd-rbac-dev.yaml
│ │ ├── argocd-redis.yaml
│ │ ├── argocd-repo-server.yaml
│ │ ├── argocd-server.yaml
│ │ ├── argocd-tls-certs-cm.yaml.tmpl
│ │ ├── dex-server.yaml
│ │ ├── generate-manifests.sh
│ │ ├── ingress.yaml.tmpl
│ │ ├── kustomization.yaml
│ │ └── notifications-controller.yaml
│ ├── boilerplate.go.txt
│ ├── embedded-resources.sh
│ ├── gitea/
│ │ ├── generate-manifests.sh
│ │ ├── ingress.yaml.tmpl
│ │ └── values.yaml
│ ├── ingress-nginx/
│ │ ├── cm-ingress-nginx-controller.yaml
│ │ ├── deployment-ingress-nginx.yaml
│ │ ├── generate-manifests.sh
│ │ ├── kustomization.yaml
│ │ └── service-ingress-nginx.yaml.tmpl
│ └── install.sh
├── main.go
├── pkg/
│ ├── build/
│ │ ├── build.go
│ │ ├── build_test.go
│ │ ├── coredns.go
│ │ ├── templates/
│ │ │ └── coredns/
│ │ │ ├── cm-coredns-custom.yaml
│ │ │ ├── cm-coredns-default.yaml.tmpl
│ │ │ ├── cm-coredns.yaml
│ │ │ └── deployment-coredns.yaml
│ │ ├── tls.go
│ │ └── tls_test.go
│ ├── cmd/
│ │ ├── create/
│ │ │ ├── root.go
│ │ │ └── root_test.go
│ │ ├── delete/
│ │ │ └── root.go
│ │ ├── get/
│ │ │ ├── clusters.go
│ │ │ ├── packages.go
│ │ │ ├── root.go
│ │ │ ├── secrets.go
│ │ │ └── secrets_test.go
│ │ ├── helpers/
│ │ │ ├── logger.go
│ │ │ ├── test-data/
│ │ │ │ ├── notk8s.yaml
│ │ │ │ ├── notyaml.yaml
│ │ │ │ └── valid.yaml
│ │ │ ├── validation.go
│ │ │ └── validation_test.go
│ │ ├── root.go
│ │ └── version/
│ │ └── root.go
│ ├── controllers/
│ │ ├── crd.go
│ │ ├── custompackage/
│ │ │ ├── controller.go
│ │ │ ├── controller_test.go
│ │ │ └── test/
│ │ │ └── resources/
│ │ │ └── customPackages/
│ │ │ ├── applicationSet/
│ │ │ │ ├── generator-matrix.yaml
│ │ │ │ ├── generator-multi-sources.yaml
│ │ │ │ ├── generator-single-source.yaml
│ │ │ │ ├── no-generator-single-source.yaml
│ │ │ │ └── test1/
│ │ │ │ └── apps/
│ │ │ │ ├── guestbook/
│ │ │ │ │ ├── guestbook-ui-deployment.yaml
│ │ │ │ │ ├── guestbook-ui-svc.yaml
│ │ │ │ │ └── kustomization.yaml
│ │ │ │ └── guestbook2/
│ │ │ │ ├── guestbook-ui-deployment.yaml
│ │ │ │ ├── guestbook-ui-svc.yaml
│ │ │ │ └── kustomization.yaml
│ │ │ ├── helm/
│ │ │ │ ├── app.yaml
│ │ │ │ └── test/
│ │ │ │ ├── Chart.yaml
│ │ │ │ ├── templates/
│ │ │ │ │ └── cm.yaml
│ │ │ │ └── values.yaml
│ │ │ ├── testDir/
│ │ │ │ ├── app.yaml
│ │ │ │ ├── app1/
│ │ │ │ │ └── cm.yaml
│ │ │ │ ├── app2/
│ │ │ │ │ ├── one/
│ │ │ │ │ │ └── cm.yaml
│ │ │ │ │ └── two/
│ │ │ │ │ └── cm.yaml
│ │ │ │ └── app2.yaml
│ │ │ └── testDir2/
│ │ │ ├── exampleApp.yaml
│ │ │ └── exampleApp2.yaml
│ │ ├── doc.go
│ │ ├── gitrepository/
│ │ │ ├── controller.go
│ │ │ ├── controller_test.go
│ │ │ ├── git_repository.go
│ │ │ ├── gitea.go
│ │ │ ├── github.go
│ │ │ ├── github_test.go
│ │ │ └── test/
│ │ │ └── resources/
│ │ │ └── file1
│ │ ├── localbuild/
│ │ │ ├── argo.go
│ │ │ ├── argo_test.go
│ │ │ ├── controller.go
│ │ │ ├── gitea.go
│ │ │ ├── gitea_test.go
│ │ │ ├── installer.go
│ │ │ ├── nginx.go
│ │ │ └── resources/
│ │ │ ├── argo/
│ │ │ │ ├── ingress.yaml
│ │ │ │ └── install.yaml
│ │ │ ├── gitea/
│ │ │ │ └── k8s/
│ │ │ │ └── install.yaml
│ │ │ └── nginx/
│ │ │ └── k8s/
│ │ │ └── ingress-nginx.yaml
│ │ ├── resources/
│ │ │ ├── idpbuilder.cnoe.io_custompackages.yaml
│ │ │ ├── idpbuilder.cnoe.io_gitrepositories.yaml
│ │ │ └── idpbuilder.cnoe.io_localbuilds.yaml
│ │ └── run.go
│ ├── k8s/
│ │ ├── client.go
│ │ ├── deserialize.go
│ │ ├── deserialize_test.go
│ │ ├── schema.go
│ │ ├── test-resources/
│ │ │ ├── input/
│ │ │ │ ├── argocd/
│ │ │ │ │ └── install.yaml
│ │ │ │ ├── argocd-cm.yaml
│ │ │ │ ├── extra.yaml
│ │ │ │ ├── extra.yaml.tmpl
│ │ │ │ └── nginx/
│ │ │ │ └── install.yaml
│ │ │ └── output/
│ │ │ ├── argocd/
│ │ │ │ └── install.yaml
│ │ │ └── nginx/
│ │ │ ├── install-tmpl.yaml
│ │ │ └── install.yaml
│ │ ├── util.go
│ │ └── util_test.go
│ ├── kind/
│ │ ├── cluster.go
│ │ ├── cluster_test.go
│ │ ├── config.go
│ │ ├── config_integration_test.go
│ │ ├── config_test.go
│ │ ├── kindlogger.go
│ │ ├── resources/
│ │ │ ├── hosts-mirror.toml.tmpl
│ │ │ ├── hosts.toml.tmpl
│ │ │ └── kind.yaml.tmpl
│ │ └── testdata/
│ │ ├── custom-kind.yaml.tmpl
│ │ ├── empty.json
│ │ ├── expected/
│ │ │ ├── label-only.yaml
│ │ │ ├── no-port-multi.yaml
│ │ │ ├── no-port.yaml
│ │ │ └── port-only.yaml
│ │ ├── label-only.yaml
│ │ ├── no-node.yaml
│ │ ├── no-port-multi.yaml
│ │ ├── no-port.yaml
│ │ └── port-only.yaml
│ ├── logger/
│ │ └── handler.go
│ ├── printer/
│ │ ├── cluster.go
│ │ ├── package.go
│ │ ├── printer.go
│ │ ├── secret.go
│ │ └── types/
│ │ └── internal_types.go
│ ├── resources/
│ │ └── localbuild/
│ │ └── application.go
│ └── util/
│ ├── argocd.go
│ ├── files/
│ │ └── files.go
│ ├── fs/
│ │ ├── fs.go
│ │ └── fs_test.go
│ ├── git_repository.go
│ ├── git_repository_test.go
│ ├── gitea.go
│ ├── gitea_test.go
│ ├── idp.go
│ ├── k8s.go
│ ├── secret.go
│ ├── url.go
│ ├── url_test.go
│ ├── util.go
│ └── util_test.go
└── tests/
└── e2e/
├── docker/
│ ├── docker_test.go
│ └── test-dockerfile
└── e2e.go
SYMBOL INDEX (657 symbols across 78 files)
FILE: api/v1alpha1/custom_package_types.go
constant CNOEURIScheme (line 8) | CNOEURIScheme = "cnoe://"
type CustomPackage (line 13) | type CustomPackage struct
type CustomPackageList (line 22) | type CustomPackageList struct
type CustomPackageSpec (line 29) | type CustomPackageSpec struct
type RemoteRepositorySpec (line 45) | type RemoteRepositorySpec struct
type ArgoCDPackageSpec (line 54) | type ArgoCDPackageSpec struct
type CustomPackageStatus (line 63) | type CustomPackageStatus struct
type ObjectRef (line 70) | type ObjectRef struct
FILE: api/v1alpha1/gitrepository_types.go
constant GitProviderGitea (line 8) | GitProviderGitea = "gitea"
constant GitProviderGitHub (line 9) | GitProviderGitHub = "github"
constant GiteaAdminUserName (line 10) | GiteaAdminUserName = "giteaAdmin"
constant SourceTypeLocal (line 11) | SourceTypeLocal = "local"
constant SourceTypeRemote (line 12) | SourceTypeRemote = "remote"
constant SourceTypeEmbedded (line 13) | SourceTypeEmbedded = "embedded"
type GitRepositorySpec (line 16) | type GitRepositorySpec struct
type GitRepositorySource (line 26) | type GitRepositorySource struct
type Provider (line 41) | type Provider struct
type SecretReference (line 54) | type SecretReference struct
type Commit (line 59) | type Commit struct
type GitRepositoryStatus (line 65) | type GitRepositoryStatus struct
type GitRepository (line 83) | type GitRepository struct
type GitRepositoryList (line 92) | type GitRepositoryList struct
FILE: api/v1alpha1/groupversion_info.go
function init (line 21) | func init() {
FILE: api/v1alpha1/localbuild_types.go
constant LastObservedCLIStartTimeAnnotation (line 12) | LastObservedCLIStartTimeAnnotation = "cnoe.io/last-observed-cli-start-time"
constant CliStartTimeAnnotation (line 14) | CliStartTimeAnnotation = "cnoe.io/cli-start-time"
constant PackagePriorityAnnotation (line 16) | PackagePriorityAnnotation = "cnoe.io/package-priority"
constant PackageSourcePathAnnotation (line 18) | PackageSourcePathAnnotation = "cnoe.io/package-source-path"
constant FieldManager (line 19) | FieldManager = "idpbuilder"
constant CLISecretLabelKey (line 21) | CLISecretLabelKey = "cnoe.io/cli-secret"
constant CLISecretLabelValue (line 22) | CLISecretLabelValue = "true"
constant PackageNameLabelKey (line 23) | PackageNameLabelKey = "cnoe.io/package-name"
constant PackageTypeLabelKey (line 24) | PackageTypeLabelKey = "cnoe.io/package-type"
constant PackageTypeLabelCore (line 25) | PackageTypeLabelCore = "core"
constant PackageTypeLabelCustom (line 26) | PackageTypeLabelCustom = "custom"
constant ArgoCDPackageName (line 28) | ArgoCDPackageName = "argocd"
constant GiteaPackageName (line 29) | GiteaPackageName = "gitea"
constant IngressNginxPackageName (line 30) | IngressNginxPackageName = "nginx"
type ArgoPackageConfigSpec (line 35) | type ArgoPackageConfigSpec struct
type EmbeddedArgoApplicationsPackageConfigSpec (line 41) | type EmbeddedArgoApplicationsPackageConfigSpec struct
type PackageConfigsSpec (line 46) | type PackageConfigsSpec struct
type RegistryMirror (line 57) | type RegistryMirror struct
type BuildCustomizationSpec (line 65) | type BuildCustomizationSpec struct
type LocalbuildSpec (line 77) | type LocalbuildSpec struct
type PackageCustomization (line 83) | type PackageCustomization struct
type LocalbuildStatus (line 90) | type LocalbuildStatus struct
type GiteaStatus (line 99) | type GiteaStatus struct
type ArgoCDStatus (line 107) | type ArgoCDStatus struct
type NginxStatus (line 112) | type NginxStatus struct
type Localbuild (line 119) | type Localbuild struct
method GetArgoProjectName (line 127) | func (l *Localbuild) GetArgoProjectName() string {
method GetArgoApplicationName (line 131) | func (l *Localbuild) GetArgoApplicationName(name string) string {
type LocalbuildList (line 136) | type LocalbuildList struct
FILE: api/v1alpha1/zz_generated.deepcopy.go
method DeepCopyInto (line 28) | func (in *ArgoCDPackageSpec) DeepCopyInto(out *ArgoCDPackageSpec) {
method DeepCopy (line 33) | func (in *ArgoCDPackageSpec) DeepCopy() *ArgoCDPackageSpec {
method DeepCopyInto (line 43) | func (in *ArgoCDStatus) DeepCopyInto(out *ArgoCDStatus) {
method DeepCopy (line 48) | func (in *ArgoCDStatus) DeepCopy() *ArgoCDStatus {
method DeepCopyInto (line 58) | func (in *ArgoPackageConfigSpec) DeepCopyInto(out *ArgoPackageConfigSpec) {
method DeepCopy (line 63) | func (in *ArgoPackageConfigSpec) DeepCopy() *ArgoPackageConfigSpec {
method DeepCopyInto (line 73) | func (in *BuildCustomizationSpec) DeepCopyInto(out *BuildCustomizationSp...
method DeepCopy (line 83) | func (in *BuildCustomizationSpec) DeepCopy() *BuildCustomizationSpec {
method DeepCopyInto (line 93) | func (in *Commit) DeepCopyInto(out *Commit) {
method DeepCopy (line 98) | func (in *Commit) DeepCopy() *Commit {
method DeepCopyInto (line 108) | func (in *CustomPackage) DeepCopyInto(out *CustomPackage) {
method DeepCopy (line 117) | func (in *CustomPackage) DeepCopy() *CustomPackage {
method DeepCopyObject (line 127) | func (in *CustomPackage) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 135) | func (in *CustomPackageList) DeepCopyInto(out *CustomPackageList) {
method DeepCopy (line 149) | func (in *CustomPackageList) DeepCopy() *CustomPackageList {
method DeepCopyObject (line 159) | func (in *CustomPackageList) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 167) | func (in *CustomPackageSpec) DeepCopyInto(out *CustomPackageSpec) {
method DeepCopy (line 175) | func (in *CustomPackageSpec) DeepCopy() *CustomPackageSpec {
method DeepCopyInto (line 185) | func (in *CustomPackageStatus) DeepCopyInto(out *CustomPackageStatus) {
method DeepCopy (line 195) | func (in *CustomPackageStatus) DeepCopy() *CustomPackageStatus {
method DeepCopyInto (line 205) | func (in *EmbeddedArgoApplicationsPackageConfigSpec) DeepCopyInto(out *E...
method DeepCopy (line 210) | func (in *EmbeddedArgoApplicationsPackageConfigSpec) DeepCopy() *Embedde...
method DeepCopyInto (line 220) | func (in *GitRepository) DeepCopyInto(out *GitRepository) {
method DeepCopy (line 229) | func (in *GitRepository) DeepCopy() *GitRepository {
method DeepCopyObject (line 239) | func (in *GitRepository) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 247) | func (in *GitRepositoryList) DeepCopyInto(out *GitRepositoryList) {
method DeepCopy (line 261) | func (in *GitRepositoryList) DeepCopy() *GitRepositoryList {
method DeepCopyObject (line 271) | func (in *GitRepositoryList) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 279) | func (in *GitRepositorySource) DeepCopyInto(out *GitRepositorySource) {
method DeepCopy (line 285) | func (in *GitRepositorySource) DeepCopy() *GitRepositorySource {
method DeepCopyInto (line 295) | func (in *GitRepositorySpec) DeepCopyInto(out *GitRepositorySpec) {
method DeepCopy (line 304) | func (in *GitRepositorySpec) DeepCopy() *GitRepositorySpec {
method DeepCopyInto (line 314) | func (in *GitRepositoryStatus) DeepCopyInto(out *GitRepositoryStatus) {
method DeepCopy (line 320) | func (in *GitRepositoryStatus) DeepCopy() *GitRepositoryStatus {
method DeepCopyInto (line 330) | func (in *GiteaStatus) DeepCopyInto(out *GiteaStatus) {
method DeepCopy (line 335) | func (in *GiteaStatus) DeepCopy() *GiteaStatus {
method DeepCopyInto (line 345) | func (in *Localbuild) DeepCopyInto(out *Localbuild) {
method DeepCopy (line 354) | func (in *Localbuild) DeepCopy() *Localbuild {
method DeepCopyObject (line 364) | func (in *Localbuild) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 372) | func (in *LocalbuildList) DeepCopyInto(out *LocalbuildList) {
method DeepCopy (line 386) | func (in *LocalbuildList) DeepCopy() *LocalbuildList {
method DeepCopyObject (line 396) | func (in *LocalbuildList) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 404) | func (in *LocalbuildSpec) DeepCopyInto(out *LocalbuildSpec) {
method DeepCopy (line 411) | func (in *LocalbuildSpec) DeepCopy() *LocalbuildSpec {
method DeepCopyInto (line 421) | func (in *LocalbuildStatus) DeepCopyInto(out *LocalbuildStatus) {
method DeepCopy (line 429) | func (in *LocalbuildStatus) DeepCopy() *LocalbuildStatus {
method DeepCopyInto (line 439) | func (in *NginxStatus) DeepCopyInto(out *NginxStatus) {
method DeepCopy (line 444) | func (in *NginxStatus) DeepCopy() *NginxStatus {
method DeepCopyInto (line 454) | func (in *ObjectRef) DeepCopyInto(out *ObjectRef) {
method DeepCopy (line 459) | func (in *ObjectRef) DeepCopy() *ObjectRef {
method DeepCopyInto (line 469) | func (in *PackageConfigsSpec) DeepCopyInto(out *PackageConfigsSpec) {
method DeepCopy (line 498) | func (in *PackageConfigsSpec) DeepCopy() *PackageConfigsSpec {
method DeepCopyInto (line 508) | func (in *PackageCustomization) DeepCopyInto(out *PackageCustomization) {
method DeepCopy (line 513) | func (in *PackageCustomization) DeepCopy() *PackageCustomization {
method DeepCopyInto (line 523) | func (in *Provider) DeepCopyInto(out *Provider) {
method DeepCopy (line 528) | func (in *Provider) DeepCopy() *Provider {
method DeepCopyInto (line 538) | func (in *RegistryMirror) DeepCopyInto(out *RegistryMirror) {
method DeepCopy (line 543) | func (in *RegistryMirror) DeepCopy() *RegistryMirror {
method DeepCopyInto (line 553) | func (in *RemoteRepositorySpec) DeepCopyInto(out *RemoteRepositorySpec) {
method DeepCopy (line 558) | func (in *RemoteRepositorySpec) DeepCopy() *RemoteRepositorySpec {
method DeepCopyInto (line 568) | func (in *SecretReference) DeepCopyInto(out *SecretReference) {
method DeepCopy (line 573) | func (in *SecretReference) DeepCopy() *SecretReference {
FILE: globals/project.go
constant ProjectName (line 6) | ProjectName string = "idpbuilder"
constant NginxNamespace (line 8) | NginxNamespace string = "ingress-nginx"
constant ArgoCDNamespace (line 9) | ArgoCDNamespace string = "argocd"
constant SelfSignedCertSecretName (line 11) | SelfSignedCertSecretName = "idpbuilder-cert"
constant SelfSignedCertCMName (line 12) | SelfSignedCertCMName = "idpbuilder-cert"
constant SelfSignedCertCMKeyName (line 13) | SelfSignedCertCMKeyName = "ca.crt"
constant DefaultSANWildcard (line 14) | DefaultSANWildcard = "*.cnoe.localtest.me"
constant DefaultHostName (line 15) | DefaultHostName = "cnoe.localtest.me"
function GetProjectNamespace (line 18) | func GetProjectNamespace(name string) string {
FILE: main.go
function main (line 13) | func main() {
FILE: pkg/build/build.go
type Build (line 30) | type Build struct
method ReconcileKindCluster (line 83) | func (b *Build) ReconcileKindCluster(ctx context.Context, recreateClus...
method GetKubeConfig (line 105) | func (b *Build) GetKubeConfig() (*rest.Config, error) {
method GetKubeClient (line 114) | func (b *Build) GetKubeClient(kubeConfig *rest.Config) (client.Client,...
method ReconcileCRDs (line 123) | func (b *Build) ReconcileCRDs(ctx context.Context, kubeClient client.C...
method RunControllers (line 132) | func (b *Build) RunControllers(ctx context.Context, mgr manager.Manage...
method isCompatible (line 136) | func (b *Build) isCompatible(ctx context.Context, kubeClient client.Cl...
method Run (line 166) | func (b *Build) Run(ctx context.Context, recreateCluster bool) error {
type NewBuildOptions (line 47) | type NewBuildOptions struct
function NewBuild (line 64) | func NewBuild(opts NewBuildOptions) *Build {
function isBuildCustomizationSpecEqual (line 288) | func isBuildCustomizationSpecEqual(s1, s2 v1alpha1.BuildCustomizationSpe...
FILE: pkg/build/build_test.go
function TestIsCompatible (line 16) | func TestIsCompatible(t *testing.T) {
FILE: pkg/build/coredns.go
constant coreDNSTemplatePath (line 19) | coreDNSTemplatePath = "templates/coredns"
function setupCoreDNS (line 25) | func setupCoreDNS(ctx context.Context, kubeClient client.Client, scheme ...
FILE: pkg/build/tls.go
constant certificateOrgName (line 28) | certificateOrgName = "cnoe.io"
constant certificateValidLength (line 29) | certificateValidLength = time.Hour * 8766
constant argocdTLSSecretName (line 30) | argocdTLSSecretName = "argocd-server-tls"
function createCertificateAndKeySecret (line 33) | func createCertificateAndKeySecret(ctx context.Context, kubeClient clien...
function createIngressCertificateSecret (line 55) | func createIngressCertificateSecret(ctx context.Context, kubeClient clie...
function getIngressCertificateAndKey (line 75) | func getIngressCertificateAndKey(ctx context.Context, kubeClient client....
function getOrCreateIngressCertificateAndKey (line 100) | func getOrCreateIngressCertificateAndKey(ctx context.Context, kubeClient...
function createSelfSignedCertificate (line 121) | func createSelfSignedCertificate(sans []string) ([]byte, []byte, error) {
function setupSelfSignedCertificate (line 185) | func setupSelfSignedCertificate(ctx context.Context, logger logr.Logger,...
FILE: pkg/build/tls_test.go
type fakeKubeClient (line 19) | type fakeKubeClient struct
method Get (line 24) | func (f *fakeKubeClient) Get(ctx context.Context, key client.ObjectKey...
method Create (line 29) | func (f *fakeKubeClient) Create(ctx context.Context, obj client.Object...
function TestCreateSelfSignedCertificate (line 34) | func TestCreateSelfSignedCertificate(t *testing.T) {
function TestGetOrCreateIngressCertificateAndKey (line 63) | func TestGetOrCreateIngressCertificateAndKey(t *testing.T) {
FILE: pkg/cmd/create/root.go
constant recreateClusterUsage (line 21) | recreateClusterUsage = "Delete cluster first if it already exists."
constant buildNameUsage (line 22) | buildNameUsage = "Name for build (Prefix for kind cluster name, ...
constant devPasswordUsage (line 23) | devPasswordUsage = "Set the password \"developer\" for the admin u...
constant kubeVersionUsage (line 24) | kubeVersionUsage = "Version of the kind kubernetes cluster to crea...
constant extraPortsMappingUsage (line 25) | extraPortsMappingUsage = "List of extra ports to expose on the docker co...
constant registryConfigUsage (line 27) | registryConfigUsage = "List of paths to mount as the registry config, us...
constant kindConfigPathUsage (line 28) | kindConfigPathUsage = "Path or URL to the kind config file to be used in...
constant hostUsage (line 29) | hostUsage = "Host name to access resources in this cluster."
constant ingressHostUsage (line 30) | ingressHostUsage = "Host name used by ingresses. Useful when you have...
constant protocolUsage (line 31) | protocolUsage = "Protocol to use to access web UIs. http or https."
constant portUsage (line 32) | portUsage = "Port number to use to access web UIs."
constant pathRoutingUsage (line 33) | pathRoutingUsage = "When set to true, web UIs are exposed under singl...
constant extraPackagesUsage (line 35) | extraPackagesUsage = "Paths to locations containing custom p...
constant packageCustomizationFilesUsage (line 36) | packageCustomizationFilesUsage = "Name of the package and the path to fi...
constant registryMirrorsUsage (line 38) | registryMirrorsUsage = "List of registry mirrors in format targe...
constant insecureRegistryMirrorsUsage (line 39) | insecureRegistryMirrorsUsage = "When set, configure registry mirrors wit...
constant noExitUsage (line 40) | noExitUsage = "When set, idpbuilder will not exit after...
function init (line 73) | func init() {
function preCreateE (line 100) | func preCreateE(cmd *cobra.Command, args []string) error {
function create (line 104) | func create(cmd *cobra.Command, args []string) error {
function validate (line 206) | func validate() error {
function getPackageCustomFile (line 233) | func getPackageCustomFile(input string) (v1alpha1.PackageCustomization, ...
function parseRegistryMirrors (line 262) | func parseRegistryMirrors(mirrors []string) ([]v1alpha1.RegistryMirror, ...
function printSuccessMsg (line 301) | func printSuccessMsg() {
function behindProxy (line 324) | func behindProxy() bool {
FILE: pkg/cmd/create/root_test.go
function TestParseRegistryMirrors (line 9) | func TestParseRegistryMirrors(t *testing.T) {
FILE: pkg/cmd/delete/root.go
function init (line 27) | func init() {
function preDeleteE (line 31) | func preDeleteE(cmd *cobra.Command, args []string) error {
function deleteE (line 35) | func deleteE(cmd *cobra.Command, args []string) error {
FILE: pkg/cmd/get/clusters.go
type ClusterManager (line 28) | type ClusterManager struct
function preClustersE (line 41) | func preClustersE(cmd *cobra.Command, args []string) error {
function list (line 45) | func list(cmd *cobra.Command, args []string) error {
function populateClusterList (line 58) | func populateClusterList() ([]idpTypes.Cluster, error) {
function printAllocatedResources (line 183) | func printAllocatedResources(ctx context.Context, k8sClient client.Clien...
function findExternalHTTPSPort (line 214) | func findExternalHTTPSPort(cli client.Client, clusterName string) (int32...
function findInternalKubeApiPort (line 246) | func findInternalKubeApiPort(cli client.Client) (int32, error) {
function findClusterByName (line 268) | func findClusterByName(config *api.Config, name string) (*api.Cluster, b...
function GetClientForCluster (line 274) | func GetClientForCluster(m *ClusterManager, clusterName string) (client....
function CreateKubeClientForEachIDPCluster (line 282) | func CreateKubeClientForEachIDPCluster(config *api.Config, clusterList [...
FILE: pkg/cmd/get/packages.go
function getPackagesE (line 25) | func getPackagesE(cmd *cobra.Command, args []string) error {
function printPackages (line 43) | func printPackages(ctx context.Context, outWriter io.Writer, kubeClient ...
function getPackageByName (line 106) | func getPackageByName(ctx context.Context, kubeClient client.Client, ns,...
function getIDPNamespace (line 111) | func getIDPNamespace(ctx context.Context, kubeClient client.Client) (str...
function getLocalBuild (line 121) | func getLocalBuild(ctx context.Context, kubeClient client.Client) (v1alp...
function getPackages (line 126) | func getPackages(ctx context.Context, kubeClient client.Client, ns strin...
FILE: pkg/cmd/get/root.go
function init (line 21) | func init() {
function exportE (line 30) | func exportE(cmd *cobra.Command, args []string) error {
FILE: pkg/cmd/get/secrets.go
constant argoCDAdminUsername (line 21) | argoCDAdminUsername = "admin"
constant argoCDInitialAdminSecretName (line 22) | argoCDInitialAdminSecretName = "argocd-initial-admin-secret"
constant giteaAdminSecretName (line 23) | giteaAdminSecretName = "gitea-credential"
function getSecretsE (line 42) | func getSecretsE(cmd *cobra.Command, args []string) error {
function printAllPackageSecrets (line 63) | func printAllPackageSecrets(ctx context.Context, outWriter io.Writer, ku...
function printPackageSecrets (line 102) | func printPackageSecrets(ctx context.Context, outWriter io.Writer, kubeC...
function populateSecret (line 152) | func populateSecret(s v1.Secret, isCoreSecret bool) types.Secret {
function getSecretsByCNOELabel (line 177) | func getSecretsByCNOELabel(ctx context.Context, kubeClient client.Client...
function getCorePackageSecret (line 191) | func getCorePackageSecret(ctx context.Context, kubeClient client.Client,...
FILE: pkg/cmd/get/secrets_test.go
type fakeKubeClient (line 21) | type fakeKubeClient struct
method Get (line 26) | func (f *fakeKubeClient) Get(ctx context.Context, key client.ObjectKey...
method List (line 31) | func (f *fakeKubeClient) List(ctx context.Context, list client.ObjectL...
type cases (line 36) | type cases struct
function selector (line 43) | func selector(pkgName string) labels.Selector {
function TestPrintPackageSecrets (line 49) | func TestPrintPackageSecrets(t *testing.T) {
function TestPrintAllPackageSecrets (line 107) | func TestPrintAllPackageSecrets(t *testing.T) {
function TestOutput (line 144) | func TestOutput(t *testing.T) {
function secretDataToSecret (line 247) | func secretDataToSecret(data types.Secret) v1.Secret {
FILE: pkg/cmd/helpers/logger.go
function SetLogger (line 23) | func SetLogger() error {
function getSlogLevel (line 40) | func getSlogLevel(s string) (slog.Level, error) {
function getKlogLevel (line 56) | func getKlogLevel(l slog.Level) slog.Level {
FILE: pkg/cmd/helpers/validation.go
function ValidateKubernetesYamlFile (line 12) | func ValidateKubernetesYamlFile(absPath string) error {
function ParsePackageStrings (line 38) | func ParsePackageStrings(pkgStrings []string) ([]string, []string, []str...
function getAbsPath (line 66) | func getAbsPath(path string, isDir bool) (string, error) {
function GetAbsFilePaths (line 86) | func GetAbsFilePaths(paths []string, isDir bool) ([]string, error) {
FILE: pkg/cmd/helpers/validation_test.go
function TestValidateKubernetesYaml (line 11) | func TestValidateKubernetesYaml(t *testing.T) {
function TestParsePackageStrings (line 39) | func TestParsePackageStrings(t *testing.T) {
FILE: pkg/cmd/root.go
function init (line 22) | func init() {
function Execute (line 31) | func Execute(ctx context.Context) {
FILE: pkg/cmd/version/root.go
function init (line 24) | func init() {
type idpbuilderInfo (line 37) | type idpbuilderInfo struct
function version (line 46) | func version(cmd *cobra.Command, args []string) error {
function jsonInfo (line 82) | func jsonInfo() (string, error) {
function yamlInfo (line 98) | func yamlInfo() (string, error) {
FILE: pkg/controllers/crd.go
function getK8sResources (line 22) | func getK8sResources(scheme *runtime.Scheme, templateData any) ([]client...
function EnsureCRD (line 31) | func EnsureCRD(ctx context.Context, scheme *runtime.Scheme, kubeClient c...
function EnsureCRDs (line 90) | func EnsureCRDs(ctx context.Context, scheme *runtime.Scheme, kubeClient ...
FILE: pkg/controllers/custompackage/controller.go
constant requeueTime (line 28) | requeueTime = time.Second * 30
type Reconciler (line 31) | type Reconciler struct
method Reconcile (line 40) | func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) ...
method postProcessReconcile (line 61) | func (r *Reconciler) postProcessReconcile(ctx context.Context, req ctr...
method shouldTakeOverGitRepository (line 77) | func (r *Reconciler) shouldTakeOverGitRepository(ctx context.Context, ...
method shouldReconcile (line 141) | func (r *Reconciler) shouldReconcile(ctx context.Context, resource *v1...
method reconcileCustomPackage (line 218) | func (r *Reconciler) reconcileCustomPackage(ctx context.Context, resou...
method reconcileArgoCDApp (line 333) | func (r *Reconciler) reconcileArgoCDApp(ctx context.Context, resource ...
method reconcileArgoCDAppSet (line 395) | func (r *Reconciler) reconcileArgoCDAppSet(ctx context.Context, resour...
method reconcileArgoCDSource (line 451) | func (r *Reconciler) reconcileArgoCDSource(ctx context.Context, resour...
method reconcileArgoCDSourceFromRemote (line 461) | func (r *Reconciler) reconcileArgoCDSourceFromRemote(ctx context.Conte...
method reconcileArgoCDSourceFromLocal (line 536) | func (r *Reconciler) reconcileArgoCDSourceFromLocal(ctx context.Contex...
method SetupWithManager (line 613) | func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
method getArgoCDAppFile (line 619) | func (r *Reconciler) getArgoCDAppFile(ctx context.Context, resource *v...
method reconcileHelmValueObject (line 637) | func (r *Reconciler) reconcileHelmValueObject(ctx context.Context, sou...
method reconcileHelmValueObjectSource (line 664) | func (r *Reconciler) reconcileHelmValueObjectSource(ctx context.Context,
function getPackagePriority (line 198) | func getPackagePriority(pkg *v1alpha1.CustomPackage) (int, error) {
function localRepoName (line 700) | func localRepoName(appName, dir string) string {
function remoteRepoName (line 704) | func remoteRepoName(appName, pathToPkg string, repo v1alpha1.RemoteRepos...
function isCNOEScheme (line 708) | func isCNOEScheme(repoURL string) bool {
function getCNOEAbsPath (line 712) | func getCNOEAbsPath(fPath, repoURL string) (string, error) {
FILE: pkg/controllers/custompackage/controller_test.go
type testCase (line 26) | type testCase struct
function TestReconcileCustomPkg (line 32) | func TestReconcileCustomPkg(t *testing.T) {
function TestReconcileCustomPkgAppSet (line 245) | func TestReconcileCustomPkgAppSet(t *testing.T) {
function TestReconcileHelmValueObject (line 590) | func TestReconcileHelmValueObject(t *testing.T) {
function TestPackagePriority (line 713) | func TestPackagePriority(t *testing.T) {
function TestGetPackagePriority (line 857) | func TestGetPackagePriority(t *testing.T) {
FILE: pkg/controllers/gitrepository/controller.go
constant DefaultBranchName (line 28) | DefaultBranchName = "main"
constant requeueTime (line 29) | requeueTime = time.Second * 30
constant gitCommitAuthorName (line 30) | gitCommitAuthorName = "git-reconciler"
constant gitCommitAuthorEmail (line 31) | gitCommitAuthorEmail = "idpbuilder-agent@cnoe.io"
constant gitTCPTimeout (line 33) | gitTCPTimeout = 5 * time.Second
constant gitHTTPTimeout (line 35) | gitHTTPTimeout = 30 * time.Second
function init (line 38) | func init() {
type RepositoryReconciler (line 42) | type RepositoryReconciler struct
method Reconcile (line 96) | func (r *RepositoryReconciler) Reconcile(ctx context.Context, req ctrl...
method postProcessReconcile (line 118) | func (r *RepositoryReconciler) postProcessReconcile(ctx context.Contex...
method reconcileGitRepo (line 131) | func (r *RepositoryReconciler) reconcileGitRepo(ctx context.Context, r...
method SetupWithManager (line 185) | func (r *RepositoryReconciler) SetupWithManager(mgr ctrl.Manager, noti...
type gitProviderFunc (line 52) | type gitProviderFunc
type notFoundError (line 54) | type notFoundError struct
method Error (line 56) | func (n notFoundError) Error() string {
function getRepositoryName (line 60) | func getRepositoryName(repo v1alpha1.GitRepository) string {
function getOrganizationName (line 64) | func getOrganizationName(repo v1alpha1.GitRepository) string {
function getFallbackRepositoryURL (line 68) | func getFallbackRepositoryURL(repo *v1alpha1.GitRepository, info repoInf...
function GetGitProvider (line 72) | func GetGitProvider(ctx context.Context, repo *v1alpha1.GitRepository, k...
function addAllAndCommit (line 192) | func addAllAndCommit(path string, gitRepo *git.Repository) (plumbing.Has...
function pushToRemote (line 225) | func pushToRemote(ctx context.Context, remoteRepo *git.Repository, creds...
function reconcileLocalRepoContent (line 237) | func reconcileLocalRepoContent(ctx context.Context, repo *v1alpha1.GitRe...
function reconcileRemoteRepoContent (line 288) | func reconcileRemoteRepoContent(ctx context.Context, repo *v1alpha1.GitR...
function configureGitClient (line 352) | func configureGitClient() {
FILE: pkg/controllers/gitrepository/controller_test.go
constant addFileContent (line 29) | addFileContent = "added\n"
type mockGitea (line 31) | type mockGitea struct
method SetBasicAuth (line 37) | func (g mockGitea) SetBasicAuth(user, pass string) {}
method SetContext (line 39) | func (g mockGitea) SetContext(ctx context.Context) {}
method CreateOrgRepo (line 41) | func (g mockGitea) CreateOrgRepo(org string, opt gitea.CreateRepoOptio...
method GetRepo (line 48) | func (g mockGitea) GetRepo(owner, reponame string) (*gitea.Repository,...
type expect (line 55) | type expect struct
type testCase (line 60) | type testCase struct
method giteaProvider (line 66) | func (t testCase) giteaProvider(ctx context.Context, repo *v1alpha1.Gi...
type fakeClient (line 75) | type fakeClient struct
method Get (line 80) | func (f *fakeClient) Get(ctx context.Context, key client.ObjectKey, ob...
method Status (line 91) | func (f *fakeClient) Status() client.StatusWriter {
method Patch (line 95) | func (f *fakeClient) Patch(ctx context.Context, obj client.Object, pat...
type fakeStatusWriter (line 100) | type fakeStatusWriter struct
method Update (line 104) | func (f fakeStatusWriter) Update(ctx context.Context, obj client.Objec...
function setUpLocalRepo (line 108) | func setUpLocalRepo() (string, string, error) {
function setupDir (line 177) | func setupDir() (string, error) {
function TestGitRepositoryContentReconcile (line 200) | func TestGitRepositoryContentReconcile(t *testing.T) {
function TestGitRepositoryContentReconcileEmbedded (line 279) | func TestGitRepositoryContentReconcileEmbedded(t *testing.T) {
function TestGitRepositoryReconcile (line 319) | func TestGitRepositoryReconcile(t *testing.T) {
function TestGitRepositoryPostReconcile (line 429) | func TestGitRepositoryPostReconcile(t *testing.T) {
FILE: pkg/controllers/gitrepository/git_repository.go
type GiteaClient (line 12) | type GiteaClient interface
type gitHubClient (line 24) | type gitHubClient interface
type repoInfo (line 30) | type repoInfo struct
type gitProviderCredentials (line 37) | type gitProviderCredentials struct
type gitProvider (line 43) | type gitProvider interface
FILE: pkg/controllers/gitrepository/gitea.go
constant giteaAdminUsernameKey (line 22) | giteaAdminUsernameKey = "username"
constant giteaAdminPasswordKey (line 23) | giteaAdminPasswordKey = "password"
type GiteaClientFunc (line 26) | type GiteaClientFunc
type giteaProvider (line 28) | type giteaProvider struct
method createRepository (line 35) | func (g *giteaProvider) createRepository(ctx context.Context, repo *v1...
method getProviderCredentials (line 55) | func (g *giteaProvider) getProviderCredentials(ctx context.Context, re...
method setProviderCredentials (line 80) | func (g *giteaProvider) setProviderCredentials(ctx context.Context, re...
method getRepository (line 86) | func (g *giteaProvider) getRepository(ctx context.Context, repo *v1alp...
method updateRepoContent (line 103) | func (g *giteaProvider) updateRepoContent(
function writeRepoContents (line 121) | func writeRepoContents(repo *v1alpha1.GitRepository, dstPath string, con...
function getBasicAuth (line 147) | func getBasicAuth(creds gitProviderCredentials) (githttp.BasicAuth, erro...
function NewGiteaClient (line 158) | func NewGiteaClient(url string, options ...gitea.ClientOption) (GiteaCli...
function getInternalGiteaRepositoryURL (line 162) | func getInternalGiteaRepositoryURL(namespace, name, baseUrl string) stri...
FILE: pkg/controllers/gitrepository/github.go
constant gitHubTokenKey (line 18) | gitHubTokenKey = "token"
type ghClient (line 21) | type ghClient struct
method getRepo (line 25) | func (g *ghClient) getRepo(ctx context.Context, owner, repo string) (*...
method createRepo (line 29) | func (g *ghClient) createRepo(ctx context.Context, owner string, req *...
method setToken (line 33) | func (g *ghClient) setToken(token string) error {
type gitHubProvider (line 38) | type gitHubProvider struct
method createRepository (line 45) | func (g *gitHubProvider) createRepository(ctx context.Context, repo *v...
method getRepository (line 63) | func (g *gitHubProvider) getRepository(ctx context.Context, repo *v1al...
method getProviderCredentials (line 81) | func (g *gitHubProvider) getProviderCredentials(ctx context.Context, r...
method setProviderCredentials (line 101) | func (g *gitHubProvider) setProviderCredentials(ctx context.Context, r...
method updateRepoContent (line 105) | func (g *gitHubProvider) updateRepoContent(
function newGitHubClient (line 116) | func newGitHubClient(httpClient *http.Client) gitHubClient {
FILE: pkg/controllers/gitrepository/github_test.go
type fakeGH (line 19) | type fakeGH struct
method getRepo (line 23) | func (f *fakeGH) getRepo(ctx context.Context, owner, repo string) (*gi...
method createRepo (line 28) | func (f *fakeGH) createRepo(ctx context.Context, owner string, req *gi...
method setToken (line 33) | func (f *fakeGH) setToken(token string) error {
function newResponse (line 37) | func newResponse(r http.Response) *github.Response {
type fakeKubeClient (line 42) | type fakeKubeClient struct
method Get (line 47) | func (f *fakeKubeClient) Get(ctx context.Context, key client.ObjectKey...
function TestGitHubCreateRepository (line 52) | func TestGitHubCreateRepository(t *testing.T) {
function TestGitHubGetProviderCredentials (line 103) | func TestGitHubGetProviderCredentials(t *testing.T) {
function TestGitHubGetRepository (line 139) | func TestGitHubGetRepository(t *testing.T) {
FILE: pkg/controllers/localbuild/argo.go
function RawArgocdInstallResources (line 17) | func RawArgocdInstallResources(templateData any, config v1alpha1.Package...
method ReconcileArgo (line 21) | func (r *LocalbuildReconciler) ReconcileArgo(ctx context.Context, req ct...
FILE: pkg/controllers/localbuild/argo_test.go
type fakeKubeClient (line 20) | type fakeKubeClient struct
method List (line 25) | func (f *fakeKubeClient) List(ctx context.Context, list client.ObjectL...
method Patch (line 30) | func (f *fakeKubeClient) Patch(ctx context.Context, obj client.Object,...
type testCase (line 35) | type testCase struct
function TestGetRawInstallResources (line 41) | func TestGetRawInstallResources(t *testing.T) {
function TestGetK8sInstallResources (line 68) | func TestGetK8sInstallResources(t *testing.T) {
function TestArgoCDAppAnnotation (line 88) | func TestArgoCDAppAnnotation(t *testing.T) {
function makeUnstructured (line 209) | func makeUnstructured(name, namespace string, gvk schema.GroupVersionKin...
FILE: pkg/controllers/localbuild/controller.go
constant defaultArgoCDProjectName (line 40) | defaultArgoCDProjectName string = "default"
constant defaultRequeueTime (line 41) | defaultRequeueTime = time.Second * 15
constant errRequeueTime (line 42) | errRequeueTime = time.Second * 5
constant argoCDApplicationAnnotationKeyRefresh (line 44) | argoCDApplicationAnnotationKeyRefresh = "argocd.argoproj.io/refr...
constant argoCDApplicationAnnotationValueRefreshNormal (line 45) | argoCDApplicationAnnotationValueRefreshNormal = "normal"
constant argoCDApplicationSetAnnotationKeyRefresh (line 46) | argoCDApplicationSetAnnotationKeyRefresh = "argocd.argoproj.io/appl...
constant argoCDApplicationSetAnnotationKeyRefreshTrue (line 47) | argoCDApplicationSetAnnotationKeyRefreshTrue = "true"
type ArgocdSession (line 50) | type ArgocdSession struct
type LocalbuildReconciler (line 54) | type LocalbuildReconciler struct
method Reconcile (line 67) | func (r *LocalbuildReconciler) Reconcile(ctx context.Context, req ctrl...
method installCorePackages (line 155) | func (r *LocalbuildReconciler) installCorePackages(ctx context.Context...
method postProcessReconcile (line 183) | func (r *LocalbuildReconciler) postProcessReconcile(ctx context.Contex...
method ReconcileProjectNamespace (line 207) | func (r *LocalbuildReconciler) ReconcileProjectNamespace(ctx context.C...
method SetupWithManager (line 231) | func (r *LocalbuildReconciler) SetupWithManager(mgr ctrl.Manager) error {
method ReconcileArgoAppsWithGitea (line 237) | func (r *LocalbuildReconciler) ReconcileArgoAppsWithGitea(ctx context....
method reconcileEmbeddedApp (line 286) | func (r *LocalbuildReconciler) reconcileEmbeddedApp(ctx context.Contex...
method shouldShutDown (line 341) | func (r *LocalbuildReconciler) shouldShutDown(ctx context.Context, res...
method reconcileCustomPkg (line 438) | func (r *LocalbuildReconciler) reconcileCustomPkg(
method reconcileCustomPkgUrl (line 555) | func (r *LocalbuildReconciler) reconcileCustomPkgUrl(ctx context.Conte...
method reconcileCustomPkgDir (line 598) | func (r *LocalbuildReconciler) reconcileCustomPkgDir(ctx context.Conte...
method reconcileCustomPkgFile (line 628) | func (r *LocalbuildReconciler) reconcileCustomPkgFile(ctx context.Cont...
method reconcileGitRepo (line 663) | func (r *LocalbuildReconciler) reconcileGitRepo(ctx context.Context, r...
method requestArgoCDAppRefresh (line 720) | func (r *LocalbuildReconciler) requestArgoCDAppRefresh(ctx context.Con...
method requestArgoCDAppSetRefresh (line 744) | func (r *LocalbuildReconciler) requestArgoCDAppSetRefresh(ctx context....
method extractArgocdInitialAdminSecret (line 761) | func (r *LocalbuildReconciler) extractArgocdInitialAdminSecret(ctx con...
method extractGiteaAdminSecret (line 776) | func (r *LocalbuildReconciler) extractGiteaAdminSecret(ctx context.Con...
method updateGiteaPassword (line 791) | func (r *LocalbuildReconciler) updateGiteaPassword(ctx context.Context...
method updateArgocdPassword (line 818) | func (r *LocalbuildReconciler) updateArgocdPassword(ctx context.Contex...
method applyArgoCDAnnotation (line 925) | func (r *LocalbuildReconciler) applyArgoCDAnnotation(ctx context.Conte...
type subReconciler (line 65) | type subReconciler
function getCustomPackageName (line 948) | func getCustomPackageName(fileName, appName string) string {
function isSupportedArgoCDTypes (line 953) | func isSupportedArgoCDTypes(gvk *schema.GroupVersionKind) bool {
function GetEmbeddedRawInstallResources (line 960) | func GetEmbeddedRawInstallResources(name string, templateData any, confi...
FILE: pkg/controllers/localbuild/gitea.go
function RawGiteaInstallResources (line 27) | func RawGiteaInstallResources(templateData any, config v1alpha1.PackageC...
method newGiteaAdminSecret (line 31) | func (r *LocalbuildReconciler) newGiteaAdminSecret(password string) core...
method ReconcileGitea (line 40) | func (r *LocalbuildReconciler) ReconcileGitea(ctx context.Context, req c...
method setGiteaToken (line 119) | func (r *LocalbuildReconciler) setGiteaToken(ctx context.Context, secret...
FILE: pkg/controllers/localbuild/gitea_test.go
function TestGetGiteaToken (line 14) | func TestGetGiteaToken(t *testing.T) {
FILE: pkg/controllers/localbuild/installer.go
type EmbeddedInstallation (line 26) | type EmbeddedInstallation struct
method installResources (line 43) | func (e *EmbeddedInstallation) installResources(scheme *runtime.Scheme...
method newNamespace (line 47) | func (e *EmbeddedInstallation) newNamespace(namespace string) *corev1....
method Install (line 55) | func (e *EmbeddedInstallation) Install(ctx context.Context, resource *...
FILE: pkg/controllers/localbuild/nginx.go
function RawNginxInstallResources (line 18) | func RawNginxInstallResources(templateData any, config v1alpha1.PackageC...
method ReconcileNginx (line 22) | func (r *LocalbuildReconciler) ReconcileNginx(ctx context.Context, req c...
FILE: pkg/controllers/run.go
function RunControllers (line 16) | func RunControllers(
FILE: pkg/k8s/client.go
function EnsureObject (line 14) | func EnsureObject(ctx context.Context, kubeClient client.Client, obj cli...
function EnsureNamespace (line 48) | func EnsureNamespace(ctx context.Context, kubeClient client.Client, name...
FILE: pkg/k8s/deserialize.go
type ConversionError (line 14) | type ConversionError struct
method Error (line 18) | func (e *ConversionError) Error() string {
function ConvertYamlToObjects (line 22) | func ConvertYamlToObjects(scheme *runtime.Scheme, objYamls []byte) ([]cl...
function ConvertRawResourcesToObjects (line 45) | func ConvertRawResourcesToObjects(scheme *runtime.Scheme, rawResources [...
function ConvertYamlToObjectsWithOverride (line 58) | func ConvertYamlToObjectsWithOverride(scheme *runtime.Scheme, originalFi...
function GetObjectIdentifier (line 136) | func GetObjectIdentifier(n *kyaml.RNode) string {
FILE: pkg/k8s/deserialize_test.go
function newDeployment (line 13) | func newDeployment(name string) *appsv1.Deployment {
function TestConvertYamlToObjects (line 25) | func TestConvertYamlToObjects(t *testing.T) {
FILE: pkg/k8s/schema.go
function GetScheme (line 16) | func GetScheme() *runtime.Scheme {
FILE: pkg/k8s/util.go
function BuildCustomizedManifests (line 12) | func BuildCustomizedManifests(filePath, fsPath string, resourceFS embed....
function BuildCustomizedObjects (line 30) | func BuildCustomizedObjects(filePath, fsPath string, resourceFS embed.FS...
function applyOverrides (line 48) | func applyOverrides(filePath string, originalFiles [][]byte, scheme *run...
FILE: pkg/k8s/util_test.go
function TestBuildCustomizedManifests (line 16) | func TestBuildCustomizedManifests(t *testing.T) {
FILE: pkg/kind/cluster.go
constant ingressNginxNodeLabelKey (line 23) | ingressNginxNodeLabelKey = "ingress-ready"
constant ingressNginxNodeLabelValue (line 24) | ingressNginxNodeLabelValue = "true"
type HttpClient (line 31) | type HttpClient interface
type Cluster (line 35) | type Cluster struct
method getConfig (line 56) | func (c *Cluster) getConfig() ([]byte, error) {
method Exists (line 124) | func (c *Cluster) Exists() (bool, error) {
method getClusterHealthError (line 139) | func (c *Cluster) getClusterHealthError(context string) error {
method isHealthy (line 154) | func (c *Cluster) isHealthy() bool {
method Reconcile (line 163) | func (c *Cluster) Reconcile(ctx context.Context, recreate bool) error {
method ExportKubeConfig (line 211) | func (c *Cluster) ExportKubeConfig(name string, internal bool) error {
method ensureCorrectConfig (line 224) | func (c *Cluster) ensureCorrectConfig(in []byte) (kindv1alpha4.Cluster...
type IProvider (line 47) | type IProvider interface
function NewCluster (line 103) | func NewCluster(name, kubeVersion, kubeConfigPath, kindConfigPath, extra...
FILE: pkg/kind/cluster_test.go
function TestGetConfig (line 20) | func TestGetConfig(t *testing.T) {
function TestExtraPortMappings (line 105) | func TestExtraPortMappings(t *testing.T) {
function TestGetConfigCustom (line 149) | func TestGetConfigCustom(t *testing.T) {
type mockProvider (line 209) | type mockProvider struct
method ListNodes (line 214) | func (m *mockProvider) ListNodes(name string) ([]nodes.Node, error) {
type mockRuntime (line 219) | type mockRuntime struct
method ContainerWithPort (line 223) | func (m *mockRuntime) ContainerWithPort(ctx context.Context, name stri...
type DockerClientMock (line 229) | type DockerClientMock struct
method ContainerList (line 234) | func (m *DockerClientMock) ContainerList(ctx context.Context, listOpti...
type NodeMock (line 239) | type NodeMock struct
method Command (line 243) | func (n *NodeMock) Command(command string, args ...string) exec.Cmd {
method String (line 249) | func (n *NodeMock) String() string {
method Role (line 254) | func (n *NodeMock) Role() (string, error) {
method IP (line 259) | func (n *NodeMock) IP() (ipv4 string, ipv6 string, err error) {
method SerialLogs (line 264) | func (n *NodeMock) SerialLogs(writer io.Writer) error {
method CommandContext (line 269) | func (n *NodeMock) CommandContext(ctx context.Context, cmd string, arg...
FILE: pkg/kind/config.go
type PortMapping (line 16) | type PortMapping struct
type TemplateConfig (line 21) | type TemplateConfig struct
function loadConfig (line 32) | func loadConfig(path string, httpClient HttpClient) ([]byte, error) {
function parsePortMappings (line 62) | func parsePortMappings(extraPortsMapping string) []PortMapping {
function findRegistryConfig (line 80) | func findRegistryConfig(registryConfigPaths []string) string {
function renderRegistryCertsDir (line 90) | func renderRegistryCertsDir(cfg v1alpha1.BuildCustomizationSpec) (string...
FILE: pkg/kind/config_integration_test.go
function TestRegistryMirrorHostsTomlContent (line 12) | func TestRegistryMirrorHostsTomlContent(t *testing.T) {
function TestMultipleMirrors (line 68) | func TestMultipleMirrors(t *testing.T) {
function TestMirrorWithExistingGiteaConfig (line 124) | func TestMirrorWithExistingGiteaConfig(t *testing.T) {
function TestMirrorWithHTTPS (line 166) | func TestMirrorWithHTTPS(t *testing.T) {
function TestMirrorWithHTTP (line 204) | func TestMirrorWithHTTP(t *testing.T) {
function TestMirrorWithHTTPInsecure (line 246) | func TestMirrorWithHTTPInsecure(t *testing.T) {
FILE: pkg/kind/config_test.go
type MockHttpClient (line 17) | type MockHttpClient struct
method Get (line 19) | func (o *MockHttpClient) Get(url string) (resp *http.Response, err err...
function TestLoadConfig (line 42) | func TestLoadConfig(t *testing.T) {
function TestExtraPortMappingsUtilFunc (line 118) | func TestExtraPortMappingsUtilFunc(t *testing.T) {
function TestFindRegistryConfig (line 164) | func TestFindRegistryConfig(t *testing.T) {
function TestRenderRegistryCertsDirWithMirrors (line 192) | func TestRenderRegistryCertsDirWithMirrors(t *testing.T) {
FILE: pkg/kind/kindlogger.go
type kindLogger (line 13) | type kindLogger struct
method Warn (line 17) | func (l *kindLogger) Warn(message string) {
method Warnf (line 21) | func (l *kindLogger) Warnf(message string, args ...interface{}) {
method Error (line 25) | func (l *kindLogger) Error(message string) {
method Errorf (line 29) | func (l *kindLogger) Errorf(message string, args ...interface{}) {
method V (line 34) | func (l *kindLogger) V(level kindlog.Level) kindlog.InfoLogger {
function KindLoggerFromLogr (line 40) | func KindLoggerFromLogr(logrLogger *logr.Logger) *kindLogger {
function newKindInfoLogger (line 46) | func newKindInfoLogger(logrLogger *logr.Logger, level int) *kindInfoLogg...
type kindInfoLogger (line 53) | type kindInfoLogger struct
method Info (line 58) | func (k *kindInfoLogger) Info(message string) {
method Infof (line 62) | func (k *kindInfoLogger) Infof(message string, args ...interface{}) {
method Enabled (line 66) | func (k *kindInfoLogger) Enabled() bool {
FILE: pkg/logger/handler.go
constant Reset (line 16) | Reset = "\033[0m"
constant White (line 17) | White = "\033[37m"
constant WhiteDim (line 18) | WhiteDim = "\033[37;2m"
constant Green (line 19) | Green = "\033[32m"
constant GreenDimUnderlined (line 20) | GreenDimUnderlined = "\033[32;2;4m"
constant Magenta (line 21) | Magenta = "\033[35m"
constant BrightRed (line 22) | BrightRed = "\033[91m"
constant BrightYellow (line 23) | BrightYellow = "\033[93m"
constant Cyan (line 24) | Cyan = "\033[36m"
constant CyanDim (line 25) | CyanDim = "\033[36;2m"
constant maxBufferSize (line 27) | maxBufferSize = 16384
constant dateFormat (line 28) | dateFormat = time.Stamp
type Options (line 38) | type Options struct
type Handler (line 46) | type Handler struct
method clone (line 69) | func (h *Handler) clone() *Handler {
method Enabled (line 82) | func (h *Handler) Enabled(_ context.Context, level slog.Level) bool {
method WithGroup (line 90) | func (h *Handler) WithGroup(name string) slog.Handler {
method WithAttrs (line 101) | func (h *Handler) WithAttrs(as []slog.Attr) slog.Handler {
method appendUnopenedGroups (line 115) | func (h *Handler) appendUnopenedGroups(buf []byte) []byte {
method appendAttr (line 122) | func (h *Handler) appendAttr(buf []byte, a slog.Attr) []byte {
method Handle (line 148) | func (h *Handler) Handle(ctx context.Context, record slog.Record) error {
method appendKeyValuePair (line 203) | func (h *Handler) appendKeyValuePair(buf []byte, a slog.Attr) []byte {
function NewHandler (line 58) | func NewHandler(out io.Writer, opts Options) *Handler {
function free (line 213) | func free(b *[]byte) {
function source (line 220) | func source(r slog.Record) *slog.Source {
FILE: pkg/printer/cluster.go
type ClusterPrinter (line 10) | type ClusterPrinter struct
method PrintOutput (line 15) | func (cp ClusterPrinter) PrintOutput(format string) error {
function generateClusterTable (line 28) | func generateClusterTable(input []types.Cluster) metav1.Table {
function generateNodeData (line 55) | func generateNodeData(nodes []types.Node) string {
FILE: pkg/printer/package.go
type PackagePrinter (line 10) | type PackagePrinter struct
method PrintOutput (line 15) | func (pp PackagePrinter) PrintOutput(format string) error {
function generatePackageTable (line 28) | func generatePackageTable(packagesTable []types.Package) metav1.Table {
FILE: pkg/printer/printer.go
function PrintDataAsTable (line 11) | func PrintDataAsTable(table metav1.Table, outWriter io.Writer) error {
function PrintDataAsJson (line 16) | func PrintDataAsJson(data any, outWriter io.Writer) error {
function PrintDataAsYaml (line 23) | func PrintDataAsYaml(data any, outWriter io.Writer) error {
FILE: pkg/printer/secret.go
type SecretPrinter (line 11) | type SecretPrinter struct
method PrintOutput (line 16) | func (sp SecretPrinter) PrintOutput(format string) error {
function generateSecretTable (line 29) | func generateSecretTable(secretTable []types.Secret) metav1.Table {
FILE: pkg/printer/types/internal_types.go
type Allocated (line 5) | type Allocated struct
type Capacity (line 10) | type Capacity struct
type Cluster (line 16) | type Cluster struct
type Node (line 25) | type Node struct
type Package (line 33) | type Package struct
type Secret (line 42) | type Secret struct
FILE: pkg/resources/localbuild/application.go
function SetProjectSpec (line 8) | func SetProjectSpec(project *argov1alpha1.AppProject) {
function SetApplicationSpec (line 31) | func SetApplicationSpec(app *argov1alpha1.Application, repoUrl, path, pr...
FILE: pkg/util/argocd.go
constant ArgocdInitialAdminSecretName (line 11) | ArgocdInitialAdminSecretName = "argocd-initial-admin-secret"
constant ArgocdAdminName (line 12) | ArgocdAdminName = "admin"
constant ArgocdNamespace (line 13) | ArgocdNamespace = "argocd"
constant ArgocdURLTempl (line 14) | ArgocdURLTempl = "%s://%s%s:%s%s"
function ArgocdBaseUrl (line 17) | func ArgocdBaseUrl(config v1alpha1.BuildCustomizationSpec) string {
function ArgocdInitialAdminSecretObject (line 24) | func ArgocdInitialAdminSecretObject() corev1.Secret {
FILE: pkg/util/files/files.go
function CopyDirectory (line 13) | func CopyDirectory(scrDir, dest string) error {
function Copy (line 54) | func Copy(srcFile, dstFile string) error {
function Exists (line 77) | func Exists(filePath string) bool {
function CreateIfNotExists (line 85) | func CreateIfNotExists(dir string, perm os.FileMode) error {
function ApplyTemplate (line 97) | func ApplyTemplate(in []byte, templateData any) ([]byte, error) {
function templateIndentNewlines (line 117) | func templateIndentNewlines(n int, val string) string {
FILE: pkg/util/fs/fs.go
type FS (line 14) | type FS interface
function ConvertFSToBytes (line 19) | func ConvertFSToBytes(inFS FS, name string, templateData any) ([][]byte,...
function CopyFile (line 43) | func CopyFile(src fs.File, dest string) error {
function CopyDir (line 68) | func CopyDir(src fs.FS, dest string) error {
function WriteFS (line 109) | func WriteFS(src fs.FS, dest string) error {
FILE: pkg/util/fs/fs_test.go
function TestWriteFS (line 15) | func TestWriteFS(t *testing.T) {
FILE: pkg/util/git_repository.go
type RepoMap (line 23) | type RepoMap struct
method LoadOrStore (line 27) | func (r *RepoMap) LoadOrStore(repoName, dir string) *RepoState {
type RepoState (line 32) | type RepoState struct
function NewRepoLock (line 37) | func NewRepoLock() *RepoMap {
function RepoUrlHash (line 43) | func RepoUrlHash(repoUrl string) string {
function RepoDir (line 49) | func RepoDir(repoUrl, parent string) string {
function FirstRemoteURL (line 53) | func FirstRemoteURL(repo *git.Repository) (string, error) {
function GetWorktreeYamlFiles (line 69) | func GetWorktreeYamlFiles(parent string, wt billy.Filesystem, recurse bo...
function ReadWorktreeFile (line 95) | func ReadWorktreeFile(wt billy.Filesystem, path string) ([]byte, error) {
function CloneRemoteRepoToMemory (line 111) | func CloneRemoteRepoToMemory(ctx context.Context, remote v1alpha1.Remote...
function CloneRemoteRepoToDir (line 141) | func CloneRemoteRepoToDir(ctx context.Context, remote v1alpha1.RemoteRep...
function CopyTreeToTree (line 186) | func CopyTreeToTree(srcWT, dstWT billy.Filesystem, srcPath, dstPath stri...
function CopyWTFile (line 214) | func CopyWTFile(srcWT, dstWT billy.Filesystem, srcFile, dstFile string) ...
function checkoutCommitOrRef (line 235) | func checkoutCommitOrRef(ctx context.Context, wt *git.Worktree, ref stri...
FILE: pkg/util/git_repository_test.go
function TestCloneRemoteRepoToDir (line 18) | func TestCloneRemoteRepoToDir(t *testing.T) {
function TestCopyTreeToTree (line 54) | func TestCopyTreeToTree(t *testing.T) {
function testCopiedFiles (line 71) | func testCopiedFiles(t *testing.T, src, dst billy.Filesystem, srcStartPa...
function TestGetWorktreeYamlFiles (line 91) | func TestGetWorktreeYamlFiles(t *testing.T) {
FILE: pkg/util/gitea.go
constant GiteaNamespace (line 18) | GiteaNamespace = "gitea"
constant GiteaAdminSecret (line 19) | GiteaAdminSecret = "gitea-credential"
constant GiteaAdminName (line 20) | GiteaAdminName = "giteaAdmin"
constant GiteaAdminTokenName (line 21) | GiteaAdminTokenName = "admin"
constant GiteaAdminTokenFieldName (line 22) | GiteaAdminTokenFieldName = "token"
constant GiteaURLTempl (line 23) | GiteaURLTempl = "%s://%s%s:%s%s"
function GiteaAdminSecretObject (line 26) | func GiteaAdminSecretObject() corev1.Secret {
function PatchPasswordSecret (line 39) | func PatchPasswordSecret(ctx context.Context, kubeClient client.Client, ...
function GetGiteaToken (line 73) | func GetGiteaToken(ctx context.Context, baseUrl, username, password stri...
function GiteaBaseUrl (line 108) | func GiteaBaseUrl(config v1alpha1.BuildCustomizationSpec) string {
FILE: pkg/util/gitea_test.go
function TestGiteaBaseUrl (line 10) | func TestGiteaBaseUrl(t *testing.T) {
FILE: pkg/util/idp.go
function GetConfig (line 10) | func GetConfig(ctx context.Context) (v1alpha1.BuildCustomizationSpec, er...
function getLocalBuild (line 32) | func getLocalBuild(ctx context.Context, kubeClient client.Client) (v1alp...
FILE: pkg/util/k8s.go
function GetKubeConfigPath (line 18) | func GetKubeConfigPath() string {
function LoadKubeConfig (line 26) | func LoadKubeConfig() (*api.Config, error) {
function GetKubeConfig (line 35) | func GetKubeConfig() (*rest.Config, error) {
function GetKubeClient (line 43) | func GetKubeClient(kubeConfig *rest.Config) (client.Client, error) {
FILE: pkg/util/secret.go
function GetSecretByName (line 9) | func GetSecretByName(ctx context.Context, kubeClient client.Client, ns, ...
FILE: pkg/util/url.go
constant QueryStringRef (line 14) | QueryStringRef = "ref"
constant QueryStringVersion (line 15) | QueryStringVersion = "version"
constant QueryStringTimeout (line 16) | QueryStringTimeout = "timeout"
constant QueryStringSubmodules (line 17) | QueryStringSubmodules = "submodules"
constant RepoUrlDelimiter (line 19) | RepoUrlDelimiter = "//"
constant SCPDelimiter (line 20) | SCPDelimiter = ":"
constant UserDelimiter (line 21) | UserDelimiter = "@"
constant defaultTimeout (line 23) | defaultTimeout = time.Second * 27
constant defaultCloneSubmodule (line 24) | defaultCloneSubmodule = true
constant errMsgUrlUnsupported (line 26) | errMsgUrlUnsupported = "url must have // after the repository url. examp...
constant errMsgUrlColon (line 27) | errMsgUrlColon = "first path segment in URL cannot contain colon"
type KustomizeRemote (line 30) | type KustomizeRemote struct
method CloneUrl (line 47) | func (g *KustomizeRemote) CloneUrl() string {
method Path (line 74) | func (g *KustomizeRemote) Path() string {
method parseQuery (line 78) | func (g *KustomizeRemote) parseQuery() error {
method parse (line 124) | func (g *KustomizeRemote) parse() error {
method parseSCPStyle (line 147) | func (g *KustomizeRemote) parseSCPStyle() error {
method parsePath (line 172) | func (g *KustomizeRemote) parsePath(path string) error {
function NewKustomizeRemote (line 184) | func NewKustomizeRemote(uri string) (*KustomizeRemote, error) {
FILE: pkg/util/url_test.go
function TestURLParse (line 10) | func TestURLParse(t *testing.T) {
FILE: pkg/util/util.go
constant chars (line 25) | chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
constant digits (line 26) | digits = "0123456789"
constant specialChars (line 27) | specialChars = `!#$%&'()*+,-./:;<=>?@[]^_{|}~`
constant passwordLength (line 28) | passwordLength = 40
constant numSpecialChars (line 29) | numSpecialChars = 3
constant numDigits (line 30) | numDigits = 3
constant StaticPassword (line 31) | StaticPassword = "developer"
function GetCLIStartTimeAnnotationValue (line 34) | func GetCLIStartTimeAnnotationValue(annotations map[string]string) (stri...
function SetCLIStartTimeAnnotationValue (line 45) | func SetCLIStartTimeAnnotationValue(annotations map[string]string, timeS...
function SetLastObservedSyncTimeAnnotationValue (line 51) | func SetLastObservedSyncTimeAnnotationValue(annotations map[string]strin...
function GetLastObservedSyncTimeAnnotationValue (line 57) | func GetLastObservedSyncTimeAnnotationValue(annotations map[string]strin...
function UpdateSyncAnnotation (line 68) | func UpdateSyncAnnotation(ctx context.Context, kubeClient client.Client,...
function ApplyAnnotation (line 79) | func ApplyAnnotation(ctx context.Context, kubeClient client.Client, obj ...
function GeneratePassword (line 89) | func GeneratePassword() (string, error) {
function getRandElement (line 130) | func getRandElement(input string) (string, error) {
function IsYamlFile (line 139) | func IsYamlFile(input string) bool {
function GetHttpClient (line 144) | func GetHttpClient() *http.Client {
function DetectKindNodeProvider (line 159) | func DetectKindNodeProvider() (cluster.ProviderOption, error) {
function SetPackageLabels (line 172) | func SetPackageLabels(obj client.Object) {
FILE: pkg/util/util_test.go
function TestGeneratePassword (line 16) | func TestGeneratePassword(t *testing.T) {
type MockObject (line 52) | type MockObject struct
method GetObjectKind (line 56) | func (m *MockObject) GetObjectKind() schema.ObjectKind {
method DeepCopyObject (line 60) | func (m *MockObject) DeepCopyObject() runtime.Object {
function TestSetPackageLabels (line 64) | func TestSetPackageLabels(t *testing.T) {
FILE: tests/e2e/docker/docker_test.go
function CleanUpDocker (line 21) | func CleanUpDocker(t *testing.T) {
function Test_CreateDocker (line 43) | func Test_CreateDocker(t *testing.T) {
function testCreate (line 55) | func testCreate(t *testing.T) {
function testCreatePath (line 78) | func testCreatePath(t *testing.T) {
function testCreatePort (line 101) | func testCreatePort(t *testing.T) {
function testCustomPkg (line 122) | func testCustomPkg(t *testing.T) {
function testPackagePriority (line 169) | func testPackagePriority(t *testing.T) {
FILE: tests/e2e/e2e.go
constant IdpbuilderBinaryLocation (line 40) | IdpbuilderBinaryLocation = "../../../idpbuilder"
constant DefaultPort (line 41) | DefaultPort = "8443"
constant DefaultBaseDomain (line 42) | DefaultBaseDomain = "cnoe.localtest.me"
constant ArgoCDSessionEndpoint (line 43) | ArgoCDSessionEndpoint = "/api/v1/session"
constant ArgoCDAppsEndpoint (line 44) | ArgoCDAppsEndpoint = "/api/v1/applications"
constant GiteaSessionEndpoint (line 45) | GiteaSessionEndpoint = "/api/v1/users/%s/tokens"
constant GiteaUserEndpoint (line 46) | GiteaUserEndpoint = "/api/v1/users/%s"
constant GiteaRepoEndpoint (line 47) | GiteaRepoEndpoint = "/api/v1/repos/search"
constant httpRetryDelay (line 49) | httpRetryDelay = 5 * time.Second
constant httpRetryTimeout (line 50) | httpRetryTimeout = 300 * time.Second
type BasicAuth (line 62) | type BasicAuth struct
type ArgoCDAuthResponse (line 67) | type ArgoCDAuthResponse struct
type ArgoCDAppResp (line 71) | type ArgoCDAppResp struct
type GiteaSearchRepoResponse (line 75) | type GiteaSearchRepoResponse struct
function GetHttpClient (line 80) | func GetHttpClient() *http.Client {
function TestCoreEndpoints (line 86) | func TestCoreEndpoints(ctx context.Context, t *testing.T, argoBaseUrl, g...
function RunCommand (line 91) | func RunCommand(ctx context.Context, command string, timeout time.Durati...
function SendAndParse (line 113) | func SendAndParse(ctx context.Context, target any, httpClient *http.Clie...
function TestGiteaEndpoints (line 161) | func TestGiteaEndpoints(ctx context.Context, t *testing.T, baseUrl strin...
function GetGiteaRepos (line 182) | func GetGiteaRepos(ctx context.Context, baseUrl string) ([]gitea.Reposit...
function GetGiteaSessionToken (line 219) | func GetGiteaSessionToken(ctx context.Context, auth BasicAuth, baseUrl s...
function TestArgoCDEndpoints (line 244) | func TestArgoCDEndpoints(ctx context.Context, t *testing.T, baseUrl stri...
function GetBasicAuth (line 264) | func GetBasicAuth(ctx context.Context, name string) (BasicAuth, error) {
function GetArgoCDSessionToken (line 307) | func GetArgoCDSessionToken(ctx context.Context, endpoint string) (string...
function TestArgoCDApps (line 339) | func TestArgoCDApps(ctx context.Context, t *testing.T, kubeClient client...
function isArgoAppSyncedAndHealthy (line 370) | func isArgoAppSyncedAndHealthy(ctx context.Context, kubeClient client.Cl...
function GetKubeClient (line 381) | func GetKubeClient() (client.Client, error) {
function TestGiteaRegistry (line 390) | func TestGiteaRegistry(ctx context.Context, t *testing.T, cmd, giteaHost...
function TestGiteaRegistryInCluster (line 419) | func TestGiteaRegistryInCluster(ctx context.Context, t *testing.T, cmd, ...
Condensed preview — 186 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,479K chars).
[
{
"path": ".devcontainer/devcontainer.json",
"chars": 612,
"preview": "{\n \"image\": \"mcr.microsoft.com/vscode/devcontainers/base:ubuntu\",\n \"features\": {\n \"ghcr.io/devcontainers/features/g"
},
{
"path": ".devcontainer/postCreateCommand.sh",
"chars": 1920,
"preview": "#!/usr/bin/env bash\n\n# For Kubectl AMD64 / x86_64\n[ $(uname -m) = x86_64 ] && curl -sLO \"https://dl.k8s.io/release/$(cur"
},
{
"path": ".devcontainer/postStartCommand.sh",
"chars": 1025,
"preview": "#!/bin/bash\n\n# Import GPG key if both parts are available\nif [ -n \"$GPG_SECRET_KEY_PART1\" ] && [ -n \"$GPG_SECRET_KEY_PAR"
},
{
"path": ".github/CODEOWNERS",
"chars": 1007,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/code-scanner.yaml",
"chars": 798,
"preview": "name: code-scanner\n\non:\n push:\n branches: [ \"main\" ]\n pull_request:\n # The branches below must be a subset of th"
},
{
"path": ".github/workflows/codespell.yaml",
"chars": 739,
"preview": "---\nname: Codespell\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\npermissions:\n contents: rea"
},
{
"path": ".github/workflows/e2e.yaml",
"chars": 1215,
"preview": "name: E2E\n\non:\n push:\n branches:\n - 'main'\n paths:\n - '**.go'\n - 'go.sum'\n - 'go.mod'\n repos"
},
{
"path": ".github/workflows/nightly.yaml",
"chars": 2873,
"preview": "name: nightly\non:\n # This can be used to automatically publish nightlies at UTC nighttime\n schedule:\n - cron: '0 7 "
},
{
"path": ".github/workflows/pr.yaml",
"chars": 618,
"preview": "name: PR\n\non:\n pull_request:\n types: [opened, ready_for_review, synchronize]\n\njobs:\n build:\n runs-on: ubuntu-22."
},
{
"path": ".github/workflows/release.yaml",
"chars": 1763,
"preview": "name: release\non:\n push:\n tags:\n - 'v[0-9]+.[0-9]+.[0-9]+'\n - 'v[0-9]+.[0-9]+.[0-9]+-nightly.[0-9]+'\n\nperm"
},
{
"path": ".github/workflows/slash-commands.yaml",
"chars": 651,
"preview": "name: slash-commands\n\non:\n issue_comment:\n types: [created]\n\njobs:\n slash_command_dispatch:\n runs-on: ubuntu-22."
},
{
"path": ".gitignore",
"chars": 59,
"preview": "idpbuilder\nbin/*\n.DS_Store\ncover.out\n__debug*\n.vscode\n.idea"
},
{
"path": ".goreleaser.yaml",
"chars": 2266,
"preview": "version: 2\nproject_name: idpbuilder\n\nbefore:\n hooks:\n - go mod tidy\nrelease:\n # Mark nightly build as prerelease ba"
},
{
"path": ".pre-commit-config.yaml",
"chars": 417,
"preview": "# For more information, visit: https://pre-commit.com\n# To run locally:\n# 1. Install pre-commit: pip install pre-commit\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 10344,
"preview": "# Contributing guide\n\nWelcome to the project, and thanks for considering contributing to this project. \n\nIf you have any"
},
{
"path": "LICENSE",
"chars": 11341,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Makefile",
"chars": 3670,
"preview": "LD_FLAGS=-ldflags \" \\\n -X github.com/cnoe-io/idpbuilder/pkg/cmd/version.idpbuilderVersion=$(shell git describe --alwa"
},
{
"path": "README.md",
"chars": 3509,
"preview": "[![Codespell][codespell-badge]][codespell-link]\n[![E2E][e2e-badge]][e2e-link]\n[![Go Report Card][report-badge]][report-l"
},
{
"path": "api/v1alpha1/custom_package_types.go",
"chars": 2800,
"preview": "package v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\nconst (\n\tCNOEURIScheme = \"cnoe://\"\n)\n\n// +k"
},
{
"path": "api/v1alpha1/gitrepository_types.go",
"chars": 3300,
"preview": "package v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\nconst (\n\tGitProviderGitea = \"gitea\"\n\tGitP"
},
{
"path": "api/v1alpha1/groupversion_info.go",
"chars": 800,
"preview": "// +kubebuilder:object:generate=true\n// +groupName=idpbuilder.cnoe.io\npackage v1alpha1\n\nimport (\n\t\"k8s.io/apimachinery/p"
},
{
"path": "api/v1alpha1/localbuild_types.go",
"chars": 6023,
"preview": "package v1alpha1\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cnoe-io/idpbuilder/globals\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v"
},
{
"path": "api/v1alpha1/zz_generated.deepcopy.go",
"chars": 17640,
"preview": "//go:build !ignore_autogenerated\n\n/*\nCopyright 2023.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyo"
},
{
"path": "docs/images/source/idpbuilder.excalidraw",
"chars": 62707,
"preview": "{\n \"type\": \"excalidraw\",\n \"version\": 2,\n \"source\": \"https://excalidraw.com\",\n \"elements\": [\n {\n \"type\": \"rec"
},
{
"path": "docs/minimum-requirements.md",
"chars": 151,
"preview": "# Minimum Requirements\n\nThe requirements for your cluster will depend on what it is running but we\nrecommend a minimum o"
},
{
"path": "docs/pluggable-packages.md",
"chars": 15794,
"preview": "# Pluggable and configurable packaging proposal\n\n## Background\n\n`idpbuilder` is a tool that aims to:\n- Allow developers "
},
{
"path": "docs/private-registries.md",
"chars": 420,
"preview": "# Private registry authentication\n\nidpbuilder can be configured to use private registry authentication from the\nhost fil"
},
{
"path": "globals/project.go",
"chars": 480,
"preview": "package globals\n\nimport \"fmt\"\n\nconst (\n\tProjectName string = \"idpbuilder\"\n\n\tNginxNamespace string = \"ingress-nginx\"\n\tAr"
},
{
"path": "go.mod",
"chars": 6101,
"preview": "module github.com/cnoe-io/idpbuilder\n\ngo 1.22.0\n\ntoolchain go1.24.7\n\nrequire (\n\tcode.gitea.io/sdk/gitea v0.16.0\n\tgithub."
},
{
"path": "go.sum",
"chars": 35647,
"preview": "al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=\nal.essio.dev/pkg/shellescape v1.5.1/"
},
{
"path": "hack/argo-cd/argocd-application-controller.yaml",
"chars": 380,
"preview": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n labels:\n app.kubernetes.io/component: application-controller\n ap"
},
{
"path": "hack/argo-cd/argocd-applicationset-controller.yaml",
"chars": 386,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n labels:\n app.kubernetes.io/component: applicationset-controller\n "
},
{
"path": "hack/argo-cd/argocd-cm.yaml",
"chars": 279,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: argocd-cm\ndata:\n application.resourceTrackingMethod: annotation\n acco"
},
{
"path": "hack/argo-cd/argocd-rbac-dev.yaml",
"chars": 168,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: argocd-rbac-cm\ndata:\n policy.csv: |\n p, role:developer, application"
},
{
"path": "hack/argo-cd/argocd-redis.yaml",
"chars": 304,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n labels:\n app.kubernetes.io/component: redis\n app.kubernetes.io/na"
},
{
"path": "hack/argo-cd/argocd-repo-server.yaml",
"chars": 335,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n labels:\n app.kubernetes.io/component: repo-server\n app.kubernetes"
},
{
"path": "hack/argo-cd/argocd-server.yaml",
"chars": 644,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n labels:\n app.kubernetes.io/component: server\n app.kubernetes.io/n"
},
{
"path": "hack/argo-cd/argocd-tls-certs-cm.yaml.tmpl",
"chars": 301,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: argocd-tls-certs-cm\n labels:\n app.kubernetes.io/name: argocd-tls-ce"
},
{
"path": "hack/argo-cd/dex-server.yaml",
"chars": 280,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: argocd-dex-server\nspec:\n replicas: 0\n template:\n spec:\n "
},
{
"path": "hack/argo-cd/generate-manifests.sh",
"chars": 413,
"preview": "#!/bin/bash\n\nINSTALL_YAML=\"pkg/controllers/localbuild/resources/argo/install.yaml\"\nINGRESS_YAML=\"pkg/controllers/localbu"
},
{
"path": "hack/argo-cd/ingress.yaml.tmpl",
"chars": 1765,
"preview": "{{- if .UsePathRouting -}}\n---\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: argocd-server-ingress-ht"
},
{
"path": "hack/argo-cd/kustomization.yaml",
"chars": 516,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - https://raw.githubusercontent.com/argopro"
},
{
"path": "hack/argo-cd/notifications-controller.yaml",
"chars": 235,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: argocd-notifications-controller\nspec:\n replicas: 0\n template:\n "
},
{
"path": "hack/boilerplate.go.txt",
"chars": 546,
"preview": "/*\nCopyright 2023.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in "
},
{
"path": "hack/embedded-resources.sh",
"chars": 248,
"preview": "#!/bin/bash\n\nDIRECTORIES='argo-cd gitea ingress-nginx'\n\nfor dir in $DIRECTORIES; do\n ./hack/$dir/generate-manifests.s"
},
{
"path": "hack/gitea/generate-manifests.sh",
"chars": 1110,
"preview": "#!/bin/bash\nset -e\n\nINSTALL_YAML=\"pkg/controllers/localbuild/resources/gitea/k8s/install.yaml\"\nGITEA_DIR=\"./hack/gitea\"\n"
},
{
"path": "hack/gitea/ingress.yaml.tmpl",
"chars": 3328,
"preview": "{{- if .UsePathRouting }}\n---\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-gitea-path-oci-root\n "
},
{
"path": "hack/gitea/values.yaml",
"chars": 1201,
"preview": "valkey-cluster:\n enabled: false\npostgresql:\n enabled: false\npostgresql-ha:\n enabled: false\n\npersistence:\n enabled: t"
},
{
"path": "hack/ingress-nginx/cm-ingress-nginx-controller.yaml",
"chars": 235,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: ingress-nginx-controller\n namespace: ingress-nginx\ndata:\n allow-snipp"
},
{
"path": "hack/ingress-nginx/deployment-ingress-nginx.yaml",
"chars": 1458,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: ingress-nginx-controller\n namespace: ingress-nginx\nspec:\n strat"
},
{
"path": "hack/ingress-nginx/generate-manifests.sh",
"chars": 409,
"preview": "#!/bin/bash\n\nINSTALL_YAML=\"pkg/controllers/localbuild/resources/nginx/k8s/ingress-nginx.yaml\"\nNGINX_DIR=\"./hack/ingress-"
},
{
"path": "hack/ingress-nginx/kustomization.yaml",
"chars": 1072,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - https://raw.githubusercontent.com/kuberne"
},
{
"path": "hack/ingress-nginx/service-ingress-nginx.yaml.tmpl",
"chars": 913,
"preview": "---\napiVersion: v1\nkind: Service\nmetadata:\n labels:\n app.kubernetes.io/component: controller\n app.kubernetes.io/i"
},
{
"path": "hack/install.sh",
"chars": 831,
"preview": "#!/bin/bash\n\nset -e -o pipefail\n# get the latest stable release by look for tag name pattern like 'v*.*.*'. For example"
},
{
"path": "main.go",
"chars": 472,
"preview": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/cnoe-io/idpbuilder/pkg/cmd\"\n)\n\nfunc"
},
{
"path": "pkg/build/build.go",
"chars": 8648,
"preview": "package build\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"githu"
},
{
"path": "pkg/build/build_test.go",
"chars": 1740,
"preview": "package build\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/stretchr/testi"
},
{
"path": "pkg/build/coredns.go",
"chars": 1879,
"preview": "package build\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"fmt\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/i"
},
{
"path": "pkg/build/templates/coredns/cm-coredns-custom.yaml",
"chars": 148,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: coredns-conf-custom\n namespace: kube-system\ndata:\n custom.conf: |\n "
},
{
"path": "pkg/build/templates/coredns/cm-coredns-default.yaml.tmpl",
"chars": 734,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: coredns-conf-default\n namespace: kube-system\ndata:\n default.conf: |\n "
},
{
"path": "pkg/build/templates/coredns/cm-coredns.yaml",
"chars": 564,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: coredns\n namespace: kube-system\ndata:\n Corefile: |\n .:53 {\n "
},
{
"path": "pkg/build/templates/coredns/deployment-coredns.yaml",
"chars": 3502,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n labels:\n k8s-app: kube-dns\n name: coredns\n namespace: kube-system\n"
},
{
"path": "pkg/build/tls.go",
"chars": 6528,
"preview": "package build\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/x509\"\n\t\"crypto/x5"
},
{
"path": "pkg/build/tls_test.go",
"chars": 2771,
"preview": "package build\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuil"
},
{
"path": "pkg/cmd/create/root.go",
"chars": 11635,
"preview": "package create\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/cnoe-io/idpbuilder"
},
{
"path": "pkg/cmd/create/root_test.go",
"chars": 3170,
"preview": "package create\n\nimport (\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n)\n\nfunc TestParseRegistryMirrors(t *t"
},
{
"path": "pkg/cmd/delete/root.go",
"chars": 1128,
"preview": "package delete\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/cnoe-io/idpbuilder/pkg/cmd/helpers\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/ki"
},
{
"path": "pkg/cmd/get/clusters.go",
"chars": 8863,
"preview": "package get\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/idpbuilder/pk"
},
{
"path": "pkg/cmd/get/packages.go",
"chars": 4168,
"preview": "package get\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/idpbuilder/pk"
},
{
"path": "pkg/cmd/get/root.go",
"chars": 837,
"preview": "package get\n\nimport (\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar GetCmd = &cobra."
},
{
"path": "pkg/cmd/get/secrets.go",
"chars": 5412,
"preview": "package get\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/idpbuilder/pk"
},
{
"path": "pkg/cmd/get/secrets_test.go",
"chars": 6989,
"preview": "package get\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha"
},
{
"path": "pkg/cmd/helpers/logger.go",
"chars": 1474,
"preview": "package helpers\n\nimport (\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/cnoe-io/idpbuilder/pkg/logger\"\n\t\"github.com/"
},
{
"path": "pkg/cmd/helpers/test-data/notk8s.yaml",
"chars": 29,
"preview": "name: me\npluto: not a planet\n"
},
{
"path": "pkg/cmd/helpers/test-data/notyaml.yaml",
"chars": 12,
"preview": "not:\na\nyaml\n"
},
{
"path": "pkg/cmd/helpers/test-data/valid.yaml",
"chars": 712,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: nginx-deployment\n labels:\n app: nginx\nspec:\n replicas: 3\n s"
},
{
"path": "pkg/cmd/helpers/validation.go",
"chars": 2296,
"preview": "package helpers\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/cnoe-io/idpbuilder/pkg/util\"\n\t\"sigs.k8s.io/kustomi"
},
{
"path": "pkg/cmd/helpers/validation_test.go",
"chars": 2501,
"preview": "package helpers\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestValidateKubernetesY"
},
{
"path": "pkg/cmd/root.go",
"chars": 923,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/cnoe-io/idpbuilder/pkg/cmd/create\"\n\t\"github.com/cnoe-io/idpb"
},
{
"path": "pkg/cmd/version/root.go",
"chars": 2598,
"preview": "package version\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"runtime\"\n\n\t\"github.com/spf13/cobra\"\n\t\"sigs.k8s.io/yaml\"\n)\n\nvar (\n\t//"
},
{
"path": "pkg/controllers/crd.go",
"chars": 2793,
"preview": "package controllers\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util/fs\"\n\t\"time\"\n\n\t\"github."
},
{
"path": "pkg/controllers/custompackage/controller.go",
"chars": 24380,
"preview": "package custompackage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\targocdapp"
},
{
"path": "pkg/controllers/custompackage/controller_test.go",
"chars": 25481,
"preview": "package custompackage\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\t\"t"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/generator-matrix.yaml",
"chars": 810,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: ApplicationSet\nmetadata:\n name: generator-matrix\n namespace: argocd\nspec:\n goT"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/generator-multi-sources.yaml",
"chars": 619,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: ApplicationSet\nmetadata:\n name: generator-multi-sources\n namespace: argocd\nspec"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/generator-single-source.yaml",
"chars": 612,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: ApplicationSet\nmetadata:\n name: generator-single-source\n namespace: argocd\nspec"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/no-generator-single-source.yaml",
"chars": 525,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: ApplicationSet\nmetadata:\n name: no-generator-single-source\n namespace: argocd\ns"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/test1/apps/guestbook/guestbook-ui-deployment.yaml",
"chars": 389,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: guestbook-ui\nspec:\n replicas: 1\n revisionHistoryLimit: 3\n sele"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/test1/apps/guestbook/guestbook-ui-svc.yaml",
"chars": 150,
"preview": "apiVersion: v1\t\nkind: Service\t\nmetadata:\t\n name: guestbook-ui\t\nspec:\t\n ports:\t\n - port: 80\t\n targetPort: 80\t\n sel"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/test1/apps/guestbook/kustomization.yaml",
"chars": 154,
"preview": "namePrefix: kustomize-\n\nresources:\n- guestbook-ui-deployment.yaml\n- guestbook-ui-svc.yaml\napiVersion: kustomize.config.k"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/test1/apps/guestbook2/guestbook-ui-deployment.yaml",
"chars": 389,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: guestbook-ui\nspec:\n replicas: 1\n revisionHistoryLimit: 3\n sele"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/test1/apps/guestbook2/guestbook-ui-svc.yaml",
"chars": 150,
"preview": "apiVersion: v1\t\nkind: Service\t\nmetadata:\t\n name: guestbook-ui\t\nspec:\t\n ports:\t\n - port: 80\t\n targetPort: 80\t\n sel"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/applicationSet/test1/apps/guestbook2/kustomization.yaml",
"chars": 154,
"preview": "namePrefix: kustomize-\n\nresources:\n- guestbook-ui-deployment.yaml\n- guestbook-ui-svc.yaml\napiVersion: kustomize.config.k"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/helm/app.yaml",
"chars": 495,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: my-app-helm\n namespace: argocd\nspec:\n destination"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/helm/test/Chart.yaml",
"chars": 1140,
"preview": "apiVersion: v2\nname: test\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a 'libra"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/helm/test/templates/cm.yaml",
"chars": 77,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: config\ndata:\n test1: \"one\"\n"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/helm/test/values.yaml",
"chars": 12,
"preview": "some: value\n"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir/app.yaml",
"chars": 373,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: my-app\n namespace: argocd\nspec:\n destination:\n "
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir/app1/cm.yaml",
"chars": 77,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: config\ndata:\n test1: \"one\"\n"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir/app2/one/cm.yaml",
"chars": 81,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: one-config\ndata:\n test1: \"one\"\n"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir/app2/two/cm.yaml",
"chars": 81,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: two-config\ndata:\n test1: \"one\"\n"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir/app2.yaml",
"chars": 456,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: my-app2\n namespace: argocd\nspec:\n destination:\n "
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir2/exampleApp.yaml",
"chars": 387,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: guestbook\n namespace: argocd\nspec:\n project: defa"
},
{
"path": "pkg/controllers/custompackage/test/resources/customPackages/testDir2/exampleApp2.yaml",
"chars": 389,
"preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: guestbook2\n namespace: argocd\nspec:\n project: def"
},
{
"path": "pkg/controllers/doc.go",
"chars": 20,
"preview": "package controllers\n"
},
{
"path": "pkg/controllers/gitrepository/controller.go",
"chars": 11479,
"preview": "package gitrepository\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"code.gitea.io/sdk/gitea\"\n\t\"git"
},
{
"path": "pkg/controllers/gitrepository/controller_test.go",
"chars": 12505,
"preview": "package gitrepository\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/cnoe"
},
{
"path": "pkg/controllers/gitrepository/git_repository.go",
"chars": 1953,
"preview": "package gitrepository\n\nimport (\n\t\"context\"\n\n\t\"code.gitea.io/sdk/gitea\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"g"
},
{
"path": "pkg/controllers/gitrepository/gitea.go",
"chars": 5284,
"preview": "package gitrepository\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util/files\"\n\t\"os\"\n\t\"path/filepath\""
},
{
"path": "pkg/controllers/gitrepository/github.go",
"chars": 3429,
"preview": "package gitrepository\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.co"
},
{
"path": "pkg/controllers/gitrepository/github_test.go",
"chars": 4981,
"preview": "package gitrepository\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n"
},
{
"path": "pkg/controllers/gitrepository/test/resources/file1",
"chars": 5,
"preview": "hello"
},
{
"path": "pkg/controllers/localbuild/argo.go",
"chars": 1621,
"preview": "package localbuild\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/idpb"
},
{
"path": "pkg/controllers/localbuild/argo_test.go",
"chars": 5975,
"preview": "package localbuild\n\nimport (\n\t\"context\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util/fs\"\n\t\"testing\"\n\n\targov1alpha1 \"github.c"
},
{
"path": "pkg/controllers/localbuild/controller.go",
"chars": 30799,
"preview": "package localbuild\n\nimport (\n\t\"bytes\"\n\t\"code.gitea.io/sdk/gitea\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"k8s.io/apima"
},
{
"path": "pkg/controllers/localbuild/gitea.go",
"chars": 4649,
"preview": "package localbuild\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/k8s\"\n\t\"ne"
},
{
"path": "pkg/controllers/localbuild/gitea_test.go",
"chars": 465,
"preview": "package localbuild\n\nimport (\n\t\"context\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"tes"
},
{
"path": "pkg/controllers/localbuild/installer.go",
"chars": 4156,
"preview": "package localbuild\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v"
},
{
"path": "pkg/controllers/localbuild/nginx.go",
"chars": 1410,
"preview": "package localbuild\n\nimport (\n\t\"context\"\n\t\"embed\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/idp"
},
{
"path": "pkg/controllers/localbuild/resources/argo/ingress.yaml",
"chars": 1765,
"preview": "{{- if .UsePathRouting -}}\n---\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: argocd-server-ingress-ht"
},
{
"path": "pkg/controllers/localbuild/resources/argo/install.yaml",
"chars": 1458927,
"preview": "# UCP ARGO INSTALL RESOURCES\n# This file is auto-generated with 'hack/argo-cd/generate-manifests.sh'\napiVersion: apiexte"
},
{
"path": "pkg/controllers/localbuild/resources/gitea/k8s/install.yaml",
"chars": 22800,
"preview": "# GITEA INSTALL RESOURCES\n# This file is auto-generated with 'hack/gitea/generate-manifests.sh'\n# Source: gitea/template"
},
{
"path": "pkg/controllers/localbuild/resources/nginx/k8s/ingress-nginx.yaml",
"chars": 17077,
"preview": "# INGRESS-NGINX INSTALL RESOURCES\n# This file is auto-generated with 'hack/ingress-nginx/generate-manifests.sh'\napiVersi"
},
{
"path": "pkg/controllers/resources/idpbuilder.cnoe.io_custompackages.yaml",
"chars": 5128,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "pkg/controllers/resources/idpbuilder.cnoe.io_gitrepositories.yaml",
"chars": 6231,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "pkg/controllers/resources/idpbuilder.cnoe.io_localbuilds.yaml",
"chars": 6295,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "pkg/controllers/run.go",
"chars": 1938,
"preview": "package controllers\n\nimport (\n\t\"context\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/cnoe-io/idpbuilder/"
},
{
"path": "pkg/k8s/client.go",
"chars": 1495,
"preview": "package k8s\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tk8serrors \"k8s.io/apimachinery/pkg/api/errors\"\n\tme"
},
{
"path": "pkg/k8s/deserialize.go",
"chars": 3786,
"preview": "package k8s\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/serializer\"\n"
},
{
"path": "pkg/k8s/deserialize_test.go",
"chars": 1794,
"preview": "package k8s\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\tappsv1 \"k8s.io/api/apps/v1\"\n\tmetav1 \"k8s.io/apimachin"
},
{
"path": "pkg/k8s/schema.go",
"chars": 884,
"preview": "package k8s\n\nimport (\n\targov1alpha1 \"github.com/cnoe-io/argocd-api/api/argo/application/v1alpha1\"\n\t\"github.com/cnoe-io/i"
},
{
"path": "pkg/k8s/test-resources/input/argocd/install.yaml",
"chars": 1101663,
"preview": "# UCP ARGO INSTALL RESOURCES\n# This file is auto-generated with 'hack/argo-cd/generate-manifests.sh'\napiVersion: apiexte"
},
{
"path": "pkg/k8s/test-resources/input/argocd-cm.yaml",
"chars": 314,
"preview": "apiVersion: v1\ndata:\n application.resourceTrackingMethod: annotation\n resource.exclusions: |\n - kinds:\n - Pr"
},
{
"path": "pkg/k8s/test-resources/input/extra.yaml",
"chars": 626,
"preview": "apiVersion: v1\nstringData:\n test: data\nkind: Secret\nmetadata:\n labels:\n Test: Data\n name: secret-one\n---\napiVersio"
},
{
"path": "pkg/k8s/test-resources/input/extra.yaml.tmpl",
"chars": 932,
"preview": "apiVersion: v1\nstringData:\n test: data\nkind: Secret\nmetadata:\n labels:\n Test: Data\n name: secret-one\n---\napiVersio"
},
{
"path": "pkg/k8s/test-resources/input/nginx/install.yaml",
"chars": 16978,
"preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n labels:\n app.kubernetes.io/instance: ingress-nginx\n app.kubernetes.io/n"
},
{
"path": "pkg/k8s/test-resources/output/argocd/install.yaml",
"chars": 1101576,
"preview": "# UCP ARGO INSTALL RESOURCES\n# This file is auto-generated with 'hack/argo-cd/generate-manifests.sh'\napiVersion: apiexte"
},
{
"path": "pkg/k8s/test-resources/output/nginx/install-tmpl.yaml",
"chars": 16954,
"preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n labels:\n app.kubernetes.io/instance: ingress-nginx\n app.kubernetes.io/n"
},
{
"path": "pkg/k8s/test-resources/output/nginx/install.yaml",
"chars": 16954,
"preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n labels:\n app.kubernetes.io/instance: ingress-nginx\n app.kubernetes.io/n"
},
{
"path": "pkg/k8s/util.go",
"chars": 1539,
"preview": "package k8s\n\nimport (\n\t\"embed\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util/files\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util/"
},
{
"path": "pkg/k8s/util_test.go",
"chars": 1896,
"preview": "package k8s\n\nimport (\n\t\"bytes\"\n\t\"embed\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/str"
},
{
"path": "pkg/kind/cluster.go",
"chars": 8548,
"preview": "package kind\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util\"\n\t\"github.com/cnoe-io/idpbui"
},
{
"path": "pkg/kind/cluster_test.go",
"chars": 6555,
"preview": "package kind\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/doc"
},
{
"path": "pkg/kind/config.go",
"chars": 4473,
"preview": "package kind\n\nimport (\n\t\"embed\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/cnoe-io/idpbuilder"
},
{
"path": "pkg/kind/config_integration_test.go",
"chars": 8119,
"preview": "package kind\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n)\n\nfu"
},
{
"path": "pkg/kind/config_test.go",
"chars": 7357,
"preview": "package kind\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"io/fs\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"g"
},
{
"path": "pkg/kind/kindlogger.go",
"chars": 1830,
"preview": "package kind\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-logr/logr\"\n\tkindlog \"sigs.k8s.io/kind/pkg/log\"\n)\n\n// this is a wrapper of"
},
{
"path": "pkg/kind/resources/hosts-mirror.toml.tmpl",
"chars": 170,
"preview": "server = \"{{ .RegistryAddress }}\"\n\n[host.\"{{ .RegistryAddress }}\"]\n capabilities = [\"pull\", \"resolve\"]\n{{- if .Insecure"
},
{
"path": "pkg/kind/resources/hosts.toml.tmpl",
"chars": 323,
"preview": "{{ if .UsePathRouting -}}\nserver = \"https://{{ .Host }}:{{ .Port }}\"\n\n[host.\"https://{{ .Host }}\"]\n capabilities = [\"pu"
},
{
"path": "pkg/kind/resources/kind.yaml.tmpl",
"chars": 925,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n- role: control-plane\n image: \"kindest/node:{{ .KubernetesVersi"
},
{
"path": "pkg/kind/testdata/custom-kind.yaml.tmpl",
"chars": 1067,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n- role: control-plane\n image: \"kindest/node:{{ .KubernetesVersi"
},
{
"path": "pkg/kind/testdata/empty.json",
"chars": 0,
"preview": ""
},
{
"path": "pkg/kind/testdata/expected/label-only.yaml",
"chars": 447,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnetworking: {}\nnodes:\n - role: control-plane\n extraPortMappings:\n "
},
{
"path": "pkg/kind/testdata/expected/no-port-multi.yaml",
"chars": 423,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnetworking: {}\nnodes:\n - role: control-plane\n labels:\n ingress"
},
{
"path": "pkg/kind/testdata/expected/no-port.yaml",
"chars": 498,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnetworking: {}\nnodes:\n - role: control-plane\n labels:\n ingress"
},
{
"path": "pkg/kind/testdata/expected/port-only.yaml",
"chars": 426,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnetworking: {}\nnodes:\n - role: control-plane\n extraPortMappings:\n "
},
{
"path": "pkg/kind/testdata/label-only.yaml",
"chars": 336,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n - role: control-plane\n extraPortMappings:\n - container"
},
{
"path": "pkg/kind/testdata/no-node.yaml",
"chars": 49,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\n"
},
{
"path": "pkg/kind/testdata/no-port-multi.yaml",
"chars": 296,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n - role: control-plane\n extraPortMappings:\n - container"
},
{
"path": "pkg/kind/testdata/no-port.yaml",
"chars": 371,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n - role: control-plane\n extraMounts:\n - containerPath: "
},
{
"path": "pkg/kind/testdata/port-only.yaml",
"chars": 371,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n - role: control-plane\n extraPortMappings:\n - container"
},
{
"path": "pkg/logger/handler.go",
"chars": 5182,
"preview": "package logger\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"runtime\"\n\t\"slices\"\n\t\"sync\"\n\t\"time\"\n)\n\n// https://en.wikip"
},
{
"path": "pkg/printer/cluster.go",
"chars": 1467,
"preview": "package printer\n\nimport (\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/printer/types\"\n\t\"io\"\n\tmetav1 \"k8s.io/apimachinery/p"
},
{
"path": "pkg/printer/package.go",
"chars": 1200,
"preview": "package printer\n\nimport (\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/printer/types\"\n\t\"io\"\n\tmetav1 \"k8s.io/apimachinery/p"
},
{
"path": "pkg/printer/printer.go",
"chars": 674,
"preview": "package printer\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/cli-runtime/pkg"
},
{
"path": "pkg/printer/secret.go",
"chars": 1471,
"preview": "package printer\n\nimport (\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/printer/types\"\n\t\"io\"\n\tmetav1 \"k8s.io/apimachinery/p"
},
{
"path": "pkg/printer/types/internal_types.go",
"chars": 1011,
"preview": "package types\n\n// Types used internally to define the objects needed to print data, etc\n\ntype Allocated struct {\n\tCpu "
},
{
"path": "pkg/resources/localbuild/application.go",
"chars": 1320,
"preview": "package localbuild\n\nimport (\n\targov1alpha1 \"github.com/cnoe-io/argocd-api/api/argo/application/v1alpha1\"\n\tv1 \"k8s.io/api"
},
{
"path": "pkg/util/argocd.go",
"chars": 924,
"preview": "package util\n\nimport (\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io"
},
{
"path": "pkg/util/files/files.go",
"chars": 2281,
"preview": "package files\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"text/template\"\n)\n\nfunc CopyDirectory(s"
},
{
"path": "pkg/util/fs/fs.go",
"chars": 2387,
"preview": "package fs\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/util/files\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path\"\n\t\"pat"
},
{
"path": "pkg/util/fs/fs_test.go",
"chars": 1625,
"preview": "package fs\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"testing/fstest\"\n\n\t\"github.com/cnoe-io/idpbuilde"
},
{
"path": "pkg/util/git_repository.go",
"chars": 6787,
"preview": "package util\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"path/filepath\"\n\t\"st"
},
{
"path": "pkg/util/git_repository_test.go",
"chars": 3290,
"preview": "package util\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1al"
},
{
"path": "pkg/util/gitea.go",
"chars": 3614,
"preview": "package util\n\nimport (\n\t\"code.gitea.io/sdk/gitea\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/a"
},
{
"path": "pkg/util/gitea_test.go",
"chars": 507,
"preview": "package util\n\nimport (\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/stretchr/testify/assert\"\n)"
},
{
"path": "pkg/util/idp.go",
"chars": 889,
"preview": "package util\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"sigs.k8s.io/controller-runtime/"
},
{
"path": "pkg/util/k8s.go",
"chars": 1191,
"preview": "package util\n\nimport (\n\t\"fmt\"\n\t\"github.com/cnoe-io/idpbuilder/pkg/k8s\"\n\t\"k8s.io/client-go/rest\"\n\t\"k8s.io/client-go/tools"
},
{
"path": "pkg/util/secret.go",
"chars": 313,
"preview": "package util\n\nimport (\n\t\"context\"\n\tv1 \"k8s.io/api/core/v1\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\nfunc GetSecre"
},
{
"path": "pkg/util/url.go",
"chars": 4141,
"preview": "package util\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// constants from remote target parameters sup"
},
{
"path": "pkg/util/url_test.go",
"chars": 1861,
"preview": "package util\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestURLParse(t *testing.T) {\n\n\t"
},
{
"path": "pkg/util/util.go",
"chars": 5536,
"preview": "package util\n\nimport (\n\t\"context\"\n\t\"crypto/rand\"\n\t\"crypto/tls\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\tmathrand \"math/rand\"\n\t\"net\"\n\t"
},
{
"path": "pkg/util/util_test.go",
"chars": 3292,
"preview": "package util\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/cnoe-io/idpbuilder/api/v1alpha1\"\n\t\"github.com/stretchr/testif"
},
{
"path": "tests/e2e/docker/docker_test.go",
"chars": 8203,
"preview": "//go:build e2e\n\npackage docker\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t"
},
{
"path": "tests/e2e/docker/test-dockerfile",
"chars": 36,
"preview": "FROM scratch\nCOPY test-dockerfile .\n"
},
{
"path": "tests/e2e/e2e.go",
"chars": 13647,
"preview": "//go:build e2e\n\npackage e2e\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os/e"
}
]
About this extraction
This page contains the full source code of the cnoe-io/idpbuilder GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 186 files (4.1 MB), approximately 1.1M tokens, and a symbol index with 657 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.