Unverified Commit 7082c9cb authored by Guillermo Sanz López's avatar Guillermo Sanz López Committed by GitHub
Browse files

Merge pull request #8 from Telefonica/build-push-deploy

Build push deploy and improve pagination and search
parents 68722063 bdec0753
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -100,3 +100,6 @@ docker push public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERS

# Mostrar la nueva versión
echo "Nueva imagen subida correctamente: public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION"

# Tag a desplegar
echo "Frontend tag a desplegar: v3.1.$NEW_VERSION"
 No newline at end of file
+130 −0
Original line number Diff line number Diff line
#!/bin/bash

set -e  # Detener la ejecución si ocurre un error

# Función para manejar errores
handle_error() {
    echo "Error en el script. Línea: $1"
    exit 1
}

# Capturar errores y llamar a la función handle_error
trap 'handle_error $LINENO' ERR

# Pedir al usuario la URL del backend
read -p "Introduce la URL del backend (ej. http://localhost:8085): " BACKEND_URL

# Concatenar "/api" al final de la URL
API_URL="${BACKEND_URL}/api"

echo "La URL completa de la API será: $API_URL"

# Cambiar el valor de NEXT_PUBLIC_API_BASE_URL en el archivo capif_frontend/.env
ENV_FILE="capif_frontend/.env"

if [ -f "$ENV_FILE" ]; then
    # Reemplazar la línea correcta sin tocar las comentadas o con espacios alrededor del igual
    sed -i '' -E 's|^NEXT_PUBLIC_API_BASE_URL\s*=\s*.*$|NEXT_PUBLIC_API_BASE_URL="'"$API_URL"'"|g' "$ENV_FILE"
    echo "Variable NEXT_PUBLIC_API_BASE_URL actualizada en $ENV_FILE"
else
    echo "Error: No se encontró el archivo $ENV_FILE"
    exit 1
fi

# Obtener la última versión desde ECR usando AWS CLI
LAST_VERSION=$(aws ecr-public describe-image-tags --repository-name opencapif/backoffice-frontend --region us-east-1 --query 'imageTagDetails[*].imageTag' --output text | grep -Eo 'v3.1.[0-9]+' | sed 's/v3.1.//' | sort -n | tail -1)

if [ -z "$LAST_VERSION" ]; then
    echo "No se pudo obtener la última versión desde ECR. Verifica si el repositorio o las imágenes existen."
    exit 1
fi

# Incrementar la versión
NEW_VERSION=$((LAST_VERSION + 1))
echo "Nueva versión: v3.1.$NEW_VERSION"

# Cambiar directorio a capif_frontend
echo "Cambiando a directorio capif_frontend..."
cd capif_frontend || { echo "Error: no se pudo cambiar al directorio capif_frontend."; exit 1; }

# Ejecutar comandos de yarn
echo "Instalando dependencias con yarn..."
yarn install || { echo "Error en 'yarn install'."; exit 1; }

echo "Construyendo la aplicación con yarn..."
yarn build || { echo "Error en 'yarn build'."; exit 1; }

echo "Exportando la aplicación con yarn..."
yarn export || { echo "Error en 'yarn export'."; exit 1; }

# Volver al directorio principal
cd .. || { echo "Error: no se pudo volver al directorio principal."; exit 1; }

# Establecer la plataforma y construir la imagen Docker
echo "Construyendo la imagen Docker..."
DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose build || { echo "Error en la construcción de la imagen Docker."; exit 1; }

# Pedir al usuario el ARN de MFA
read -p "Introduce el ID de cuenta de AWS (ej. 230672794366): " AWS_ACCOUNT_ID
read -p "Introduce el nombre del dispositivo MFA (ej. google_authenticator_phone): " MFA_DEVICE

MFA_ARN="arn:aws:iam::$AWS_ACCOUNT_ID:mfa/$MFA_DEVICE"

# Autenticación MFA con AWS para obtener un token temporal
read -p "Introduce el código MFA de 6 dígitos: " MFA_CODE

