#
# Migration test scenario parameter 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.1 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 Scenario(object):

    def __init__(self, name,
                 downtime=500,
                 bandwidth=125000, # 1000 gig-e, effectively unlimited
                 max_iters=30,
                 max_time=300,
                 pause=False, pause_iters=5,
                 post_copy=False, post_copy_iters=5,
                 auto_converge=False, auto_converge_step=10,
                 compression_mt=False, compression_mt_threads=1,
                 compression_xbzrle=False, compression_xbzrle_cache=10,
                 multifd=False, multifd_channels=2,
                 dirty_limit=False, x_vcpu_dirty_limit_period=500,
                 vcpu_dirty_limit=1):

        self._name = name

        # General migration tunables
        self._downtime = downtime  # milliseconds
        self._bandwidth = bandwidth # MiB per second
        self._max_iters = max_iters
        self._max_time = max_time # seconds


        # Strategies for ensuring completion
        self._pause = pause
        self._pause_iters = pause_iters

        self._post_copy = post_copy
        self._post_copy_iters = post_copy_iters

        self._auto_converge = auto_converge
        self._auto_converge_step = auto_converge_step # percentage CPU time

        self._compression_mt = compression_mt
        self._compression_mt_threads = compression_mt_threads

        self._compression_xbzrle = compression_xbzrle
        self._compression_xbzrle_cache = compression_xbzrle_cache # percentage of guest RAM

        self._multifd = multifd
        self._multifd_channels = multifd_channels

        self._dirty_limit = dirty_limit
        self._x_vcpu_dirty_limit_period = x_vcpu_dirty_limit_period
        self._vcpu_dirty_limit = vcpu_dirty_limit

    def serialize(self):
        return {
            "name": self._name,
            "downtime": self._downtime,
            "bandwidth": self._bandwidth,
            "max_iters": self._max_iters,
            "max_time": self._max_time,
            "pause": self._pause,
            "pause_iters": self._pause_iters,
            "post_copy": self._post_copy,
            "post_copy_iters": self._post_copy_iters,
            "auto_converge": self._auto_converge,
            "auto_converge_step": self._auto_converge_step,
            "compression_mt": self._compression_mt,
            "compression_mt_threads": self._compression_mt_threads,
            "compression_xbzrle": self._compression_xbzrle,
            "compression_xbzrle_cache": self._compression_xbzrle_cache,
            "multifd": self._multifd,
            "multifd_channels": self._multifd_channels,
            "dirty_limit": self._dirty_limit,
            "x_vcpu_dirty_limit_period": self._x_vcpu_dirty_limit_period,
            "vcpu_dirty_limit": self._vcpu_dirty_limit,
        }

    @classmethod
    def deserialize(cls, data):
        return cls(
            data["name"],
            data["downtime"],
            data["bandwidth"],
            data["max_iters"],
            data["max_time"],
            data["pause"],
            data["pause_iters"],
            data["post_copy"],
            data["post_copy_iters"],
            data["auto_converge"],
            data["auto_converge_step"],
            data["compression_mt"],
            data["compression_mt_threads"],
            data["compression_xbzrle"],
            data["compression_xbzrle_cache"],
            data["multifd"],
            data["multifd_channels"])
