Commit 4d208111 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Merge branch...

Merge branch 'feat/367-cttc-end-to-end-integration-test-with-etsi-osm-ro-ietf-l2vpn' of ssh://gifrerenom_labs.etsi.org/tfs/controller into feat/367-cttc-end-to-end-integration-test-with-etsi-osm-ro-ietf-l2vpn
parents 4fe67bb9 5c94115b
Loading
Loading
Loading
Loading
+38 −38
Original line number Diff line number Diff line
@@ -28,44 +28,44 @@ workflow:

# include the individual .gitlab-ci.yml of each micro-service and tests
include:
#  #- local: '/manifests/.gitlab-ci.yml'
#  - local: '/src/monitoring/.gitlab-ci.yml'
#  - local: '/src/nbi/.gitlab-ci.yml'
#  - local: '/src/context/.gitlab-ci.yml'
#  - local: '/src/device/.gitlab-ci.yml'
#  - local: '/src/service/.gitlab-ci.yml'
#  - local: '/src/qkd_app/.gitlab-ci.yml'
#  - local: '/src/dbscanserving/.gitlab-ci.yml'
#  - local: '/src/opticalattackmitigator/.gitlab-ci.yml'
#  - local: '/src/opticalattackdetector/.gitlab-ci.yml'
#  - local: '/src/opticalattackmanager/.gitlab-ci.yml'
#  - local: '/src/opticalcontroller/.gitlab-ci.yml'
#  - local: '/src/ztp/.gitlab-ci.yml'
#  - local: '/src/policy/.gitlab-ci.yml'
#  - local: '/src/automation/.gitlab-ci.yml'
#  - local: '/src/forecaster/.gitlab-ci.yml'
#  #- local: '/src/webui/.gitlab-ci.yml'
#  #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml'
#  #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml'
#  #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
#  - local: '/src/slice/.gitlab-ci.yml'
#  #- local: '/src/interdomain/.gitlab-ci.yml'
#  - local: '/src/pathcomp/.gitlab-ci.yml'
#  #- local: '/src/dlt/.gitlab-ci.yml'
#  - local: '/src/load_generator/.gitlab-ci.yml'
#  - local: '/src/bgpls_speaker/.gitlab-ci.yml'
#  - local: '/src/kpi_manager/.gitlab-ci.yml'
#  - local: '/src/kpi_value_api/.gitlab-ci.yml'
#  #- local: '/src/kpi_value_writer/.gitlab-ci.yml'
#  #- local: '/src/telemetry/.gitlab-ci.yml'
#  - local: '/src/analytics/.gitlab-ci.yml'
#  - local: '/src/qos_profile/.gitlab-ci.yml'
#  - local: '/src/vnt_manager/.gitlab-ci.yml'
#  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
#  - local: '/src/ztp_server/.gitlab-ci.yml'
#  - local: '/src/osm_client/.gitlab-ci.yml'
#  - local: '/src/simap_connector/.gitlab-ci.yml'
#  - local: '/src/pluggables/.gitlab-ci.yml'
  #- local: '/manifests/.gitlab-ci.yml'
  - local: '/src/monitoring/.gitlab-ci.yml'
  - local: '/src/nbi/.gitlab-ci.yml'
  - local: '/src/context/.gitlab-ci.yml'
  - local: '/src/device/.gitlab-ci.yml'
  - local: '/src/service/.gitlab-ci.yml'
  - local: '/src/qkd_app/.gitlab-ci.yml'
  - local: '/src/dbscanserving/.gitlab-ci.yml'
  - local: '/src/opticalattackmitigator/.gitlab-ci.yml'
  - local: '/src/opticalattackdetector/.gitlab-ci.yml'
  - local: '/src/opticalattackmanager/.gitlab-ci.yml'
  - local: '/src/opticalcontroller/.gitlab-ci.yml'
  - local: '/src/ztp/.gitlab-ci.yml'
  - local: '/src/policy/.gitlab-ci.yml'
  - local: '/src/automation/.gitlab-ci.yml'
  - local: '/src/forecaster/.gitlab-ci.yml'
  #- local: '/src/webui/.gitlab-ci.yml'
  #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml'
  #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml'
  #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
  - local: '/src/slice/.gitlab-ci.yml'
  #- local: '/src/interdomain/.gitlab-ci.yml'
  - local: '/src/pathcomp/.gitlab-ci.yml'
  #- local: '/src/dlt/.gitlab-ci.yml'
  - local: '/src/load_generator/.gitlab-ci.yml'
  - local: '/src/bgpls_speaker/.gitlab-ci.yml'
  - local: '/src/kpi_manager/.gitlab-ci.yml'
  - local: '/src/kpi_value_api/.gitlab-ci.yml'
  #- local: '/src/kpi_value_writer/.gitlab-ci.yml'
  #- local: '/src/telemetry/.gitlab-ci.yml'
  - local: '/src/analytics/.gitlab-ci.yml'
  - local: '/src/qos_profile/.gitlab-ci.yml'
  - local: '/src/vnt_manager/.gitlab-ci.yml'
  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
  - local: '/src/ztp_server/.gitlab-ci.yml'
  - local: '/src/osm_client/.gitlab-ci.yml'
  - local: '/src/simap_connector/.gitlab-ci.yml'
  - local: '/src/pluggables/.gitlab-ci.yml'

  # This should be last one: end-to-end integration tests
  - local: '/src/tests/.gitlab-ci.yml'
