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

Integration fix resolution:

- updated OFC'22 test scripts with source of env variables
- activated DEBUG logs in Device and Service components
- added Slice as dependency of Compute
- removed creation of services in Compute, all goes through Slice
- Added missing default constraints in PathComp Frontend
- added logic in Slice to identify if its L2 or L3
parent f8fff9e3
No related branches found
No related tags found
2 merge requests!54Release 2.0.0,!4Compute component:
Showing
with 91 additions and 110 deletions
...@@ -34,7 +34,7 @@ spec: ...@@ -34,7 +34,7 @@ spec:
- containerPort: 2020 - containerPort: 2020
env: env:
- name: LOG_LEVEL - name: LOG_LEVEL
value: "INFO" value: "DEBUG"
readinessProbe: readinessProbe:
exec: exec:
command: ["/bin/grpc_health_probe", "-addr=:2020"] command: ["/bin/grpc_health_probe", "-addr=:2020"]
......
...@@ -34,7 +34,7 @@ spec: ...@@ -34,7 +34,7 @@ spec:
- containerPort: 3030 - containerPort: 3030
env: env:
- name: LOG_LEVEL - name: LOG_LEVEL
value: "INFO" value: "DEBUG"
readinessProbe: readinessProbe:
exec: exec:
command: ["/bin/grpc_health_probe", "-addr=:3030"] command: ["/bin/grpc_health_probe", "-addr=:3030"]
......
...@@ -39,6 +39,8 @@ def main(): ...@@ -39,6 +39,8 @@ def main():
wait_for_environment_variables([ wait_for_environment_variables([
get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ),
get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC),
get_env_var_name(ServiceNameEnum.SLICE, ENVVAR_SUFIX_SERVICE_HOST ),
get_env_var_name(ServiceNameEnum.SLICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC),
]) ])
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)
......
...@@ -16,13 +16,11 @@ import logging ...@@ -16,13 +16,11 @@ import logging
from flask import request from flask import request
from flask.json import jsonify from flask.json import jsonify
from flask_restful import Resource from flask_restful import Resource
from common.Constants import DEFAULT_CONTEXT_UUID from common.proto.context_pb2 import SliceStatusEnum
from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, SliceStatusEnum
from context.client.ContextClient import ContextClient from context.client.ContextClient import ContextClient
from service.client.ServiceClient import ServiceClient
from slice.client.SliceClient import SliceClient from slice.client.SliceClient import SliceClient
from .tools.Authentication import HTTP_AUTH from .tools.Authentication import HTTP_AUTH
from .tools.ContextMethods import get_service, get_slice from .tools.ContextMethods import get_slice
from .tools.HttpStatusCodes import HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR from .tools.HttpStatusCodes import HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
...@@ -37,26 +35,16 @@ class L2VPN_Service(Resource): ...@@ -37,26 +35,16 @@ class L2VPN_Service(Resource):
context_client = ContextClient() context_client = ContextClient()
target = get_slice(context_client, vpn_id) target = get_slice(context_client, vpn_id)
if target is not None: if target is None:
if target.slice_id.slice_uuid.uuid != vpn_id: # pylint: disable=no-member raise Exception('VPN({:s}) not found in database'.format(str(vpn_id)))
raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
slice_ready_status = SliceStatusEnum.SLICESTATUS_ACTIVE
slice_status = target.slice_status.slice_status # pylint: disable=no-member
response = jsonify({})
response.status_code = HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT
return response
target = get_service(context_client, vpn_id) if target.slice_id.slice_uuid.uuid != vpn_id: # pylint: disable=no-member
if target is not None: raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
if target.service_id.service_uuid.uuid != vpn_id: # pylint: disable=no-member
raise Exception('Service retrieval failed. Wrong Service Id was returned')
service_ready_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE
service_status = target.service_status.service_status # pylint: disable=no-member
response = jsonify({})
response.status_code = HTTP_OK if service_status == service_ready_status else HTTP_GATEWAYTIMEOUT
return response
raise Exception('VPN({:s}) not found in database'.format(str(vpn_id))) slice_ready_status = SliceStatusEnum.SLICESTATUS_ACTIVE
slice_status = target.slice_status.slice_status # pylint: disable=no-member
response = jsonify({})
response.status_code = HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
LOGGER.exception('Something went wrong Retrieving VPN({:s})'.format(str(vpn_id))) LOGGER.exception('Something went wrong Retrieving VPN({:s})'.format(str(vpn_id)))
response = jsonify({'error': str(e)}) response = jsonify({'error': str(e)})
...@@ -72,29 +60,15 @@ class L2VPN_Service(Resource): ...@@ -72,29 +60,15 @@ class L2VPN_Service(Resource):
context_client = ContextClient() context_client = ContextClient()
target = get_slice(context_client, vpn_id) target = get_slice(context_client, vpn_id)
if target is not None: if target is None:
LOGGER.warning('VPN({:s}) not found in database. Nothing done.'.format(str(vpn_id)))
else:
if target.slice_id.slice_uuid.uuid != vpn_id: # pylint: disable=no-member if target.slice_id.slice_uuid.uuid != vpn_id: # pylint: disable=no-member
raise Exception('Slice retrieval failed. Wrong Slice Id was returned') raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
slice_client = SliceClient() slice_client = SliceClient()
slice_client.DeleteSlice(target.slice_id) slice_client.DeleteSlice(target.slice_id)
response = jsonify({})
response.status_code = HTTP_NOCONTENT
return response
target = get_service(context_client, vpn_id)
if target is not None:
if target.service_id.service_uuid.uuid != vpn_id: # pylint: disable=no-member
raise Exception('Service retrieval failed. Wrong Service Id was returned')
service_client = ServiceClient()
service_client.DeleteService(target.service_id)
response = jsonify({})
response.status_code = HTTP_NOCONTENT
return response
LOGGER.warning('VPN({:s}) not found in database. Nothing done.'.format(str(vpn_id)))
response = jsonify({}) response = jsonify({})
response.status_code = HTTP_NOCONTENT response.status_code = HTTP_NOCONTENT
return response
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
LOGGER.exception('Something went wrong Deleting VPN({:s})'.format(str(vpn_id))) LOGGER.exception('Something went wrong Deleting VPN({:s})'.format(str(vpn_id)))
response = jsonify({'error': str(e)}) response = jsonify({'error': str(e)})
......
...@@ -19,8 +19,7 @@ from flask.json import jsonify ...@@ -19,8 +19,7 @@ from flask.json import jsonify
from flask_restful import Resource from flask_restful import Resource
from werkzeug.exceptions import UnsupportedMediaType from werkzeug.exceptions import UnsupportedMediaType
from common.Constants import DEFAULT_CONTEXT_UUID from common.Constants import DEFAULT_CONTEXT_UUID
from common.proto.context_pb2 import Service, ServiceStatusEnum, ServiceTypeEnum, SliceStatusEnum, Slice from common.proto.context_pb2 import SliceStatusEnum, Slice
from service.client.ServiceClient import ServiceClient
from slice.client.SliceClient import SliceClient from slice.client.SliceClient import SliceClient
from .schemas.vpn_service import SCHEMA_VPN_SERVICE from .schemas.vpn_service import SCHEMA_VPN_SERVICE
from .tools.Authentication import HTTP_AUTH from .tools.Authentication import HTTP_AUTH
...@@ -44,34 +43,16 @@ class L2VPN_Services(Resource): ...@@ -44,34 +43,16 @@ class L2VPN_Services(Resource):
vpn_services : List[Dict] = request_data['ietf-l2vpn-svc:vpn-service'] vpn_services : List[Dict] = request_data['ietf-l2vpn-svc:vpn-service']
for vpn_service in vpn_services: for vpn_service in vpn_services:
try: try:
# By now, assume requests from OSM always need transport slices # pylint: disable=no-member
# TODO: think how to differentiate slice_request = Slice()
#vpn_service_type = vpn_service['vpn-svc-type'] slice_request.slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_UUID
vpn_service_type = 'vpls' slice_request.slice_id.slice_uuid.uuid = vpn_service['vpn-id']
slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
if vpn_service_type == 'vpws':
# pylint: disable=no-member slice_client = SliceClient()
service_request = Service() slice_reply = slice_client.CreateSlice(slice_request)
service_request.service_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_UUID if slice_reply != slice_request.slice_id: # pylint: disable=no-member
service_request.service_id.service_uuid.uuid = vpn_service['vpn-id'] raise Exception('Slice creation failed. Wrong Slice Id was returned')
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L3NM
service_request.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED
service_client = ServiceClient()
service_reply = service_client.CreateService(service_request)
if service_reply != service_request.service_id: # pylint: disable=no-member
raise Exception('Service creation failed. Wrong Service Id was returned')
elif vpn_service_type == 'vpls':
# pylint: disable=no-member
slice_request = Slice()
slice_request.slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_UUID
slice_request.slice_id.slice_uuid.uuid = vpn_service['vpn-id']
slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
slice_client = SliceClient()
slice_reply = slice_client.CreateSlice(slice_request)
if slice_reply != slice_request.slice_id: # pylint: disable=no-member
raise Exception('Slice creation failed. Wrong Slice Id was returned')
response = jsonify({}) response = jsonify({})
response.status_code = HTTP_CREATED response.status_code = HTTP_CREATED
......
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
# limitations under the License. # limitations under the License.
import logging import logging
from typing import Dict, Optional, Union from typing import Dict, Optional
from flask import request from flask import request
from flask.json import jsonify from flask.json import jsonify
from flask.wrappers import Response from flask.wrappers import Response
from flask_restful import Resource from flask_restful import Resource
from werkzeug.exceptions import UnsupportedMediaType from werkzeug.exceptions import UnsupportedMediaType
from common.proto.context_pb2 import Service, Slice from common.proto.context_pb2 import Slice
from common.tools.grpc.ConfigRules import update_config_rule_custom from common.tools.grpc.ConfigRules import update_config_rule_custom
from common.tools.grpc.Constraints import ( from common.tools.grpc.Constraints import (
update_constraint_custom, update_constraint_endpoint_location, update_constraint_endpoint_priority, update_constraint_custom, update_constraint_endpoint_location, update_constraint_endpoint_priority,
...@@ -27,11 +27,10 @@ from common.tools.grpc.Constraints import ( ...@@ -27,11 +27,10 @@ from common.tools.grpc.Constraints import (
from common.tools.grpc.EndPointIds import update_endpoint_ids from common.tools.grpc.EndPointIds import update_endpoint_ids
from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.grpc.Tools import grpc_message_to_json_string
from context.client.ContextClient import ContextClient from context.client.ContextClient import ContextClient
from service.client.ServiceClient import ServiceClient
from slice.client.SliceClient import SliceClient from slice.client.SliceClient import SliceClient
from .schemas.site_network_access import SCHEMA_SITE_NETWORK_ACCESS from .schemas.site_network_access import SCHEMA_SITE_NETWORK_ACCESS
from .tools.Authentication import HTTP_AUTH from .tools.Authentication import HTTP_AUTH
from .tools.ContextMethods import get_service, get_slice from .tools.ContextMethods import get_slice
from .tools.HttpStatusCodes import HTTP_NOCONTENT, HTTP_SERVERERROR from .tools.HttpStatusCodes import HTTP_NOCONTENT, HTTP_SERVERERROR
from .tools.Validator import validate_message from .tools.Validator import validate_message
from .Constants import ( from .Constants import (
...@@ -39,7 +38,7 @@ from .Constants import ( ...@@ -39,7 +38,7 @@ from .Constants import (
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
def process_site_network_access(context_client : ContextClient, site_id : str, site_network_access : Dict) -> Service: def process_site_network_access(context_client : ContextClient, site_id : str, site_network_access : Dict) -> Slice:
vpn_id = site_network_access['vpn-attachment']['vpn-id'] vpn_id = site_network_access['vpn-attachment']['vpn-id']
encapsulation_type = site_network_access['connection']['encapsulation-type'] encapsulation_type = site_network_access['connection']['encapsulation-type']
cvlan_id = site_network_access['connection']['tagged-interface'][encapsulation_type]['cvlan-id'] cvlan_id = site_network_access['connection']['tagged-interface'][encapsulation_type]['cvlan-id']
...@@ -70,21 +69,12 @@ def process_site_network_access(context_client : ContextClient, site_id : str, s ...@@ -70,21 +69,12 @@ def process_site_network_access(context_client : ContextClient, site_id : str, s
address_ip, address_prefix, remote_router, circuit_id address_ip, address_prefix, remote_router, circuit_id
) = mapping ) = mapping
target : Union[Service, Slice, None] = None target = get_slice(context_client, vpn_id)
if target is None: target = get_slice (context_client, vpn_id)
if target is None: target = get_service(context_client, vpn_id)
if target is None: raise Exception('VPN({:s}) not found in database'.format(str(vpn_id))) if target is None: raise Exception('VPN({:s}) not found in database'.format(str(vpn_id)))
if isinstance(target, Service): endpoint_ids = target.slice_endpoint_ids # pylint: disable=no-member
endpoint_ids = target.service_endpoint_ids # pylint: disable=no-member config_rules = target.slice_config.config_rules # pylint: disable=no-member
config_rules = target.service_config.config_rules # pylint: disable=no-member constraints = target.slice_constraints # pylint: disable=no-member
constraints = target.service_constraints # pylint: disable=no-member
elif isinstance(target, Slice):
endpoint_ids = target.slice_endpoint_ids # pylint: disable=no-member
config_rules = target.slice_config.config_rules # pylint: disable=no-member
constraints = target.slice_constraints # pylint: disable=no-member
else:
raise Exception('Target({:s}) not supported'.format(str(target.__class__.__name__)))
endpoint_id = update_endpoint_ids(endpoint_ids, device_uuid, endpoint_uuid) endpoint_id = update_endpoint_ids(endpoint_ids, device_uuid, endpoint_uuid)
...@@ -130,8 +120,7 @@ def process_site_network_access(context_client : ContextClient, site_id : str, s ...@@ -130,8 +120,7 @@ def process_site_network_access(context_client : ContextClient, site_id : str, s
return target return target
def process_list_site_network_access( def process_list_site_network_access(
context_client : ContextClient, service_client : ServiceClient, slice_client : SliceClient, site_id : str, context_client : ContextClient, slice_client : SliceClient, site_id : str, request_data : Dict
request_data : Dict
) -> Response: ) -> Response:
LOGGER.debug('Request: {:s}'.format(str(request_data))) LOGGER.debug('Request: {:s}'.format(str(request_data)))
...@@ -142,16 +131,9 @@ def process_list_site_network_access( ...@@ -142,16 +131,9 @@ def process_list_site_network_access(
sna_request = process_site_network_access(context_client, site_id, site_network_access) sna_request = process_site_network_access(context_client, site_id, site_network_access)
LOGGER.debug('sna_request = {:s}'.format(grpc_message_to_json_string(sna_request))) LOGGER.debug('sna_request = {:s}'.format(grpc_message_to_json_string(sna_request)))
try: try:
if isinstance(sna_request, Service): sna_reply = slice_client.UpdateSlice(sna_request)
sna_reply = service_client.UpdateService(sna_request) if sna_reply != sna_request.slice_id: # pylint: disable=no-member
if sna_reply != sna_request.service_id: # pylint: disable=no-member raise Exception('Slice update failed. Wrong Slice Id was returned')
raise Exception('Service update failed. Wrong Service Id was returned')
elif isinstance(sna_request, Slice):
sna_reply = slice_client.UpdateSlice(sna_request)
if sna_reply != sna_request.slice_id: # pylint: disable=no-member
raise Exception('Slice update failed. Wrong Slice Id was returned')
else:
raise NotImplementedError('Support for Class({:s}) not implemented'.format(str(type(sna_request))))
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
msg = 'Something went wrong Updating VPN {:s}' msg = 'Something went wrong Updating VPN {:s}'
LOGGER.exception(msg.format(grpc_message_to_json_string(sna_request))) LOGGER.exception(msg.format(grpc_message_to_json_string(sna_request)))
...@@ -167,15 +149,13 @@ class L2VPN_SiteNetworkAccesses(Resource): ...@@ -167,15 +149,13 @@ class L2VPN_SiteNetworkAccesses(Resource):
if not request.is_json: raise UnsupportedMediaType('JSON payload is required') if not request.is_json: raise UnsupportedMediaType('JSON payload is required')
LOGGER.debug('Site_Id: {:s}'.format(str(site_id))) LOGGER.debug('Site_Id: {:s}'.format(str(site_id)))
context_client = ContextClient() context_client = ContextClient()
service_client = ServiceClient()
slice_client = SliceClient() slice_client = SliceClient()
return process_list_site_network_access(context_client, service_client, slice_client, site_id, request.json) return process_list_site_network_access(context_client, slice_client, site_id, request.json)
@HTTP_AUTH.login_required @HTTP_AUTH.login_required
def put(self, site_id : str): def put(self, site_id : str):
if not request.is_json: raise UnsupportedMediaType('JSON payload is required') if not request.is_json: raise UnsupportedMediaType('JSON payload is required')
LOGGER.debug('Site_Id: {:s}'.format(str(site_id))) LOGGER.debug('Site_Id: {:s}'.format(str(site_id)))
context_client = ContextClient() context_client = ContextClient()
service_client = ServiceClient()
slice_client = SliceClient() slice_client = SliceClient()
return process_list_site_network_access(context_client, service_client, slice_client, site_id, request.json) return process_list_site_network_access(context_client, slice_client, site_id, request.json)
...@@ -72,6 +72,10 @@ def compose_constraint(constraint : Constraint) -> Dict: ...@@ -72,6 +72,10 @@ def compose_constraint(constraint : Constraint) -> Dict:
LOGGER.warning('Ignoring unsupported Constraint({:s})'.format(str_constraint)) LOGGER.warning('Ignoring unsupported Constraint({:s})'.format(str_constraint))
return None return None
constraint_type = constraint.custom.constraint_type constraint_type = constraint.custom.constraint_type
if constraint_type in {'diversity'}:
str_constraint = grpc_message_to_json_string(constraint)
LOGGER.warning('Ignoring unsupported Constraint({:s})'.format(str_constraint))
return None
constraint_value = constraint.custom.constraint_value constraint_value = constraint.custom.constraint_value
return {'constraint_type': constraint_type, 'constraint_value': constraint_value} return {'constraint_type': constraint_type, 'constraint_value': constraint_value}
...@@ -129,6 +133,12 @@ def compose_service(grpc_service : Service) -> Dict: ...@@ -129,6 +133,12 @@ def compose_service(grpc_service : Service) -> Dict:
for service_constraint in grpc_service.service_constraints for service_constraint in grpc_service.service_constraints
])) ]))
constraint_types = {constraint['constraint_type'] for constraint in constraints}
if 'bandwidth[gbps]' not in constraint_types:
constraints.append({'constraint_type': 'bandwidth[gbps]', 'constraint_value': '20.0'})
if 'latency[ms]' not in constraint_types:
constraints.append({'constraint_type': 'latency[ms]', 'constraint_value': '20.0'})
return { return {
'serviceId': service_id, 'serviceId': service_id,
'serviceType': service_type, 'serviceType': service_type,
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import grpc, logging #, deepdiff import grpc, json, logging #, deepdiff
from common.proto.context_pb2 import ( from common.proto.context_pb2 import (
Empty, Service, ServiceId, ServiceStatusEnum, ServiceTypeEnum, Slice, SliceId, SliceStatusEnum) Empty, Service, ServiceId, ServiceStatusEnum, ServiceTypeEnum, Slice, SliceId, SliceStatusEnum)
from common.proto.slice_pb2_grpc import SliceServiceServicer from common.proto.slice_pb2_grpc import SliceServiceServicer
...@@ -21,7 +21,7 @@ from common.tools.grpc.ConfigRules import copy_config_rules ...@@ -21,7 +21,7 @@ from common.tools.grpc.ConfigRules import copy_config_rules
from common.tools.grpc.Constraints import copy_constraints from common.tools.grpc.Constraints import copy_constraints
from common.tools.grpc.EndPointIds import copy_endpoint_ids from common.tools.grpc.EndPointIds import copy_endpoint_ids
from common.tools.grpc.ServiceIds import update_service_ids from common.tools.grpc.ServiceIds import update_service_ids
from common.tools.grpc.Tools import grpc_message_to_json from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string
from context.client.ContextClient import ContextClient from context.client.ContextClient import ContextClient
from interdomain.client.InterdomainClient import InterdomainClient from interdomain.client.InterdomainClient import InterdomainClient
from service.client.ServiceClient import ServiceClient from service.client.ServiceClient import ServiceClient
...@@ -41,9 +41,9 @@ class SliceServiceServicerImpl(SliceServiceServicer): ...@@ -41,9 +41,9 @@ class SliceServiceServicerImpl(SliceServiceServicer):
context_client = ContextClient() context_client = ContextClient()
try: try:
_slice = context_client.GetSlice(request.slice_id) _slice = context_client.GetSlice(request.slice_id)
json_current_slice = grpc_message_to_json(_slice) #json_current_slice = grpc_message_to_json(_slice)
except: except:
json_current_slice = {} #json_current_slice = {}
slice_request = Slice() slice_request = Slice()
slice_request.slice_id.CopyFrom(request.slice_id) slice_request.slice_id.CopyFrom(request.slice_id)
slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
...@@ -82,7 +82,7 @@ class SliceServiceServicerImpl(SliceServiceServicer): ...@@ -82,7 +82,7 @@ class SliceServiceServicerImpl(SliceServiceServicer):
except: except:
service_request = Service() service_request = Service()
service_request.service_id.CopyFrom(service_id) service_request.service_id.CopyFrom(service_id)
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L2NM service_request.service_type = ServiceTypeEnum.SERVICETYPE_UNKNOWN
service_request.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED service_request.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED
service_reply = service_client.CreateService(service_request) service_reply = service_client.CreateService(service_request)
if service_reply != service_request.service_id: # pylint: disable=no-member if service_reply != service_request.service_id: # pylint: disable=no-member
...@@ -95,6 +95,34 @@ class SliceServiceServicerImpl(SliceServiceServicer): ...@@ -95,6 +95,34 @@ class SliceServiceServicerImpl(SliceServiceServicer):
copy_constraints(request.slice_constraints, service_request.service_constraints) copy_constraints(request.slice_constraints, service_request.service_constraints)
copy_config_rules(request.slice_config.config_rules, service_request.service_config.config_rules) copy_config_rules(request.slice_config.config_rules, service_request.service_config.config_rules)
service_request.service_type = ServiceTypeEnum.SERVICETYPE_UNKNOWN
for config_rule in request.slice_config.config_rules:
LOGGER.info('config_rule: {:s}'.format(grpc_message_to_json_string(config_rule)))
config_rule_kind = config_rule.WhichOneof('config_rule')
LOGGER.info('config_rule_kind: {:s}'.format(str(config_rule_kind)))
if config_rule_kind != 'custom': continue
custom = config_rule.custom
resource_key = custom.resource_key
LOGGER.info('resource_key: {:s}'.format(str(resource_key)))
# TODO: parse resource key with regular expression, e.g.:
# m = re.match('\/device\[[^\]]\]\/endpoint\[[^\]]\]\/settings', s)
if not resource_key.startswith('/device'): continue
if not resource_key.endswith('/settings'): continue
resource_value = json.loads(custom.resource_value)
LOGGER.info('resource_value: {:s}'.format(str(resource_value)))
if service_request.service_type == ServiceTypeEnum.SERVICETYPE_UNKNOWN:
if (resource_value.get('address_ip') is not None and \
resource_value.get('address_prefix') is not None):
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L3NM
LOGGER.info('is L3')
else:
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
LOGGER.info('is L2')
break
service_reply = service_client.UpdateService(service_request) service_reply = service_client.UpdateService(service_request)
if service_reply != service_request.service_id: # pylint: disable=no-member if service_reply != service_request.service_id: # pylint: disable=no-member
raise Exception('Service update failed. Wrong Service Id was returned') raise Exception('Service update failed. Wrong Service Id was returned')
......
...@@ -17,4 +17,5 @@ ...@@ -17,4 +17,5 @@
# - my_deploy.sh # - my_deploy.sh
# - tfs_runtime_env_vars.sh # - tfs_runtime_env_vars.sh
source tfs_runtime_env_vars.sh
pytest --verbose src/tests/ofc22/tests/test_functional_bootstrap.py pytest --verbose src/tests/ofc22/tests/test_functional_bootstrap.py
...@@ -13,4 +13,5 @@ ...@@ -13,4 +13,5 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
source tfs_runtime_env_vars.sh
pytest --verbose src/tests/ofc22/tests/test_functional_create_service.py pytest --verbose src/tests/ofc22/tests/test_functional_create_service.py
...@@ -13,4 +13,5 @@ ...@@ -13,4 +13,5 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
source tfs_runtime_env_vars.sh
pytest --verbose src/tests/ofc22/tests/test_functional_delete_service.py pytest --verbose src/tests/ofc22/tests/test_functional_delete_service.py
...@@ -13,4 +13,5 @@ ...@@ -13,4 +13,5 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
source tfs_runtime_env_vars.sh
pytest --verbose src/tests/ofc22/tests/test_functional_cleanup.py pytest --verbose src/tests/ofc22/tests/test_functional_cleanup.py
...@@ -29,6 +29,8 @@ rm -f $COVERAGEFILE ...@@ -29,6 +29,8 @@ rm -f $COVERAGEFILE
# Force a flush of Context database # Force a flush of Context database
kubectl --namespace $TFS_K8S_NAMESPACE exec -it deployment/contextservice --container redis -- redis-cli FLUSHALL kubectl --namespace $TFS_K8S_NAMESPACE exec -it deployment/contextservice --container redis -- redis-cli FLUSHALL
source tfs_runtime_env_vars.sh
# Run functional tests and analyze code coverage at the same time # Run functional tests and analyze code coverage at the same time
coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
tests/ofc22/tests/test_functional_bootstrap.py tests/ofc22/tests/test_functional_bootstrap.py
......
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