diff --git a/backend/backend/__init__.py b/backend/backend/__init__.py index fb989c4e6..e69de29bb 100644 --- a/backend/backend/__init__.py +++ b/backend/backend/__init__.py @@ -1,3 +0,0 @@ -from .celery import app as celery_app - -__all__ = ('celery_app',) diff --git a/backend/backend/celery.py b/backend/backend/celery.py deleted file mode 100644 index 674699ae9..000000000 --- a/backend/backend/celery.py +++ /dev/null @@ -1,22 +0,0 @@ -import os - -from celery import Celery - -# set the default Django settings module for the 'celery' program. -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings.base') - -app = Celery('backend') - -# Using a string here means the worker doesn't have to serialize -# the configuration object to child processes. -# - namespace='CELERY' means all celery-related configuration keys -# should have a `CELERY_` prefix. -app.config_from_object('django.conf:settings', namespace='CELERY') - -# Load task modules from all registered Django app configs. -app.autodiscover_tasks() - - -@app.task(bind=True) -def debug_task(self): # TODO: to delete. - print('Request: {0!r}'.format(self.request)) diff --git a/backend/backend/settings/base.py b/backend/backend/settings/base.py index b9d15ae49..e53624e2f 100644 --- a/backend/backend/settings/base.py +++ b/backend/backend/settings/base.py @@ -15,7 +15,6 @@ import re from netaddr import IPNetwork, AddrFormatError -from celery.schedules import crontab def check_ip_range(ipr): @@ -68,7 +67,6 @@ def check_ip_range(ipr): 'tagulous', 'device_registry.apps.DeviceRegistryConfig', 'profile_page.apps.ProfilePageConfig', - 'monitoring.apps.MonitoringConfig', 'bootstrap4' ] @@ -220,16 +218,3 @@ def check_ip_range(ipr): # Retry to connect to DB (after receiving a connection error) within 60 seconds. DB_RETRY_TO_CONNECT_SEC = 60 - -# Celery settings. -CELERY_BROKER_URL = 'amqp://%s:%s@%s:5672/%s' % (os.getenv('RABBIT_USER', 'user'), - os.getenv('RABBIT_PASSWORD', 'SuperSecurePassword'), - os.getenv('RABBIT_HOST', 'localhost'), - os.getenv('RABBIT_VHOST', 'wott-dash')) - -CELERY_BEAT_SCHEDULE = { - 'update_celery_pulse_timestamp': { - 'task': 'monitoring.tasks.update_celery_pulse_timestamp', - 'schedule': crontab() # Execute once a minute. - } -} diff --git a/backend/backend/urls.py b/backend/backend/urls.py index 2ee06792a..46710d684 100644 --- a/backend/backend/urls.py +++ b/backend/backend/urls.py @@ -26,6 +26,5 @@ url(r'^accounts/', include('registration.backends.simple.urls')), path('user/', include('profile_page.urls')), path('', include('device_registry.urls')), - path('monitoring/', include('monitoring.urls')), url('', include('django_prometheus.urls')) ] diff --git a/backend/backend/wsgi.py b/backend/backend/wsgi.py index 60ea5bd16..442444528 100644 --- a/backend/backend/wsgi.py +++ b/backend/backend/wsgi.py @@ -14,7 +14,7 @@ from .utils import ensure_connection_with_retries -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings.base') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') # Patch the standard django database connection class' method in order to try to # connect to DB multiple times using exponential backoff algorithm until success diff --git a/backend/device_registry/tasks.py b/backend/device_registry/tasks.py deleted file mode 100644 index 39dca42e0..000000000 --- a/backend/device_registry/tasks.py +++ /dev/null @@ -1,7 +0,0 @@ -# Create your tasks here -from celery import shared_task - - -# @shared_task -# def add(x, y): -# return x + y diff --git a/backend/device_registry/views.py b/backend/device_registry/views.py index 235d249b6..223d5c57d 100644 --- a/backend/device_registry/views.py +++ b/backend/device_registry/views.py @@ -13,6 +13,8 @@ from django.db.models import Q from django.utils import timezone +from tagulous.forms import TagWidget + from device_registry.forms import ClaimDeviceForm, DeviceAttrsForm, PortsForm, ConnectionsForm, DeviceMetadataForm from device_registry.models import Action, Device, average_trust_score, PortScan, FirewallState from device_registry.models import PairingKey, get_bootstrap_color @@ -112,7 +114,7 @@ def get_queryset(self): number = 0 number = int(number) if filter_predicate == 'eq': - interval_start = timezone.now() - datetime.timedelta(**{measure: number + 1}) + interval_start = timezone.now() - datetime.timedelta(**{measure: number+1}) interval_end = timezone.now() - datetime.timedelta(**{measure: number}) filter_value = (interval_start, interval_end) predicate = 'range' @@ -154,8 +156,7 @@ def get_context_data(self, **kwargs): 'Trust Score', 'Comment' ], - 'filter_params': [(field_name, field_desc[1], field_desc[2]) for field_name, field_desc in - self.FILTER_FIELDS.items()], + 'filter_params': [(field_name, field_desc[1], field_desc[2]) for field_name, field_desc in self.FILTER_FIELDS.items()], # TODO: convert this into a list of dicts for multiple filters 'filter': self.request.filter_dict @@ -183,8 +184,8 @@ def claim_device_view(request): get_device.owner = request.user get_device.claim_token = "" get_device.save(update_fields=['owner', 'claim_token']) - text, style = f'You\'ve successfully claimed {get_device.get_name()}. ' \ - f'Learn more about the security state of the device by clicking ' \ + text, style = f'You\'ve successfully claimed {get_device.get_name()}. '\ + f'Learn more about the security state of the device by clicking '\ f'' \ f'here.', \ 'success' @@ -194,7 +195,7 @@ def claim_device_view(request): # GET with claim_token and device_id set will fill the form. # Empty GET or any other request will generate empty form. if request.method == 'GET' and \ - 'claim_token' in request.GET and \ + 'claim_token' in request.GET and \ 'device_id' in request.GET: try: Device.objects.get( @@ -465,7 +466,7 @@ def actions_view(request, device_pk=None): if insecure_password_devices.exists(): text_blocks = [] for dev in insecure_password_devices: - device_text_block = f'{dev.get_name()}' + device_text_block = f'{ dev.get_name() }' text_blocks.append(device_text_block) full_string = ', '.join(text_blocks) action = Action( @@ -483,7 +484,7 @@ def actions_view(request, device_pk=None): if disabled_firewall_devices.exists(): text_blocks = [] for dev in disabled_firewall_devices: - device_text_block = f'{dev.get_name()}' + device_text_block = f'{ dev.get_name() }' text_blocks.append(device_text_block) full_string = ', '.join(text_blocks) action = Action( diff --git a/backend/monitoring/__init__.py b/backend/monitoring/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/monitoring/admin.py b/backend/monitoring/admin.py deleted file mode 100644 index 8c38f3f3d..000000000 --- a/backend/monitoring/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/backend/monitoring/apps.py b/backend/monitoring/apps.py deleted file mode 100644 index f27ffed8c..000000000 --- a/backend/monitoring/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class MonitoringConfig(AppConfig): - name = 'monitoring' diff --git a/backend/monitoring/migrations/0001_initial.py b/backend/monitoring/migrations/0001_initial.py deleted file mode 100644 index 0da7e4dce..000000000 --- a/backend/monitoring/migrations/0001_initial.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.1.10 on 2019-08-28 12:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='CeleryPulseTimestamp', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(auto_now=True)), - ], - ), - ] diff --git a/backend/monitoring/migrations/__init__.py b/backend/monitoring/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/monitoring/models.py b/backend/monitoring/models.py deleted file mode 100644 index 3f58f975b..000000000 --- a/backend/monitoring/models.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.db import models - - -class CeleryPulseTimestamp(models.Model): - timestamp = models.DateTimeField(auto_now=True) diff --git a/backend/monitoring/tasks.py b/backend/monitoring/tasks.py deleted file mode 100644 index 0f43a64ec..000000000 --- a/backend/monitoring/tasks.py +++ /dev/null @@ -1,12 +0,0 @@ -from celery import shared_task - -from .models import CeleryPulseTimestamp - - -@shared_task -def update_celery_pulse_timestamp(): - pulse_obj = CeleryPulseTimestamp.objects.order_by('id').first() - if pulse_obj is None: - CeleryPulseTimestamp.objects.create() - else: - pulse_obj.save() diff --git a/backend/monitoring/urls.py b/backend/monitoring/urls.py deleted file mode 100644 index 81e6a90a8..000000000 --- a/backend/monitoring/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.urls import path - -from .views import CeleryPulseTimestampView - -urlpatterns = [ - path('celery/', CeleryPulseTimestampView.as_view(), name='celery_pulse') -] diff --git a/backend/monitoring/views.py b/backend/monitoring/views.py deleted file mode 100644 index fc58b340d..000000000 --- a/backend/monitoring/views.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.http import HttpResponse -from django.views.generic import View -from django.contrib.auth.mixins import AccessMixin, LoginRequiredMixin - -from .models import CeleryPulseTimestamp - - -class StaffuserRequiredMixin(AccessMixin): - """Verify that the current user has `is_staff` set to True.""" - - def dispatch(self, request, *args, **kwargs): - if not request.user.is_staff: - return self.handle_no_permission() - return super().dispatch(request, *args, **kwargs) - - -class CeleryPulseTimestampView(LoginRequiredMixin, StaffuserRequiredMixin, View): - - def get(self, request, *args, **kwargs): - pulse_obj = CeleryPulseTimestamp.objects.order_by('id').first() - return HttpResponse(str(pulse_obj.timestamp) if pulse_obj else 'None', content_type='text/plain') diff --git a/docker-compose.yml b/docker-compose.yml index 7f6b91723..542013ec4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,23 +3,24 @@ services: migrate: command: python manage.py migrate --noinput environment: - - DJANGO_SETTINGS_MODULE=backend.settings.dev - - DB_PASSWORD=SuperSecurePassword - - DB_USER=postgres + - DJANGO_SETTINGS_MODULE=backend.settings.dev + - DB_PASSWORD=SuperSecurePassword + - DB_USER=postgres build: context: . volumes: - ./backend:/usr/src/app depends_on: - - psql + - psql + - nginx-static dash-dev: hostname: dash-dev0 environment: - - DJANGO_SETTINGS_MODULE=backend.settings.dev - - DB_PASSWORD=SuperSecurePassword - - DB_USER=postgres - - DATASTORE_KEY_JSON + - DJANGO_SETTINGS_MODULE=backend.settings.dev + - DB_PASSWORD=SuperSecurePassword + - DB_USER=postgres + - DATASTORE_KEY_JSON build: context: . volumes: @@ -27,17 +28,17 @@ services: ports: - '8000:8000' depends_on: - - psql - - migrate - - nginx-static + - psql + - migrate + - nginx-static api-dev: hostname: api-dev0 environment: - - DJANGO_SETTINGS_MODULE=backend.settings.dev - - DB_PASSWORD=SuperSecurePassword - - DB_USER=postgres - - DATASTORE_KEY_JSON + - DJANGO_SETTINGS_MODULE=backend.settings.dev + - DB_PASSWORD=SuperSecurePassword + - DB_USER=postgres + - DATASTORE_KEY_JSON image: api:latest build: context: . @@ -46,16 +47,16 @@ services: ports: - '8001:8000' depends_on: - - psql - - migrate + - psql + - migrate mtls-api-dev: hostname: mtls-api-dev0 environment: - - DJANGO_SETTINGS_MODULE=backend.settings.dev - - DB_PASSWORD=SuperSecurePassword - - DB_USER=postgres - - DATASTORE_KEY_JSON + - DJANGO_SETTINGS_MODULE=backend.settings.dev + - DB_PASSWORD=SuperSecurePassword + - DB_USER=postgres + - DATASTORE_KEY_JSON build: context: . volumes: @@ -63,8 +64,8 @@ services: ports: - '8002:8000' depends_on: - - psql - - migrate + - psql + - migrate nginx-static: hostname: wott-static @@ -79,58 +80,11 @@ services: psql: environment: - - POSTGRES_DB=wott-backend - - POSTGRES_PASSWORD=SuperSecurePassword + - POSTGRES_DB=wott-backend + - POSTGRES_PASSWORD=SuperSecurePassword image: postgres:alpine volumes: - - db-data:/var/lib/postgresql/data - - rabbit: - image: rabbitmq:3-alpine - environment: - - RABBITMQ_DEFAULT_USER=user - - RABBITMQ_DEFAULT_PASS=SuperSecurePassword - - RABBITMQ_DEFAULT_VHOST=wott-dash - ports: - - '5672:5672' - - celery: - environment: - - DJANGO_SETTINGS_MODULE=backend.settings.dev - - DB_PASSWORD=SuperSecurePassword - - DB_USER=postgres - - RABBIT_HOST=rabbit - - RABBIT_USER=user - - RABBIT_PASSWORD=SuperSecurePassword - - RABBIT_VHOST=wott-dash - build: - context: . - command: celery -A backend worker -l error --time-limit=90 --soft-time-limit=60 - volumes: - - ./backend:/usr/src/app - depends_on: - - psql - - migrate - - rabbit - - celery-beat: - environment: - - DJANGO_SETTINGS_MODULE=backend.settings.dev - - DB_PASSWORD=SuperSecurePassword - - DB_USER=postgres - - RABBIT_HOST=rabbit - - RABBIT_USER=user - - RABBIT_PASSWORD=SuperSecurePassword - - RABBIT_VHOST=wott-dash - build: - context: . - command: celery -A backend beat -l error - volumes: - - ./backend:/usr/src/app - depends_on: - - psql - - migrate - - rabbit + - db-data:/var/lib/postgresql/data volumes: db-data: diff --git a/helm/api/templates/deployment-celery-beat.yaml b/helm/api/templates/deployment-celery-beat.yaml deleted file mode 100644 index 3deeec553..000000000 --- a/helm/api/templates/deployment-celery-beat.yaml +++ /dev/null @@ -1,74 +0,0 @@ -apiVersion: apps/v1beta2 -kind: Deployment -metadata: - name: {{ .Values.service.celery-beat.name }} - namespace: {{ .Values.namespace }} - labels: - app: {{ .Values.service.celery-beat.name }} - chart: {{ include "api.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - replicas: 1 - selector: - matchLabels: - app: {{ .Values.service.celery-beat.name }} - release: {{ .Release.Name }} - template: - metadata: - labels: - app: {{ .Values.service.celery-beat.name }} - release: {{ .Release.Name }} - spec: - containers: - - name: {{ .Values.service.celery-beat.name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: "celery -A backend beat -l error" - env: - - name: RELEASE_TRIGGER - value: "{{ .Values.releaseTimeStamp }}" - - name: DEBUG - value: "{{ .Values.service.api.debug }}" - - name: SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: djangoSecretKey - - name: DB_HOST - value: "{{ .Values.databaseHost }}" - - name: DB_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: databasePassword - - name: SENTRY_DSN - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: sentryDsn - - name: RABBIT_HOST - value: {{ .Values.rabbitHost }} - - name: RABBIT_USER - value: {{ .Values.rabbitUser }} - - name: RABBIT_VHOST - value: {{ .Values.rabbitVhost }} - - name: RABBIT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: rabbitPassword - resources: -{{ toYaml .Values.resources.api | indent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} diff --git a/helm/api/templates/deployment-celery.yaml b/helm/api/templates/deployment-celery.yaml deleted file mode 100644 index 623a2cb83..000000000 --- a/helm/api/templates/deployment-celery.yaml +++ /dev/null @@ -1,74 +0,0 @@ -apiVersion: apps/v1beta2 -kind: Deployment -metadata: - name: {{ .Values.service.celery.name }} - namespace: {{ .Values.namespace }} - labels: - app: {{ .Values.service.celery.name }} - chart: {{ include "api.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - replicas: 1 - selector: - matchLabels: - app: {{ .Values.service.celery.name }} - release: {{ .Release.Name }} - template: - metadata: - labels: - app: {{ .Values.service.celery.name }} - release: {{ .Release.Name }} - spec: - containers: - - name: {{ .Values.service.celery.name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: "celery -A backend worker -l error --time-limit=90 --soft-time-limit=60" - env: - - name: RELEASE_TRIGGER - value: "{{ .Values.releaseTimeStamp }}" - - name: DEBUG - value: "{{ .Values.service.api.debug }}" - - name: SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: djangoSecretKey - - name: DB_HOST - value: "{{ .Values.databaseHost }}" - - name: DB_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: databasePassword - - name: SENTRY_DSN - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: sentryDsn - - name: RABBIT_HOST - value: {{ .Values.rabbitHost }} - - name: RABBIT_USER - value: {{ .Values.rabbitUser }} - - name: RABBIT_VHOST - value: {{ .Values.rabbitVhost }} - - name: RABBIT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.apiSecrets }} - key: rabbitPassword - resources: -{{ toYaml .Values.resources.api | indent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} diff --git a/helm/api/values.yaml b/helm/api/values.yaml index b0e6eaa70..1e1f1b67a 100644 --- a/helm/api/values.yaml +++ b/helm/api/values.yaml @@ -30,12 +30,6 @@ service: externalPort: 80 internalPort: 8000 debug: 0 - celery: - name: "celery" - debug: 0 - celery-beat: - name: "celery-beat" - debug: 0 static: name: "static" externalPort: 80 @@ -48,10 +42,6 @@ namespace: api databaseHost: psql0-gcloud-sqlproxy.sqlproxy caHost: asgard.us-central1-c.c.wott-prod.internal -rabbitHost: rabbit0-rabbitmq.rabbit -rabbitUser: user -rabbitVhost: wott-dash - ingress: enabled: true annotations: diff --git a/helm/misc/prod-secrets.yaml b/helm/misc/prod-secrets.yaml index 9e5955818..d65dced9c 100644 Binary files a/helm/misc/prod-secrets.yaml and b/helm/misc/prod-secrets.yaml differ diff --git a/requirements.txt b/requirements.txt index 2febbcc59..99fd3a19e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ asn1crypto==0.24.0 cachetools==3.1.1 -celery==4.3.0 certifi==2018.11.29 cffi==1.11.5 cfssl==0.0.3b243