Selaa lähdekoodia

network report

tum 2 vuotta sitten
vanhempi
commit
014d03eb90

BIN
app/Output/excel_out_test_excel_formatter_update.xlsx


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

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
   <a href="">Generate Report</a>
6
   <a href="">Generate Report</a>
7
   <!-- 
7
   <!-- 
8
     {{ sla | pprint }} -->
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
           {% endfor %}
32
           {% endfor %}
29
-        {% endwith %}
33
+          {% endwith %}
34
+        </div>
35
+      </div>
30
       {% endfor %}
36
       {% endfor %}
31
-      </tr>
32
-    <tr>
33
-    </tr>
34
-    {% endwith %}
35
-      </thead>
36
-    </table>
37
-    {% endfor %}
38
-    
39
-  </div>
40
 
37
 
41
  {% comment %}<pre>{% endcomment %}
38
  {% comment %}<pre>{% endcomment %}
42
  {% comment %}SLA Result{% endcomment %}
39
  {% comment %}SLA Result{% endcomment %}
43
     {% comment %}{{ sla_results | pprint }}{% endcomment %}
40
     {% comment %}{{ sla_results | pprint }}{% endcomment %}
44
  {% comment %}</pre>{% endcomment %}
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
  <pre>
46
  <pre>
50
 Service Results
47
 Service Results
51
   {{ service_results | pprint }}
48
   {{ service_results | pprint }}

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

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

+ 2 - 0
app/backend/urls.py

9
     path('remote/', views.remote, name='remote'),
9
     path('remote/', views.remote, name='remote'),
10
     path('reports/', views.reports, name='reports'),
10
     path('reports/', views.reports, name='reports'),
11
     path('service_status/', views.service_status, name='service_status'),
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
 from pprint import pprint
4
 from pprint import pprint
5
 
5
 
6
 from ttp import ttp
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
 exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
11
 exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
11
 exfo.login()
12
 exfo.login()
154
         except:
155
         except:
155
             test_status[r['ids']['sla_name']] = {}
156
             test_status[r['ids']['sla_name']] = {}
156
     return render(request, 'backend/reports2.html', {'days': days, 'sla': sla.json(), 'sla_results': sla_results, 'test_status': test_status, 'service_results': service_results })
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
 import requests
1
 import requests
2
 from pprint import pprint
2
 from pprint import pprint
3
 
3
 
4
+import functools
5
+
4
 class Exfo:
6
 class Exfo:
5
     BASE_URL = "https://159.192.8.11/API/REST"
7
     BASE_URL = "https://159.192.8.11/API/REST"
6
     BASE_IP = "https://159.192.8.11"
8
     BASE_IP = "https://159.192.8.11"
46
         response = self.session.get(url, headers=headers, data=payload, verify=False)
48
         response = self.session.get(url, headers=headers, data=payload, verify=False)
47
         pprint(response.json())
49
         pprint(response.json())
48
         return response
50
         return response
49
-
51
+    
50
     def call_remote_api(self, ep, payload={}):
52
     def call_remote_api(self, ep, payload={}):
51
         
53
         
52
         headers = {
54
         headers = {

+ 7 - 0
app/network_report/celery.py

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
 environ.Env.read_env()
24
 environ.Env.read_env()
25
 # Build paths inside the project like this: BASE_DIR / 'subdir'.
25
 # Build paths inside the project like this: BASE_DIR / 'subdir'.
26
 BASE_DIR = Path(__file__).resolve().parent.parent
26
 BASE_DIR = Path(__file__).resolve().parent.parent
27
-
27
+from celery.schedules import crontab
28
 
28
 
29
 # Quick-start development settings - unsuitable for production
29
 # Quick-start development settings - unsuitable for production
30
 # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
30
 # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
192
     'tailwind-color-palette', 
192
     'tailwind-color-palette', 
193
     'paper-css'
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
 #!/bin/bash
1
 #!/bin/bash
2
-celery -A kacee worker -B  -l info
2
+celery -A network_report worker -B  -l info
3
 #celery -A kacee beat --detach -l info
3
 #celery -A kacee beat --detach -l info

+ 29 - 29
docker-compose.yml

5
     ports:
5
     ports:
6
       - "6379"
6
       - "6379"
7
   db:
7
   db:
8
-    image: postgres
8
+    image: postgres:15.5-alpine3.19
9
     volumes:
9
     volumes:
10
       - ./data/db:/var/lib/postgresql/data
10
       - ./data/db:/var/lib/postgresql/data
11
     ports:
11
     ports:
17
   mongodb:
17
   mongodb:
18
     image: mongo:6-jammy
18
     image: mongo:6-jammy
19
     ports:
19
     ports:
20
-      - '27017'
20
+      - '27017:27017'
21
     volumes:
21
     volumes:
22
       - ./mongodb:/data/db
22
       - ./mongodb:/data/db
23
   web:
23
   web:
43
       - db
43
       - db
44
       - redis
44
       - redis
45
       #- rabbitmq
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
   #websocket:
64
   #websocket:
65
     ##build: .
65
     ##build: .
66
     #image: tum/network-report-image
66
     #image: tum/network-report-image
79
     #depends_on:
79
     #depends_on:
80
       #- db
80
       #- db
81
       #- redis
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
     #networks:
91
     #networks:
92
         #- rabbitmq_go_net
92
         #- rabbitmq_go_net

File diff suppressed because it is too large
+ 5659 - 0
network.ipynb


BIN
ping_test.xlsx


+ 1 - 1
requirements.txt

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

BIN
table.xlsx


BIN
table1703516489.xlsx


BIN
table2.xlsx


BIN
table3.xlsx


BIN
test.xlsx


BIN
~$table1703516489.xlsx


BIN
~$table3.xlsx