mirror of
https://github.com/retspen/webvirtcloud
synced 2024-12-25 15:45:23 +00:00
Merge branch 'nwfilters'
This commit is contained in:
commit
f45666d88b
23 changed files with 834 additions and 3 deletions
|
@ -20,6 +20,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -21,6 +21,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> {% trans "Interfaces" %}
|
<i class="fa fa-wifi"></i> {% trans "Interfaces" %}
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
0
nwfilters/__init__.py
Normal file
0
nwfilters/__init__.py
Normal file
6
nwfilters/admin.py
Normal file
6
nwfilters/admin.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
8
nwfilters/apps.py
Normal file
8
nwfilters/apps.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class NwfiltersConfig(AppConfig):
|
||||||
|
name = 'nwfilters'
|
0
nwfilters/migrations/__init__.py
Normal file
0
nwfilters/migrations/__init__.py
Normal file
6
nwfilters/models.py
Normal file
6
nwfilters/models.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
32
nwfilters/templates/create_nwfilter_block.html
Normal file
32
nwfilters/templates/create_nwfilter_block.html
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{% load i18n %}
|
||||||
|
{% if request.user.is_superuser %}
|
||||||
|
<a href="#AddNWFilter" type="button" class="btn btn-success pull-right" data-toggle="modal">
|
||||||
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Modal Secret -->
|
||||||
|
<div class="modal fade" id="AddNWFilter" tabindex="-1" role="dialog" aria-labelledby="AddNWFilter" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title">{% trans "Create New NWFilter" %}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-xs-12" id="xmlheight">
|
||||||
|
<input type="hidden" name="nwfilter_xml"/>
|
||||||
|
<textarea id="editor" name="from_xml"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Close" %}</button>
|
||||||
|
<button type="submit" class="btn btn-primary" name="create_nwfilter">{% trans "Create" %}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div> <!-- /.modal-content -->
|
||||||
|
</div>
|
||||||
|
</div> <!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
{% endif %}
|
220
nwfilters/templates/nwfilter.html
Normal file
220
nwfilters/templates/nwfilter.html
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% block title %}{% trans "NWFilters" %} - {{ compute.name }}{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<!-- Page Heading -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
{% include 'create_nwfilter_block.html' %}
|
||||||
|
<h1 class="page-header">{% trans "NWFilter:" %} {{ name }}</h1>
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="active">
|
||||||
|
<i class="fa fa-dashboard"></i> <a href="{% url 'overview' compute.id %}">{% trans "Overview" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-hdd-o"></i> <a href="{% url 'storages' compute.id %}">{% trans "Storages" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-sitemap"></i> <a href="{% url 'networks' compute.id %}">{% trans "Networks" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> {% trans "NWFilters" %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
|
||||||
|
{% include 'errors_block.html' %}
|
||||||
|
{% include 'messages_block.html' %}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-6 col-sm-4">
|
||||||
|
<p>{% trans "UUID:" %}</p>
|
||||||
|
<p>{% trans "Name:" %}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-xs-6 col-sm-8">
|
||||||
|
<p>{{ uuid }}</p>
|
||||||
|
<p>{{ name }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<p><strong>{% trans "XML:" %}</strong></p>
|
||||||
|
<form class="form-inline" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="col-xs-12" id="xmlheight">
|
||||||
|
<input type="hidden" name="edit_xml"/>
|
||||||
|
<textarea id="edit_editor">{{ xml }}</textarea>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary pull-right" name="edit_nwfilter">
|
||||||
|
{% trans "Edit" %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<p><strong>{% trans "Filter References:" %}</strong></p>
|
||||||
|
<form class="form-inline pull-right" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<label>{% trans "Filter:" %}</label>
|
||||||
|
<select id="nwfilter_select" name="nwfilters_select" class="form-control">
|
||||||
|
<option value="" selected>None</option>
|
||||||
|
{% for nwf in nwfilters_all %}
|
||||||
|
<option value="{{ nwf.name }}">{{ nwf.name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-success pull-right" name="add_nwfilter_ref">
|
||||||
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width: 45px;">#</th>
|
||||||
|
<th>{% trans "Reference" %}</th>
|
||||||
|
<th colspan="3">{% trans "Action" %}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for ref in refs %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ forloop.counter }}</td>
|
||||||
|
<td>{{ ref }}</td>
|
||||||
|
<td style="width:30px;">
|
||||||
|
<form action="" method="post" style="height:10px" role="form">{% csrf_token %}
|
||||||
|
<input type="hidden" name="ref" value="{{ ref }}">
|
||||||
|
<button type="submit" class="btn btn-sm btn-default" name="del_nwfilter_ref" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
|
||||||
|
<i class="fa fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<p><strong>{% trans "Rules:" %}</strong></p>
|
||||||
|
<a href="#AddNWFilterRule" type="button" class="btn btn-success pull-right" data-toggle="modal">
|
||||||
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Modal Secret -->
|
||||||
|
<div class="modal fade" id="AddNWFilterRule" tabindex="-1" role="dialog" aria-labelledby="AddNWFilterRule" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title">{% trans "Add New NWFilter Rule" %}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-xs-12" id="xmlheight">
|
||||||
|
<input type="hidden" name="nwfilterrule_xml"/>
|
||||||
|
<textarea id="rule_editor"></textarea>
|
||||||
|
</div>
|
||||||
|
<p><small><em>If there is a rule which has same attributes it replaces that rule...</em></small></p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Close" %}</button>
|
||||||
|
<button type="submit" class="btn btn-primary" name="add_nwfilter_rule">{% trans "Add" %}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div> <!-- /.modal-content -->
|
||||||
|
</div>
|
||||||
|
</div> <!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width: 45px;">{% trans "Rule" %}</th>
|
||||||
|
<th>{% trans "ActionType" %}</th>
|
||||||
|
<th>{% trans "Direction" %}</th>
|
||||||
|
<th>{% trans "Priority" %}</th>
|
||||||
|
<th>{% trans "Statematch" %}</th>
|
||||||
|
<th>{% trans "Directives" %}</th>
|
||||||
|
<th colspan="3">{% trans "Action" %}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for rule in rules %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ forloop.counter }}</td>
|
||||||
|
<td>{{ rule.action }}</td>
|
||||||
|
<td>{{ rule.direction }}</td>
|
||||||
|
<td>{{ rule.priority }}</td>
|
||||||
|
<td>{{ rule.statematch }}</td>
|
||||||
|
<td>{{ rule.directives }}</td>
|
||||||
|
<td style="width:30px;">
|
||||||
|
<form action="" method="post" style="height:10px" role="form">{% csrf_token %}
|
||||||
|
<input type="hidden" name="action" value="{{ rule.action }}">
|
||||||
|
<input type="hidden" name="direction" value="{{ rule.direction }}">
|
||||||
|
<input type="hidden" name="priority" value="{{ rule.priority }}">
|
||||||
|
<button type="submit" class="btn btn-sm btn-default" name="del_nwfilter_rule" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
|
||||||
|
<i class="fa fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
<script src="{% static "js/sortable.min.js" %}"></script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
(function ($) {
|
||||||
|
$('#filter').keyup(function () {
|
||||||
|
var rex = new RegExp($(this).val(), 'i');
|
||||||
|
$('.searchable tr').hide();
|
||||||
|
$('.searchable tr').filter(function () {
|
||||||
|
return rex.test($(this).text());
|
||||||
|
}).show();
|
||||||
|
})
|
||||||
|
}(jQuery));
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script src="{% static "js/ace.js" %}"></script>
|
||||||
|
<script>
|
||||||
|
var editor = ace.edit("edit_editor");
|
||||||
|
editor.getSession().setMode("ace/mode/xml");
|
||||||
|
|
||||||
|
var edit_input = $('input[name="edit_xml"]');
|
||||||
|
editor.getSession().on("change",function () {
|
||||||
|
edit_input.val(editor.getSession().getValue());
|
||||||
|
})
|
||||||
|
|
||||||
|
var rule_editor = ace.edit("rule_editor");
|
||||||
|
rule_editor.getSession().setMode("ace/mode/xml");
|
||||||
|
|
||||||
|
var rule_input = $('input[name="nwfilterrule_xml"]');
|
||||||
|
rule_editor.getSession().on("change",function () {
|
||||||
|
rule_input.val(rule_editor.getSession().getValue());
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endblock %}
|
168
nwfilters/templates/nwfilters.html
Normal file
168
nwfilters/templates/nwfilters.html
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% block title %}{% trans "NWFilters" %} - {{ compute.name }}{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<!-- Page Heading -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
{% include 'create_nwfilter_block.html' %}
|
||||||
|
<h1 class="page-header">{{ compute.name }}</h1>
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="active">
|
||||||
|
<i class="fa fa-dashboard"></i> <a href="{% url 'overview' compute.id %}">{% trans "Overview" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-hdd-o"></i> <a href="{% url 'storages' compute.id %}">{% trans "Storages" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-sitemap"></i> <a href="{% url 'networks' compute.id %}">{% trans "Networks" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> {% trans "NWFilters" %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
|
||||||
|
{% include 'errors_block.html' %}
|
||||||
|
{% include 'messages_block.html' %}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="row">
|
||||||
|
<div class="pull-right">
|
||||||
|
<input id="filter" class="form-control" type="text" placeholder="Search">
|
||||||
|
</div>
|
||||||
|
<h3 class="page-header">{% trans "NWFilters" %}</h3>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% if nwfilters %}
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped sortable-theme-bootstrap" data-sortable>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width: 45px;">#</th>
|
||||||
|
<th>{% trans "UUID" %}</th>
|
||||||
|
<th>{% trans "Name" %}</th>
|
||||||
|
<th data-sortable="false" colspan="3">{% trans "Action" %}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="searchable">
|
||||||
|
{% for nwfilter in nwfilters %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ forloop.counter }}</td>
|
||||||
|
<td><a href="{% url "nwfilter" compute.id nwfilter.name %} ">{{ nwfilter.uuid }}</a></td>
|
||||||
|
<td>{{ nwfilter.name }}</td>
|
||||||
|
<td style="width:30px;">
|
||||||
|
<div class="modal fade" id="Show{{ forloop.counter }}" tabindex="-1" role="dialog" aria-labelledby="showNWFilter" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title">{% trans "Details of NWFilter" %}: <span class="text-danger">{{ nwfilter.name }}</span></h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
{{ nwfilter.xml }}
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Close" %}</button>
|
||||||
|
</div>
|
||||||
|
</div> <!-- /.modal-content -->
|
||||||
|
</div> <!-- /.modal-dialog -->
|
||||||
|
</div> <!-- /.modal -->
|
||||||
|
<a data-toggle="modal" href="#Show{{ forloop.counter }}" class="btn btn-sm btn-default" title="{% trans "Show" %}"><i class="fa fa-eye"></i></a>
|
||||||
|
</td>
|
||||||
|
<td style="width:30px;">
|
||||||
|
<div class="modal fade" id="Clone{{ forloop.counter }}" tabindex="-1" role="dialog" aria-labelledby="addNwFilterLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title">{% trans "Clone nwfilter" %} <span class="text-danger">{{ nwfilter.name }}</span></h4>
|
||||||
|
</div>
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="cln_name" placeholder="{% trans "Name" %}" required pattern="[a-zA-Z0-9\.\-_]+">
|
||||||
|
<input type="hidden" name="nwfiltername" value="{{ nwfilter.name }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Close" %}</button>
|
||||||
|
<button type="submit" class="btn btn-primary" name="cln_nwfilter">{% trans "Clone" %}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div> <!-- /.modal-content -->
|
||||||
|
</div> <!-- /.modal-dialog -->
|
||||||
|
</div> <!-- /.modal -->
|
||||||
|
<a data-toggle="modal" href="#Clone{{ forloop.counter }}" class="btn btn-sm btn-default" title="{% trans "Clone" %}"><i class="fa fa-files-o"></i></a>
|
||||||
|
</td>
|
||||||
|
<td style="width:30px;">
|
||||||
|
<form action="" method="post" style="height:10px" role="form">{% csrf_token %}
|
||||||
|
<input type="hidden" name="nwfiltername" value="{{ nwfilter.name }}">
|
||||||
|
<button type="submit" class="btn btn-sm btn-default" name="del_nwfilter" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
|
||||||
|
<i class="fa fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="alert alert-warning alert-dismissable">
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
|
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "Hypervisor doesn't have any NWFilters" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
<script src="{% static "js/sortable.min.js" %}"></script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
(function ($) {
|
||||||
|
$('#filter').keyup(function () {
|
||||||
|
var rex = new RegExp($(this).val(), 'i');
|
||||||
|
$('.searchable tr').hide();
|
||||||
|
$('.searchable tr').filter(function () {
|
||||||
|
return rex.test($(this).text());
|
||||||
|
}).show();
|
||||||
|
})
|
||||||
|
}(jQuery));
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script src="{% static "js/ace.js" %}"></script>
|
||||||
|
<script>
|
||||||
|
var editor = ace.edit("editor");
|
||||||
|
editor.getSession().setMode("ace/mode/xml");
|
||||||
|
|
||||||
|
var input = $('input[name="nwfilter_xml"]');
|
||||||
|
editor.getSession().on("change",function () {
|
||||||
|
input.val(editor.getSession().getValue());
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
6
nwfilters/tests.py
Normal file
6
nwfilters/tests.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
211
nwfilters/views.py
Normal file
211
nwfilters/views.py
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.shortcuts import render, get_object_or_404
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from computes.models import Compute
|
||||||
|
from vrtManager import util
|
||||||
|
from vrtManager.nwfilters import wvmNWFilters, wvmNWFilter
|
||||||
|
from vrtManager.instance import wvmInstances, wvmInstance
|
||||||
|
from libvirt import libvirtError
|
||||||
|
from logs.views import addlogmsg
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def nwfilters(request, compute_id):
|
||||||
|
"""
|
||||||
|
:param request:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not request.user.is_superuser:
|
||||||
|
return HttpResponseRedirect(reverse('index'))
|
||||||
|
|
||||||
|
error_messages = []
|
||||||
|
nwfilters_all = []
|
||||||
|
compute = get_object_or_404(Compute, pk=compute_id)
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn = wvmNWFilters(compute.hostname,
|
||||||
|
compute.login,
|
||||||
|
compute.password,
|
||||||
|
compute.type)
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
if 'create_nwfilter' in request.POST:
|
||||||
|
xml = request.POST.get('nwfilter_xml', '')
|
||||||
|
if xml:
|
||||||
|
try:
|
||||||
|
util.etree.fromstring(xml)
|
||||||
|
name = util.get_xml_path(xml, '/filter/@name')
|
||||||
|
uuid = util.get_xml_path(xml, '/filter/uuid')
|
||||||
|
except util.etree.ParseError:
|
||||||
|
name = None
|
||||||
|
|
||||||
|
for nwf in nwfilters:
|
||||||
|
if name == nwf.name():
|
||||||
|
error_msg = _("A network filter with this name already exists")
|
||||||
|
raise Exception(error_msg)
|
||||||
|
if uuid == nwf.UUIDString():
|
||||||
|
error_msg = _("A network filter with this uuid already exists")
|
||||||
|
raise Exception(error_msg)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
msg = _("Creating NWFilter: %s" % name)
|
||||||
|
conn.create_nwfilter(xml)
|
||||||
|
addlogmsg(request.user.username, compute.hostname, msg)
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
error_messages.append(lib_err.message)
|
||||||
|
addlogmsg(request.user.username, compute.hostname, lib_err.message)
|
||||||
|
|
||||||
|
if 'del_nwfilter' in request.POST:
|
||||||
|
name = request.POST.get('nwfiltername','')
|
||||||
|
msg = _("Deleting NWFilter: %s" % name)
|
||||||
|
in_use = False
|
||||||
|
nwfilter = conn.get_nwfilter(name)
|
||||||
|
|
||||||
|
is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type)
|
||||||
|
instances = is_conn.get_instances()
|
||||||
|
for inst in instances:
|
||||||
|
# if in_use: break
|
||||||
|
i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst)
|
||||||
|
dom_filterrefs = i_conn.get_filterrefs()
|
||||||
|
|
||||||
|
if name in dom_filterrefs:
|
||||||
|
in_use = True
|
||||||
|
msg = _("NWFilter is in use by %s. Cannot be deleted." % inst)
|
||||||
|
error_messages.append(msg)
|
||||||
|
addlogmsg(request.user.username, compute.hostname, msg)
|
||||||
|
i_conn.close()
|
||||||
|
break
|
||||||
|
|
||||||
|
is_conn.close()
|
||||||
|
if nwfilter and not in_use:
|
||||||
|
nwfilter.undefine()
|
||||||
|
addlogmsg(request.user.username, compute.hostname, msg)
|
||||||
|
|
||||||
|
if 'cln_nwfilter' in request.POST:
|
||||||
|
|
||||||
|
name = request.POST.get('nwfiltername','')
|
||||||
|
cln_name = request.POST.get('cln_name', name + '-clone')
|
||||||
|
|
||||||
|
conn.clone_nwfilter(name,cln_name)
|
||||||
|
msg = _("Cloning NWFilter %s as %s" % (name, cln_name))
|
||||||
|
addlogmsg(request.user.username, compute.hostname, msg)
|
||||||
|
|
||||||
|
for nwf in conn.get_nwfilters():
|
||||||
|
nwfilters_all.append(conn.get_nwfilter_info(nwf.name()))
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
error_messages.append(lib_err)
|
||||||
|
addlogmsg(request.user.username, compute.hostname, lib_err)
|
||||||
|
except Exception as err:
|
||||||
|
error_messages.append(err)
|
||||||
|
addlogmsg(request.user.username, compute.hostname, err)
|
||||||
|
|
||||||
|
return render(request, 'nwfilters.html', {'error_messages': error_messages,
|
||||||
|
'nwfilters': nwfilters_all,
|
||||||
|
'compute': compute})
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def nwfilter(request, compute_id, nwfltr):
|
||||||
|
|
||||||
|
error_messages = []
|
||||||
|
nwfilters_all = []
|
||||||
|
compute = get_object_or_404(Compute, pk=compute_id)
|
||||||
|
|
||||||
|
try:
|
||||||
|
nwfilter = wvmNWFilter(compute.hostname,
|
||||||
|
compute.login,
|
||||||
|
compute.password,
|
||||||
|
compute.type,
|
||||||
|
nwfltr)
|
||||||
|
conn = wvmNWFilters(compute.hostname,
|
||||||
|
compute.login,
|
||||||
|
compute.password,
|
||||||
|
compute.type)
|
||||||
|
|
||||||
|
for nwf in conn.get_nwfilters():
|
||||||
|
nwfilters_all.append(conn.get_nwfilter_info(nwf.name()))
|
||||||
|
|
||||||
|
uuid = nwfilter.get_uuid()
|
||||||
|
name = nwfilter.get_name()
|
||||||
|
xml = nwfilter.get_xml()
|
||||||
|
rules = nwfilter.get_rules()
|
||||||
|
refs = nwfilter.get_filter_refs()
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
|
||||||
|
if 'edit_nwfilter' in request.POST:
|
||||||
|
new_xml = request.POST.get('edit_xml', '')
|
||||||
|
|
||||||
|
if new_xml:
|
||||||
|
nwfilter.delete()
|
||||||
|
try:
|
||||||
|
conn.create_nwfilter(new_xml)
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
conn.create_nwfilter(xml)
|
||||||
|
raise libvirtError(lib_err)
|
||||||
|
|
||||||
|
if 'del_nwfilter_rule' in request.POST:
|
||||||
|
action = request.POST.get('action', '')
|
||||||
|
direction = request.POST.get('direction', '')
|
||||||
|
priority = request.POST.get('priority', '')
|
||||||
|
|
||||||
|
new_xml = nwfilter.delete_rule(action, direction, priority)
|
||||||
|
nwfilter.delete()
|
||||||
|
try:
|
||||||
|
conn.create_nwfilter(new_xml)
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
conn.create_nwfilter(xml)
|
||||||
|
raise libvirtError(lib_err)
|
||||||
|
|
||||||
|
if 'del_nwfilter_ref' in request.POST:
|
||||||
|
ref_name = request.POST.get('ref')
|
||||||
|
new_xml = nwfilter.delete_ref(ref_name)
|
||||||
|
nwfilter.delete()
|
||||||
|
try:
|
||||||
|
conn.create_nwfilter(new_xml)
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
conn.create_nwfilter(xml)
|
||||||
|
raise libvirtError(lib_err)
|
||||||
|
|
||||||
|
if 'add_nwfilter_rule' in request.POST:
|
||||||
|
rule_xml = request.POST.get('nwfilterrule_xml', '')
|
||||||
|
if not rule_xml:
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
new_xml = nwfilter.add_rule(rule_xml)
|
||||||
|
nwfilter.delete()
|
||||||
|
try:
|
||||||
|
conn.create_nwfilter(new_xml)
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
conn.create_nwfilter(xml)
|
||||||
|
raise libvirtError(lib_err)
|
||||||
|
|
||||||
|
if 'add_nwfilter_ref' in request.POST:
|
||||||
|
ref_name = request.POST.get('nwfilters_select', '')
|
||||||
|
if not ref_name:
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
new_xml = nwfilter.add_ref(ref_name)
|
||||||
|
nwfilter.delete()
|
||||||
|
try:
|
||||||
|
conn.create_nwfilter(new_xml)
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
conn.create_nwfilter(xml)
|
||||||
|
raise libvirtError(lib_err)
|
||||||
|
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
conn.close()
|
||||||
|
nwfilter.close()
|
||||||
|
except libvirtError as lib_err:
|
||||||
|
error_messages.append(lib_err)
|
||||||
|
except Exception as error_msg:
|
||||||
|
error_messages.append(error_msg)
|
||||||
|
|
||||||
|
return render(request, 'nwfilter.html', locals())
|
|
@ -24,6 +24,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> {% trans "Secrets" %}
|
<i class="fa fa-key"></i> {% trans "Secrets" %}
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
<i class="fa fa-wifi"></i> <a href="{% url 'interfaces' compute.id %}">{% trans "Interfaces" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-filter"></i> <a href="{% url 'nwfilters' compute.id %}">{% trans "NWFilters" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
<i class="fa fa-key"></i> <a href="{% url 'secrets' compute.id %}">{% trans "Secrets" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -389,6 +389,12 @@ class wvmConnect(object):
|
||||||
interface.append(inface)
|
interface.append(inface)
|
||||||
return interface
|
return interface
|
||||||
|
|
||||||
|
def get_nwfilters(self):
|
||||||
|
nwfilters = []
|
||||||
|
for nwfilter in self.wvm.listAllNWFilters():
|
||||||
|
nwfilters.append(nwfilter)
|
||||||
|
return nwfilters
|
||||||
|
|
||||||
def get_cache_modes(self):
|
def get_cache_modes(self):
|
||||||
"""Get cache available modes"""
|
"""Get cache available modes"""
|
||||||
return {
|
return {
|
||||||
|
@ -443,7 +449,6 @@ class wvmConnect(object):
|
||||||
|
|
||||||
def get_video(self):
|
def get_video(self):
|
||||||
""" Get available graphics video types """
|
""" Get available graphics video types """
|
||||||
|
|
||||||
def get_video_list(ctx):
|
def get_video_list(ctx):
|
||||||
result = []
|
result = []
|
||||||
for video_enum in ctx.xpath('/domainCapabilities/devices/video/enum'):
|
for video_enum in ctx.xpath('/domainCapabilities/devices/video/enum'):
|
||||||
|
@ -470,6 +475,9 @@ class wvmConnect(object):
|
||||||
def get_network(self, net):
|
def get_network(self, net):
|
||||||
return self.wvm.networkLookupByName(net)
|
return self.wvm.networkLookupByName(net)
|
||||||
|
|
||||||
|
def get_nwfilter(self, name):
|
||||||
|
return self.wvm.nwfilterLookupByName(name)
|
||||||
|
|
||||||
def get_instance(self, name):
|
def get_instance(self, name):
|
||||||
return self.wvm.lookupByName(name)
|
return self.wvm.lookupByName(name)
|
||||||
|
|
||||||
|
|
|
@ -187,6 +187,19 @@ class wvmInstance(wvmConnect):
|
||||||
title = util.get_xml_path(self._XMLDesc(0), "/domain/title")
|
title = util.get_xml_path(self._XMLDesc(0), "/domain/title")
|
||||||
return title if title else ''
|
return title if title else ''
|
||||||
|
|
||||||
|
def get_filterrefs(self):
|
||||||
|
|
||||||
|
def filterrefs(ctx):
|
||||||
|
result = []
|
||||||
|
for net in ctx.xpath('/domain/devices/interface'):
|
||||||
|
filterref = net.xpath('filterref/@filter')
|
||||||
|
if filterref:
|
||||||
|
result.append(filterref[0])
|
||||||
|
return result
|
||||||
|
|
||||||
|
return util.get_xml_path(self._XMLDesc(0), func=filterrefs)
|
||||||
|
|
||||||
|
|
||||||
def get_description(self):
|
def get_description(self):
|
||||||
description = util.get_xml_path(self._XMLDesc(0), "/domain/description")
|
description = util.get_xml_path(self._XMLDesc(0), "/domain/description")
|
||||||
return description if description else ''
|
return description if description else ''
|
||||||
|
@ -487,8 +500,7 @@ class wvmInstance(wvmConnect):
|
||||||
return self._defineXML(newxml)
|
return self._defineXML(newxml)
|
||||||
|
|
||||||
def get_console_socket(self):
|
def get_console_socket(self):
|
||||||
socket = util.get_xml_path(self._XMLDesc(0),
|
socket = util.get_xml_path(self._XMLDesc(0), "/domain/devices/graphics/@socket")
|
||||||
"/domain/devices/graphics/@socket")
|
|
||||||
return socket
|
return socket
|
||||||
|
|
||||||
def get_console_type(self):
|
def get_console_type(self):
|
||||||
|
|
125
vrtManager/nwfilters.py
Normal file
125
vrtManager/nwfilters.py
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
from vrtManager.connection import wvmConnect
|
||||||
|
from xml.etree import ElementTree
|
||||||
|
|
||||||
|
|
||||||
|
class wvmNWFilters(wvmConnect):
|
||||||
|
def get_nwfilter_info(self, name):
|
||||||
|
nwfilter = self.get_nwfilter(name)
|
||||||
|
xml = nwfilter.XMLDesc(0)
|
||||||
|
uuid = nwfilter.UUIDString()
|
||||||
|
return {'name': name, 'uuid': uuid, 'xml': xml}
|
||||||
|
|
||||||
|
def create_nwfilter(self, xml):
|
||||||
|
self.wvm.nwfilterDefineXML(xml)
|
||||||
|
|
||||||
|
def clone_nwfilter(self,name, cln_name):
|
||||||
|
nwfilter = self.get_nwfilter(name)
|
||||||
|
if nwfilter:
|
||||||
|
tree = ElementTree.fromstring(nwfilter.XMLDesc(0))
|
||||||
|
tree.set('name', cln_name)
|
||||||
|
uuid = tree.find('uuid')
|
||||||
|
tree.remove(uuid)
|
||||||
|
self.create_nwfilter(ElementTree.tostring(tree))
|
||||||
|
|
||||||
|
|
||||||
|
class wvmNWFilter(wvmConnect):
|
||||||
|
def __init__(self, host, login, passwd, conn, nwfiltername):
|
||||||
|
wvmConnect.__init__(self, host, login, passwd, conn)
|
||||||
|
self.nwfilter = self.get_nwfilter(nwfiltername)
|
||||||
|
|
||||||
|
def _XMLDesc(self, flags):
|
||||||
|
return self.nwfilter.XMLDesc(flags)
|
||||||
|
|
||||||
|
def get_uuid(self):
|
||||||
|
return self.nwfilter.UUIDString()
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
return self.nwfilter.name()
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
self.nwfilter.undefine()
|
||||||
|
|
||||||
|
def get_xml(self):
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
uuid = tree.find('uuid')
|
||||||
|
tree.remove(uuid)
|
||||||
|
return ElementTree.tostring(tree)
|
||||||
|
|
||||||
|
def get_filter_refs(self):
|
||||||
|
refs = []
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
for ref in tree.findall("./filterref"):
|
||||||
|
refs.append(ref.get('filter'))
|
||||||
|
return refs
|
||||||
|
|
||||||
|
def get_rules(self):
|
||||||
|
rules = []
|
||||||
|
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
for r in tree.findall("./rule"):
|
||||||
|
rule_action = r.get('action')
|
||||||
|
rule_direction = r.get('direction')
|
||||||
|
rule_priority = r.get('priority')
|
||||||
|
rule_statematch = r.get('statematch')
|
||||||
|
|
||||||
|
rule_directives = r.find("./")
|
||||||
|
if rule_directives is not None:
|
||||||
|
rule_directives = ElementTree.tostring(rule_directives)
|
||||||
|
|
||||||
|
rule_info = {
|
||||||
|
"action": rule_action,
|
||||||
|
"direction": rule_direction,
|
||||||
|
"priority": rule_priority,
|
||||||
|
"statematch": rule_statematch,
|
||||||
|
"directives": rule_directives
|
||||||
|
}
|
||||||
|
|
||||||
|
rules.append(rule_info)
|
||||||
|
|
||||||
|
return rules
|
||||||
|
|
||||||
|
def delete_ref(self, name):
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
for ref in tree.findall("./filterref"):
|
||||||
|
if name == ref.get('filter'):
|
||||||
|
tree.remove(ref)
|
||||||
|
break
|
||||||
|
return ElementTree.tostring(tree)
|
||||||
|
|
||||||
|
def delete_rule(self, action, direction, priority):
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
|
||||||
|
rule_tree = tree.findall("./rule[@action='%s'][@direction='%s'][@priority='%s']" % (action, direction, priority))
|
||||||
|
if rule_tree:
|
||||||
|
tree.remove(rule_tree[0])
|
||||||
|
|
||||||
|
return ElementTree.tostring(tree)
|
||||||
|
|
||||||
|
def add_ref(self, name):
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
element = ElementTree.Element("filterref")
|
||||||
|
element.attrib['filter'] = name
|
||||||
|
tree.append(element)
|
||||||
|
return ElementTree.tostring(tree)
|
||||||
|
|
||||||
|
def add_rule(self, xml):
|
||||||
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
|
rule = ElementTree.fromstring(xml)
|
||||||
|
|
||||||
|
rule_action = rule.get('action')
|
||||||
|
rule_direction = rule.get('direction')
|
||||||
|
rule_priority = rule.get('priority')
|
||||||
|
rule_directives = rule.find("./")
|
||||||
|
rule_tree = tree.findall("./rule[@action='%s'][@direction='%s'][@priority='%s']" % (rule_action, rule_direction, rule_priority))
|
||||||
|
|
||||||
|
if rule_tree:
|
||||||
|
rule_tree[0].append(rule_directives)
|
||||||
|
else:
|
||||||
|
element = ElementTree.Element("rule")
|
||||||
|
element.attrib['action'] = rule_action
|
||||||
|
element.attrib['direction'] = rule_direction
|
||||||
|
element.attrib['priority'] = rule_priority
|
||||||
|
element.append(rule_directives)
|
||||||
|
tree.append(element)
|
||||||
|
|
||||||
|
return ElementTree.tostring(tree)
|
|
@ -24,6 +24,7 @@ INSTALLED_APPS = (
|
||||||
'networks',
|
'networks',
|
||||||
'storages',
|
'storages',
|
||||||
'interfaces',
|
'interfaces',
|
||||||
|
'nwfilters',
|
||||||
'instances',
|
'instances',
|
||||||
'secrets',
|
'secrets',
|
||||||
'logs',
|
'logs',
|
||||||
|
|
|
@ -7,6 +7,7 @@ from secrets.views import secrets
|
||||||
from create.views import create_instance
|
from create.views import create_instance
|
||||||
from interfaces.views import interfaces, interface
|
from interfaces.views import interfaces, interface
|
||||||
from console.views import console
|
from console.views import console
|
||||||
|
from nwfilters.views import nwfilters, nwfilter
|
||||||
# from django.contrib import admin
|
# from django.contrib import admin
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
@ -25,9 +26,12 @@ urlpatterns = [
|
||||||
url(r'^compute/(?P<compute_id>[0-9]+)/network/(?P<pool>[\w\-\.]+)/$', network, name='network'),
|
url(r'^compute/(?P<compute_id>[0-9]+)/network/(?P<pool>[\w\-\.]+)/$', network, name='network'),
|
||||||
url(r'^compute/(?P<compute_id>[0-9]+)/interfaces/$', interfaces, name='interfaces'),
|
url(r'^compute/(?P<compute_id>[0-9]+)/interfaces/$', interfaces, name='interfaces'),
|
||||||
url(r'^compute/(?P<compute_id>[0-9]+)/interface/(?P<iface>[\w\-\.\:]+)/$', interface, name='interface'),
|
url(r'^compute/(?P<compute_id>[0-9]+)/interface/(?P<iface>[\w\-\.\:]+)/$', interface, name='interface'),
|
||||||
|
url(r'^compute/(?P<compute_id>[0-9]+)/nwfilters/$', nwfilters, name='nwfilters'),
|
||||||
|
url(r'^compute/(?P<compute_id>[0-9]+)/nwfilter/(?P<nwfltr>[\w\-\.\:]+)/$', nwfilter, name='nwfilter'),
|
||||||
url(r'^compute/(?P<compute_id>[0-9]+)/secrets/$', secrets, name='secrets'),
|
url(r'^compute/(?P<compute_id>[0-9]+)/secrets/$', secrets, name='secrets'),
|
||||||
url(r'^compute/(?P<compute_id>[0-9]+)/create/$', create_instance, name='create_instance'),
|
url(r'^compute/(?P<compute_id>[0-9]+)/create/$', create_instance, name='create_instance'),
|
||||||
|
|
||||||
|
|
||||||
url(r'^console/$', console, name='console'),
|
url(r'^console/$', console, name='console'),
|
||||||
# (r'^admin/', include(admin.site.urls)),
|
# (r'^admin/', include(admin.site.urls)),
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in a new issue