77 get_namespaces ,
88 get_resource_types ,
99 get_current_context ,
10+ get_contexts ,
1011)
1112from utils import InputValidator , ResponseBuilder
1213
1617@cluster_bp .route ('/api/cluster/context' , methods = ['GET' ])
1718def get_context ():
1819 """Return the name of the currently active kubectl context."""
19- try :
20- context = get_current_context ()
21- return ResponseBuilder .success ({"context" : context })
22- except RuntimeError as e :
23- return ResponseBuilder .error (str (e ))
24- except Exception as e :
25- return ResponseBuilder .error (f"Unexpected error: { str (e )} " )
20+ context , error = get_current_context ()
21+ if error :
22+ return ResponseBuilder .error (error )
23+ return ResponseBuilder .success ({"context" : context })
24+
25+
26+ @cluster_bp .route ('/api/cluster/contexts' , methods = ['GET' ])
27+ def list_contexts ():
28+ """Return the list of kubectl contexts configured locally, marking which one is current."""
29+ contexts , error = get_contexts ()
30+ if error :
31+ return ResponseBuilder .error (error )
32+ return ResponseBuilder .success ({
33+ "contexts" : contexts ,
34+ "count" : len (contexts )
35+ })
2636
2737
2838@cluster_bp .route ('/api/cluster/namespaces' , methods = ['GET' ])
2939def list_namespaces ():
3040 """Return the list of namespaces available in the connected Kubernetes cluster."""
31- try :
32- namespaces = get_namespaces ()
33- return ResponseBuilder .success ({
34- "namespaces" : namespaces ,
35- "count" : len (namespaces )
36- })
37- except RuntimeError as e :
38- return ResponseBuilder .error (str (e ))
39- except Exception as e :
40- return ResponseBuilder .error (f"Unexpected error: { str (e )} " )
41+ context = request .args .get ('context' ) or None
42+ namespaces , error = get_namespaces (context = context )
43+ if error :
44+ return ResponseBuilder .error (error )
45+ return ResponseBuilder .success ({
46+ "namespaces" : namespaces ,
47+ "count" : len (namespaces )
48+ })
4149
4250
4351@cluster_bp .route ('/api/cluster/resource-types' , methods = ['GET' ])
4452def list_resource_types ():
4553 """Return all resource types known by the cluster, tagged with namespace scope and common status."""
46- try :
47- resource_types = get_resource_types ()
48- return ResponseBuilder .success ({
49- "resourceTypes" : resource_types ,
50- "count" : len (resource_types )
51- })
52- except RuntimeError as e :
53- return ResponseBuilder .error (str (e ))
54- except Exception as e :
55- return ResponseBuilder .error (f"Unexpected error: { str (e )} " )
54+ context = request .args .get ('context' ) or None
55+ resource_types , error = get_resource_types (context = context )
56+ if error :
57+ return ResponseBuilder .error (error )
58+ return ResponseBuilder .success ({
59+ "resourceTypes" : resource_types ,
60+ "count" : len (resource_types )
61+ })
5662
5763
5864@cluster_bp .route ('/api/cluster/generate' , methods = ['POST' ])
@@ -66,6 +72,7 @@ def generate_cluster_diagram():
6672 output_format = (data .get ('outputFormat' ) or 'png' ).lower ()
6773 extra_args = data .get ('extraArgs' , '' )
6874 without_namespace = data .get ('withoutNamespace' , False )
75+ context = data .get ('context' ) or None
6976
7077 # Log to CSV
7178 client_ip = request .remote_addr
@@ -76,7 +83,8 @@ def generate_cluster_diagram():
7683 f"allNamespaces={ all_namespaces } ;"
7784 f"format={ output_format } ;"
7885 f"extraArgs={ compact_for_log (extra_args )} ;"
79- f"withoutNamespace={ without_namespace } "
86+ f"withoutNamespace={ without_namespace } ;"
87+ f"context={ context } "
8088 )
8189 log_to_csv (client_ip , route , params )
8290
@@ -94,7 +102,7 @@ def generate_cluster_diagram():
94102 return ResponseBuilder .validation_error ("outputFormat" , error_msg )
95103
96104 # Extra arguments validation
97- is_valid , error_msg = InputValidator .validate_extra_args (extra_args )
105+ is_valid , error_msg = InputValidator .validate_extra_args (extra_args , "kubectl-diagrams" )
98106 if not is_valid :
99107 return ResponseBuilder .validation_error ("extraArgs" , error_msg )
100108
@@ -105,7 +113,8 @@ def generate_cluster_diagram():
105113 all_namespaces = all_namespaces ,
106114 output_format = output_format ,
107115 extra_args = extra_args ,
108- without_namespace = without_namespace
116+ without_namespace = without_namespace ,
117+ context = context
109118 )
110119
111120 if result .success :
0 commit comments