#!/usr/bin/env python
# -*- coding: utf-8 -*-

##
# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U.
# This file is part of openvim
# All Rights Reserved.
#
# 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 "AS IS" 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: nfvlabs@tid.es
##

"""
This module interact with the openvim database,
It implements general table management and transactional writes, that is, or all is changed or nothing.
It is threading safe using a Lock
"""

import MySQLdb as mdb
import uuid as myUuid
import auxiliary_functions as af
import json
import logging
from netaddr import IPNetwork, IPAddress
from threading import Lock

__author__ = "Alfonso Tierno"
__date__ = "$10-jul-2014 12:07:15$"

HTTP_Bad_Request = 400
HTTP_Unauthorized = 401
HTTP_Not_Found = 404
HTTP_Method_Not_Allowed = 405
HTTP_Request_Timeout = 408
HTTP_Conflict = 409
HTTP_Service_Unavailable = 503
HTTP_Internal_Server_Error = 500


class vim_db():
    def __init__(self, vlan_range, logger_name=None, debug=None, lock=None):
        """vlan_range must be a tuple (vlan_ini, vlan_end) with available vlan values for networks
        every dataplane network contain a unique value, regardless of it is used or not 
        """
        # initialization
        self.net_vlan_range = vlan_range
        self.vlan_config = {}
        self.host = None
        self.user = None
        self.passwd = None
        self.database = None
        self.con = None
        self.cur = None
        self.debug = debug
        self.lock = lock or Lock()
        if logger_name:
            self.logger_name = logger_name
        else:
            self.logger_name = 'openvim.db'
        self.logger = logging.getLogger(self.logger_name)
        if debug:
            self.logger.setLevel(getattr(logging, debug))

    def connect(self, host=None, user=None, passwd=None, database=None):
        """Connect to the concrete data base. 
        The first time a valid host, user, passwd and database must be provided,
        Following calls can skip this parameters
        """
        try:
            with self.lock, self.con:
                if host:
                    self.host = host
                    self.con = None
                if user:
                    self.user = user
                    self.con = None
                if passwd:
                    self.passwd = passwd
                    self.con = None
                if database:
                    self.database = database
                    self.con = None
                if self.con:
                    # try to connect
                    try:
                        with self.con:
                            self.cur = self.con.cursor()
                            cmd = "SELECT version_int,version,openvim_ver FROM schema_version"
                            self.logger.debug("method connect: " + cmd)
                            self.cur.execute(cmd)
                            return 0
                    except Exception:
                        pass
                self.con = mdb.connect(self.host, self.user, self.passwd, self.database)
                self.logger.debug("connected to DB %s at %s@%s", self.database, self.user, self.host)
                return 0
        except mdb.Error as e:
            self.logger.error("Cannot connect to DB %s at %s@%s Error %d: %s", self.database, self.user, self.host,
                              e.args[0], e.args[1])
            return -1

    def get_db_version(self):
        """ Obtain the database schema version.
        Return: (negative, text) if error or version 0.0 where schema_version table is missing
                (version_int, version_text) if ok
        """
        cmd = "SELECT version_int,version,openvim_ver FROM schema_version"
        for retry_ in range(0, 2):
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    rows = self.cur.fetchall()
                highest_version_int = 0
                highest_version = ""
                # print rows
                for row in rows:  # look for the latest version
                    if row[0] > highest_version_int:
                        highest_version_int, highest_version = row[0:2]
                return highest_version_int, highest_version
            except (mdb.Error, AttributeError) as e:
                self.logger.error("get_db_version DB Exception %d: %s. Command %s", e.args[0], e.args[1], cmd)
                r, c = self.format_error(e)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def disconnect(self):
        """disconnect from the data base"""
        try:
            with self.lock:
                if not self.con:
                    self.con.close()
                    self.con = None
        except mdb.Error as e:
            self.logger.error("while disconnecting from DB: Error: %s", str(e))
            return -1
        except AttributeError as e:  # self.con not defined
            if e[0][-5:] == "'con'":
                return -1, "Database internal error, no connection."
            else:
                raise

    def format_error(self, e, func, cmd, command=None, extra=None):
        """Creates a text error base on the produced exception
            Params:
                e: mdb exception
                func: name of the function that makes the call, for logging purposes
                cmd: database command that produce the exception
                command: if the intention is update or delete
                extra: extra information to add to some commands
            Return
                HTTP error in negative, formatted error text
        """

        self.logger.error("%s DB Exception %s. Command %s", func, str(e), cmd)
        if type(e[0]) is str:
            if e[0][-5:] == "'con'":
                return -HTTP_Internal_Server_Error, "DB Exception, no connection."
            else:
                return -HTTP_Internal_Server_Error, e.args[1]
        if e.args[0] == 2006 or e.args[0] == 2013:
            # MySQL server has gone away (((or)))    Exception 2013: Lost connection to MySQL server during query
            # reconnect
            self.connect()
            return -HTTP_Request_Timeout, "Database reconnection. Try Again"
        fk = e.args[1].find("foreign key constraint fails")
        if fk >= 0:
            if command == "update":
                return -HTTP_Bad_Request, "tenant_id %s not found." % extra
            elif command == "delete":
                return -HTTP_Bad_Request, "Resource is not free. There are %s that prevent its deletion." % extra
        de = e.args[1].find("Duplicate entry")
        fk = e.args[1].find("for key")
        uk = e.args[1].find("Unknown column")
        wc = e.args[1].find("in 'where clause'")
        fl = e.args[1].find("in 'field list'")
        # print de, fk, uk, wc,fl
        if de >= 0:
            if fk >= 0:  # error 1062
                return -HTTP_Conflict, "Value %s already in use for %s" % (e.args[1][de + 15:fk], e.args[1][fk + 7:])
        if uk >= 0:
            if wc >= 0:
                return -HTTP_Bad_Request, "Field %s cannot be used for filtering" % e.args[1][uk + 14:wc]
            if fl >= 0:
                return -HTTP_Bad_Request, "Field %s does not exist" % e.args[1][uk + 14:wc]
        return -HTTP_Internal_Server_Error, "Database internal Error %d: %s" % (e.args[0], e.args[1])

    @staticmethod
    def __data2db_format(data):
        """convert data to database format. If data is None it return the 'Null' text,
        otherwise it return the text surrounded by quotes ensuring internal quotes are escaped"""
        if data is None:
            return 'Null'
        out = str(data)
        if "'" not in out:
            return "'" + out + "'"
        elif '"' not in out:
            return '"' + out + '"'
        else:
            return json.dumps(out)

    def __get_used_net_vlan(self, region=None):
        # get used from database if needed
        vlan_region = self.vlan_config[region]
        try:
            cmd = "SELECT vlan FROM nets WHERE vlan>='{}' and region{} ORDER BY vlan LIMIT 25".format(
                vlan_region["lastused"], "='" + region + "'" if region else " is NULL")
            with self.con:
                self.cur = self.con.cursor()
                self.logger.debug(cmd)
                self.cur.execute(cmd)
                vlan_tuple = self.cur.fetchall()
                # convert a tuple of tuples in a list of numbers
                vlan_region["usedlist"] = []
                for k in vlan_tuple:
                    vlan_region["usedlist"].append(k[0])
        except (mdb.Error, AttributeError) as e:
            return self.format_error(e, "get_free_net_vlan", cmd)

    def get_free_net_vlan(self, region=None):
        """obtain a vlan not used in any net"""
        with self.lock:
            if region not in self.vlan_config:
                self.vlan_config[region] = {
                    "usedlist": None,
                    "lastused": self.net_vlan_range[0] - 1
                }
            vlan_region = self.vlan_config[region]

            while True:
                self.logger.debug("get_free_net_vlan() region[%s]=%s, net_vlan_range:%s-%s", str(region),
                                  str(vlan_region), str(self.net_vlan_range[0]), str(self.net_vlan_range[1]))
                vlan_region["lastused"] += 1
                if vlan_region["lastused"] == self.net_vlan_range[1]:
                    # start from the begining
                    vlan_region["lastused"] = self.net_vlan_range[0]
                    vlan_region["usedlist"] = None
                if vlan_region["usedlist"] is None or \
                        (len(vlan_region["usedlist"]) == 25 and vlan_region["lastused"] >= vlan_region["usedlist"][-1]):
                    self.__get_used_net_vlan(region)
                    self.logger.debug("new net_vlan_usedlist %s", str(vlan_region["usedlist"]))
                if vlan_region["lastused"] in vlan_region["usedlist"]:
                    continue
                else:
                    return vlan_region["lastused"]

    def get_table(self, **sql_dict):
        """ Obtain rows from a table.
        Atribure sql_dir: dictionary with the following key: value
            'SELECT': [list of fields to retrieve] (by default all)
            'FROM': string of table name (Mandatory)
            'WHERE': dict of key:values, translated to key=value AND ... (Optional)
            'WHERE_NOT': dict of key:values, translated to key!=value AND ... (Optional)
            'WHERE_OR': dict of key:values, translated to key=value OR ... (Optional)
            'WHERE_AND_OR: str 'AND' or 'OR'(by default) mark the priority to 'WHERE AND (WHERE_OR)' or (WHERE) OR
                WHERE_OR' (Optional)
            'LIMIT': limit of number of rows (Optional)
            'DISTINCT': make a select distinct to remove repeated elements
        Return: a list with dictionarys at each row
        """
        # print sql_dict
        select_ = "SELECT "
        if sql_dict.get("DISTINCT"):
            select_ += "DISTINCT "
        select_ += ("*" if not sql_dict.get('SELECT') else ",".join(map(str, sql_dict['SELECT'])))
        # print 'select_', select_
        from_ = "FROM " + str(sql_dict['FROM'])
        # print 'from_', from_

        where_and = None
        where_or = None
        w = sql_dict.get('WHERE')
        if w:
            where_and = " AND ".join(map(lambda x: str(x) + (" is Null" if w[x] is None else "='" + str(w[x]) + "'"),
                                         w.keys()))
        w = sql_dict.get('WHERE_LIKE')  # Unikernels extension -START-
        if w:
            where_and_like = " AND ".join(
                map(lambda x: str(x) + (" is Null" if w[x] is None else " LIKE '" + str(w[x]) + "'"), w.keys()))
            if where_and:
                where_and += " AND " + where_and_like
            else:
                where_and = where_and_like  # Unikernels extension -END-
        w = sql_dict.get('WHERE_NOT')
        if w:
            where_and_not = " AND ".join(
                map(lambda x: str(x) + (" is not Null" if w[x] is None else "!='" + str(w[x]) + "'"), w.keys()))
            if where_and:
                where_and += " AND " + where_and_not
            else:
                where_and = where_and_not
        w = sql_dict.get('WHERE_OR')
        if w:
            where_or = " OR ".join(map(lambda x: str(x) + (" is Null" if w[x] is None else "='" + str(w[x]) + "'"),
                                       w.keys()))

        if where_and and where_or:
            if sql_dict.get("WHERE_AND_OR") == "AND":
                where_ = "WHERE " + where_and + " AND (" + where_or + ")"
            else:
                where_ = "WHERE (" + where_and + ") OR " + where_or
        elif where_and and where_or is None:
            where_ = "WHERE " + where_and
        elif where_and is None and where_or:
            where_ = "WHERE " + where_or
        else:
            where_ = ""
        # print 'where_', where_
        limit_ = "LIMIT " + str(sql_dict['LIMIT']) if sql_dict.get("LIMIT") else ""
        # print 'limit_', limit_
        cmd = " ".join((select_, from_, where_, limit_))
        for retry_ in range(0, 2):
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    rows = self.cur.fetchall()
                    return self.cur.rowcount, rows
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "get_table", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def new_tenant(self, tenant_dict):
        """ Add one row into a table.
        Attribure 
            tenant_dict: dictionary with the key: value to insert
        It checks presence of uuid and add one automatically otherwise
        Return: (result, uuid) where result can be 0 if error, or 1 if ok
        """
        for retry_ in range(0, 2):
            cmd = ""
            inserted = -1
            try:
                # create uuid if not provided
                if 'uuid' not in tenant_dict:
                    uuid = tenant_dict['uuid'] = str(myUuid.uuid1())  # create_uuid
                else:
                    uuid = str(tenant_dict['uuid'])
                # obtain tenant_id for logs
                tenant_id = uuid
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    # inserting new uuid
                    cmd = "INSERT INTO uuids (uuid, used_at) VALUES ('%s','tenants')" % uuid
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    # insert tenant
                    cmd = "INSERT INTO tenants (" + \
                          ",".join(map(str, tenant_dict.keys())) + ") VALUES(" + \
                          ",".join(
                              map(lambda x: "Null" if x is None else "'" + str(x) + "'", tenant_dict.values())) + ")"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    inserted = self.cur.rowcount
                    # #inserting new log
                    # del tenant_dict['uuid'] # not interested for the log
                    # cmd = "INSERT INTO logs (related,level,tenant_id,uuid,description) VALUES
                    # ('tenants','debug','%s','%s',\"new tenant %s\")" % (uuid, tenant_id, str(tenant_dict))
                    # self.logger.debug(cmd)
                    # self.cur.execute(cmd)
                    # commit transaction
                    self.cur.close()
                if inserted == 0:
                    return 0, uuid
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    # adding public flavors
                    cmd = "INSERT INTO tenants_flavors(flavor_id,tenant_id) SELECT uuid as flavor_id,'" + tenant_id + \
                          "' FROM flavors WHERE public = 'yes'"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    self.logger.debug("attached public flavors: %s", str(self.cur.rowcount))
                    # rows = self.cur.fetchall()
                    # for row in rows:
                    #    cmd = "INSERT INTO tenants_flavors(flavor_id,tenant_id) VALUES('%s','%s')"%(row[0], tenant_id)
                    #    self.cur.execute(cmd )
                    # adding public images
                    cmd = "INSERT INTO tenants_images(image_id,tenant_id) SELECT uuid as image_id,'" + tenant_id + \
                          "' FROM images WHERE public = 'yes'"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    self.logger.debug("attached public images: %s", str(self.cur.rowcount))
                    return 1, uuid
            except (mdb.Error, AttributeError) as e:
                if inserted == 1:
                    self.logger.warning("new_tenant DB Exception %d: %s. Command %s", e.args[0], e.args[1], cmd)
                    return 1, uuid
                else:
                    r, c = self.format_error(e, "new_tenant", cmd)
                    if r != -HTTP_Request_Timeout or retry_ == 1:
                        return r, c

    def new_row(self, table, INSERT, add_uuid=False, log=False):
        """ Add one row into a table.
        Atribure 
            INSERT: dictionary with the key: value to insert
            table: table where to insert
            add_uuid: if True, it will crated an uuid key entry at INSERT if not provided
        It checks presence of uuid and add one automatically otherwise
        Return: (result, uuid) where result can be 0 if error, or 1 if ok
        """
        for retry_ in range(0, 2):
            cmd = ""
            try:
                if add_uuid:
                    # create uuid if not provided
                    if 'uuid' not in INSERT:
                        uuid = INSERT['uuid'] = str(myUuid.uuid1())  # create_uuid
                    else:
                        uuid = str(INSERT['uuid'])
                else:
                    uuid = None
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    if add_uuid:
                        # inserting new uuid
                        cmd = "INSERT INTO uuids (uuid, used_at) VALUES ('%s','%s')" % (uuid, table)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                    # insertion
                    cmd = "INSERT INTO " + table + " (" + \
                          ",".join(map(str, INSERT.keys())) + ") VALUES(" + \
                          ",".join(map(lambda x: 'Null' if x is None else "'" + str(x) + "'", INSERT.values())) + ")"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    nb_rows = self.cur.rowcount
                    # inserting new log
                    # if nb_rows > 0 and log:
                    #    if add_uuid: del INSERT['uuid']
                    #    #obtain tenant_id for logs
                    #    if 'tenant_id' in INSERT: 
                    #        tenant_id = INSERT['tenant_id']
                    #        del INSERT['tenant_id']
                    #    elif table == 'tenants':    
                    #        tenant_id = uuid
                    #    else:                       
                    #        tenant_id = None
                    #    if uuid is None: uuid_k = uuid_v = ""
                    #    else: uuid_k=",uuid"; uuid_v=",'" + str(uuid) + "'"
                    #    if tenant_id is None: tenant_k = tenant_v = ""
                    #    else: tenant_k=",tenant_id"; tenant_v=",'" + str(tenant_id) + "'"
                    #    cmd = "INSERT INTO logs (related,level%s%s,description) VALUES
                    #       ('%s','debug'%s%s,\"new %s %s\")" \
                    #        % (uuid_k, tenant_k, table, uuid_v, tenant_v, table[:-1], str(INSERT))
                    #    self.logger.debug(cmd)
                    #    self.cur.execute(cmd)                    
                    return nb_rows, uuid

            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "new_row", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    @staticmethod
    def __remove_quotes(data):
        """remove single quotes ' of any string content of data dictionary"""
        for k, v in data.items():
            if type(v) == str:
                if "'" in v:
                    data[k] = data[k].replace("'", "_")

    def _update_rows_internal(self, table, UPDATE, WHERE=None):
        cmd = "UPDATE " + table + " SET " + \
              ",".join(map(lambda x: str(x) + '=' + self.__data2db_format(UPDATE[x]), UPDATE.keys()))
        if WHERE:
            cmd += " WHERE " + " and ".join(
                map(lambda x: str(x) + (' is Null' if WHERE[x] is None else "='" + str(WHERE[x]) + "'"), WHERE.keys()))
        self.logger.debug(cmd)
        self.cur.execute(cmd)
        nb_rows = self.cur.rowcount
        return nb_rows, None

    def update_rows(self, table, UPDATE, WHERE=None, log=False):
        """ Update one or several rows into a table.
        Atributes
            UPDATE: dictionary with the key-new_value pairs to change
            table: table to be modified
            WHERE: dictionary to filter target rows, key-value
            log:   if true, a log entry is added at logs table
        Return: (result, None) where result indicates the number of updated files
        """
        for retry_ in range(0, 2):
            cmd = ""
            try:
                # gettting uuid
                uuid = None
                if WHERE:
                    uuid = WHERE.get('uuid')

                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    cmd = "UPDATE " + table + " SET " + \
                          ",".join(map(lambda x: str(x) + '=' + self.__data2db_format(UPDATE[x]), UPDATE.keys()))
                    if WHERE:
                        cmd += " WHERE " + " and ".join(
                            map(lambda x: str(x) + (' is Null' if WHERE[x] is None else "='" + str(WHERE[x]) + "'"),
                                WHERE.keys()))
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    nb_rows = self.cur.rowcount
                    # if nb_rows > 0 and log:
                    #    #inserting new log
                    #    if uuid is None: uuid_k = uuid_v = ""
                    #    else: uuid_k=",uuid"; uuid_v=",'" + str(uuid) + "'"
                    #    cmd = "INSERT INTO logs (related,level%s,description)
                    #        VALUES ('%s','debug'%s,\"updating %d entry %s\")" \
                    #        % (uuid_k, table, uuid_v, nb_rows, (str(UPDATE)).replace('"','-')  )
                    #    self.logger.debug(cmd)
                    #    self.cur.execute(cmd)                    
                    return nb_rows, uuid
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "update_rows", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def get_host(self, host_id):
        if af.check_valid_uuid(host_id):
            where_filter = "uuid='" + host_id + "'"
        else:
            where_filter = "name='" + host_id + "'"
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    # get HOST
                    cmd = "SELECT uuid, user, password, keyfile, name, ip_name, description, hypervisors, " \
                          "ranking, admin_state_up, DATE_FORMAT(created_at,'%Y-%m-%dT%H:%i:%s') as created_at " \
                          "FROM hosts WHERE " + where_filter  # Unikernels extension
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    if self.cur.rowcount == 0:
                        return 0, "host '" + str(host_id) + "'not found."
                    elif self.cur.rowcount > 1:
                        return 0, "host '" + str(host_id) + "' matches more than one result."
                    host = self.cur.fetchone()
                    host_id = host['uuid']
                    if host.get("password"):
                        host["password"] = "*****"
                    # get numa
                    cmd = "SELECT id, numa_socket, hugepages, memory, admin_state_up FROM numas " \
                          "WHERE host_id = '" + str(host_id) + "'"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    host['numas'] = self.cur.fetchall()
                    for numa in host['numas']:
                        # print "SELECT core_id, instance_id, status, thread_id, v_thread_id FROM resources_core
                        # WHERE numa_id = '" + str(numa['id']) + "'"
                        # get cores
                        cmd = "SELECT core_id, instance_id, status, thread_id, v_thread_id FROM resources_core " \
                              "WHERE numa_id = '" + str(numa['id']) + "'"
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        numa['cores'] = self.cur.fetchall()
                        for core in numa['cores']:
                            if core['instance_id']is None:
                                del core['instance_id'], core['v_thread_id']
                            if core['status'] == 'ok':
                                del core['status']
                        # get used memory
                        cmd = "SELECT sum(consumed) as hugepages_consumed FROM resources_mem " \
                              "WHERE numa_id = '" + str(numa['id']) + "' GROUP BY numa_id"
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        used = self.cur.fetchone()
                        used_ = int(used['hugepages_consumed']) if used is not None else 0
                        numa['hugepages_consumed'] = used_
                        # get ports
                        # cmd = "CALL GetPortsFromNuma(%s)'" % str(numa['id'])
                        # self.cur.callproc('GetPortsFromNuma', (numa['id'],) )
                        # every time a Procedure is launched you need to close and open the cursor
                        # under Error 2014: Commands out of sync; you can't run this command now
                        # self.cur.close()
                        # self.cur = self.con.cursor(mdb.cursors.DictCursor)
                        cmd = "SELECT Mbps, pci, status, Mbps_used, instance_id, if(id=root_id,'PF','VF') as type_, " \
                              "switch_port, switch_dpid, switch_mac, mac, source_name " \
                              "FROM resources_port WHERE numa_id={} ORDER BY root_id, type_ DESC".format(numa['id'])
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        ifaces = self.cur.fetchall()
                        # The SQL query will ensure to have SRIOV interfaces from a port first
                        sriovs = []
                        Mpbs_consumed = 0
                        numa['interfaces'] = []
                        for iface in ifaces:
                            if not iface["instance_id"]:
                                del iface["instance_id"]
                            if iface['status'] == 'ok':
                                del iface['status']
                            Mpbs_consumed += int(iface["Mbps_used"])
                            del iface["Mbps_used"]
                            if iface["type_"] == 'PF':
                                if not iface["switch_dpid"]:
                                    del iface["switch_dpid"]
                                if not iface["switch_port"]:
                                    del iface["switch_port"]
                                if not iface["switch_mac"]:
                                    del iface["switch_mac"]
                                if sriovs:
                                    iface["sriovs"] = sriovs
                                if Mpbs_consumed:
                                    iface["Mpbs_consumed"] = Mpbs_consumed
                                del iface["type_"]
                                numa['interfaces'].append(iface)
                                sriovs = []
                                Mpbs_consumed = 0
                            else:  # VF, SRIOV
                                del iface["switch_port"]
                                del iface["switch_dpid"]
                                del iface["switch_mac"]
                                del iface["type_"]
                                del iface["Mbps"]
                                sriovs.append(iface)

                        # delete internal field
                        del numa['id']
                    return 1, host
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "get_host", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def new_uuid(self):
        max_retries = 10
        while max_retries > 0:
            uuid = str(myUuid.uuid1())
            if self.check_uuid(uuid)[0] == 0:
                return uuid
            max_retries -= 1
        return uuid

    def check_uuid(self, uuid):
        """check in the database if this uuid is already present"""
        try:
            cmd = "SELECT * FROM uuids where uuid='" + str(uuid) + "'"
            with self.lock, self.con:
                self.cur = self.con.cursor(mdb.cursors.DictCursor)
                self.logger.debug(cmd)
                self.cur.execute(cmd)
                rows = self.cur.fetchall()
                return self.cur.rowcount, rows
        except (mdb.Error, AttributeError) as e:
            return self.format_error(e, "check_uuid", cmd)

    def __get_next_ids(self):
        """get next auto increment index of all table in the database"""
        self.cur.execute("SELECT table_name,AUTO_INCREMENT FROM information_schema.tables "
                         "WHERE AUTO_INCREMENT IS NOT NULL AND table_schema = DATABASE()")
        rows = self.cur.fetchall()
        return self.cur.rowcount, dict(rows)

    def edit_host(self, host_id, host_dict):
        # get next port index
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()

                    # update table host
                    numa_list = host_dict.pop('numas', ())
                    if host_dict:
                        self._update_rows_internal("hosts", host_dict, {"uuid": host_id})

                    where = {"host_id": host_id}
                    for numa_dict in numa_list:
                        where["numa_socket"] = str(numa_dict.pop('numa_socket'))
                        interface_list = numa_dict.pop('interfaces', ())
                        if numa_dict:
                            self._update_rows_internal("numas", numa_dict, where)
                        for interface in interface_list:
                            source_name = str(interface.pop("source_name"))
                            if interface:
                                # get interface id from resources_port
                                cmd = "SELECT rp.id as id " \
                                      "FROM resources_port as rp join numas as n on n.id=rp.numa_id join " \
                                      "hosts as h on h.uuid=n.host_id " + \
                                      "WHERE host_id='{}' and rp.source_name='{}'".format(host_id, source_name)
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                                row = self.cur.fetchone()
                                if self.cur.rowcount <= 0:
                                    return -HTTP_Bad_Request, "Interface source_name='{}s' from numa_socket='{}' " \
                                                              "not found".format(source_name, where["numa_socket"])
                                interface_id = row[0]
                                self._update_rows_internal("resources_port", interface, {"root_id": interface_id})
                return self.get_host(host_id)
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "edit_host", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def new_host(self, host_dict):
        # get next port index
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()

                    result, next_ids = self.__get_next_ids()
                    # print "next_ids: " + str(next_ids)
                    if result <= 0:
                        return result, "Internal DataBase error getting next id of tables"

                    # create uuid if not provided
                    if 'uuid' not in host_dict:
                        uuid = host_dict['uuid'] = str(myUuid.uuid1())  # create_uuid
                    else:  # check uuid is valid
                        uuid = str(host_dict['uuid'])
                    #    result, data = self.check_uuid(uuid)
                    #    if (result == 1):
                    #        return -1, "UUID '%s' already in use" % uuid

                    # inserting new uuid
                    cmd = "INSERT INTO uuids (uuid, used_at) VALUES ('%s','hosts')" % uuid
                    self.logger.debug(cmd)
                    result = self.cur.execute(cmd)

                    # insert in table host
                    numa_list = host_dict.pop('numas', [])
                    # get nonhupages and nonisolated cpus
                    host_dict['RAM'] = 0
                    host_dict['cpus'] = 0
                    for numa in numa_list:
                        mem_numa = numa.get('memory', 0) - numa.get('hugepages', 0)
                        if mem_numa > 0:
                            host_dict['RAM'] += mem_numa
                        for core in numa.get("cores", []):
                            if "status" in core and core["status"] == "noteligible":
                                host_dict['cpus'] += 1
                    host_dict['RAM'] *= 1024  # from GB to MB

                    keys = ",".join(host_dict.keys())
                    values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'", host_dict.values()))
                    cmd = "INSERT INTO hosts (" + keys + ") VALUES (" + values + ")"
                    self.logger.debug(cmd)
                    result = self.cur.execute(cmd)
                    # if result != 1: return -1, "Database Error while inserting at hosts table"

                    # insert numas
                    nb_numas = nb_cores = nb_ifaces = 0
                    for numa_dict in numa_list:
                        nb_numas += 1
                        interface_list = numa_dict.pop('interfaces', [])
                        core_list = numa_dict.pop('cores', [])
                        numa_dict['id'] = next_ids['numas']
                        next_ids['numas'] += 1
                        numa_dict['host_id'] = uuid
                        keys = ",".join(numa_dict.keys())
                        values = ",".join(
                            map(lambda x: "Null" if x is None else "'" + str(x) + "'", numa_dict.values()))
                        cmd = "INSERT INTO numas (" + keys + ") VALUES (" + values + ")"
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)

                        # insert cores
                        for core_dict in core_list:
                            nb_cores += 1
                            core_dict['numa_id'] = numa_dict['id']
                            keys = ",".join(core_dict.keys())
                            values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'",
                                                  core_dict.values()))
                            cmd = "INSERT INTO resources_core (" + keys + ") VALUES (" + values + ")"
                            self.logger.debug(cmd)
                            self.cur.execute(cmd)

                        # insert ports
                        for port_dict in interface_list:
                            nb_ifaces += 1
                            sriov_list = port_dict.pop('sriovs', [])
                            port_dict['numa_id'] = numa_dict['id']
                            port_dict['id'] = port_dict['root_id'] = next_ids['resources_port']
                            next_ids['resources_port'] += 1
                            switch_port = port_dict.get('switch_port', None)
                            switch_dpid = port_dict.get('switch_dpid', None)
                            keys = ",".join(port_dict.keys())
                            values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'",
                                                  port_dict.values()))
                            cmd = "INSERT INTO resources_port (" + keys + ") VALUES (" + values + ")"
                            self.logger.debug(cmd)
                            self.cur.execute(cmd)

                            # insert sriovs into port table
                            for sriov_dict in sriov_list:
                                sriov_dict['switch_port'] = switch_port
                                sriov_dict['switch_dpid'] = switch_dpid
                                sriov_dict['numa_id'] = port_dict['numa_id']
                                sriov_dict['Mbps'] = port_dict['Mbps']
                                sriov_dict['root_id'] = port_dict['id']
                                sriov_dict['id'] = next_ids['resources_port']
                                if "vlan" in sriov_dict:
                                    del sriov_dict["vlan"]
                                next_ids['resources_port'] += 1
                                keys = ",".join(sriov_dict.keys())
                                values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'",
                                                      sriov_dict.values()))
                                cmd = "INSERT INTO resources_port (" + keys + ") VALUES (" + values + ")"
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)

                    # inserting new log
                    # cmd = "INSERT INTO logs (related,level,uuid,description) VALUES ('hosts','debug','%s','new host:
                    #     %d numas, %d theads, %d ifaces')" % (uuid, nb_numas, nb_cores, nb_ifaces)
                    # self.logger.debug(cmd)
                    # result = self.cur.execute(cmd)

                    # inseted ok
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    self.logger.debug("callproc('UpdateSwitchPort', () )")
                    self.cur.callproc('UpdateSwitchPort', ())

                self.logger.debug("getting host '%s'", str(host_dict['uuid']))
                return self.get_host(host_dict['uuid'])
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "new_host", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def new_flavor(self, flavor_dict, tenant_id):
        """Add new flavor into the database. Create uuid if not provided
        Atributes
            flavor_dict: flavor dictionary with the key: value to insert. Must be valid flavors columns
            tenant_id: if not 'any', it matches this flavor/tenant inserting at tenants_flavors table
        Return: (result, data) where result can be
            negative: error at inserting. data contain text
            1, inserted, data contain inserted uuid flavor
        """
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()

                    # create uuid if not provided
                    if 'uuid' not in flavor_dict:
                        uuid = flavor_dict['uuid'] = str(myUuid.uuid1())  # create_uuid
                    else:  # check uuid is valid
                        uuid = str(flavor_dict['uuid'])
                    #    result, data = self.check_uuid(uuid)
                    #    if (result == 1):
                    #        return -1, "UUID '%s' already in use" % uuid

                    # inserting new uuid
                    cmd = "INSERT INTO uuids (uuid, used_at) VALUES ('%s','flavors')" % uuid
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)

                    # insert in table flavor
                    keys = ",".join(flavor_dict.keys())
                    values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'", flavor_dict.values()))
                    cmd = "INSERT INTO flavors (" + keys + ") VALUES (" + values + ")"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    # if result != 1: return -1, "Database Error while inserting at flavors table"

                    # insert tenants_flavors
                    if tenant_id != 'any':
                        cmd = "INSERT INTO tenants_flavors (tenant_id,flavor_id) VALUES ('%s','%s')" % (tenant_id, uuid)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)

                    # inserting new log
                    # del flavor_dict['uuid']
                    # if 'extended' in flavor_dict: del flavor_dict['extended'] #remove two many information
                    # cmd = "INSERT INTO logs (related,level,uuid, tenant_id, description) VALUES
                    #    ('flavors','debug','%s','%s',\"new flavor: %s\")" \
                    #    % (uuid, tenant_id, str(flavor_dict))
                    # self.logger.debug(cmd)
                    # self.cur.execute(cmd)

                    # inseted ok
                return 1, uuid
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "new_flavor", cmd, "update", tenant_id)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def new_image(self, image_dict, tenant_id):
        """Add new image into the database. Create uuid if not provided
        Atributes
            image_dict: image dictionary with the key: value to insert. Must be valid images columns
            tenant_id: if not 'any', it matches this image/tenant inserting at tenants_images table
        Return: (result, data) where result can be
            negative: error at inserting. data contain text
            1, inserted, data contain inserted uuid image
        """
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()

                    # create uuid if not provided
                    if 'uuid' not in image_dict:
                        uuid = image_dict['uuid'] = str(myUuid.uuid1())  # create_uuid
                    else:  # check uuid is valid
                        uuid = str(image_dict['uuid'])
                    #    result, data = self.check_uuid(uuid)
                    #    if (result == 1):
                    #        return -1, "UUID '%s' already in use" % uuid

                    # inserting new uuid
                    cmd = "INSERT INTO uuids (uuid, used_at) VALUES ('%s','images')" % uuid
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)

                    # insert in table image
                    keys = ",".join(image_dict.keys())
                    values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'", image_dict.values()))
                    cmd = "INSERT INTO images (" + keys + ") VALUES (" + values + ")"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    # if result != 1: return -1, "Database Error while inserting at images table"

                    # insert tenants_images
                    if tenant_id != 'any':
                        cmd = "INSERT INTO tenants_images (tenant_id,image_id) VALUES ('%s','%s')" % (tenant_id, uuid)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)

                    # #inserting new log
                    # cmd = "INSERT INTO logs (related,level,uuid, tenant_id, description) VALUES
                    # ('images','debug','%s','%s',\"new image: %s path: %s\")" %
                    # (uuid, tenant_id, image_dict['name'], image_dict['path'])
                    # self.logger.debug(cmd)
                    # self.cur.execute(cmd)

                    # inseted ok
                return 1, uuid
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "new_image", cmd, "update", tenant_id)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def delete_image_flavor(self, item_type, item_id, tenant_id):
        """deletes an image or flavor from database
        item_type must be a 'image' or 'flavor'
        item_id is the uuid
        tenant_id is the asociated tenant, can be 'any' with means all
        If tenan_id is not any, it deletes from tenants_images/flavors,
        which means this image/flavor is used by this tenant, and if success, 
        it tries to delete from images/flavors in case this is not public, 
        that only will success if image is private and not used by other tenants
        If tenant_id is any, it tries to delete from both tables at the same transaction
        so that image/flavor is completely deleted from all tenants or nothing
        """
        for retry_ in range(0, 2):
            deleted = -1
            deleted_item = -1
            result = (-HTTP_Internal_Server_Error, "internal error")
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    cmd = "DELETE FROM tenants_%ss WHERE %s_id = '%s'" % (item_type, item_type, item_id)
                    if tenant_id != 'any':
                        cmd += " AND tenant_id = '%s'" % tenant_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    deleted = self.cur.rowcount
                    if tenant_id == 'any':  # delete from images/flavors in the SAME transaction
                        cmd = "DELETE FROM %ss WHERE uuid = '%s'" % (item_type, item_id)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        deleted = self.cur.rowcount
                        if deleted >= 1:
                            # delete uuid
                            cmd = "DELETE FROM uuids WHERE uuid = '%s'" % item_id
                            self.logger.debug(cmd)
                            self.cur.execute(cmd)
                            # #inserting new log
                            # cmd = "INSERT INTO logs (related,level,uuid,tenant_id,description) \
                            #       VALUES ('%ss','debug','%s','%s','delete %s completely')" % \
                            #       (item_type, item_id, tenant_id, item_type)
                            # self.logger.debug(cmd)
                            # self.cur.execute(cmd)
                            return deleted, "%s '%s' completely deleted" % (item_type, item_id)
                        return 0, "%s '%s' not found" % (item_type, item_id)

                    if deleted == 1:
                        # #inserting new log
                        # cmd = "INSERT INTO logs (related,level,uuid,tenant_id,description) \
                        #        VALUES ('%ss','debug','%s','%s','delete %s reference for this tenant')" % \
                        #        (item_type, item_id, tenant_id, item_type)
                        # self.logger.debug(cmd)
                        # self.cur.execute(cmd)

                        # commit transaction
                        self.cur.close()
                # if tenant!=any  delete from images/flavors in OTHER transaction.
                # If fails is because dependencies so that not return error
                if deleted == 1:
                    with self.lock, self.con:
                        self.cur = self.con.cursor()

                        # delete image/flavor if not public
                        cmd = "DELETE FROM %ss WHERE uuid = '%s' AND public = 'no'" % (item_type, item_id)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        deleted_item = self.cur.rowcount
                        if deleted_item == 1:
                            # delete uuid
                            cmd = "DELETE FROM uuids WHERE uuid = '%s'" % item_id
                            self.logger.debug(cmd)
                            self.cur.execute(cmd)
                            # #inserting new log
                            # cmd = "INSERT INTO logs (related,level,uuid,tenant_id,description) \
                            #       VALUES ('%ss','debug','%s','%s','delete %s completely')" % \
                            #       (item_type, item_id, tenant_id, item_type)
                            # self.logger.debug(cmd)
                            # self.cur.execute(cmd)
            except (mdb.Error, AttributeError) as e:
                # print "delete_%s DB Exception %d: %s" % (item_type, e.args[0], e.args[1])
                if deleted < 0:
                    result = self.format_error(e, "delete_" + item_type, cmd, "delete", "servers")
            finally:
                if deleted == 1:
                    return 1, "{} '{}' from tenant '{}' {}deleted".format(item_type, item_id, tenant_id,
                                                                          "completely " if deleted_item == 1 else "")
                elif deleted == 0:
                    return 0, "{} '{}' from tenant '{}' not found".format(item_type, item_id, tenant_id)
                else:
                    if result[0] != -HTTP_Request_Timeout or retry_ == 1:
                        return result

    def delete_row(self, table, uuid):
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    # delete host
                    self.cur = self.con.cursor()
                    cmd = "DELETE FROM %s WHERE uuid = '%s'" % (table, uuid)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    deleted = self.cur.rowcount
                    if deleted == 1:
                        # delete uuid
                        # if table == 'tenants':
                        #     tenant_str = uuid
                        # else:
                        #     tenant_str = 'Null'
                        self.cur = self.con.cursor()
                        cmd = "DELETE FROM uuids WHERE uuid = '%s'" % uuid
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        # #inserting new log
                        # cmd = "INSERT INTO logs (related,level,uuid,tenant_id,description) VALUES
                        # ('%s','debug','%s','%s','delete %s')" % (table, uuid, tenant_str, table[:-1])
                        # self.logger.debug(cmd)
                        # self.cur.execute(cmd)
                return deleted, table[:-1] + " '%s' %s" % (uuid, "deleted" if deleted == 1 else "not found")
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "delete_row", cmd, "delete",
                                         'instances' if table in ('hosts', 'tenants') else 'dependencies')
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def delete_row_by_key(self, table, key, value):
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    # delete host
                    self.cur = self.con.cursor()
                    cmd = "DELETE FROM %s" % (table)
                    if key:
                        if value:
                            cmd += " WHERE %s = '%s'" % (key, value)
                        else:
                            cmd += " WHERE %s is null" % (key)
                    else:  # delete all
                        pass
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    deleted = self.cur.rowcount
                    if deleted < 1:
                        return -1, 'Not found'
                        #  delete uuid
                    return 0, deleted
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "delete_row_by_key", cmd, "delete",
                                         'instances' if table in ('hosts', 'tenants') else 'dependencies')
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def delete_row_by_dict(self, **sql_dict):
        """ Deletes rows from a table.
        Attribute sql_dir: dictionary with the following key: value
            'FROM': string of table name (Mandatory)
            'WHERE': dict of key:values, translated to key=value AND ... (Optional)
            'WHERE_NOT': dict of key:values, translated to key<>value AND ... (Optional)
            'WHERE_NOTNULL': (list or tuple of items that must not be null in a where ... (Optional)
            'LIMIT': limit of number of rows (Optional)
        Return: the (number of items deleted, descriptive test) if ok; (negative, descriptive text) if error
        """
        # print sql_dict
        from_ = "FROM " + str(sql_dict['FROM'])
        # print 'from_', from_
        if 'WHERE' in sql_dict and len(sql_dict['WHERE']) > 0:
            w = sql_dict['WHERE']
            where_ = "WHERE " + " AND ".join(map(lambda x: str(x) + (" is Null" if w[x] is None else "='" + str(w[x]) +
                                                                                                     "'"), w.keys()))
        else:
            where_ = ""
        if 'WHERE_NOT' in sql_dict and len(sql_dict['WHERE_NOT']) > 0:
            w = sql_dict['WHERE_NOT']
            where_2 = " AND ".join(map(lambda x: str(x) + (" is not Null" if w[x] is None else "<>'" + str(w[x]) + "'"),
                                       w.keys()))
            if len(where_) == 0:
                where_ = "WHERE " + where_2
            else:
                where_ = where_ + " AND " + where_2
        if 'WHERE_NOTNULL' in sql_dict and len(sql_dict['WHERE_NOTNULL']) > 0:
            w = sql_dict['WHERE_NOTNULL']
            where_2 = " AND ".join(map(lambda x: str(x) + " is not Null", w))
            if len(where_) == 0:
                where_ = "WHERE " + where_2
            else:
                where_ = where_ + " AND " + where_2
        # print 'where_', where_
        limit_ = "LIMIT " + str(sql_dict['LIMIT']) if 'LIMIT' in sql_dict else ""
        # print 'limit_', limit_
        cmd = " ".join(("DELETE", from_, where_, limit_))
        self.logger.debug(cmd)
        for retry_ in range(0, 2):
            try:
                with self.lock, self.con:
                    # delete host
                    self.cur = self.con.cursor()
                    self.cur.execute(cmd)
                    deleted = self.cur.rowcount
                return deleted, "%d deleted from %s" % (deleted, sql_dict['FROM'][:-1])
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "delete_row_by_dict", cmd, "delete", 'dependencies')
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def get_instance(self, instance_id):
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    # get INSTANCE
                    cmd = "SELECT uuid, name, description, progress, host_id, flavor_id, image_id, status, " \
                          "hypervisor, os_image_type, last_error, tenant_id, ram, vcpus, created_at " \
                          "FROM instances WHERE uuid='{}'".format(instance_id)  # Unikernels extension
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    if self.cur.rowcount == 0:
                        return 0, "instance '" + str(instance_id) + "'not found."
                    instance = self.cur.fetchone()
                    # get networks
                    cmd = "SELECT uuid as iface_id, net_id, mac as mac_address, ip_address, name, Mbps as bandwidth, " \
                          "vpci, model FROM ports WHERE (type='instance:bridge' or type='instance:ovs') AND " \
                          "instance_id= '{}'".format(instance_id)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    if self.cur.rowcount > 0:
                        instance['networks'] = self.cur.fetchall()

                    # get extended
                    extended = {}
                    # get devices
                    cmd = "SELECT type,vpci,image_id,xml,dev,image_size FROM instance_devices " \
                          "WHERE instance_id = '%s' " % str(instance_id)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    if self.cur.rowcount > 0:
                        extended['devices'] = self.cur.fetchall()
                    # get numas
                    numas = []
                    cmd = "SELECT id, numa_socket as source FROM numas WHERE host_id = '{}'".format(instance['host_id'])
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    host_numas = self.cur.fetchall()
                    # print 'host_numas', host_numas
                    for k in host_numas:
                        numa_id = str(k['id'])
                        numa_dict = {}
                        # get memory
                        cmd = "SELECT consumed FROM resources_mem WHERE instance_id = '{}' AND numa_id = '{}'".foramt(
                            instance_id, numa_id)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        if self.cur.rowcount > 0:
                            mem_dict = self.cur.fetchone()
                            numa_dict['memory'] = mem_dict['consumed']
                        # get full cores
                        cursor2 = self.con.cursor()
                        cmd = "SELECT core_id, paired, MIN(v_thread_id) as v1, MAX(v_thread_id) as v2, " \
                              "COUNT(instance_id) as nb, MIN(thread_id) as t1, MAX(thread_id) as t2 " \
                              "FROM resources_core " \
                              "WHERE instance_id = '{}' AND numa_id = '{}' GROUP BY core_id,paired".format(instance_id,
                                                                                                           numa_id)
                        self.logger.debug(cmd)
                        cursor2.execute(cmd)
                        core_list = []
                        core_source = []
                        paired_list = []
                        paired_source = []
                        thread_list = []
                        thread_source = []
                        if cursor2.rowcount > 0:
                            cores = cursor2.fetchall()
                            for core in cores:
                                if core[4] == 2:  # number of used threads from core
                                    if core[3] == core[2]:  # only one thread asigned to VM, so completely core
                                        core_list.append(core[2])
                                        core_source.append(core[5])
                                    elif core[1] == 'Y':
                                        paired_list.append(core[2:4])
                                        paired_source.append(core[5:7])
                                    else:
                                        thread_list.extend(core[2:4])
                                        thread_source.extend(core[5:7])

                                else:
                                    thread_list.append(core[2])
                                    thread_source.append(core[5])
                            if len(core_list) > 0:
                                numa_dict['cores'] = len(core_list)
                                numa_dict['cores-id'] = core_list
                                numa_dict['cores-source'] = core_source
                            if len(paired_list) > 0:
                                numa_dict['paired-threads'] = len(paired_list)
                                numa_dict['paired-threads-id'] = paired_list
                                numa_dict['paired-threads-source'] = paired_source
                            if len(thread_list) > 0:
                                numa_dict['threads'] = len(thread_list)
                                numa_dict['threads-id'] = thread_list
                                numa_dict['threads-source'] = thread_source

                        # get dedicated ports and SRIOV
                        cmd = "SELECT port_id as iface_id, p.vlan as vlan, p.mac as mac_address, net_id, " \
                              "if(model='PF','yes',if(model='VF','no','yes:sriov')) as dedicated, p.Mbps as bandwidth" \
                              ", name, vpci, pci as source " \
                              "FROM resources_port as rp join ports as p on port_id=uuid  " \
                              "WHERE p.instance_id = '{}' AND numa_id = '{}' and " \
                              "p.type='instance:data'".format(instance_id, numa_id)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        if self.cur.rowcount > 0:
                            numa_dict['interfaces'] = self.cur.fetchall()
                            # print 'interfaces', numa_dict

                        if len(numa_dict) > 0:
                            numa_dict['source'] = k['source']  # numa socket
                            numas.append(numa_dict)

                    if len(numas) > 0:
                        extended['numas'] = numas
                    if len(extended) > 0:
                        instance['extended'] = extended
                    af.DeleteNone(instance)
                    return 1, instance
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "get_instance", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def get_numas(self, requirements, prefered_host_id=None, only_of_ports=True):
        """Obtain a valid NUMA/HOST for deployment a VM
        requirements: contain requirement regarding:
            requirements['ram']: Non huge page memory in MB; 0 to skip 
            requirements['vcpus']: Non isolated cpus; 0 to skip 
            requirements['numa']: Requiremets to be fixed in ONE Numa node
                requirements['numa']['memory']: Huge page memory in GB at ; 0 for any 
                requirements['numa']['proc_req_type']: Type of processor, cores or threads 
                requirements['numa']['proc_req_nb']: Number of isolated cpus  
                requirements['numa']['port_list']: Physical NIC ports list ; [] for any 
                requirements['numa']['sriov_list']: Virtual function NIC ports list ; [] for any
        prefered_host_id: if not None return this host if it match 
        only_of_ports: if True only those ports conected to the openflow (of) are valid,
            that is, with switch_port information filled; if False, all NIC ports are valid. 
        Return a valid numa and host
        """

        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    # #Find numas of prefered host
                    # prefered_numas = ()
                    # if prefered_host_id is not None:
                    #     self.cur = self.con.cursor()
                    #     self.cur.execute("SELECT id FROM numas WHERE host_id='%s'" + prefered_host_id)
                    #     prefered_numas = self.cur.fetchall()
                    #     self.cur.close()

                    # Find valid host for the ram and vcpus
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    cmd = "CALL GetHostByMemCpu(%s, %s)" % (str(requirements['ram']), str(requirements['vcpus']))
                    self.logger.debug(cmd)
                    self.cur.callproc('GetHostByMemCpu', (str(requirements['ram']), str(requirements['vcpus'])))
                    valid_hosts = self.cur.fetchall()
                    self.cur.close()
                    self.cur = self.con.cursor()
                    match_found = False
                    if len(valid_hosts) <= 0:
                        error_text = 'No room at data center. Cannot find a host with %s MB memory and %s cpus ' \
                                     'available' % (str(requirements['ram']), str(requirements['vcpus']))
                        # self.logger.debug(error_text)
                        return -1, error_text

                    if 'hypervisor' not in requirements:  # Unikernels extension -END-
                        requirements['hypervisor'] = "kvm"
                    for valid_host in valid_hosts:
                        if 'hypervisors' not in valid_host:
                            valid_host['hypervisors'] = "kvm"

                    valid_hosts = tuple(valid_host for valid_host in valid_hosts if
                                        requirements['hypervisor'] in valid_host['hypervisors'].split(","))

                    if len(valid_hosts) <= 0:
                        error_text = 'No room at data center. Cannot find a host with %s hypervisor or not have ' \
                                     'enough resources available' % (str(requirements['hypervisor']))
                        # self.logger.debug(error_text)
                        return -1, error_text  # Unikernels extension -END-

                    # elif req_numa is not None:
                    # Find valid numa nodes for memory requirements
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    cmd = "CALL GetNumaByMemory(%s)" % str(requirements['numa']['memory'])
                    self.logger.debug(cmd)
                    self.cur.callproc('GetNumaByMemory', (requirements['numa']['memory'],))
                    valid_for_memory = self.cur.fetchall()
                    self.cur.close()
                    self.cur = self.con.cursor()
                    if len(valid_for_memory) <= 0:
                        error_text = 'No room at data center. Cannot find a host with %s GB Hugepages memory' \
                                     ' available' % str(requirements['numa']['memory'])
                        # self.logger.debug(error_text)
                        return -1, error_text

                    # Find valid numa nodes for processor requirements
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    if requirements['numa']['proc_req_type'] == 'threads':
                        cpu_requirement_text = 'cpu-threads'
                        cmd = "CALL GetNumaByThread(%s)" % str(requirements['numa']['proc_req_nb'])
                        self.logger.debug(cmd)
                        self.cur.callproc('GetNumaByThread', (requirements['numa']['proc_req_nb'],))
                    else:
                        cpu_requirement_text = 'cpu-cores'
                        cmd = "CALL GetNumaByCore(%s)" % str(requirements['numa']['proc_req_nb'])
                        self.logger.debug(cmd)
                        self.cur.callproc('GetNumaByCore', (requirements['numa']['proc_req_nb'],))
                    valid_for_processor = self.cur.fetchall()
                    self.cur.close()
                    self.cur = self.con.cursor()
                    if len(valid_for_processor) <= 0:
                        error_text = 'No room at data center. Cannot find a host with %s %s available' % (
                            str(requirements['numa']['proc_req_nb']), cpu_requirement_text)
                        # self.logger.debug(error_text)
                        return -1, error_text

                    # Find the numa nodes that comply for memory and processor requirements
                    # sorting from less to more memory capacity
                    valid_numas = []
                    for m_numa in valid_for_memory:
                        numa_valid_for_processor = False
                        for p_numa in valid_for_processor:
                            if m_numa['numa_id'] == p_numa['numa_id']:
                                numa_valid_for_processor = True
                                break
                        numa_valid_for_host = False
                        prefered_numa = False
                        for p_host in valid_hosts:
                            if m_numa['host_id'] == p_host['uuid']:
                                numa_valid_for_host = True
                                if p_host['uuid'] == prefered_host_id:
                                    prefered_numa = True
                                break
                        if numa_valid_for_host and numa_valid_for_processor:
                            if prefered_numa:
                                valid_numas.insert(0, m_numa['numa_id'])
                            else:
                                valid_numas.append(m_numa['numa_id'])
                    if len(valid_numas) <= 0:
                        error_text = "No room at data center. Cannot find a host with {} MB hugepages memory and {} " \
                                     "{} available in the same numa".format(requirements['numa']['memory'],
                                                                            requirements['numa']['proc_req_nb'],
                                                                            cpu_requirement_text)
                        # self.logger.debug(error_text)
                        return -1, error_text

                    # print 'Valid numas list: '+str(valid_numas)

                    # Find valid numa nodes for interfaces requirements
                    # For each valid numa we will obtain the number of available ports and check if these are valid
                    match_found = False
                    for numa_id in valid_numas:
                        # print 'Checking '+str(numa_id)
                        match_found = False
                        self.cur = self.con.cursor(mdb.cursors.DictCursor)
                        if only_of_ports:
                            cmd = "CALL GetAvailablePorts(%s)" % str(numa_id)
                            self.logger.debug(cmd)
                            self.cur.callproc('GetAvailablePorts', (numa_id,))
                        else:
                            cmd = "CALL GetAllAvailablePorts(%s)" % str(numa_id)
                            self.logger.debug(cmd)
                            self.cur.callproc('GetAllAvailablePorts', (numa_id,))
                        available_ports = self.cur.fetchall()
                        self.cur.close()
                        self.cur = self.con.cursor()

                        # Set/reset reservations
                        for port in available_ports:
                            port['Mbps_reserved'] = 0
                            port['SRIOV_reserved'] = 0

                        # Try to allocate physical ports
                        physical_ports_found = True
                        for iface in requirements['numa']['port_list']:
                            # print '\t\tchecking iface: '+str(iface)
                            portFound = False
                            for port in available_ports:
                                # print '\t\t\tfor port: '+str(port)
                                # If the port is not empty continue
                                if port['Mbps_free'] != port['Mbps'] or port['Mbps_reserved'] != 0:
                                    # print '\t\t\t\t Not empty port'
                                    continue
                                # If the port speed is not enough continue
                                if port['Mbps'] < iface['bandwidth']:
                                    # print '\t\t\t\t Not enough speed'
                                    continue

                                # Otherwise this is a valid port
                                port['Mbps_reserved'] = port['Mbps']
                                port['SRIOV_reserved'] = 0
                                iface['port_id'] = port['port_id']
                                iface['vlan'] = None
                                iface['mac'] = port['mac']
                                iface['switch_port'] = port['switch_port']
                                # print '\t\t\t\t Dedicated port found '+str(port['port_id'])
                                portFound = True
                                break

                            # if all ports have been checked and no match has been found
                            # this is not a valid numa
                            if not portFound:
                                # print '\t\t\t\t\tAll ports have been checked and no match has been found for
                                # numa '+str(numa_id)+'\n\n'
                                physical_ports_found = False
                                break

                        # if there is no match continue checking the following numa
                        if not physical_ports_found:
                            continue

                        # Try to allocate SR-IOVs
                        sriov_ports_found = True
                        for iface in requirements['numa']['sriov_list']:
                            # print '\t\tchecking iface: '+str(iface)
                            portFound = False
                            for port in available_ports:
                                # print '\t\t\tfor port: '+str(port)
                                # If there are not available SR-IOVs continue
                                if port['availableSRIOV'] - port['SRIOV_reserved'] <= 0:
                                    # print '\t\t\t\t Not enough SR-IOV'
                                    continue
                                # If the port free speed is not enough continue
                                if port['Mbps_free'] - port['Mbps_reserved'] < iface['bandwidth']:
                                    # print '\t\t\t\t Not enough speed'
                                    continue

                                # Otherwise this is a valid port
                                port['Mbps_reserved'] += iface['bandwidth']
                                port['SRIOV_reserved'] += 1
                                # print '\t\t\t\t SR-IOV found '+str(port['port_id'])
                                iface['port_id'] = port['port_id']
                                iface['vlan'] = None
                                iface['mac'] = port['mac']
                                iface['switch_port'] = port['switch_port']
                                portFound = True
                                break

                            # if all ports have been checked and no match has been found
                            # this is not a valid numa
                            if not portFound:
                                # print '\t\t\t\t\tAll ports have been checked and no match has been found for numa
                                # '+str(numa_id)+'\n\n'
                                sriov_ports_found = False
                                break

                        # if there is no match continue checking the following numa
                        if not sriov_ports_found:
                            continue

                        if sriov_ports_found and physical_ports_found:
                            match_found = True
                            break

                    if not match_found:
                        error_text = 'No room at data center. Cannot find a host with the required hugepages, vcpus ' \
                                     'and interfaces'
                        # self.logger.debug(error_text)
                        return -1, error_text

                    # self.logger.debug('Full match found in numa %s', str(numa_id))

                for numa in valid_for_processor:
                    if numa_id == numa['numa_id']:
                        host_id = numa['host_id']
                        break
                return 0, {'numa_id': numa_id, 'host_id': host_id}
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "get_numas", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def new_instance(self, instance_dict, nets, ports_to_free):
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()

                    # create uuid if not provided
                    if 'uuid' not in instance_dict:
                        uuid = instance_dict['uuid'] = str(myUuid.uuid1())  # create_uuid
                    else:  # check uuid is valid
                        uuid = str(instance_dict['uuid'])

                    # inserting new uuid
                    cmd = "INSERT INTO uuids (uuid, root_uuid, used_at) VALUES ('%s','%s', 'instances')" % (uuid, uuid)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)

                    # insert in table instance
                    extended = instance_dict.pop('extended', None)
                    bridgedifaces = instance_dict.pop('bridged-ifaces', ())

                    keys = ",".join(instance_dict.keys())
                    values = ",".join(
                        map(lambda x: "Null" if x is None else "'" + str(x) + "'", instance_dict.values()))
                    cmd = "INSERT INTO instances (" + keys + ") VALUES (" + values + ")"
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    # if result != 1: return -1, "Database Error while inserting at instances table"

                    # insert resources
                    nb_bridge_ifaces = nb_cores = nb_ifaces = nb_numas = 0
                    # insert bridged_ifaces

                    for iface in bridgedifaces:
                        # generate and insert a iface uuid
                        if 'enable_dhcp' in iface and iface['enable_dhcp']:
                            dhcp_first_ip = iface["dhcp_first_ip"]
                            del iface["dhcp_first_ip"]
                            dhcp_last_ip = iface["dhcp_last_ip"]
                            del iface["dhcp_last_ip"]
                            dhcp_cidr = iface["cidr"]
                            del iface["cidr"]
                            del iface["enable_dhcp"]
                            used_dhcp_ips = self._get_dhcp_ip_used_list(iface["net_id"])
                            if iface.get("ip_address"):
                                if iface["ip_address"] in used_dhcp_ips:
                                    iface["ip_address"] = None
                            else:
                                iface["ip_address"] = self.get_free_ip_from_range(dhcp_first_ip, dhcp_last_ip,
                                                                                  dhcp_cidr, used_dhcp_ips)
                            if 'links' in iface:
                                del iface['links']
                            if 'dns' in iface:
                                del iface['dns']
                            if 'routes' in iface:
                                del iface['routes']

                        iface['uuid'] = str(myUuid.uuid1())  # create_uuid
                        cmd = "INSERT INTO uuids (uuid, root_uuid, used_at) VALUES ('%s','%s', 'ports')" % (
                            iface['uuid'], uuid)
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        # insert iface
                        iface['instance_id'] = uuid
                        # iface['type'] = 'instance:bridge'
                        if 'name' not in iface:
                            iface['name'] = "br" + str(nb_bridge_ifaces)
                        iface['Mbps'] = iface.pop('bandwidth', None)
                        if 'mac_address' not in iface:
                            iface['mac'] = af.gen_random_mac()
                        else:
                            iface['mac'] = iface['mac_address']
                            del iface['mac_address']

                        # iface['mac']=iface.pop('mac_address', None)  #for leaving mac generation to libvirt
                        keys = ",".join(iface.keys())
                        values = ",".join(map(lambda x: "Null" if x is None else "'" + str(x) + "'", iface.values()))
                        cmd = "INSERT INTO ports (" + keys + ") VALUES (" + values + ")"
                        self.logger.debug(cmd)
                        self.cur.execute(cmd)
                        nb_bridge_ifaces += 1

                    if extended is not None:
                        if 'numas' not in extended or extended['numas'] is None:
                            extended['numas'] = ()
                        for numa in extended['numas']:
                            nb_numas += 1
                            # cores
                            if 'cores' not in numa or numa['cores'] is None:
                                numa['cores'] = ()
                            for core in numa['cores']:
                                nb_cores += 1
                                cmd = "UPDATE resources_core SET instance_id='%s'%s%s WHERE id='%s'" \
                                      % (uuid,
                                         (",v_thread_id='" + str(core['vthread']) + "'") if 'vthread' in core else '',
                                         (",paired='" + core['paired'] + "'") if 'paired' in core else '', core['id'])
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                            # interfaces
                            if 'interfaces' not in numa or numa['interfaces'] is None:
                                numa['interfaces'] = ()
                            for iface in numa['interfaces']:
                                # generate and insert an uuid; iface[id]=iface_uuid; iface[uuid]= net_id
                                iface['id'] = str(myUuid.uuid1())  # create_uuid
                                cmd = "INSERT INTO uuids (uuid, root_uuid, used_at) VALUES " \
                                      "('{}','{}', 'ports')".format(iface['id'], uuid)
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                                nb_ifaces += 1
                                mbps_ = ("'" + str(iface['Mbps_used']) + "'") if 'Mbps_used' in iface and \
                                                                                 iface['Mbps_used'] is not None \
                                    else "Mbps"
                                if iface["dedicated"] == "yes":
                                    iface_model = "PF"
                                elif iface["dedicated"] == "yes:sriov":
                                    iface_model = "VFnotShared"
                                elif iface["dedicated"] == "no":
                                    iface_model = "VF"
                                # else error
                                INSERT = (iface['mac_address'], iface['switch_port'], iface.get('vlan'),
                                          'instance:data', iface['Mbps_used'], iface['id'], uuid,
                                          instance_dict['tenant_id'], iface.get('name'), iface.get('vpci'),
                                          iface.get('uuid'), iface_model)
                                cmd = "INSERT INTO ports (mac,switch_port,vlan,type,Mbps,uuid,instance_id,tenant_id," \
                                      "name,vpci,net_id, model)  VALUES (" + \
                                      ",".join(map(lambda x: 'Null' if x is None else "'" + str(x) + "'", INSERT)) + ")"
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                                if 'uuid' in iface:
                                    nets.append(iface['uuid'])

                                # discover if this port is not used by anyone
                                cmd = "SELECT source_name, mac " \
                                      "FROM ( SELECT root_id, count(instance_id) as used FROM resources_port" \
                                      " WHERE root_id=(SELECT root_id from resources_port WHERE id='%s')" \
                                      " GROUP BY root_id ) AS A JOIN resources_port as B ON " \
                                      "A.root_id=B.id AND A.used=0" % iface['port_id']
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                                ports_to_free += self.cur.fetchall()

                                cmd = "UPDATE resources_port SET instance_id='%s', port_id='%s',Mbps_used=%s " \
                                      "WHERE id='%s'" % (uuid, iface['id'], mbps_, iface['port_id'])
                                # if Mbps_used not suply, set the same value of 'Mpbs', that is the total
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                            # memory
                            if 'memory' in numa and numa['memory'] is not None and numa['memory'] > 0:
                                cmd = "INSERT INTO resources_mem (numa_id, instance_id, consumed) VALUES " \
                                      "('%s','%s','%s')" % (numa['numa_id'], uuid, numa['memory'])
                                self.logger.debug(cmd)
                                self.cur.execute(cmd)
                        if 'devices' not in extended or extended['devices'] is None:
                            extended['devices'] = ()
                        for device in extended['devices']:
                            if 'vpci' in device:
                                vpci = "'" + device['vpci'] + "'"
                            else:
                                vpci = 'Null'
                            if 'image_id' in device:
                                image_id = "'" + device['image_id'] + "'"
                            else:
                                image_id = 'Null'
                            if 'xml' in device:
                                xml = "'" + device['xml'] + "'"
                            else:
                                xml = 'Null'
                            if 'dev' in device:
                                dev = "'" + device['dev'] + "'"
                            else:
                                dev = 'Null'
                            if 'image_size' in device:
                                size = device['image_size']
                            else:
                                size = 0
                            cmd = "INSERT INTO instance_devices (type,instance_id,image_id,vpci,xml,dev,image_size) " \
                                  "VALUES ('%s','%s', %s, %s, %s, %s, %s)" % \
                                  (device['type'], uuid, image_id, vpci, xml, dev, str(size))
                            self.logger.debug(cmd)
                            self.cur.execute(cmd)
                    # #inserting new log
                    # cmd = "INSERT INTO logs (related,level,uuid,description) VALUES ('instances','debug','%s',
                    # 'new instance: %d numas, %d theads, %d ifaces %d bridge_ifaces')" %
                    # (uuid, nb_numas, nb_cores, nb_ifaces, nb_bridge_ifaces)
                    # self.logger.debug(cmd)
                    # self.cur.execute(cmd)
                    #
                    # inseted ok
                return 1, uuid
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "new_instance", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    @staticmethod
    def get_free_ip_from_range(first_ip, last_ip, cidr, ip_used_list):
        """
        Calculate a free IP from a range given
        :param first_ip: First dhcp ip range
        :param last_ip: Last dhcp ip range
        :param cidr: net cidr
        :param ip_used_list: contain all used ips to avoid ip collisions
        :return:
        """
        ip_tools = IPNetwork(cidr)
        cidr_len = ip_tools.prefixlen
        ips = IPNetwork(first_ip + '/' + str(cidr_len))

        ip_used_list.append(str(ips[1]))  # gw ip
        ip_used_list.append(str(ips[-1]))  # broadcast ip
        ip_used_list.append(first_ip)

        for vm_ip in ips:
            if str(vm_ip) not in ip_used_list and IPAddress(first_ip) <= IPAddress(vm_ip) <= IPAddress(last_ip):
                return vm_ip

        return None

    def _get_dhcp_ip_used_list(self, net_id):
        """
        REtreive from DB all ips already used by the dhcp server for a given net
        :param net_id:
        :return:
        """
        WHERE = {'type': 'instance:ovs', 'net_id': net_id}
        for retry_ in range(0, 2):
            cmd = ""
            self.cur = self.con.cursor(mdb.cursors.DictCursor)
            select_ = "SELECT uuid, ip_address FROM ports "

            if WHERE is None or len(WHERE) == 0:
                where_ = ""
            else:
                where_ = "WHERE " + " AND ".join(
                    map(lambda x: str(x) + (" is Null" if WHERE[x] is None else "='" + str(WHERE[x]) + "'"),
                        WHERE.keys()))
            limit_ = "LIMIT 100"
            cmd = " ".join((select_, where_, limit_))
            self.logger.debug(cmd)
            self.cur.execute(cmd)
            ports = self.cur.fetchall()
            ip_address_list = []
            for port in ports:
                ip_address_list.append(port['ip_address'])

            return ip_address_list

    def delete_instance(self, instance_id, tenant_id, net_dataplane_list, ports_to_free, net_ovs_list,
                        logcause="requested by http"):
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor()
                    # get INSTANCE
                    cmd = "SELECT uuid FROM instances WHERE uuid='%s' AND tenant_id='%s'" % (instance_id, tenant_id)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    if self.cur.rowcount == 0:
                        return 0, "instance %s not found in tenant %s" % (instance_id, tenant_id)

                    # delete bridged ifaces, instace_devices, resources_mem; done by database: it is automatic by 
                    # Database; FOREIGN KEY DELETE CASCADE

                    # get nets afected
                    cmd = "SELECT DISTINCT net_id from ports WHERE instance_id = '%s' AND net_id is not Null AND " \
                          "type='instance:data'" % instance_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    net_list__ = self.cur.fetchall()
                    for net in net_list__:
                        net_dataplane_list.append(net[0])

                    # get ovs manangement nets
                    cmd = "SELECT DISTINCT net_id, vlan, ip_address, mac FROM ports WHERE instance_id='{}' AND " \
                          "net_id is not Null AND type='instance:ovs'".format(instance_id)
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    net_ovs_list += self.cur.fetchall()

                    # get dataplane interfaces releases by this VM; both PF and VF with no other VF 
                    cmd = "SELECT source_name, mac FROM (SELECT root_id, count(instance_id) as used " \
                          "FROM resources_port WHERE instance_id='%s' GROUP BY root_id ) AS A" % instance_id \
                          + " JOIN (SELECT root_id, count(instance_id) as used FROM resources_port GROUP BY root_id) " \
                            "AS B ON A.root_id=B.root_id AND A.used=B.used JOIN resources_port as C ON A.root_id=C.id"
                    # cmd = "SELECT DISTINCT root_id FROM resources_port WHERE instance_id = '%s'" % instance_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    ports_to_free += self.cur.fetchall()

                    # update resources port
                    cmd = "UPDATE resources_port SET instance_id=Null, port_id=Null, Mbps_used='0' " \
                          "WHERE instance_id = '%s'" % instance_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)

                    # #filter dataplane ports used by this VM that now are free
                    # for port in ports_list__:
                    #     cmd = "SELECT mac, count(instance_id) FROM resources_port WHERE root_id = '%s'" % port[0]
                    #     self.logger.debug(cmd)
                    #     self.cur.execute(cmd)
                    #     mac_list__ = self.cur.fetchone()
                    #     if mac_list__ and mac_list__[1]==0:
                    #         ports_to_free.append(mac_list__[0])

                    # update resources core
                    cmd = "UPDATE resources_core SET instance_id=Null, v_thread_id=Null, paired='N' " \
                          "WHERE instance_id = '%s'" % instance_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)

                    # delete all related uuids
                    cmd = "DELETE FROM uuids WHERE root_uuid='%s'" % instance_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)

                    # #insert log
                    # cmd = "INSERT INTO logs (related,level,uuid,description) VALUES 
                    # ('instances','debug','%s','delete instance %s')" % (instance_id, logcause)
                    # self.logger.debug(cmd)
                    # self.cur.execute(cmd)                    

                    # delete instance
                    cmd = "DELETE FROM instances WHERE uuid='%s' AND tenant_id='%s'" % (instance_id, tenant_id)
                    self.cur.execute(cmd)
                    return 1, "instance %s from tenant %s DELETED" % (instance_id, tenant_id)

            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "delete_instance", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def get_ports(self, WHERE):
        """ Obtain ports using the WHERE filtering.
        Attributes:
            'where_': dict of key:values, translated to key=value AND ... (Optional)
        Return: a list with dictionarys at each row
        """
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:

                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    select_ = "SELECT uuid,'ACTIVE' as status,admin_state_up,name,net_id,\
                        tenant_id,type,mac,vlan,switch_port,instance_id,Mbps FROM ports "

                    if WHERE is None or len(WHERE) == 0:
                        where_ = ""
                    else:
                        where_ = "WHERE " + " AND ".join(
                            map(lambda x: str(x) + (" is Null" if WHERE[x] is None else "='" + str(WHERE[x]) + "'"),
                                WHERE.keys()))
                    limit_ = "LIMIT 100"
                    cmd = " ".join((select_, where_, limit_))
                    # print "SELECT multiple de instance_ifaces, iface_uuid, external_ports" #print cmd
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    ports = self.cur.fetchall()
                    if self.cur.rowcount > 0:
                        af.DeleteNone(ports)
                    return self.cur.rowcount, ports
                    # return self.get_table(FROM=from_, SELECT=select_,WHERE=where_,LIMIT=100)
            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "get_ports", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c

    def check_target_net(self, net_id, tenant_id, port_type):
        """check if valid attachement of a port into a target net
        Attributes:
            net_id: target net uuid
            tenant_id: client where tenant belongs. Not used in this version
            port_type: string with the option 'instance:bridge', 'instance:data', 'external'
        Return: 
            (0,net_dict) if ok,   where net_dict contain 'uuid','type','vlan', ...
            (negative,string-error) if error
        """
        for retry_ in range(0, 2):
            cmd = ""
            try:
                with self.lock, self.con:
                    self.cur = self.con.cursor(mdb.cursors.DictCursor)
                    cmd = "SELECT * FROM nets WHERE uuid='%s'" % net_id
                    self.logger.debug(cmd)
                    self.cur.execute(cmd)
                    if self.cur.rowcount == 0:
                        return -1, "network_id %s does not match any net" % net_id
                    net = self.cur.fetchone()
                    break

            except (mdb.Error, AttributeError) as e:
                r, c = self.format_error(e, "check_target_net", cmd)
                if r != -HTTP_Request_Timeout or retry_ == 1:
                    return r, c
        # check permissions
        if tenant_id is not None and tenant_id is not "admin":
            if net['tenant_id'] == tenant_id and net['shared'] == 'false':
                return -1, "needed admin privileges to attach to the net %s" % net_id
        # check types
        if (net['type'] in ('ptp', 'data') and port_type not in ('instance:data', 'external')) or \
                (net['type'] in ('bridge_data', 'bridge_man') and port_type not in ('instance:bridge', 'instance:ovs')):
            return -1, "Cannot attach a port of type %s into a net of type %s" % (port_type, net['type'])
        if net['type'] == 'ptp':
            # look how many 
            nb_ports, data = self.get_ports({'net_id': net_id})
            if nb_ports < 0:
                return -1, data
            else:
                if net['provider']:
                    nb_ports += 1
                if nb_ports >= 2:
                    return -1, "net of type p2p already contain two ports attached. No room for another"

        return 0, net


if __name__ == "__main__":
    print("Hello World")
