Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 6 additions & 25 deletions demos/rfe-builder/OPENSHIFT_DEPLOYMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,32 +48,13 @@ docker login your-registry.com

## Quick Deployment

### 1. Automated Deployment (Recommended)
```bash
# Run the automated deployment script
./openshift/deploy.sh your-registry.com/rhoai latest

# Or with OpenShift internal registry
./openshift/deploy.sh image-registry.openshift-image-registry.svc:5000/rhoai-ai-feature-sizing latest
```

### 2. Manual Deployment
If you prefer manual control:
> **📋 For build and deployment instructions, see [openshift/README.md](openshift/README.md)**

```bash
# Build and push image
docker build -t your-registry.com/rhoai-ai-feature-sizing:latest .
docker push your-registry.com/rhoai-ai-feature-sizing:latest

# Deploy to OpenShift
oc apply -f openshift/namespace.yaml
oc apply -f openshift/pvc.yaml
oc apply -f openshift/configmap.yaml
oc apply -f openshift/secret.yaml
oc apply -f openshift/deployment.yaml
oc apply -f openshift/service.yaml
oc apply -f openshift/route.yaml
```
The OpenShift README covers:
- Building images with podman/docker auto-detection
- Deploy script usage with environment variables
- Kustomize deployment
- Individual manifest deployment

## Configuration

Expand Down
97 changes: 97 additions & 0 deletions demos/rfe-builder/openshift/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# OpenShift Deployment

This directory contains OpenShift/Kubernetes manifests and deployment scripts for the RHOAI AI Feature Sizing Platform.

## 🔨 Building the Image

```bash
# Build with podman/docker (auto-detected)
./build.sh

# Build with custom image name
IMAGE_FULL_NAME=quay.io/my/image:latest ./build.sh

# Build with custom registry and tag
./build.sh quay.io/myregistry/myapp v1.0.0
```

## 🚀 Deploy Script Usage

```bash
# Deploy with defaults
./deploy.sh

# Deploy to custom namespace
NAMESPACE=my-namespace ./deploy.sh

# Deploy custom image to custom namespace
NAMESPACE=my-namespace IMAGE_FULL_NAME=quay.io/my/image:latest ./deploy.sh

# Deploy with custom registry/tag
./deploy.sh quay.io/myregistry/myapp v1.0.0
```

## 📦 Kustomize Usage

```bash
# Deploy with kustomize (default namespace)
kustomize build . | oc apply -f -

# Deploy to custom namespace
kustomize edit set namespace my-namespace
kustomize build . | oc apply -f -

# Deploy custom image
kustomize edit set image quay.io/gkrumbach07/llama-index-demo/rhoai-ai-feature-sizing=quay.io/my/image:latest
kustomize build . | oc apply -f -
```

**Note**: `kustomize edit set namespace` automatically overrides the namespace in all resources at build time, including the namespace.yaml file. You don't need to manually edit individual manifest files.

## 📄 Individual Manifests

```bash
# 1. Create namespace
# For default namespace:
oc apply -f namespace.yaml

# For custom namespace:
oc create namespace my-namespace

# 2. Switch to namespace
oc project my-namespace

# 3. Apply manifests directly
oc apply -f pvc.yaml
oc apply -f configmap.yaml
oc apply -f secret.yaml
oc apply -f deployment.yaml
oc apply -f service.yaml
oc apply -f route.yaml

# 4. Update deployment image if needed
oc set image deployment/rhoai-ai-feature-sizing rhoai-app=quay.io/my/image:latest
```

## 🔧 Environment Variables

- **NAMESPACE**: Target namespace (default: `rhoai-ai-feature-sizing`)
- **IMAGE_FULL_NAME**: Complete image name with registry and tag

## 📋 Manifest Files

- `namespace.yaml` - Namespace definition (contains `${NAMESPACE}` placeholder)
- `pvc.yaml` - Persistent volume claims for uploads and output
- `configmap.yaml` - Application configuration
- `secret.yaml` - API keys and secrets (update after deployment)
- `deployment.yaml` - Main application deployment
- `service.yaml` - ClusterIP services for API and UI
- `route.yaml` - OpenShift routes for external access
- `kustomization.yaml` - Kustomize configuration

