Skip to content
Snippets Groups Projects
Commit 0ae6b155 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Context component:

- Implemented method UnsetService()
parent 8a1e3c8d
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!87Context & Device Performance Enhancements
...@@ -36,7 +36,7 @@ from .database.EndPoint import endpoint_list_names ...@@ -36,7 +36,7 @@ from .database.EndPoint import endpoint_list_names
from .database.Link import link_delete, link_get, link_list_ids, link_list_objs, link_set from .database.Link import link_delete, link_get, link_list_ids, link_list_objs, link_set
from .database.PolicyRule import ( from .database.PolicyRule import (
policyrule_delete, policyrule_get, policyrule_list_ids, policyrule_list_objs, policyrule_set) policyrule_delete, policyrule_get, policyrule_list_ids, policyrule_list_objs, policyrule_set)
from .database.Service import service_delete, service_get, service_list_ids, service_list_objs, service_select, service_set from .database.Service import service_delete, service_get, service_list_ids, service_list_objs, service_select, service_set, service_unset
from .database.Slice import slice_delete, slice_get, slice_list_ids, slice_list_objs, slice_select, slice_set, slice_unset from .database.Slice import slice_delete, slice_get, slice_list_ids, slice_list_objs, slice_select, slice_set, slice_unset
from .database.Topology import ( from .database.Topology import (
topology_delete, topology_get, topology_get_details, topology_list_ids, topology_list_objs, topology_set) topology_delete, topology_get, topology_get_details, topology_list_ids, topology_list_objs, topology_set)
...@@ -231,6 +231,14 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer ...@@ -231,6 +231,14 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id}) notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id})
return ServiceId(**service_id) return ServiceId(**service_id)
@safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
def UnsetService(self, request : Service, context : grpc.ServicerContext) -> ServiceId:
service_id,updated = service_unset(self.db_engine, request)
if updated:
event_type = EventTypeEnum.EVENTTYPE_UPDATE
notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id})
return ServiceId(**service_id)
@safe_and_metered_rpc_method(METRICS_POOL, LOGGER) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
def RemoveService(self, request : ServiceId, context : grpc.ServicerContext) -> Empty: def RemoveService(self, request : ServiceId, context : grpc.ServicerContext) -> Empty:
service_id,deleted = service_delete(self.db_engine, request) service_id,deleted = service_delete(self.db_engine, request)
......
...@@ -13,11 +13,12 @@ ...@@ -13,11 +13,12 @@
# limitations under the License. # limitations under the License.
import datetime, logging import datetime, logging
from sqlalchemy import and_
from sqlalchemy.dialects.postgresql import insert from sqlalchemy.dialects.postgresql import insert
from sqlalchemy.engine import Engine from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session, selectinload, sessionmaker from sqlalchemy.orm import Session, selectinload, sessionmaker
from sqlalchemy_cockroachdb import run_transaction from sqlalchemy_cockroachdb import run_transaction
from typing import Dict, List, Optional, Tuple from typing import Dict, List, Optional, Set, Tuple
from common.proto.context_pb2 import ContextId, Service, ServiceFilter, ServiceId from common.proto.context_pb2 import ContextId, Service, ServiceFilter, ServiceId
from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Context import json_context_id
...@@ -146,6 +147,45 @@ def service_set(db_engine : Engine, request : Service) -> Tuple[Dict, bool]: ...@@ -146,6 +147,45 @@ def service_set(db_engine : Engine, request : Service) -> Tuple[Dict, bool]:
updated = run_transaction(sessionmaker(bind=db_engine), callback) updated = run_transaction(sessionmaker(bind=db_engine), callback)
return json_service_id(service_uuid, json_context_id(context_uuid)),updated return json_service_id(service_uuid, json_context_id(context_uuid)),updated
def service_unset(db_engine : Engine, request : Service) -> Tuple[Dict, bool]:
raw_context_uuid = request.service_id.context_id.context_uuid.uuid
raw_service_uuid = request.service_id.service_uuid.uuid
raw_service_name = request.name
service_name = raw_service_uuid if len(raw_service_name) == 0 else raw_service_name
context_uuid,service_uuid = service_get_uuid(request.service_id, service_name=service_name, allow_random=False)
service_endpoint_uuids : Set[str] = set()
for i,endpoint_id in enumerate(request.service_endpoint_ids):
endpoint_context_uuid = endpoint_id.topology_id.context_id.context_uuid.uuid
if len(endpoint_context_uuid) == 0: endpoint_context_uuid = context_uuid
if endpoint_context_uuid not in {raw_context_uuid, context_uuid}:
raise InvalidArgumentException(
'request.service_endpoint_ids[{:d}].topology_id.context_id.context_uuid.uuid'.format(i),
endpoint_context_uuid,
['should be == request.service_id.context_id.context_uuid.uuid({:s})'.format(raw_context_uuid)])
service_endpoint_uuids.add(endpoint_get_uuid(endpoint_id, allow_random=False)[2])
now = datetime.datetime.utcnow()
constraints = compose_constraints_data(request.service_constraints, now, service_uuid=service_uuid)
config_rules = compose_config_rules_data(request.service_config.config_rules, now, service_uuid=service_uuid)
def callback(session : Session) -> bool:
num_deletes = 0
if len(service_endpoint_uuids) > 0:
num_deletes += session.query(ServiceEndPointModel)\
.filter(and_(
ServiceEndPointModel.service_uuid == service_uuid,
ServiceEndPointModel.endpoint_uuid.in_(service_endpoint_uuids)
)).delete()
changed_constraints = upsert_constraints(session, constraints, is_delete=True, service_uuid=service_uuid)
changed_config_rules = upsert_config_rules(session, config_rules, is_delete=True, service_uuid=service_uuid)
return num_deletes > 0 or changed_constraints or changed_config_rules
updated = run_transaction(sessionmaker(bind=db_engine), callback)
return json_service_id(service_uuid, json_context_id(context_uuid)),updated
def service_delete(db_engine : Engine, request : ServiceId) -> Tuple[Dict, bool]: def service_delete(db_engine : Engine, request : ServiceId) -> Tuple[Dict, bool]:
context_uuid,service_uuid = service_get_uuid(request, allow_random=False) context_uuid,service_uuid = service_get_uuid(request, allow_random=False)
def callback(session : Session) -> bool: def callback(session : Session) -> bool:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment