From 2b61491b0a6b28df4a12bc25890ab1d0e0687ec0 Mon Sep 17 00:00:00 2001 From: Paul Payne Date: Sat, 7 Jun 2025 11:38:22 -0700 Subject: [PATCH] Add wild-app-fetch, wild-app-config, and wild-app-deploy scripts; update README with app workflow --- bin/{wild-app-add => wild-app-config} | 29 +++++----- bin/wild-app-deploy | 52 ++++++++++++++++++ bin/wild-app-fetch | 78 +++++++++++++++++++++++++++ bin/wild-app-install | 12 ----- my-templates/apps/README.md | 31 ++++++++--- 5 files changed, 167 insertions(+), 35 deletions(-) rename bin/{wild-app-add => wild-app-config} (68%) create mode 100755 bin/wild-app-deploy create mode 100755 bin/wild-app-fetch delete mode 100755 bin/wild-app-install diff --git a/bin/wild-app-add b/bin/wild-app-config similarity index 68% rename from bin/wild-app-add rename to bin/wild-app-config index e7a9cbe..f98926d 100755 --- a/bin/wild-app-add +++ b/bin/wild-app-config @@ -21,17 +21,12 @@ if [ ! -f ".wildcloud/config.yaml" ]; then exit 1 fi -WILDCLOUD_REPO=$(yq eval '.wildcloud.repository' .wildcloud/config.yaml) +CACHE_APP_DIR=".wildcloud/cache/apps/${APP_NAME}" -if [ -z "${WILDCLOUD_REPO}" ] || [ "${WILDCLOUD_REPO}" = "null" ]; then - echo "Error: wildcloud.config not found in .wildcloud/config.yaml" - exit 1 -fi - -SOURCE_APP_DIR="${WILDCLOUD_REPO}/apps/${APP_NAME}" -if [ ! -d "${SOURCE_APP_DIR}" ]; then - echo "Error: App '${APP_NAME}' not found at ${SOURCE_APP_DIR}" - exit 1 +# Check if app is cached, if not fetch it first +if [ ! -d "${CACHE_APP_DIR}" ]; then + echo "App '${APP_NAME}' not found in cache, fetching..." + ./bin/wild-app-fetch "${APP_NAME}" fi DEST_APP_DIR="apps/${APP_NAME}" @@ -42,13 +37,13 @@ if [ -d "${DEST_APP_DIR}" ]; then read -p "Do you want to overwrite it? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "Installation cancelled" + echo "Pull cancelled" exit 1 fi rm -rf "${DEST_APP_DIR}" fi -echo "Copying app '${APP_NAME}' from ${SOURCE_APP_DIR} to ${DEST_APP_DIR}" +echo "Pulling app '${APP_NAME}' from cache to ${DEST_APP_DIR}" # Function to process a file with gomplate if it's a YAML file process_file() { @@ -67,16 +62,16 @@ process_file() { mkdir -p "${DEST_APP_DIR}" # Copy directory structure and process files -find "${SOURCE_APP_DIR}" -type d | while read -r src_dir; do - rel_path="${src_dir#${SOURCE_APP_DIR}}" +find "${CACHE_APP_DIR}" -type d | while read -r src_dir; do + rel_path="${src_dir#${CACHE_APP_DIR}}" rel_path="${rel_path#/}" # Remove leading slash if present if [ -n "${rel_path}" ]; then mkdir -p "${DEST_APP_DIR}/${rel_path}" fi done -find "${SOURCE_APP_DIR}" -type f | while read -r src_file; do - rel_path="${src_file#${SOURCE_APP_DIR}}" +find "${CACHE_APP_DIR}" -type f | while read -r src_file; do + rel_path="${src_file#${CACHE_APP_DIR}}" rel_path="${rel_path#/}" # Remove leading slash if present dest_file="${DEST_APP_DIR}/${rel_path}" @@ -87,4 +82,4 @@ find "${SOURCE_APP_DIR}" -type f | while read -r src_file; do process_file "${src_file}" "${dest_file}" done -echo "Successfully installed app '${APP_NAME}' with template processing" \ No newline at end of file +echo "Successfully pulled app '${APP_NAME}' with template processing" \ No newline at end of file diff --git a/bin/wild-app-deploy b/bin/wild-app-deploy new file mode 100755 index 0000000..1f15502 --- /dev/null +++ b/bin/wild-app-deploy @@ -0,0 +1,52 @@ +#!/bin/bash + +set -e + +FORCE=false + +# Parse arguments +while [[ $# -gt 0 ]]; do + case $1 in + --force) + FORCE=true + shift + ;; + --dry-run) + DRY_RUN="--dry-run=client" + shift + ;; + -*) + echo "Unknown option $1" + echo "Usage: $0 [--force] [--dry-run]" + exit 1 + ;; + *) + if [ -z "${APP_NAME}" ]; then + APP_NAME="$1" + else + echo "Too many arguments" + echo "Usage: $0 [--force] [--dry-run]" + exit 1 + fi + shift + ;; + esac +done + +if [ -z "${APP_NAME}" ]; then + echo "Usage: $0 [--force] [--dry-run]" + exit 1 +fi + +if [ ! -d "apps/${APP_NAME}" ]; then + echo "Error: App directory 'apps/${APP_NAME}' not found" + exit 1 +fi + +if [ "${FORCE}" = true ]; then + echo "Force deploying app '${APP_NAME}'" + kubectl replace --force -k "apps/${APP_NAME}" ${DRY_RUN:-} +else + echo "Deploying app '${APP_NAME}'" + kubectl apply -k "apps/${APP_NAME}" ${DRY_RUN:-} +fi diff --git a/bin/wild-app-fetch b/bin/wild-app-fetch new file mode 100755 index 0000000..f2414cc --- /dev/null +++ b/bin/wild-app-fetch @@ -0,0 +1,78 @@ +#!/bin/bash + +set -e +set -o pipefail + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +APP_NAME="$1" + +if [ ! -d ".wildcloud" ]; then + echo "Error: .wildcloud directory not found in current directory" + echo "This script must be run from a directory that contains a .wildcloud directory" + exit 1 +fi + +if [ ! -f ".wildcloud/config.yaml" ]; then + echo "Error: .wildcloud/config.yaml not found" + exit 1 +fi + +WILDCLOUD_REPO=$(yq eval '.wildcloud.repository' .wildcloud/config.yaml) + +if [ -z "${WILDCLOUD_REPO}" ] || [ "${WILDCLOUD_REPO}" = "null" ]; then + echo "Error: wildcloud.config not found in .wildcloud/config.yaml" + exit 1 +fi + +SOURCE_APP_DIR="${WILDCLOUD_REPO}/apps/${APP_NAME}" +if [ ! -d "${SOURCE_APP_DIR}" ]; then + echo "Error: App '${APP_NAME}' not found at ${SOURCE_APP_DIR}" + exit 1 +fi + +CACHE_APP_DIR=".wildcloud/cache/apps/${APP_NAME}" +mkdir -p ".wildcloud/cache/apps" + +if [ -d "${CACHE_APP_DIR}" ]; then + echo "Warning: Cache directory ${CACHE_APP_DIR} already exists" + read -p "Do you want to overwrite it? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Fetch cancelled" + exit 1 + fi + rm -rf "${CACHE_APP_DIR}" +fi + +echo "Fetching app '${APP_NAME}' from ${SOURCE_APP_DIR} to ${CACHE_APP_DIR}" + +# Create destination directory +mkdir -p "${CACHE_APP_DIR}" + +# Copy directory structure and files (no template processing) +find "${SOURCE_APP_DIR}" -type d | while read -r src_dir; do + rel_path="${src_dir#${SOURCE_APP_DIR}}" + rel_path="${rel_path#/}" # Remove leading slash if present + if [ -n "${rel_path}" ]; then + mkdir -p "${CACHE_APP_DIR}/${rel_path}" + fi +done + +find "${SOURCE_APP_DIR}" -type f | while read -r src_file; do + rel_path="${src_file#${SOURCE_APP_DIR}}" + rel_path="${rel_path#/}" # Remove leading slash if present + dest_file="${CACHE_APP_DIR}/${rel_path}" + + # Ensure destination directory exists + dest_dir=$(dirname "${dest_file}") + mkdir -p "${dest_dir}" + + # Simple copy without template processing + cp "${src_file}" "${dest_file}" +done + +echo "Successfully fetched app '${APP_NAME}' to cache" \ No newline at end of file diff --git a/bin/wild-app-install b/bin/wild-app-install deleted file mode 100755 index 2a355f1..0000000 --- a/bin/wild-app-install +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e - -if [ $# -ne 1 ]; then - echo "Usage: $0 " - exit 1 -fi - -APP_NAME="$1" - -kubectl apply -k "apps/${APP_NAME}" diff --git a/my-templates/apps/README.md b/my-templates/apps/README.md index e4503f8..8891d9a 100644 --- a/my-templates/apps/README.md +++ b/my-templates/apps/README.md @@ -10,20 +10,39 @@ To list all available apps: wild-cloud-app-list ``` -To add a new app: +### App Workflow + +The Wild-cloud app workflow consists of three steps: + +1. **Fetch** - Download raw app templates to cache +2. **Config** - Apply your local configuration to templates +3. **Deploy** - Deploy configured app to Kubernetes + +### Commands + +To fetch an app template to cache: ```bash -wild-cloud-add +wild-app-fetch ``` -To install the app: +To apply your configuration to a cached app (automatically fetches if not cached): ```bash -wild-cloud-install +wild-app-config ``` -To update the app: +To deploy a configured app to Kubernetes: ```bash -TBD +wild-app-deploy +``` + +### Quick Setup + +For a complete app setup and deployment: + +```bash +wild-app-config # Fetches if needed, then configures +wild-app-deploy # Deploys to Kubernetes ```