Skip to content

Commit c27dbc6

Browse files
tdevilleducThomas Deville-Duc
and
Thomas Deville-Duc
authored
rework: add namespace for all probes and actions (#39) (#80)
Signed-off-by: Thomas DEVILLE-DUC <devilleduc.thomas@gmail.com> Co-authored-by: Thomas Deville-Duc <thomas.deville-duc-prestataire@laposte.fr>
1 parent 4167e44 commit c27dbc6

20 files changed

+891
-328
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## [Unreleased][]
44

5+
- Add namespace to all probes and actions with backward compatibility [#39][39]
6+
7+
[39]: https://github.com/chaostoolkit/chaostoolkit-kubernetes/issues/39
8+
59
[Unreleased]: https://github.com/chaostoolkit/chaostoolkit-kubernetes/compare/0.22.0...HEAD
610

711
## [0.22.0][] - 2020-01-10

chaosk8s/__init__.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
# -*- coding: utf-8 -*-
2-
import json
32
import os
43
import os.path
54
from typing import List
65

76
from chaoslib.discovery.discover import discover_actions, discover_probes, \
87
initialize_discovery_result
9-
from chaoslib.exceptions import DiscoveryFailed
10-
from chaoslib.types import Discovery, DiscoveredActivities, \
11-
DiscoveredSystemInfo, Secrets
8+
from chaoslib.types import Discovery, DiscoveredActivities, Secrets
129
from kubernetes import client, config
1310
from logzero import logger
1411

@@ -135,9 +132,20 @@ def load_exported_activities() -> List[DiscoveredActivities]:
135132
activities = []
136133
activities.extend(discover_actions("chaosk8s.actions"))
137134
activities.extend(discover_probes("chaosk8s.probes"))
135+
activities.extend(discover_actions("chaosk8s.deployment.actions"))
136+
activities.extend(discover_actions("chaosk8s.deployment.probes"))
137+
activities.extend(discover_actions("chaosk8s.node.actions"))
138+
activities.extend(discover_actions("chaosk8s.node.probes"))
138139
activities.extend(discover_actions("chaosk8s.pod.actions"))
139140
activities.extend(discover_probes("chaosk8s.pod.probes"))
140-
activities.extend(discover_actions("chaosk8s.node.actions"))
141-
activities.extend(discover_actions("chaosk8s.statefulset.actions"))
141+
activities.extend(discover_actions("chaosk8s.replicaset.actions"))
142142
activities.extend(discover_actions("chaosk8s.service.actions"))
143+
activities.extend(discover_actions("chaosk8s.service.probes"))
144+
activities.extend(discover_actions("chaosk8s.statefulset.actions"))
143145
return activities
146+
147+
148+
def _log_deprecated(name: str, alt_name: str):
149+
logger.warning("{} function is DEPRECATED and will be removed in the next \
150+
releases, please use {} instead".format(
151+
name, alt_name))

chaosk8s/actions.py

+27-98
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
# -*- coding: utf-8 -*-
2-
import json
3-
import os.path
4-
5-
import yaml
6-
from chaoslib.exceptions import ActivityFailed
72
from chaoslib.types import Secrets
8-
from kubernetes import client
9-
from kubernetes.client.rest import ApiException
10-
from logzero import logger
113

12-
from chaosk8s import create_k8s_api_client
4+
from chaosk8s import _log_deprecated
5+
from chaosk8s.deployment.actions import create_deployment, delete_deployment, \
6+
scale_deployment
7+
from chaosk8s.replicaset.actions import delete_replica_set
8+
from chaosk8s.pod.actions import delete_pods
9+
from chaosk8s.service.actions import delete_service
1310

1411
__all__ = ["start_microservice", "kill_microservice", "scale_microservice",
1512
"remove_service_endpoint"]
@@ -18,106 +15,38 @@
1815
def start_microservice(spec_path: str, ns: str = "default",
1916
secrets: Secrets = None):
2017
"""
21-
Start a microservice described by the deployment config, which must be the
22-
path to the JSON or YAML representation of the deployment.
23-
"""
24-
api = create_k8s_api_client(secrets)
25-
26-
with open(spec_path) as f:
27-
p, ext = os.path.splitext(spec_path)
28-
if ext == '.json':
29-
deployment = json.loads(f.read())
30-
elif ext in ['.yml', '.yaml']:
31-
deployment = yaml.safe_load(f.read())
32-
else:
33-
raise ActivityFailed(
34-
"cannot process {path}".format(path=spec_path))
35-
36-
v1 = client.AppsV1Api(api)
37-
resp = v1.create_namespaced_deployment(ns, body=deployment)
38-
return resp
39-
40-
41-
def kill_microservice(name: str, ns: str = "default",
42-
label_selector: str = "name in ({name})",
43-
secrets: Secrets = None):
44-
"""
45-
Kill a microservice by `name` in the namespace `ns`.
46-
47-
The microservice is killed by deleting the deployment for it without
48-
a graceful period to trigger an abrupt termination.
49-
50-
The selected resources are matched by the given `label_selector`.
18+
!!!DEPRECATED!!!
5119
"""
52-
label_selector = label_selector.format(name=name)
53-
api = create_k8s_api_client(secrets)
54-
55-
v1 = client.AppsV1Api(api)
56-
if label_selector:
57-
ret = v1.list_namespaced_deployment(ns, label_selector=label_selector)
58-
else:
59-
ret = v1.list_namespaced_deployment(ns)
60-
61-
logger.debug("Found {d} deployments named '{n}'".format(
62-
d=len(ret.items), n=name))
63-
64-
body = client.V1DeleteOptions()
65-
for d in ret.items:
66-
res = v1.delete_namespaced_deployment(
67-
d.metadata.name, ns, body=body)
68-
69-
v1 = client.AppsV1Api(api)
70-
if label_selector:
71-
ret = v1.list_namespaced_replica_set(ns, label_selector=label_selector)
72-
else:
73-
ret = v1.list_namespaced_replica_set(ns)
74-
75-
logger.debug("Found {d} replica sets named '{n}'".format(
76-
d=len(ret.items), n=name))
77-
78-
body = client.V1DeleteOptions()
79-
for r in ret.items:
80-
res = v1.delete_namespaced_replica_set(
81-
r.metadata.name, ns, body=body)
82-
83-
v1 = client.CoreV1Api(api)
84-
if label_selector:
85-
ret = v1.list_namespaced_pod(ns, label_selector=label_selector)
86-
else:
87-
ret = v1.list_namespaced_pod(ns)
88-
89-
logger.debug("Found {d} pods named '{n}'".format(
90-
d=len(ret.items), n=name))
91-
92-
body = client.V1DeleteOptions()
93-
for p in ret.items:
94-
res = v1.delete_namespaced_pod(
95-
p.metadata.name, ns, body=body)
20+
_log_deprecated("start_microservice", "create_deployment")
21+
create_deployment(spec_path, ns, secrets)
9622

9723

9824
def remove_service_endpoint(name: str, ns: str = "default",
9925
secrets: Secrets = None):
10026
"""
101-
Remove the service endpoint that sits in front of microservices (pods).
27+
!!!DEPRECATED!!!
10228
"""
103-
api = create_k8s_api_client(secrets)
104-
105-
v1 = client.CoreV1Api(api)
106-
v1.delete_namespaced_service(name, namespace=ns)
29+
_log_deprecated("remove_service_endpoint", "delete_service")
30+
delete_service(name, ns, secrets)
10731

10832

10933
def scale_microservice(name: str, replicas: int, ns: str = "default",
11034
secrets: Secrets = None):
11135
"""
112-
Scale a deployment up or down. The `name` is the name of the deployment.
36+
!!!DEPRECATED!!!
11337
"""
114-
api = create_k8s_api_client(secrets)
38+
_log_deprecated("scale_microserviceal", "scale_deployment")
39+
scale_deployment(name, replicas, ns, secrets)
40+
11541

116-
v1 = client.AppsV1Api(api)
117-
body = {"spec": {"replicas": replicas}}
118-
try:
119-
v1.patch_namespaced_deployment_scale(name, namespace=ns, body=body)
120-
except ApiException as e:
121-
raise ActivityFailed(
122-
"failed to scale '{s}' to {r} replicas: {e}".format(
123-
s=name, r=replicas, e=str(e)))
42+
def kill_microservice(name: str, ns: str = "default",
43+
label_selector: str = "name in ({name})",
44+
secrets: Secrets = None):
45+
"""
46+
!!!DEPRECATED!!!
47+
"""
48+
_log_deprecated("kill_microservice",
49+
"delete_deployment/delete_replica_set/delete_pods")
50+
delete_deployment(name, ns, label_selector, secrets)
51+
delete_replica_set(name, ns, label_selector, secrets)
52+
delete_pods(name, ns, label_selector, secrets)

chaosk8s/deployment/__init__.py

Whitespace-only changes.

chaosk8s/deployment/actions.py

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import json
2+
import os.path
3+
import yaml
4+
5+
from chaoslib.exceptions import ActivityFailed
6+
from chaoslib.types import Secrets
7+
from kubernetes import client
8+
from logzero import logger
9+
from kubernetes.client.rest import ApiException
10+
11+
from chaosk8s import create_k8s_api_client
12+
13+
__all__ = ["create_deployment", "delete_deployment"]
14+
15+
16+
def create_deployment(spec_path: str, ns: str = "default",
17+
secrets: Secrets = None):
18+
"""
19+
Create a deployment described by the deployment config, which must be the
20+
path to the JSON or YAML representation of the deployment.
21+
"""
22+
api = create_k8s_api_client(secrets)
23+
24+
with open(spec_path) as f:
25+
p, ext = os.path.splitext(spec_path)
26+
if ext == '.json':
27+
deployment = json.loads(f.read())
28+
elif ext in ['.yml', '.yaml']:
29+
deployment = yaml.load(f.read())
30+
else:
31+
raise ActivityFailed(
32+
"cannot process {path}".format(path=spec_path))
33+
34+
v1 = client.AppsV1beta1Api(api)
35+
resp = v1.create_namespaced_deployment(ns, body=deployment)
36+
37+
38+
def delete_deployment(name: str, ns: str = "default",
39+
label_selector: str = "name in ({name})",
40+
secrets: Secrets = None):
41+
"""
42+
Delete a deployment by `name` in the namespace `ns`.
43+
44+
The deployment is deleted without a graceful period to trigger an abrupt
45+
termination.
46+
47+
The selected resources are matched by the given `label_selector`.
48+
"""
49+
label_selector = label_selector.format(name=name)
50+
api = create_k8s_api_client(secrets)
51+
52+
v1 = client.AppsV1beta1Api(api)
53+
if label_selector:
54+
ret = v1.list_namespaced_deployment(ns, label_selector=label_selector)
55+
else:
56+
ret = v1.list_namespaced_deployment(ns)
57+
58+
logger.debug("Found {d} deployments named '{n}'".format(
59+
d=len(ret.items), n=name))
60+
61+
body = client.V1DeleteOptions()
62+
for d in ret.items:
63+
v1.delete_namespaced_deployment(d.metadata.name, ns, body=body)
64+
65+
66+
def scale_deployment(name: str, replicas: int, ns: str = "default",
67+
secrets: Secrets = None):
68+
"""
69+
Scale a deployment up or down. The `name` is the name of the deployment.
70+
"""
71+
api = create_k8s_api_client(secrets)
72+
73+
v1 = client.ExtensionsV1beta1Api(api)
74+
body = {"spec": {"replicas": replicas}}
75+
try:
76+
v1.patch_namespaced_deployment_scale(name, namespace=ns, body=body)
77+
except ApiException as e:
78+
raise ActivityFailed(
79+
"failed to scale '{s}' to {r} replicas: {e}".format(
80+
s=name, r=replicas, e=str(e)))

0 commit comments

Comments
 (0)