Пример #1
0
 def logo(self):
     self.config = ConfigEngine()
     if self.config.myslice.theme_logo :
         return self.config.myslice.theme_logo
Пример #2
0
 def theme(self):
     self.config = ConfigEngine()
     if self.config.myslice.theme :
         return self.config.myslice.theme
Пример #3
0
 def expose_js_manifold_config (self):
     self.add_js_init_chunks(ConfigEngine().manifold_js_export())
Пример #4
0
 def label(self):
     self.config = ConfigEngine()
     if self.config.myslice.theme_label :
         return self.config.myslice.theme_label
Пример #5
0
    def get_context_data(self, **kwargs):
        page = Page(self.request)
        page.add_js_files(["js/common.functions.js"])

        for key, value in kwargs.iteritems():
            logger.debug("{} = {}".format(key, value))
            if key == "platformname":
                platformname = value

        network_query  = Query().get('local:platform')\
            .filter_by('platform', '==', platformname)\
            .select('platform','platform_longname','gateway_type')
        page.enqueue_query(network_query)

        # ListResources of the platform
        metadata = page.get_metadata()
        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]
        resources = platformname + ':resource'
        query_resource_all = Query.get(resources).select(resource_fields)
        page.enqueue_query(query_resource_all)
        query_resource_default_fields = Query.get(resources).select(
            'hrn', 'hostname', 'type', 'country')
        page.enqueue_query(query_resource_default_fields)

        page.expose_js_metadata()
        networklist = QueryTable(
            page=page,
            title='List',
            domid='checkboxes',
            # this is the query at the core of the slice list
            query=network_query,
            query_all=network_query,
            checkboxes=False,
            datatables_options={
                'iDisplayLength': 25,
                'bLengthChange': True,
            },
        )

        #        networklist = SimpleList(
        #            title = None,
        #            page  = page,
        #            key   = 'platform',
        #            query = network_query,
        #        )
        #
        # --------------------------------------------------------------------------
        # RESOURCES
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hrn'

        # the resources part is made of a Tabs (Geographic, List),
        resources_as_gmap = GoogleMap(
            page=page,
            title='Geographic view',
            domid='resources-map',
            # tab's sons preferably turn this off
            togglable=False,
            query=query_resource_default_fields,
            query_all=query_resource_all,
            # this key is the one issued by google
            googlemap_api_key=ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key=main_query_init_key,
            checkboxes=False,
            # center on Paris
            latitude=49.,
            longitude=9,
            zoom=4,
        )
        resources_as_3dmap = SensLabMap(
            page=page,
            title='3D Map',
            domid='senslabmap',
            query=query_resource_default_fields,
            query_all=query_resource_all,
        )
        resources_as_list = QueryTable(
            page=page,
            domid='resources-list',
            title='List view',
            # this is the query at the core of the slice list
            query=query_resource_default_fields,
            query_all=query_resource_all,
            init_key=main_query_init_key,
            checkboxes=False,
            datatables_options={
                'iDisplayLength': 25,
                'bLengthChange': True,
                'bAutoWidth': True,
            },
        )
        resources_sons = [
            resources_as_gmap,
            resources_as_3dmap,
            resources_as_list,
        ]
        resources_area = Tabs(
            page=page,
            domid="resources",
            togglable=True,
            title="Resources",
            outline_complete=True,
            sons=resources_sons,
            active_domid='resources-map',
            persistent_active=True,
        )

        context = super(PlatformView, self).get_context_data(**kwargs)
        context['person'] = self.request.user
        context['networks'] = networklist.render(self.request)
        context['resources'] = resources_area.render(self.request)

        # XXX This is repeated in all pages
        # more general variables expected in the template
        context['title'] = 'Platforms connected to MySlice'
        # the menu items on the top
        context['topmenu_items'] = topmenu_items_live('Platforms', page)
        # so we can sho who is logged
        context['username'] = the_user(self.request)
        context['theme'] = self.theme
        context.update(page.prelude_env())

        return context
Пример #6
0
 def default_env(self):
     return {
         'MANIFOLD_URL': ConfigEngine().manifold_url(),
     }
Пример #7
0
import subprocess


logger = logging.getLogger('myslice')

# ROOT
try:
    ROOT = os.path.realpath(os.path.dirname(__file__) + '/..')
except:
    import traceback
    logger.error(traceback.format_exc())


from myslice.configengine import ConfigEngine

config = ConfigEngine()

import myslice.components as components

# import djcelery
# djcelery.setup_loader()

### detect if we're in a build environment
try:
    import manifold
    building=False
except:
    building=True

if not config.myslice.portal_version:
    try:
