45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import xml.etree.ElementTree as ET
|
|
from typing import Optional
|
|
from dataclasses import dataclass
|
|
|
|
import requests
|
|
from pathspec import PathSpec
|
|
|
|
|
|
class Jenkins:
|
|
|
|
@dataclass
|
|
class NodeInfo:
|
|
server_url: str
|
|
name: str
|
|
secret: Optional[str]
|
|
work_dir: PathSpec
|
|
internal_dir: PathSpec
|
|
server_url: str
|
|
|
|
def __init__(self, server_url, api_token):
|
|
self.server_url = server_url
|
|
self.api_token = api_token
|
|
|
|
def _log_in(self, username: str, password: str) -> (str, str):
|
|
response = requests.get(f"{self.server_url}/crumbIssuer/api/json")
|
|
response.raise_for_status()
|
|
payload = response.json()
|
|
return payload["crumbRequestField"], payload["crumb"]
|
|
|
|
def get_node_jnlp(self, node_name) -> str:
|
|
response = requests.get(
|
|
f"{self.server_url}/manage/computer/{node_name}/slave-agent.jnlp"
|
|
)
|
|
response.raise_for_status()
|
|
return response.text
|
|
|
|
def get_node_info(self, node_name: str) -> NodeInfo:
|
|
jnlp_info_raw = self.get_node_jnlp(node_name)
|
|
tree = ET.ElementTree(ET.fromstring(jnlp_info_raw))
|
|
arguments = tree.findall("./application-desc/")
|
|
(node_secret, node_name, _, work_dir, _, internal_dir, _, url) = [
|
|
arg.text for arg in arguments[:7]
|
|
]
|
|
return Jenkins.NodeInfo(url, node_name, node_secret, work_dir, internal_dir)
|