aws_advanced_python_wrapper/hostinfo.py (95 lines of code) (raw):
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
from dataclasses import dataclass
from enum import Enum, auto
from typing import TYPE_CHECKING, ClassVar, FrozenSet, Optional, Set
from aws_advanced_python_wrapper.host_availability import (
HostAvailability, HostAvailabilityStrategy)
if TYPE_CHECKING:
from datetime import datetime
class HostRole(Enum):
UNKNOWN = auto()
READER = auto()
WRITER = auto()
@dataclass(eq=False)
class HostInfo:
NO_PORT: ClassVar[int] = -1
DEFAULT_WEIGHT = 100
def __init__(
self,
host: str,
port: int = NO_PORT,
role: HostRole = HostRole.WRITER,
availability: HostAvailability = HostAvailability.AVAILABLE,
host_availability_strategy=HostAvailabilityStrategy(),
weight: int = DEFAULT_WEIGHT,
host_id: Optional[str] = None,
last_update_time: Optional[datetime] = None):
self.host = host
self.port = port
self.role = role
self._availability = availability
self.host_availability_strategy = host_availability_strategy
self.weight = weight,
self.host_id = host_id
self.last_update_time = last_update_time
self._aliases: Set[str] = set()
self._all_aliases: Set[str] = {self.as_alias()}
def __eq__(self, other: object):
if self is object:
return True
if not isinstance(other, HostInfo):
return False
return self.host == other.host \
and self.port == other.port \
and self._availability == other._availability \
and self.role == other.role
def __str__(self):
return f"HostInfo({self.host}, {self.port}, {self.role}, {self._availability})"
@property
def url(self):
if self.is_port_specified():
return f"{self.host}:{self.port}"
else:
return self.host
@property
def aliases(self) -> FrozenSet[str]:
return frozenset(self._aliases)
@property
def all_aliases(self) -> FrozenSet[str]:
return frozenset(self._all_aliases)
def as_alias(self) -> str:
return f"{self.host}:{self.port}" if self.is_port_specified() else self.host
def add_alias(self, *aliases: str):
if not aliases:
return
for alias in aliases:
self._aliases.add(alias)
self._all_aliases.add(alias)
def as_aliases(self) -> FrozenSet[str]:
return frozenset(self.all_aliases)
def remove_alias(self, *kwargs):
if not kwargs or len(kwargs) == 0:
return
for x in kwargs:
self._aliases.discard(x)
self._all_aliases.discard(x)
def reset_aliases(self):
self._aliases.clear()
self._all_aliases.clear()
self._all_aliases.add(self.as_alias())
def is_port_specified(self) -> bool:
return self.port != HostInfo.NO_PORT
def get_availability(self) -> HostAvailability:
if self.host_availability_strategy is not None:
return self.host_availability_strategy.get_host_availability(self._availability)
return self._availability
def get_raw_availability(self) -> HostAvailability:
return self._availability
def set_availability(self, availability: HostAvailability):
self._availability = availability
if self.host_availability_strategy is not None:
self.host_availability_strategy.set_host_availability(availability)
def get_host_availability_strategy(self):
return self.host_availability_strategy
def set_host_availability_strategy(self, host_availability_strategy):
self.host_availability_strategy = host_availability_strategy