Пример #8
0
    def get(self, request, slicename=tmp_default_slice):

        page = Page(request)
        page.add_css_files('css/slice-view.css')
        page.add_js_files(["js/common.functions.js"])
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });'
        )
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: users turned %s"); });'
            % ("on" if do_query_users else "off"))
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: leases turned %s"); });'
            % ("on" if do_query_leases else "off"))
        page.add_js_chunks(
            '$(function() { messages.debug("manifold URL %s"); });' %
            (ConfigEngine().manifold_url()))

        metadata = page.get_metadata()
        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]

        user_md = metadata.details_by_object('user')
        user_fields = ['user_hrn'
                       ]  # [column['name'] for column in user_md['column']]

        # TODO The query to run is embedded in the URL
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(
            'slice_hrn',
            #'resource.hrn', 'resource.urn',
            'resource.hostname',
            'resource.type',
            'resource.network_hrn',
            'lease.urn',
            'user.user_hrn',
            #'application.measurement_point.counter'
        )
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hostname'

        query_resource_all = Query.get('resource').select(resource_fields)

        aq = AnalyzedQuery(main_query, metadata=metadata)
        page.enqueue_query(main_query, analyzed_query=aq)
        page.enqueue_query(query_resource_all)
        if do_query_users:
            # Required: the user must have an authority in its user.config
            # XXX Temporary solution
            user_query = Query().get('local:user').select('config', 'email')
            user_details = execute_query(self.request, user_query)

            # not always found in user_details...
            config = {}
            #            for user_detail in user_details:
            #                #email = user_detail['email']
            #                if user_detail['config']:
            #                    config = json.loads(user_detail['config'])
            #            user_detail['authority'] = config.get('authority',"Unknown Authority")
            #
            #            if user_detail['authority'] is not None:
            #                sub_authority = user_detail['authority'].split('.')
            #                root_authority = sub_authority[0]
            #                query_user_all = Query.get(root_authority+':user').select(user_fields)
            #
            #                # XXX TODO this filter doesn't work - to be improved in Manifold
            #                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
            #
            #                page.enqueue_query(query_user_all)
            #            else:
            #                print "authority of the user is not in local:user db"
            query_user_all = Query.get('user').select(user_fields)
            #    query_user_all = None

        # ... and for the relations
        # XXX Let's hardcode resources for now
        sq_resource = aq.subquery('resource')
        sq_user = aq.subquery('user')
        sq_lease = aq.subquery('lease')
        sq_measurement = aq.subquery('measurement')

        # Prepare the display according to all metadata
        # (some parts will be pending, others can be triggered by users).
        #
        # For example slice measurements will not be requested by default...

        # Create the base layout (Stack)...
        main_stack = Stack(
            page=page,
            title="Slice %s" % slicename,
            sons=[],
        )

        # ... responsible for the slice properties...

        # a nice header
        main_stack.insert(
            Raw(page=page,
                togglable=False,
                toggled=True,
                html="<h2 class='well well-lg'> Slice %s</h2>" % slicename))

        # --------------------------------------------------------------------------
        #DEPRECATED|        # QueryUpdater (Pending Operations)
        #DEPRECATED|
        #DEPRECATED|        main_stack.insert(QueryUpdater(
        #DEPRECATED|            page                = page,
        #DEPRECATED|            title               = 'Pending operations',
        #DEPRECATED|            query               = main_query,
        #DEPRECATED|            togglable           = True,
        #DEPRECATED|            # start turned off, it will open up itself when stuff comes in
        #DEPRECATED|            toggled             = False,
        #DEPRECATED|            domid               = 'pending',
        #DEPRECATED|            outline_complete    = True,
        #DEPRECATED|        ))

        # --------------------------------------------------------------------------
        # Filter Resources

        # turn off for now -- see above
        filter_query_editor = QueryEditor(
            page=page,
            query=sq_resource,
            query_all=query_resource_all,
            title="Select Columns",
            domid='select-columns',
        )
        filter_active_filters = ActiveFilters(
            page=page,
            query=sq_resource,
            title="Active Filters",
        )
        filters_area = Stack(
            page=page,
            title='Filter Resources',
            domid='filters',
            sons=[filter_query_editor, filter_active_filters],
            togglable=True,
            toggled='persistent',
            outline_complete=True,
        )
        main_stack.insert(filters_area)

        # --------------------------------------------------------------------------
        # RESOURCES
        # the resources part is made of a Tabs (Geographic, List),

        resources_as_gmap = GoogleMap(
            page=page,
            title='Geographic view',
            domid='resources-map',
            # tab's sons preferably turn this off
            togglable=False,
            query=sq_resource,
            query_all=query_resource_all,
            # this key is the one issued by google
            googlemap_api_key=ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key=main_query_init_key,
            checkboxes=True,
            # center on Paris
            latitude=49.,
            longitude=9,
            zoom=4,
        )

        resources_as_3dmap = SensLabMap(
            page=page,
            title='3D Map',
            domid='senslabmap',
            query=sq_resource,
            query_all=query_resource_all,
        )

        resources_as_list = QueryTable(
            page=page,
            domid='resources-list',
            title='List view',
            # this is the query at the core of the slice list
            query=sq_resource,
            query_all=query_resource_all,
            init_key=main_query_init_key,
            checkboxes=True,
            datatables_options={
                'iDisplayLength': 25,
                'bLengthChange': True,
                'bAutoWidth': True,
            },
        )

        if insert_grid:
            resources_as_grid = QueryGrid(
                page=page,
                domid='resources-grid',
                title='Grid view',
                # this is the query at the core of the slice list
                query=sq_resource,
                query_all=query_resource_all,
                init_key=main_query_init_key,
                checkboxes=True,
            )

        if do_query_leases:
            resources_as_scheduler = Scheduler(
                page=page,
                title='Scheduler',
                domid='scheduler',
                query=sq_resource,
                query_all_resources=query_resource_all,
                query_lease=sq_lease,
            )

    # with the new 'Filter' stuff on top, no need for anything but the querytable
        resources_as_list_area = resources_as_list

        resources_sons = [
            resources_as_gmap,
            resources_as_3dmap,
            resources_as_scheduler,
            resources_as_list_area,
        ] if do_query_leases else [
            resources_as_gmap,
            resources_as_3dmap,
            resources_as_list_area,
        ]
        if insert_grid:
            resources_sons.append(resources_as_grid)

        resources_area = Tabs(
            page=page,
            domid="resources",
            togglable=True,
            title="Resources",
            outline_complete=True,
            sons=resources_sons,
            active_domid='resources-map',
            persistent_active=True,
        )
        main_stack.insert(resources_area)

        # --------------------------------------------------------------------------
        # USERS

        if do_query_users and query_user_all is not None:
            tab_users = Tabs(
                page=page,
                domid='users',
                outline_complete=True,
                togglable=True,
                title='Users',
                active_domid='users-list',
            )
            main_stack.insert(tab_users)

            tab_users.insert(
                QueryTable(
                    page=page,
                    title='Users List',
                    domid='users-list',
                    # tab's sons preferably turn this off
                    togglable=False,
                    # this is the query at the core of the slice list
                    query=sq_user,
                    query_all=query_user_all,
                    checkboxes=True,
                    datatables_options={
                        'iDisplayLength': 25,
                        'bLengthChange': True,
                        'bAutoWidth': True,
                    },
                ))