## 🔑 Post-Deployment

Update API keys in the secret:
```bash
oc patch secret rhoai-secrets -p '{"stringData":{"OPENAI_API_KEY":"your-actual-key"}}'
```
52 changes: 29 additions & 23 deletions demos/rfe-builder/openshift/build.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#!/bin/bash

# Build Script for RHOAI AI Feature Sizing Platform
# Usage: ./build.sh [REGISTRY_URL] [IMAGE_TAG]
# Usage: IMAGE_FULL_NAME=quay.io/my/image:latest ./build.sh
# Or use default: ./build.sh

set -e

Expand All @@ -13,18 +14,13 @@ BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Configuration
APP_NAME="rhoai-ai-feature-sizing"
DEFAULT_REGISTRY="quay.io/gkrumbach07/llama-index-demo"
DEFAULT_TAG="latest"
DEFAULT_IMAGE="quay.io/gkrumbach07/llama-index-demo/rhoai-ai-feature-sizing:latest"

# Parse arguments
REGISTRY_URL=${1:-$DEFAULT_REGISTRY}
IMAGE_TAG=${2:-$DEFAULT_TAG}
IMAGE_FULL_NAME="${REGISTRY_URL}/${APP_NAME}:${IMAGE_TAG}"
# Use IMAGE_FULL_NAME environment variable or default
IMAGE_FULL_NAME="${IMAGE_FULL_NAME:-$DEFAULT_IMAGE}"

echo -e "${BLUE}🔨 RHOAI AI Feature Sizing - Docker Build${NC}"
echo -e "${BLUE}=========================================${NC}"
echo -e "Registry: ${GREEN}${REGISTRY_URL}${NC}"
echo -e "${BLUE}🔨 RHOAI AI Feature Sizing - Container Build${NC}"
echo -e "${BLUE}===========================================${NC}"
echo -e "Image: ${GREEN}${IMAGE_FULL_NAME}${NC}"
echo ""

Expand All @@ -33,32 +29,42 @@ command_exists() {
command -v "$1" >/dev/null 2>&1
}

# Check prerequisites
echo -e "${YELLOW}🔍 Checking prerequisites...${NC}"
if ! command_exists docker; then
echo -e "${RED}❌ Docker not found. Please install it first.${NC}"
# Detect container runtime
CONTAINER_RUNTIME=""
if command_exists podman; then
CONTAINER_RUNTIME="podman"
echo -e "${GREEN}✅ Using Podman as container runtime${NC}"
elif command_exists docker; then
CONTAINER_RUNTIME="docker"
echo -e "${GREEN}✅ Using Docker as container runtime${NC}"
else
echo -e "${RED}❌ Neither Podman nor Docker found. Please install one of them first.${NC}"
exit 1
fi

echo -e "${GREEN}✅ Prerequisites check passed${NC}"
echo ""

# Build Docker image
echo -e "${YELLOW}🔨 Building Docker image...${NC}"
docker build -t "${IMAGE_FULL_NAME}" .
# Build container image
echo -e "${YELLOW}🔨 Building container image...${NC}"
${CONTAINER_RUNTIME} build -t "${IMAGE_FULL_NAME}" ..

echo -e "${YELLOW}📤 Pushing Docker image to registry...${NC}"
docker push "${IMAGE_FULL_NAME}"
echo -e "${YELLOW}📤 Pushing container image to registry...${NC}"
${CONTAINER_RUNTIME} push "${IMAGE_FULL_NAME}"
echo -e "${GREEN}✅ Image pushed successfully${NC}"
echo ""

