# Copyright 2015 Intel Corporation
# 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.

from keystoneauth1 import loading as ks_loading
from oslo_config import cfg

from nova.conf import utils as confutils


DEFAULT_SERVICE_TYPE = 'baremetal'

ironic_group = cfg.OptGroup(
    'ironic',
    title='Ironic Options',
    help="""
Configuration options for Ironic driver (Bare Metal).
If using the Ironic driver following options must be set:

* auth_type
* auth_url
* project_name
* username
* password
* project_domain_id or project_domain_name
* user_domain_id or user_domain_name
""")

ironic_options = [
    cfg.IntOpt(
        'api_max_retries',
        # TODO(raj_singh): Change this default to some sensible number
        default=60,
        min=0,
        help="""
The number of times to retry when a request conflicts.
If set to 0, only try once, no retries.

Related options:

* api_retry_interval
"""),
    cfg.IntOpt(
        'api_retry_interval',
        default=2,
        min=0,
        help="""
The number of seconds to wait before retrying the request.

Related options:

* api_max_retries
"""),
    cfg.IntOpt(
        'serial_console_state_timeout',
        default=10,
        min=0,
        help='Timeout (seconds) to wait for node serial console state '
             'changed. Set to 0 to disable timeout.'),
    cfg.StrOpt(
        'conductor_group',
        deprecated_name='partition_key',
        default=None,
        mutable=True,
        max_length=255,
        regex=r'^[a-zA-Z0-9_.-]*$',
        help='Case-insensitive key to limit the set of nodes that may be '
             'managed by this service to the set of nodes in Ironic which '
             'have a matching conductor_group property. If unset, all '
             'available nodes will be eligible to be managed by this '
             'service. Note that setting this to the empty string (``""``) '
             'will match the default conductor group, and is different than '
             'leaving the option unset.'),
    cfg.StrOpt(
        'shard',
        default=None,
        max_length=255,
        regex=r'^[a-zA-Z0-9_.-]+$',
        help='Specify which ironic shard this nova-compute will manage. '
             'This allows you to shard Ironic nodes between compute '
             'services across conductors and conductor groups. '
             'When a shard is set, the peer_list configuration is ignored. '
             'We require that there is at most one nova-compute service '
             'for each shard.'),
    cfg.ListOpt(
        'peer_list',
        deprecated_for_removal=True,
        deprecated_since='28.0.0',
        deprecated_reason="""\
        We do not recommend using nova-compute HA, please use passive
        failover of a single nova-compute service instead.""",
        default=[],
        help='List of hostnames for all nova-compute services (including '
             'this host) with this conductor_group config value. '
             'Nodes matching the conductor_group value will be distributed '
             'between all services specified here. '
             'If conductor_group is unset, this option is ignored.'),
]


def register_opts(conf):
    conf.register_group(ironic_group)
    conf.register_opts(ironic_options, group=ironic_group)
    confutils.register_ksa_opts(conf, ironic_group, DEFAULT_SERVICE_TYPE)


def list_opts():
    return {ironic_group: (
        ironic_options +
        ks_loading.get_session_conf_options() +
        ks_loading.get_auth_common_conf_options() +
        ks_loading.get_auth_plugin_conf_options('v3password') +
        confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE))
    }