# DEMO
# --------------------------------------------------------------------------
# MEASUREMENTS
        measurements_stats_cpu = SliceStat(title="CPU Usage",
                                           domid='resources-stats-cpu',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='cpu')

        measurements_stats_mem = SliceStat(title="Memory Usage",
                                           domid='resources-stats-mem',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='mem')

        measurements_stats_asb = SliceStat(title="Traffic Sent",
                                           domid='resources-stats-asb',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='asb')

        measurements_stats_arb = SliceStat(title="Traffic Received",
                                           domid='resources-stats-arb',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='arb')

        tab_measurements = Tabs(
            page=page,
            domid="measurements",
            togglable=True,
            toggled='persistent',
            title="Measurements",
            outline_complete=True,
            sons=[
                measurements_stats_cpu, measurements_stats_mem,
                measurements_stats_asb, measurements_stats_arb
            ],
            active_domid='resources-stats-cpu',
            persistent_active=True,
        )
        main_stack.insert(tab_measurements)

        #        tab_measurements = Tabs (
        #            page                = page,
        #            active_domid        = 'measurements-list',
        #            outline_complete    = True,
        #            togglable           = True,
        #            title               = 'Measurements',
        #            domid               = 'measurements',
        #        )
        #        main_stack.insert(tab_measurements)
        #
        #        tab_measurements.insert(QueryTable(
        #            page        = page,
        #            title       = 'Measurements',
        #            domid       = 'measurements-list',
        #            # tab's sons preferably turn this off
        #            togglable   = False,
        #            # this is the query at the core of the slice list
        #            query       = sq_measurement,
        #            # do NOT set checkboxes to False
        #            # this table being otherwise empty, it just does not fly with dataTables
        #            checkboxes  = True,
        #            datatables_options = {
        #                'iDisplayLength' : 25,
        #                'bLengthChange'  : True,
        #                'bAutoWidth'     : True,
        #            },
        #        ))
        #
        #        # --------------------------------------------------------------------------
        #        # MESSAGES (we use transient=False for now)
        if insert_messages:
            main_stack.insert(
                Messages(
                    page=page,
                    title="Runtime messages for slice %s" % slicename,
                    domid="msgs-pre",
                    levels="ALL",
                    # plain messages are probably less nice for production but more reliable for development for now
                    transient=False,
                    # these make sense only in non-transient mode..
                    togglable=True,
                    toggled='persistent',
                    outline_complete=True,
                ))

        # variables that will get passed to the view-unfold1.html template
        template_env = {}

        # define 'unfold_main' to the template engine - the main contents
        template_env['unfold_main'] = main_stack.render(request)

        # more general variables expected in the template
        template_env['title'] = '%(slicename)s' % locals()
        # the menu items on the top
        template_env['topmenu_items'] = topmenu_items_live('Slice', page)
        # so we can sho who is logged
        template_env['username'] = the_user(request)

        template_env['theme'] = self.theme

        # don't forget to run the requests
        page.expose_js_metadata()
        # the prelude object in page contains a summary of the requirements() for all plugins
        # define {js,css}_{files,chunks}
        template_env.update(page.prelude_env())

        return render_to_response('view-unfold1.html',
                                  template_env,
                                  context_instance=RequestContext(request))
