Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
155f61e
Add babylon python client api
jkupferer Apr 14, 2026
89709a0
Simplify creation timestamp
jkupferer Apr 24, 2026
17a57e2
More client library work
jkupferer Apr 28, 2026
63717c5
Add find-useless-pools.py
jkupferer Apr 28, 2026
6ea365c
save work
jkupferer Apr 30, 2026
ede660f
Improve labeler
jkupferer May 5, 2026
42073b2
Add labeler
jkupferer May 5, 2026
e4fad10
Add find-cnv-workshops.py
jkupferer May 8, 2026
cb3fea1
working on fix-subjects.py
jkupferer May 11, 2026
861e929
Python packaging
jkupferer Jun 30, 2026
e9c4c48
Fix parameter check bug
jkupferer Jun 30, 2026
2485ea0
Add clustertentantpool
jkupferer Jun 30, 2026
d6f4efd
Add clustertentantpool
jkupferer Jun 30, 2026
cce40b8
pylint fixes
jkupferer Jul 2, 2026
96f9b78
Add status
jkupferer Jul 4, 2026
1653ff8
Add remove_cluster_from_status
jkupferer Jul 4, 2026
d74596a
Add BabylonApiException to package imports
jkupferer Jul 4, 2026
65d8f75
Change __definition to _definition
jkupferer Jul 4, 2026
84fd572
Add max_clusters
jkupferer Jul 4, 2026
ae81261
ResourceClaim creation
jkupferer Jul 4, 2026
95f564e
Allow passing api_client
jkupferer Jul 4, 2026
5516241
Allow passing api_client to create
jkupferer Jul 4, 2026
e9c01c7
Change resourceProvider to provider
jkupferer Jul 4, 2026
dfb5429
Fix detatch type
jkupferer Jul 4, 2026
46b2924
Fix classmethod
jkupferer Jul 4, 2026
946e5d8
Fix missing client
jkupferer Jul 4, 2026
fca173b
Fix missing await
jkupferer Jul 4, 2026
5ee00f0
Fix name
jkupferer Jul 4, 2026
3a9d264
more fixes
jkupferer Jul 4, 2026
016e9a6
Fix retries and refresh
jkupferer Jul 4, 2026
2053dd9
Fix method typehint
jkupferer Jul 4, 2026
2e9d893
Fix elif
jkupferer Jul 4, 2026
2ad9f35
Fix missing await
jkupferer Jul 4, 2026
c80e2bc
debug
jkupferer Jul 4, 2026
1922377
fix patch
jkupferer Jul 4, 2026
35d6c28
fix update
jkupferer Jul 4, 2026
1e8bf68
Fix missing await
jkupferer Jul 4, 2026
63cc14d
Add delete
jkupferer Jul 4, 2026
1e2ee04
Add is_deleting
jkupferer Jul 4, 2026
8f05f60
Add clusters property
jkupferer Jul 5, 2026
e90c859
Rename ClusterTenantPool to TenantClusterPool
jkupferer Jul 5, 2026
3973cc1
Add disable_autostop
jkupferer Jul 6, 2026
068537a
fix path
jkupferer Jul 6, 2026
6fa1019
Add lifespan stuff
jkupferer Jul 7, 2026
be8e906
Add resourcehandle.py
jkupferer Jul 7, 2026
438b521
Fix plural
jkupferer Jul 7, 2026
2b8e653
Add status start
jkupferer Jul 7, 2026
4e80fec
Add maximum timedelta
jkupferer Jul 7, 2026
8f4c07d
Fix relative_maximum
jkupferer Jul 7, 2026
9af9fe7
Add workaround for timedelta str
jkupferer Jul 7, 2026
3b0d61c
Restore disabled code
jkupferer Jul 7, 2026
1a92a9c
Fix poolboy templating comparison operators
jkupferer Jul 7, 2026
b6f2387
Remove async-test.py
jkupferer Jul 7, 2026
f97365e
Enable disabled code
jkupferer Jul 7, 2026
6970dca
Remove unused import
jkupferer Jul 7, 2026
b9b4e1c
Add set_cluster_sandbox_api_state
jkupferer Jul 8, 2026
ce07475
Add name for tenantclusterpool clusters
jkupferer Jul 8, 2026
fc1192d
Fix deletion_timestamp method
jkupferer Jul 10, 2026
3d4ec0d
Add min_clusters
jkupferer Jul 13, 2026
7ef4d2e
Add annotations import
jkupferer Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions client/python/babylon_async/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Copyright © 2026 Red Hat

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1 change: 1 addition & 0 deletions client/python/babylon_async/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Babylon Asynchronous Client Library
23 changes: 23 additions & 0 deletions client/python/babylon_async/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[build-system]
requires = ["hatchling >= 1.26"]
build-backend = "hatchling.build"