# Obtener un token temporal usando MFA
echo "Autenticando con AWS usando MFA..."
TEMP_CREDS=$(aws sts get-session-token --serial-number "$MFA_ARN" --token-code "$MFA_CODE" --output json)

if [ -z "$TEMP_CREDS" ]; then
    echo "Error: No se pudo obtener el token temporal de AWS. Verifica el código MFA."
    exit 1
fi

# Exportar credenciales temporales
export AWS_ACCESS_KEY_ID=$(echo "$TEMP_CREDS" | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo "$TEMP_CREDS" | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo "$TEMP_CREDS" | jq -r '.Credentials.SessionToken')

# Autenticar Docker con Amazon ECR Public
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/o2v4a8t6 || { echo "Error en la autenticación con Docker."; exit 1; }

# Taggear la imagen con la nueva versión
echo "Etiquetando la imagen Docker..."
docker tag pesp_capif_backoffice_frontend_v2-frontend_microservice public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION || { echo "Error al etiquetar la imagen Docker."; exit 1; }

# Push de la imagen con la nueva versión
echo "Pushing la nueva imagen a ECR..."
docker push public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION || { echo "Error al hacer push de la imagen Docker."; exit 1; }

# Actualizar el archivo helm/backoffice/values.yaml con el nuevo tag solo en la sección frontend
VALUES_FILE="helm/backoffice/values.yaml"

if [ -f "$VALUES_FILE" ]; then
    echo "Actualizando el archivo $VALUES_FILE con el nuevo tag..."

    # Reemplazar el tag del frontend buscando el repository y el tag justo después
    awk -v new_version="v3.1.$NEW_VERSION" '
    $0 ~ /repository: public.ecr.aws\/o2v4a8t6\/opencapif\/backoffice-frontend/ {
        found=1
    }
    found && /tag:/ {
        sub(/"v3.1.[0-9]+"/, "\"" new_version "\"")
        found=0
    }
    { print }
    ' "$VALUES_FILE" > "$VALUES_FILE.tmp" && mv "$VALUES_FILE.tmp" "$VALUES_FILE"

    echo "Archivo $VALUES_FILE actualizado con el nuevo tag v3.1.$NEW_VERSION"
else
    echo "Error: No se encontró el archivo $VALUES_FILE"
    exit 1
fi

# Ejecutar el comando Helm para actualizar la instalación
echo "Ejecutando helm upgrade..."
helm upgrade --install -n backoffice backoffice helm/backoffice --create-namespace || { echo "Error en el comando Helm."; exit 1; }

# Mostrar la nueva versión
echo "Nueva imagen subida y helm upgrade ejecutado correctamente: public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION"
+66 −0
Original line number Diff line number Diff line
#!/bin/bash

set -e  # Detener la ejecución si ocurre un error

# Función para manejar errores
handle_error() {
    echo "Error en el script. Línea: $1"
    exit 1
}

# Capturar errores y llamar a la función handle_error
trap 'handle_error $LINENO' ERR

# Verificar si AWS CLI está instalado
if ! command -v aws &> /dev/null
then
    echo "AWS CLI no está instalado. Por favor, instala AWS CLI y vuelve a ejecutar el script."
    exit 1
fi

# Pedir al usuario las credenciales base (sin MFA)
read -p "Introduce tu AWS Access Key ID: " AWS_ACCESS_KEY_ID_BASE
read -s -p "Introduce tu AWS Secret Access Key: " AWS_SECRET_ACCESS_KEY_BASE
echo ""

# Exportar las credenciales base para la sesión
export AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID_BASE"
export AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY_BASE"

# Comprobar si las credenciales base funcionan ejecutando un comando sencillo
aws sts get-caller-identity || { echo "Error: No se pueden utilizar las credenciales base"; exit 1; }

# Pedir al usuario el ARN de MFA
read -p "Introduce el ID de cuenta de AWS (ej. 230672794366): " AWS_ACCOUNT_ID
read -p "Introduce el nombre del dispositivo MFA (ej. google_authenticator_phone): " MFA_DEVICE