Пример #9
0
    def get(self, request, slicename):

        if request.GET.get('message'):
            msg = "Slice successfully updated"
        else:
            msg = None

        page = Page(request)
        metadata = page.get_metadata()
        page.expose_js_metadata()

        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]

        user_md = metadata.details_by_object('user')
        user_fields = ['user_hrn'
                       ]  # [column['name'] for column in user_md['column']]

        query_resource_all = Query.get('resource').select(resource_fields)
        #page.enqueue_query(query_resource_all)

        # leases query
        #lease_md = metadata.details_by_object('lease')
        #lease_fields = [column['name'] for column in lease_md['column']]

        #query_lease_all = Query.get('lease').select(lease_fields)
        #page.enqueue_query(query_lease_all)

        slice_md = metadata.details_by_object('slice')
        slice_fields = [column['name'] for column in slice_md['column']]
        logger.debug("SLICE RES VIEW fields = {}".format(slice_fields))
        # TODO The query to run is embedded in the URL
        # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(slice_fields)

        # Columns shown by default in Query_table plugin
        page.expose_js_var(
            "QUERYTABLE_MAP",
            "{'Resource name': 'hostname', 'Type': 'type', 'Facility': 'facility_name','Testbed': 'testbed_name', 'Available':'available'}"
        )

        # Columns checked by default in Columns_selector plugin
        query_default_fields = [
            'hostname', 'type', 'facility_name', 'testbed_name', 'available'
        ]

        QUERYTABLE_MAP = {
            'hostname': 'Resource name',
            'type': 'Type',
            'facility_name': 'Facility',
            'testbed_name': 'Testbed',
            'available': 'Available',
        }

        #        # SLICE
        #        'slice_hrn',
        #        # - The record key is needed otherwise the storage of records
        #        #   bugs !
        #        'slice_urn',
        #        # RESOURCES
        #        'resource',
        #        'lease',
        #        'resource.urn',
        #        'resource.hostname', 'resource.type',
        #        # - The facility_name and testbed_name are required for the
        #        #   testbeds plugin to properly work.
        #        'resource.facility_name',
        #        'resource.testbed_name',
        #        # LEASES
        #        'lease.resource',
        #        'lease.start_time',
        #        'lease.end_time',
        #        # - The lease_id is important for NITOS identify already existing
        #        #   leases
        #        'lease.lease_id',

        #        # FLOWSPACE
        #        #'flowspace',
        #        # VMS
        #        #'vms',

        #        #'user.user_hrn',
        #        #'application.measurement_point.counter'
        #)
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'urn'
        aq = AnalyzedQuery(main_query, metadata=metadata)
        page.enqueue_query(main_query, analyzed_query=aq)
        sq_resource = aq.subquery('resource')
        sq_lease = aq.subquery('lease')
        #sq_flowspace   = aq.subquery('flowspace')
        #sq_vms         = aq.subquery('vms')

        # --------------------------------------------------------------------------
        # ALL RESOURCES LIST
        # resources as a list using datatable plugin

        list_resources = QueryTable(
            page=page,
            domid='resources-list',
            title='List view',
            query=sq_resource,
            query_all=query_resource_all,
            mapping=QUERYTABLE_MAP,
            default_fields=query_default_fields,
            init_key="urn",
            checkboxes=True,
            datatables_options={
                'iDisplayLength': 25,
                'bLengthChange': True,
                'bAutoWidth': True,
            },
        )

        # --------------------------------------------------------------------------
        # RESERVED RESOURCES LIST
        # resources as a list using datatable plugin

        list_reserved_resources = SimpleList(
            title=None,
            page=page,
            key='urn',
            query=sq_resource,
        )

        list_reserved_leases = SimpleList(
            title=None,
            page=page,
            key='resource',
            query=sq_lease,
        )

        #        list_reserved_resources = QueryTable(
        #            page       = page,
        #            domid      = 'resources-reserved-list',
        #            title      = 'List view',
        #            query      = sq_resource,
        #            query_all  = sq_resource,
        #            init_key   = "urn",
        #            checkboxes = True,
        #            datatables_options = {
        #                'iDisplayLength': 25,
        #                'bLengthChange' : True,
        #                'bAutoWidth'    : True,
        #                },
        #        )

        # --------------------------------------------------------------------------
        # COLUMNS EDITOR
        # list of fields to be applied on the query
        # this will add/remove columns in QueryTable plugin

        filter_column_editor = ColumnsEditor(
            page=page,
            query=sq_resource,
            query_all=query_resource_all,
            default_fields=query_default_fields,
            title="Select Columns",
            domid='select-columns',
        )

        # --------------------------------------------------------------------------
        # RESOURCES MAP
        # the resources part is made of a Tabs (Geographic, List),

        map_resources = GoogleMap(
            page=page,
            title='Geographic view',
            domid='resources-map',
            # tab's sons preferably turn this off
            togglable=False,
            query=sq_resource,
            # this key is the one issued by google
            googlemap_api_key=ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key=main_query_init_key,
            checkboxes=True,

            # To center around Europe : 53,9 / 3
            latitude=53.,
            longitude=9.,
            zoom=3,
        )

        # --------------------------------------------------------------------------
        # LEASES Nitos Scheduler
        # Display the leases reservation timeslots of the resources

        resources_as_scheduler2 = Scheduler2(
            page=page,
            domid='scheduler',
            title='Scheduler',
            # this is the query at the core of the slice list
            query=sq_resource,
            query_lease=sq_lease,
        )

        # --------------------------------------------------------------------------
        # LEASES Asap Scheduler
        # Select an end_time for all unconfigured resources
        # start_time is as soon as possible

        #resources_as_asap = AsapPlugin(
        #    page       = page,
        #    domid      = 'asap',
        #    title      = 'Asap',
        #    # this is the query at the core of the slice list
        #    query = sq_resource,
        #    query_lease = sq_lease,
        #)

        # --------------------------------------------------------------------------
        # QueryUpdater (Pending Operations)

        #         pending_resources = QueryUpdaterPlugin(
        #             page                = page,
        #             title               = 'Pending operations',
        #             query               = main_query,
        #             togglable           = False,
        #             # start turned off, it will open up itself when stuff comes in
        #             toggled             = False,
        #             domid               = 'pending',
        #             outline_complete    = True,
        #             username            = request.user,
        #         )

        # --------------------------------------------------------------------------
        # NETWORKS
        # testbeds as a list of filters

        network_md = metadata.details_by_object('network')
        network_fields = [column['name'] for column in network_md['column']]

        #query_networks = Query.get('network').select(network_fields)
        #page.enqueue_query(query_networks)

        filter_testbeds = TestbedsPlugin(
            page=page,
            domid='testbeds-filter',
            title='Filter by testbeds',
            query=sq_resource,
            #query_networks  = query_networks,
            #init_key        = "network_hrn",
            #checkboxes      = True,
            #datatables_options = {
            #    'iDisplayLength': 25,
            #    'bLengthChange' : True,
            #    'bAutoWidth'    : True,
            #    },
        )

        filter_status = FilterStatusPlugin(
            page=page,
            domid="filter-status",
            query=sq_resource,
            query_lease=sq_lease,
        )
        apply = ApplyPlugin(
            page=page,
            domid="apply",
            query=main_query,
            username=request.user,
        )

        # --------------------------------------------------------------------------
        # Ofelia OpenFlow Plugin
        # Bristol plugin

        # plugin which display a "gathering resources" message
        # waiting for all resources to be returned by manifold
        # univbriswelcome = Univbris(
        #     page  = page,
        #     title = 'univbris_welcome',
        #     domid = 'univbris_welcome',
        #     query = query_resource_all,
        # )

        # univbrisfoamlist = UnivbrisFoam(
        #     page  = page,
        #     title = 'univbris_foam_ports_selection',
        #     domid = 'univbris_foam_ports_selection',
        #     query = query_resource_all,
        #     query_all = query_resource_all,
        #     checkboxes = False,
        #     datatables_options = {
        #         'iDisplayLength': 10,
        #         'bLengthChange' : True,
        #         'bAutoWidth'    : True,
        #         },
        # )

        # #plugin which manages the different flowspaces that the user creates, and also sends flowspaces to manifold
        # univbrisfvlist = UnivbrisFv(
        #         page  = page,
        #         title = 'univbris_flowspace_selection',
        #         domid = 'univbris_flowspace_selection',
        #         query = sq_flowspace,
        #         query_all = query_resource_all,
        #         datatables_options = {
        #             'iDisplayLength': 5,
        #             'bLengthChange' : True,
        #             'bAutoWidth'    : True,
        #             },
        # )

        # #plugin which allows the definition of a single flowspace
        # univbrisfvform = UnivbrisFvf(
        #         page  = page,
        #         title = 'univbris_flowspace_form',
        #         domid = 'univbris_flowspace_form',
        #         query = query_resource_all,
        #         query_all = None,
        #         datatables_options = {
        #             'iDisplayLength': 3,
        #             'bLengthChange' : True,
        #             'bAutoWidth'    : True,
        #             },
        # )

        # #plugin which allows the definition the match criteria on a single OPTICAL flowspace
        # univbrisofvform = UnivbrisFvfo(
        #     page  = page,
        #     title = 'univbris_oflowspace_form',
        #     domid = 'univbris_oflowspace_form',
        #     query = None,
        #     query_all = None,
        #     datatables_options = {
        #         'iDisplayLength': 3,
        #         'bLengthChange' : True,
        #         'bAutoWidth'    : True,
        #         },
        # )

        # #plugin which display the gathered topology
        # univbristopology = UnivbrisTopo(
        #     page  = page,
        #     title = 'univbris_topology',
        #     domid = 'univbris_topology',
        #     query = query_resource_all,
        # )

        # # --------------------------------------------------------------------------
        # # Ofelia VTAM Plugin
        # # Bristol Plugin

        # #plugin which display a table where an experimenter will add VMs to according to his needs
        # # responsible to send the data to Manifold
        # univbrisvtamplugin = UnivbrisVtamPlugin(
        #     page  = page,
        #     title = 'univbris_vtam',
        #     domid = 'univbris_vtam',
        #     query = sq_vms,
        #     #query = sq_resource,
        # )

        # #plugin which display a form where an experimenter will specify
        # # in which testbed and which physical server to setup the VM
        # univbrisvtamform = UnivbrisVtamForm(
        #     page  = page,
        #     title = 'univbris_vtam_form',
        #     domid = 'univbris_vtam_form',
        #     query =  query_resource_all,
        #     query_all = None,
        #     datatables_options = {
        #         'iDisplayLength': 3,
        #         'bLengthChange' : True,
        #         'bAutoWidth'    : True,
        #         },
        # )

        # --------------------------------------------------------------------------
        # SLA View and accept dialog

        sla_dialog = SlaDialog(
            page=page,
            title='sla dialog',
            query=main_query,
            #togglable           = False,
            # start turned off, it will open up itself when stuff comes in
            #toggled             = True,
            domid='sla_dialog',
            #outline_complete    = True,
            username=request.user,
        )

        template_env = {}

        template_env['request'] = self.request

        template_env['list_resources'] = list_resources.render(self.request)
        template_env[
            'list_reserved_resources'] = list_reserved_resources.render(
                self.request)
        template_env['list_reserved_leases'] = list_reserved_leases.render(
            self.request)

        template_env['columns_editor'] = filter_column_editor.render(
            self.request)

        template_env['filter_testbeds'] = filter_testbeds.render(self.request)
        template_env['filter_status'] = filter_status.render(self.request)
        template_env['apply'] = apply.render(self.request)

        template_env['map_resources'] = map_resources.render(self.request)
        template_env['scheduler'] = resources_as_scheduler2.render(
            self.request)
        #template_env['asap'] = resources_as_asap.render(self.request)

        # Bristol plugin
        # template_env['welcome'] = univbriswelcome.render(self.request)
        # template_env['resources'] = univbrisfoamlist.render(self.request)
        # template_env['flowspaces'] = univbrisfvlist.render(self.request)
        # template_env['oflowspaces_form'] = univbrisofvform.render(self.request)
        # template_env['flowspaces_form'] = univbrisfvform.render(self.request)
        # template_env['topology'] = univbristopology.render(self.request)
        # template_env['vms_list'] = univbrisvtamplugin.render(self.request)
        # template_env['vm_form'] = univbrisvtamform.render(self.request)

        # template_env['pending_resources'] = pending_resources.render(self.request)
        template_env['sla_dialog'] = sla_dialog.render(self.request)
        template_env["theme"] = self.theme
        template_env["username"] = request.user
        template_env["slice"] = slicename
        template_env["section"] = "resources"
        template_env["msg"] = msg
        template_env.update(page.prelude_env())

        return render_to_response(self.template,
                                  template_env,
                                  context_instance=RequestContext(request))
