class SingleEntityJungler(object):
    """
    Handles requests concerning single entities

    """

    def __init__(self):

        self.manager_r = ResourceManager()
        self.manager_l = LinkManager()
        self.rd_baker = ResourceDataBaker()
        self.PostMan = PostMan()

    def channel_put_single_resource(self, jBody, path_url):
        """
        Creates a new resource or performs a full update of the resource description
        Args:
            @param jBody: Data contained in the request body
            @param path_url: URL of the request
        """

        #Step[1]: Get the data necessary from the database

        db_occi_ids_locs,db_resources_nb = self.rd_baker.bake_to_put_single(path_url)

        if db_occi_ids_locs is None or db_resources_nb is None:

            return "An error has occurred, please check log for more details",return_code['Internal Server Error']
        else:

            if db_resources_nb is 0:

                #Step[2a]: This is a create a new resource request with a custom URL

                if jBody.has_key('resources'):
                    logger.debug("===== Channel_put_single_resources ==== : Resource custom creation channeled")
                    entity, resp_code_r = self.manager_r.register_custom_resource(jBody['resources'][0],path_url,db_occi_ids_locs)
                else:
                    resp_code_r = return_code['OK, and location returned']

                if jBody.has_key('links'):
                    logger.debug("===== Channel_put_single_resources ==== : Link custom creation channeled")
                    entity, resp_code_l = self.manager_l.register_custom_link(jBody['links'][0],path_url,db_occi_ids_locs)
                else:
                    resp_code_l = return_code['OK, and location returned']

                if resp_code_r is not return_code['OK, and location returned'] or resp_code_l is not return_code['OK, and location returned']:
                    return "An error has occurred, please check log for more details",return_code['Bad Request']

                self.PostMan.save_custom_resource(entity)
                logger.debug("===== Channel_put_single_resource ==== : Finished (2a) with success")
                backend_m.create_entity(entity)

                #Step[3a]: Return the locations of the resources
                return entity['OCCI_Location'],return_code['OK, and location returned']

            else:
                #Step[2b]: This is a full update resource request (More data is needed)

                olddoc = self.rd_baker.bake_to_put_single_updateCase(path_url)

                if olddoc is None:
                    return "An error has occurred, please check log for more details",return_code['Bad Request']
                else:
                    if jBody.has_key('resources'):
                        logger.debug("===== Channel_put_single_resources ==== : Resource full update channeled")
                        entity, resp_code_r = self.manager_r.update_resource(olddoc,jBody['resources'][0])
                    else:
                        resp_code_r = return_code['OK, and location returned']

                    if jBody.has_key('links'):
                        logger.debug("===== Channel_put_single_resources ==== : Link full update channeled")
                        entity, resp_code_l = self.manager_l.update_link(olddoc,jBody['links'][0])
                    else:
                        resp_code_l = return_code['OK, and location returned']

                    if resp_code_r is not return_code['OK, and location returned'] or resp_code_l is not return_code['OK, and location returned']:
                        return "An error has occurred, please check log for more details",return_code['Bad Request']



                    self.PostMan.save_updated_doc_in_db(entity)

                    logger.debug("===== Channel_put_single_resource ==== : Finished (2b) with success")
                    #return the locations of the resources

                    backend_m.update_entity(olddoc['OCCI_Description'],entity['OCCI_Description'])

                    return olddoc['OCCI_Location'],return_code['OK, and location returned']

    def channel_get_single_resource(self, path_url):
        """
        Retrieve the description of a resource related to the URL provided
        Args:
            @param path_url: URL of the request
        """
        #Step[1]: Get data from the database
        res,entity = self.rd_baker.bake_to_get_single_res(path_url)

        if res is None:

            return "An error has occured, please check logs for more details", return_code['Internal Server Error']

        elif res is 0:
            logger.warning("===== Channel_get_single_resource ==== : Resource not found")

        else:
            logger.debug("===== Channel_get_single_resource ==== : Finished with success")

            #Step[2]: return OCCI resource description to the dispatcher

            return res,return_code['OK']

    def channel_post_single_resource(self, jBody, path_url):
        """
        Performs a partial description update of the resource
        Args:
            @param jBody: New OCCI values
            @param path_url: URL of the request
        """

        #Step[1]: Get the necessary data from the database
        db_occi_ids_locs,old_doc = self.rd_baker.bake_to_post_single(path_url)

        if old_doc is 0:

            logger.error("===== Channel_post_single_resource ==== : Resource not found")
            return "An error has occurred, please check logs for more details",return_code['Internal Server Error']

        else:

            old_data = old_doc['OCCI_Description']
            entity = dict()

            #Step[2]: update only the part that exist in both the new values and the old resource description

            if jBody.has_key('resources'):

                logger.debug("===== Channel_post_single_resource ==== : Resource was found and channeled")
                entity, resp_code_r = self.manager_r.partial_resource_update(old_doc['OCCI_Description'],jBody['resources'][0])

            else:
                logger.debug("===== Channel_post_single_resource ==== : No Resource was found")
                resp_code_r = return_code['OK, and location returned']

            if jBody.has_key('links'):
                logger.debug("===== Channel_post_single_resource ==== : Link was found and channeled")
                entity, resp_code_l = self.manager_l.partial_link_update(old_doc['OCCI_Description'],jBody['links'][0])
            else:
                logger.debug("===== Channel_post_single_resource ==== : No Link was found")
                resp_code_l = return_code['OK, and location returned']

            if resp_code_r is not return_code['OK, and location returned'] or resp_code_l is not return_code['OK, and location returned']:

                return "An error has occurred, please check log for more details",return_code['Bad Request']

            old_doc['OCCI_Description'] = entity

            self.PostMan.save_partial_updated_doc_in_db(old_doc)

            logger.debug("===== Channel_post_single_resource ==== : Finished with success")
            backend_m.update_entity(old_data,entity)

            #Step[3]: Return the locations of the resource
            return old_doc['OCCI_Location'],return_code['OK, and location returned']

    def channel_delete_single_resource(self, path_url):
        """
        Delete a resource instance
        Args:
            @param path_url: URL of the resource
        """

        #Step[1]: Get the necessary data from the database
        res,res_value = self.rd_baker.bake_to_delete_single_resource(path_url)

        if res is None:

            return "An error has occured, please check logs for more details", return_code['Internal Server Error']

        elif res is 0:
            logger.warning("===== Channel_delete_single_resource ==== : Resource not found")
        else:
            #Step[2]: Instruct the post man to delete the OCCI resource from the database
            self.PostMan.delete_single_resource_in_db(res_value)

            #Note: Save the entity description to send it to the backend
            entity = res_value['OCCI_Description']

            backend_m.delete_entity(entity,entity['kind'])
            logger.debug("===== Channel_delete_single_resource ==== : Finished with success")
            return "",return_code['OK']

    def channel_triggered_action_single(self, jBody, path_url, triggered_action):
        """
        Trigger the action on the resource
        Args:
            @param jBody: Data provided
            @param path_url: URL of the request
            @param triggered_action: Action name to trigger
        """

        #Step[1]: Get the necessary data from DB

        nb_res, value_res = self.rd_baker.bake_to_trigger_action_on_single_resource(path_url)

        if nb_res is None:
            return "An error has occurred, please check log for more details",return_code['Internal Server Error']

        elif nb_res is 0:
            return "An error has occurred, please check log for more details",return_code['Not Found']

        else:
            #Step[2]: Identify the provider
            provider = self.rd_baker.bake_to_get_provider(value_res[0])

            #Step[3]: Get the attributes if there are ones

            if jBody.has_key('attributes') is True:

                parameters = jBody['attributes']

            else:

                parameters = None

            if provider is None:
                return "An error has occurred, please check log for more details",return_code['Internal Server Error']

            else:
                #Step[4]: Trigger the action on the resources
                resp, resp_code = backend_m.trigger_action_on_a_resource(value_res[1],triggered_action,provider['local'][0],parameters)
                logger.debug("===== Channel_triggered_action_single ==== : Finished with success")
                return resp,return_code['OK']