[project]
name = "babylon_async"
version = "0.0.1"
authors = [
{ name="Johnathan Kupferer", email="jkupfere@redhat.com" },
]
description = "Babylon asynchronous library package"
readme = "README.md"
requires-python = ">=3.9"
classifiers = [
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
]
license = "MIT"
license-files = ["LICENSE"]

[project.urls]
Homepage = "https://github.com/redhat-cop/babylon"
Issues = "https://github.com/redhat-cop/babylon/issues"
9 changes: 9 additions & 0 deletions client/python/babylon_async/src/babylon_async/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from .client import BabylonClient
from .exceptions import BabylonApiException

from .anarchyrun import AnarchyRun
from .anarchysubject import AnarchySubject
from .catalogitem import CatalogItem
from .tenantclusterpool import TenantClusterPool
from .resourceclaim import ResourceClaim
from .resourcepool import ResourcePool
73 changes: 73 additions & 0 deletions client/python/babylon_async/src/babylon_async/anarchygovernor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
from __future__ import annotations
from typing import List, Mapping

from .k8s_object import K8sObject

class AnarchyGovernor(K8sObject):
api_group = "anarchy.gpte.redhat.com"
api_version = "v1"
kind = "AnarchyGovernor"
plural = "anarchygovernors"
api_group_version = f"{api_group}/{api_version}"

def get_sandboxes(self) -> List[Mapping]:
return [
SandboxSpec(item)
for item in self.spec.job_vars['__meta__'].get('sandboxes', [])
]

@property
def job_vars(self) -> Mapping:
return self.spec.job_vars

@property
def spec(self) -> AnarchyGovernorSpec:
return AnarchyGovernorSpec(self._definition)

@property
def vars(self) -> Mapping:
return self.spec.vars

class AnarchyGovernorSpec:
def __init__(self, definition):
self._definition = definition

@property
def job_vars(self) -> Mapping:
return self._definition.get('vars', {}).get('job_vars', {})

@property
def vars(self) -> Mapping:
return self._definition.get('vars', {})

class SandboxSpec:
def __init__(self, definition):
self._definition = definition

@property
def alias(self) -> str|None:
return self._definition.get('alias')

@property
def annotations(self) -> Mapping[str, str]|None:
return self._definition.get('annotations')

@property
def cloud_selector(self) -> Mapping[str, str]|None:
return self._definition.get('cloud_selector')

@property
def kind(self) -> str:
return self._definition['kind']

@property
def namespace_suffix(self) -> str|None:
return self._definition.get('namespace_suffix')

@property
def quota(self) -> Mapping[str, str]|None:
return self._definition.get('quota')

@property
def var(self) -> str|None:
return self._definition.get('var')
110 changes: 110 additions & 0 deletions client/python/babylon_async/src/babylon_async/anarchyrun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
from __future__ import annotations

from datetime import datetime

from kubernetes_asyncio.client import (
ApiException as KubernetesApiException
)

from .k8s_object import K8sObject

class AnarchyRun(K8sObject):
api_group = "anarchy.gpte.redhat.com"
api_version = "v1"
kind = "AnarchyRun"
plural = "anarchyruns"
api_group_version = f"{api_group}/{api_version}"