echo -e "${GREEN}🎉 Build completed successfully!${NC}"
echo -e "${GREEN}==============================${NC}"
echo -e "Image: ${BLUE}${IMAGE_FULL_NAME}${NC}"
echo ""
echo -e "${YELLOW}📝 Usage examples:${NC}"
echo -e "1. Build with custom image name:"
echo -e " ${BLUE}IMAGE_FULL_NAME=quay.io/my/image:latest ./build.sh${NC}"
echo -e "2. Build with defaults:"
echo -e " ${BLUE}./build.sh${NC}"
echo ""
echo -e "${YELLOW}📝 Next steps:${NC}"
echo -e "1. Deploy the image:"
echo -e " ${BLUE}./openshift/deploy.sh ${REGISTRY_URL} ${IMAGE_TAG}${NC}"
echo -e "2. Or deploy with defaults:"
echo -e "Deploy the image with:"
echo -e " ${BLUE}./openshift/deploy.sh${NC}"
echo ""
1 change: 0 additions & 1 deletion demos/rfe-builder/openshift/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ apiVersion: v1
kind: ConfigMap
metadata:
name: rhoai-config
namespace: rhoai-ai-feature-sizing
labels:
app: rhoai-ai-feature-sizing
data:
Expand Down
90 changes: 46 additions & 44 deletions demos/rfe-builder/openshift/deploy.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#!/bin/bash

# OpenShift Deployment Script for RHOAI AI Feature Sizing Platform
# Usage: ./deploy.sh [REGISTRY_URL] [IMAGE_TAG]
# Usage: ./deploy.sh
# Or with environment variables: NAMESPACE=my-namespace IMAGE_FULL_NAME=quay.io/my/image:latest ./deploy.sh
# Note: This script deploys a pre-built image. Use build.sh first to build and push the image.

set -e
Expand All @@ -14,19 +15,14 @@ BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Configuration
NAMESPACE="rhoai-ai-feature-sizing"
APP_NAME="rhoai-ai-feature-sizing"
DEFAULT_REGISTRY="quay.io/gkrumbach07/llama-index-demo"
DEFAULT_TAG="latest"
NAMESPACE="${NAMESPACE:-rhoai-ai-feature-sizing}"
DEFAULT_IMAGE="quay.io/gkrumbach07/llama-index-demo/rhoai-ai-feature-sizing:latest"

# Parse arguments
REGISTRY_URL=${1:-$DEFAULT_REGISTRY}
IMAGE_TAG=${2:-$DEFAULT_TAG}
IMAGE_FULL_NAME="${REGISTRY_URL}/${APP_NAME}:${IMAGE_TAG}"
# Use IMAGE_FULL_NAME environment variable or default
IMAGE_FULL_NAME="${IMAGE_FULL_NAME:-$DEFAULT_IMAGE}"

echo -e "${BLUE}🚀 RHOAI AI Feature Sizing - OpenShift Deployment${NC}"
echo -e "${BLUE}=================================================${NC}"
echo -e "Registry: ${GREEN}${REGISTRY_URL}${NC}"
echo -e "Image: ${GREEN}${IMAGE_FULL_NAME}${NC}"
echo -e "Namespace: ${GREEN}${NAMESPACE}${NC}"
echo ""
Expand All @@ -36,6 +32,19 @@ command_exists() {
command -v "$1" >/dev/null 2>&1
}

# Function to apply manifest (no namespace substitution needed)
apply_manifest() {
local manifest_file="$1"
echo -e "${BLUE}📋 Applying ${manifest_file}...${NC}"
oc apply -f "openshift/${manifest_file}"
}

# Function to apply deployment with image substitution
apply_deployment() {
echo -e "${BLUE}📋 Applying deployment.yaml with image ${IMAGE_FULL_NAME}...${NC}"
sed "s|image:.*|image: ${IMAGE_FULL_NAME}|g" "openshift/deployment.yaml" | oc apply -f -
}

# Check prerequisites
echo -e "${YELLOW}🔍 Checking prerequisites...${NC}"
if ! command_exists oc; then
Expand All @@ -62,44 +71,41 @@ echo -e "Image: ${BLUE}${IMAGE_FULL_NAME}${NC}"
echo -e "${YELLOW}💡 If image doesn't exist, run: ${BLUE}./openshift/build.sh${NC}"
echo ""

# Update deployment with new image
echo -e "${YELLOW}🔧 Updating deployment manifest...${NC}"
sed -i.bak "s|image:.*|image: ${IMAGE_FULL_NAME}|g" openshift/deployment.yaml
echo -e "${GREEN}✅ Deployment manifest updated${NC}"
echo ""

