mirror of
https://github.com/ansible-collections/hetzner.hcloud
synced 2025-01-10 11:18:46 +00:00
4ae557c287
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [hcloud](https://togithub.com/hetznercloud/hcloud-python) ([changelog](https://togithub.com/hetznercloud/hcloud-python/blob/main/CHANGELOG.md)) | `1.28.0` -> `1.29.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/hcloud/1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/hcloud/1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/hcloud/1.28.0/1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/hcloud/1.28.0/1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>hetznercloud/hcloud-python (hcloud)</summary> ### [`v1.29.0`](https://togithub.com/hetznercloud/hcloud-python/blob/HEAD/CHANGELOG.md#1290-2023-09-25) [Compare Source](https://togithub.com/hetznercloud/hcloud-python/compare/v1.28.0...v1.29.0) ##### Features - add domain attribute type hints to bound models ([#​300](https://togithub.com/hetznercloud/hcloud-python/issues/300)) ([6d46d06](6d46d06c42
)) - **firewalls:** add `applied_to_resources` to `FirewallResource` ([#​297](https://togithub.com/hetznercloud/hcloud-python/issues/297)) ([55d2b20](55d2b2043e
)) ##### Bug Fixes - missing BaseDomain base class inheritance ([#​303](https://togithub.com/hetznercloud/hcloud-python/issues/303)) ([0ee7598](0ee759856c
)) ##### Dependencies - update actions/checkout action to v4 ([#​295](https://togithub.com/hetznercloud/hcloud-python/issues/295)) ([c02b446](c02b4468f0
)) - update dependency sphinx to >=7.2.2,<7.3 ([#​291](https://togithub.com/hetznercloud/hcloud-python/issues/291)) ([10234ea](10234ea7bf
)) - update dependency sphinx to v7 ([#​211](https://togithub.com/hetznercloud/hcloud-python/issues/211)) ([f635c94](f635c94c23
)) - update pre-commit hook asottile/pyupgrade to v3.11.0 ([#​298](https://togithub.com/hetznercloud/hcloud-python/issues/298)) ([4bbd0cc](4bbd0ccb0f
)) - update pre-commit hook asottile/pyupgrade to v3.11.1 ([#​299](https://togithub.com/hetznercloud/hcloud-python/issues/299)) ([2f9fcd7](2f9fcd7bb8
)) - update pre-commit hook asottile/pyupgrade to v3.13.0 ([#​301](https://togithub.com/hetznercloud/hcloud-python/issues/301)) ([951dbf3](951dbf3e3b
)) - update pre-commit hook pre-commit/mirrors-prettier to v3.0.3 ([#​294](https://togithub.com/hetznercloud/hcloud-python/issues/294)) ([381e336](381e336ff1
)) - update pre-commit hook psf/black to v23.9.1 ([#​296](https://togithub.com/hetznercloud/hcloud-python/issues/296)) ([4374a7b](4374a7be9f
)) ##### Documentation - load token from env in examples scripts ([#​302](https://togithub.com/hetznercloud/hcloud-python/issues/302)) ([f18c9a6](f18c9a60e0
)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/ansible-collections/hetzner.hcloud). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi45Ny4xIiwidXBkYXRlZEluVmVyIjoiMzYuOTcuMSIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: jo <ljonas@riseup.net>
221 lines
6.8 KiB
Python
221 lines
6.8 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
try:
|
|
from dateutil.parser import isoparse
|
|
except ImportError:
|
|
isoparse = None
|
|
|
|
from ..core import BaseDomain
|
|
|
|
if TYPE_CHECKING:
|
|
from ..actions import BoundAction
|
|
from ..servers import BoundServer, Server
|
|
from .client import BoundFirewall
|
|
|
|
|
|
class Firewall(BaseDomain):
|
|
"""Firewall Domain
|
|
|
|
:param id: int
|
|
ID of the Firewall
|
|
:param name: str
|
|
Name of the Firewall
|
|
:param labels: dict
|
|
User-defined labels (key-value pairs)
|
|
:param rules: List[:class:`FirewallRule <hcloud.firewalls.domain.FirewallRule>`]
|
|
Rules of the Firewall
|
|
:param applied_to: List[:class:`FirewallResource <hcloud.firewalls.domain.FirewallResource>`]
|
|
Resources currently using the Firewall
|
|
:param created: datetime
|
|
Point in time when the image was created
|
|
"""
|
|
|
|
__slots__ = ("id", "name", "labels", "rules", "applied_to", "created")
|
|
|
|
def __init__(
|
|
self,
|
|
id: int | None = None,
|
|
name: str | None = None,
|
|
labels: dict[str, str] | None = None,
|
|
rules: list[FirewallRule] | None = None,
|
|
applied_to: list[FirewallResource] | None = None,
|
|
created: str | None = None,
|
|
):
|
|
self.id = id
|
|
self.name = name
|
|
self.rules = rules
|
|
self.applied_to = applied_to
|
|
self.labels = labels
|
|
self.created = isoparse(created) if created else None
|
|
|
|
|
|
class FirewallRule(BaseDomain):
|
|
"""Firewall Rule Domain
|
|
|
|
:param direction: str
|
|
The Firewall which was created
|
|
:param port: str
|
|
Port to which traffic will be allowed, only applicable for protocols TCP and UDP, specify port ranges by using
|
|
- as a indicator, Sample: 80-85 means all ports between 80 & 85 (80, 82, 83, 84, 85)
|
|
:param protocol: str
|
|
Select traffic direction on which rule should be applied. Use source_ips for direction in and destination_ips for direction out.
|
|
:param source_ips: List[str]
|
|
List of permitted IPv4/IPv6 addresses in CIDR notation. Use 0.0.0.0/0 to allow all IPv4 addresses and ::/0 to allow all IPv6 addresses. You can specify 100 CIDRs at most.
|
|
:param destination_ips: List[str]
|
|
List of permitted IPv4/IPv6 addresses in CIDR notation. Use 0.0.0.0/0 to allow all IPv4 addresses and ::/0 to allow all IPv6 addresses. You can specify 100 CIDRs at most.
|
|
:param description: str
|
|
Short description of the firewall rule
|
|
"""
|
|
|
|
__slots__ = (
|
|
"direction",
|
|
"port",
|
|
"protocol",
|
|
"source_ips",
|
|
"destination_ips",
|
|
"description",
|
|
)
|
|
|
|
DIRECTION_IN = "in"
|
|
"""Firewall Rule Direction In"""
|
|
DIRECTION_OUT = "out"
|
|
"""Firewall Rule Direction Out"""
|
|
|
|
PROTOCOL_UDP = "udp"
|
|
"""Firewall Rule Protocol UDP"""
|
|
PROTOCOL_ICMP = "icmp"
|
|
"""Firewall Rule Protocol ICMP"""
|
|
PROTOCOL_TCP = "tcp"
|
|
"""Firewall Rule Protocol TCP"""
|
|
PROTOCOL_ESP = "esp"
|
|
"""Firewall Rule Protocol ESP"""
|
|
PROTOCOL_GRE = "gre"
|
|
"""Firewall Rule Protocol GRE"""
|
|
|
|
def __init__(
|
|
self,
|
|
direction: str,
|
|
protocol: str,
|
|
source_ips: list[str],
|
|
port: str | None = None,
|
|
destination_ips: list[str] | None = None,
|
|
description: str | None = None,
|
|
):
|
|
self.direction = direction
|
|
self.port = port
|
|
self.protocol = protocol
|
|
self.source_ips = source_ips
|
|
self.destination_ips = destination_ips or []
|
|
self.description = description
|
|
|
|
def to_payload(self) -> dict[str, Any]:
|
|
"""
|
|
Generates the request payload from this domain object.
|
|
"""
|
|
payload: dict[str, Any] = {
|
|
"direction": self.direction,
|
|
"protocol": self.protocol,
|
|
"source_ips": self.source_ips,
|
|
}
|
|
if len(self.destination_ips) > 0:
|
|
payload["destination_ips"] = self.destination_ips
|
|
if self.port is not None:
|
|
payload["port"] = self.port
|
|
if self.description is not None:
|
|
payload["description"] = self.description
|
|
return payload
|
|
|
|
|
|
class FirewallResource(BaseDomain):
|
|
"""Firewall Used By Domain
|
|
|
|
:param type: str
|
|
Type of resource referenced
|
|
:param server: Optional[Server]
|
|
Server the Firewall is applied to
|
|
:param label_selector: Optional[FirewallResourceLabelSelector]
|
|
Label Selector for Servers the Firewall should be applied to
|
|
:param applied_to_resources: (read-only) List of effective resources the firewall is
|
|
applied to.
|
|
"""
|
|
|
|
__slots__ = ("type", "server", "label_selector", "applied_to_resources")
|
|
|
|
TYPE_SERVER = "server"
|
|
"""Firewall Used By Type Server"""
|
|
TYPE_LABEL_SELECTOR = "label_selector"
|
|
"""Firewall Used By Type label_selector"""
|
|
|
|
def __init__(
|
|
self,
|
|
type: str,
|
|
server: Server | BoundServer | None = None,
|
|
label_selector: FirewallResourceLabelSelector | None = None,
|
|
applied_to_resources: list[FirewallResourceAppliedToResources] | None = None,
|
|
):
|
|
self.type = type
|
|
self.server = server
|
|
self.label_selector = label_selector
|
|
self.applied_to_resources = applied_to_resources
|
|
|
|
def to_payload(self) -> dict[str, Any]:
|
|
"""
|
|
Generates the request payload from this domain object.
|
|
"""
|
|
payload: dict[str, Any] = {"type": self.type}
|
|
if self.server is not None:
|
|
payload["server"] = {"id": self.server.id}
|
|
|
|
if self.label_selector is not None:
|
|
payload["label_selector"] = {"selector": self.label_selector.selector}
|
|
return payload
|
|
|
|
|
|
class FirewallResourceAppliedToResources(BaseDomain):
|
|
"""Firewall Resource applied to Domain
|
|
|
|
:param type: Type of resource referenced
|
|
:param server: Server the Firewall is applied to
|
|
"""
|
|
|
|
__slots__ = ("type", "server")
|
|
|
|
def __init__(
|
|
self,
|
|
type: str,
|
|
server: BoundServer | None = None,
|
|
):
|
|
self.type = type
|
|
self.server = server
|
|
|
|
|
|
class FirewallResourceLabelSelector(BaseDomain):
|
|
"""FirewallResourceLabelSelector Domain
|
|
|
|
:param selector: str Target label selector
|
|
"""
|
|
|
|
def __init__(self, selector: str | None = None):
|
|
self.selector = selector
|
|
|
|
|
|
class CreateFirewallResponse(BaseDomain):
|
|
"""Create Firewall Response Domain
|
|
|
|
:param firewall: :class:`BoundFirewall <hcloud.firewalls.client.BoundFirewall>`
|
|
The Firewall which was created
|
|
:param actions: List[:class:`BoundAction <hcloud.actions.client.BoundAction>`]
|
|
The Action which shows the progress of the Firewall Creation
|
|
"""
|
|
|
|
__slots__ = ("firewall", "actions")
|
|
|
|
def __init__(
|
|
self,
|
|
firewall: BoundFirewall,
|
|
actions: list[BoundAction] | None,
|
|
):
|
|
self.firewall = firewall
|
|
self.actions = actions
|