diff options
Diffstat (limited to 'src/api')
-rw-r--r-- | src/api/migrations/0022_add_cifile_generated_field.py | 15 | ||||
-rw-r--r-- | src/api/urls.py | 2 | ||||
-rw-r--r-- | src/api/views.py | 108 |
3 files changed, 123 insertions, 2 deletions
diff --git a/src/api/migrations/0022_add_cifile_generated_field.py b/src/api/migrations/0022_add_cifile_generated_field.py new file mode 100644 index 0000000..f83a102 --- /dev/null +++ b/src/api/migrations/0022_add_cifile_generated_field.py @@ -0,0 +1,15 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('api', '0018_cloudinitfile'), + ] + + operations = [ + migrations.AddField( + model_name="CloudInitFile", + name="generated", + field=models.BooleanField(default=False) + ), + ] diff --git a/src/api/urls.py b/src/api/urls.py index acef947..cbb453c 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -62,6 +62,7 @@ from api.views import ( single_image, single_opsys, create_ci_file, + booking_details, ) urlpatterns = [ @@ -93,6 +94,7 @@ urlpatterns = [ path('booking/<int:booking_id>', specific_booking), path('booking/<int:booking_id>/extendBooking/<int:days>', extend_booking), path('booking/makeBooking', make_booking), + path('booking/<int:booking_id>/details', booking_details), path('resource_inventory/availableTemplates', available_templates), path('resource_inventory/<int:template_id>/images', images_for_template), diff --git a/src/api/views.py b/src/api/views.py index 1516374..d5966ed 100644 --- a/src/api/views.py +++ b/src/api/views.py @@ -33,7 +33,7 @@ from api.forms import DowntimeForm from account.models import UserProfile, Lab from booking.models import Booking from booking.quick_deployer import create_from_API -from api.models import LabManagerTracker, get_task, Job, AutomationAPIManager, APILog +from api.models import LabManagerTracker, get_task, Job, AutomationAPIManager, APILog, GeneratedCloudConfig from notifier.manager import NotificationHandler from analytics.models import ActiveVPNUser from resource_inventory.models import ( @@ -430,7 +430,11 @@ def auth_and_log(request, endpoint): token = Token.objects.get(key=user_token) except Token.DoesNotExist: token = None - response = HttpResponse('Unauthorized', status=401) + # Added logic to detect malformed token + if len(str(user_token)) != 40: + response = HttpResponse('Malformed Token', status=401) + else: + response = HttpResponse('Unauthorized', status=401) x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: @@ -650,3 +654,103 @@ def list_labs(request): lab_list.append(lab_info) return JsonResponse(lab_list, safe=False) + + +""" +Booking Details API Views +""" + + +def booking_details(request, booking_id=""): + token = auth_and_log(request, 'booking/{}/details'.format(booking_id)) + + if isinstance(token, HttpResponse): + return token + + booking = get_object_or_404(Booking, pk=booking_id, owner=token.user) + + # overview + overview = { + 'username': GeneratedCloudConfig._normalize_username(None, str(token.user)), + 'purpose': booking.purpose, + 'project': booking.project, + 'start_time': booking.start, + 'end_time': booking.end, + 'pod_definitions': booking.resource.template, + 'lab': booking.lab + } + + # deployment progress + task_list = [] + for task in booking.job.get_tasklist(): + task_info = { + 'name': str(task), + 'status': 'DONE', + 'lab_response': 'No response provided (yet)' + } + if task.status < 100: + task_info['status'] = 'PENDING' + elif task.status < 200: + task_info['status'] = 'IN PROGRESS' + + if task.message: + if task.type_str == "Access Task" and request.user.id != task.config.user.id: + task_info['lab_response'] = '--secret--' + else: + task_info['lab_response'] = str(task.message) + task_list.append(task_info) + + # pods + pod_list = [] + for host in booking.resource.get_resources(): + pod_info = { + 'hostname': host.config.name, + 'machine': host.name, + 'role': '', + 'is_headnode': host.config.is_head_node, + 'image': host.config.image, + 'ram': {'amount': str(host.profile.ramprofile.first().amount) + 'G', 'channels': host.profile.ramprofile.first().channels}, + 'cpu': {'arch': host.profile.cpuprofile.first().architecture, 'cores': host.profile.cpuprofile.first().cores, 'sockets': host.profile.cpuprofile.first().cpus}, + 'disk': {'size': str(host.profile.storageprofile.first().size) + 'GiB', 'type': host.profile.storageprofile.first().media_type, 'mount_point': host.profile.storageprofile.first().name}, + 'interfaces': [], + } + try: + pod_info['role'] = host.template.opnfvRole + except Exception: + pass + for intprof in host.profile.interfaceprofile.all(): + int_info = { + 'name': intprof.name, + 'speed': intprof.speed + } + pod_info['interfaces'].append(int_info) + pod_list.append(pod_info) + + # diagnostic info + diagnostic_info = { + 'job_id': booking.job.id, + 'ci_files': '', + 'pods': [] + } + for host in booking.resource.get_resources(): + pod = { + 'host': host.name, + 'configs': [], + + } + for ci_file in host.config.cloud_init_files.all(): + ci_info = { + 'id': ci_file.id, + 'text': ci_file.text + } + pod['configs'].append(ci_info) + diagnostic_info['pods'].append(pod) + + details = { + 'overview': overview, + 'deployment_progress': task_list, + 'pods': pod_list, + 'diagnostic_info': diagnostic_info, + 'pdf': booking.pdf + } + return JsonResponse(str(details), safe=False) |