Loading proto/context.proto +22 −11 Original line number Diff line number Diff line Loading @@ -88,6 +88,8 @@ service ContextService { rpc GetOpticalLink (LinkId ) returns ( OpticalLink ) {} rpc DeleteOpticalLink (LinkId ) returns ( Empty ) {} rpc GetOpticalLinkList (Empty ) returns ( OpticalLinkList ) {} rpc DeleteServiceConfigRule (ServiceConfigRule ) returns ( Empty ) {} } // ----- Generic ------------------------------------------------------------------------------------------------------- Loading Loading @@ -687,3 +689,12 @@ message OpticalLink { LinkId link_id = 3; repeated EndPointId link_endpoint_ids=4; } ////////////////// Config Rule Delete //////////// message ServiceConfigRule { ServiceId service_id =1; ConfigRule_Custom configrule_custom =2; } No newline at end of file src/context/Dockerfile +6 −2 Original line number Diff line number Diff line Loading @@ -15,8 +15,12 @@ FROM python:3.9-slim # Install dependencies RUN apt-get --yes --quiet --quiet update && \ apt-get --yes --quiet --quiet install wget g++ git && \ # RUN apt-get --yes --quiet --quiet update && \ # apt-get --yes --quiet --quiet install wget g++ git && \ # rm -rf /var/lib/apt/lists/* RUN apt-get --yes update && \ apt-get --yes install wget g++ git && \ rm -rf /var/lib/apt/lists/* # Set Python to show logs as they occur Loading src/context/client/ContextClient.py +11 −1 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ from common.proto.context_pb2 import ( Service, ServiceEvent, ServiceFilter, ServiceId, ServiceIdList, ServiceList, Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList, Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList, OpticalConfig, OpticalConfigId, OpticalConfigList , OpticalLink ,OpticalLinkList OpticalConfig, OpticalConfigId, OpticalConfigList , OpticalLink ,OpticalLinkList,ServiceConfigRule ) from common.proto.context_pb2_grpc import ContextServiceStub from common.proto.context_policy_pb2_grpc import ContextPolicyServiceStub Loading Loading @@ -511,3 +511,13 @@ class ContextClient: response = self.stub.DeleteOpticalLink(request) LOGGER.debug('RemoveOpticalLink result: {:s}'.format(grpc_message_to_json_string(response))) return response # --------------------------------- Service ConfigRule Deletion ------------------ @RETRY_DECORATOR def DeleteServiceConfigRule(self, request: ServiceConfigRule) -> Empty: LOGGER.debug('ServiceConfigRule Delete request: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.DeleteServiceConfigRule(request) LOGGER.debug('ServiceConfigRule Delete result: {:s}'.format(grpc_message_to_json_string(response))) return response No newline at end of file src/context/service/ContextServiceServicerImpl.py +7 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ from common.proto.context_pb2 import ( Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList, Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList, OpticalConfigList, OpticalConfigId, OpticalConfig ,OpticalLink , OpticalLinkList, ServiceConfigRule ) from common.proto.policy_pb2 import PolicyRuleIdList, PolicyRuleId, PolicyRuleList, PolicyRule from common.proto.context_pb2_grpc import ContextServiceServicer Loading @@ -49,6 +50,7 @@ from .database.OpticalConfig import (set_opticalconfig, select_opticalconfig, ge ,delete_opticalconfig ,update_opticalconfig ,delete_opticalchannel ) from .database.OpticalLink import optical_link_delete,optical_link_get,optical_link_list_objs,optical_link_set from .database.ConfigRule import delete_config_rule LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Context', 'RPC') Loading Loading @@ -358,3 +360,8 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer def DeleteOpticalLink(self, request : LinkId, context : grpc.ServicerContext) -> Empty: return optical_link_delete(self.db_engine, self.messagebroker, request) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def DeleteServiceConfigRule(self, request : ServiceConfigRule, context : grpc.ServicerContext) -> Empty: return delete_config_rule(self.db_engine, request) src/context/service/database/ConfigRule.py +29 −1 Original line number Diff line number Diff line Loading @@ -17,14 +17,17 @@ from sqlalchemy import delete #from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session from sqlalchemy.engine import Engine from typing import Dict, List, Optional, Set from common.proto.context_pb2 import ConfigRule from common.proto.context_pb2 import ConfigRule ,ServiceId ,ServiceConfigRule ,Empty from common.tools.grpc.Tools import grpc_message_to_json_string from .models.enums.ConfigAction import ORM_ConfigActionEnum, grpc_to_enum__config_action from .models.ConfigRuleModel import ( ConfigRuleKindEnum, DeviceConfigRuleModel, ServiceConfigRuleModel, SliceConfigRuleModel) from .uuids._Builder import get_uuid_from_string from .uuids.EndPoint import endpoint_get_uuid from sqlalchemy_cockroachdb import run_transaction from sqlalchemy.orm import Session, selectinload, sessionmaker LOGGER = logging.getLogger(__name__) Loading @@ -33,8 +36,10 @@ def compose_config_rules_data( device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None ) -> List[Dict]: dict_config_rules : List[Dict] = list() for position,config_rule in enumerate(config_rules): str_kind = config_rule.WhichOneof('config_rule') kind = ConfigRuleKindEnum._member_map_.get(str_kind.upper()) # pylint: disable=no-member dict_config_rule = { 'position' : position, Loading Loading @@ -63,6 +68,7 @@ def compose_config_rules_data( configrule_name = None if kind == ConfigRuleKindEnum.CUSTOM: configrule_name = '{:s}:{:s}:{:s}'.format(parent_kind, kind.value, config_rule.custom.resource_key) elif kind == ConfigRuleKindEnum.ACL: _, _, endpoint_uuid = endpoint_get_uuid(config_rule.acl.endpoint_id, allow_random=False) Loading Loading @@ -149,3 +155,25 @@ def upsert_config_rules( upsert_affected = any([(updated_at > created_at) for created_at,updated_at in configrule_updates]) return delete_affected or upsert_affected def delete_config_rule (db_engine : Engine,request:ServiceConfigRule): config_rule=request.configrule_custom service_id= request.service_id parent_uuid = service_id.service_uuid.uuid configrule_name = 'service:custom:{:s}'.format( config_rule.resource_key) configrule_uuid = get_uuid_from_string(configrule_name, prefix_for_name=parent_uuid) def callback(session : Session) -> bool: num_deleted = session.query(ServiceConfigRuleModel).filter_by(configrule_uuid=configrule_uuid).delete() return num_deleted > 0 deleted = run_transaction(sessionmaker(bind=db_engine), callback) return Empty() No newline at end of file Loading
proto/context.proto +22 −11 Original line number Diff line number Diff line Loading @@ -88,6 +88,8 @@ service ContextService { rpc GetOpticalLink (LinkId ) returns ( OpticalLink ) {} rpc DeleteOpticalLink (LinkId ) returns ( Empty ) {} rpc GetOpticalLinkList (Empty ) returns ( OpticalLinkList ) {} rpc DeleteServiceConfigRule (ServiceConfigRule ) returns ( Empty ) {} } // ----- Generic ------------------------------------------------------------------------------------------------------- Loading Loading @@ -687,3 +689,12 @@ message OpticalLink { LinkId link_id = 3; repeated EndPointId link_endpoint_ids=4; } ////////////////// Config Rule Delete //////////// message ServiceConfigRule { ServiceId service_id =1; ConfigRule_Custom configrule_custom =2; } No newline at end of file
src/context/Dockerfile +6 −2 Original line number Diff line number Diff line Loading @@ -15,8 +15,12 @@ FROM python:3.9-slim # Install dependencies RUN apt-get --yes --quiet --quiet update && \ apt-get --yes --quiet --quiet install wget g++ git && \ # RUN apt-get --yes --quiet --quiet update && \ # apt-get --yes --quiet --quiet install wget g++ git && \ # rm -rf /var/lib/apt/lists/* RUN apt-get --yes update && \ apt-get --yes install wget g++ git && \ rm -rf /var/lib/apt/lists/* # Set Python to show logs as they occur Loading
src/context/client/ContextClient.py +11 −1 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ from common.proto.context_pb2 import ( Service, ServiceEvent, ServiceFilter, ServiceId, ServiceIdList, ServiceList, Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList, Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList, OpticalConfig, OpticalConfigId, OpticalConfigList , OpticalLink ,OpticalLinkList OpticalConfig, OpticalConfigId, OpticalConfigList , OpticalLink ,OpticalLinkList,ServiceConfigRule ) from common.proto.context_pb2_grpc import ContextServiceStub from common.proto.context_policy_pb2_grpc import ContextPolicyServiceStub Loading Loading @@ -511,3 +511,13 @@ class ContextClient: response = self.stub.DeleteOpticalLink(request) LOGGER.debug('RemoveOpticalLink result: {:s}'.format(grpc_message_to_json_string(response))) return response # --------------------------------- Service ConfigRule Deletion ------------------ @RETRY_DECORATOR def DeleteServiceConfigRule(self, request: ServiceConfigRule) -> Empty: LOGGER.debug('ServiceConfigRule Delete request: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.DeleteServiceConfigRule(request) LOGGER.debug('ServiceConfigRule Delete result: {:s}'.format(grpc_message_to_json_string(response))) return response No newline at end of file
src/context/service/ContextServiceServicerImpl.py +7 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ from common.proto.context_pb2 import ( Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList, Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList, OpticalConfigList, OpticalConfigId, OpticalConfig ,OpticalLink , OpticalLinkList, ServiceConfigRule ) from common.proto.policy_pb2 import PolicyRuleIdList, PolicyRuleId, PolicyRuleList, PolicyRule from common.proto.context_pb2_grpc import ContextServiceServicer Loading @@ -49,6 +50,7 @@ from .database.OpticalConfig import (set_opticalconfig, select_opticalconfig, ge ,delete_opticalconfig ,update_opticalconfig ,delete_opticalchannel ) from .database.OpticalLink import optical_link_delete,optical_link_get,optical_link_list_objs,optical_link_set from .database.ConfigRule import delete_config_rule LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Context', 'RPC') Loading Loading @@ -358,3 +360,8 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer def DeleteOpticalLink(self, request : LinkId, context : grpc.ServicerContext) -> Empty: return optical_link_delete(self.db_engine, self.messagebroker, request) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def DeleteServiceConfigRule(self, request : ServiceConfigRule, context : grpc.ServicerContext) -> Empty: return delete_config_rule(self.db_engine, request)
src/context/service/database/ConfigRule.py +29 −1 Original line number Diff line number Diff line Loading @@ -17,14 +17,17 @@ from sqlalchemy import delete #from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session from sqlalchemy.engine import Engine from typing import Dict, List, Optional, Set from common.proto.context_pb2 import ConfigRule from common.proto.context_pb2 import ConfigRule ,ServiceId ,ServiceConfigRule ,Empty from common.tools.grpc.Tools import grpc_message_to_json_string from .models.enums.ConfigAction import ORM_ConfigActionEnum, grpc_to_enum__config_action from .models.ConfigRuleModel import ( ConfigRuleKindEnum, DeviceConfigRuleModel, ServiceConfigRuleModel, SliceConfigRuleModel) from .uuids._Builder import get_uuid_from_string from .uuids.EndPoint import endpoint_get_uuid from sqlalchemy_cockroachdb import run_transaction from sqlalchemy.orm import Session, selectinload, sessionmaker LOGGER = logging.getLogger(__name__) Loading @@ -33,8 +36,10 @@ def compose_config_rules_data( device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None ) -> List[Dict]: dict_config_rules : List[Dict] = list() for position,config_rule in enumerate(config_rules): str_kind = config_rule.WhichOneof('config_rule') kind = ConfigRuleKindEnum._member_map_.get(str_kind.upper()) # pylint: disable=no-member dict_config_rule = { 'position' : position, Loading Loading @@ -63,6 +68,7 @@ def compose_config_rules_data( configrule_name = None if kind == ConfigRuleKindEnum.CUSTOM: configrule_name = '{:s}:{:s}:{:s}'.format(parent_kind, kind.value, config_rule.custom.resource_key) elif kind == ConfigRuleKindEnum.ACL: _, _, endpoint_uuid = endpoint_get_uuid(config_rule.acl.endpoint_id, allow_random=False) Loading Loading @@ -149,3 +155,25 @@ def upsert_config_rules( upsert_affected = any([(updated_at > created_at) for created_at,updated_at in configrule_updates]) return delete_affected or upsert_affected def delete_config_rule (db_engine : Engine,request:ServiceConfigRule): config_rule=request.configrule_custom service_id= request.service_id parent_uuid = service_id.service_uuid.uuid configrule_name = 'service:custom:{:s}'.format( config_rule.resource_key) configrule_uuid = get_uuid_from_string(configrule_name, prefix_for_name=parent_uuid) def callback(session : Session) -> bool: num_deleted = session.query(ServiceConfigRuleModel).filter_by(configrule_uuid=configrule_uuid).delete() return num_deleted > 0 deleted = run_transaction(sessionmaker(bind=db_engine), callback) return Empty() No newline at end of file