Subir archivos a "/"

This commit is contained in:
2026-06-02 16:47:58 +00:00
parent b345c353e1
commit 4626bce548
4 changed files with 178 additions and 0 deletions

104
README.md Normal file
View File

@@ -0,0 +1,104 @@
# Cloud Conversion
Cloud Conversion es un proyecto Python para apoyar evaluaciones de migracion cloud. Descarga y transforma catalogos de precios de AWS y OCI, compara inventarios de servidores contra shapes cloud, genera archivos `MATCH-*` con recomendaciones y costos, y ofrece una interfaz grafica local en Streamlit para operar el pipeline sin depender de comandos manuales.
La ruta recomendada para arquitectos es la interfaz grafica. Los scripts CLI siguen disponibles para automatizacion, troubleshooting o ejecuciones controladas.
## Quick Start
1. Crear y activar ambiente virtual:
```bash
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
2. Configurar variables opcionales:
```bash
cp .env.example .env
```
3. Abrir la interfaz grafica:
```bash
streamlit run cloud_conversion_ui/Home.py
```
4. En la GUI:
- Selecciona o sube un inventario en `Inventario`.
- Actualiza catalogos en `Catalogos` si necesitas precios recientes.
- Ejecuta `AWS Match` y `OCI Match` en `Ejecucion`.
- Revisa costos y cobertura en `Dashboard`.
- Descarga CSVs, EDA y logs en `Logs y Artefactos`.
## Flujo Operativo
### Interfaz grafica
La aplicacion Streamlit vive en `cloud_conversion_ui/` y usa `cloud_conversion_ui/Home.py` como entrada. Es el camino recomendado para uso diario porque agrupa inventarios, catalogos, ejecucion, resultados y descargas en una sola consola local.
Al ejecutar matching desde la GUI, los inventarios no se archivan automaticamente. Internamente la GUI llama los pipelines con `move_to_done=False`; si quieres archivar un inventario, hazlo desde la pagina `Inventario`.
### Scripts CLI
Los scripts estan en `scripts/`. El pipeline AWS tipico es:
```bash
python scripts/aws_fetch_offer.py
python scripts/aws_eda.py
python scripts/aws_match.py --inventory input/inventario.xlsx --skip-llm
```
El pipeline OCI tipico es:
```bash
python scripts/oci_fetch_offer.py
python scripts/oci_match.py --inventory input/inventario.xlsx --skip-llm
```
## Documentacion
- [Despliegue Local/VM](docs/DEPLOYMENT.md)
- [Guia de la Interfaz Grafica](docs/UI_GUIDE.md)
- [Scripts y Comandos](docs/SCRIPTS.md)
- [Diccionario de Datos](docs/DATA_DICTIONARY.md)
- [Estructura de Directorios](docs/DIRECTORY_STRUCTURE.md)
## Comandos Utiles
| Comando | Uso |
| --- | --- |
| `streamlit run cloud_conversion_ui/Home.py` | Inicia la GUI local. |
| `python scripts/aws_match.py --help` | Muestra parametros de AWS Match. |
| `python scripts/oci_match.py --help` | Muestra parametros de OCI Match. |
| `python scripts/cloud-chat.py --ask "Cuanto cuesta m7a.xlarge en virginia?"` | Consulta el catalogo AWS desde CLI. |
| `python scripts/whatsapp_chatbot.py` | Inicia webhook Flask para WhatsApp Cloud Chat. |
| `python -m pytest -q` | Ejecuta la suite de pruebas. |
## Datos y Seguridad
- `.env` contiene secretos locales y no debe subirse.
- `.env.example` es la plantilla segura para compartir.
- Los datos actuales se conservan para uso interno, pero antes de publicar el repo se debe revisar sensibilidad de inventarios, clientes, precios y logs.
- `data/` puede ser grande; en este workspace pesa aproximadamente 8 GB.
- `logs/`, `.venv/`, caches y archivos temporales estan ignorados por Git.
## Validacion antes de Compartir
Ejecuta:
```bash
python -m pytest -q
python scripts/aws_match.py --help
python scripts/oci_match.py --help
python scripts/aws_eda.py --help
python scripts/cloud-chat.py --help
python scripts/whatsapp_send.py --help
streamlit run cloud_conversion_ui/Home.py
```
Para validar Streamlit en una VM, confirma que el navegador abre la pagina inicial y que el sidebar muestra `Inventario`, `Catalogos`, `Ejecucion`, `Dashboard` y `Logs y Artefactos`.

9
requirements.txt Normal file
View File

@@ -0,0 +1,9 @@
pandas==2.2.3
openpyxl==3.1.5
pydantic==2.10.6
requests==2.32.3
langchain-ollama==1.1.0
flask==3.1.3
twilio==9.10.9
python-dotenv==1.2.2
streamlit==1.57.0

20
send.py Normal file
View File

@@ -0,0 +1,20 @@
import os
from dotenv import load_dotenv
from twilio.rest import Client
load_dotenv()
account_sid = os.environ["TWILIO_ACCOUNT_SID"]
auth_token = os.environ["TWILIO_AUTH_TOKEN"]
from_whatsapp = os.environ["TWILIO_WHATSAPP_FROM"]
to_whatsapp = os.environ["MY_WHATSAPP_TO"]
client = Client(account_sid, auth_token)
message = client.messages.create(
from_=from_whatsapp,
to=to_whatsapp,
body="Hola mundo desde Python usando Twilio WhatsApp."
)
print("Mensaje enviado correctamente.")
print("SID:", message.sid)
print("Estado:", message.status)

45
server.py Normal file
View File

@@ -0,0 +1,45 @@
import os
from flask import Flask, request, abort, Response
from dotenv import load_dotenv
from twilio.request_validator import RequestValidator
from twilio.twiml.messaging_response import MessagingResponse
load_dotenv()
app = Flask(__name__)
twilio_auth_token = os.environ["TWILIO_AUTH_TOKEN"]
public_webhook_url = os.environ["PUBLIC_WEBHOOK_URL"]
validator = RequestValidator(twilio_auth_token)
@app.post("/whatsapp")
def whatsapp_webhook():
signature = request.headers.get("X-Twilio-Signature", "")
is_valid = validator.validate(
public_webhook_url,
request.form.to_dict(),
signature
)
if not is_valid:
print("Firma inválida. Request rechazado.")
abort(403)
incoming_message = request.form.get("Body", "")
sender = request.form.get("From", "")
print("Mensaje recibido desde WhatsApp")
print("De:", sender)
print("Texto:", incoming_message)
response = MessagingResponse()
response.message(f"Hola. Recibí tu mensaje: {incoming_message}")
return Response(str(response), mimetype="text/xml")
if __name__ == "__main__":
app.run(port=3000, debug=True)