diff options
author | Parker Berberian <pberberian@iol.unh.edu> | 2019-03-01 18:21:51 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@opnfv.org> | 2019-03-01 18:21:51 +0000 |
commit | b5bd056d00d76bac14649aae9e9af7b181e54570 (patch) | |
tree | 25294841c50fdb143e263d2554e9a7b43e000ae5 /src/resource_inventory | |
parent | 382853e398c144235beee96fe33bf7404a524f69 (diff) | |
parent | ac43527647f972cb5a021e7a0c7431997490df52 (diff) |
Merge "Enhance PDF/IDF Support"
Diffstat (limited to 'src/resource_inventory')
-rw-r--r-- | src/resource_inventory/pdf_templater.py | 173 | ||||
-rw-r--r-- | src/resource_inventory/resource_manager.py | 90 |
2 files changed, 173 insertions, 90 deletions
diff --git a/src/resource_inventory/pdf_templater.py b/src/resource_inventory/pdf_templater.py new file mode 100644 index 0000000..9f7e7f1 --- /dev/null +++ b/src/resource_inventory/pdf_templater.py @@ -0,0 +1,173 @@ +############################################################################## +# Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, 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 django.template.loader import render_to_string +import booking +from resource_inventory.models import Host, InterfaceProfile + + +class PDFTemplater: + """ + Utility class to create a full PDF yaml file + """ + + @classmethod + def makePDF(cls, resource): + """ + fills the pod descriptor file template with info about the resource + """ + template = "dashboard/pdf.yaml" + info = {} + info['details'] = cls.get_pdf_details(resource) + info['jumphost'] = cls.get_pdf_jumphost(resource) + info['nodes'] = cls.get_pdf_nodes(resource) + + return render_to_string(template, context=info) + + @classmethod + def get_pdf_details(cls, resource): + """ + Info for the "details" section + """ + details = {} + owner = "Anon" + email = "email@mail.com" + resource_lab = resource.template.lab + lab = resource_lab.name + location = resource_lab.location + pod_type = "development" + link = "https://wiki.opnfv.org/display/INF/Pharos+Laas" + + try: + # try to get more specific info that may fail, we dont care if it does + booking_owner = booking.models.Booking.objects.get(resource=resource).owner + owner = booking_owner.username + email = booking_owner.userprofile.email_addr + except Exception: + pass + + details['contact'] = email + details['lab'] = lab + details['link'] = link + details['owner'] = owner + details['location'] = location + details['type'] = pod_type + + return details + + @classmethod + def get_pdf_jumphost(cls, resource): + """ + returns a dict of all the info for the "jumphost" section + """ + jumphost = Host.objects.get(bundle=resource, config__opnfvRole__name__iexact="jumphost") + jumphost_info = cls.get_pdf_host(jumphost) + remote_params = jumphost_info['remote_management'] # jumphost has extra block not in normal hosts + remote_params.pop("address") + remote_params.pop("mac_address") + jumphost_info['remote_params'] = remote_params + jumphost_info['os'] = jumphost.config.image.os.name + return jumphost_info + + @classmethod + def get_pdf_nodes(cls, resource): + """ + returns a list of all the "nodes" (every host except jumphost) + """ + pdf_nodes = [] + nodes = Host.objects.filter(bundle=resource).exclude(config__opnfvRole__name__iexact="jumphost") + for node in nodes: + pdf_nodes.append(cls.get_pdf_host(node)) + + return pdf_nodes + + @classmethod + def get_pdf_host(cls, host): + """ + method to gather all needed info about a host + returns a dict + """ + host_info = {} + host_info['name'] = host.template.resource.name + host_info['node'] = cls.get_pdf_host_node(host) + host_info['disks'] = [] + for disk in host.profile.storageprofile.all(): + host_info['disks'].append(cls.get_pdf_host_disk(disk)) + + host_info['interfaces'] = [] + for interface in host.interfaces.all(): + host_info['interfaces'].append(cls.get_pdf_host_iface(interface)) + + host_info['remote_management'] = cls.get_pdf_host_remote_management(host) + + return host_info + + @classmethod + def get_pdf_host_node(cls, host): + """ + returns "node" info for a given host + """ + d = {} + d['type'] = "baremetal" + d['vendor'] = host.vendor + d['model'] = host.model + d['memory'] = str(host.profile.ramprofile.first().amount) + "G" + + cpu = host.profile.cpuprofile.first() + d['arch'] = cpu.architecture + d['cpus'] = cpu.cpus + d['cores'] = cpu.cores + cflags = cpu.cflags + if cflags and cflags.strip(): + d['cpu_cflags'] = cflags + else: + d['cpu_cflags'] = "none" + + return d + + @classmethod + def get_pdf_host_disk(cls, disk): + """ + returns a dict describing the given disk + """ + disk_info = {} + disk_info['name'] = disk.name + disk_info['capacity'] = str(disk.size) + "G" + disk_info['type'] = disk.media_type + disk_info['interface'] = disk.interface + disk_info['rotation'] = disk.rotation + return disk_info + + @classmethod + def get_pdf_host_iface(cls, interface): + """ + returns a dict describing given interface + """ + iface_info = {} + iface_info['features'] = "none" + iface_info['mac_address'] = interface.mac_address + iface_info['name'] = interface.name + profile = InterfaceProfile.objects.get(host=interface.host.profile, name=interface.name) + iface_info['speed'] = str(int(profile.speed / 1000)) + "gb" + return iface_info + + @classmethod + def get_pdf_host_remote_management(cls, host): + """ + gives the remote params of the host + """ + mgmt = {} + mgmt['address'] = "I dunno" + mgmt['mac_address'] = "I dunno" + mgmt['pass'] = "I dunno" + mgmt['type'] = "I dunno" + mgmt['user'] = "I dunno" + mgmt['versions'] = ["I dunno"] + return mgmt diff --git a/src/resource_inventory/resource_manager.py b/src/resource_inventory/resource_manager.py index f43ae4d..52b0055 100644 --- a/src/resource_inventory/resource_manager.py +++ b/src/resource_inventory/resource_manager.py @@ -8,9 +8,6 @@ ############################################################################## -from django.template.loader import render_to_string - -import booking from dashboard.exceptions import ( ResourceExistenceException, ResourceAvailabilityException, @@ -142,90 +139,3 @@ class ResourceManager: def fail_acquire(self, hosts): for host in hosts: self.releaseHost(host) - - def makePDF(self, resource): - """ - fills the pod descriptor file template with info about the resource - """ - template = "dashboard/pdf.yaml" - info = {} - info['details'] = self.get_pdf_details(resource) - info['jumphost'] = self.get_pdf_jumphost(resource) - info['nodes'] = self.get_pdf_nodes(resource) - - return render_to_string(template, context=info) - - def get_pdf_details(self, resource): - details = {} - owner = "Anon" - email = "email@mail.com" - resource_lab = resource.template.lab - lab = resource_lab.name - location = resource_lab.location - pod_type = "development" - link = "https://wiki.opnfv.org/display/INF/Pharos+Laas" - - try: - # try to get more specific info that may fail, we dont care if it does - booking_owner = booking.models.Booking.objects.get(resource=resource).owner - owner = booking_owner.username - email = booking_owner.userprofile.email_addr - except Exception: - pass - - details['owner'] = owner - details['email'] = email - details['lab'] = lab - details['location'] = location - details['type'] = pod_type - details['link'] = link - - return details - - def get_pdf_jumphost(self, resource): - jumphost = Host.objects.get(bundle=resource, config__opnfvRole__name__iexact="jumphost") - return self.get_pdf_host(jumphost) - - def get_pdf_nodes(self, resource): - pdf_nodes = [] - nodes = Host.objects.filter(bundle=resource).exclude(config__opnfvRole__name__iexact="jumphost") - for node in nodes: - pdf_nodes.append(self.get_pdf_host(node)) - - return pdf_nodes - - def get_pdf_host(self, host): - host_info = {} - host_info['name'] = host.template.resource.name - host_info['node'] = {} - host_info['node']['type'] = "baremetal" - host_info['node']['vendor'] = host.vendor - host_info['node']['model'] = host.model - host_info['node']['arch'] = host.profile.cpuprofile.first().architecture - host_info['node']['cpus'] = host.profile.cpuprofile.first().cpus - host_info['node']['cores'] = host.profile.cpuprofile.first().cores - cflags = host.profile.cpuprofile.first().cflags - if cflags and cflags.strip(): - host_info['node']['cpu_cflags'] = cflags - host_info['node']['memory'] = str(host.profile.ramprofile.first().amount) + "G" - host_info['disks'] = [] - for disk in host.profile.storageprofile.all(): - disk_info = {} - disk_info['name'] = disk.name - disk_info['capacity'] = str(disk.size) + "G" - disk_info['type'] = disk.media_type - disk_info['interface'] = disk.interface - disk_info['rotation'] = disk.rotation - host_info['disks'].append(disk_info) - - host_info['interfaces'] = [] - for interface in host.interfaces.all(): - iface_info = {} - iface_info['name'] = interface.name - iface_info['address'] = "unknown" - iface_info['mac_address'] = interface.mac_address - vlans = "|".join([str(vlan.vlan_id) for vlan in interface.config.all()]) - iface_info['vlans'] = vlans - host_info['interfaces'].append(iface_info) - - return host_info |