tum лет назад: 2
Родитель
Сommit
014d03eb90

BIN
app/Output/excel_out_test_excel_formatter_update.xlsx


+ 6 - 0
app/backend/templates/backend/print_table.html

@@ -0,0 +1,6 @@
1
+{% extends "base.html" %}
2
+{% load backend_tags %}
3
+{% block content %}
4
+  <h2>Print Table</h2>
5
+  
6
+{% endblock %}

+ 30 - 33
app/backend/templates/backend/reports2.html

@@ -6,46 +6,43 @@
6 6
   <a href="">Generate Report</a>
7 7
   <!-- 
8 8
     {{ sla | pprint }} -->
9
-  <div class='table-responsive'>
10
-    {% for v in sla.result %}
11
-    <h2>{{ v.ids.sla_name  }}</h2>
12
-    <table class='table table-bordered' style='min-width:1600px'>
13
-      <thead>
14
-    {% with services=sla_results|kv:v.ids.sla_name %}
15
-     <tr>
16
-      {% for si in services.result.service_instances %}
17
-      {% service_value service_results v.ids.sla_name si.service_name  as sv %}
18
-      <th colspan='{{ sv.test_templates.0.input_parameters|true_length }}' class='text-center'>{{ si.service_instance_name }}
19
-      </th>
20
-      {% endfor %}
21
-      </tr>
22
-      <tr>
23
-      {% for si in services.result.service_instances %}
24
-        {% service_value service_results v.ids.sla_name si.service_name  as sv %}
25
-        {% with ts=sv.test_templates.0.input_parameters|true_value %}
26
-          {% for tv in ts %}
27
-          <th style='vertical-align:top'>{{ tv.0 }}/<br>{{ tv.1 }}</th>
9
+      {% for v in sla.result %}
10
+      <div class='text-center'>
11
+        <h2>{{ v.ids.sla_name  }}</h2><br>
12
+        <div class='d-flex  text-center'>
13
+          {% with services=sla_results|kv:v.ids.sla_name %}
14
+          {% for si in services.result.service_instances %}
15
+          <div class='text-center border p-3'>
16
+            {{ si.service_instance_name }}<br>
17
+            {% service_value service_results v.ids.sla_name si.service_name  as sv %}
18
+            <div class='d-flex'>
19
+              <div class='p-3'>
20
+                <div class='d-flex'>
21
+                  {% for tt in sv.test_templates %}
22
+                  <div class='d-flex'>
23
+                    {% for tt2 in tt.test_metric_templates %}
24
+                      <div class='text-center border p-3'>{{ tt2.name }}</div>
25
+                    {% endfor %}
26
+                  </div>
27
+                  {% endfor %} 
28
+                </div>
29
+              </div>
30
+            </div>
31
+          </div>
28 32
           {% endfor %}
29
-        {% endwith %}
33
+          {% endwith %}
34
+        </div>
35
+      </div>
30 36
       {% endfor %}
31
-      </tr>
32
-    <tr>
33
-    </tr>
34
-    {% endwith %}
35
-      </thead>
36
-    </table>
37
-    {% endfor %}
38
-    
39
-  </div>
40 37
 
41 38
  {% comment %}<pre>{% endcomment %}
42 39
  {% comment %}SLA Result{% endcomment %}
43 40
     {% comment %}{{ sla_results | pprint }}{% endcomment %}
44 41
  {% comment %}</pre>{% endcomment %}
45
- {% comment %}<pre>{% endcomment %}
46
-{% comment %}Test Status{% endcomment %}
47
-  {% comment %}{{ test_status | pprint }}{% endcomment %}
48
- {% comment %}</pre>{% endcomment %}
42
+ <pre>
43
+Test Status
44
+  {{ test_status | pprint }}
45
+ </pre>
49 46
  <pre>
50 47
 Service Results
51 48
   {{ service_results | pprint }}

+ 2 - 0
app/backend/templatetags/backend_tags.py

@@ -26,6 +26,8 @@ def kv(obj, value):
26 26
 
27 27
 @register.simple_tag
28 28
 def test_value(obj, sla, service_name):
29
+    pprint("-- test-value --")
30
+    pprint(f"{sla} , {service_name}")
29 31
     try:
30 32
         for r in obj[sla]['result']:
31 33
             if r['service_instance_name'] == service_name:

+ 2 - 0
app/backend/urls.py

@@ -9,4 +9,6 @@ urlpatterns = [
9 9
     path('remote/', views.remote, name='remote'),
10 10
     path('reports/', views.reports, name='reports'),
11 11
     path('service_status/', views.service_status, name='service_status'),
12
+    path('dump_api/', views.dump_api, name='dump_api'),
13
+    path('print_table/', views.print_table, name='print_table'),
12 14
 ]

+ 96 - 2
app/backend/views.py

@@ -4,8 +4,9 @@ from exfo.lib import Exfo, Mikrotik
4 4
 from pprint import pprint
5 5
 
6 6
 from ttp import ttp
7
-from django.http import JsonResponse
8
-
7
+from django.http import JsonResponse, HttpResponse
8
+from datetime import datetime
9
+from celery import shared_task
9 10
 
10 11
 exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
11 12
 exfo.login()
@@ -154,4 +155,97 @@ def reports(request):
154 155
         except:
155 156
             test_status[r['ids']['sla_name']] = {}
156 157
     return render(request, 'backend/reports2.html', {'days': days, 'sla': sla.json(), 'sla_results': sla_results, 'test_status': test_status, 'service_results': service_results })
158
+
159
+def dump_api(request):
160
+    from bson.json_util import dumps
161
+    from bson.json_util import loads
162
+    col  = db['exfo_api']
163
+    # col.delete_many({})
164
+    sla = exfo.call_api("sla")
165
+    sla_json = sla.json()
166
+    temp = sla_json['result']
167
+    for t in temp:
168
+        sla_uri = t['ids']['sla_uri']
169
+        sla_name = t['ids']['sla_name']
170
+        r = exfo.call_remote_api(sla_uri).json()
171
+        t['sla_uri_result'] = r['result']
172
+        service_result = []
173
+        for si in r['result']['service_instances']:
174
+            c = exfo.call_remote_api(si['service_uri']).json()['result']
175
+            service_result.append(c)
176
+
177
+        test_instance_class_result = []
178
+        test_status_result = []
179
+
180
+        for si in r['result']['tests']:
181
+            c = exfo.call_remote_api(si['test_instance_class_uri']).json()['result']
182
+            service = c['service']
183
+            target = None
184
+            if 'target' in c:
185
+                target = c['target']
186
+            test_instance_class_result.append(c)
187
+            c = exfo.call_remote_api(si['test_status_uri']).json()['result']
188
+            test_status_result.append({'sla_name':sla_name, 'test_instance_id': si['test_instance_id'],\
189
+                                    'service': service, 'target': target, \
190
+                                    'type_type_name':  si['test_type_name'],\
191
+                                    'test_instance_class_id': si['test_instance_class_id']  , 'status': c, })
192
+
193
+        t['test_instance_class_result'] = test_instance_class_result
194
+        t['test_status_result'] = test_status_result
195
+        t['created'] = datetime.utcnow()
196
+        col.insert_one(t)
197
+
198
+    # pprint(temp)
199
+    #col.insert_many(temp)
200
+    results = col.find({})
201
+    data = dumps(list(results), indent=4)
202
+    return HttpResponse(data, content_type='application/json')
203
+
204
+
205
+@shared_task
206
+def dump_api_task():
207
+    from bson.json_util import dumps
208
+    from bson.json_util import loads
209
+    col  = db['exfo_api']
210
+    # col.delete_many({})
211
+    sla = exfo.call_api("sla")
212
+    sla_json = sla.json()
213
+    temp = sla_json['result']
214
+    for t in temp:
215
+        sla_uri = t['ids']['sla_uri']
216
+        sla_name = t['ids']['sla_name']
217
+        r = exfo.call_remote_api(sla_uri).json()
218
+        t['sla_uri_result'] = r['result']
219
+        service_result = []
220
+        for si in r['result']['service_instances']:
221
+            c = exfo.call_remote_api(si['service_uri']).json()['result']
222
+            service_result.append(c)
223
+
224
+        test_instance_class_result = []
225
+        test_status_result = []
226
+
227
+        for si in r['result']['tests']:
228
+            c = exfo.call_remote_api(si['test_instance_class_uri']).json()['result']
229
+            service = c['service']
230
+            target = None
231
+            if 'target' in c:
232
+                target = c['target']
233
+            test_instance_class_result.append(c)
234
+            c = exfo.call_remote_api(si['test_status_uri']).json()['result']
235
+            test_status_result.append({'sla_name':sla_name, 'test_instance_id': si['test_instance_id'],\
236
+                                    'service': service, 'target': target, \
237
+                                    'type_type_name':  si['test_type_name'],\
238
+                                    'test_instance_class_id': si['test_instance_class_id']  , 'status': c, })
239
+
240
+        t['test_instance_class_result'] = test_instance_class_result
241
+        t['test_status_result'] = test_status_result
242
+        t['created'] = datetime.utcnow()
243
+        col.insert_one(t)
244
+
245
+    pprint("Dump API ... Finished")
246
+
247
+def print_table(request):
248
+    return render(request, 'backend/print_table.html')
249
+
250
+
157 251
     

