|
1 | | -from dataclasses import dataclass, field |
2 | | -from dataclasses_json import dataclass_json, config, Undefined # type: ignore |
| 1 | +from dataclasses import dataclass |
| 2 | +from dataclasses_json import dataclass_json, Undefined # type: ignore |
3 | 3 | from typing import List, Optional, Dict |
4 | 4 | from enum import Enum |
5 | 5 |
|
@@ -275,6 +275,79 @@ class RegistryCredential: |
275 | 275 | created_at: str |
276 | 276 |
|
277 | 277 |
|
| 278 | +@dataclass_json |
| 279 | +@dataclass |
| 280 | +class BaseRegistryCredentials: |
| 281 | + """Base class for registry credentials""" |
| 282 | + name: str |
| 283 | + type: ContainerRegistryType |
| 284 | + |
| 285 | + |
| 286 | +@dataclass_json |
| 287 | +@dataclass |
| 288 | +class DockerHubCredentials(BaseRegistryCredentials): |
| 289 | + """Credentials for DockerHub registry""" |
| 290 | + username: str |
| 291 | + access_token: str |
| 292 | + |
| 293 | + def __init__(self, name: str, username: str, access_token: str): |
| 294 | + super().__init__(name=name, type=ContainerRegistryType.DOCKERHUB) |
| 295 | + self.username = username |
| 296 | + self.access_token = access_token |
| 297 | + |
| 298 | + |
| 299 | +@dataclass_json |
| 300 | +@dataclass |
| 301 | +class GithubCredentials(BaseRegistryCredentials): |
| 302 | + """Credentials for GitHub Container Registry""" |
| 303 | + username: str |
| 304 | + access_token: str |
| 305 | + |
| 306 | + def __init__(self, name: str, username: str, access_token: str): |
| 307 | + super().__init__(name=name, type=ContainerRegistryType.GITHUB) |
| 308 | + self.username = username |
| 309 | + self.access_token = access_token |
| 310 | + |
| 311 | + |
| 312 | +@dataclass_json |
| 313 | +@dataclass |
| 314 | +class GCRCredentials(BaseRegistryCredentials): |
| 315 | + """Credentials for Google Container Registry""" |
| 316 | + service_account_key: str |
| 317 | + |
| 318 | + def __init__(self, name: str, service_account_key: str): |
| 319 | + super().__init__(name=name, type=ContainerRegistryType.GCR) |
| 320 | + self.service_account_key = service_account_key |
| 321 | + |
| 322 | + |
| 323 | +@dataclass_json |
| 324 | +@dataclass |
| 325 | +class AWSECRCredentials(BaseRegistryCredentials): |
| 326 | + """Credentials for AWS Elastic Container Registry""" |
| 327 | + access_key_id: str |
| 328 | + secret_access_key: str |
| 329 | + region: str |
| 330 | + ecr_repo: str |
| 331 | + |
| 332 | + def __init__(self, name: str, access_key_id: str, secret_access_key: str, region: str, ecr_repo: str): |
| 333 | + super().__init__(name=name, type=ContainerRegistryType.AWS_ECR) |
| 334 | + self.access_key_id = access_key_id |
| 335 | + self.secret_access_key = secret_access_key |
| 336 | + self.region = region |
| 337 | + self.ecr_repo = ecr_repo |
| 338 | + |
| 339 | + |
| 340 | +@dataclass_json |
| 341 | +@dataclass |
| 342 | +class CustomRegistryCredentials(BaseRegistryCredentials): |
| 343 | + """Credentials for custom container registries""" |
| 344 | + docker_config_json: str |
| 345 | + |
| 346 | + def __init__(self, name: str, docker_config_json: str): |
| 347 | + super().__init__(name=name, type=ContainerRegistryType.CUSTOM) |
| 348 | + self.docker_config_json = docker_config_json |
| 349 | + |
| 350 | + |
278 | 351 | class ContainersService: |
279 | 352 | """Service for managing container deployments""" |
280 | 353 |
|
@@ -581,73 +654,13 @@ def get_registry_credentials(self) -> List[RegistryCredential]: |
581 | 654 | response = self.client.get(CONTAINER_REGISTRY_CREDENTIALS_ENDPOINT) |
582 | 655 | return [RegistryCredential.from_dict(credential) for credential in response.json()] |
583 | 656 |
|
584 | | - def add_registry_credentials( |
585 | | - self, |
586 | | - name: str, |
587 | | - registry_type: ContainerRegistryType, |
588 | | - username: str = None, |
589 | | - access_token: str = None, |
590 | | - service_account_key: str = None, |
591 | | - docker_config_json: str = None, |
592 | | - access_key_id: str = None, |
593 | | - secret_access_key: str = None, |
594 | | - region: str = None, |
595 | | - ecr_repo: str = None |
596 | | - ) -> None: |
| 657 | + def add_registry_credentials(self, credentials: BaseRegistryCredentials) -> None: |
597 | 658 | """Add registry credentials |
598 | 659 |
|
599 | | - :param name: name of the credentials |
600 | | - :type name: str |
601 | | - :param registry_type: type of registry (e.g. ContainerRegistryType.DOCKERHUB) |
602 | | - :type registry_type: ContainerRegistryType |
603 | | - :param username: registry username (required for DOCKERHUB and GITHUB) |
604 | | - :type username: str |
605 | | - :param access_token: registry access token (required for DOCKERHUB and GITHUB) |
606 | | - :type access_token: str |
607 | | - :param service_account_key: service account key JSON string (required for GCR) |
608 | | - :type service_account_key: str |
609 | | - :param docker_config_json: docker config JSON string (required for CUSTOM) |
610 | | - :type docker_config_json: str |
611 | | - :param access_key_id: AWS access key ID (required for AWS_ECR) |
612 | | - :type access_key_id: str |
613 | | - :param secret_access_key: AWS secret access key (required for AWS_ECR) |
614 | | - :type secret_access_key: str |
615 | | - :param region: AWS region (required for AWS_ECR) |
616 | | - :type region: str |
617 | | - :param ecr_repo: ECR repository URL (required for AWS_ECR) |
618 | | - :type ecr_repo: str |
| 660 | + :param credentials: Registry credentials object |
| 661 | + :type credentials: BaseRegistryCredentials |
619 | 662 | """ |
620 | | - data = { |
621 | | - "name": name, |
622 | | - "type": registry_type.value |
623 | | - } |
624 | | - |
625 | | - # Add specific parameters based on registry type |
626 | | - if registry_type == ContainerRegistryType.DOCKERHUB or registry_type == ContainerRegistryType.GITHUB: |
627 | | - if not username or not access_token: |
628 | | - raise ValueError( |
629 | | - f"Username and access_token are required for {registry_type.value} registry type") |
630 | | - data["username"] = username |
631 | | - data["access_token"] = access_token |
632 | | - elif registry_type == ContainerRegistryType.GCR: |
633 | | - if not service_account_key: |
634 | | - raise ValueError( |
635 | | - "service_account_key is required for GCR registry type") |
636 | | - data["service_account_key"] = service_account_key |
637 | | - elif registry_type == ContainerRegistryType.AWS_ECR: |
638 | | - if not all([access_key_id, secret_access_key, region, ecr_repo]): |
639 | | - raise ValueError( |
640 | | - "access_key_id, secret_access_key, region, and ecr_repo are required for AWS_ECR registry type") |
641 | | - data["access_key_id"] = access_key_id |
642 | | - data["secret_access_key"] = secret_access_key |
643 | | - data["region"] = region |
644 | | - data["ecr_repo"] = ecr_repo |
645 | | - elif registry_type == ContainerRegistryType.CUSTOM: |
646 | | - if not docker_config_json: |
647 | | - raise ValueError( |
648 | | - "docker_config_json is required for CUSTOM registry type") |
649 | | - data["docker_config_json"] = docker_config_json |
650 | | - |
| 663 | + data = credentials.to_dict() |
651 | 664 | self.client.post(CONTAINER_REGISTRY_CREDENTIALS_ENDPOINT, data) |
652 | 665 |
|
653 | 666 | def delete_registry_credentials(self, credentials_name: str) -> None: |
|
0 commit comments