Пример #10
0
    def get (self,request, slicename=tmp_default_slice):
    
        page = Page(request)
        page.add_css_files ('css/slice-view.css')
        page.add_js_files  ( [ "js/common.functions.js" ] )
        page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
        page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
        page.add_js_chunks ('$(function() { messages.debug("sliceview: leases turned %s"); });'%("on" if do_query_leases else "off"))
        page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(ConfigEngine().manifold_url()))

        metadata = page.get_metadata()
        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]
    
        user_md = metadata.details_by_object('user')
        user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
    
        # TODO The query to run is embedded in the URL
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(
                'slice_hrn',
                #'resource.hrn', 'resource.urn', 
                'resource.hostname', 'resource.type', 
                'resource.network_hrn',
                'lease.urn',
                'user.user_hrn',
                #'application.measurement_point.counter'
        )
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hostname'
    
        query_resource_all = Query.get('resource').select(resource_fields)

        aq = AnalyzedQuery(main_query, metadata=metadata)
        page.enqueue_query(main_query, analyzed_query=aq)
        page.enqueue_query(query_resource_all)
        if do_query_users:
            # Required: the user must have an authority in its user.config
            # XXX Temporary solution
            user_query  = Query().get('local:user').select('config','email')
            user_details = execute_query(self.request, user_query)
            
            # not always found in user_details...
            config={}
#            for user_detail in user_details:
#                #email = user_detail['email']
#                if user_detail['config']:
#                    config = json.loads(user_detail['config'])
#            user_detail['authority'] = config.get('authority',"Unknown Authority")
#
#            if user_detail['authority'] is not None:
#                sub_authority = user_detail['authority'].split('.')
#                root_authority = sub_authority[0]
#                query_user_all = Query.get(root_authority+':user').select(user_fields)
#
#                # XXX TODO this filter doesn't work - to be improved in Manifold
#                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
#
#                page.enqueue_query(query_user_all)
#            else:
#                print "authority of the user is not in local:user db"
            query_user_all = Query.get('user').select(user_fields)
            #    query_user_all = None
    
        # ... and for the relations
        # XXX Let's hardcode resources for now
        sq_resource    = aq.subquery('resource')
        sq_user        = aq.subquery('user')
        sq_lease       = aq.subquery('lease')
        sq_measurement = aq.subquery('measurement')
        
    
        # Prepare the display according to all metadata
        # (some parts will be pending, others can be triggered by users).
        # 
        # For example slice measurements will not be requested by default...
    
        # Create the base layout (Stack)...
        main_stack = Stack (
            page=page,
            title="Slice %s"%slicename,
            sons=[],
        )
    
        # ... responsible for the slice properties...
    
        # a nice header
        main_stack.insert (
            Raw (page=page,
                 togglable=False, 
                 toggled=True,
                 html="<h2 class='well well-lg'> Slice %s</h2>"%slicename)
        )
    
        # --------------------------------------------------------------------------
        # QueryUpdater (Pending Operations)

        main_stack.insert(QueryUpdater(
            page                = page,
            title               = 'Pending operations',
            query               = main_query,
            togglable           = True,
            # start turned off, it will open up itself when stuff comes in
            toggled             = False, 
            domid               = 'pending',
            outline_complete    = True,
        ))

        # --------------------------------------------------------------------------
        # Filter Resources
       