MFA_ARN="arn:aws:iam::$AWS_ACCOUNT_ID:mfa/$MFA_DEVICE"

# Autenticación MFA con AWS para obtener un token temporal
read -p "Introduce el código MFA de 6 dígitos: " MFA_CODE

# Obtener un token temporal usando MFA
echo "Autenticando con AWS usando MFA..."
TEMP_CREDS=$(aws sts get-session-token --serial-number "$MFA_ARN" --token-code "$MFA_CODE" --output json)

# Verificar si se obtuvieron las credenciales temporales
if [ -z "$TEMP_CREDS" ]; then
    echo "Error: No se pudo obtener el token temporal de AWS. Verifica el código MFA."
    exit 1
fi

# Exportar credenciales temporales
export AWS_ACCESS_KEY_ID=$(echo "$TEMP_CREDS" | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo "$TEMP_CREDS" | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo "$TEMP_CREDS" | jq -r '.Credentials.SessionToken')

# Comprobar si las credenciales temporales han sido exportadas correctamente
if [ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ] || [ -z "$AWS_SESSION_TOKEN" ]; then
    echo "Error: No se exportaron correctamente las credenciales temporales."
    exit 1
else
    echo "Credenciales temporales obtenidas y exportadas correctamente."
fi

# Comprobar si las credenciales temporales funcionan ejecutando un comando sencillo
aws sts get-caller-identity ||
+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ NEXT_PUBLIC_JWT_REFRESH_TOKEN_SECRET=7c4c1c50-3230-45bf-9eae-c9b2e401c767
# Peñuelas capif
# NEXT_PUBLIC_API_BASE_URL="https://backoffice.mobilesandbox.cloud:38443/api"

NEXT_PUBLIC_API_BASE_URL="http://localhost:8085/api"
NEXT_PUBLIC_API_BASE_URL="https://backoffice.mobilesandbox.cloud:38443/api"

NEXT_PUBLIC_GRAFANA_BASE_URL="https://grafana.5gnacar.int"
NODE_ENV=development
+141 −46
Original line number Diff line number Diff line
@@ -10,22 +10,73 @@ export const getInvokers = async () => {
}

