diff --git a/src/compute/requirements.in b/src/compute/requirements.in index 08bbf281a385652013adda02a97e64df7a366c43..dc22f64eb79778f89d1e66d9718dfed2c15457a3 100644 --- a/src/compute/requirements.in +++ b/src/compute/requirements.in @@ -17,3 +17,4 @@ Flask-HTTPAuth==4.5.0 Flask-RESTful==0.3.9 jsonschema==4.4.0 requests==2.27.1 +werkzeug==2.3.7 \ No newline at end of file diff --git a/src/context/service/database/models/enums/ConfigAction.py b/src/context/service/database/models/enums/ConfigAction.py index 5d7aa6b44ecb58f769a1c70a5cabdda98ba51bca..526024a1fedf3331ca45e3cb517ff9d58ce28c25 100644 --- a/src/context/service/database/models/enums/ConfigAction.py +++ b/src/context/service/database/models/enums/ConfigAction.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import ConfigActionEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_ConfigActionEnum should be named +# as in the proto files removing the prefixes. For example, +# proto item ConfigActionEnum.CONFIGACTION_SET should be +# included as SET. If item name does not match, automatic +# mapping of proto enums to database enums will fail. class ORM_ConfigActionEnum(enum.Enum): UNDEFINED = ConfigActionEnum.CONFIGACTION_UNDEFINED SET = ConfigActionEnum.CONFIGACTION_SET diff --git a/src/context/service/database/models/enums/ConstraintAction.py b/src/context/service/database/models/enums/ConstraintAction.py index 65533b6f579ffe153b046dfcb39d37758f4c0577..2a53b8e1c5e97e48cbda9648c8473313bce6f4cd 100644 --- a/src/context/service/database/models/enums/ConstraintAction.py +++ b/src/context/service/database/models/enums/ConstraintAction.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import ConstraintActionEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_ConstraintActionEnum should be named +# as in the proto files removing the prefixes. For example, proto +# item ConstraintActionEnum.CONFIGACTION_SET should be included +# as SET. If item name does not match, automatic mapping of proto +# enums to database enums will fail. class ORM_ConstraintActionEnum(enum.Enum): UNDEFINED = ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED SET = ConstraintActionEnum.CONSTRAINTACTION_SET diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py index 0ed68d23b9ba04c7f12d3d4d0d378cbbfc9a879a..66635decc5369c8b7601863da85f497626d70ac8 100644 --- a/src/context/service/database/models/enums/DeviceDriver.py +++ b/src/context/service/database/models/enums/DeviceDriver.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import DeviceDriverEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_DeviceDriverEnum should be named as in +# the proto files removing the prefixes. For example, proto item +# DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG should be included as +# OPENCONFIG. If item name does not match, automatic mapping of +# proto enums to database enums will fail. class ORM_DeviceDriverEnum(enum.Enum): UNDEFINED = DeviceDriverEnum.DEVICEDRIVER_UNDEFINED OPENCONFIG = DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG diff --git a/src/context/service/database/models/enums/DeviceOperationalStatus.py b/src/context/service/database/models/enums/DeviceOperationalStatus.py index a121fab86408493bf0b211f4fcc8423aafa969cf..9e98869dce025e51c20ff0aca0dcd78a9ab57fe1 100644 --- a/src/context/service/database/models/enums/DeviceOperationalStatus.py +++ b/src/context/service/database/models/enums/DeviceOperationalStatus.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import DeviceOperationalStatusEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_DeviceOperationalStatusEnum should be +# named as in the proto files removing the prefixes. For example, +# proto item DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED +# should be declared as ENABLED. If item name does not match, automatic +# mapping of proto enums to database enums will fail. class ORM_DeviceOperationalStatusEnum(enum.Enum): UNDEFINED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_UNDEFINED DISABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_DISABLED diff --git a/src/context/service/database/models/enums/KpiSampleType.py b/src/context/service/database/models/enums/KpiSampleType.py index 3bf5d06f047016af7167d0d59a315ac465abfd19..5cef9ac199a0cc3389092e4ea375940e27554066 100644 --- a/src/context/service/database/models/enums/KpiSampleType.py +++ b/src/context/service/database/models/enums/KpiSampleType.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.kpi_sample_types_pb2 import KpiSampleType from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_KpiSampleTypeEnum should be named as in +# the proto files removing the prefixes. For example, proto item +# KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED should be declared as +# BYTES_RECEIVED. If item name does not match, automatic mapping of +# proto enums to database enums will fail. class ORM_KpiSampleTypeEnum(enum.Enum): UNKNOWN = KpiSampleType.KPISAMPLETYPE_UNKNOWN PACKETS_TRANSMITTED = KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED diff --git a/src/context/service/database/models/enums/PolicyRuleState.py b/src/context/service/database/models/enums/PolicyRuleState.py index c4aa950a11605682f1c78e544767ea7e0a7b24b4..e16ee01e36b5e2ec2ad8e07f7cb6201ee091e76f 100644 --- a/src/context/service/database/models/enums/PolicyRuleState.py +++ b/src/context/service/database/models/enums/PolicyRuleState.py @@ -16,6 +16,13 @@ import enum, functools from common.proto.policy_pb2 import PolicyRuleStateEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_PolicyRuleStateEnum should be named as in +# the proto files removing the prefixes. For example, proto item +# PolicyRuleStateEnum.POLICY_INSERTED should be declared as INSERTED. +# In this case, since the entries in the proto enum have a different prefix +# than that specified in class ORM_PolicyRuleStateEnum, we force the prefix +# using argument grpc_enum_prefix. If item name does not match, automatic +# mapping of proto enums to database enums will fail. class ORM_PolicyRuleStateEnum(enum.Enum): UNDEFINED = PolicyRuleStateEnum.POLICY_UNDEFINED # Undefined rule state FAILED = PolicyRuleStateEnum.POLICY_FAILED # Rule failed diff --git a/src/context/service/database/models/enums/ServiceStatus.py b/src/context/service/database/models/enums/ServiceStatus.py index cd2a183b825eff54a51a844ea6834263bbabbc31..ae0ad55bcfe327b981881bcd304124c9bb6576ab 100644 --- a/src/context/service/database/models/enums/ServiceStatus.py +++ b/src/context/service/database/models/enums/ServiceStatus.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import ServiceStatusEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_ServiceStatusEnum should be named as in +# the proto files removing the prefixes. For example, proto item +# ServiceStatusEnum.SERVICESTATUS_PLANNED should be declared as PLANNED. +# If item name does not match, automatic mapping of proto enums to +# database enums will fail. class ORM_ServiceStatusEnum(enum.Enum): UNDEFINED = ServiceStatusEnum.SERVICESTATUS_UNDEFINED PLANNED = ServiceStatusEnum.SERVICESTATUS_PLANNED diff --git a/src/context/service/database/models/enums/ServiceType.py b/src/context/service/database/models/enums/ServiceType.py index 3937eaa114429ce9d004933a5d5baf1ae6137513..0ed1938a7ca1e566bea815d9ce936150bb91d9dc 100644 --- a/src/context/service/database/models/enums/ServiceType.py +++ b/src/context/service/database/models/enums/ServiceType.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import ServiceTypeEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_ServiceTypeEnum should be named as in +# the proto files removing the prefixes. For example, proto item +# ConfigActionEnum.CONFIGACTION_SET should be declared as SET. +# If item name does not match, automatic mapping of proto enums to +# database enums will fail. class ORM_ServiceTypeEnum(enum.Enum): UNKNOWN = ServiceTypeEnum.SERVICETYPE_UNKNOWN L3NM = ServiceTypeEnum.SERVICETYPE_L3NM diff --git a/src/context/service/database/models/enums/SliceStatus.py b/src/context/service/database/models/enums/SliceStatus.py index 5d77578b4cb4ee155981ede4395b1cafc3be4ef7..32ef0cc4a3d65aa96346b038534ca65bc3e4f95c 100644 --- a/src/context/service/database/models/enums/SliceStatus.py +++ b/src/context/service/database/models/enums/SliceStatus.py @@ -16,6 +16,11 @@ import enum, functools from common.proto.context_pb2 import SliceStatusEnum from ._GrpcToEnum import grpc_to_enum +# IMPORTANT: Entries of enum class ORM_SliceStatusEnum should be named as in +# the proto file but removing the prefixes. For example, proto item +# SliceStatusEnum.SLICESTATUS_PLANNED should be declared as PLANNED. +# If item name does not match, automatic mapping of proto enums to +# database enums will fail. class ORM_SliceStatusEnum(enum.Enum): UNDEFINED = SliceStatusEnum.SLICESTATUS_UNDEFINED PLANNED = SliceStatusEnum.SLICESTATUS_PLANNED diff --git a/src/device/service/drivers/openconfig/templates/Interfaces.py b/src/device/service/drivers/openconfig/templates/Interfaces.py index 3855db17b45505d4131089b2b9abd995fa221419..3d4c73fc11c686b4d4e181a1f98ed3f5922f7c15 100644 --- a/src/device/service/drivers/openconfig/templates/Interfaces.py +++ b/src/device/service/drivers/openconfig/templates/Interfaces.py @@ -22,6 +22,7 @@ LOGGER = logging.getLogger(__name__) XPATH_INTERFACES = "//oci:interfaces/oci:interface" XPATH_SUBINTERFACES = ".//oci:subinterfaces/oci:subinterface" XPATH_IPV4ADDRESSES = ".//ociip:ipv4/ociip:addresses/ociip:address" +XPATH_IPV6ADDRESSES = ".//ociip:ipv6/ociip:addresses/ociip:address" def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: response = [] @@ -97,6 +98,15 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: #add_value_from_collection(subinterface, 'ipv4_addresses', ipv4_addresses) + for xml_ipv6_address in xml_subinterface.xpath(XPATH_IPV6ADDRESSES, namespaces=NAMESPACES): + #LOGGER.info('xml_ipv6_address = {:s}'.format(str(ET.tostring(xml_ipv6_address)))) + + address = xml_ipv6_address.find('ociip:state/ociip:ip', namespaces=NAMESPACES) + add_value_from_tag(subinterface, 'address_ipv6', address) + + prefix = xml_ipv6_address.find('ociip:state/ociip:prefix-length', namespaces=NAMESPACES) + add_value_from_tag(subinterface, 'address_prefix_v6', prefix, cast=int) + if len(subinterface) == 0: continue resource_key = '/interface[{:s}]/subinterface[{:s}]'.format(interface['name'], str(subinterface['index'])) response.append((resource_key, subinterface)) diff --git a/src/webui/requirements.in b/src/webui/requirements.in index b4a158d394bc2de67af1e0e99e922df08104f736..9facefbbae3c20b90304803e9ccfa4ebf4011fbb 100644 --- a/src/webui/requirements.in +++ b/src/webui/requirements.in @@ -17,3 +17,4 @@ Flask-WTF==1.0.0 flask-healthz==0.0.3 flask-unittest==0.1.2 lorem-text==2.1 +werkzeug==2.3.7 \ No newline at end of file diff --git a/src/webui/service/templates/device/detail.html b/src/webui/service/templates/device/detail.html index c35ae163d3f8344f1ebb49241cc15a4afa3401d5..b02be6f4d4f6c975c4ebf3528bc6770ae25e6702 100644 --- a/src/webui/service/templates/device/detail.html +++ b/src/webui/service/templates/device/detail.html @@ -86,7 +86,42 @@ </tbody> </table> </div> -</div> + {% if device.components|length > 0 %} + <div class="col-sm-8"> + <table class="table table-striped table-hover"> + <thead> + <tr> + <th scope="col">Component UUID</th> + <th scope="col">Name</th> + <th scope="col">Type</th> + <th scope="col">Parent</th> + <th scope="col">Attributes</th> + </tr> + </thead> + <tbody> + {% for component in device.components %} + <tr> + <td> + {{ component.component_uuid.uuid }} + </td> + <td> + {{ component.name }} + </td> + <td> + {{ component.type }} + </td> + <td> + {{ component.parent }} + </td> + <td> + {{ component.attributes }} + </td> + </tr> + {% endfor %} + </tbody> + </table> + </div> + {% endif %} </div> <b>Configurations:</b>