# CF Deployer - Cloud Foundry Deployment Service A Spring Boot application that provides a REST API for deploying Java applications to Cloud Foundry/Tanzu environments. ## Prerequisites - Java 21 - Gradle 8.14 ## Build and Run ### Build the application ```bash ./gradlew clean build ``` ### Run the application ```bash ./gradlew bootRun ``` Or run the JAR directly: ```bash java -jar build/libs/cf-uploader-1.0.0.jar ``` The application will start on `http://localhost:8080` ## API Endpoint ### Deploy Application to Cloud Foundry **Endpoint:** `POST /api/cf/deploy` **Content-Type:** `multipart/form-data` **Request Parts:** - `request` (JSON string): Deployment configuration - `jarFile` (file): The Java application JAR file - `manifest` (file): Cloud Foundry manifest.yml file ### Sample cURL Request ```bash curl -X POST http://localhost:8080/api/cf/deploy \ -F 'request={ "apiEndpoint": "https://api.cf.example.com", "username": "your-username", "password": "your-password", "organization": "your-org", "space": "your-space", "appName": "my-app", "skipSslValidation": false }' \ -F 'jarFile=@/path/to/your/application.jar' \ -F 'manifest=@/path/to/manifest.yml' ``` ### Sample Request with Skip SSL Validation ```bash curl -X POST http://localhost:8080/api/cf/deploy \ -F 'request={ "apiEndpoint": "https://api.sys.tanzu.example.com", "username": "admin", "password": "admin123", "organization": "development", "space": "dev", "appName": "sample-app", "skipSslValidation": true }' \ -F 'jarFile=@./sample-app.jar' \ -F 'manifest=@./manifest.yml' ``` ### Sample Manifest File (manifest.yml) ```yaml --- applications: - name: sample-app memory: 1G instances: 2 path: sample-app.jar buildpacks: - java_buildpack env: SPRING_PROFILES_ACTIVE: production ``` ## Request Parameters | Field | Type | Required | Description | |-------|------|----------|-------------| | `apiEndpoint` | String | Yes | Cloud Foundry API endpoint URL | | `username` | String | Yes | CF username | | `password` | String | Yes | CF password | | `organization` | String | Yes | Target CF organization | | `space` | String | Yes | Target CF space | | `appName` | String | Yes | Application name | | `skipSslValidation` | Boolean | Yes | Skip SSL certificate validation | ## Response Format ### Success Response ```json { "success": true, "message": "Application deployed successfully", "deploymentId": "123e4567-e89b-12d3-a456-426614174000", "output": "CF CLI output logs...", "error": null } ``` ### Error Response ```json { "success": false, "message": "Application deployment failed", "deploymentId": "123e4567-e89b-12d3-a456-426614174000", "output": "CF CLI output logs...", "error": "Error details..." } ``` ## Configuration Application settings can be configured in `src/main/resources/application.properties`: ```properties # Server port server.port=8080 # Max file size (default: 500MB) spring.servlet.multipart.max-file-size=500MB spring.servlet.multipart.max-request-size=500MB # CF CLI timeout in seconds (default: 600) cf.cli.timeout=600 # Optional: Custom CF CLI path (if not using bundled binaries) cf.cli.path= ``` ## Features - RESTful API for CF deployments - Automatic CF CLI binary management (Linux, macOS, Windows) - Secure password handling (masked in logs) - Configurable timeout for long-running deployments - Comprehensive error handling - Multipart file upload support up to 500MB - Automatic cleanup of temporary files ## Error Handling The API handles various error scenarios: - **400 Bad Request**: Invalid request parameters or file validation errors - **413 Payload Too Large**: Files exceed 500MB limit - **500 Internal Server Error**: Deployment failures or unexpected errors ## Development ### Project Structure ``` src/main/java/com/cfdeployer/ ├── controller/ # REST controllers ├── service/ # Business logic ├── model/ # DTOs └── exception/ # Exception handlers src/main/resources/ ├── application.properties └── cf-cli/ # CF CLI binaries (auto-downloaded) ``` ### Build with Custom CF CLI Version Edit `build.gradle` to change the CF CLI version: ```groovy def cfCliVersion = '8.7.10' // Change this version ``` ## License This project is licensed under the MIT License.