From 1688a553da605183723a3e54ce6754a668168b41 Mon Sep 17 00:00:00 2001 From: Fuming Zhang Date: Thu, 26 Sep 2024 17:47:49 +0800 Subject: [PATCH 1/4] update --- .../azext_aks_preview/debug/__init__.py | 0 .../azext_aks_preview/debug/knowledge_base.py | 19 +++++++++++++++++++ .../azext_aks_preview/debug/main.py | 0 .../azext_aks_preview/debug/orchestrator.py | 0 4 files changed, 19 insertions(+) create mode 100644 src/aks-preview/azext_aks_preview/debug/__init__.py create mode 100644 src/aks-preview/azext_aks_preview/debug/knowledge_base.py create mode 100644 src/aks-preview/azext_aks_preview/debug/main.py create mode 100644 src/aks-preview/azext_aks_preview/debug/orchestrator.py diff --git a/src/aks-preview/azext_aks_preview/debug/__init__.py b/src/aks-preview/azext_aks_preview/debug/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base.py b/src/aks-preview/azext_aks_preview/debug/knowledge_base.py new file mode 100644 index 00000000000..cddf019834f --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/knowledge_base.py @@ -0,0 +1,19 @@ +az vmss run-command invoke -g MC_azcli-aks-dev_dev100_westus2 -n aks-nodepool1-28844989-vmss --command-id RunShellScript --instance-id 0 --scripts 'for i in $(seq $1 $2); do echo $i; done' --parameters 1 100000 + +az vmss run-command list -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" +az vmss run-command show -g MC_azcli-aks-dev_dev100_westus2 -n aks-nodepool1-28844989-vmss --instance-id 0 --name + +az vmss run-command create -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=100000 + +az vmss run-command show -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --instance-view + + +az vmss run-command update -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=1000000 --output-blob-uri "https://aksclidebug.blob.core.windows.net/aksclidebug/abc?xxx" + + +end=`date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ'` +# az storage blob generate-sas --account-name aksclidebug -n aksclidebug -c aksclidebug --permissions acrw --expiry $end --https-only +az storage container generate-sas --account-name aksclidebug -n aksclidebug --permissions acrw --expiry $end --https-only + +az vmss run-command update -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=1000000 --output-blob-uri "https://aksclidebug.blob.core.windows.net/aksclidebug/xyz?xxx" + diff --git a/src/aks-preview/azext_aks_preview/debug/main.py b/src/aks-preview/azext_aks_preview/debug/main.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/aks-preview/azext_aks_preview/debug/orchestrator.py b/src/aks-preview/azext_aks_preview/debug/orchestrator.py new file mode 100644 index 00000000000..e69de29bb2d From dc58ffb49a93bc3c00fa3835e8983630810aacf4 Mon Sep 17 00:00:00 2001 From: Fuming Zhang Date: Wed, 16 Oct 2024 14:35:05 +0800 Subject: [PATCH 2/4] update --- .../debug/data collection.md | 58 +++++++++++++++++++ .../azext_aks_preview/debug/data_collector.py | 56 ++++++++++++++++++ .../azext_aks_preview/debug/knowledge_base.py | 44 ++++++++------ .../debug/knowledge_base_action.py | 25 ++++++++ .../debug/knowledge_base_debug.py | 41 +++++++++++++ .../azext_aks_preview/debug/main.py | 9 +++ .../azext_aks_preview/debug/orchestrator.py | 12 ++++ .../azext_aks_preview/debug/types.py | 39 +++++++++++++ .../azext_aks_preview/debug/utils.py | 8 +++ 9 files changed, 273 insertions(+), 19 deletions(-) create mode 100644 src/aks-preview/azext_aks_preview/debug/data collection.md create mode 100644 src/aks-preview/azext_aks_preview/debug/data_collector.py create mode 100644 src/aks-preview/azext_aks_preview/debug/knowledge_base_action.py create mode 100644 src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py create mode 100644 src/aks-preview/azext_aks_preview/debug/types.py create mode 100644 src/aks-preview/azext_aks_preview/debug/utils.py diff --git a/src/aks-preview/azext_aks_preview/debug/data collection.md b/src/aks-preview/azext_aks_preview/debug/data collection.md new file mode 100644 index 00000000000..3d2e3f84b90 --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/data collection.md @@ -0,0 +1,58 @@ +# Data Collection + +## vmss run-command in azure-cli + +### use case: invoke + +```bash +az vmss run-command invoke -g MC_azcli-aks-dev_dev100_westus2 -n aks-nodepool1-28844989-vmss --command-id RunShellScript --instance-id 0 --scripts 'for i in $(seq $1 $2); do echo $i; done' --parameters 1 100000 +``` + +- synchronous operation, need to wait until the operation is completed +- the output will be truncated and cannot be automatically exported to external storage + +### use case: CRUD + +```bash +az vmss run-command list -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" +az vmss run-command show -g MC_azcli-aks-dev_dev100_westus2 -n aks-nodepool1-28844989-vmss --instance-id 0 --name + +# run command for the first time +az vmss run-command create -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=100000 +az vmss run-command show -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --instance-view # show command result + +# run command for the second time +az vmss run-command update -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=1000000 --output-blob-uri "https://aksclidebug.blob.core.windows.net/aksclidebug/abc?xxx" + +# generate storage account container sas token +end=`date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ'` +az storage container generate-sas --account-name aksclidebug -n aksclidebug --permissions acrw --expiry $end --https-only + +# run command for the third time +az vmss run-command update -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=1000000 --output-blob-uri "https://aksclidebug.blob.core.windows.net/aksclidebug/xyz?xxx" +``` + +- asynchronous operation, could be executed multiple times via update command +- the output will be truncated, but it can be automatically exported to external storage in its entirety + +## kubectl debug + +### use busybox to debug + +```bash +node_name=$(kubectl get no -o json | jq -r '.items[0].metadata.name') +kubectl debug no/${node_name} -i --image=mcr.microsoft.com/cbl-mariner/busybox:2.0 +busybox_pod_name=$(kubectl get po -o json | jq '.items[]|select(.status.phase=="Running")|select(.spec.containers[0].image=="mcr.microsoft.com/cbl-mariner/busybox:2.0")|.metadata.name') +kubectl exec ${busybox_pod_name} -- nslookup google.com +``` + +### get journal log + +```bash +node_name=$(kubectl get no -o json | jq -r '.items[0].metadata.name') +kubectl debug no/${node_name} -i --image=mcr.microsoft.com/cbl-mariner/base/core:2.0 +debug_pod_name=$(kubectl get po -o json | jq '.items[]|select(.status.phase=="Running")|select(.spec.containers[0].image=="mcr.microsoft.com/cbl-mariner/base/core:2.0")|.metadata.name') +kubectl exec ${debug_pod_name} -- tdnf install systemd tar -y +kubectl exec ${debug_pod_name} -- chroot /host sh -c "journalctl > journal.log" +kubectl cp ${debug_pod_name}:/host/journal.log journal.log +``` diff --git a/src/aks-preview/azext_aks_preview/debug/data_collector.py b/src/aks-preview/azext_aks_preview/debug/data_collector.py new file mode 100644 index 00000000000..ca106ab810c --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/data_collector.py @@ -0,0 +1,56 @@ +from typing import Dict +from random import randint + + +class DataCollector: + def __init__(self) -> None: + self.data = None + + def run(self) -> None: + # some code to collect data + pass + + def get_data(self, refresh_cached_data=False): + if self.data is None or refresh_cached_data: + self.run() + return self.data + + def gc(): + # clean up the resources used by the data collector + pass + + def export(): + # export the data to a file/remote storage + pass + + +class DataCollectorCoreDNSConfigMap(DataCollector): + def __init__(self) -> None: + super().__init__() + + def run(self) -> None: + # some code to collect data + self.data = "a" if randint(0, 1) else "b" + + +class DataCollectorIGDNS(DataCollector): + def __init__(self) -> None: + super().__init__() + + def run(self) -> None: + # some code to collect data + self.data = "c" if randint(0, 1) else "d" + + +class SharedDataCollector(): + def __init__(self) -> None: + self.data_collectors: Dict[str, DataCollector] = { + "core_dns_config_map": DataCollectorCoreDNSConfigMap(), + "ig_dns": DataCollectorIGDNS(), + } + + def get_core_dns_config_map_data(self): + return self.data_collectors["core_dns_config_map"].get_data() + + def get_ig_dns_data(self): + return self.data_collectors["ig_dns"].get_data() diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base.py b/src/aks-preview/azext_aks_preview/debug/knowledge_base.py index cddf019834f..fb9ff06b836 100644 --- a/src/aks-preview/azext_aks_preview/debug/knowledge_base.py +++ b/src/aks-preview/azext_aks_preview/debug/knowledge_base.py @@ -1,19 +1,25 @@ -az vmss run-command invoke -g MC_azcli-aks-dev_dev100_westus2 -n aks-nodepool1-28844989-vmss --command-id RunShellScript --instance-id 0 --scripts 'for i in $(seq $1 $2); do echo $i; done' --parameters 1 100000 - -az vmss run-command list -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" -az vmss run-command show -g MC_azcli-aks-dev_dev100_westus2 -n aks-nodepool1-28844989-vmss --instance-id 0 --name - -az vmss run-command create -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=100000 - -az vmss run-command show -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --instance-view - - -az vmss run-command update -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=1000000 --output-blob-uri "https://aksclidebug.blob.core.windows.net/aksclidebug/abc?xxx" - - -end=`date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ'` -# az storage blob generate-sas --account-name aksclidebug -n aksclidebug -c aksclidebug --permissions acrw --expiry $end --https-only -az storage container generate-sas --account-name aksclidebug -n aksclidebug --permissions acrw --expiry $end --https-only - -az vmss run-command update -g MC_azcli-aks-dev_dev100_westus2 --vmss-name aks-nodepool1-28844989-vmss --instance-id "0" --run-command-name "t1" --script 'for i in $(seq $abc $xyz); do echo $i; done' --parameters abc=1 xyz=1000000 --output-blob-uri "https://aksclidebug.blob.core.windows.net/aksclidebug/xyz?xxx" - +from typing import Dict + +from .types import DebugStep, ActionStep +from .knowledge_base_debug import DebugStepA, DebugStepB, DebugStepC +from .knowledge_base_action import ActionStepA, ActionStepB, ActionStepC + + +class KnowledgeBase: + def __init__(self) -> None: + self.debug_steps: Dict[str, DebugStep] = { + "a": DebugStepA(), + "b": DebugStepB(), + "c": DebugStepC() + } + self.action_steps: Dict[str, ActionStep] = { + "a": ActionStepA(), + "b": ActionStepB(), + "c": ActionStepC() + } + + def get_debug_step_by_name(self, name: str) -> DebugStep: + return self.debug_steps[name] + + def get_action_step_by_name(self, name: str) -> ActionStep: + return self.action_steps[name] diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base_action.py b/src/aks-preview/azext_aks_preview/debug/knowledge_base_action.py new file mode 100644 index 00000000000..7c435fabedb --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/knowledge_base_action.py @@ -0,0 +1,25 @@ +from .types import Step, ActionStep + + +class ActionStepA(ActionStep): + def __init__(self) -> None: + super().__init__() + + def run(self) -> Step: + print("ActionStepA") + + +class ActionStepB(ActionStep): + def __init__(self) -> None: + super().__init__() + + def run(self) -> Step: + print("ActionStepB") + + +class ActionStepC(ActionStep): + def __init__(self) -> None: + super().__init__() + + def run(self) -> Step: + print("ActionStepC") diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py b/src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py new file mode 100644 index 00000000000..46b1bd2cd07 --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py @@ -0,0 +1,41 @@ +from .types import Step, DebugStep, NoActionStep +from .knowledge_base_action import ActionStepA, ActionStepB, ActionStepC + + +class DebugStepA(DebugStep): + def __init__(self) -> None: + super().__init__() + self.tags = self.tags.append("dns") + + def run(self) -> Step: + data = self.shared_data_collector.get_core_dns_config_map_data() + if data == "a": + self.next_steps = self.next_steps.append(ActionStepA()) + elif data == "b": + self.next_steps = self.next_steps.append(DebugStepB()) + else: + self.next_steps = self.next_steps.append(NoActionStep()) + + +class DebugStepB(DebugStep): + def __init__(self) -> None: + super().__init__() + self.tags = self.tags.append("dns") + + def run(self) -> Step: + data = self.shared_data_collector.get_ig_dns_data() + if data == "c": + self.next_steps = self.next_steps.append(ActionStepB()) + elif data == "d": + self.next_steps = self.next_steps.append(ActionStepC()) + else: + self.next_steps = self.next_steps.append(NoActionStep()) + + +class DebugStepC(DebugStep): + def __init__(self) -> None: + super().__init__() + self.tags = self.tags.append("egress") + + def run(self) -> Step: + self.next_steps = self.next_steps.append(NoActionStep()) diff --git a/src/aks-preview/azext_aks_preview/debug/main.py b/src/aks-preview/azext_aks_preview/debug/main.py index e69de29bb2d..85acb375bc4 100644 --- a/src/aks-preview/azext_aks_preview/debug/main.py +++ b/src/aks-preview/azext_aks_preview/debug/main.py @@ -0,0 +1,9 @@ +from .orchestrator import Orchestrator + + +def main(): + Orchestrator().run() + + +if __name__ == "__main__": + main() diff --git a/src/aks-preview/azext_aks_preview/debug/orchestrator.py b/src/aks-preview/azext_aks_preview/debug/orchestrator.py index e69de29bb2d..ca4e73fa089 100644 --- a/src/aks-preview/azext_aks_preview/debug/orchestrator.py +++ b/src/aks-preview/azext_aks_preview/debug/orchestrator.py @@ -0,0 +1,12 @@ +from .knowledge_base_action import * +from .knowledge_base_debug import * +from .data_collector import SharedDataCollector + + +class Orchestrator(): + def __init__(self) -> None: + self.steps = [] + self.shared_data_collector = SharedDataCollector() + + def run(self): + pass diff --git a/src/aks-preview/azext_aks_preview/debug/types.py b/src/aks-preview/azext_aks_preview/debug/types.py new file mode 100644 index 00000000000..0199a83de9e --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/types.py @@ -0,0 +1,39 @@ +from __future__ import annotations +from typing import List + +from .data_collector import SharedDataCollector + + +class Step: + def __init__(self) -> None: + self.tags: List[str] = [] + self.next_steps: List[Step] = [] + + def run(self) -> Step: + pass + + def get_next_steps(self) -> List[Step]: + if not self.next_steps: + self.run() + return self.next_steps + + +class DebugStep(Step): + def __init__(self) -> None: + super().__init__() + + def attch_shared_data_collector(self, shared_data_collector: SharedDataCollector) -> None: + self.shared_data_collector = shared_data_collector + + +class ActionStep(Step): + def __init__(self) -> None: + super().__init__() + + +class NoActionStep(Step): + def __init__(self) -> None: + super().__init__() + + def get_next_steps(self) -> List[Step]: + return [] diff --git a/src/aks-preview/azext_aks_preview/debug/utils.py b/src/aks-preview/azext_aks_preview/debug/utils.py new file mode 100644 index 00000000000..989a0cf4257 --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/utils.py @@ -0,0 +1,8 @@ +import subprocess + + +def get_configmap(namespace, name): + return subprocess.check_output( + ["kubectl", "get", "cm", "-n", namespace, name, "-o", "json"], + universal_newlines=True, + ) From 1fda5f263442816e762e64dabf138b531cc5ef1b Mon Sep 17 00:00:00 2001 From: Fuming Zhang Date: Wed, 16 Oct 2024 16:00:26 +0800 Subject: [PATCH 3/4] update --- .../debug/{ => im}/__init__.py | 0 .../debug/{ => im}/data collection.md | 0 .../debug/{ => im}/data_collector.py | 0 .../debug/{ => im}/knowledge_base.py | 9 +++++++- .../debug/{ => im}/knowledge_base_action.py | 0 .../debug/{ => im}/knowledge_base_debug.py | 20 ++++++++-------- .../debug/im/orchestrator.py | 23 +++++++++++++++++++ .../azext_aks_preview/debug/{ => im}/types.py | 0 .../azext_aks_preview/debug/{ => im}/utils.py | 0 .../azext_aks_preview/debug/main.py | 4 ++-- .../azext_aks_preview/debug/orchestrator.py | 12 ---------- 11 files changed, 43 insertions(+), 25 deletions(-) rename src/aks-preview/azext_aks_preview/debug/{ => im}/__init__.py (100%) rename src/aks-preview/azext_aks_preview/debug/{ => im}/data collection.md (100%) rename src/aks-preview/azext_aks_preview/debug/{ => im}/data_collector.py (100%) rename src/aks-preview/azext_aks_preview/debug/{ => im}/knowledge_base.py (74%) rename src/aks-preview/azext_aks_preview/debug/{ => im}/knowledge_base_action.py (100%) rename src/aks-preview/azext_aks_preview/debug/{ => im}/knowledge_base_debug.py (54%) create mode 100644 src/aks-preview/azext_aks_preview/debug/im/orchestrator.py rename src/aks-preview/azext_aks_preview/debug/{ => im}/types.py (100%) rename src/aks-preview/azext_aks_preview/debug/{ => im}/utils.py (100%) delete mode 100644 src/aks-preview/azext_aks_preview/debug/orchestrator.py diff --git a/src/aks-preview/azext_aks_preview/debug/__init__.py b/src/aks-preview/azext_aks_preview/debug/im/__init__.py similarity index 100% rename from src/aks-preview/azext_aks_preview/debug/__init__.py rename to src/aks-preview/azext_aks_preview/debug/im/__init__.py diff --git a/src/aks-preview/azext_aks_preview/debug/data collection.md b/src/aks-preview/azext_aks_preview/debug/im/data collection.md similarity index 100% rename from src/aks-preview/azext_aks_preview/debug/data collection.md rename to src/aks-preview/azext_aks_preview/debug/im/data collection.md diff --git a/src/aks-preview/azext_aks_preview/debug/data_collector.py b/src/aks-preview/azext_aks_preview/debug/im/data_collector.py similarity index 100% rename from src/aks-preview/azext_aks_preview/debug/data_collector.py rename to src/aks-preview/azext_aks_preview/debug/im/data_collector.py diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base.py b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base.py similarity index 74% rename from src/aks-preview/azext_aks_preview/debug/knowledge_base.py rename to src/aks-preview/azext_aks_preview/debug/im/knowledge_base.py index fb9ff06b836..19936b9c78d 100644 --- a/src/aks-preview/azext_aks_preview/debug/knowledge_base.py +++ b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base.py @@ -1,4 +1,4 @@ -from typing import Dict +from typing import Dict, List from .types import DebugStep, ActionStep from .knowledge_base_debug import DebugStepA, DebugStepB, DebugStepC @@ -23,3 +23,10 @@ def get_debug_step_by_name(self, name: str) -> DebugStep: def get_action_step_by_name(self, name: str) -> ActionStep: return self.action_steps[name] + + def get_debug_steps_by_scenario(self, scenario: str) -> List[DebugStep]: + results = [] + for v in self.debug_steps.values(): + if scenario in v.tags: + results.append(v) + return results diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base_action.py b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_action.py similarity index 100% rename from src/aks-preview/azext_aks_preview/debug/knowledge_base_action.py rename to src/aks-preview/azext_aks_preview/debug/im/knowledge_base_action.py diff --git a/src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py similarity index 54% rename from src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py rename to src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py index 46b1bd2cd07..fd9bd6e1a28 100644 --- a/src/aks-preview/azext_aks_preview/debug/knowledge_base_debug.py +++ b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py @@ -5,37 +5,37 @@ class DebugStepA(DebugStep): def __init__(self) -> None: super().__init__() - self.tags = self.tags.append("dns") + self.tags.append("dns") def run(self) -> Step: data = self.shared_data_collector.get_core_dns_config_map_data() if data == "a": - self.next_steps = self.next_steps.append(ActionStepA()) + self.next_steps.append(ActionStepA()) elif data == "b": - self.next_steps = self.next_steps.append(DebugStepB()) + self.next_steps.append(DebugStepB()) else: - self.next_steps = self.next_steps.append(NoActionStep()) + self.next_steps.append(NoActionStep()) class DebugStepB(DebugStep): def __init__(self) -> None: super().__init__() - self.tags = self.tags.append("dns") + self.tags.append("dns") def run(self) -> Step: data = self.shared_data_collector.get_ig_dns_data() if data == "c": - self.next_steps = self.next_steps.append(ActionStepB()) + self.next_steps.append(ActionStepB()) elif data == "d": - self.next_steps = self.next_steps.append(ActionStepC()) + self.next_steps.append(ActionStepC()) else: - self.next_steps = self.next_steps.append(NoActionStep()) + self.next_steps.append(NoActionStep()) class DebugStepC(DebugStep): def __init__(self) -> None: super().__init__() - self.tags = self.tags.append("egress") + self.tags.append("egress") def run(self) -> Step: - self.next_steps = self.next_steps.append(NoActionStep()) + self.next_steps.append(NoActionStep()) diff --git a/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py b/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py new file mode 100644 index 00000000000..ac25a840616 --- /dev/null +++ b/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py @@ -0,0 +1,23 @@ +from .data_collector import SharedDataCollector +from .knowledge_base import KnowledgeBase +from .types import DebugStep + + +class Orchestrator(): + def __init__(self) -> None: + self.steps = [] + self.shared_data_collector = SharedDataCollector() + self.knowledge_base = KnowledgeBase() + + def run(self, scenario: str) -> None: + self.steps = self.knowledge_base.get_debug_steps_by_scenario(scenario) + current_steps = [] + next_steps = self.steps + while next_steps: + current_steps = next_steps + next_steps = [] + for step in current_steps: + if isinstance(step, DebugStep): + step.attch_shared_data_collector(self.shared_data_collector) + step.run() + next_steps.extend(step.get_next_steps()) diff --git a/src/aks-preview/azext_aks_preview/debug/types.py b/src/aks-preview/azext_aks_preview/debug/im/types.py similarity index 100% rename from src/aks-preview/azext_aks_preview/debug/types.py rename to src/aks-preview/azext_aks_preview/debug/im/types.py diff --git a/src/aks-preview/azext_aks_preview/debug/utils.py b/src/aks-preview/azext_aks_preview/debug/im/utils.py similarity index 100% rename from src/aks-preview/azext_aks_preview/debug/utils.py rename to src/aks-preview/azext_aks_preview/debug/im/utils.py diff --git a/src/aks-preview/azext_aks_preview/debug/main.py b/src/aks-preview/azext_aks_preview/debug/main.py index 85acb375bc4..27a58644d17 100644 --- a/src/aks-preview/azext_aks_preview/debug/main.py +++ b/src/aks-preview/azext_aks_preview/debug/main.py @@ -1,8 +1,8 @@ -from .orchestrator import Orchestrator +from im.orchestrator import Orchestrator def main(): - Orchestrator().run() + Orchestrator().run("dns") if __name__ == "__main__": diff --git a/src/aks-preview/azext_aks_preview/debug/orchestrator.py b/src/aks-preview/azext_aks_preview/debug/orchestrator.py deleted file mode 100644 index ca4e73fa089..00000000000 --- a/src/aks-preview/azext_aks_preview/debug/orchestrator.py +++ /dev/null @@ -1,12 +0,0 @@ -from .knowledge_base_action import * -from .knowledge_base_debug import * -from .data_collector import SharedDataCollector - - -class Orchestrator(): - def __init__(self) -> None: - self.steps = [] - self.shared_data_collector = SharedDataCollector() - - def run(self): - pass From 814531dffbaa12671a67a5259b4f1a043badbd3e Mon Sep 17 00:00:00 2001 From: Fuming Zhang Date: Tue, 22 Oct 2024 11:23:21 +0800 Subject: [PATCH 4/4] update --- .../azext_aks_preview/debug/im/knowledge_base_action.py | 6 +++--- .../azext_aks_preview/debug/im/knowledge_base_debug.py | 3 +++ src/aks-preview/azext_aks_preview/debug/im/orchestrator.py | 3 +++ src/aks-preview/azext_aks_preview/debug/im/types.py | 5 +++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_action.py b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_action.py index 7c435fabedb..9871dade741 100644 --- a/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_action.py +++ b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_action.py @@ -6,7 +6,7 @@ def __init__(self) -> None: super().__init__() def run(self) -> Step: - print("ActionStepA") + print(self) class ActionStepB(ActionStep): @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() def run(self) -> Step: - print("ActionStepB") + print(self) class ActionStepC(ActionStep): @@ -22,4 +22,4 @@ def __init__(self) -> None: super().__init__() def run(self) -> Step: - print("ActionStepC") + print(self) diff --git a/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py index fd9bd6e1a28..5fcf29467c2 100644 --- a/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py +++ b/src/aks-preview/azext_aks_preview/debug/im/knowledge_base_debug.py @@ -8,6 +8,7 @@ def __init__(self) -> None: self.tags.append("dns") def run(self) -> Step: + print(self) data = self.shared_data_collector.get_core_dns_config_map_data() if data == "a": self.next_steps.append(ActionStepA()) @@ -23,6 +24,7 @@ def __init__(self) -> None: self.tags.append("dns") def run(self) -> Step: + print(self) data = self.shared_data_collector.get_ig_dns_data() if data == "c": self.next_steps.append(ActionStepB()) @@ -38,4 +40,5 @@ def __init__(self) -> None: self.tags.append("egress") def run(self) -> Step: + print(self) self.next_steps.append(NoActionStep()) diff --git a/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py b/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py index ac25a840616..da841577752 100644 --- a/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py +++ b/src/aks-preview/azext_aks_preview/debug/im/orchestrator.py @@ -13,7 +13,10 @@ def run(self, scenario: str) -> None: self.steps = self.knowledge_base.get_debug_steps_by_scenario(scenario) current_steps = [] next_steps = self.steps + round_cnt = 0 while next_steps: + round_cnt += 1 + print(f"Round {round_cnt}") current_steps = next_steps next_steps = [] for step in current_steps: diff --git a/src/aks-preview/azext_aks_preview/debug/im/types.py b/src/aks-preview/azext_aks_preview/debug/im/types.py index 0199a83de9e..854123d1bc1 100644 --- a/src/aks-preview/azext_aks_preview/debug/im/types.py +++ b/src/aks-preview/azext_aks_preview/debug/im/types.py @@ -13,8 +13,6 @@ def run(self) -> Step: pass def get_next_steps(self) -> List[Step]: - if not self.next_steps: - self.run() return self.next_steps @@ -35,5 +33,8 @@ class NoActionStep(Step): def __init__(self) -> None: super().__init__() + def run(self) -> Step: + print("NoActionStep") + def get_next_steps(self) -> List[Step]: return []