#
# Migration test hardware configuration description
#
# Copyright (c) 2016 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, see <http://www.gnu.org/licenses/>.
#


class Hardware(object):
    def __init__(self, cpus=1, mem=1,
                 src_cpu_bind=None, src_mem_bind=None,
                 dst_cpu_bind=None, dst_mem_bind=None,
                 prealloc_pages = False,
                 huge_pages=False, locked_pages=False):
        self._cpus = cpus
        self._mem = mem # GiB
        self._src_mem_bind = src_mem_bind # List of NUMA nodes
        self._src_cpu_bind = src_cpu_bind # List of pCPUs
        self._dst_mem_bind = dst_mem_bind # List of NUMA nodes
        self._dst_cpu_bind = dst_cpu_bind # List of pCPUs
        self._prealloc_pages = prealloc_pages
        self._huge_pages = huge_pages
        self._locked_pages = locked_pages


    def serialize(self):
        return {
            "cpus": self._cpus,
            "mem": self._mem,
            "src_mem_bind": self._src_mem_bind,
            "dst_mem_bind": self._dst_mem_bind,
            "src_cpu_bind": self._src_cpu_bind,
            "dst_cpu_bind": self._dst_cpu_bind,
            "prealloc_pages": self._prealloc_pages,
            "huge_pages": self._huge_pages,
            "locked_pages": self._locked_pages,
        }

    @classmethod
    def deserialize(cls, data):
        return cls(
            data["cpus"],
            data["mem"],
            data["src_cpu_bind"],
            data["src_mem_bind"],
            data["dst_cpu_bind"],
            data["dst_mem_bind"],
            data["prealloc_pages"],
            data["huge_pages"],
            data["locked_pages"])
