# Copyright (c) 2017 b<>com
#
# Authors: Vincent FRANCOISE <Vincent.FRANCOISE@b-com.com>
#
# 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.

from watcher.decision_engine.model import element
from watcher.tests.unit import base


class TestElement(base.TestCase):
    scenarios = [
        (
            "ComputeNode_with_all_fields",
            dict(
                cls=element.Instance,
                data={
                    'uuid': 'FAKE_UUID',
                    'state': 'state',
                    'hostname': 'hostname',
                    'memory': 111,
                    'vcpus': 222,
                    'disk': 333,
                },
            ),
        ),
        (
            "ComputeNode_with_some_fields",
            dict(
                cls=element.Instance,
                data={
                    'uuid': 'FAKE_UUID',
                    'state': 'state',
                    'vcpus': 222,
                    'disk': 333,
                },
            ),
        ),
        (
            "Instance_with_all_fields",
            dict(
                cls=element.Instance,
                data={
                    'uuid': 'FAKE_UUID',
                    'state': 'state',
                    'hostname': 'hostname',
                    'name': 'name',
                    'memory': 111,
                    'vcpus': 222,
                    'disk': 333,
                },
            ),
        ),
        (
            "Instance_with_some_fields",
            dict(
                cls=element.Instance,
                data={
                    'uuid': 'FAKE_UUID',
                    'state': 'state',
                    'vcpus': 222,
                    'disk': 333,
                },
            ),
        ),
        (
            "Instance_with_extended_fields",
            dict(
                cls=element.Instance,
                data={
                    'uuid': 'FAKE_UUID',
                    'state': 'state',
                    'vcpus': 222,
                    'disk': 333,
                    'pinned_az': 'nova',
                    'flavor_extra_specs': {
                        "spec1": "value1",
                        "spec2": "value2",
                    },
                },
            ),
        ),
    ]

    def test_as_xml_element(self):
        el = self.cls(**self.data)
        el.as_xml_element()


class TestStorageElement(base.TestCase):
    scenarios = [
        (
            "StorageNode_with_all_fields",
            dict(
                cls=element.StorageNode,
                data={
                    'host': 'host@backend',
                    'zone': 'zone',
                    'status': 'enabled',
                    'state': 'up',
                    'volume_type': ['volume_type'],
                },
            ),
        ),
        (
            "Pool_with_all_fields",
            dict(
                cls=element.Pool,
                data={
                    'name': 'host@backend#pool',
                    'total_volumes': 1,
                    'total_capacity_gb': 500,
                    'free_capacity_gb': 420,
                    'provisioned_capacity_gb': 80,
                    'allocated_capacity_gb': 80,
                    'virtual_free': 420,
                },
            ),
        ),
        (
            "Pool_without_virtual_free_fields",
            dict(
                cls=element.Pool,
                data={
                    'name': 'host@backend#pool',
                    'total_volumes': 1,
                    'total_capacity_gb': 500,
                    'free_capacity_gb': 420,
                    'provisioned_capacity_gb': 80,
                    'allocated_capacity_gb': 80,
                },
            ),
        ),
        (
            "Volume_with_all_fields",
            dict(
                cls=element.Volume,
                data={
                    'uuid': 'FAKE_UUID',
                    'size': 1,
                    'status': 'in-use',
                    'attachments': '[{"key": "value"}]',
                    'name': 'name',
                    'multiattach': 'false',
                    'snapshot_id': '',
                    'project_id': '8ea272ec-52d2-475e-9151-0f3ed8c674d1',
                    'metadata': '{"key": "value"}',
                    'bootable': 'false',
                    'human_id': 'human_id',
                },
            ),
        ),
        (
            "Volume_without_bootable_fields",
            dict(
                cls=element.Volume,
                data={
                    'uuid': 'FAKE_UUID',
                    'size': 1,
                    'status': 'in-use',
                    'attachments': '[]',
                    'name': 'name',
                    'multiattach': 'false',
                    'snapshot_id': '',
                    'project_id': '777d7968-9b61-4cc0-844d-a95a6fc22d8c',
                    'metadata': '{"key": "value"}',
                    'human_id': 'human_id',
                },
            ),
        ),
        (
            "Volume_without_human_id_fields",
            dict(
                cls=element.Volume,
                data={
                    'uuid': 'FAKE_UUID',
                    'size': 1,
                    'status': 'in-use',
                    'attachments': '[]',
                    'name': 'name',
                    'multiattach': 'false',
                    'snapshot_id': '',
                    'project_id': '2e65af64-1898-4cee-bfee-af3fc7f76d16',
                    'metadata': '{"key": "value"}',
                },
            ),
        ),
    ]

    def test_as_xml_element(self):
        el = self.cls(**self.data)
        el.as_xml_element()


class TestIronicElement(base.TestCase):
    scenarios = [
        (
            "IronicNode_with_all_fields",
            dict(
                cls=element.IronicNode,
                data={
                    "uuid": 'FAKE_UUID',
                    "power_state": 'up',
                    "maintenance": "false",
                    "maintenance_reason": "null",
                    "extra": {"compute_node_id": 1},
                },
            ),
        ),
        (
            "IronicNode_with_some_fields",
            dict(
                cls=element.IronicNode,
                data={
                    "uuid": 'FAKE_UUID',
                    "power_state": 'up',
                    "maintenance": "false",
                    "extra": {"compute_node_id": 1},
                },
            ),
        ),
    ]

    def test_as_xml_element(self):
        el = self.cls(**self.data)
        el.as_xml_element()
