Ejemplo n.º 1
0
def release_resources(username, experiment_id):
    experiments_to_delete = find_by_element_value(entities.Experiment,
                                                  entities.Experiment.id,
                                                  experiment_id)
    if len(experiments_to_delete) == 0:
        logger.error("No experiment to be deleted....")
        raise ExperimentNotFound("No experiment to be deleted....")
    experiment_to_delete = experiments_to_delete[0]
    _release_all_experiment_resources(experiment_to_delete, username)
    logger.info("deleting %s" % experiment_to_delete.name)
    delete(experiment_to_delete)
 def register(self, request, context):
     logger.info("registering %s" % request.name)
     old_managers = find_by_element_value(ManagerEndpoint,
                                          ManagerEndpoint.name,
                                          request.name)
     for old_man in old_managers:
         delete(old_man)
         logger.debug("Removed old manager endpoint: %s:%s" %
                      (old_man.name, old_man.endpoint))
     manager_endpoint = ManagerEndpoint()
     manager_endpoint.name = request.name
     manager_endpoint.endpoint = request.endpoint
     save(manager_endpoint, ManagerEndpoint)
     list_resources()
     response_message = messages_pb2.ResponseMessage()
     response_message.result = 0
     return response_message
Ejemplo n.º 3
0
def _save_or_create_experimenter(user_info, role="experimenter"):
    old_experimenter = find_by_element_value(Experimenter,
                                             Experimenter.username,
                                             user_info.name)
    if not old_experimenter:
        experimenter = Experimenter()
    else:
        experimenter = old_experimenter[0]

    experimenter.username = user_info.name
    experimenter.password = user_info.password
    experimenter.role = role
    experimenter.testbed_tenants = {}
    experimenter.ob_project_id = user_info.ob_project_id
    for k, v in user_info.testbed_tenants.items():
        experimenter.testbed_tenants[k] = v
    save(experimenter)
    return experimenter
Ejemplo n.º 4
0
def update_experiment(username, manager_name, resources):
    experiments = find_by_element_value(entities.Experiment,
                                        entities.Experiment.username, username)
    try:
        for new_res in resources:
            new_res_dict = json.loads(new_res.content)
            for experiment in experiments:
                for ur in experiment.resources:
                    if manager_name == 'nfv-manager' and ur.node_type == 'NfvResource':
                        try:
                            val_dict = json.loads(ur.value)
                        except Exception as e:
                            logger.warning(
                                "Failed parsing of experiment: name: %s, username: %s"
                                % (experiment.name, experiment.username))
                            raise e
                        if ur.node_type in get_mapping_managers().get(manager_name) \
                                and val_dict.get('id') == new_res_dict.get('id'):
                            ur.value = json.dumps(new_res_dict)
                    elif manager_name == 'security-manager' and ur.node_type == 'SecurityResource':
                        try:
                            val_dict = json.loads(ur.value)
                        except Exception as e:
                            logger.warning(
                                "Failed parsing of experiment: name: %s, username: %s"
                                % (experiment.name, experiment.username))
                            raise e
                        if val_dict.get('random_id') == new_res_dict.get(
                                'random_id'):
                            ur.value = json.dumps(new_res_dict)
                    else:
                        if ur.node_type in get_mapping_managers().get(
                                manager_name):
                            ur.value = json.dumps(new_res_dict)
                save(experiment)
    except:
        logger.warning(
            "error while updating resource of manager %s. Error is: %s " %
            (manager_name, traceback._cause_message))
