Skip to content

Commit 09c1f31

Browse files
committed
WIP verbose
1 parent 3dbf182 commit 09c1f31

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

kubedownscaler/main.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from kubernetes.client.rest import ApiException
99
from termcolor import cprint
1010

11+
args = None
12+
1113
def annotate(api, kind: str, name: str, namespace: str, value: str):
1214
'''
1315
Annotate a kube resource with its original number of replicas
@@ -19,7 +21,13 @@ def annotate(api, kind: str, name: str, namespace: str, value: str):
1921
value = str(value)
2022

2123
body = {"metadata": {"annotations": {
22-
'kubescaledown/originalReplicas': str(value)}}}
24+
'kubescaledown/originalReplicas': value}}}
25+
26+
if args.verbose:
27+
if value is None:
28+
print(f"Removing annotation kubescaledown/originalReplicas from {kind} {namespace}/{name}")
29+
else:
30+
print(f"Annotating {kind} {namespace}/{name} with kubescaledown/originalReplicas: {value}")
2331

2432
match kind:
2533
case "Deployment":
@@ -103,6 +111,9 @@ def upscale(api, kind: str, obj, dry_run: bool):
103111
namespace = obj.metadata.namespace
104112
name = obj.metadata.name
105113
replicas = int(obj.spec.replicas)
114+
if args.verbose:
115+
print(f"Getting original replica count from {kind} {namespace}/{name}")
116+
106117
try:
107118
original_replicas = int(
108119
obj.metadata.annotations['kubescaledown/originalReplicas'])
@@ -111,6 +122,8 @@ def upscale(api, kind: str, obj, dry_run: bool):
111122
except ValueError:
112123
return
113124
except KeyError:
125+
if args.verbose:
126+
print(f"{kind} {namespace}/{name} was not previously annotated")
114127
return
115128

116129
# Remove the annotation, and scale back up
@@ -133,6 +146,8 @@ def main():
133146
help="scale up to restore state", action='store_true')
134147
parser.add_argument(
135148
'--dry-run', help="don't actually scale anything", action='store_true')
149+
parser.add_argument('-v', '--verbose',
150+
help="enable verbose output", action=argparse.BooleanOptionalAction)
136151
parser.add_argument('-n', '--namespace',
137152
help="namespace to operate on", type=str)
138153
parser.add_argument("--deployments", help="scale Deployments",
@@ -141,6 +156,8 @@ def main():
141156
default=True, action=argparse.BooleanOptionalAction)
142157
parser.add_argument("--storageclass", help="only scale pods that are consuming a specific storageclass",
143158
type=str)
159+
# pylint: disable=global-statement
160+
global args
144161
args = parser.parse_args()
145162

146163
# connect to cluster
@@ -151,14 +168,20 @@ def main():
151168
# Determine whether namespaced or global, and fetch list of Deployments
152169
if args.namespace:
153170
# do namespaced
171+
if args.verbose:
172+
print(f"Operating on namespace {args.namespace}")
154173
if args.deployments:
174+
if args.verbose:
175+
print(f"Getting deployments in namespace {args.namespace}")
155176
try:
156177
deployments = apps_v1.list_namespaced_deployment(
157178
namespace=args.namespace)
158179
except ApiException as e:
159180
print(
160181
f"Exception when calling AppsV1Api->list_namespaced_deployment: {e}\n")
161182
if args.statefulsets:
183+
if args.verbose:
184+
print(f"Getting statefulsets in namespace {args.namespace}")
162185
try:
163186
statefulsets = apps_v1.list_namespaced_stateful_set(
164187
namespace=args.namespace)
@@ -167,13 +190,19 @@ def main():
167190
f"Exception when calling AppsV1Api->list_namespaced_stateful_set: {e}\n")
168191
else:
169192
# do global
193+
if args.verbose:
194+
print("Operating on all namespaces")
170195
if args.deployments:
196+
if args.verbose:
197+
print("Getting all deployments")
171198
try:
172199
deployments = apps_v1.list_deployment_for_all_namespaces()
173200
except ApiException as e:
174201
print(
175202
f"Exception when calling AppsV1Api->list_deployment_for_all_namespaces: {e}\n")
176203
if args.statefulsets:
204+
if args.verbose:
205+
print("Getting all statefulsets")
177206
try:
178207
statefulsets = apps_v1.list_stateful_set_for_all_namespaces()
179208
except ApiException as e:
@@ -183,8 +212,14 @@ def main():
183212
# remove any deployment or statefulset from the list that doesn't reference this storageclass
184213
if args.storageclass:
185214

215+
if args.verbose:
216+
print(f"Checking deployments and statefulsets for storageclass {args.storageclass}")
217+
218+
186219
# for deployments, get the PVCs from the Deployment and get the SC from the PVC
187220
for deployment in deployments.items:
221+
if args.verbose:
222+
print(f"Working on deployment {deployment.metadata.name}/{deployment.metadata.namespace}")
188223
to_be_scaled = False
189224

190225
# get full deployment details
@@ -235,16 +270,24 @@ def main():
235270
if args.up:
236271
if args.deployments:
237272
for deployment in deployments.items:
273+
if args.verbose:
274+
print(f"Working on deployment {deployment.metadata.name}/{deployment.metadata.namespace}")
238275
upscale(apps_v1, "Deployment", deployment, args.dry_run)
239276
if args.statefulsets:
240277
for statefulset in statefulsets.items:
278+
if args.verbose:
279+
print(f"Working on statefulset {statefulset.metadata.name}/{statefulset.metadata.namespace}")
241280
upscale(apps_v1, "StatefulSet", statefulset, args.dry_run)
242281
elif args.down:
243282
if args.deployments:
244283
for deployment in deployments.items:
284+
if args.verbose:
285+
print(f"Working on deployment {deployment.metadata.name}/{deployment.metadata.namespace}")
245286
downscale(apps_v1, "Deployment", deployment, args.dry_run)
246287
if args.statefulsets:
247288
for statefulset in statefulsets.items:
289+
if args.verbose:
290+
print(f"Working on statefulset {statefulset.metadata.name}/{statefulset.metadata.namespace}")
248291
downscale(apps_v1, "StatefulSet", statefulset, args.dry_run)
249292

250293
if __name__ == '__main__':

0 commit comments

Comments
 (0)