Exemple #1
0
def create_workload(workload, DB: MySQL):
    DB.start_transaction()

    mapping = deepcopy(workload_keys)
    mapping_requirement = deepcopy(hardware_requirements_keys)
    mapping_requirement_insert = deepcopy(hardware_requirements_keys)
    mapping_capacity = deepcopy(capacity_requirements_keys)
    mapping.remove("id")  # As it is assigned by the API
    mapping_requirement.remove("workload_id")  # Not present in the petition
    mapping_requirement.remove("requirement_id")  # Not present in the petition
    mapping_requirement_insert.remove(
        "requirement_id")  # Not present in the petition
    mapping_capacity.remove("workload_id")  # Not present in the petition
    mapping_capacity.remove("requirement_id")  # Not present in the petition

    if len(workload.keys()) - 1 != len(mapping):
        message = "Inserted workload data is incorrect"
        return messenger.message404(message)

    # Get the assigned ID of the workload
    statement = ("SELECT MAX(id) FROM workloads")
    workload_id = DB.select_query(statement)
    while (isinstance(workload_id, Iterable)):
        workload_id = next(iter(workload_id))
    if not workload_id or workload_id < 0:
        workload_id = 1
    else:
        workload_id += 1

    values = [workload_id]
    for x in range(0, len(mapping)):
        if mapping[x] in workload:
            values.append(workload[mapping[x]])
        else:
            message = "%s not introduced in the request" % (mapping[x])
            return messenger.message404(message)

    status1, message1 = DB.insert_query(__table_workloads, workload_keys,
                                        values)

    # Time to create the requirements of the workload, one entry each
    requirements = workload["requirements"]
    req_number = 0
    for requirement in requirements:
        req_number += 1
        statement = ("SELECT MAX(requirement_id) FROM hardware_requirements")
        req_id = DB.select_query(statement)
        while (isinstance(req_id, Iterable)):
            req_id = next(iter(req_id))
        if not req_id:
            req_id = req_number
        else:
            req_id += req_number

        values = [req_id, workload_id]
        for x in range(0, len(mapping_requirement)):
            if mapping_requirement[x] in requirement:
                values.append(requirement[mapping_requirement[x]])
            else:
                message = "%s not introduced in the request" % (
                    mapping_requirement[x])
                return messenger.message404(message)

        status2, message2 = DB.insert_query(__table_hardware_requirements,
                                            hardware_requirements_keys, values)

        capacity_req = requirement["hardware_capacity_requirements"]
        for capacity in capacity_req:
            values = [workload_id, req_id]
            for x in range(0, len(mapping_capacity)):
                if mapping_capacity[x] in capacity:
                    values.append(capacity[mapping_capacity[x]])
                else:
                    message = "%s not introduced in the request" % (
                        mapping_capacity[x])
                    return messenger.message404(message)

            status3, message3 = DB.insert_query(__table_capacity_requirements,
                                                capacity_requirements_keys,
                                                values)

    if not status1:
        status = False
        message = message1
    elif not status2:
        status = False
        message = message2
    elif not status3:
        status = False
        message = message3
    else:
        status = True
        message = "OK"

    # First status code checks:
    # 1: Syntaxis
    # 2: Completeness
    if status:
        status, message = DB.commit_transaction()
        # Second status checks:
        # 1: Data integrity
        if status:
            return messenger.messageWorkload(workload_id)

        # Implicit rollback
        else:
            return messenger.message404(message)
    else:
        status, error = DB.rollback(message)
        return messenger.message404(error)
Exemple #2
0
def create_assignment(workload, DB: MySQL, EEM: EEM):
    DB.start_transaction()

    workload_id = next(iter(workload.values()))
    statement = ("SELECT * FROM hardware_requirements ")
    statement += ("WHERE workload_id = %s") % workload_id
    workload_requirements_hardware = DB.select_query(statement)
    if not workload_requirements_hardware:
        message = "Workload does not exist or "
        message += "does not have any hardware requirements"
        return finish_assignment(False, message, DB)

    # Retrieve server EEM net card and GID
    workload_server_net_card, gid = get_server_card(workload_id, DB)
    if not workload_server_net_card:
        return finish_assignment(
            False,
            "The workload server does not have any EEM net card attached",
            DB)

    boxes = set()
    for requirement in workload_requirements_hardware:
        available_hardware = get_available_hardware(
            requirement,
            workload_server_net_card,
            DB, EEM)
        if not available_hardware:
            return finish_assignment(
                False,
                "There is not any availble hardware of the type: %s" % (
                    requirement[2]),
                DB)
        hardware_choice = select_hardware(available_hardware)
        status, message = assign_capacities(
            hardware_choice,
            workload_server_net_card,
            workload_id,
            requirement[0],
            DB)
        if not status:
            return finish_assignment(
                False,
                message,
                DB)

        boxes.add(hardware_choice)

    vlan_message = ""
    for box in boxes:
        values = [box, workload_server_net_card, workload_id]
        status, message = DB.insert_query(
            __table,
            assignment_keys,
            values)

        if not status:
            return finish_assignment(
                False,
                message,
                DB)

        EEM.assign_hardware_to_server(box, gid)
        vlan_message += "New VLAN created between %s and %s " % (
            box,
            workload_server_net_card)

    return finish_assignment(
        True,
        vlan_message,
        DB)