# turn off for now -- see above
        filter_query_editor = QueryEditor(
            page  = page,
            query = sq_resource, 
            query_all = query_resource_all,
            title = "Select Columns",
            domid = 'select-columns',
            )
        filter_active_filters = ActiveFilters(
            page  = page,
            query = sq_resource,
            title = "Active Filters",
            )
        filters_area = Stack(
            page                = page,
            title               = 'Filter Resources',
            domid               = 'filters',
            sons                = [filter_query_editor, 
                                   filter_active_filters],
            togglable           = True,
            toggled             = 'persistent',
            outline_complete    = True, 
        )
        main_stack.insert (filters_area)

        # --------------------------------------------------------------------------
        # RESOURCES
        # the resources part is made of a Tabs (Geographic, List), 

        resources_as_gmap = GoogleMap(
            page       = page,
            title      = 'Geographic view',
            domid      = 'resources-map',
            # tab's sons preferably turn this off
            togglable  = False,
            query      = sq_resource,
            query_all  = query_resource_all,
            # this key is the one issued by google
            googlemap_api_key = ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key   = main_query_init_key,
            checkboxes = True,
            # center on Paris
            latitude   = 49.,
            longitude  = 9,
            zoom       = 4,
        )

        resources_as_3dmap = SensLabMap(
            page       = page,
            title      = '3D Map',
            domid      = 'senslabmap',
            query      = sq_resource,
            query_all  = query_resource_all,
        )

        resources_as_list = QueryTable( 
            page       = page,
            domid      = 'resources-list',
            title      = 'List view',
            # this is the query at the core of the slice list
            query      = sq_resource,
            query_all  = query_resource_all,
            init_key     = main_query_init_key,
            checkboxes = True,
            datatables_options = { 
                'iDisplayLength': 25,
                'bLengthChange' : True,
                'bAutoWidth'    : True,
                },
            )

        if insert_grid:
            resources_as_grid = QueryGrid( 
                page       = page,
                domid      = 'resources-grid',
                title      = 'Grid view',
                # this is the query at the core of the slice list
                query      = sq_resource,
                query_all  = query_resource_all,
                init_key     = main_query_init_key,
                checkboxes = True,
                )

        

        #if do_query_leases:
        #    resources_as_scheduler = Scheduler(

        #        page        = page,
        #        title       = 'Scheduler',
        #        domid       = 'scheduler',
        #        query       = sq_resource,
        #        query_all_resources = query_resource_all,
        #        query_lease = sq_lease,

        #        )

        resources_as_scheduler2 = Scheduler2( 
            page       = page,
            domid      = 'scheduler',
            title      = 'Scheduler',
            # this is the query at the core of the slice list
            query = sq_resource,
            query_all_resources = query_resource_all,
            query_lease = sq_lease,
            )
Пример #11
0
def account_process(request):
    from sfa.trust.credential               import Credential
    from sfa.trust.certificate              import Keypair

    user_query  = Query().get('local:user').select('user_id','email','password','config')
    user_details = execute_query(request, user_query)
    
    account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
    account_details = execute_query(request, account_query)

    platform_query  = Query().get('local:platform').select('platform_id','platform')
    platform_details = execute_query(request, platform_query)
    
    # getting the user_id from the session                                            
    for user_detail in user_details:                                                  
        user_id = user_detail['user_id']                                              
        user_email = user_detail['email']                                             
        try:
            if user_email == request.user.email:                                          
                authorize_query = True                                                    
            else:                                                                         
                logger.error("SECURITY: {} tried to update {}".format(user_email, request.user.email))
                messages.error(request, 'You are not authorized to modify another user.') 
                return HttpResponseRedirect("/portal/account/")                               
        except Exception as e:
            logger.error("exception in account_process {}".format(e))

    for account_detail in account_details:
        for platform_detail in platform_details:
            # Add reference account to the platforms
            if 'add_'+platform_detail['platform'] in request.POST\
               or request.POST['button_value'] == 'add_'+platform_detail['platform']:
                platform_id = platform_detail['platform_id']
                user_params = {'platform_id': platform_id, 'user_id': user_id,
                               'auth_type': "reference",
                               'config': '{"reference_platform": "myslice"}'}
                manifold_add_account(request,user_params)
                messages.info(request, 'Reference Account is added to the selected platform successfully!')
                return HttpResponseRedirect("/portal/account/")

            # Delete reference account from the platforms
            if 'delete_'+platform_detail['platform'] in request.POST\
               or request.POST['button_value'] == 'delete_'+platform_detail['platform']:
                platform_id = platform_detail['platform_id']
                user_params = {'user_id':user_id}
                manifold_delete_account(request,platform_id, user_id, user_params)
                messages.info(request, 'Reference Account is removed from the selected platform')
                return HttpResponseRedirect("/portal/account/")

            if platform_detail['platform_id'] == account_detail['platform_id']:
                if 'myslice' in platform_detail['platform']:
                    account_config = json.loads(account_detail['config'])
                    acc_slice_cred = account_config.get('delegated_slice_credentials','N/A')
                    acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
                

                    
    
    # adding the slices and corresponding credentials to list
    if 'N/A' not in acc_slice_cred:
        slice_list = []
        slice_cred = [] 
        for key, value in acc_slice_cred.iteritems():
            slice_list.append(key)       
            slice_cred.append(value)
        # special case: download each slice credentials separately 
        for i in range(0, len(slice_list)):
            if 'dl_'+slice_list[i] in request.POST or request.POST['button_value'] == 'dl_'+slice_list[i]:
                slice_detail = "Slice name: " + slice_list[i] +"\nSlice Credentials: \n"+ slice_cred[i]
                response = HttpResponse(slice_detail, content_type='text/plain')
                response['Content-Disposition'] = 'attachment; filename="slice_credential.txt"'
                return response

    # adding the authority and corresponding credentials to list
    if 'N/A' not in acc_auth_cred:
        auth_list = []
        auth_cred = [] 
        for key, value in acc_auth_cred.iteritems():
            auth_list.append(key)       
            auth_cred.append(value)
        # special case: download each slice credentials separately
        for i in range(0, len(auth_list)):
            if 'dl_'+auth_list[i] in request.POST or request.POST['button_value'] == 'dl_'+auth_list[i]:
                auth_detail = "Authority: " + auth_list[i] +"\nAuthority Credentials: \n"+ auth_cred[i]
                response = HttpResponse(auth_detail, content_type='text/plain')
                response['Content-Disposition'] = 'attachment; filename="auth_credential.txt"'
                return response

    account_detail = get_myslice_account(request)
             
    if 'submit_name' in request.POST:
        edited_first_name =  request.POST['fname']
        edited_last_name =  request.POST['lname']
        
        config={}
        for user_config in user_details:
            if user_config['config']:
                config = json.loads(user_config['config'])
                config['firstname'] = edited_first_name
                config['lastname'] = edited_last_name
                config['authority'] = config.get('authority','Unknown Authority')
                updated_config = json.dumps(config)
                user_params = {'config': updated_config}
            else: # it's needed if the config is empty 
                user_config['config'] = '{{"firstname":"{}", "lastname":"{}", "authority": "Unknown Authority"}}'\
                                        .format(edited_first_name, edited_last_name)
                user_params = {'config': user_config['config']} 
        # updating config local:user in manifold       
        manifold_update_user(request, request.user.email,user_params)
        # this will be depricated, we will show the success msg in same page
        # Redirect to same page with success message
        messages.success(request, 'Sucess: First Name and Last Name Updated.')
        return HttpResponseRedirect("/portal/account/")       
    
    elif 'submit_pass' in request.POST:
        edited_password = request.POST['password']
        
        for user_pass in user_details:
            user_pass['password'] = edited_password
        #updating password in local:user
        user_params = { 'password' : user_pass['password']}
        manifold_update_user(request, request.user.email, user_params)