@property
def is_active(self) -> bool:
value = self.metadata.labels.get('anarchy.gpte.redhat.com/runner')
if value.startswith('anarchy-runner-'):
return True
return self.state in {'failed', 'pending'}

@property
def is_finished(self) -> bool:
return self.state in {'canceled', 'successful'}

@property
def is_queued(self) -> bool:
return self.state == 'queued'

@property
def runner_pod_name(self) -> str|None:
value = self.metadata.labels.get('anarchy.gpte.redhat.com/runner')
if value.startswith('anarchy-runner-'):
return value
return None

@property
def spec(self) -> AnarchyRunSpec:
return AnarchyRunSpec(self._definition['spec'])

@property
def state(self) -> str|None:
value = self.metadata.labels.get('anarchy.gpte.redhat.com/runner')
if value in {'canceled', 'failed', 'pending', 'queued', 'successful'}:
return value
if value.startswith('anarchy-runner-'):
return 'running'
return None

@property
def status(self) -> AnarchyRunStatus|None:
if 'status' not in self._definition:
return None
return AnarchyRunStatus(self._definition['status'])

async def check_runner_pod_exists(self) -> bool:
if self.runner_pod_name is None:
return True
try:
await self.client.core_v1_api.read_namespaced_pod(
name=self.runner_pod_name,
namespace=self.metadata.namespace,
)
return True
except KubernetesApiException as exception:
if exception.status == 404:
return False
raise

async def set_runner_state(self, value) -> None:
await self.patch({
"metadata": {
"labels": {
"anarchy.gpte.redhat.com/runner": value,
}
}
})

class AnarchyRunSpec:
def __init__(self, definition):
self._definition = definition

class AnarchyRunStatus:
def __init__(self, definition):
self._definition = definition

@property
def retry_after_datetime(self) -> datetime|None:
ts = self.retry_after_timestamp
if ts is None:
return None
return datetime.strptime(ts, '%Y-%m-%dT%H:%M:%S%z')

@property
def retry_after_timestamp(self) -> str|None:
return self._definition.get('retryAfter')

@property
def run_post_datetime(self) -> datetime|None:
ts = self.run_post_timestamp
if ts is None:
return None
return datetime.strptime(ts, '%Y-%m-%dT%H:%M:%S%z')

@property
def run_post_timestamp(self) -> str|None:
return self._definition.get('runPostTimestamp')
56 changes: 56 additions & 0 deletions client/python/babylon_async/src/babylon_async/anarchysubject.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from __future__ import annotations
from typing import Generator

from .k8s_object import K8sObject
from .resourcereference import ResourceReference

from .anarchyrun import AnarchyRun

class AnarchySubject(K8sObject):
api_group = "anarchy.gpte.redhat.com"
api_version = "v1"
kind = "AnarchySubject"
plural = "anarchysubjects"
api_group_version = f"{api_group}/{api_version}"

@property
def spec(self) -> AnarchySubjectSpec:
return AnarchySubjectSpec(self._definition['spec'])

@property
def status(self) -> AnarchySubjectStatus|None:
if 'status' not in self._definition:
return None
return AnarchySubjectStatus(self._definition['status'])

async def get_anarchy_run(self, name:str) -> AnarchyRun:
return await self.client.get_anarchy_run(
name=name,
namespace=self.namespace,
)

async def list_anarchy_runs(self) -> Generator[AnarchyRun, None, None]:
async for anarchy_run in self.client.list_anarchy_runs_for_anarchy_subject(self):
yield anarchy_run

class AnarchySubjectSpec:
def __init__(self, definition):
self._definition = definition

class AnarchySubjectStatus:
def __init__(self, definition):
self._definition = definition

@property
def runs(self) -> AnarchySubjectStatusRuns:
return AnarchySubjectStatusRuns(self._definition.get('runs', {}))

class AnarchySubjectStatusRuns:
def __init__(self, definition):
self._definition = definition

@property
def active(self) -> list[ResourceReference]:
return [
ResourceReference(item) for item in self._definition.get('active', [])
]
Loading