# Copyright 2017 Huawei Technologies Co.,LTD.
# 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.
import os_resource_classes as orc


CONDUCTOR_TOPIC = 'cyborg-conductor'
AGENT_TOPIC = 'cyborg-agent'
DEVICE_GPU = 'GPU'
DEVICE_FPGA = 'FPGA'
DEVICE_AICHIP = 'AICHIP'
DEVICE_QAT = 'QAT'
DEVICE_NIC = 'NIC'
DEVICE_SSD = 'SSD'


ARQ_STATES = (
    ARQ_INITIAL,
    ARQ_BIND_STARTED,
    ARQ_BOUND,
    ARQ_UNBOUND,
    ARQ_BIND_FAILED,
    ARQ_UNBIND_FAILED,
    ARQ_DELETING,
) = (
    'Initial',
    'BindStarted',
    'Bound',
    'Unbound',
    'BindFailed',
    'UnbindFailed',
    'Deleting',
)


ARQ_BIND_STAGE = (ARQ_PRE_BIND, ARQ_FINISH_BIND, ARQ_OUFOF_BIND_FLOW) = (
    [ARQ_INITIAL, ARQ_BIND_STARTED],
    [ARQ_BOUND, ARQ_BIND_FAILED],
    [ARQ_UNBOUND, ARQ_DELETING],
)


ARQ_BIND_STATUS = (ARQ_BIND_STATUS_FINISH, ARQ_BIND_STATUS_FAILED) = (
    "completed",
    "failed",
)


ARQ_BIND_STATES_STATUS_MAP = {
    ARQ_BOUND: ARQ_BIND_STATUS_FINISH,
    ARQ_BIND_FAILED: ARQ_BIND_STATUS_FAILED,
    ARQ_DELETING: ARQ_BIND_STATUS_FAILED,
}

# TODO(Shaohe): maybe we can use oslo automaton lib
# ref: https://docs.openstack.org/automaton/latest/user/examples.html
# The states in value list can transform to the key state
ARQ_STATES_TRANSFORM_MATRIX = {
    ARQ_INITIAL: [],
    ARQ_BIND_STARTED: [ARQ_INITIAL, ARQ_UNBOUND],
    ARQ_BOUND: [ARQ_BIND_STARTED],
    ARQ_UNBOUND: [ARQ_INITIAL, ARQ_BIND_STARTED, ARQ_BOUND, ARQ_BIND_FAILED],
    ARQ_BIND_FAILED: [ARQ_BIND_STARTED, ARQ_BOUND],
    ARQ_DELETING: [
        ARQ_INITIAL,
        ARQ_BIND_STARTED,
        ARQ_BOUND,
        ARQ_UNBOUND,
        ARQ_BIND_FAILED,
    ],
}


# Device type
DEVICE_TYPE = (
    DEVICE_GPU,
    DEVICE_FPGA,
    DEVICE_AICHIP,
    DEVICE_QAT,
    DEVICE_NIC,
    DEVICE_SSD,
)


# Device type
DEVICE_STATUS = ("enabled", "maintaining")


# Attach handle type
#  'TEST_PCI': used by fake driver, ignored by Nova virt driver.
ATTACH_HANDLE_TYPES = (AH_TYPE_PCI, AH_TYPE_MDEV, AH_TYPE_TEST_PCI) = (
    "PCI",
    "MDEV",
    "TEST_PCI",
)


# Control Path ID type
CPID_TYPE = CPID_TYPE_PCI = "PCI"


# Resource Class
RESOURCES = {
    "FPGA": orc.FPGA,
    "PGPU": orc.PGPU,
    "VGPU": orc.VGPU,
    "QAT": "CUSTOM_QAT",
    "NIC": "CUSTOM_NIC",
    "SSD": 'CUSTOM_SSD',
    "PCI": 'CUSTOM_PCI',
}


ACCEL_SPECS = (ACCEL_BITSTREAM_ID, ACCEL_FUNCTION_ID) = (
    "accel:bitstream_id",
    "accel:function_id",
)


SUPPORT_RESOURCES = (FPGA, GPU, VGPU, PGPU, QAT, NIC, SSD) = (
    "FPGA",
    "GPU",
    "VGPU",
    "PGPU",
    "CUSTOM_QAT",
    "CUSTOM_NIC",
    "CUSTOM_SSD",
)


FPGA_TRAITS = (FPGA_FUNCTION_ID,) = ("CUSTOM_FPGA_FUNCTION_ID",)


RESOURCES_PREFIX = "resources:"