Ejemplo n.º 5
0
def provide_resources(username, experiment_id):
    experiments_to_deploy = find_by_element_value(entities.Experiment,
                                                  entities.Experiment.id,
                                                  experiment_id)
    if len(experiments_to_deploy) == 0:
        logger.error("No experiment to be deployed....")
        raise ExperimentNotFound("No experiment to be deployed....")
    experiment_to_deploy = experiments_to_deploy[0]

    res_in_error_or_deployed = 0
    for ur in experiment_to_deploy.resources:
        if ur.status in [
                entities.ResourceStatus.ERROR.value,
                entities.ResourceStatus.DEPLOYED.value
        ]:
            res_in_error_or_deployed += 1
    if res_in_error_or_deployed > 0:
        logger.error("Deploying a resource in error or deployed state....")
        raise ExperimentValidationError(
            "You cannot deploy a resource in error or deployed state. Please delete it first"
        )
    for ur in experiment_to_deploy.resources:
        today = datetime.today().date()
        start_date = ur.start_date
        end_date = ur.end_date
        # to make sure that we don't run into any problems due to the wrong type, even though this should not happen
        if isinstance(start_date, datetime):
            start_date = start_date.date()
        if isinstance(end_date, datetime):
            end_date = end_date.date()
        if start_date > today:
            logger.error(
                'The resource {} is reserved for a time period which begins in the future. You cannot use it yet.'
                .format(ur.name))
            raise ExperimentValidationError(
                'The resource {} is reserved for a time period which begins in the future. You cannot use it yet.'
                .format(ur.name))
        if end_date < today:
            logger.error(
                'For the resource {} the reserved time period ended already.'.
                format(ur.name))
            raise ExperimentValidationError(
                'For the resource {} the reserved time period ended already.'.
                format(ur.name))
    user_info = get_user_info(username)
    if hasattr(user_info, 'name'):
        un = user_info.name
    else:
        un = user_info.username
    logger.debug("Received deploy resources from user %s" % un)
    logger.debug("Received deploy resources %s" % experiment_to_deploy.name)

    involved_managers = [
        man_name for ur in experiment_to_deploy.resources
        for man_name, node_types in get_mapping_managers().items()
        if ur.node_type in node_types
    ]

    manager_ordered = get_config('system', 'deployment-order', '').split(';')
    remaining_managers = set(list(
        get_mapping_managers().keys())) - set(manager_ordered)
    value_to_pass = {}

    for manager_name in manager_ordered:
        if manager_name in involved_managers:
            result = _provide_all_resources_for_manager(
                experiment_to_deploy, manager_name, user_info, value_to_pass)
            value_to_pass = {}
            for ktp in keys_to_pass:
                for v in result:
                    if ktp in v.keys():
                        value_to_pass[ktp] = v.get(ktp)
    for manager_name in remaining_managers:
        if manager_name in involved_managers:
            _provide_all_resources_for_manager(experiment_to_deploy,
                                               manager_name, user_info)