+59 −15
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ from .YangHandler import YangHandler

LOGGER = logging.getLogger(__name__)

MIN_MTU = 68

class InterfaceHandler(_Handler):
    def get_resource_key(self) -> str: return '/interface/subinterface'
    def get_path(self) -> str: return '/openconfig-interfaces:interfaces'
@@ -28,16 +30,21 @@ class InterfaceHandler(_Handler):
        self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False
    ) -> Tuple[str, str]:
        if_name   = get_str(resource_value, 'name'       )  # ethernet-1/1
        sif_index = get_int(resource_value, 'index', 0)  # 0
        sif_index = get_int(resource_value, 'index', None)  # 0

        if delete:
            PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]'
            str_path = PATH_TMPL.format(if_name, sif_index)
            str_data = json.dumps({})
            if sif_index is None:
                return None, None

            root_node : libyang.DContainer = yang_handler.get_data_path(
                '/openconfig-interfaces:interfaces'
            )

            address_ip = get_str(resource_value, 'address_ip', None)
            if address_ip is None:
                PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]'
                str_path = PATH_TMPL.format(if_name, sif_index)

                yang_sif = root_node.find_path('/'.join([
                    '', # add slash at the beginning
                    'openconfig-interfaces:interfaces',
@@ -45,13 +52,32 @@ class InterfaceHandler(_Handler):
                    'subinterfaces',
                    'subinterface[index="{:d}"]'.format(sif_index),
                ]))
            else:
                PATH_TMPL = (
                    '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]'
                    '/openconfig-if-ip:ipv4/addresses/address[ip={:s}]'
                )
                str_path = PATH_TMPL.format(if_name, sif_index, address_ip)

                yang_sif = root_node.find_path('/'.join([
                    '', # add slash at the beginning
                    'openconfig-interfaces:interfaces',
                    'interface[name="{:s}"]'.format(if_name),
                    'subinterfaces',
                    'subinterface[index="{:d}"]'.format(sif_index),
                    'openconfig-if-ip:ipv4',
                    'addresses',
                    'address[ip="{:s}"]'.format(address_ip)
                ]))

            if yang_sif is not None:
                yang_sif.unlink()
                yang_sif.free()

            str_data = json.dumps({})
            return str_path, str_data

        enabled        = get_bool(resource_value, 'enabled',  True) # True/False
        enabled        = get_bool(resource_value, 'enabled',  None) # True/False
        #if_type        = get_str (resource_value, 'type'         ) # 'l3ipvlan'
        vlan_id        = get_int (resource_value, 'vlan_id',      ) # 127
        address_ip     = get_str (resource_value, 'address_ip'    ) # 172.16.0.1
