Source code for netbird.resources.peers
"""
Peers resource handler for NetBird API.
"""
from typing import Any, Dict, List, Optional
from ..models import PeerUpdate
from .base import BaseResource
[docs]
class PeersResource(BaseResource):
"""Handler for NetBird peers API endpoints.
Provides methods to manage NetBird peers including listing,
retrieving, updating, and deleting peers.
"""
[docs]
def list(
self, name: Optional[str] = None, ip: Optional[str] = None
) -> List[Dict[str, Any]]:
"""List all peers with optional filtering.
Args:
name: Filter peers by name (optional)
ip: Filter peers by IP address (optional)
Returns:
List of peer dictionaries
Example:
>>> # List all peers
>>> peers = client.peers.list()
>>>
>>> # Filter by name
>>> peers = client.peers.list(name="server-01")
>>>
>>> # Filter by IP
>>> peers = client.peers.list(ip="10.0.0.1")
"""
params = {}
if name:
params["name"] = name
if ip:
params["ip"] = ip
data = self.client.get("peers", params=params or None)
return self._parse_list_response(data)
[docs]
def get(self, peer_id: str) -> Dict[str, Any]:
"""Retrieve a specific peer.
Args:
peer_id: Unique peer identifier
Returns:
Peer dictionary
Example:
>>> peer = client.peers.get("peer-123")
>>> print(f"Peer: {peer['name']} ({peer['ip']})")
"""
data = self.client.get(f"peers/{peer_id}")
return self._parse_response(data)
[docs]
def update(self, peer_id: str, peer_data: PeerUpdate) -> Dict[str, Any]:
"""Update a peer.
Args:
peer_id: Unique peer identifier
peer_data: Peer update data
Returns:
Updated peer dictionary
Example:
>>> peer_data = PeerUpdate(
... name="updated-server",
... ssh_enabled=True
... )
>>> peer = client.peers.update("peer-123", peer_data)
"""
data = self.client.put(
f"peers/{peer_id}", data=peer_data.model_dump(exclude_unset=True)
)
return self._parse_response(data)
[docs]
def delete(self, peer_id: str) -> None:
"""Delete a peer.
Args:
peer_id: Unique peer identifier
Example:
>>> client.peers.delete("peer-123")
"""
self.client.delete(f"peers/{peer_id}")
[docs]
def get_accessible_peers(self, peer_id: str) -> List[Dict[str, Any]]:
"""List peers that a specific peer can connect to.
Args:
peer_id: Unique peer identifier
Returns:
List of accessible peer dictionaries
Example:
>>> accessible = client.peers.get_accessible_peers("peer-123")
>>> print(f"Can connect to {len(accessible)} peers")
"""
data = self.client.get(f"peers/{peer_id}/accessible-peers")
return self._parse_list_response(data)
[docs]
def create_temporary_access(
self, peer_id: str, data: Dict[str, Any]
) -> Dict[str, Any]:
"""Create a temporary access peer.
Args:
peer_id: Unique peer identifier
data: Temporary access data (name, wg_pub_key, rules)
Returns:
Created temporary access peer dictionary
"""
result = self.client.post(f"peers/{peer_id}/temporary-access", data=data)
return self._parse_response(result)
# Jobs (scoped under peers)
[docs]
def list_jobs(self, peer_id: str) -> List[Dict[str, Any]]:
"""List all jobs for a peer.
Args:
peer_id: Unique peer identifier
Returns:
List of job dictionaries
"""
data = self.client.get(f"peers/{peer_id}/jobs")
return self._parse_list_response(data)
[docs]
def create_job(self, peer_id: str, job_data: Dict[str, Any]) -> Dict[str, Any]:
"""Create a job for a peer.
Args:
peer_id: Unique peer identifier
job_data: Job creation data (workload)
Returns:
Created job dictionary
"""
data = self.client.post(f"peers/{peer_id}/jobs", data=job_data)
return self._parse_response(data)
[docs]
def get_job(self, peer_id: str, job_id: str) -> Dict[str, Any]:
"""Retrieve a specific job for a peer.
Args:
peer_id: Unique peer identifier
job_id: Unique job identifier
Returns:
Job dictionary
"""
data = self.client.get(f"peers/{peer_id}/jobs/{job_id}")
return self._parse_response(data)