Skip to content

Commit

Permalink
feat: add Priority Classes
Browse files Browse the repository at this point in the history
Signed-off-by: devopstales <42894256+devopstales@users.noreply.github.com>
  • Loading branch information
devopstales committed May 16, 2023
1 parent 20b9498 commit 8dfe9cf
Show file tree
Hide file tree
Showing 5 changed files with 316 additions and 1 deletion.
43 changes: 43 additions & 0 deletions src/kubedash/functions/k8s.py
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,26 @@ def k8sNodeGet(username_role, user_token, no_name):
else:
return NODE_INFO

##############################################################
## HPA
##############################################################

def k8sHPAListGet(username_role, user_token, ns_name):
HPA_LIST = list()
k8sClientConfigGet("admin", None)
hpas = k8s_client.AutoscalingV1Api().list_namespaced_horizontal_pod_autoscaler(ns_name)
for hpa in hpas.items:
HPA_DATA = {
"name": hpa.metadata.name,
"namespace": hpa.metadata.namespace,
"annotations": hpa.metadata.annotations,
"labels": hpa.metadata.labels,
"spec": hpa.spec,
"status": hpa.status,
}
HPA_LIST.append(HPA_DATA)
return HPA_LIST

##############################################################
# Workloads
##############################################################
Expand Down Expand Up @@ -1821,6 +1841,29 @@ def k8sPolicyListGet(username_role, user_token, ns_name):
POLICY_LIST.append(POLICY_DATA)
return POLICY_LIST

##############################################################
## Priority ClassList
##############################################################

def k8sPriorityClassList(username_role, user_token):
PC_LIST = list()
k8sClientConfigGet(username_role, user_token)

pcs = k8s_client.SchedulingV1Api().list_priority_class()
for cs in pcs.items:
PCS_DATA = {
"name": cs.metadata.name,
"annotations": cs.metadata.annotations,
"labels": cs.metadata.labels,
"creation": cs.metadata.creation_timestamp,
"preemption_policy": cs.preemption_policy,
"value": cs.value,
"description": cs.description,
"global_default": cs.global_default,
}
PC_LIST.append(PCS_DATA)
return PC_LIST

##############################################################
# Network
##############################################################
Expand Down
81 changes: 80 additions & 1 deletion src/kubedash/functions/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -755,7 +755,38 @@ def namespaces_delete():
return redirect(url_for('routes.namespaces'))

##############################################################
## Workloads
## HPA
##############################################################

@routes.route("/hpa", methods=['GET', 'POST'])
@login_required
def hpa():
selected = None

if request.method == 'POST':
session['ns_select'] = request.form.get('ns_select')
selected = request.form.get('selected')

if session['user_type'] == "OpenID":
user_token = session['oauth_token']
else:
user_token = None

namespace_list, error = k8sNamespaceListGet(session['user_role'], user_token)
if not error:
hpas = k8sHPAListGet(session['user_role'], user_token, session['ns_select'])
else:
hpas = []

return render_template(
'hpa.html.j2',
selected = selected,
hpas = hpas,
namespaces = namespace_list,
)

##############################################################
# Workloads
##############################################################
## Statefullsets
##############################################################
Expand Down Expand Up @@ -1480,6 +1511,54 @@ def policies_data():
else:
return redirect(url_for('routes.login'))

##############################################################
## PriorityClass
##############################################################
@routes.route('/priorityclass', methods=['GET', 'POST'])
@login_required
def priorityclass_list():
selected = None
if session['user_type'] == "OpenID":
user_token = session['oauth_token']
else:
user_token = None

if request.method == 'POST':
selected = request.form.get('selected')

priorityclass = k8sPriorityClassList(session['user_role'], user_token)

return render_template(
'priorityclass.html.j2',
priorityclass = priorityclass,
selected = selected,
)

@routes.route('/priorityclass/data', methods=['GET', 'POST'])
@login_required
def priorityclass_data():
if request.method == 'POST':
pc_name = request.form.get('pc_name')
session['ns_select'] = request.form.get('ns_select')

if session['user_type'] == "OpenID":
user_token = session['oauth_token']
else:
user_token = None

priorityclass = k8sPriorityClassList(session['user_role'], user_token)
for pc in priorityclass:
if pc["name"] == pc_name:
pc_data = pc

return render_template(
'priorityclass-data.html.j2',
pc_data = pc_data,
namespace = session['ns_select'],
)
else:
return redirect(url_for('routes.login'))

##############################################################
# Network
##############################################################
Expand Down
10 changes: 10 additions & 0 deletions src/kubedash/templates/base.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,15 @@
<div class="bg-white py-2 collapse-inner rounded">
<a class="collapse-item" href="/nodes">Nodes</a>
<a class="collapse-item" href="/namespaces">Namespaces</a>
{% if session['ns_select'] %}
<form action="/hpa" method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<input type="hidden" name="ns_select" value="{{ session['ns_select'] }}" />
<a class="collapse-item" href="#" onclick="event.preventDefault(); this.parentNode.submit()">HPA</a>
</form>
{% else %}
<a class="collapse-item" href="/hpa">HPA</a>
{% endif %}
</div>
</div>
</li>
Expand Down Expand Up @@ -291,6 +300,7 @@
<a class="collapse-item" href="/secrets">Secrets</a>
<a class="collapse-item" href="/policies">Network Policies</a>
{% endif %}
<a class="collapse-item" href="/priorityclass">Priority Classes</a>
</div>
</div>
</li>
Expand Down
107 changes: 107 additions & 0 deletions src/kubedash/templates/priorityclass-data.html.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
{% extends "base.html.j2" %}