# Deploy to OpenShift
echo -e "${YELLOW}🚀 Deploying to OpenShift...${NC}"

# Create namespace
echo -e "${BLUE}📁 Creating namespace...${NC}"
oc apply -f openshift/namespace.yaml

# Check if namespace already exists and is active
if oc get namespace ${NAMESPACE} >/dev/null 2>&1; then
echo -e "${GREEN}✅ Namespace already exists${NC}"
# Create namespace first
echo -e "${BLUE}📁 Creating namespace ${NAMESPACE}...${NC}"
if [ "$NAMESPACE" != "rhoai-ai-feature-sizing" ]; then
# Create custom namespace
oc create namespace "$NAMESPACE" --dry-run=client -o yaml | oc apply -f -
else
echo -e "${YELLOW}⏳ Waiting for namespace to be ready...${NC}"
# Wait for namespace to be ready with increased timeout
oc wait --for=condition=Active namespace/${NAMESPACE} --timeout=300s || {
echo -e "${RED}❌ Namespace creation timed out. Checking status...${NC}"
oc describe namespace ${NAMESPACE}
echo -e "${YELLOW}💡 Try running: oc delete namespace ${NAMESPACE} && sleep 10${NC}"
exit 1
}
# Use default namespace manifest
oc apply -f "openshift/namespace.yaml"
fi

# Wait for namespace to be ready
echo -e "${YELLOW}⏳ Waiting for namespace to be ready...${NC}"
oc wait --for=condition=Active namespace/${NAMESPACE} --timeout=300s || {
echo -e "${RED}❌ Namespace creation timed out. Checking status...${NC}"
oc describe namespace ${NAMESPACE}
echo -e "${YELLOW}💡 Try running: oc delete namespace ${NAMESPACE} && sleep 10${NC}"
exit 1
}

# Switch to the target namespace
echo -e "${BLUE}🔄 Switching to namespace ${NAMESPACE}...${NC}"
oc project ${NAMESPACE}

# Create persistent volume claims
echo -e "${BLUE}💾 Creating persistent volumes...${NC}"
oc apply -f openshift/pvc.yaml
apply_manifest "pvc.yaml"

# Create config map and secrets
echo -e "${BLUE}⚙️ Creating configuration...${NC}"
oc apply -f openshift/configmap.yaml
apply_manifest "configmap.yaml"

# Check if secrets file exists and has content
if [ -s openshift/secret.yaml ] && grep -q "OPENAI_API_KEY:" openshift/secret.yaml; then
oc apply -f openshift/secret.yaml
apply_manifest "secret.yaml"
else
echo -e "${YELLOW}⚠️ Secret file is empty or missing API keys. Creating empty secret...${NC}"
echo -e "${YELLOW} Please update the secret with your API keys:${NC}"
Expand All @@ -108,16 +114,13 @@ else
fi

# Deploy application
echo -e "${BLUE}🚢 Deploying application...${NC}"
oc apply -f openshift/deployment.yaml
apply_deployment

# Create services
echo -e "${BLUE}🔗 Creating services...${NC}"
oc apply -f openshift/service.yaml
apply_manifest "service.yaml"

# Create routes
echo -e "${BLUE}🌐 Creating routes...${NC}"
oc apply -f openshift/route.yaml
apply_manifest "route.yaml"

echo ""
echo -e "${GREEN}✅ Deployment completed!${NC}"
Expand Down Expand Up @@ -148,5 +151,4 @@ echo -e "3. View logs:"
echo -e " ${BLUE}oc logs -f deployment/${APP_NAME} -n ${NAMESPACE}${NC}"
echo ""

# Restore original deployment file
mv openshift/deployment.yaml.bak openshift/deployment.yaml 2>/dev/null || true
# Note: No cleanup needed as we use in-memory substitution
1 change: 0 additions & 1 deletion demos/rfe-builder/openshift/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: rhoai-ai-feature-sizing
namespace: rhoai-ai-feature-sizing
labels:
app: rhoai-ai-feature-sizing
spec:
Expand Down
Loading
Loading