+ 3 - 1
app/exfo/lib.py

@@ -1,6 +1,8 @@
1 1
 import requests
2 2
 from pprint import pprint
3 3
 
4
+import functools
5
+
4 6
 class Exfo:
5 7
     BASE_URL = "https://159.192.8.11/API/REST"
6 8
     BASE_IP = "https://159.192.8.11"
@@ -46,7 +48,7 @@ class Exfo:
46 48
         response = self.session.get(url, headers=headers, data=payload, verify=False)
47 49
         pprint(response.json())
48 50
         return response
49
-
51
+    
50 52
     def call_remote_api(self, ep, payload={}):
51 53
         
52 54
         headers = {

+ 7 - 0
app/network_report/celery.py

@@ -0,0 +1,7 @@
1
+import os
2
+from celery import Celery
3
+
4
+os.environ.setdefault('DJANGO_SETTINGS_MODULES', 'network_report.settings')
5
+app = Celery('network_report', broker='pyamqp://guest:guest@rabbitmq3//')
6
+app.config_from_object('django.conf:settings', namespace='CELERY')
7
+app.autodiscover_tasks()

+ 12 - 1
app/network_report/settings.py

@@ -24,7 +24,7 @@ env = environ.Env()
24 24
 environ.Env.read_env()
25 25
 # Build paths inside the project like this: BASE_DIR / 'subdir'.
26 26
 BASE_DIR = Path(__file__).resolve().parent.parent
27
-
27
+from celery.schedules import crontab
28 28
 
29 29
 # Quick-start development settings - unsuitable for production
30 30
 # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
@@ -192,3 +192,14 @@ YARN_INSTALLED_APPS = (
192 192
     'tailwind-color-palette', 
193 193
     'paper-css'
194 194
 )
195
+
196
+
197
+CELERY_BEAT_SCHEDULE = {
198
+    # "dumpapi": {
199
+        # "task": "backend.views.dump_api_task",
200
+        #"schedule": crontab(minute="*/1"),
201
+        # "schedule": crontab(minute="*/30"),
202
+        # "schedule": crontab(hour="17", minute="15"),
203
+        # "schedule": crontab(hour="*/1"),
204
+    # },
205
+}

+ 1 - 1
app/worker-entrypoint.sh

@@ -1,3 +1,3 @@
1 1
 #!/bin/bash
2
-celery -A kacee worker -B  -l info
2
+celery -A network_report worker -B  -l info
3 3
 #celery -A kacee beat --detach -l info

+ 29 - 29
docker-compose.yml

@@ -5,7 +5,7 @@ services:
5 5
     ports:
6 6
       - "6379"
7 7
   db:
8
-    image: postgres
8
+    image: postgres:15.5-alpine3.19
9 9
     volumes:
10 10
       - ./data/db:/var/lib/postgresql/data
11 11
     ports:
@@ -17,7 +17,7 @@ services:
17 17
   mongodb:
18 18
     image: mongo:6-jammy
19 19
     ports:
20
-      - '27017'
20
+      - '27017:27017'
21 21
     volumes:
22 22
       - ./mongodb:/data/db
23 23
   web:
@@ -43,24 +43,24 @@ services:
43 43
       - db
44 44
       - redis
45 45
       #- rabbitmq
46
-  #worker:
47
-    #restart: unless-stopped
48
-    ##build: .
49
-    #image: tum/network-report-image
50
-    ##command: python -X dev manage.py  runserver 0.0.0.0:8000
51
-    #entrypoint: ./worker-entrypoint.sh
52
-    #volumes:
53
-      #- ./app:/code
54
-      #- ./media:/code/media
55
-    #environment:
56
-      #- POSTGRES_NAME=postgres
57
-      #- POSTGRES_USER=postgres
58
-      #- POSTGRES_PASSWORD=postgres
59
-      #- PYTHONMALLOC=debug
60
-      #- DJANGO_SETTINGS_MODULE=kacee.settings
61
-      #- MODE=${MODE}
62
-    #depends_on:
63
-      #- web
46
+  worker:
47
+    restart: unless-stopped
48
+    #build: .
49
+    image: tum/network-report-image
50
+    #command: python -X dev manage.py  runserver 0.0.0.0:8000
51
+    entrypoint: ./worker-entrypoint.sh
52
+    volumes:
53
+      - ./app:/code
54
+      - ./media:/code/media
55
+    environment:
56
+      - POSTGRES_NAME=postgres
57
+      - POSTGRES_USER=postgres
58
+      - POSTGRES_PASSWORD=postgres
59
+      - PYTHONMALLOC=debug
60
+      - DJANGO_SETTINGS_MODULE=network_report.settings
61
+      - MODE=${MODE}
62
+    depends_on:
63
+      - web
64 64
   #websocket:
65 65
     ##build: .
66 66
     #image: tum/network-report-image
@@ -79,14 +79,14 @@ services:
79 79
     #depends_on:
80 80
       #- db
81 81
       #- redis
82
-  #rabbitmq:
83
-    #image: rabbitmq:3-management-alpine
84
-    #container_name: 'rabbitmq'
85
-    #ports:
86
-      #- "127.0.0.1:5672:5672"
87
-      #- "127.0.0.1:15672:15672"
88
-    #volumes:
89
-        #- ./rabbitmq/data/:/var/lib/rabbitmq/
90
-        #- ./rabbitmq/log/:/var/log/rabbitmq
82
+  rabbitmq:
83
+    image: rabbitmq:3-management-alpine
84
+    container_name: 'rabbitmq3'
85
+    ports:
86
+      - "5672:5672"
87
+      - "15672:15672"
88
+    volumes:
89
+        - ./rabbitmq/data/:/var/lib/rabbitmq/
90
+        - ./rabbitmq/log/:/var/log/rabbitmq
91 91
     #networks:
92 92
         #- rabbitmq_go_net

Разница между файлами не показана из-за своего большого размера
+ 5659 - 0
network.ipynb


BIN
ping_test.xlsx


+ 1 - 1
requirements.txt

@@ -38,7 +38,7 @@ django-formset
38 38
 django-multiselectfield
39 39
 django_ace
40 40
 django-autoslug
41
-celery==5.2.7
41
+celery
42 42
 django-phonenumber-field[phonenumbers]
43 43
 django-credit-cards
44 44
 django-payments[stripe]


BIN
table1703516489.xlsx





BIN
~$table1703516489.xlsx