{% block header %}
<link href="{{ url_for('static',filename='/vendor/datatables/dataTables.bootstrap4.min.css') }}" rel="stylesheet" >
<link href="{{ url_for('static',filename='/vendor/google/material-icons.css') }}" rel="stylesheet" >
{% endblock %}

{% block content %}

<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">Workloads</li>
<li class="breadcrumb-item"><a href="/priorityclass">Priority Class</a></li>
<li class="breadcrumb-item active" aria-current="page">{{ pc_data.name }}</li>
<div class="col">
<a class="card-link float-right pr-1" data-toggle="collapse" href="#" onclick="reload()">
<i class="material-icons">refresh</i>
</a>
</div>
</ol>
</nav>

<div class="card shadow mb-4">
<div class="card-header">
<h6 class="m-0 font-weight-bold text-primary">Priority Class Data</h6>
</div>
<div class="card-body">
<div class="tab-content" id="nav-tabContent">
<!-- policy -->
<div class="card shadow mb-4">
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="policyInfoTable" width="100%" cellspacing="0">
<tr>
<th>Name:</th>
<td>{{ pc_data.name }}</td>
</tr>
<tr>
<th>Description:</th>
<td>{{ pc_data.description }}</td>
</tr>
<tr>
<th>Value:</th>
<td>{{ pc_data.value }}</td>
</tr>
<tr>
<th>Preemption Policy:</th>
<td>{{ pc_data.preemption_policy }}</td>
</tr>
<tr>
<th>Global Default:</th>
<td>
{% if pc_data.global_default %}
True
{% else %}
False
{% endif %}
</td>
</tr>
<tr>
<th>Creation:</th>
<td>{{ pc_data.creation }}</td>
</tr>
<tr>
<th>Annotations:</th>
<td>
{% if pc_data.annotations %}
{% for an_key, an_value in pc_data.annotations.items() %}
{% if an_key != "kubectl.kubernetes.io/last-applied-configuration" %}
<span class="badge badge-tag badge-secondary">{{ an_key }}: {{ an_value }}</span>
{% if not loop.last %}<br>{% endif %}
{% endif %}
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
<th>Labels:</th>
<td>
{% if pc_data.labels %}
{% for an_key, an_value in pc_data.labels.items() %}
{% if an_key != "kubectl.kubernetes.io/last-applied-configuration" %}
<span class="badge badge-tag badge-secondary">{{ an_key }}: {{ an_value }}</span>
{% if not loop.last %}<br>{% endif %}
{% endif %}
{% endfor %}
{% endif %}
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

{% block scripts %}

<!-- Page level plugins -->
<script src="{{ url_for('static',filename='vendor/datatables/jquery.dataTables.js') }}"></script>
<script src="{{ url_for('static',filename='vendor/datatables/dataTables.bootstrap4.min.js') }}"></script>

<!-- Page level custom scripts -->
<script src="{{ url_for('static',filename='js/demo/datatables-demo.js') }}"></script>
{% endblock %}
76 changes: 76 additions & 0 deletions src/kubedash/templates/priorityclass.html.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
{% extends "base.html.j2" %}

{% block header %}
<link href="{{ url_for('static',filename='/vendor/datatables/dataTables.bootstrap4.min.css') }}" rel="stylesheet" >
<link href="{{ url_for('static',filename='/vendor/datatables/jquery.dataTables.css') }}" rel="stylesheet" >
{% endblock %}

{% block content %}
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">Security</li>
<li class="breadcrumb-item active" aria-current="page">Priority Classes</li>
<div class="col">
<a class="card-link float-right" data-toggle="collapse" href="#" onclick="reload()">
<i class="material-icons">refresh</i>
</a>
</div>
</ol>
</nav>

<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Priority Class List</h6>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>Name</th>
<th>Value</th>
<th>Global Default</th>
</tr>
</thead>
<tbody>
{% for pc in priorityclass %}
{% if selected == pc.name %}
<tr class="selected" >
{% else %}
<tr>
{% endif %}
<td>
<form action="/priorityclass/data" method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<input type="hidden" name="pc_name" value="{{ pc.name }}" />
<a href="javascript:;" onclick="parentNode.submit();">{{ pc.name }}</a>
</form>
</td>
<td>
<span class="badge badge-tag badge-secondary">{{ pc.value }}</span>
</td>
<td>
{% if pc.global_default %}
True
{% else %}
False
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>

{% endblock %}

{% block scripts %}
<!-- Page level plugins -->
<script src="{{ url_for('static',filename='vendor/datatables/jquery.dataTables.js') }}"></script>
<script src="{{ url_for('static',filename='vendor/datatables/dataTables.bootstrap4.min.js') }}"></script>

<!-- Page level custom scripts -->
<script src="{{ url_for('static',filename='js/demo/datatables-demo.js') }}"></script>
{% endblock %}

0 comments on commit 8dfe9cf

Please sign in to comment.