)]}'
{"neutron/agent/common/agent_extension_api.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"698098550c20ead8028de5005c20045d86ee1153","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class BaseAgentExtensionAPI(object):"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    _clasifications \u003d {}"},{"line_number":20,"context_line":"    _classification_groups \u003d {}"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def register_classification(self, classification_id, classification):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_cf062fcf","line":19,"range":{"start_line":19,"start_character":4,"end_line":19,"end_character":19},"updated":"2019-03-14 05:10:57.000000000","message":"_classifications","commit_id":"1d4c0a000fae797121e5b6b5d3b7f3aa0c0b4ab5"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"e7458ebf76c2a884bc74473af1f410a6384062be","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class BaseAgentExtensionAPI(object):"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    _clasifications \u003d {}"},{"line_number":20,"context_line":"    _classification_groups \u003d {}"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def register_classification(self, classification_id, classification):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_38dcd6e2","line":19,"range":{"start_line":19,"start_character":4,"end_line":19,"end_character":19},"in_reply_to":"5fc1f717_cf062fcf","updated":"2019-05-04 05:08:05.000000000","message":"ack","commit_id":"1d4c0a000fae797121e5b6b5d3b7f3aa0c0b4ab5"}],"neutron/agent/l2/extensions/qos.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"6490da1c831697c0482abd3cfdd296d9e52d4f78","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class QosAgentExtension(l2_extension.L2AgentExtension):"},{"line_number":198,"context_line":"    SUPPORTED_RESOURCE_TYPES \u003d [resources.QOS_POLICY,"},{"line_number":199,"context_line":"                                constants.CLASSIFICATION_GROUP,"},{"line_number":200,"context_line":"                                constants.CLASSIFICATION_BASE,"},{"line_number":201,"context_line":"                                constants.IPV4_CLASSIFICATION,"},{"line_number":202,"context_line":"                                constants.IPV6_CLASSIFICATION,"},{"line_number":203,"context_line":"                                constants.ETHERNET_CLASSIFICATION,"},{"line_number":204,"context_line":"                                constants.TCP_CLASSIFICATION,"},{"line_number":205,"context_line":"                                constants.UDP_CLASSIFICATION, ]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def initialize(self, connection, driver_type):"},{"line_number":208,"context_line":"        \"\"\"Initialize agent extension.\"\"\""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        self.resource_rpc \u003d resources_rpc.ResourcesPullRpcApi()"},{"line_number":211,"context_line":"        self.qos_driver \u003d manager.NeutronManager.load_class_for_provider("},{"line_number":212,"context_line":"            \u0027neutron.qos.agent_drivers\u0027, driver_type)()"},{"line_number":213,"context_line":"        self.qos_driver.consume_api(self.agent_api)"},{"line_number":214,"context_line":"        self.qos_driver.initialize()"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        self.policy_map \u003d PortPolicyMap()"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        self._register_rpc_consumers(connection)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def consume_api(self, agent_api):"},{"line_number":221,"context_line":"        \"\"\"Allows an extension to gain access to resources internal to the"},{"line_number":222,"context_line":"           neutron agent and otherwise unavailable to the extension."},{"line_number":223,"context_line":"        \"\"\""},{"line_number":224,"context_line":"        self.agent_api \u003d agent_api"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _register_rpc_consumers(self, connection):"},{"line_number":227,"context_line":"        \"\"\"Allows an extension to receive notifications of updates made to"},{"line_number":228,"context_line":"           items of interest."},{"line_number":229,"context_line":"        \"\"\""},{"line_number":230,"context_line":"        endpoints \u003d [resources_rpc.ResourcesPushRpcCallback()]"},{"line_number":231,"context_line":"        for resource_type in self.SUPPORTED_RESOURCE_TYPES:"},{"line_number":232,"context_line":"            # We assume that the neutron server always broadcasts the latest"},{"line_number":233,"context_line":"            # version known to the agent"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            # NOTE(davidsha): try except to cover when Neutron Classifier is"},{"line_number":236,"context_line":"            #                 not present in a deployment"},{"line_number":237,"context_line":"            try:"},{"line_number":238,"context_line":"                registry.register(self._handle_notification, resource_type)"},{"line_number":239,"context_line":"                topic \u003d resources_rpc.resource_type_versioned_topic("},{"line_number":240,"context_line":"                            resource_type)"},{"line_number":241,"context_line":"                connection.create_consumer(topic, endpoints, fanout\u003dTrue)"},{"line_number":242,"context_line":"            except Exception:"},{"line_number":243,"context_line":"                pass"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    @lockutils.synchronized(\u0027qos-port\u0027)"},{"line_number":246,"context_line":"    def _handle_notification(self, context, resource_type, rpc_objs,"},{"line_number":247,"context_line":"                             event_type):"},{"line_number":248,"context_line":"        # server does not allow to remove a policy that is attached to any"},{"line_number":249,"context_line":"        # port, so we ignore DELETED events. Also, if we receive a CREATED"},{"line_number":250,"context_line":"        # event for a policy, it means that there are no ports so far that are"},{"line_number":251,"context_line":"        # attached to it. That\u0027s why we are interested in UPDATED events only"},{"line_number":252,"context_line":"        if (event_type \u003d\u003d events.UPDATED and"},{"line_number":253,"context_line":"                resource_type \u003d\u003d resources.QOS_POLICY):"},{"line_number":254,"context_line":"            for qos_policy in rpc_objs:"},{"line_number":255,"context_line":"                self._process_update_policy(qos_policy)"},{"line_number":256,"context_line":"        elif (event_type \u003d\u003d events.CREATED and"},{"line_number":257,"context_line":"                \"Classification\" in resource_type):"},{"line_number":258,"context_line":"            for classification in rpc_objs:"},{"line_number":259,"context_line":"                LOG.info(\"Creation of Classification type %(resource_type)\""},{"line_number":260,"context_line":"                         \" recieved.\", {\u0027resource_type\u0027: resource_type})"},{"line_number":261,"context_line":"        elif (event_type \u003d\u003d events.DELETED and"},{"line_number":262,"context_line":"                \"Classification\" in resource_type):"},{"line_number":263,"context_line":"            for classification in rpc_objs:"},{"line_number":264,"context_line":"                LOG.info(\"Deletion of Classification type %(resource_type)\""},{"line_number":265,"context_line":"                         \" recieved.\", {\u0027resource_type\u0027: resource_type})"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    @lockutils.synchronized(\u0027qos-port\u0027)"},{"line_number":268,"context_line":"    def handle_port(self, context, port):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_84b7b8d8","line":265,"range":{"start_line":198,"start_character":0,"end_line":265,"end_character":72},"updated":"2019-02-26 15:42:48.000000000","message":"Will be removed in next PS, used to test QoS was receiving classification creation and deletion events.","commit_id":"40310212a68b3b4cc1c1789474bccea19052402f"}],"neutron/agent/l3/l3_agent_extension_api.py":[{"author":{"_account_id":9396,"name":"igordcard","email":"igordcard@gmail.com","username":"igordcard"},"change_message_id":"698098550c20ead8028de5005c20045d86ee1153","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class L3AgentExtensionAPI(agent_extension_api.BaseAgentExtensionAPI):"},{"line_number":21,"context_line":"    \u0027\u0027\u0027Implements the Agent API for the L3 agent."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    Extensions can gain access to this API by overriding the consume_api"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_ef0bebd2","line":20,"updated":"2019-03-14 05:10:57.000000000","message":"Why?","commit_id":"1d4c0a000fae797121e5b6b5d3b7f3aa0c0b4ab5"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"e7458ebf76c2a884bc74473af1f410a6384062be","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class L3AgentExtensionAPI(agent_extension_api.BaseAgentExtensionAPI):"},{"line_number":21,"context_line":"    \u0027\u0027\u0027Implements the Agent API for the L3 agent."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    Extensions can gain access to this API by overriding the consume_api"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_c9a2a7ae","line":20,"in_reply_to":"5fc1f717_ef0bebd2","updated":"2019-05-04 05:08:05.000000000","message":"Why L3?\nWhen we were collecting use cases for Neutron Classifier early on a few of the projects had developed L3 extensions and seemed interested in consuming classifications for their L3 extensions.\nIt also just seemed to make sense to expose it in every agent extension api rather than just L2 since L2 and L3 extensions were modeled so similarly.","commit_id":"1d4c0a000fae797121e5b6b5d3b7f3aa0c0b4ab5"}],"neutron/plugins/ml2/drivers/openvswitch/agent/extension_drivers/classification_helper.py":[{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"5049a2f878df8aa9e0a6bf56fccdf994871df6d1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                     \u0027dst_port_min\u0027: \u0027tp_dst\u0027, \u0027dst_port_max\u0027: \u0027tp_dst\u0027}}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def _ctc_generic(class_dict):"},{"line_number":37,"context_line":"    output_dict \u003d {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    for key in class_dict.keys():"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_8ae11d2d","line":36,"range":{"start_line":36,"start_character":5,"end_line":36,"end_character":8},"updated":"2019-07-12 19:25:56.000000000","message":"Add a small note near the top, about class to command (ctc). Or make _convert_class_to_command the first function in file to set the mindset for \"ctc\".","commit_id":"1ca432ef4f1132fe9b475476adf321ea53583737"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"b7f9d87391c7ff6417022cba30d102668842e88d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                     \u0027dst_port_min\u0027: \u0027tp_dst\u0027, \u0027dst_port_max\u0027: \u0027tp_dst\u0027}}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def _ctc_generic(class_dict):"},{"line_number":37,"context_line":"    output_dict \u003d {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    for key in class_dict.keys():"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_3714f043","line":36,"range":{"start_line":36,"start_character":5,"end_line":36,"end_character":8},"in_reply_to":"7faddb67_8ae11d2d","updated":"2019-07-16 10:16:20.000000000","message":"Will do, this patch is probably in for a massive rebase soon just as a heads up.","commit_id":"1ca432ef4f1132fe9b475476adf321ea53583737"}]}