// GET invokers with pagination and date order
export const getInvokersPagesOrder = async ({ page, pageSize, order }) => {
export const getInvokersPagesOrder = async () => {
  try {
    const response = await axiosInstance.get(`/invokers/`, {
    const response = await axiosInstance.get(`/invokers/total`);

    return response;
  } catch (error) {
    throw new Error(`Error fetching invokers: ${error.message}`);
  }
}

export const getInvokerInformation = async invoker_id => {
  try {
    const response = await axiosInstance.get(`/invokers/alone`, {
      params: {
        page: page,
        pageSize: pageSize,
        order: order
        invoker_id: invoker_id,
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching invokers: ${error.message}`);
    throw new Error(`Error fetching invoker information: ${error.message}`);
  }
}

export const getProviderInformation = async api_prov_dom_id => {
  try {
    const response = await axiosInstance.get(`/providers/alone`, {
      params: {
        api_prov_dom_id: api_prov_dom_id,
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching provider information: ${error.message}`);
  }
}

export const getApisOfProvider = async apf_id => {
  try {
    const response = await axiosInstance.get(`/apis/provider`, {
      params: {
        apf_id: apf_id,
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching provider apis: ${error.message}`);
  }
}

export const getInvokerSecurityContext = async invoker_id => {
  try {
    const response = await axiosInstance.get(`/invokers/security`, {
      params: {
        invoker_id: invoker_id,
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching invoker's security context: ${error.message}`);
  }
}


// GET the num of invokers in the database
export const getNumInvokers = async () => {
  return axiosInstance.get(`/invokers/numInvokers`)
@@ -69,17 +120,12 @@ export const getProviders = async () => {
  return axiosInstance.get(`/providers/providersTotal`)
}

export const getProvidersPagesOrder = async ({ page, pageSize, order }) => {
export const getProvidersPagesOrder = async () => {
  try {
    const response = await axiosInstance.get(`/providers/`, {
      params: {
        page: page,
        pageSize: pageSize,
        order: order
      }
    });
    
    return response.data;
    return response;
  } catch (error) {
    throw new Error(`Error fetching providers: ${error.message}`);
  }
@@ -128,49 +174,104 @@ export const getApis = async () => {
  return axiosInstance.get(`/apis/apisTotal`)
}

export const getApiInformation = async api_id => {
  try {
    const response = await axiosInstance.get(`/apis/alone`, {
      params: {
        api_id: api_id,
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching api information: ${error.message}`);
  }
}


// GET num of apis in the database
export const getNumApis = async () => {
  return axiosInstance.get(`/apis/num`)
}

// GEt apis with pagination and date order
export const getApisPagesOrder = async ({ page, pageSize, order }) => {
export const getApisPagesOrder = async () => {
  try {
    const response = await axiosInstance.get(`/apis/`, {
      params: {
        page: page,
        pageSize: pageSize,
        order: order
      }
    });
    const response = await axiosInstance.get(`/apis/`);

    return response.data;
    return response;
  } catch (error) {
    throw new Error(`Error fetching apis: ${error.message}`);
  }
}

// export const deleteProvidersServices = async (selectedApis) => {
//   try {
//     // Asegúrate de que el body envíe las APIs seleccionadas correctamente
//     const response = await axiosInstance.delete('/apis/', {
//       data: {
//         api: selectedApis,
//       },
//     });
//     return response.data;
//   } catch (error) {
//     console.error('Error deleting APIs:', error);
//     throw error;
//   }
// };

// DELETE multiple apis
export const deleteProvidersServices = async apis => {
export const deleteProvidersServices = async (selectedApis) => {
  try {
    const data = {
      api: apis.map(({ apf_id, api_id }) => ({ apf_id, api_id }))
    };

    const response = await axiosInstance.delete('/apis/', {
      headers: {
        'Content-Type': 'application/json'
      },
      data: JSON.stringify(data)
      data: { api: selectedApis }
    });
    
    return response.data; // Retorna los datos de la respuesta si la solicitud fue exitosa
    return response.data;
  } catch (error) {
    throw error; // Lanza un error si la solicitud no fue exitosa
    console.error('Error deleting APIs:', error);
    throw error;
  }
};

// DELETE multiple apis
// export const deleteProvidersServices = async apis => {
//   try {
//     const data = {
//       api: apis.map(({ apf_id, api_id }) => ({ apf_id, api_id }))
//     };

//     const response = await axiosInstance.delete('/apis/', {
//       headers: {
//         'Content-Type': 'application/json'
//       },
//       data: {
//         api: selectedApis,
//       },
//     });

//     return response.data; // Retorna los datos de la respuesta si la solicitud fue exitosa
//   } catch (error) {
//     throw error; // Lanza un error si la solicitud no fue exitosa
//   }
// };

// DELETE multiple apis
// const deleteApis = async (selectedApis) => {
//   try {
//     const response = await axiosInstance.delete('/apis/', {
      // data: {
      //   api: selectedApis,
      // },
//     });

//     return response.data;
//   } catch (error) {
//     console.error('Error deleting APIs:', error.response ? error.response.data : error.message);
//     throw error;
//   }
// };





@@ -187,17 +288,11 @@ export const getUsers = async () => {
  return response.data;  // Devolver solo los datos relevantes
};

export const getUsersPagesOrder = async ({ page, pageSize, order }) => {
export const getUsersPagesOrder = async () => {
  try {
    const response = await axiosInstance.get(`/users/`, {
      params: {
        page: page,
        pageSize: pageSize,
        order: order
      }
    });
    const response = await axiosInstance.get(`/users/`);
    
    return response.data;
    return response;
  } catch (error) {
    throw new Error(`Error fetching users: ${error.message}`);
  }
Loading