Skip to content

Commit ee83c21

Browse files
authored
Merge pull request #785 from bitcoin-dev-project/pod-limit
Establish limit of 100 pods per namespace in war game, configurable in yaml
2 parents cf3935e + 3ef26e3 commit ee83c21

6 files changed

Lines changed: 65 additions & 6 deletions

File tree

resources/charts/namespaces/templates/namespace.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,12 @@ apiVersion: v1
22
kind: Namespace
33
metadata:
44
name: {{ .Values.namespaceName | default .Release.Name }}
5+
---
6+
apiVersion: v1
7+
kind: ResourceQuota
8+
metadata:
9+
name: namespace-pod-limit
10+
namespace: {{ .Values.namespaceName | default .Release.Name }}
11+
spec:
12+
hard:
13+
pods: {{ .Values.podLimit | quote }}

resources/charts/namespaces/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,4 @@ roles:
5858
- apiGroups: ["networking.k8s.io"]
5959
resources: ["ingresses"]
6060
verbs: ["list", "get", "watch"]
61+
podLimit: 100
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/usr/bin/env python3
2+
3+
from time import sleep
4+
5+
# The base class exists inside the commander container
6+
try:
7+
from commander import Commander
8+
except Exception:
9+
from resources.scenarios.commander import Commander
10+
11+
12+
class Nothing(Commander):
13+
def set_test_params(self):
14+
self.num_nodes = 1
15+
16+
def add_options(self, parser):
17+
parser.description = "This test will do nothing, forever"
18+
parser.usage = "warnet run /path/to/nothing.py"
19+
20+
def run_test(self):
21+
while True:
22+
sleep(60)
23+
24+
25+
def main():
26+
Nothing("").main()
27+
28+
29+
if __name__ == "__main__":
30+
main()

test/data/wargames/namespaces/armies/namespace-defaults.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ users:
33
roles:
44
- pod-viewer
55
- pod-manager
6+
podLimit: 3

test/test_base.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import logging.config
44
import os
55
import re
6+
import sys
67
import threading
78
from pathlib import Path
89
from subprocess import run
910
from tempfile import mkdtemp
1011
from time import sleep
1112

13+
import pexpect
14+
1215
from warnet import SRC_DIR
1316
from warnet.k8s import get_pod_exit_status
1417
from warnet.network import _connected as network_connected
@@ -45,7 +48,10 @@ def cleanup(self, signum=None, frame=None):
4548
try:
4649
self.log.info("Stopping network")
4750
if self.network:
48-
self.warnet("down --force")
51+
session = pexpect.spawn("warnet down", encoding="utf-8")
52+
session.logfile = sys.stdout
53+
session.expect("Do you want to bring down the running Warnet?", timeout=30)
54+
session.sendline("y")
4955
self.wait_for_all_tanks_status(target="stopped", timeout=60, interval=1)
5056
except Exception as e:
5157
self.log.error(f"Error bringing network down: {e}")

test/wargames_test.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from warnet.k8s import get_kubeconfig_value
1010
from warnet.process import stream_command
11+
from warnet.status import _get_deployed_scenarios as scenarios_deployed
1112

1213

1314
class WargamesTest(TestBase):
@@ -19,6 +20,7 @@ def __init__(self):
1920
Path(os.path.dirname(__file__)).parent / "resources" / "scenarios" / "test_scenarios"
2021
)
2122
self.initial_context = get_kubeconfig_value("{.current-context}")
23+
self.kconfigdir = self.tmpdir / "kubeconfigs"
2224

2325
def run_test(self):
2426
try:
@@ -61,8 +63,10 @@ def check_scenario_permissions(self):
6163
assert self.warnet("bitcoin rpc miner getblockcount") == "5"
6264

6365
self.log.info("Switch to wargames player context")
64-
self.log.info(self.warnet("admin create-kubeconfigs"))
65-
clicker = pexpect.spawn("warnet auth kubeconfigs/warnet-user-wargames-red-kubeconfig")
66+
self.log.info(self.warnet(f"admin create-kubeconfigs --kubeconfig-dir={self.kconfigdir}"))
67+
clicker = pexpect.spawn(
68+
f"warnet auth {self.kconfigdir}/warnet-user-wargames-red-kubeconfig"
69+
)
6670
while clicker.expect(["Overwrite", "Updated kubeconfig"]) == 0:
6771
print(clicker.before, clicker.after)
6872
clicker.sendline("y")
@@ -82,16 +86,24 @@ def check_scenario_permissions(self):
8286
# Nothing was accesible
8387
assert self.warnet("bitcoin rpc armada getblockcount") == "6"
8488

89+
self.log.info("Check pod limit per namespace")
90+
for _ in range(10):
91+
stream_command(
92+
f"warnet run {self.scen_test_dir / 'nothing.py'} --source_dir={self.scen_src_dir}"
93+
)
94+
assert len(scenarios_deployed()) == 2, (
95+
f"Unexpected scenarios deployed:{scenarios_deployed()}"
96+
)
97+
8598
self.log.info("Restore admin context")
8699
stream_command(f"kubectl config use-context {self.initial_context}")
87100
# Sanity check
88101
assert self.warnet("bitcoin rpc miner getblockcount") == "6"
89102

90103
self.log.info("Re-generate kubeconfigs after a scenario has been run")
91-
self.log.info(self.warnet("admin create-kubeconfigs"))
92-
kubeconfig_dir = Path("kubeconfigs/")
104+
self.log.info(self.warnet(f"admin create-kubeconfigs --kubeconfig-dir={self.kconfigdir}"))
93105
count = 0
94-
for p in kubeconfig_dir.iterdir():
106+
for p in self.kconfigdir.iterdir():
95107
if p.is_file():
96108
print(p)
97109
assert "warnet-user" in str(p)

0 commit comments

Comments
 (0)