필요없는 폴더 삭제
This commit is contained in:
parent
63ba449f93
commit
8fef09df02
@ -1,63 +0,0 @@
|
|||||||
# Kafka 메시지 확인 스크립트 (Windows PowerShell)
|
|
||||||
#
|
|
||||||
# 사용법: .\check-kafka-messages.ps1
|
|
||||||
|
|
||||||
$KAFKA_SERVER = "4.230.50.63:9092"
|
|
||||||
|
|
||||||
Write-Host "========================================" -ForegroundColor Cyan
|
|
||||||
Write-Host "📊 Kafka 토픽 메시지 확인" -ForegroundColor Cyan
|
|
||||||
Write-Host "========================================" -ForegroundColor Cyan
|
|
||||||
Write-Host ""
|
|
||||||
|
|
||||||
# Kafka 설치 확인
|
|
||||||
$kafkaPath = Read-Host "Kafka 설치 경로를 입력하세요 (예: C:\kafka)"
|
|
||||||
|
|
||||||
if (-not (Test-Path "$kafkaPath\bin\windows\kafka-console-consumer.bat")) {
|
|
||||||
Write-Host "❌ Kafka가 해당 경로에 설치되어 있지 않습니다." -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "✅ Kafka 경로 확인: $kafkaPath" -ForegroundColor Green
|
|
||||||
Write-Host ""
|
|
||||||
|
|
||||||
# 토픽 선택
|
|
||||||
Write-Host "확인할 토픽을 선택하세요:" -ForegroundColor Yellow
|
|
||||||
Write-Host " 1. event.created (이벤트 생성)"
|
|
||||||
Write-Host " 2. participant.registered (참여자 등록)"
|
|
||||||
Write-Host " 3. distribution.completed (배포 완료)"
|
|
||||||
Write-Host " 4. 모두 확인"
|
|
||||||
Write-Host ""
|
|
||||||
|
|
||||||
$choice = Read-Host "선택 (1-4)"
|
|
||||||
|
|
||||||
$topics = @()
|
|
||||||
switch ($choice) {
|
|
||||||
"1" { $topics = @("event.created") }
|
|
||||||
"2" { $topics = @("participant.registered") }
|
|
||||||
"3" { $topics = @("distribution.completed") }
|
|
||||||
"4" { $topics = @("event.created", "participant.registered", "distribution.completed") }
|
|
||||||
default {
|
|
||||||
Write-Host "❌ 잘못된 선택입니다." -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# 각 토픽별 메시지 확인
|
|
||||||
foreach ($topic in $topics) {
|
|
||||||
Write-Host ""
|
|
||||||
Write-Host "========================================" -ForegroundColor Cyan
|
|
||||||
Write-Host "📩 토픽: $topic" -ForegroundColor Cyan
|
|
||||||
Write-Host "========================================" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# 최근 5개 메시지만 확인
|
|
||||||
& "$kafkaPath\bin\windows\kafka-console-consumer.bat" `
|
|
||||||
--bootstrap-server $KAFKA_SERVER `
|
|
||||||
--topic $topic `
|
|
||||||
--from-beginning `
|
|
||||||
--max-messages 5 `
|
|
||||||
--timeout-ms 5000 2>&1 | Out-String | Write-Host
|
|
||||||
|
|
||||||
Write-Host ""
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "✅ 확인 완료!" -ForegroundColor Green
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
# Mermaid Syntax Checker using Docker Container
|
|
||||||
# Similar to PlantUML checker - keeps container running for better performance
|
|
||||||
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory=$true, Position=0)]
|
|
||||||
[string]$FilePath
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if file exists
|
|
||||||
if (-not (Test-Path $FilePath)) {
|
|
||||||
Write-Host "Error: File not found: $FilePath" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get absolute path
|
|
||||||
$absolutePath = (Resolve-Path $FilePath).Path
|
|
||||||
$fileName = Split-Path $absolutePath -Leaf
|
|
||||||
|
|
||||||
Write-Host "`nChecking Mermaid syntax for: $fileName" -ForegroundColor Cyan
|
|
||||||
Write-Host ("=" * 60) -ForegroundColor Gray
|
|
||||||
|
|
||||||
# Check if mermaid container is running
|
|
||||||
$containerRunning = docker ps --filter "name=mermaid-cli" --format "{{.Names}}" 2>$null
|
|
||||||
|
|
||||||
if (-not $containerRunning) {
|
|
||||||
Write-Host "Error: Mermaid CLI container is not running." -ForegroundColor Red
|
|
||||||
Write-Host "Please follow the setup instructions in the Mermaid guide to start the container." -ForegroundColor Yellow
|
|
||||||
Write-Host "`nQuick setup commands:" -ForegroundColor Cyan
|
|
||||||
Write-Host ""
|
|
||||||
Write-Host "# 1. Start container with root privileges (port 48080)" -ForegroundColor Green
|
|
||||||
Write-Host "docker run -d --rm --name mermaid-cli -u root -p 48080:8080 --entrypoint sh minlag/mermaid-cli:latest -c `"while true;do sleep 3600; done`"" -ForegroundColor White
|
|
||||||
Write-Host ""
|
|
||||||
Write-Host "# 2. Install Chromium and dependencies" -ForegroundColor Green
|
|
||||||
Write-Host "docker exec mermaid-cli sh -c `"apk add --no-cache chromium chromium-chromedriver nss freetype harfbuzz ca-certificates ttf-freefont`"" -ForegroundColor White
|
|
||||||
Write-Host ""
|
|
||||||
Write-Host "# 3. Create Puppeteer configuration" -ForegroundColor Green
|
|
||||||
Write-Host "docker exec mermaid-cli sh -c `"echo '{```"executablePath```": ```"/usr/bin/chromium-browser```", ```"args```": [```"--no-sandbox```", ```"--disable-setuid-sandbox```", ```"--disable-dev-shm-usage```"]}' > /tmp/puppeteer-config.json`"" -ForegroundColor White
|
|
||||||
Write-Host ""
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set Puppeteer configuration file path
|
|
||||||
$puppeteerConfigFile = "/tmp/puppeteer-config.json"
|
|
||||||
|
|
||||||
# Generate unique temp filename
|
|
||||||
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
|
|
||||||
$processId = $PID
|
|
||||||
$tempFile = "/tmp/mermaid_${timestamp}_${processId}.mmd"
|
|
||||||
$outputFile = "/tmp/mermaid_${timestamp}_${processId}.svg"
|
|
||||||
|
|
||||||
try {
|
|
||||||
# Copy file to container
|
|
||||||
Write-Host "Copying file to container..." -ForegroundColor Gray
|
|
||||||
docker cp "$absolutePath" "mermaid-cli:$tempFile" 2>&1 | Out-Null
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Write-Host "Error: Failed to copy file to container" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run syntax check with Puppeteer configuration
|
|
||||||
Write-Host "Running syntax check..." -ForegroundColor Gray
|
|
||||||
$output = docker exec mermaid-cli sh -c "cd /home/mermaidcli && node_modules/.bin/mmdc -i '$tempFile' -o '$outputFile' -p '$puppeteerConfigFile' -q" 2>&1
|
|
||||||
$exitCode = $LASTEXITCODE
|
|
||||||
|
|
||||||
if ($exitCode -eq 0) {
|
|
||||||
Write-Host "`nSuccess: Mermaid syntax is valid!" -ForegroundColor Green
|
|
||||||
} else {
|
|
||||||
Write-Host "`nError: Mermaid syntax validation failed!" -ForegroundColor Red
|
|
||||||
Write-Host "`nError details:" -ForegroundColor Red
|
|
||||||
|
|
||||||
# Parse and display error messages
|
|
||||||
$errorLines = $output -split "`n"
|
|
||||||
foreach ($line in $errorLines) {
|
|
||||||
if ($line -match "Error:|Parse error|Expecting|Syntax error") {
|
|
||||||
Write-Host " $line" -ForegroundColor Red
|
|
||||||
} elseif ($line -match "line \d+|at line") {
|
|
||||||
Write-Host " $line" -ForegroundColor Yellow
|
|
||||||
} elseif ($line.Trim() -ne "") {
|
|
||||||
Write-Host " $line" -ForegroundColor DarkRed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
# Clean up temp files
|
|
||||||
Write-Host "`nCleaning up..." -ForegroundColor Gray
|
|
||||||
docker exec mermaid-cli rm -f "$tempFile" "$outputFile" 2>&1 | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "`nValidation complete!" -ForegroundColor Cyan
|
|
||||||
|
|
||||||
# Note: Container is kept running for subsequent checks
|
|
||||||
# To stop: docker stop mermaid-cli && docker rm mermaid-cli
|
|
||||||
@ -1,107 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Mermaid Syntax Checker using Docker Container
|
|
||||||
# Similar to PlantUML checker - keeps container running for better performance
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[0;33m'
|
|
||||||
CYAN='\033[0;36m'
|
|
||||||
GRAY='\033[0;90m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Check if file path is provided
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo -e "${RED}Error: No file path provided${NC}"
|
|
||||||
echo "Usage: $0 <mermaid-file>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
FILE_PATH="$1"
|
|
||||||
|
|
||||||
# Check if file exists
|
|
||||||
if [ ! -f "$FILE_PATH" ]; then
|
|
||||||
echo -e "${RED}Error: File not found: $FILE_PATH${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get absolute path
|
|
||||||
ABSOLUTE_PATH=$(realpath "$FILE_PATH")
|
|
||||||
FILE_NAME=$(basename "$ABSOLUTE_PATH")
|
|
||||||
|
|
||||||
echo -e "\n${CYAN}Checking Mermaid syntax for: $FILE_NAME${NC}"
|
|
||||||
echo -e "${GRAY}$(printf '=%.0s' {1..60})${NC}"
|
|
||||||
|
|
||||||
# Check if mermaid container is running
|
|
||||||
CONTAINER_RUNNING=$(docker ps --filter "name=mermaid-cli" --format "{{.Names}}" 2>/dev/null)
|
|
||||||
|
|
||||||
if [ -z "$CONTAINER_RUNNING" ]; then
|
|
||||||
echo -e "${RED}Error: Mermaid CLI container is not running.${NC}"
|
|
||||||
echo -e "${YELLOW}Please follow the setup instructions in the Mermaid guide to start the container.${NC}"
|
|
||||||
echo -e "\n${CYAN}Quick setup commands:${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}# 1. Start container with root privileges (port 48080)${NC}"
|
|
||||||
echo -e "${NC}docker run -d --rm --name mermaid-cli -u root -p 48080:8080 --entrypoint sh minlag/mermaid-cli:latest -c \"while true;do sleep 3600; done\"${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}# 2. Install Chromium and dependencies${NC}"
|
|
||||||
echo -e "${NC}docker exec mermaid-cli sh -c \"apk add --no-cache chromium chromium-chromedriver nss freetype harfbuzz ca-certificates ttf-freefont\"${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}# 3. Create Puppeteer configuration${NC}"
|
|
||||||
echo -e "${NC}docker exec mermaid-cli sh -c \"echo '{\\\"executablePath\\\": \\\"/usr/bin/chromium-browser\\\", \\\"args\\\": [\\\"--no-sandbox\\\", \\\"--disable-setuid-sandbox\\\", \\\"--disable-dev-shm-usage\\\"]}' > /tmp/puppeteer-config.json\"${NC}"
|
|
||||||
echo ""
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set Puppeteer configuration file path
|
|
||||||
PUPPETEER_CONFIG_FILE="/tmp/puppeteer-config.json"
|
|
||||||
|
|
||||||
# Generate unique temp filename
|
|
||||||
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
|
|
||||||
PID=$$
|
|
||||||
TEMP_FILE="/tmp/mermaid_${TIMESTAMP}_${PID}.mmd"
|
|
||||||
OUTPUT_FILE="/tmp/mermaid_${TIMESTAMP}_${PID}.svg"
|
|
||||||
|
|
||||||
# Copy file to container
|
|
||||||
echo -e "${GRAY}Copying file to container...${NC}"
|
|
||||||
docker cp "$ABSOLUTE_PATH" "mermaid-cli:$TEMP_FILE" >/dev/null 2>&1
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo -e "${RED}Error: Failed to copy file to container${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run syntax check with Puppeteer configuration
|
|
||||||
echo -e "${GRAY}Running syntax check...${NC}"
|
|
||||||
OUTPUT=$(docker exec mermaid-cli sh -c "cd /home/mermaidcli && node_modules/.bin/mmdc -i '$TEMP_FILE' -o '$OUTPUT_FILE' -p '$PUPPETEER_CONFIG_FILE' -q" 2>&1)
|
|
||||||
EXIT_CODE=$?
|
|
||||||
|
|
||||||
if [ $EXIT_CODE -eq 0 ]; then
|
|
||||||
echo -e "\n${GREEN}Success: Mermaid syntax is valid!${NC}"
|
|
||||||
else
|
|
||||||
echo -e "\n${RED}Error: Mermaid syntax validation failed!${NC}"
|
|
||||||
echo -e "\n${RED}Error details:${NC}"
|
|
||||||
|
|
||||||
# Parse and display error messages
|
|
||||||
while IFS= read -r line; do
|
|
||||||
if [[ $line == *"Error:"* ]] || [[ $line == *"Parse error"* ]] || [[ $line == *"Expecting"* ]] || [[ $line == *"Syntax error"* ]]; then
|
|
||||||
echo -e " ${RED}$line${NC}"
|
|
||||||
elif [[ $line == *"line"* ]] && [[ $line =~ [0-9]+ ]]; then
|
|
||||||
echo -e " ${YELLOW}$line${NC}"
|
|
||||||
elif [[ ! -z "$line" ]]; then
|
|
||||||
echo -e " ${RED}$line${NC}"
|
|
||||||
fi
|
|
||||||
done <<< "$OUTPUT"
|
|
||||||
|
|
||||||
# Clean up and exit with error
|
|
||||||
docker exec mermaid-cli rm -f "$TEMP_FILE" "$OUTPUT_FILE" >/dev/null 2>&1
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clean up temp files
|
|
||||||
echo -e "\n${GRAY}Cleaning up...${NC}"
|
|
||||||
docker exec mermaid-cli rm -f "$TEMP_FILE" "$OUTPUT_FILE" >/dev/null 2>&1
|
|
||||||
|
|
||||||
echo -e "\n${CYAN}Validation complete!${NC}"
|
|
||||||
|
|
||||||
# Note: Container is kept running for subsequent checks
|
|
||||||
# To stop: docker stop mermaid-cli && docker rm mermaid-cli
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
param(
|
|
||||||
[Parameter(Mandatory=$false)]
|
|
||||||
[string]$FilePath = "C:\home\workspace\tripgen\design\backend\system\azure-physical-architecture.txt"
|
|
||||||
)
|
|
||||||
|
|
||||||
Write-Host "=== PlantUML Syntax Checker ===" -ForegroundColor Cyan
|
|
||||||
Write-Host "Target file: $FilePath" -ForegroundColor Yellow
|
|
||||||
|
|
||||||
# Check if file exists
|
|
||||||
if (-not (Test-Path $FilePath)) {
|
|
||||||
Write-Host "❌ File not found: $FilePath" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Execute directly in PowerShell
|
|
||||||
$timestamp = Get-Date -Format 'yyyyMMddHHmmss'
|
|
||||||
$tempFile = "/tmp/puml_$timestamp.puml"
|
|
||||||
|
|
||||||
# Copy file
|
|
||||||
Write-Host "`n1. Copying file..." -ForegroundColor Gray
|
|
||||||
Write-Host " Temporary file: $tempFile"
|
|
||||||
docker cp $FilePath "plantuml:$tempFile"
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
Write-Host "❌ File copy failed" -ForegroundColor Red
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
Write-Host " ✅ Copy completed" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Find JAR file path
|
|
||||||
Write-Host "`n2. Looking for PlantUML JAR file..." -ForegroundColor Gray
|
|
||||||
$JAR_PATH = docker exec plantuml sh -c "find / -name 'plantuml*.jar' 2>/dev/null | head -1"
|
|
||||||
Write-Host " JAR path: $JAR_PATH"
|
|
||||||
Write-Host " ✅ JAR file confirmed" -ForegroundColor Green
|
|
||||||
|
|
||||||
# Syntax check
|
|
||||||
Write-Host "`n3. Running syntax check..." -ForegroundColor Gray
|
|
||||||
$syntaxOutput = docker exec plantuml sh -c "java -jar $JAR_PATH -checkonly $tempFile 2>&1"
|
|
||||||
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
|
||||||
Write-Host "`n✅ Syntax check passed!" -ForegroundColor Green
|
|
||||||
Write-Host " No syntax errors found in the diagram." -ForegroundColor Green
|
|
||||||
} else {
|
|
||||||
Write-Host "`n❌ Syntax errors detected!" -ForegroundColor Red
|
|
||||||
Write-Host "Error details:" -ForegroundColor Red
|
|
||||||
Write-Host $syntaxOutput -ForegroundColor Yellow
|
|
||||||
|
|
||||||
# Detailed error check
|
|
||||||
Write-Host "`nAnalyzing detailed errors..." -ForegroundColor Yellow
|
|
||||||
$detailError = docker exec plantuml sh -c "java -jar $JAR_PATH -failfast -v $tempFile 2>&1"
|
|
||||||
$errorLines = $detailError | Select-String "Error line"
|
|
||||||
|
|
||||||
if ($errorLines) {
|
|
||||||
Write-Host "`n📍 Error locations:" -ForegroundColor Magenta
|
|
||||||
$errorLines | ForEach-Object {
|
|
||||||
Write-Host " $($_.Line)" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clean up temporary file
|
|
||||||
Write-Host "`n4. Cleaning up temporary files..." -ForegroundColor Gray
|
|
||||||
docker exec plantuml sh -c "rm -f $tempFile" 2>$null
|
|
||||||
Write-Host " ✅ Cleanup completed" -ForegroundColor Green
|
|
||||||
|
|
||||||
Write-Host "`n=== Check completed ===" -ForegroundColor Cyan
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# PlantUML file syntax checker script
|
|
||||||
# Usage: ./check_plantuml.sh <file_to_check>
|
|
||||||
|
|
||||||
# Check parameters
|
|
||||||
if [ $# -eq 0 ]; then
|
|
||||||
echo "Usage: $0 <file_to_check>"
|
|
||||||
echo "Example: $0 diagram.puml"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# File to check parameter
|
|
||||||
CHECK_FILE="$1"
|
|
||||||
|
|
||||||
# Check if file exists
|
|
||||||
if [ ! -f "$CHECK_FILE" ]; then
|
|
||||||
echo "Error: File '$CHECK_FILE' does not exist."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1. Generate unique filename (prevent conflicts)
|
|
||||||
TEMP_FILE="/tmp/puml_$(date +%s)_$$.puml"
|
|
||||||
|
|
||||||
# 2. Copy file
|
|
||||||
echo "Copying file to Docker container..."
|
|
||||||
docker cp "$CHECK_FILE" plantuml:"$TEMP_FILE"
|
|
||||||
|
|
||||||
# 3. Find JAR file location
|
|
||||||
echo "Finding PlantUML JAR file location..."
|
|
||||||
JAR_PATH=$(docker exec plantuml find / -name "plantuml*.jar" 2>/dev/null | head -1)
|
|
||||||
|
|
||||||
if [ -z "$JAR_PATH" ]; then
|
|
||||||
echo "Error: PlantUML JAR file not found."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 4. Syntax check
|
|
||||||
echo "Running PlantUML syntax check..."
|
|
||||||
docker exec plantuml java -jar "$JAR_PATH" -checkonly "$TEMP_FILE"
|
|
||||||
|
|
||||||
# 5. Detailed error check (if needed)
|
|
||||||
echo "Checking detailed error information..."
|
|
||||||
docker exec plantuml sh -c "cd /tmp && java -jar $JAR_PATH -failfast -v $TEMP_FILE 2>&1 | grep -E 'Error line'"
|
|
||||||
|
|
||||||
# 6. Clean up temporary file
|
|
||||||
echo "Cleaning up temporary files..."
|
|
||||||
docker exec -u root plantuml rm -f "$TEMP_FILE"
|
|
||||||
|
|
||||||
echo "Check completed."
|
|
||||||
@ -1,120 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
PostgreSQL 테이블 확인 스크립트
|
|
||||||
distribution-service의 테이블 생성 여부를 확인합니다.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import psycopg2
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# DB 연결 정보
|
|
||||||
DB_CONFIG = {
|
|
||||||
'host': '4.217.133.59',
|
|
||||||
'port': 5432,
|
|
||||||
'database': 'distributiondb',
|
|
||||||
'user': 'eventuser',
|
|
||||||
'password': 'Hi5Jessica!'
|
|
||||||
}
|
|
||||||
|
|
||||||
def main():
|
|
||||||
try:
|
|
||||||
# DB 연결
|
|
||||||
print(f"Connecting to database: {DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}")
|
|
||||||
conn = psycopg2.connect(**DB_CONFIG)
|
|
||||||
cursor = conn.cursor()
|
|
||||||
|
|
||||||
# 테이블 목록 조회
|
|
||||||
print("\n=== Tables in distributiondb ===")
|
|
||||||
cursor.execute("""
|
|
||||||
SELECT table_name
|
|
||||||
FROM information_schema.tables
|
|
||||||
WHERE table_schema = 'public'
|
|
||||||
ORDER BY table_name
|
|
||||||
""")
|
|
||||||
tables = cursor.fetchall()
|
|
||||||
|
|
||||||
if not tables:
|
|
||||||
print("No tables found.")
|
|
||||||
else:
|
|
||||||
for table in tables:
|
|
||||||
print(f" - {table[0]}")
|
|
||||||
|
|
||||||
# distribution_status 테이블 구조 확인
|
|
||||||
if any('distribution_status' in table for table in tables):
|
|
||||||
print("\n=== distribution_status table structure ===")
|
|
||||||
cursor.execute("""
|
|
||||||
SELECT column_name, data_type, character_maximum_length, is_nullable
|
|
||||||
FROM information_schema.columns
|
|
||||||
WHERE table_name = 'distribution_status'
|
|
||||||
ORDER BY ordinal_position
|
|
||||||
""")
|
|
||||||
columns = cursor.fetchall()
|
|
||||||
for col in columns:
|
|
||||||
nullable = "NULL" if col[3] == 'YES' else "NOT NULL"
|
|
||||||
max_len = f"({col[2]})" if col[2] else ""
|
|
||||||
print(f" - {col[0]}: {col[1]}{max_len} {nullable}")
|
|
||||||
|
|
||||||
# channel_status 테이블 구조 확인
|
|
||||||
if any('channel_status' in table for table in tables):
|
|
||||||
print("\n=== channel_status table structure ===")
|
|
||||||
cursor.execute("""
|
|
||||||
SELECT column_name, data_type, character_maximum_length, is_nullable
|
|
||||||
FROM information_schema.columns
|
|
||||||
WHERE table_name = 'channel_status'
|
|
||||||
ORDER BY ordinal_position
|
|
||||||
""")
|
|
||||||
columns = cursor.fetchall()
|
|
||||||
for col in columns:
|
|
||||||
nullable = "NULL" if col[3] == 'YES' else "NOT NULL"
|
|
||||||
max_len = f"({col[2]})" if col[2] else ""
|
|
||||||
print(f" - {col[0]}: {col[1]}{max_len} {nullable}")
|
|
||||||
|
|
||||||
# 인덱스 확인
|
|
||||||
print("\n=== Indexes ===")
|
|
||||||
cursor.execute("""
|
|
||||||
SELECT tablename, indexname, indexdef
|
|
||||||
FROM pg_indexes
|
|
||||||
WHERE schemaname = 'public'
|
|
||||||
AND tablename IN ('distribution_status', 'channel_status')
|
|
||||||
ORDER BY tablename, indexname
|
|
||||||
""")
|
|
||||||
indexes = cursor.fetchall()
|
|
||||||
for idx in indexes:
|
|
||||||
print(f" - {idx[0]}.{idx[1]}")
|
|
||||||
print(f" {idx[2]}")
|
|
||||||
|
|
||||||
# 외래 키 확인
|
|
||||||
print("\n=== Foreign Keys ===")
|
|
||||||
cursor.execute("""
|
|
||||||
SELECT
|
|
||||||
tc.table_name,
|
|
||||||
kcu.column_name,
|
|
||||||
ccu.table_name AS foreign_table_name,
|
|
||||||
ccu.column_name AS foreign_column_name
|
|
||||||
FROM information_schema.table_constraints AS tc
|
|
||||||
JOIN information_schema.key_column_usage AS kcu
|
|
||||||
ON tc.constraint_name = kcu.constraint_name
|
|
||||||
AND tc.table_schema = kcu.table_schema
|
|
||||||
JOIN information_schema.constraint_column_usage AS ccu
|
|
||||||
ON ccu.constraint_name = tc.constraint_name
|
|
||||||
AND ccu.table_schema = tc.table_schema
|
|
||||||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
||||||
AND tc.table_name IN ('distribution_status', 'channel_status')
|
|
||||||
""")
|
|
||||||
fks = cursor.fetchall()
|
|
||||||
for fk in fks:
|
|
||||||
print(f" - {fk[0]}.{fk[1]} -> {fk[2]}.{fk[3]}")
|
|
||||||
|
|
||||||
# 연결 종료
|
|
||||||
cursor.close()
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
print("\n✅ Database connection successful!")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"\n❌ Error: {e}", file=sys.stderr)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Extract mermaid charts from markdown file
|
|
||||||
|
|
||||||
INPUT_FILE="define/시장조사-차트.md"
|
|
||||||
OUTPUT_DIR="define/charts"
|
|
||||||
|
|
||||||
echo "Extracting Mermaid charts from: $INPUT_FILE"
|
|
||||||
echo "Output directory: $OUTPUT_DIR"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Create output directory
|
|
||||||
mkdir -p "$OUTPUT_DIR"
|
|
||||||
|
|
||||||
# Counter
|
|
||||||
chart_num=0
|
|
||||||
|
|
||||||
# Read file and extract charts
|
|
||||||
in_mermaid=false
|
|
||||||
current_chart=""
|
|
||||||
current_title=""
|
|
||||||
|
|
||||||
while IFS= read -r line || [ -n "$line" ]; do
|
|
||||||
# Check for section header (## number. title)
|
|
||||||
if [[ $line =~ ^##[[:space:]]([0-9]+)\.[[:space:]](.+)$ ]]; then
|
|
||||||
num="${BASH_REMATCH[1]}"
|
|
||||||
title="${BASH_REMATCH[2]}"
|
|
||||||
current_title=$(printf "chart%02d_%s" "$num" "${title// /_}")
|
|
||||||
current_title="${current_title//\//_}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for mermaid start
|
|
||||||
if [[ $line == '```mermaid' ]]; then
|
|
||||||
in_mermaid=true
|
|
||||||
current_chart=""
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for mermaid end
|
|
||||||
if [[ $line == '```' ]] && $in_mermaid; then
|
|
||||||
# Save chart
|
|
||||||
if [ -n "$current_title" ]; then
|
|
||||||
filename="${current_title}.mmd"
|
|
||||||
echo "$current_chart" > "$OUTPUT_DIR/$filename"
|
|
||||||
echo " ✓ Saved: $filename"
|
|
||||||
((chart_num++))
|
|
||||||
fi
|
|
||||||
in_mermaid=false
|
|
||||||
current_chart=""
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Collect chart lines
|
|
||||||
if $in_mermaid; then
|
|
||||||
if [ -n "$current_chart" ]; then
|
|
||||||
current_chart+=$'\n'
|
|
||||||
fi
|
|
||||||
current_chart+="$line"
|
|
||||||
fi
|
|
||||||
done < "$INPUT_FILE"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ Successfully extracted $chart_num charts!"
|
|
||||||
echo ""
|
|
||||||
echo "Chart files saved in: $OUTPUT_DIR"
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
# Mermaid Chart Extractor
|
|
||||||
# Extracts Mermaid charts from markdown and saves them as individual .mmd files
|
|
||||||
|
|
||||||
$markdownFile = "define/시장조사-차트.md"
|
|
||||||
$outputDir = "define/charts"
|
|
||||||
|
|
||||||
Write-Host "Extracting Mermaid charts from: $markdownFile"
|
|
||||||
Write-Host "Output directory: $outputDir`n"
|
|
||||||
|
|
||||||
# Create output directory
|
|
||||||
if (-not (Test-Path $outputDir)) {
|
|
||||||
New-Item -ItemType Directory -Path $outputDir | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
# Read markdown file
|
|
||||||
$content = Get-Content $markdownFile -Raw -Encoding UTF8
|
|
||||||
|
|
||||||
# Extract all mermaid blocks with their section headers
|
|
||||||
$pattern = '## (\d+)\. (.+?)\n\n```mermaid\n(.*?)```'
|
|
||||||
$matches = [regex]::Matches($content, $pattern, [System.Text.RegularExpressions.RegexOptions]::Singleline)
|
|
||||||
|
|
||||||
Write-Host "Found $($matches.Count) Mermaid charts`n"
|
|
||||||
|
|
||||||
# Save each chart
|
|
||||||
$count = 0
|
|
||||||
foreach ($match in $matches) {
|
|
||||||
$num = $match.Groups[1].Value
|
|
||||||
$title = $match.Groups[2].Value
|
|
||||||
$chartCode = $match.Groups[3].Value
|
|
||||||
|
|
||||||
# Clean filename
|
|
||||||
$filename = "chart$($num.PadLeft(2,'0'))_$($title.Replace(' ', '_').Replace('/', '_')).mmd"
|
|
||||||
$filepath = Join-Path $outputDir $filename
|
|
||||||
|
|
||||||
# Write mermaid code
|
|
||||||
$chartCode.Trim() | Out-File -FilePath $filepath -Encoding UTF8 -NoNewline
|
|
||||||
|
|
||||||
Write-Host " ✓ Saved: $filename"
|
|
||||||
$count++
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "`n✅ Successfully extracted $count charts!"
|
|
||||||
Write-Host "`nChart files saved in: $outputDir"
|
|
||||||
Write-Host "`nNext steps:"
|
|
||||||
Write-Host "1. Use Mermaid Live Editor: https://mermaid.live/"
|
|
||||||
Write-Host "2. Copy-paste each .mmd file content"
|
|
||||||
Write-Host "3. Export as PNG or SVG"
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Mermaid Chart Extractor
|
|
||||||
Extracts Mermaid charts from markdown and saves them as individual .mmd files
|
|
||||||
"""
|
|
||||||
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
def extract_mermaid_charts(markdown_file, output_dir):
|
|
||||||
"""Extract all mermaid code blocks from markdown file"""
|
|
||||||
|
|
||||||
# Read markdown file
|
|
||||||
with open(markdown_file, 'r', encoding='utf-8') as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
# Find all mermaid code blocks
|
|
||||||
pattern = r'```mermaid\n(.*?)```'
|
|
||||||
matches = re.findall(pattern, content, re.DOTALL)
|
|
||||||
|
|
||||||
# Create output directory
|
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
# Extract chart titles from markdown headers
|
|
||||||
title_pattern = r'## (\d+)\. (.+?)\n\n```mermaid'
|
|
||||||
titles = re.findall(title_pattern, content, re.DOTALL)
|
|
||||||
|
|
||||||
print(f"Found {len(matches)} Mermaid charts")
|
|
||||||
|
|
||||||
# Save each chart as separate .mmd file
|
|
||||||
for i, (chart_code, (num, title)) in enumerate(zip(matches, titles), 1):
|
|
||||||
# Clean filename
|
|
||||||
filename = f"chart{num:02d}_{title.replace(' ', '_').replace('/', '_')}.mmd"
|
|
||||||
filepath = os.path.join(output_dir, filename)
|
|
||||||
|
|
||||||
# Write mermaid code
|
|
||||||
with open(filepath, 'w', encoding='utf-8') as f:
|
|
||||||
f.write(chart_code.strip())
|
|
||||||
|
|
||||||
print(f" ✓ Saved: {filename}")
|
|
||||||
|
|
||||||
return len(matches)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
# Configuration
|
|
||||||
markdown_file = "define/시장조사-차트.md"
|
|
||||||
output_dir = "define/charts"
|
|
||||||
|
|
||||||
print(f"Extracting Mermaid charts from: {markdown_file}")
|
|
||||||
print(f"Output directory: {output_dir}\n")
|
|
||||||
|
|
||||||
count = extract_mermaid_charts(markdown_file, output_dir)
|
|
||||||
|
|
||||||
print(f"\n✅ Successfully extracted {count} charts!")
|
|
||||||
print(f"\nNext steps:")
|
|
||||||
print(f"1. Use Mermaid Live Editor: https://mermaid.live/")
|
|
||||||
print(f"2. Copy-paste each .mmd file content")
|
|
||||||
print(f"3. Export as PNG or SVG")
|
|
||||||
@ -1,101 +0,0 @@
|
|||||||
@echo off
|
|
||||||
REM ============================================
|
|
||||||
REM Kafka/Redis 통합 테스트 스크립트
|
|
||||||
REM ============================================
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo Kafka/Redis 통합 테스트 시작
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM 현재 디렉토리 확인
|
|
||||||
cd /d "%~dp0\.."
|
|
||||||
echo 현재 디렉토리: %CD%
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM 로그 디렉토리 확인 및 생성
|
|
||||||
if not exist "logs" mkdir logs
|
|
||||||
echo 로그 디렉토리: %CD%\logs
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM 테스트 타임스탬프
|
|
||||||
set TEST_TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
|
|
||||||
set TEST_TIMESTAMP=%TEST_TIMESTAMP: =0%
|
|
||||||
set TEST_LOG=logs\kafka-redis-test_%TEST_TIMESTAMP%.log
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo 1단계: Kafka 수동 테스트 메시지 전송
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
echo Kafka 메시지 전송 중...
|
|
||||||
gradlew ai-service:runKafkaManualTest > %TEST_LOG% 2>&1
|
|
||||||
if %ERRORLEVEL% EQU 0 (
|
|
||||||
echo ✓ Kafka 메시지 전송 완료
|
|
||||||
) else (
|
|
||||||
echo ✗ Kafka 메시지 전송 실패 ^(Error Code: %ERRORLEVEL%^)
|
|
||||||
echo 로그 파일을 확인하세요: %TEST_LOG%
|
|
||||||
)
|
|
||||||
echo.
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo 2단계: AI 서비스 Consumer 처리 대기
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
echo AI 서비스가 Kafka 메시지를 처리할 때까지 60초 대기...
|
|
||||||
timeout /t 60 /nobreak > nul
|
|
||||||
echo ✓ 대기 완료
|
|
||||||
echo.
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo 3단계: Job 상태 확인 ^(Redis^)
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
echo Job 상태 조회 중...
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/jobs/manual-job-001/status" >> %TEST_LOG% 2>&1
|
|
||||||
if %ERRORLEVEL% EQU 0 (
|
|
||||||
echo ✓ Job 상태 조회 성공
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/jobs/manual-job-001/status"
|
|
||||||
) else (
|
|
||||||
echo ✗ Job 상태 조회 실패
|
|
||||||
)
|
|
||||||
echo.
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo 4단계: AI 추천 결과 확인 ^(Redis^)
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
echo AI 추천 결과 조회 중...
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/recommendations/manual-event-001" >> %TEST_LOG% 2>&1
|
|
||||||
if %ERRORLEVEL% EQU 0 (
|
|
||||||
echo ✓ AI 추천 결과 조회 성공
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/recommendations/manual-event-001"
|
|
||||||
) else (
|
|
||||||
echo ✗ AI 추천 결과 조회 실패
|
|
||||||
)
|
|
||||||
echo.
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo 5단계: 모든 테스트 메시지 상태 확인
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
echo [Job 001] 상태 확인:
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/jobs/manual-job-001/status" | findstr "status"
|
|
||||||
echo.
|
|
||||||
echo [Job 002] 상태 확인:
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/jobs/manual-job-002/status" | findstr "status"
|
|
||||||
echo.
|
|
||||||
echo [Job 003] 상태 확인:
|
|
||||||
curl -s "http://localhost:8083/api/v1/ai-service/internal/jobs/manual-job-003/status" | findstr "status"
|
|
||||||
echo.
|
|
||||||
|
|
||||||
echo ============================================
|
|
||||||
echo 테스트 완료
|
|
||||||
echo ============================================
|
|
||||||
echo.
|
|
||||||
echo 상세 로그 파일: %TEST_LOG%
|
|
||||||
echo.
|
|
||||||
echo 수동 확인 명령어:
|
|
||||||
echo - Job 상태: curl http://localhost:8083/api/v1/ai-service/internal/jobs/{jobId}/status
|
|
||||||
echo - AI 추천: curl http://localhost:8083/api/v1/ai-service/internal/recommendations/{eventId}
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
@echo off
|
|
||||||
REM Kafka 수동 테스트 실행 스크립트 (Windows)
|
|
||||||
|
|
||||||
cd /d %~dp0\..
|
|
||||||
|
|
||||||
echo ================================================
|
|
||||||
echo Kafka Manual Test - AI Service
|
|
||||||
echo ================================================
|
|
||||||
echo.
|
|
||||||
echo 이 스크립트는 Kafka에 테스트 메시지를 전송합니다.
|
|
||||||
echo ai-service가 실행 중이어야 메시지를 처리할 수 있습니다.
|
|
||||||
echo.
|
|
||||||
echo Kafka Brokers: 20.249.182.13:9095, 4.217.131.59:9095
|
|
||||||
echo Topic: ai-event-generation-job
|
|
||||||
echo.
|
|
||||||
echo ================================================
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM 테스트 클래스 실행
|
|
||||||
.\gradlew ai-service:test --tests "com.kt.ai.test.manual.KafkaManualTest" --info
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ================================================
|
|
||||||
echo 테스트 완료!
|
|
||||||
echo.
|
|
||||||
echo 결과 확인:
|
|
||||||
echo 1. Job 상태 조회:
|
|
||||||
echo curl http://localhost:8083/api/v1/ai-service/internal/jobs/manual-job-001/status
|
|
||||||
echo.
|
|
||||||
echo 2. AI 추천 결과 조회:
|
|
||||||
echo curl http://localhost:8083/api/v1/ai-service/internal/recommendations/manual-event-001
|
|
||||||
echo.
|
|
||||||
echo 3. Redis 키 확인:
|
|
||||||
echo curl http://localhost:8083/api/v1/ai-service/internal/recommendations/debug/redis-keys
|
|
||||||
echo ================================================
|
|
||||||
|
|
||||||
pause
|
|
||||||
@ -1,303 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""
|
|
||||||
Tripgen Service Runner Script
|
|
||||||
Reads execution profiles from {service-name}/.run/{service-name}.run.xml and runs services accordingly.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
python run-config.py <service-name>
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
python run-config.py user-service
|
|
||||||
python run-config.py location-service
|
|
||||||
python run-config.py trip-service
|
|
||||||
python run-config.py ai-service
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
import xml.etree.ElementTree as ET
|
|
||||||
from pathlib import Path
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
|
||||||
def get_project_root():
|
|
||||||
"""Find project root directory"""
|
|
||||||
current_dir = Path(__file__).parent.absolute()
|
|
||||||
while current_dir.parent != current_dir:
|
|
||||||
if (current_dir / 'gradlew').exists() or (current_dir / 'gradlew.bat').exists():
|
|
||||||
return current_dir
|
|
||||||
current_dir = current_dir.parent
|
|
||||||
|
|
||||||
# If gradlew not found, assume parent directory of develop as project root
|
|
||||||
return Path(__file__).parent.parent.absolute()
|
|
||||||
|
|
||||||
|
|
||||||
def parse_run_configurations(project_root, service_name=None):
|
|
||||||
"""Parse run configuration files from .run directories"""
|
|
||||||
configurations = {}
|
|
||||||
|
|
||||||
if service_name:
|
|
||||||
# Parse specific service configuration
|
|
||||||
run_config_path = project_root / service_name / '.run' / f'{service_name}.run.xml'
|
|
||||||
if run_config_path.exists():
|
|
||||||
config = parse_single_run_config(run_config_path, service_name)
|
|
||||||
if config:
|
|
||||||
configurations[service_name] = config
|
|
||||||
else:
|
|
||||||
print(f"[ERROR] Cannot find run configuration: {run_config_path}")
|
|
||||||
else:
|
|
||||||
# Find all service directories
|
|
||||||
service_dirs = ['user-service', 'location-service', 'trip-service', 'ai-service']
|
|
||||||
for service in service_dirs:
|
|
||||||
run_config_path = project_root / service / '.run' / f'{service}.run.xml'
|
|
||||||
if run_config_path.exists():
|
|
||||||
config = parse_single_run_config(run_config_path, service)
|
|
||||||
if config:
|
|
||||||
configurations[service] = config
|
|
||||||
|
|
||||||
return configurations
|
|
||||||
|
|
||||||
|
|
||||||
def parse_single_run_config(config_path, service_name):
|
|
||||||
"""Parse a single run configuration file"""
|
|
||||||
try:
|
|
||||||
tree = ET.parse(config_path)
|
|
||||||
root = tree.getroot()
|
|
||||||
|
|
||||||
# Find configuration element
|
|
||||||
config = root.find('.//configuration[@type="GradleRunConfiguration"]')
|
|
||||||
if config is None:
|
|
||||||
print(f"[WARNING] No Gradle configuration found in {config_path}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
# Extract environment variables
|
|
||||||
env_vars = {}
|
|
||||||
env_option = config.find('.//option[@name="env"]')
|
|
||||||
if env_option is not None:
|
|
||||||
env_map = env_option.find('map')
|
|
||||||
if env_map is not None:
|
|
||||||
for entry in env_map.findall('entry'):
|
|
||||||
key = entry.get('key')
|
|
||||||
value = entry.get('value')
|
|
||||||
if key and value:
|
|
||||||
env_vars[key] = value
|
|
||||||
|
|
||||||
# Extract task names
|
|
||||||
task_names = []
|
|
||||||
task_names_option = config.find('.//option[@name="taskNames"]')
|
|
||||||
if task_names_option is not None:
|
|
||||||
task_list = task_names_option.find('list')
|
|
||||||
if task_list is not None:
|
|
||||||
for option in task_list.findall('option'):
|
|
||||||
value = option.get('value')
|
|
||||||
if value:
|
|
||||||
task_names.append(value)
|
|
||||||
|
|
||||||
if env_vars or task_names:
|
|
||||||
return {
|
|
||||||
'env_vars': env_vars,
|
|
||||||
'task_names': task_names,
|
|
||||||
'config_path': str(config_path)
|
|
||||||
}
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
except ET.ParseError as e:
|
|
||||||
print(f"[ERROR] XML parsing error in {config_path}: {e}")
|
|
||||||
return None
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[ERROR] Error reading {config_path}: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def get_gradle_command(project_root):
|
|
||||||
"""Return appropriate Gradle command for OS"""
|
|
||||||
if os.name == 'nt': # Windows
|
|
||||||
gradle_bat = project_root / 'gradlew.bat'
|
|
||||||
if gradle_bat.exists():
|
|
||||||
return str(gradle_bat)
|
|
||||||
return 'gradle.bat'
|
|
||||||
else: # Unix-like (Linux, macOS)
|
|
||||||
gradle_sh = project_root / 'gradlew'
|
|
||||||
if gradle_sh.exists():
|
|
||||||
return str(gradle_sh)
|
|
||||||
return 'gradle'
|
|
||||||
|
|
||||||
|
|
||||||
def run_service(service_name, config, project_root):
|
|
||||||
"""Run service"""
|
|
||||||
print(f"[START] Starting {service_name} service...")
|
|
||||||
|
|
||||||
# Set environment variables
|
|
||||||
env = os.environ.copy()
|
|
||||||
for key, value in config['env_vars'].items():
|
|
||||||
env[key] = value
|
|
||||||
print(f" [ENV] {key}={value}")
|
|
||||||
|
|
||||||
# Prepare Gradle command
|
|
||||||
gradle_cmd = get_gradle_command(project_root)
|
|
||||||
|
|
||||||
# Execute tasks
|
|
||||||
for task_name in config['task_names']:
|
|
||||||
print(f"\n[RUN] Executing: {task_name}")
|
|
||||||
|
|
||||||
cmd = [gradle_cmd, task_name]
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Execute from project root directory
|
|
||||||
process = subprocess.Popen(
|
|
||||||
cmd,
|
|
||||||
cwd=project_root,
|
|
||||||
env=env,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.STDOUT,
|
|
||||||
universal_newlines=True,
|
|
||||||
bufsize=1,
|
|
||||||
encoding='utf-8',
|
|
||||||
errors='replace'
|
|
||||||
)
|
|
||||||
|
|
||||||
print(f"[CMD] Command: {' '.join(cmd)}")
|
|
||||||
print(f"[DIR] Working directory: {project_root}")
|
|
||||||
print("=" * 50)
|
|
||||||
|
|
||||||
# Real-time output
|
|
||||||
for line in process.stdout:
|
|
||||||
print(line.rstrip())
|
|
||||||
|
|
||||||
# Wait for process completion
|
|
||||||
process.wait()
|
|
||||||
|
|
||||||
if process.returncode == 0:
|
|
||||||
print(f"\n[SUCCESS] {task_name} execution completed")
|
|
||||||
else:
|
|
||||||
print(f"\n[FAILED] {task_name} execution failed (exit code: {process.returncode})")
|
|
||||||
return False
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print(f"\n[STOP] Interrupted by user")
|
|
||||||
process.terminate()
|
|
||||||
return False
|
|
||||||
except Exception as e:
|
|
||||||
print(f"\n[ERROR] Execution error: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def list_available_services(configurations):
|
|
||||||
"""List available services"""
|
|
||||||
print("[LIST] Available services:")
|
|
||||||
print("=" * 40)
|
|
||||||
|
|
||||||
for service_name, config in configurations.items():
|
|
||||||
if config['task_names']:
|
|
||||||
print(f" [SERVICE] {service_name}")
|
|
||||||
if 'config_path' in config:
|
|
||||||
print(f" +-- Config: {config['config_path']}")
|
|
||||||
for task in config['task_names']:
|
|
||||||
print(f" +-- Task: {task}")
|
|
||||||
print(f" +-- {len(config['env_vars'])} environment variables")
|
|
||||||
print()
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""Main function"""
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='Tripgen Service Runner Script',
|
|
||||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
||||||
epilog="""
|
|
||||||
Examples:
|
|
||||||
python run-config.py user-service
|
|
||||||
python run-config.py location-service
|
|
||||||
python run-config.py trip-service
|
|
||||||
python run-config.py ai-service
|
|
||||||
python run-config.py --list
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'service_name',
|
|
||||||
nargs='?',
|
|
||||||
help='Service name to run'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--list', '-l',
|
|
||||||
action='store_true',
|
|
||||||
help='List available services'
|
|
||||||
)
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Find project root
|
|
||||||
project_root = get_project_root()
|
|
||||||
print(f"[INFO] Project root: {project_root}")
|
|
||||||
|
|
||||||
# Parse run configurations
|
|
||||||
print("[INFO] Reading run configuration files...")
|
|
||||||
configurations = parse_run_configurations(project_root)
|
|
||||||
|
|
||||||
if not configurations:
|
|
||||||
print("[ERROR] No execution configurations found")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
print(f"[INFO] Found {len(configurations)} execution configurations")
|
|
||||||
|
|
||||||
# List services request
|
|
||||||
if args.list:
|
|
||||||
list_available_services(configurations)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
# If service name not provided
|
|
||||||
if not args.service_name:
|
|
||||||
print("\n[ERROR] Please provide service name")
|
|
||||||
list_available_services(configurations)
|
|
||||||
print("Usage: python run-config.py <service-name>")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
# Find service
|
|
||||||
service_name = args.service_name
|
|
||||||
|
|
||||||
# Try to parse specific service configuration if not found
|
|
||||||
if service_name not in configurations:
|
|
||||||
print(f"[INFO] Trying to find configuration for '{service_name}'...")
|
|
||||||
configurations = parse_run_configurations(project_root, service_name)
|
|
||||||
|
|
||||||
if service_name not in configurations:
|
|
||||||
print(f"[ERROR] Cannot find '{service_name}' service")
|
|
||||||
list_available_services(configurations)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
config = configurations[service_name]
|
|
||||||
|
|
||||||
if not config['task_names']:
|
|
||||||
print(f"[ERROR] No executable tasks found for '{service_name}' service")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
# Execute service
|
|
||||||
print(f"\n[TARGET] Starting '{service_name}' service execution")
|
|
||||||
print("=" * 50)
|
|
||||||
|
|
||||||
success = run_service(service_name, config, project_root)
|
|
||||||
|
|
||||||
if success:
|
|
||||||
print(f"\n[COMPLETE] '{service_name}' service started successfully!")
|
|
||||||
return 0
|
|
||||||
else:
|
|
||||||
print(f"\n[FAILED] Failed to start '{service_name}' service")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
exit_code = main()
|
|
||||||
sys.exit(exit_code)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print("\n[STOP] Interrupted by user")
|
|
||||||
sys.exit(1)
|
|
||||||
except Exception as e:
|
|
||||||
print(f"\n[ERROR] Unexpected error occurred: {e}")
|
|
||||||
sys.exit(1)
|
|
||||||
Loading…
x
Reference in New Issue
Block a user