Ejemplo n.º 6
0
    def __init__(self, file_path, username):
        self.username = username
        self.file_path = file_path
        zf = zipfile.ZipFile(self.file_path)
        for info in zf.infolist():
            filename = info.filename
            logger.debug("Filename: %s" % filename)
            if filename.endswith(".yaml") and filename.startswith(
                    "Definitions/"):
                logger.debug("parsing %s..." % filename)
                try:
                    tpl = ToscaTemplate(
                        yaml_dict_tpl=yaml.load(zf.read(filename)))
                except Exception as e:
                    if hasattr(e, 'message'):
                        raise ExperimentValidationError(e.message)
                    elif isinstance(e.args, list):
                        raise ExperimentValidationError(e.args[0])
                    elif isinstance(e.args, str):
                        raise ExperimentValidationError(e.args)
                    else:
                        raise ExperimentValidationError(
                            "no message available", e)

                for node in tpl.nodetemplates:
                    logger.debug(
                        "Found node: %s of type %s with properties: %s" %
                        (node.name, node.type,
                         list(node.get_properties().keys())))
                self.topology_template = tpl
            if filename == 'TOSCA-Metadata/Metadata.yaml':
                metadata = yaml.load(zf.read(filename))
                self.name = metadata.get('name')
                if find(entities.Experiment,
                        '{}_{}'.format(self.username, self.name)) is not None:
                    raise ExperimentValidationError(
                        'There is already an experiment with this name, please choose a different one.'
                    )
                # 12/12/12 10:55
                self.start_date = self.get_start_date(metadata)
                # 12/12/12 11:55
                self.end_date = self.get_end_date(metadata)
                today = datetime.today().date()
                logger.info("End date: date: %s" % self.end_date.date())
                if self.end_date.date() < today:
                    logger.error(
                        'For the experiment {} the end date({}) is in the past.'
                        .format(self.name, self.end_date.date()))
                    raise ExperimentValidationError(
                        'For the experiment {} the end date({}) is in the past.'
                        .format(self.name, self.end_date.date()))
                self.duration = self.end_date - self.start_date
                logger.debug("Experiment duration %s" % self.duration)
            if filename.startswith("Files/") and filename.endswith('.csar'):

                experiment_nsd_csar_location = get_config(
                    'system', 'temp-csar-location',
                    '/etc/softfire/experiment-nsd-csar')

                experiment_nsd_csar_location = '{}/{}'.format(
                    experiment_nsd_csar_location.rstrip('/'), username)
                if not os.path.exists(experiment_nsd_csar_location):
                    os.makedirs(experiment_nsd_csar_location)
                data = zf.read(filename)

                nsd_file_location = "%s/%s" % (experiment_nsd_csar_location,
                                               filename.split('/')[-1])
                with open(nsd_file_location, 'wb+') as f:
                    f.write(data)
        temp_ids = []
        for node in self.topology_template.nodetemplates:
            if node.type == 'NfvResource':
                file_name = node.get_properties().get('file_name')
                if file_name:
                    file_name = file_name.value
                if file_name and file_name.startswith(
                        "Files/") and file_name.endswith(".csar"):
                    real_file_name = file_name[6:]
                    tmp_file_location = '{}/{}/{}'.format(
                        get_config(
                            'system', 'temp-csar-location',
                            '/etc/softfire/experiment-nsd-csar').rstrip('/'),
                        username, real_file_name)
                    # get the description
                    try:
                        zf = zipfile.ZipFile(tmp_file_location)
                    except FileNotFoundError:
                        logger.error(
                            "Please check that the file_name property is correctly set to the file name passed."
                        )
                        raise ExperimentValidationError(
                            "Please check that the file_name property is correctly set to the file name passed."
                        )
                    try:
                        filenames = [
                            zipinfo.filename for zipinfo in zf.filelist
                        ]
                        if 'TOSCA-Metadata/Metadata.yaml' in filenames:
                            logger.debug(
                                "Found 'TOSCA-Metadata/Metadata.yaml'")
                            yaml_file = zf.read('TOSCA-Metadata/Metadata.yaml')
                        elif 'tosca-metadata/Metadata.yaml' in filenames:
                            # just for legacy support
                            # the correct file name following the specification is 'TOSCA-Metadata'
                            # to support experiments that were created before this fix we still check for 'tosca-metadata' though
                            logger.warning(
                                "'TOSCA-Metadata/Metadata.yaml' not found. Will try 'tosca-metadata/Metadata.yaml' to support older experiments."
                            )
                            yaml_file = zf.read('tosca-metadata/Metadata.yaml')
                        else:
                            raise ExperimentValidationError(
                                'The TOSCA-Metadata/Metadata.yaml file is missing in {}.'
                                .format(file_name))
                    except KeyError as e:
                        traceback.print_exc()
                        if hasattr(e, 'message'):
                            raise ExperimentValidationError(e.message)
                        else:
                            raise ExperimentValidationError(e.args)
                    if yaml_file:
                        yaml_content = yaml.load(yaml_file)
                        description = yaml_content.get('description')
                    else:
                        description = 'No description available'
                    testbeds = node.get_properties().get('testbeds').value
                    temp_ids.append(
                        add_resource(
                            username,
                            node.get_properties().get('resource_id').value,
                            "NfvResource", -1, description,
                            list(testbeds.keys())[0], real_file_name))
        try:
            self._validate()
        except Exception as e:
            for id in temp_ids:
                delete(find(ResourceMetadata, _id=id))
            raise ExperimentValidationError(e.args)

        exp = entities.Experiment()
        exp.id = '{}_{}'.format(self.username, self.name)
        exp.username = self.username
        exp.name = self.name
        exp.start_date = self.start_date
        exp.end_date = self.end_date
        exp.resources = []

        for node in self.topology_template.nodetemplates:
            exp.resources.append(self._get_used_resource_by_node(node))

        element_value = find_by_element_value(entities.Experiment,
                                              entities.Experiment.username,
                                              self.username)
        max_no_experiment = get_config("System", "max-number-experiments", 3)
        if len(element_value) >= max_no_experiment:
            raise ExperimentValidationError(
                "You cannot have more than %s experiments at the same time!" %
                max_no_experiment)

        logger.info("Saving experiment %s" % exp.name)
        save(exp)
        self.experiment = exp
        for res in exp.resources:
            _start_termination_thread_for_res(res)