Commit 7465e6de authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Intermediate Device component backup:

- reorganized some files and modules
- implemented discovery of device endpoints for OpenConfig driver
- implemented retrieval of current configuration for OpenConfig driver
- updated test units and separated in emulated and openconfig test sets
parent dfa0d98d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
drx30-01.xml
*.xml
+49 −9
Original line number Diff line number Diff line
import grpc, json, logging
from typing import Any, List, Tuple
import grpc, logging
from google.protobuf.json_format import MessageToDict
from common.orm.Database import Database
from common.orm.Factory import get_database_backend
from common.orm.HighLevel import get_object, update_or_create_object
@@ -12,6 +13,7 @@ from context.client.ContextClient import ContextClient
from device.proto.context_pb2 import ConfigActionEnum, Device, DeviceConfig, DeviceId, Empty
from device.proto.device_pb2 import MonitoringSettings
from device.proto.device_pb2_grpc import DeviceServiceServicer
from device.service.drivers.openconfig.OpenConfigDriver import OpenConfigDriver
from .MonitoringLoops import MonitoringLoops
from .database.ConfigModel import (
    ConfigModel, ConfigRuleModel, ORM_ConfigActionEnum, get_config_rules, grpc_config_rules_to_raw, update_config)
@@ -22,7 +24,7 @@ from .database.DeviceModel import DeviceModel, DriverModel
from .database.EndPointModel import EndPointModel
from .database.KpiModel import KpiModel
from .database.KpiSampleType import grpc_to_enum__kpi_sample_type
from .driver_api._Driver import _Driver
from .driver_api._Driver import _Driver, RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES
from .driver_api.DriverInstanceCache import DriverInstanceCache
from .driver_api.Tools import (
    check_delete_errors, check_set_errors, check_subscribe_errors, check_unsubscribe_errors)
@@ -59,11 +61,36 @@ class DeviceServiceServicerImpl(DeviceServiceServicer):
            else:
                unexpected_config_rules.append(config_rule)
        if len(unexpected_config_rules) > 0:
            unexpected_config_rules = MessageToDict(
                request.device_config, including_default_value_fields=True,
                preserving_proto_field_name=True, use_integers_for_enums=True)
            unexpected_config_rules = unexpected_config_rules['config_rules']
            unexpected_config_rules = list(filter(
                lambda cr: cr['resource_key'].replace('_connect/', '') not in connection_config_rules,
                unexpected_config_rules))
            str_unexpected_config_rules = json.dumps(unexpected_config_rules, sort_keys=True)
            raise InvalidArgumentException(
                'device.device_config.config_rules', str(unexpected_config_rules),
                'device.device_config.config_rules', str_unexpected_config_rules,
                extra_details='RPC method AddDevice only accepts connection Config Rules that should start '\
                              'with "_connect/" tag. Others should be configured after adding the device.')

        if len(request.device_endpoints) > 0:
            unexpected_endpoints = MessageToDict(
                request.device_endpoints, including_default_value_fields=True, preserving_proto_field_name=True,
                use_integers_for_enums=True)
            str_unexpected_endpoints = json.dumps(unexpected_endpoints, sort_keys=True)
            raise InvalidArgumentException(
                'device.device_endpoints', str_unexpected_endpoints,
                extra_details='RPC method AddDevice does not accept endpoints. Endpoints are discovered through '\
                              'interrogation of the physical device.')

        # Remove device configuration
        json_request = MessageToDict(
            request, including_default_value_fields=True, preserving_proto_field_name=True,
            use_integers_for_enums=True)
        json_request['device_config'] = {}
        request = Device(**json_request)

        sync_device_from_context(device_uuid, self.context_client, self.database)
        db_device,_ = update_device_in_local_database(self.database, request)

@@ -76,12 +103,25 @@ class DeviceServiceServicerImpl(DeviceServiceServicer):
            settings=connection_config_rules)
        driver.Connect()

        running_config_rules = driver.GetConfig()
        running_config_rules = [(ORM_ConfigActionEnum.SET, rule[0], rule[1]) for rule in running_config_rules]
        LOGGER.info('[AddDevice] running_config_rules = {:s}'.format(str(running_config_rules)))
        endpoints = driver.GetConfig([RESOURCE_ENDPOINTS])
        for _, resource_value in endpoints:
            endpoint_uuid = resource_value.get('name')
            endpoint_type = resource_value.get('type')
            str_endpoint_key = key_to_str([device_uuid, endpoint_uuid])
            update_or_create_object(
                self.database, EndPointModel, str_endpoint_key, {
                'device_fk'    : db_device,
                'endpoint_uuid': endpoint_uuid,
                'endpoint_type': endpoint_type,
            })

        running_config_rules = driver.GetConfig([RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES])
        running_config_rules = [(ORM_ConfigActionEnum.SET, cr[0], json.dumps(cr[1])) for cr in running_config_rules]
        #for running_config_rule in running_config_rules:
        #    LOGGER.info('[AddDevice] running_config_rule: {:s}'.format(str(running_config_rule)))

        context_config_rules = get_config_rules(self.database, device_uuid, 'running')
        LOGGER.info('[AddDevice] context_config_rules = {:s}'.format(str(context_config_rules)))
        #context_config_rules = get_config_rules(self.database, device_uuid, 'running')
        #LOGGER.info('[AddDevice] context_config_rules = {:s}'.format(str(context_config_rules)))

        # TODO: Compute diff between current context config and device config. The one in device is of higher priority
        # (might happen another instance is updating config and context was not already updated)
+0 −2
Original line number Diff line number Diff line
import anytree
from typing import Any, List, Optional

from anytree.render import Row

class TreeNode(anytree.node.Node):
    def __init__(self, name, parent=None, children=None, **kwargs) -> None:
        super().__init__(name, parent=parent, children=children, **kwargs)
+5 −0
Original line number Diff line number Diff line
from typing import Any, Iterator, List, Optional, Tuple, Union

# Special resource names
RESOURCE_ENDPOINTS         = '__endpoints__'
RESOURCE_INTERFACES        = '__interfaces__'
RESOURCE_NETWORK_INSTANCES = '__network_instances__'

class _Driver:
    def __init__(self, address : str, port : int, **settings) -> None:
        """ Initialize Driver.
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ DRIVERS = [
    (EmulatedDriver, [
        {
            FilterFieldEnum.DEVICE_TYPE: DeviceTypeFilterFieldEnum.EMULATED,
            FilterFieldEnum.DRIVER     : ORM_DeviceDriverEnum.OPENCONFIG,
            FilterFieldEnum.DRIVER     : ORM_DeviceDriverEnum.UNDEFINED,
        }
    ]),
    (OpenConfigDriver, [
Loading