Ejemplo n.º 2
0
class SingleEntityJungler(object):
    """
    Handles requests concerning single entities

    """
    def __init__(self):

        self.manager_r = ResourceManager()
        self.manager_l = LinkManager()
        self.rd_baker = ResourceDataBaker()
        self.PostMan = PostMan()

    def channel_put_single_resource(self, jBody, path_url):
        """
        Creates a new resource or performs a full update of the resource description
        Args:
            @param jBody: Data contained in the request body
            @param path_url: URL of the request
        """

        #Step[1]: Get the data necessary from the database

        db_occi_ids_locs, db_resources_nb = self.rd_baker.bake_to_put_single(
            path_url)

        if db_occi_ids_locs is None or db_resources_nb is None:

            return "An error has occurred, please check log for more details", return_code[
                'Internal Server Error']
        else:

            if db_resources_nb is 0:

                #Step[2a]: This is a create a new resource request with a custom URL

                if jBody.has_key('resources'):
                    logger.debug(
                        "===== Channel_put_single_resources ==== : Resource custom creation channeled"
                    )
                    entity, resp_code_r = self.manager_r.register_custom_resource(
                        jBody['resources'][0], path_url, db_occi_ids_locs)
                else:
                    resp_code_r = return_code['OK, and location returned']

                if jBody.has_key('links'):
                    logger.debug(
                        "===== Channel_put_single_resources ==== : Link custom creation channeled"
                    )
                    entity, resp_code_l = self.manager_l.register_custom_link(
                        jBody['links'][0], path_url, db_occi_ids_locs)
                else:
                    resp_code_l = return_code['OK, and location returned']

                if resp_code_r is not return_code[
                        'OK, and location returned'] or resp_code_l is not return_code[
                            'OK, and location returned']:
                    return "An error has occurred, please check log for more details", return_code[
                        'Bad Request']

                self.PostMan.save_custom_resource(entity)
                logger.debug(
                    "===== Channel_put_single_resource ==== : Finished (2a) with success"
                )
                backend_m.create_entity(entity)

                #Step[3a]: Return the locations of the resources
                return entity['OCCI_Location'], return_code[
                    'OK, and location returned']

            else:
                #Step[2b]: This is a full update resource request (More data is needed)

                olddoc = self.rd_baker.bake_to_put_single_updateCase(path_url)

                if olddoc is None:
                    return "An error has occurred, please check log for more details", return_code[
                        'Bad Request']
                else:
                    if jBody.has_key('resources'):
                        logger.debug(
                            "===== Channel_put_single_resources ==== : Resource full update channeled"
                        )
                        entity, resp_code_r = self.manager_r.update_resource(
                            olddoc, jBody['resources'][0])
                    else:
                        resp_code_r = return_code['OK, and location returned']

                    if jBody.has_key('links'):
                        logger.debug(
                            "===== Channel_put_single_resources ==== : Link full update channeled"
                        )
                        entity, resp_code_l = self.manager_l.update_link(
                            olddoc, jBody['links'][0])
                    else:
                        resp_code_l = return_code['OK, and location returned']

                    if resp_code_r is not return_code[
                            'OK, and location returned'] or resp_code_l is not return_code[
                                'OK, and location returned']:
                        return "An error has occurred, please check log for more details", return_code[
                            'Bad Request']

                    self.PostMan.save_updated_doc_in_db(entity)

                    logger.debug(
                        "===== Channel_put_single_resource ==== : Finished (2b) with success"
                    )
                    #return the locations of the resources

                    backend_m.update_entity(olddoc['OCCI_Description'],
                                            entity['OCCI_Description'])

                    return olddoc['OCCI_Location'], return_code[
                        'OK, and location returned']

    def channel_get_single_resource(self, path_url):
        """
        Retrieve the description of a resource related to the URL provided
        Args:
            @param path_url: URL of the request
        """
        #Step[1]: Get data from the database
        res, entity = self.rd_baker.bake_to_get_single_res(path_url)

        if res is None:

            return "An error has occured, please check logs for more details", return_code[
                'Internal Server Error']

        elif res is 0:
            logger.warning(
                "===== Channel_get_single_resource ==== : Resource not found")

        else:
            logger.debug(
                "===== Channel_get_single_resource ==== : Finished with success"
            )

            #Step[2]: return OCCI resource description to the dispatcher

            return res, return_code['OK']

    def channel_post_single_resource(self, jBody, path_url):
        """
        Performs a partial description update of the resource
        Args:
            @param jBody: New OCCI values
            @param path_url: URL of the request
        """

        #Step[1]: Get the necessary data from the database
        db_occi_ids_locs, old_doc = self.rd_baker.bake_to_post_single(path_url)

        if old_doc is 0:

            logger.error(
                "===== Channel_post_single_resource ==== : Resource not found")
            return "An error has occurred, please check logs for more details", return_code[
                'Internal Server Error']

        else:

            old_data = old_doc['OCCI_Description']
            entity = dict()

            #Step[2]: update only the part that exist in both the new values and the old resource description

            if jBody.has_key('resources'):

                logger.debug(
                    "===== Channel_post_single_resource ==== : Resource was found and channeled"
                )
                entity, resp_code_r = self.manager_r.partial_resource_update(
                    old_doc['OCCI_Description'], jBody['resources'][0])

            else:
                logger.debug(
                    "===== Channel_post_single_resource ==== : No Resource was found"
                )
                resp_code_r = return_code['OK, and location returned']

            if jBody.has_key('links'):
                logger.debug(
                    "===== Channel_post_single_resource ==== : Link was found and channeled"
                )
                entity, resp_code_l = self.manager_l.partial_link_update(
                    old_doc['OCCI_Description'], jBody['links'][0])
            else:
                logger.debug(
                    "===== Channel_post_single_resource ==== : No Link was found"
                )
                resp_code_l = return_code['OK, and location returned']

            if resp_code_r is not return_code[
                    'OK, and location returned'] or resp_code_l is not return_code[
                        'OK, and location returned']:

                return "An error has occurred, please check log for more details", return_code[
                    'Bad Request']

            old_doc['OCCI_Description'] = entity

            self.PostMan.save_partial_updated_doc_in_db(old_doc)

            logger.debug(
                "===== Channel_post_single_resource ==== : Finished with success"
            )
            backend_m.update_entity(old_data, entity)

            #Step[3]: Return the locations of the resource
            return old_doc['OCCI_Location'], return_code[
                'OK, and location returned']

    def channel_delete_single_resource(self, path_url):
        """
        Delete a resource instance
        Args:
            @param path_url: URL of the resource
        """

        #Step[1]: Get the necessary data from the database
        res, res_value = self.rd_baker.bake_to_delete_single_resource(path_url)

        if res is None:

            return "An error has occured, please check logs for more details", return_code[
                'Internal Server Error']

        elif res is 0:
            logger.warning(
                "===== Channel_delete_single_resource ==== : Resource not found"
            )
        else:
            #Step[2]: Instruct the post man to delete the OCCI resource from the database
            self.PostMan.delete_single_resource_in_db(res_value)

            #Note: Save the entity description to send it to the backend
            entity = res_value['OCCI_Description']

            backend_m.delete_entity(entity, entity['kind'])
            logger.debug(
                "===== Channel_delete_single_resource ==== : Finished with success"
            )
            return "", return_code['OK']

    def channel_triggered_action_single(self, jBody, path_url,
                                        triggered_action):
        """
        Trigger the action on the resource
        Args:
            @param jBody: Data provided
            @param path_url: URL of the request
            @param triggered_action: Action name to trigger
        """

        #Step[1]: Get the necessary data from DB

        nb_res, value_res = self.rd_baker.bake_to_trigger_action_on_single_resource(
            path_url)

        if nb_res is None:
            return "An error has occurred, please check log for more details", return_code[
                'Internal Server Error']

        elif nb_res is 0:
            return "An error has occurred, please check log for more details", return_code[
                'Not Found']

        else:
            #Step[2]: Identify the provider
            provider = self.rd_baker.bake_to_get_provider(value_res[0])

            #Step[3]: Get the attributes if there are ones

            if jBody.has_key('attributes') is True:

                parameters = jBody['attributes']

            else:

                parameters = None

            if provider is None:
                return "An error has occurred, please check log for more details", return_code[
                    'Internal Server Error']

            else:
                #Step[4]: Trigger the action on the resources
                resp, resp_code = backend_m.trigger_action_on_a_resource(
                    value_res[1], triggered_action, provider['local'][0],
                    parameters)
                logger.debug(
                    "===== Channel_triggered_action_single ==== : Finished with success"
                )
                return resp, return_code['OK']