load_balancer.py•12.5 kB
"""
Tools for managing OCI Load Balancer resources.
"""
import logging
from typing import Dict, List, Any, Optional
import oci
logger = logging.getLogger(__name__)
def list_load_balancers(load_balancer_client: oci.load_balancer.LoadBalancerClient, 
                        compartment_id: str) -> List[Dict[str, Any]]:
    """
    List all load balancers in a compartment.
    
    Args:
        load_balancer_client: OCI LoadBalancer client
        compartment_id: OCID of the compartment
        
    Returns:
        List of load balancers with their details
    """
    try:
        load_balancers_response = oci.pagination.list_call_get_all_results(
            load_balancer_client.list_load_balancers,
            compartment_id
        )
        
        load_balancers = []
        for lb in load_balancers_response.data:
            load_balancers.append({
                "id": lb.id,
                "display_name": lb.display_name,
                "compartment_id": lb.compartment_id,
                "lifecycle_state": lb.lifecycle_state,
                "time_created": str(lb.time_created),
                "shape_name": lb.shape_name,
                "is_private": lb.is_private,
                "ip_addresses": [
                    {
                        "ip_address": ip.ip_address,
                        "is_public": ip.is_public,
                    }
                    for ip in lb.ip_addresses
                ] if lb.ip_addresses else [],
                "subnet_ids": lb.subnet_ids,
                "network_security_group_ids": lb.network_security_group_ids,
            })
        
        logger.info(f"Found {len(load_balancers)} load balancers in compartment {compartment_id}")
        return load_balancers
        
    except Exception as e:
        logger.exception(f"Error listing load balancers: {e}")
        raise
def get_load_balancer(load_balancer_client: oci.load_balancer.LoadBalancerClient, 
                      load_balancer_id: str) -> Dict[str, Any]:
    """
    Get details of a specific load balancer.
    
    Args:
        load_balancer_client: OCI LoadBalancer client
        load_balancer_id: OCID of the load balancer
        
    Returns:
        Details of the load balancer
    """
    try:
        lb = load_balancer_client.get_load_balancer(load_balancer_id).data
        
        # Format backend sets
        backend_sets = {}
        if lb.backend_sets:
            for name, backend_set in lb.backend_sets.items():
                backend_sets[name] = {
                    "name": name,
                    "policy": backend_set.policy,
                    "backends": [
                        {
                            "ip_address": backend.ip_address,
                            "port": backend.port,
                            "weight": backend.weight,
                            "drain": backend.drain,
                            "backup": backend.backup,
                            "offline": backend.offline,
                        }
                        for backend in backend_set.backends
                    ] if backend_set.backends else [],
                    "health_checker": {
                        "protocol": backend_set.health_checker.protocol,
                        "url_path": backend_set.health_checker.url_path,
                        "port": backend_set.health_checker.port,
                        "return_code": backend_set.health_checker.return_code,
                        "retries": backend_set.health_checker.retries,
                        "timeout_in_millis": backend_set.health_checker.timeout_in_millis,
                        "interval_in_millis": backend_set.health_checker.interval_in_millis,
                        "response_body_regex": backend_set.health_checker.response_body_regex,
                    } if backend_set.health_checker else None,
                }
        
        # Format listeners
        listeners = {}
        if lb.listeners:
            for name, listener in lb.listeners.items():
                listeners[name] = {
                    "name": name,
                    "default_backend_set_name": listener.default_backend_set_name,
                    "port": listener.port,
                    "protocol": listener.protocol,
                    "hostname_names": listener.hostname_names,
                    "path_route_set_name": listener.path_route_set_name,
                    "ssl_configuration": {
                        "certificate_name": listener.ssl_configuration.certificate_name if listener.ssl_configuration else None,
                        "verify_peer_certificate": listener.ssl_configuration.verify_peer_certificate if listener.ssl_configuration else None,
                        "verify_depth": listener.ssl_configuration.verify_depth if listener.ssl_configuration else None,
                    } if listener.ssl_configuration else None,
                    "connection_configuration": {
                        "idle_timeout": listener.connection_configuration.idle_timeout if listener.connection_configuration else None,
                        "backend_tcp_proxy_protocol_version": listener.connection_configuration.backend_tcp_proxy_protocol_version if listener.connection_configuration else None,
                    } if listener.connection_configuration else None,
                }
        
        lb_details = {
            "id": lb.id,
            "display_name": lb.display_name,
            "compartment_id": lb.compartment_id,
            "lifecycle_state": lb.lifecycle_state,
            "time_created": str(lb.time_created),
            "shape_name": lb.shape_name,
            "is_private": lb.is_private,
            "ip_addresses": [
                {
                    "ip_address": ip.ip_address,
                    "is_public": ip.is_public,
                }
                for ip in lb.ip_addresses
            ] if lb.ip_addresses else [],
            "subnet_ids": lb.subnet_ids,
            "network_security_group_ids": lb.network_security_group_ids,
            "backend_sets": backend_sets,
            "listeners": listeners,
            "certificates": dict(lb.certificates) if lb.certificates else {},
            "path_route_sets": dict(lb.path_route_sets) if lb.path_route_sets else {},
            "hostnames": dict(lb.hostnames) if lb.hostnames else {},
        }
        
        logger.info(f"Retrieved details for load balancer {load_balancer_id}")
        return lb_details
        
    except Exception as e:
        logger.exception(f"Error getting load balancer details: {e}")
        raise
