Skip to content

Commit

Permalink
added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
joao-alegria committed May 11, 2021
1 parent 127dcf3 commit b2b85b8
Show file tree
Hide file tree
Showing 118 changed files with 2,961 additions and 543 deletions.
2 changes: 1 addition & 1 deletion catalogue/slicer-catalogue
108 changes: 1 addition & 107 deletions catalogue/tmp.json
Original file line number Diff line number Diff line change
@@ -1,107 +1 @@
{
"message": "Success",
"error": false,
"data": {
"vsd": {
"is_public": true,
"nested_vsd_ids": {},
"vs_blueprint_id": "1",
"domain_id": "ITAV",
"version": "1.0",
"management_type": "TENANT_MANAGED",
"name": "vsdTest",
"qos_parameters": {"peers":"2"},
"descriptor_id": "1",
"tenant_id": "admin"
},
"vs_blueprint_info": {
"owner": "ITAV",
"vs_blueprint_id": "1",
"vs_blueprint_version": "version_1",
"name": "vsb-test",
"vs_blueprint": {
"slice_service_type": "EMBB",
"translation_rules": [
{
"nst_id": "interdomain_e2e_nst",
"input": [
{
"max_value": 5,
"parameter_id": "peers",
"min_value": 1
}
],
"nsd_version": "1.0",
"nsd_id": "interdomain-ns",
"blueprint_id": "1"
}
],
"parameters": [
{
"parameter_id": "peers",
"parameter_type": "number",
"applicability_field": "interdomain",
"parameter_name": "Peers",
"parameter_description": "#Peers"
}
],
"version": "version_1",
"name": "vsb-test",
"inter_site": true,
"blueprint_id": "1",
"configurable_parameters": [
"peers"
]
}
},
"nsts":[
{
"nst_version": "1.0",
"nsst_ids": [
"interdomain_nsst",
"interdomain_nsst"
],
"nsst_type": "EMBB",
"nst_service_profile": {
"service_profile_id": "interdomain_profile",
"eMBB_perf_req": [
{
"user_density": 100,
"uE_speed": 10
}
],
"latency": 100,
"sST": "EMBB",
"max_number_of_UEs": 1000,
"availability": 100
},
"nsd_version": "1.0",
"nst_id": "interdomain_e2e_nst",
"nst_provider": "ITAV",
"nst_name": "Interdomain Slice"
},
{
"nst_version": "1.0",
"nsst_type": "EMBB",
"nst_service_profile": {
"service_profile_id": "interdomain_profile",
"eMBB_perf_req": [
{
"user_density": 100,
"uE_speed": 10
}
],
"latency": 100,
"sST": "EMBB",
"max_number_of_UEs": 1000,
"availability": 100
},
"nsd_version": "1.0",
"nst_id": "interdomain_nsst",
"nst_provider": "ITAV",
"nst_name": "Interdomain Slice Subnet",
"nsd_id": "interdomain_slice_nsd"
}
]
}
}
{"message": "Success", "vsiId": "2", "msgType": "catalogueInfo", "error": false, "data": {"vsd": {"tenant_id": "user", "associated_vsd_id": null, "domain_id": "ITAV", "vs_descriptor_id": "608ae08e063c52ff4d88f32f", "version": "1.0", "is_public": true, "nested_vsd_ids": {}, "service_constraints": [], "vs_blueprint_id": "608ae069063c52ff4d88f327", "name": "vsdTest", "sla": null, "management_type": "TENANT_MANAGED", "qos_parameters": {"peers": "2"}}, "vs_blueprint_info": {"vs_blueprint": {"urllc_service_category": null, "end_points": [], "inter_site": true, "parameters": [{"parameter_id": "peers", "parameter_type": "number", "applicability_field": "interdomain", "parameter_name": "Peers", "parameter_description": "#Peers"}], "version": "version_1", "blueprint_id": "608ae069063c52ff4d88f327", "service_sequence": [], "translation_rules": [{"nsd_version": "1.0", "input": [{"parameter_id": "peers", "max_value": 5, "min_value": 1}], "nsd_id": "interdomain-ns", "nst_id": "interdomain_e2e_nst", "blueprint_id": "608ae069063c52ff4d88f327", "nsd_info_id": null, "ns_instantiation_level_id": null, "ns_flavour_id": null}], "name": "vsb-test", "description": null, "atomic_components": [], "configurable_parameters": [], "application_metrics": [], "connectivity_services": [], "embb_service_category": "URBAN_MACRO", "slice_service_type": "EMBB"}, "on_boarded_nst_info_id": [], "on_boarded_mec_app_package_info_id": [], "on_boarded_vnf_package_info_id": [], "owner": null, "active_vsd_id": ["VsDescriptor object"], "vs_blueprint_id": "608ae069063c52ff4d88f327", "name": "vsb-test", "vs_blueprint_version": "version_1", "on_boarded_nsd_info_id": []}, "nsts": [{"nst_name": "Interdomain Slice", "nsst": [{"nst_name": "Interdomain Slice Subnet", "nsst": [], "nsd_version": "1.0", "geographical_area_info_list": [], "nst_provider": "ITAV", "nsd_id": "interdomain_slice_nsd", "nst_id": "interdomain_nsst", "nst_version": "1.0", "nst_service_profile": {"latency": 100, "sST": "EMBB", "resource_sharing_level": null, "max_number_of_UEs": 1000, "coverage_area_TA_list": [], "service_profile_id": "interdomain_profile", "uRLLC_perf_req": [], "availability": 100.0, "pLMN_id_list": [], "eMBB_perf_req": [{"user_density": 100, "activity_factor": null, "exp_data_rate_DL": null, "area_traffic_cap_DL": null, "area_traffic_cap_UL": null, "uE_speed": 10, "coverage": null, "exp_data_rate_uL": null}], "uE_mobility_level": null}, "nsst_type": "NONE", "nsst_ids": []}, {"nst_name": "Interdomain Slice Subnet", "nsst": [], "nsd_version": "1.0", "geographical_area_info_list": [], "nst_provider": "ITAV", "nsd_id": "interdomain_slice_nsd", "nst_id": "interdomain_nsst", "nst_version": "1.0", "nst_service_profile": {"latency": 100, "sST": "EMBB", "resource_sharing_level": null, "max_number_of_UEs": 1000, "coverage_area_TA_list": [], "service_profile_id": "interdomain_profile", "uRLLC_perf_req": [], "availability": 100.0, "pLMN_id_list": [], "eMBB_perf_req": [{"user_density": 100, "activity_factor": null, "exp_data_rate_DL": null, "area_traffic_cap_DL": null, "area_traffic_cap_UL": null, "uE_speed": 10, "coverage": null, "exp_data_rate_uL": null}], "uE_mobility_level": null}, "nsst_type": "NONE", "nsst_ids": []}], "nsd_version": "1.0", "geographical_area_info_list": [], "nst_provider": "ITAV", "nsd_id": null, "nst_id": "interdomain_e2e_nst", "nst_version": "1.0", "nst_service_profile": {"latency": 100, "sST": "EMBB", "resource_sharing_level": null, "max_number_of_UEs": 1000, "coverage_area_TA_list": [], "service_profile_id": "interdomain_profile", "uRLLC_perf_req": [], "availability": 100.0, "pLMN_id_list": [], "eMBB_perf_req": [{"user_density": 100, "activity_factor": null, "exp_data_rate_DL": null, "area_traffic_cap_DL": null, "area_traffic_cap_UL": null, "uE_speed": 10, "coverage": null, "exp_data_rate_uL": null}], "uE_mobility_level": null}, "nsst_type": "NONE", "nsst_ids": ["interdomain_nsst", "interdomain_nsst"]}], "vsb_actions": [{"action_name": "Add Tunnel Peer", "action_id": "addpeer", "parameters": [{"parameter_type": "STRING", "parameter_id": "peer_network", "parameter_name": "Peer Network", "parameter_default_value": "10.0.0.0/24"}], "blueprint_id": "608ae069063c52ff4d88f327"}, {"action_name": "Fetch Tunnel Peer Info", "action_id": "getvnfinfo", "parameters": [], "blueprint_id": "608ae069063c52ff4d88f327"}]}}
Binary file modified coordinator/__pycache__/config.cpython-38.pyc
Binary file not shown.
Binary file not shown.
Binary file modified coordinator/__pycache__/service.cpython-38.pyc
Binary file not shown.
Binary file modified coordinator/api/__pycache__/controller.cpython-38.pyc
Binary file not shown.
Binary file modified coordinator/api/__pycache__/loginConfig.cpython-38.pyc
Binary file not shown.
5 changes: 2 additions & 3 deletions coordinator/api/controller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from flask import Flask, jsonify, request
from flasgger import Swagger, validate
import db.persistance
import service as vsService
from api.loginConfig import loginManager, current_user, login_required
from flask_cors import CORS, cross_origin
Expand Down Expand Up @@ -130,7 +129,7 @@ def removeVs(vsiId):
"""

try:
vsService.removeVSI(current_user.name, vsiId)
return jsonify({"message":"Success"}),200
message=vsService.removeVSI(current_user.name, vsiId)
return jsonify({"message":message}),200
except Exception as e:
return jsonify({"message":"Error: "+str(e)}),500
1 change: 1 addition & 0 deletions coordinator/api/definitions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ definitions:
- name
- vsdId
- vsiId
- description
properties:
vsiId:
type: string
Expand Down
1 change: 1 addition & 0 deletions coordinator/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
IDP_IP=os.getenv("IDP_IP","localhost")
IDP_PORT=os.getenv("IDP_PORT",5002)
IDP_ENDPOINT=os.getenv("IDP_ENDPOINT","/validate")
ENVIRONMENT=os.getenv("ENVIRONMENT","testing")
92 changes: 92 additions & 0 deletions coordinator/coordinator_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import pytest
from api.loginConfig import Tenant
from api.controller import app
from db.persistance import DB
import flask_login
import rabbitmq.adaptor

@pytest.fixture
def client(rabbit):
DB.createDB()
app.testing=True
yield app.test_client()
DB.removeDB()

@pytest.fixture
def rabbit(monkeypatch, mocker):
def mock_messaging(*args, **kwargs):
return None
monkeypatch.setattr(rabbitmq.adaptor.Messaging, "__init__", mock_messaging)

def mock_messagingConsume(*args, **kwargs):
return None
monkeypatch.setattr(rabbitmq.adaptor.Messaging, "consumeQueue", mock_messagingConsume)

def mock_messagingCreateQueue(*args, **kwargs):
return None
monkeypatch.setattr(rabbitmq.adaptor.Messaging, "createQueue", mock_messagingCreateQueue)

def mock_messagingCreateExchange(*args, **kwargs):
return None
monkeypatch.setattr(rabbitmq.adaptor.Messaging, "createExchange", mock_messagingCreateExchange)

def mock_messagingBind(*args, **kwargs):
return None
monkeypatch.setattr(rabbitmq.adaptor.Messaging, "bindQueue2Exchange", mock_messagingBind)

# def mock_messagingPublish(*args, **kwargs):
# assert args==[]
# return None
# monkeypatch.setattr(rabbitmq.adaptor.Messaging, "publish2Exchange", mock_messagingConsume)
mocker.patch('rabbitmq.adaptor.Messaging.publish2Exchange')


@pytest.fixture
def adminUser(monkeypatch):
def mock_requestLoader(*args, **kwargs):
return Tenant("admin", "ADMIN")
monkeypatch.setattr(flask_login.utils, "_get_user", mock_requestLoader)

@pytest.fixture
def tenantUser(monkeypatch):
def mock_requestLoader(*args, **kwargs):
return Tenant("user", "TENANT")
monkeypatch.setattr(flask_login.utils, "_get_user", mock_requestLoader)

def test_requestWithoutAuthorization(client):
response=client.get("/vs")
assert response.status_code==401

def test_getVSI(client,tenantUser):
response=client.get("/vs")
dataFetched=response.json
assert response.status_code==200
assert len(dataFetched["data"])==0

def test_getDomainById(client,tenantUser):
test_createNewVSI(client,tenantUser)
response=client.get("/vs/2")
dataFetched=response.json
assert dataFetched["data"]["vsiId"]=="2"
assert dataFetched["data"]["status"]=="creating"

def test_getVSIAfterPost(client,tenantUser):
test_createNewVSI(client,tenantUser)
response=client.get("/vs")
assert response.status_code==200
dataFetched=response.json
assert len(dataFetched["data"])==1
assert [(vsi["vsiId"], vsi["status"]) for vsi in dataFetched["data"]]==[("2","creating")]

def test_createNewVSI(client,tenantUser):
test_getVSI(client,tenantUser)
vsiData={"name":"test","vsdId":"608ae08e063c52ff4d88f32f","domainId":"ITAV","vsiId":"2","domainPlacements":[{"domainId":"DETI","componentName":"test_VSI-1_1"},{"domainId":"DETI","componentName":"test_VSI-1_2"}]}
response=client.post("/vs", json=vsiData)
assert response.status_code==200
assert response.json["message"]=="Success"

def test_deleteExistingVSI(client,tenantUser):
test_getVSIAfterPost(client,tenantUser)
response=client.delete("/vs/2")
assert response.status_code==200
test_getVSI(client,tenantUser)
Binary file modified coordinator/db/__pycache__/persistance.cpython-38.pyc
Binary file not shown.
64 changes: 41 additions & 23 deletions coordinator/db/persistance.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,48 @@
import json
import config

class DB:

def __init__(self, Base):
super().__init__()
self.Base=Base

def persist(self,entity):
self.session.add(entity)
self.session.commit()

def delete(self,entity):
self.session.delete(entity)
self.session.commit()

def createDB(self):
if config.ENVIRONMENT=="testing":
self.engine = create_engine('sqlite:///:memory:')
else:
self.engine = create_engine('postgresql://'+str(config.POSTGRES_USER)+':'+str(config.POSTGRES_PASS)+'@'+str(config.POSTGRES_IP)+':'+str(config.POSTGRES_PORT)+'/'+str(config.POSTGRES_DB))
try:
self.Base.metadata.create_all(self.engine)
except Exception as e:
if "does not exist" in str(e):
tmpengine=create_engine('postgresql://'+str(config.POSTGRES_USER)+':'+str(config.POSTGRES_PASS)+'@'+str(config.POSTGRES_IP)+':'+str(config.POSTGRES_PORT)+'/postgres')
conn = tmpengine.connect()
conn.execute("commit")
conn.execute("create database \""+str(config.POSTGRES_DB)+"\"")
conn.close()
Base.metadata.create_all(self.engine)

Session = sessionmaker(bind=self.engine)
self.session=Session()


def removeDB(self):
self.Base.metadata.drop_all(self.engine)
self.session.close()



Base = declarative_base()
DB=DB(Base)

# nestedVsiTable = Table('nestedVsi', Base.metadata,
# Column('nestedVsi', Integer, ForeignKey('verticalServiceInstance.vsiId'), primary_key=True),
Expand Down Expand Up @@ -113,26 +154,3 @@ class NetworkSliceInstanceVnfPlacement(Base):
network_slice_instance = relationship("NetworkSliceInstance", back_populates="vnfs")
vnf_placement_key=Column(Integer, primary_key=True)
vnf_placement=Column(Integer)


engine = create_engine('postgresql://'+str(config.POSTGRES_USER)+':'+str(config.POSTGRES_PASS)+'@'+str(config.POSTGRES_IP)+':'+str(config.POSTGRES_PORT)+'/'+str(config.POSTGRES_DB))
try:
Base.metadata.create_all(engine)
except Exception as e:
if "does not exist" in str(e):
tmpengine=create_engine('postgresql://'+str(config.POSTGRES_USER)+':'+str(config.POSTGRES_PASS)+'@'+str(config.POSTGRES_IP)+':'+str(config.POSTGRES_PORT)+'/postgres')
conn = tmpengine.connect()
conn.execute("commit")
conn.execute("create database \""+str(config.POSTGRES_DB)+"\"")
conn.close()
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session=Session()
def persist(entity):
session.add(entity)
session.commit()

def delete(entity):
session.delete(entity)
session.commit()
3 changes: 3 additions & 0 deletions coordinator/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
from rabbitmq.messaging import MessageReceiver
import config
import logging
import db.persistance

if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.getLogger('pika').propagate=False

db.persistance.DB.createDB()

messageReceiver=MessageReceiver()
messageReceiver.start()

Expand Down
Binary file modified coordinator/rabbitmq/__pycache__/adaptor.cpython-38.pyc
Binary file not shown.
Loading

0 comments on commit b2b85b8

Please sign in to comment.