#        return HttpResponse('Success: Password Changed!!')
        messages.success(request, 'Success: Password Updated.')
        return HttpResponseRedirect("/portal/account/")

# XXX TODO: Factorize with portal/registrationview.py
# XXX TODO: Factorize with portal/registrationview.py
# XXX TODO: Factorize with portal/joinview.py

    elif 'generate' in request.POST:
        try:
            private = RSA.generate(1024)
            private_key = json.dumps(private.exportKey())
            public  = private.publickey()
            public_key = json.dumps(public.exportKey(format='OpenSSH'))
            # updating manifold local:account table
            account_config = json.loads(account_detail['config'])
            # preserving user_hrn
            user_hrn = account_config.get('user_hrn','N/A')
            keypair = '{"user_public_key":'+ public_key + ', "user_private_key":'+ private_key + ', "user_hrn":"'+ user_hrn + '"}'
            #updated_config = json.dumps(account_config) 
            # updating manifold
            #user_params = { 'config': keypair, 'auth_type':'managed'}
            #manifold_update_account(request, user_id, user_params)
            # updating sfa
            public_key = public_key.replace('"', '');
            user_pub_key = {'keys': public_key}

            sfa_update_user(request, user_hrn, user_pub_key)
            result_sfa_user = sfa_get_user(request, user_hrn, public_key)
            try:
                if 'keys' in result_sfa_user and result_sfa_user['keys'][0] == public_key:
                    # updating manifold
                    updated_config = json.dumps(account_config) 
                    user_params = { 'config': keypair, 'auth_type':'managed'}
                    manifold_update_account(request, user_id, user_params)
                    messages.success(request, 'Sucess: New Keypair Generated! Delegation of your credentials will be automatic.')
                else:
                    raise Exception,"Keys are not matching"
            except Exception as e:
                messages.error(request, 'Error: An error occured during the update of your public key at the Registry, or your public key is not matching the one stored.')
                logger.error("Exception in accountview {}".format(e))
            return HttpResponseRedirect("/portal/account/")
        except Exception as e:
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
            return HttpResponseRedirect("/portal/account/")
                       
    elif 'upload_key' in request.POST:
        try:
            up_file = request.FILES['pubkey']
            file_content =  up_file.read()
            file_name = up_file.name
            file_extension = os.path.splitext(file_name)[1] 
            allowed_extension =  ['.pub','.txt']
            if file_extension in allowed_extension and re.search(r'ssh-rsa',file_content):
                account_config = json.loads(account_detail['config'])
                # preserving user_hrn
                user_hrn = account_config.get('user_hrn','N/A')
                file_content = '{"user_public_key":"'+ file_content + '", "user_hrn":"'+ user_hrn +'"}'
                #file_content = re.sub("\r", "", file_content)
                #file_content = re.sub("\n", "\\n",file_content)
                file_content = ''.join(file_content.split())
                #update manifold local:account table
                user_params = { 'config': file_content, 'auth_type':'user'}
                manifold_update_account(request, user_id, user_params)
                # updating sfa
                user_pub_key = {'keys': file_content}
                sfa_update_user(request, user_hrn, user_pub_key)
                messages.success(request, 'Publickey uploaded! Please delegate your credentials using SFA: http://trac.myslice.info/wiki/DelegatingCredentials')
                return HttpResponseRedirect("/portal/account/")
            else:
                messages.error(request, 'RSA key error: Please upload a valid RSA public key [.txt or .pub].')
                return HttpResponseRedirect("/portal/account/")

        except Exception as e:
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
            return HttpResponseRedirect("/portal/account/")

    elif 'dl_pubkey' in request.POST or request.POST['button_value'] == 'dl_pubkey':
        try:
            account_config = json.loads(account_detail['config'])
            public_key = account_config['user_public_key'] 
            response = HttpResponse(public_key, content_type='text/plain')
            response['Content-Disposition'] = 'attachment; filename="pubkey.txt"'
            return response
        except Exception as e:
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
            return HttpResponseRedirect("/portal/account/")
               
    elif 'dl_pkey' in request.POST or request.POST['button_value'] == 'dl_pkey':
        try:
            account_config = json.loads(account_detail['config'])
            if 'user_private_key' in account_config:
                private_key = account_config['user_private_key']
                response = HttpResponse(private_key, content_type='text/plain')
                response['Content-Disposition'] = 'attachment; filename="privkey.txt"'
                return response
            else:
                messages.error(request, 'Download error: Private key is not stored in the server')
                return HttpResponseRedirect("/portal/account/")

        except Exception as e:
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
            return HttpResponseRedirect("/portal/account/")
    
    elif 'delete' in request.POST or request.POST['button_value'] == 'delete':
        try:
            account_config = json.loads(account_detail['config'])
            if 'user_private_key' in account_config:
                for key in account_config.keys():
                    if key == 'user_private_key':    
                        del account_config[key]
                    
                updated_config = json.dumps(account_config)
                user_params = { 'config': updated_config, 'auth_type':'user'}
                manifold_update_account(request, user_id, user_params)
                messages.success(request, 'Private Key deleted. You need to delegate credentials manually once it expires.')
                messages.success(request, 'Once your credentials expire, Please delegate manually using SFA: http://trac.myslice.info/wiki/DelegatingCredentials')
                return HttpResponseRedirect("/portal/account/")
            else:
                messages.error(request, 'Delete error: Private key is not stored in the server')
                return HttpResponseRedirect("/portal/account/")
                          
        except Exception as e:
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')    
            return HttpResponseRedirect("/portal/account/")
    
    # download identity for jfed
    elif 'dl_identity' in request.POST or request.POST['button_value'] == 'dl_identity':
        try:
            jfed_identity = get_jfed_identity(request)
            if jfed_identity is not None:
                response = HttpResponse(jfed_identity, content_type='text/plain')
                response['Content-Disposition'] = 'attachment; filename="jfed_identity.txt"'
                return response
            else:
                messages.error(request, 'Download error: Private key is not stored in the server')
                return HttpResponseRedirect("/portal/account/")

        except Exception as e:
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
            return HttpResponseRedirect("/portal/account/")

    # Download sfi_config
    elif 'dl_sfi_config' in request.POST or request.POST['button_value'] == 'dl_sfi_config':
        platform_detail = get_myslice_platform(request)
        platform_config = json.loads(platform_detail['config'])
        account_detail = get_myslice_account(request)
        account_config = json.loads(account_detail['config'])

        user_hrn = account_config.get('user_hrn','N/A')
        t_user_hrn = user_hrn.split('.')
        authority_hrn = t_user_hrn[0] + '.' + t_user_hrn[1]
        registry = get_registry_url(request)
        import socket
        hostname = socket.gethostbyaddr(socket.gethostname())[0]
        admin_user = platform_config.get('user','N/A')
        manifold_host = ConfigEngine().manifold_url()
        if 'localhost' in manifold_host:
            manifold_host = manifold_host.replace('localhost',hostname)
        sfi_config  = '[sfi]\n'
        sfi_config += 'auth = '+ authority_hrn +'\n'
        sfi_config += 'user = '******'\n'
        sfi_config += 'registry = '+ registry +'\n'
        sfi_config += 'sm = http://sfa3.planet-lab.eu:12346/\n\n'
        sfi_config += '[myslice]\n'
        sfi_config += 'backend = '+ manifold_host +'\n'
        sfi_config += 'delegate  = '+ admin_user +'\n'
        sfi_config += 'platform  = myslice\n'
        sfi_config += 'username  = '******'\n'
        response = HttpResponse(sfi_config, content_type='text/plain')
        response['Content-Disposition'] = 'attachment; filename="sfi_config"'
        return response

    #clear all creds
    elif 'clear_cred' in request.POST or request.POST['button_value'] == 'clear_cred':
        try:
            result = clear_user_creds(request, user_email)
            if result is not None: 
                messages.success(request, 'All Credentials cleared')
            else:
                messages.error(request, 'Delete error: Credentials are not stored in the server')
        except Exception as e:
            logger.error("Exception in accountview.py in clear_user_creds {}".format(e))
            messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
        return HttpResponseRedirect("/portal/account/")

    # Download delegated_user_cred
    elif 'dl_user_cred' in request.POST or request.POST['button_value'] == 'dl_user_cred':
        if 'delegated_user_credential' in account_config:
            user_cred = account_config['delegated_user_credential']
            response = HttpResponse(user_cred, content_type='text/plain')
            response['Content-Disposition'] = 'attachment; filename="user_cred.txt"'
            return response
        else:
            messages.error(request, 'Download error: User credential is not stored in the server')
            return HttpResponseRedirect("/portal/account/")

    # Download user_cert
    elif 'dl_user_cert' in request.POST or request.POST['button_value'] == 'dl_user_cert':
        if 'user_credential' in account_config:
            user_cred = account_config['user_credential']
            obj_cred = Credential(string=user_cred)
            obj_gid = obj_cred.get_gid_object()
            str_cert = obj_gid.save_to_string()
            response = HttpResponse(str_cert, content_type='text/plain')
            response['Content-Disposition'] = 'attachment; filename="user_certificate.pem"'
            return response

        elif 'delegated_user_credential' in account_config:
            user_cred = account_config['delegated_user_credential']
            obj_cred = Credential(string=user_cred)
            obj_gid = obj_cred.get_gid_object()
            str_cert = obj_gid.save_to_string()
            response = HttpResponse(str_cert, content_type='text/plain')
            response['Content-Disposition'] = 'attachment; filename="user_certificate.pem"'
            return response
        else:
            messages.error(request, 'Download error: User credential is not stored in the server')
            return HttpResponseRedirect("/portal/account/")

    # Download user p12 = private_key + Certificate
    elif 'dl_user_p12' in request.POST or request.POST['button_value'] == 'dl_user_p12':
        if 'user_credential' in account_config and 'user_private_key' in account_config:
            user_cred = account_config['user_credential']
            obj_cred = Credential(string=user_cred)
            obj_gid = obj_cred.get_gid_object()
            str_cert = obj_gid.save_to_string()
            cert = crypto.load_certificate(crypto.FILETYPE_PEM, str_cert)

            user_private_key = account_config['user_private_key'].encode('ascii')
            pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, user_private_key)

            p12 = crypto.PKCS12()
            p12.set_privatekey(pkey)
            p12.set_certificate(cert)       
            pkcs12 = p12.export()

            response = HttpResponse(pkcs12, content_type='text/plain')
            response['Content-Disposition'] = 'attachment; filename="user_pkcs.p12"'
            return response

        elif 'delegated_user_credential' in account_config and 'user_private_key' in account_config:
            user_cred = account_config['delegated_user_credential']
            obj_cred = Credential(string=user_cred)
            obj_gid = obj_cred.get_gid_object()
            str_cert = obj_gid.save_to_string()
            cert = crypto.load_certificate(crypto.FILETYPE_PEM, str_cert)

            user_private_key = account_config['user_private_key'].encode('ascii')
            pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, user_private_key)

            p12 = crypto.PKCS12()
            p12.set_privatekey(pkey)
            p12.set_certificate(cert)       
            pkcs12 = p12.export()

            response = HttpResponse(pkcs12, content_type='text/plain')
            response['Content-Disposition'] = 'attachment; filename="user_pkcs.p12"'
            return response
        else:
            messages.error(request, 'Download error: User private key or credential is not stored in the server')
            return HttpResponseRedirect("/portal/account/")

    else:
        messages.info(request, 'Under Construction. Please try again later!')
        return HttpResponseRedirect("/portal/account/")