--- /dev/null
+##############################################################################
+# Copyright (c) 2016 Max Breitenfeldt and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
\ No newline at end of file
--- /dev/null
+##############################################################################
+# Copyright (c) 2016 Max Breitenfeldt and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+import logging
+
+import requests
+
+URLS = {
+ 'resources': '/api/resources/',
+ 'servers': '/api/servers/',
+ 'bookings': '/api/bookings',
+ 'resource_status': '/api/resource_status/',
+}
+
+class DashboardAPI(object):
+ def __init__(self, dashboard_url, api_token='', verbose=False):
+ self._api_token = api_token
+ self._verbose = verbose
+ self._resources_url = dashboard_url + URLS['resources']
+ self._servers_url = dashboard_url + URLS['servers']
+ self._bookings_url = dashboard_url + URLS['bookings']
+ self._resources_status_url = dashboard_url + URLS['resource_status']
+ self._logger = logging.getLogger(__name__)
+
+ def get_all_resources(self):
+ return self._get_json(self._resources_url)
+
+ def get_resource(self, id='', name='', url=''):
+ if url != '':
+ return self._get_json(url)[0]
+ url = self._resources_url + self._url_parameter(id=id, name=name)
+ return self._get_json(url)[0]
+
+ def get_all_bookings(self):
+ return self._get_json(self._bookings_url)
+
+ def get_resource_bookings(self, resource_id):
+ url = self._bookings_url + self._url_parameter(resource_id=resource_id)
+ return self._get_json(url)
+
+ def get_booking(self, id):
+ url = self._bookings_url + self._url_parameter(id=id)
+ return self._get_json(url)[0]
+
+ def post_resource_status(self, resource_id, type, title, content):
+ data = {
+ 'resource': resource_id,
+ 'type': type,
+ 'title': title,
+ 'content': content
+ }
+ return self._post_json(self._resources_status_url, data)
+
+ def get_url(self, url):
+ return self._get_json(url)
+
+ def _url_parameter(self, **kwargs):
+ res = ''
+ prefix = '?'
+ for key, val in kwargs.items():
+ res += prefix + key + '=' + str(val)
+ prefix = '&'
+ return res
+
+ def _get_json(self, url):
+ try:
+ response = requests.get(url)
+ if self._verbose:
+ print('Get JSON: ' + url)
+ print(response.status_code, response.content)
+ return response.json()
+ except requests.exceptions.RequestException as e:
+ self._logger.exception(e)
+ except ValueError as e:
+ self._logger.exception(e)
+
+ def _post_json(self, url, json):
+ if self._api_token == '':
+ raise Exception('Need api token to POST data.')
+ response = requests.post(url, json, headers={'Authorization': 'Token ' + self._api_token})
+ if self._verbose:
+ print('Post JSON: ' + url)
+ print(response.status_code, response.content)
+ return response.status_code
--- /dev/null
+##############################################################################
+# Copyright (c) 2016 Max Breitenfeldt and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
from rest_framework import serializers
from booking.models import Booking
-from dashboard.models import Server, Resource
+from dashboard.models import Server, Resource, ResourceStatus
-class BookingSerializer(serializers.HyperlinkedModelSerializer):
+class BookingSerializer(serializers.ModelSerializer):
+ installer_name = serializers.RelatedField(source='installer', read_only=True)
+ scenario_name = serializers.RelatedField(source='scenario', read_only=True)
+
class Meta:
model = Booking
- fields = ('id', 'resource', 'start', 'end', 'purpose')
+ fields = ('id', 'resource_id', 'start', 'end', 'installer_name', 'scenario_name', 'purpose')
-class ServerSerializer(serializers.HyperlinkedModelSerializer):
+class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
- fields = ('id', 'resource', 'name', 'model', 'cpu', 'ram', 'storage')
+ fields = ('id', 'resource_id', 'name', 'model', 'cpu', 'ram', 'storage')
-class ResourceSerializer(serializers.HyperlinkedModelSerializer):
+class ResourceSerializer(serializers.ModelSerializer):
class Meta:
model = Resource
fields = ('id', 'name', 'description', 'url', 'server_set')
+
+class ResourceStatusSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = ResourceStatus
+ fields = ('id', 'resource', 'timestamp','type', 'title', 'content')
\ No newline at end of file
router.register(r'resources', ResourceViewSet)
router.register(r'servers', ServerViewSet)
router.register(r'bookings', BookingViewSet)
+router.register(r'resource_status', ResourceStatusViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
from rest_framework import viewsets
from rest_framework.authtoken.models import Token
-from api.serializers import ResourceSerializer, ServerSerializer, BookingSerializer
+from api.serializers import *
from booking.models import Booking
-from dashboard.models import Resource, Server
+from dashboard.models import Resource, Server, ResourceStatus
class BookingViewSet(viewsets.ModelViewSet):
queryset = Booking.objects.all()
serializer_class = BookingSerializer
- filter_fields = ('resource', 'user')
+ filter_fields = ('resource', 'id')
class ServerViewSet(viewsets.ModelViewSet):
class ResourceViewSet(viewsets.ModelViewSet):
queryset = Resource.objects.all()
serializer_class = ResourceSerializer
- filter_fields = ('name',)
+ filter_fields = ('name', 'id')
+
+class ResourceStatusViewSet(viewsets.ModelViewSet):
+ queryset = ResourceStatus.objects.all()
+ serializer_class = ResourceStatusSerializer
@method_decorator(login_required, name='dispatch')
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = os.environ['DEBUG']
+DEBUG = False
# Application definition
'bootstrap3',
'crispy_forms',
'rest_framework',
+ 'rest_framework.authtoken',
]
MIDDLEWARE = [
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
],
- 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
+ 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
+ 'DEFAULT_AUTHENTICATION_CLASSES': (
+ 'rest_framework.authentication.SessionAuthentication',
+ 'rest_framework.authentication.TokenAuthentication',
+ )
}
MEDIA_ROOT = '/media'
'task': 'dashboard.tasks.database_cleanup',
'schedule': timedelta(hours=24)
},
-}
\ No newline at end of file
+}