diff --git a/src/context/service/database/Link.py b/src/context/service/database/Link.py index 6244a8517f66280893acb10944a235666beb80d4..5782667be8cc11c4dffbf68a8a75d297077d39c1 100644 --- a/src/context/service/database/Link.py +++ b/src/context/service/database/Link.py @@ -18,7 +18,9 @@ from sqlalchemy.engine import Engine from sqlalchemy.orm import Session, selectinload, sessionmaker from sqlalchemy_cockroachdb import run_transaction from typing import Dict, List, Optional, Set, Tuple -from common.proto.context_pb2 import Empty, EventTypeEnum, Link, LinkId, LinkIdList, LinkList, TopologyId +from common.proto.context_pb2 import ( + Empty, EventTypeEnum, Link, LinkId, LinkIdList, LinkList, TopologyId +) from common.message_broker.MessageBroker import MessageBroker from common.method_wrappers.ServiceExceptions import NotFoundException from common.tools.object_factory.Link import json_link_id diff --git a/src/context/service/database/OpticalLink.py b/src/context/service/database/OpticalLink.py index 1f45daf43bb805e750b1742e6e4ea7e18039cc43..785ce8098ff043c95b5803ee60605c2e7305da02 100644 --- a/src/context/service/database/OpticalLink.py +++ b/src/context/service/database/OpticalLink.py @@ -66,9 +66,10 @@ def optical_link_set(db_engine : Engine, messagebroker : MessageBroker, request now = datetime.datetime.now(datetime.timezone.utc) - # By default, always add link to default Context/Topology topology_uuids : Set[str] = set() related_topologies : List[Dict] = list() + + # By default, always add link to default Context/Topology _,topology_uuid = topology_get_uuid(TopologyId(), allow_random=False, allow_default=True) related_topologies.append({ 'topology_uuid': topology_uuid, @@ -77,15 +78,14 @@ def optical_link_set(db_engine : Engine, messagebroker : MessageBroker, request topology_uuids.add(topology_uuid) link_endpoints_data : List[Dict] = list() - for i,endpoint_id in enumerate(request.link_endpoint_ids): - endpoint_topology_uuid, endpoint_device_uuid, endpoint_uuid = endpoint_get_uuid( - endpoint_id, endpoint_name="", allow_random=True) + endpoint_topology_uuid, _, endpoint_uuid = endpoint_get_uuid( + endpoint_id, allow_random=False) link_endpoints_data.append({ 'link_uuid' : link_uuid, 'endpoint_uuid': endpoint_uuid, - + 'position' : i, }) if endpoint_topology_uuid not in topology_uuids: diff --git a/src/context/service/database/models/OpticalLinkModel.py b/src/context/service/database/models/OpticalLinkModel.py index 930e8935c5af48793915c72df451ec48dc782a04..d43fee01811c1a754451d97efb389ce464bd9143 100644 --- a/src/context/service/database/models/OpticalLinkModel.py +++ b/src/context/service/database/models/OpticalLinkModel.py @@ -12,13 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. - -from sqlalchemy import Column, DateTime, ForeignKey, Integer, String ,Boolean +import operator +from sqlalchemy import ( + Boolean, CheckConstraint, Column, DateTime, ForeignKey, Integer, String +) from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from typing import Dict from ._Base import _Base -from .Slot import C_Slot ,S_Slot , L_Slot +from .Slot import C_Slot, S_Slot, L_Slot class OpticalLinkModel(_Base): __tablename__ = 'opticallink' @@ -59,7 +61,7 @@ class OpticalLinkModel(_Base): }, 'link_endpoint_ids' : [ optical_endpoint.endpoint.dump_id() - for optical_endpoint in self.opticallink_endpoints + for optical_endpoint in sorted(self.opticallink_endpoints, key=operator.attrgetter('position')) ], } return result @@ -69,6 +71,11 @@ class OpticalLinkEndPointModel(_Base): link_uuid = Column(ForeignKey('opticallink.opticallink_uuid', ondelete='CASCADE' ), primary_key=True) endpoint_uuid = Column(ForeignKey('endpoint.endpoint_uuid', ondelete='RESTRICT'), primary_key=True, index=True) + position = Column(Integer, nullable=False) optical_link = relationship('OpticalLinkModel', back_populates='opticallink_endpoints') endpoint = relationship('EndPointModel', lazy='selectin') + + __table_args__ = ( + CheckConstraint(position >= 0, name='check_position_value'), + )