@@ -63,7 +89,17 @@ class InterfaceHandler(_Handler):
        yang_if : libyang.DContainer = yang_ifs.create_path(yang_if_path)
        yang_if.create_path('config/name',    if_name   )
        if enabled is not None: yang_if.create_path('config/enabled', enabled)
        if mtu     is not None: yang_if.create_path('config/mtu',     mtu)
        
        if mtu is not None and mtu >= MIN_MTU:
            yang_if.create_path('config/mtu', mtu)

        if sif_index is None:
            str_path = '/interfaces/interface[name={:s}]'.format(if_name)
            str_data = yang_if.print_mem('json')
            json_data = json.loads(str_data)
            json_data = json_data['openconfig-interfaces:interface'][0]
            str_data = json.dumps(json_data)
            return str_path, str_data

        yang_sifs : libyang.DContainer = yang_if.create_path('subinterfaces')
        yang_sif_path = 'subinterface[index="{:d}"]'.format(sif_index)
@@ -121,7 +157,6 @@ class InterfaceHandler(_Handler):
            _interface = {
                'name'         : interface_name,
                'type'         : interface_type,
                'mtu'          : interface_state['mtu'],
                'admin-status' : interface_state['admin-status'],
                'oper-status'  : interface_state['oper-status'],
                'management'   : interface_state['management'],
@@ -136,6 +171,9 @@ class InterfaceHandler(_Handler):
                _interface['hardware-port'] = interface_state['hardware-port']
            if 'transceiver' in interface_state:
                _interface['transceiver'] = interface_state['transceiver']
            if 'mtu' in interface_state:
                mtu = interface_state['mtu']
                if mtu > 0: _interface['mtu'] = mtu

            entry_interface_key = '/interface[{:s}]'.format(interface_name)
            entries.append((entry_interface_key, _interface))
@@ -164,6 +202,12 @@ class InterfaceHandler(_Handler):
                    _subinterface['name'] = subinterface_state['name']
                if 'enabled' in subinterface_state:
                    _subinterface['enabled'] = subinterface_state['enabled']
                if 'mtu' in subinterface_state:
                    mtu = subinterface_state['mtu']
                    if mtu > 0:
                        _subinterface['mtu'] = mtu
                        if 'mtu' not in _interface:
                            _interface['mtu'] = mtu

                if 'vlan' in subinterface:
                    vlan = subinterface['vlan']
+17 −0
Original line number Diff line number Diff line
@@ -40,6 +40,23 @@ class NetworkInstanceStaticRouteHandler(_Handler):
            PATH_TMPL  = '/network-instances/network-instance[name={:s}]/protocols'
            PATH_TMPL += '/protocol[identifier={:s}][name={:s}]/static-routes/static[prefix={:s}]'
            str_path = PATH_TMPL.format(ni_name, identifier, proto_name, prefix)

            root_node : libyang.DContainer = yang_handler.get_data_path(
                '/openconfig-network-instance:network-instances'
            )
            yang_ni_pr_sr_path = root_node.find_path('/'.join([
                '', # add slash at the beginning
                'openconfig-network-instance:network-instances',
                'network-instance[name="{:s}"]'.format(ni_name),
                'protocols',
                'protocol[identifier="{:s}"][name="{:s}"]'.format(identifier, proto_name),
                'static-routes',
                'static[prefix="{:s}"]'.format(prefix)
            ]))
            if yang_ni_pr_sr_path is not None:
                yang_ni_pr_sr_path.unlink()
                yang_ni_pr_sr_path.free()

            str_data = json.dumps({})
            return str_path, str_data

+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ RUN python3 -m pip install -r requirements.txt

# Add component files into working directory
WORKDIR /var/teraflow
COPY src/nbi/. nbi/
COPY src/context/__init__.py context/__init__.py
COPY src/context/client/. context/client/
COPY src/device/__init__.py device/__init__.py
@@ -95,6 +94,7 @@ COPY src/vnt_manager/__init__.py vnt_manager/__init__.py
COPY src/vnt_manager/client/. vnt_manager/client/
RUN mkdir -p /var/teraflow/tests/tools
COPY src/tests/tools/mock_osm/. tests/tools/mock_osm/
COPY src/nbi/. nbi/

# Start the service
# NOTE: Configured single worker to prevent issues with multi-worker synchronization. To be invetsigated.
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ from typing import Any, List, Optional, Tuple
from flask import Flask, request
from flask_restful import Api, Resource
from flask_socketio import Namespace, SocketIO
from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
#from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
from nbi.Config import SECRET_KEY


Loading