def list_network_load_balancers(network_load_balancer_client: oci.network_load_balancer.NetworkLoadBalancerClient, 
                                compartment_id: str) -> List[Dict[str, Any]]:
    """
    List all network load balancers in a compartment.
    
    Args:
        network_load_balancer_client: OCI NetworkLoadBalancer client
        compartment_id: OCID of the compartment
        
    Returns:
        List of network load balancers with their details
    """
    try:
        nlbs_response = oci.pagination.list_call_get_all_results(
            network_load_balancer_client.list_network_load_balancers,
            compartment_id
        )
        
        nlbs = []
        for nlb in nlbs_response.data:
            nlbs.append({
                "id": nlb.id,
                "display_name": nlb.display_name,
                "compartment_id": nlb.compartment_id,
                "lifecycle_state": nlb.lifecycle_state,
                "time_created": str(nlb.time_created),
                "is_private": nlb.is_private,
                "ip_addresses": [
                    {
                        "ip_address": ip.ip_address,
                        "is_public": ip.is_public,
                        "ip_version": ip.ip_version,
                    }
                    for ip in nlb.ip_addresses
                ] if nlb.ip_addresses else [],
                "subnet_id": nlb.subnet_id,
                "network_security_group_ids": nlb.network_security_group_ids,
                "is_preserve_source_destination": nlb.is_preserve_source_destination,
            })
        
        logger.info(f"Found {len(nlbs)} network load balancers in compartment {compartment_id}")
        return nlbs
        
    except Exception as e:
        logger.exception(f"Error listing network load balancers: {e}")
        raise
def get_network_load_balancer(network_load_balancer_client: oci.network_load_balancer.NetworkLoadBalancerClient, 
                               network_load_balancer_id: str) -> Dict[str, Any]:
    """
    Get details of a specific network load balancer.
    
    Args:
        network_load_balancer_client: OCI NetworkLoadBalancer client
        network_load_balancer_id: OCID of the network load balancer
        
    Returns:
        Details of the network load balancer
    """
    try:
        nlb = network_load_balancer_client.get_network_load_balancer(network_load_balancer_id).data
        
        # Format backend sets
        backend_sets = {}
        if nlb.backend_sets:
            for name, backend_set in nlb.backend_sets.items():
                backend_sets[name] = {
                    "name": name,
                    "policy": backend_set.policy,
                    "is_preserve_source": backend_set.is_preserve_source,
                    "backends": [
                        {
                            "ip_address": backend.ip_address,
                            "port": backend.port,
                            "weight": backend.weight,
                            "target_id": backend.target_id,
                            "is_drain": backend.is_drain,
                            "is_backup": backend.is_backup,
                            "is_offline": backend.is_offline,
                        }
                        for backend in backend_set.backends
                    ] if backend_set.backends else [],
                    "health_checker": {
                        "protocol": backend_set.health_checker.protocol,
                        "port": backend_set.health_checker.port,
                        "url_path": backend_set.health_checker.url_path,
                        "return_code": backend_set.health_checker.return_code,
                        "retries": backend_set.health_checker.retries,
                        "timeout_in_millis": backend_set.health_checker.timeout_in_millis,
                        "interval_in_millis": backend_set.health_checker.interval_in_millis,
                        "request_data": backend_set.health_checker.request_data,
                        "response_data": backend_set.health_checker.response_data,
                    } if backend_set.health_checker else None,
                }
        
        # Format listeners
        listeners = {}
        if nlb.listeners:
            for name, listener in nlb.listeners.items():
                listeners[name] = {
                    "name": name,
                    "default_backend_set_name": listener.default_backend_set_name,
                    "port": listener.port,
                    "protocol": listener.protocol,
                    "ip_version": listener.ip_version,
                }
        
        nlb_details = {
            "id": nlb.id,
            "display_name": nlb.display_name,
            "compartment_id": nlb.compartment_id,
            "lifecycle_state": nlb.lifecycle_state,
            "time_created": str(nlb.time_created),
            "is_private": nlb.is_private,
            "ip_addresses": [
                {
                    "ip_address": ip.ip_address,
                    "is_public": ip.is_public,
                    "ip_version": ip.ip_version,
                }
                for ip in nlb.ip_addresses
            ] if nlb.ip_addresses else [],
            "subnet_id": nlb.subnet_id,
            "network_security_group_ids": nlb.network_security_group_ids,
            "is_preserve_source_destination": nlb.is_preserve_source_destination,
            "backend_sets": backend_sets,
            "listeners": listeners,
        }
        
        logger.info(f"Retrieved details for network load balancer {network_load_balancer_id}")
        return nlb_details
        
    except Exception as e:
        logger.exception(f"Error getting network load balancer details: {e}")
        raise