blob: f3daedfbabf3d9cde3f8fba49ea9b298203e0fcf [file] [log] [blame]
#
# Copyright 2017 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from __future__ import unicode_literals
import copy
import json
import os.path
import yaml
from lib.util import Util
import logging
from projecthandler.models import ProjectStateless
from lib.osm.osm_parser import OsmParser
from lib.osm.osm_rdcl_graph import OsmRdclGraph
from lib.osm.osmclient.client import Client
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger('OsmModel.py')
PATH_TO_SCHEMAS = 'lib/osm/schemas/'
PATH_TO_DESCRIPTORS_TEMPLATES = 'lib/osm/descriptor_template'
DESCRIPTOR_TEMPLATE_SUFFIX = '.json'
GRAPH_MODEL_FULL_NAME = 'lib/TopologyModels/osm/osm.yaml'
EXAMPLES_FOLDER = 'usecases/OSM/'
class OsmProject(ProjectStateless):
"""Osm Project class
The data model has the following descriptors:
# descrtiptor list in comment #
"""
def get_descriptors(self, type_descriptor):
"""Returns all descriptors of a given type"""
log.debug("Get %s descriptors", type_descriptor)
try:
client = Client()
if type_descriptor == 'nsd':
result = client.nsd_list()
elif type_descriptor == 'vnfd':
result = client.vnfd_list()
except Exception as e:
log.exception(e)
result = {}
return result
def get_descriptor(self, descriptor_id, type_descriptor):
"""Returns a specific descriptor"""
try:
client = Client()
if type_descriptor == 'nsd':
result = client.nsd_get(descriptor_id)
print result
elif type_descriptor == 'vnfd':
result = client.vnfd_get(descriptor_id)
print result
except Exception as e:
log.exception(e)
result = {}
return result
@classmethod
def data_project_from_files(cls, request):
file_dict = {}
for my_key in request.FILES.keys():
file_dict[my_key] = request.FILES.getlist(my_key)
log.debug(file_dict)
data_project = OsmParser.importprojectfiles(file_dict)
return data_project
@classmethod
def data_project_from_example(cls, request):
osm_id = request.POST.get('example-osm-id', '')
data_project = OsmParser.importprojectdir(EXAMPLES_FOLDER + osm_id + '/JSON', 'yaml')
return data_project
@classmethod
def get_example_list(cls):
"""Returns a list of directories, in each directory there is a project osm"""
path = EXAMPLES_FOLDER
dirs = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
return {'osm': dirs}
@classmethod
def get_new_descriptor(cls, descriptor_type, request_id):
json_template = cls.get_descriptor_template(descriptor_type)
return json_template
@classmethod
def get_descriptor_template(cls, type_descriptor):
"""Returns a descriptor template for a given descriptor type"""
try:
schema = Util.loadjsonfile(os.path.join(PATH_TO_DESCRIPTORS_TEMPLATES, type_descriptor + DESCRIPTOR_TEMPLATE_SUFFIX))
return schema
except Exception as e:
log.exception(e)
return False
@classmethod
def get_clone_descriptor(cls, descriptor, type_descriptor, new_descriptor_id):
new_descriptor = copy.deepcopy(descriptor)
return new_descriptor
def get_type(self):
return "osm"
def __str__(self):
return self.name
def get_overview_data(self):
current_data = json.loads(self.data_project)
client = Client()
nsd = client.nsd_list()
vnfd = client.vnfd_list()
ns = client.ns_list()
vnf = client.vnf_list()
result = {
'owner': self.owner.__str__(),
'name': self.name,
'updated_date': self.updated_date.strftime('%Y-%m-%d %H:%M'),
'info': self.info,
'type': 'osm',
'nsd': len(nsd) if nsd else 0,
'vnfd': len(vnfd) if vnfd else 0,
'ns': len(ns) if ns else 0,
'vnf': len(vnf) if vnf else 0,
#'validated': self.validated
}
return result
def get_graph_data_json_topology(self, descriptor_id):
rdcl_graph = OsmRdclGraph()
project = self.get_dataproject()
topology = rdcl_graph.build_graph_from_project(project,
model=self.get_graph_model(GRAPH_MODEL_FULL_NAME))
return json.dumps(topology)
def create_descriptor(self, descriptor_name, type_descriptor, new_data, data_type, file_uploaded):
"""Creates a descriptor of a given type from a json or yaml representation
Returns the descriptor id or False
"""
log.debug('Create descriptor')
try:
client = Client()
if type_descriptor == 'nsd':
result = client.nsd_onboard(file_uploaded)
elif type_descriptor == 'vnfd':
result = client.vnfd_onboard(file_uploaded)
else:
log.debug('Create descriptor: Unknown data type')
return False
except Exception as e:
log.exception(e)
result = False
return result
def delete_descriptor(self, type_descriptor, descriptor_id):
log.debug('Delete descriptor')
try:
client = Client()
if type_descriptor == 'nsd':
result = client.nsd_delete(descriptor_id)
elif type_descriptor == 'vnfd':
result = client.vnfd_delete(descriptor_id)
else:
log.debug('Create descriptor: Unknown data type')
return False
except Exception as e:
log.exception(e)
result = False
return result
def edit_descriptor(self, type_descriptor, descriptor_id, new_data, data_type):
log.debug("Edit descriptor")
try:
client = Client()
if type_descriptor == 'nsd':
if data_type == 'yaml':
new_data = yaml.load(new_data)
elif data_type == 'json':
new_data = json.loads(new_data)
result = client.nsd_update(descriptor_id, new_data)
elif type_descriptor == 'vnfd':
if data_type == 'yaml':
new_data = yaml.load(new_data)
elif data_type == 'json':
new_data = json.loads(new_data)
result = client.vnfd_update(descriptor_id, new_data)
else:
log.debug('Create descriptor: Unknown data type')
return False
except Exception as e:
log.exception(e)
result = False
return result
def get_package_files_list(self, type_descriptor, descriptor_id):
try:
client = Client()
if type_descriptor == 'nsd':
result = client.nsd_artifacts(descriptor_id)
elif type_descriptor == 'vnfd':
result = client.vnf_packages_artifacts(descriptor_id)
else:
return False
result = yaml.load(result)
print result
except Exception as e:
log.exception(e)
result = False
print result
return result
def set_validated(self, value):
self.validated = True if value is not None and value == True else False
def get_add_element(self, request):
result = False
return result
def get_remove_element(self, request):
result = False
return result
def get_add_link(self, request):
result = False
return result
def get_remove_link(self, request):
result = False
return result
def create_ns(self, descriptor_type, descriptor_id, data_ns):
try:
client = Client()
if descriptor_type == 'nsd':
result = client.ns_create( data_ns)
else:
return False
except Exception as e:
log.exception(e)
result = False
print result
return result
def download_pkg(self, project, descriptor_id, descriptor_type):
try:
client = Client()
if descriptor_type == 'nsd':
result = client.get_nsd_pkg(descriptor_id)
elif descriptor_type == 'vnfd':
result = client.get_vnfd_pkg(descriptor_id)
else:
return False
except Exception as e:
log.exception(e)
result = False
print result
return result
def get_available_nodes(self, args):
"""Returns all available node """
log.debug('get_available_nodes')
try:
result = []
#current_data = json.loads(self.data_project)
model_graph = self.get_graph_model(GRAPH_MODEL_FULL_NAME)
for node in model_graph['layer'][args['layer']]['nodes']:
current_data = {
"id": node,
"category_name": model_graph['nodes'][node]['label'],
"types": [
{
"name": "generic",
"id": node
}
]
}
result.append(current_data)
#result = current_data[type_descriptor][descriptor_id]
except Exception as e:
log.debug(e)
result = []
return result