Skip to content

Commit

Permalink
feat: broker check update to 0.7.0 (#325)
Browse files Browse the repository at this point in the history
  • Loading branch information
Elsie4ever authored Sep 3, 2024
1 parent ce36730 commit 7b662d0
Show file tree
Hide file tree
Showing 9 changed files with 1,390 additions and 597 deletions.
166 changes: 56 additions & 110 deletions azext_edge/edge/providers/check/akri.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
process_dict_resource,
process_pod_status,
get_resources_grouped_by_namespace,
validate_one_of_conditions,
)

from .common import (
Expand Down Expand Up @@ -83,17 +84,19 @@ def evaluate_core_service_runtime(

if not akri_runtime_resources:
check_manager.add_target(target_name=CoreServiceResourceKinds.RUNTIME_RESOURCE.value)
check_manager.add_display(target_name=CoreServiceResourceKinds.RUNTIME_RESOURCE.value, display=Padding("Unable to fetch pods.", (0, 0, 0, padding + 2)))
check_manager.add_display(
target_name=CoreServiceResourceKinds.RUNTIME_RESOURCE.value,
display=Padding("Unable to fetch pods.", (0, 0, 0, padding + 2)),
)

for (namespace, pods) in get_resources_grouped_by_namespace(akri_runtime_resources):
for namespace, pods in get_resources_grouped_by_namespace(akri_runtime_resources):
check_manager.add_target(target_name=CoreServiceResourceKinds.RUNTIME_RESOURCE.value, namespace=namespace)
check_manager.add_display(
target_name=CoreServiceResourceKinds.RUNTIME_RESOURCE.value,
namespace=namespace,
display=Padding(
f"Akri runtime resources in namespace {{[purple]{namespace}[/purple]}}",
(0, 0, 0, padding)
)
f"Akri runtime resources in namespace {{[purple]{namespace}[/purple]}}", (0, 0, 0, padding)
),
)

process_pod_status(
Expand All @@ -116,7 +119,9 @@ def evaluate_configurations(
) -> Dict[str, Any]:
check_manager = CheckManager(check_name="evalConfigurations", check_desc="Evaluate Akri configurations")

target_configurations = generate_target_resource_name(api_info=AKRI_API_V0, resource_kind=AkriResourceKinds.CONFIGURATION.value)
target_configurations = generate_target_resource_name(
api_info=AKRI_API_V0, resource_kind=AkriResourceKinds.CONFIGURATION.value
)
configuration_conditions = []

all_configurations: dict = get_resources_by_name(
Expand All @@ -131,50 +136,47 @@ def evaluate_configurations(
check_manager.add_target_eval(
target_name=target_configurations,
status=CheckTaskStatus.skipped.value,
value={"configurations": fetch_configurations_error_text}
value={"configurations": fetch_configurations_error_text},
)
check_manager.add_display(
target_name=target_configurations, display=Padding(fetch_configurations_error_text, (0, 0, 0, 8))
)
check_manager.add_display(target_name=target_configurations, display=Padding(fetch_configurations_error_text, (0, 0, 0, 8)))

for (namespace, configurations) in get_resources_grouped_by_namespace(all_configurations):
for namespace, configurations in get_resources_grouped_by_namespace(all_configurations):
check_manager.add_target(
target_name=target_configurations,
namespace=namespace,
conditions=configuration_conditions
target_name=target_configurations, namespace=namespace, conditions=configuration_conditions
)
check_manager.add_display(
target_name=target_configurations,
namespace=namespace,
display=Padding(
f"Akri configurations in namespace {{[purple]{namespace}[/purple]}}",
(0, 0, 0, 8)
)
display=Padding(f"Akri configurations in namespace {{[purple]{namespace}[/purple]}}", (0, 0, 0, 8)),
)

padding = 10
configurations: List[dict] = list(configurations)
configurations_count = len(configurations)
configurations_count_text = "- {}."

configurations_count_text = configurations_count_text.format(f"Detected [blue]{configurations_count}[/blue] configurations")
configurations_count_text = configurations_count_text.format(
f"Detected [blue]{configurations_count}[/blue] configurations"
)

check_manager.add_display(
target_name=target_configurations,
namespace=namespace,
display=Padding(configurations_count_text, (0, 0, 0, padding))
display=Padding(configurations_count_text, (0, 0, 0, padding)),
)

for configuration in configurations:
configuration_name = configuration["metadata"]["name"]

configuration_text = (
f"- Akri configuration {{[bright_blue]{configuration_name}[/bright_blue]}} detected."
)
configuration_text = f"- Akri configuration {{[bright_blue]{configuration_name}[/bright_blue]}} detected."

configuration_padding = padding + PADDING_SIZE
check_manager.add_display(
target_name=target_configurations,
namespace=namespace,
display=Padding(configuration_text, (0, 0, 0, configuration_padding))
display=Padding(configuration_text, (0, 0, 0, configuration_padding)),
)

spec = configuration["spec"]
Expand Down Expand Up @@ -243,7 +245,9 @@ def evaluate_instances(
) -> Dict[str, Any]:
check_manager = CheckManager(check_name="evalInstances", check_desc="Evaluate Akri instances")

target_instances = generate_target_resource_name(api_info=AKRI_API_V0, resource_kind=AkriResourceKinds.INSTANCE.value)
target_instances = generate_target_resource_name(
api_info=AKRI_API_V0, resource_kind=AkriResourceKinds.INSTANCE.value
)
instance_conditions = []
check_manager.add_target(target_name=target_instances, conditions=instance_conditions)

Expand All @@ -258,23 +262,18 @@ def evaluate_instances(
check_manager.add_target_eval(
target_name=target_instances,
status=CheckTaskStatus.skipped.value,
value={"instances": fetch_instances_skip_text}
value={"instances": fetch_instances_skip_text},
)
check_manager.add_display(target_name=target_instances, display=Padding(fetch_instances_skip_text, (0, 0, 0, 8)))

for (namespace, instances) in get_resources_grouped_by_namespace(all_instances):
check_manager.add_target(
target_name=target_instances,
namespace=namespace,
conditions=instance_conditions
check_manager.add_display(
target_name=target_instances, display=Padding(fetch_instances_skip_text, (0, 0, 0, 8))
)

for namespace, instances in get_resources_grouped_by_namespace(all_instances):
check_manager.add_target(target_name=target_instances, namespace=namespace, conditions=instance_conditions)
check_manager.add_display(
target_name=target_instances,
namespace=namespace,
display=Padding(
f"Akri instances in namespace {{[purple]{namespace}[/purple]}}",
(0, 0, 0, 8)
)
display=Padding(f"Akri instances in namespace {{[purple]{namespace}[/purple]}}", (0, 0, 0, 8)),
)

instances: List[dict] = list(instances)
Expand All @@ -287,22 +286,20 @@ def evaluate_instances(
check_manager.add_display(
target_name=target_instances,
namespace=namespace,
display=Padding(instances_count_text, (0, 0, 0, padding))
display=Padding(instances_count_text, (0, 0, 0, padding)),
)

for instance in instances:
spec = instance["spec"]
instance_name = instance["metadata"]["name"]
instance_padding = padding + PADDING_SIZE

instance_text = (
f"- Akri instance {{[bright_blue]{instance_name}[/bright_blue]}} detected."
)
instance_text = f"- Akri instance {{[bright_blue]{instance_name}[/bright_blue]}} detected."

check_manager.add_display(
target_name=target_instances,
namespace=namespace,
display=Padding(instance_text, (0, 0, 0, instance_padding))
display=Padding(instance_text, (0, 0, 0, instance_padding)),
)

property_padding = instance_padding + PADDING_SIZE
Expand Down Expand Up @@ -367,55 +364,6 @@ def evaluate_instances(
return check_manager.as_dict(as_list)


def _validate_one_of_conditions(
conditions: List[tuple],
check_manager: CheckManager,
eval_value: dict,
namespace: str,
target_name: str,
padding: int,
) -> None:
if len(conditions) == 1:
return

non_empty_conditions_count = len([condition for condition in conditions if condition[1]])

eval_status = CheckTaskStatus.success.value
conditions_names = ", ".join([f"'{condition[0]}'" for condition in conditions])
if non_empty_conditions_count == 0:
check_manager.add_display(
target_name=target_name,
namespace=namespace,
display=Padding(
f"One of {conditions_names} should be specified",
(0, 0, 0, padding),
),
)
eval_status = CheckTaskStatus.error.value
elif non_empty_conditions_count > 1:
check_manager.add_display(
target_name=target_name,
namespace=namespace,
display=Padding(
f"Only one of {conditions_names} should be specified",
(0, 0, 0, padding),
),
)
eval_status = CheckTaskStatus.error.value

check_manager.add_target_conditions(
target_name=target_name,
namespace=namespace,
conditions=[condition[0] for condition in conditions]
)
check_manager.add_target_eval(
target_name=target_name,
namespace=namespace,
status=eval_status,
value=eval_value
)


def _evaluate_discovery_handler(
check_manager: CheckManager,
target_name: str,
Expand Down Expand Up @@ -495,9 +443,7 @@ def _evaluate_discovery_handler(

# name should be a valid identifier match the pattern
if not property_name or not re.match(name_pattern, property_name):
property_name_error_text = (
f"[red]Property name should be a valid identifier that matches the pattern {name_pattern}.[/red]"
)
property_name_error_text = f"[red]Property name should be a valid identifier that matches the pattern {name_pattern}.[/red]"
property_name_eval_status = CheckTaskStatus.error.value
check_manager.add_display(
target_name=target_name,
Expand All @@ -509,26 +455,23 @@ def _evaluate_discovery_handler(
target_name=target_name,
namespace=namespace,
status=property_name_eval_status,
value=property_name_eval_value
value=property_name_eval_value,
)

# "value" and "valueFrom" are mutually exclusive
value = property.get("value", "")
value_from = property.get("valueFrom", "")
value_eval_value = {
f"{property_condition_str}.value": value,
f"{property_condition_str}.valueFrom": value_from
f"{property_condition_str}.valueFrom": value_from,
}
_validate_one_of_conditions(
conditions=[
("value", value),
("valueFrom", value_from)
],
validate_one_of_conditions(
conditions=[("value", value), ("valueFrom", value_from)],
check_manager=check_manager,
eval_value=value_eval_value,
namespace=namespace,
target_name=target_name,
padding=property_padding
padding=property_padding,
)

if value:
Expand Down Expand Up @@ -556,22 +499,23 @@ def _evaluate_discovery_handler(
config_map_key_ref = value_from.get("configMapKeyRef", {})
key_ref_eval_value = {
f"{property_condition_str}.valueFrom.secretKeyRef": secret_key_ref,
f"{property_condition_str}.valueFrom.configMapKeyRef": config_map_key_ref
f"{property_condition_str}.valueFrom.configMapKeyRef": config_map_key_ref,
}
_validate_one_of_conditions(
conditions=[
("secretKeyRef", secret_key_ref),
("configMapKeyRef", config_map_key_ref)
],
validate_one_of_conditions(
conditions=[("secretKeyRef", secret_key_ref), ("configMapKeyRef", config_map_key_ref)],
check_manager=check_manager,
eval_value=key_ref_eval_value,
namespace=namespace,
target_name=target_name,
padding=key_ref_padding
padding=key_ref_padding,
)

if secret_key_ref or config_map_key_ref:
key_ref_property = ("secret_key_ref", secret_key_ref) if secret_key_ref else ("config_map_key_ref", config_map_key_ref)
key_ref_property = (
("secret_key_ref", secret_key_ref)
if secret_key_ref
else ("config_map_key_ref", config_map_key_ref)
)
key_ref_name = key_ref_property[1].get("name", "")
key_ref_key = key_ref_property[1].get("key", "")
key_ref_namespace = key_ref_property[1].get("namespace", "")
Expand All @@ -585,7 +529,9 @@ def _evaluate_discovery_handler(
],
)

key_ref_name_eval_value = {f"{property_condition_str}.valueFrom.{key_ref_property[0]}.name": key_ref_name}
key_ref_name_eval_value = {
f"{property_condition_str}.valueFrom.{key_ref_property[0]}.name": key_ref_name
}
key_ref_name_eval_status = CheckTaskStatus.success.value
if not key_ref_name:
key_ref_name_error_text = f"[red]Property {key_ref_property[0]} name is required.[/red]"
Expand All @@ -609,7 +555,7 @@ def _evaluate_discovery_handler(
target_name=target_name,
namespace=namespace,
status=key_ref_name_eval_status,
value=key_ref_name_eval_value
value=key_ref_name_eval_value,
)

if detail_level >= ResourceOutputDetailLevel.detail.value:
Expand Down
16 changes: 8 additions & 8 deletions azext_edge/edge/providers/check/base/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

from .check_manager import CheckManager
from .deployment import check_pre_deployment, check_post_deployment
from .display import add_display_and_eval, display_as_list, process_value_color
from .display import add_display_and_eval, display_as_list
from .node import check_nodes
from .pod import decorate_pod_phase, evaluate_pod_health, process_pod_status
from .pod import evaluate_pod_health, process_pod_status
from .resource import (
decorate_resource_status,
enumerate_ops_service_resources,
filter_resources_by_name,
filter_resources_by_namespace,
generate_target_resource_name,
Expand All @@ -20,7 +20,8 @@
process_dict_resource,
process_list_resource,
process_resource_properties,
process_resource_property_by_type
validate_one_of_conditions,
process_custom_resource_status,
)

__all__ = [
Expand All @@ -29,9 +30,8 @@
"check_nodes",
"check_post_deployment",
"check_pre_deployment",
"decorate_pod_phase",
"decorate_resource_status",
"display_as_list",
"enumerate_ops_service_resources",
"evaluate_pod_health",
"filter_resources_by_name",
"filter_resources_by_namespace",
Expand All @@ -43,6 +43,6 @@
"process_list_resource",
"process_pod_status",
"process_resource_properties",
"process_resource_property_by_type",
"process_value_color"
"validate_one_of_conditions",
"process_custom_resource_status",
]
Loading

0 comments on commit 7b662d0

Please sign in to comment.