# 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 oslo_utils import uuidutils
import time


spec_nova_server = {
    "type": "os.nova.server",
    "version": "1.0",
    "properties": {
        # TODO(Yanyan Hu): Use flavor name rather than ID in
        # nova server spec file after sdk support is done.
        "flavor": 1,
        "name": "new-server-test",
        "image": "cirros-0.3.2-x86_64-uec",
        "networks": [
            {"network": "private-net"}
        ]
    }
}


spec_scaling_policy = {
    "type": "senlin.policy.scaling",
    "version": "1.0",
    "properties": {
        "event": "CLUSTER_SCALE_IN",
        "adjustment": {
            "type": "CHANGE_IN_CAPACITY",
            "number": 1,
            "min_step": 1,
            "best_effort": True
        }
    }
}

spec_lb_policy = {
    "type": "senlin.policy.loadbalance",
    "version": "1.0",
    "properties": {
        "pool": {
            "protocol": "HTTP",
            "protocol_port": 80,
            "subnet": "private-subnet",
            "lb_method": "ROUND_ROBIN",
            "session_persistence": {
                "type": "SOURCE_IP",
                "cookie_name": "test-cookie"
            }
        },
        "vip": {
            "subnet": "private-subnet",
            "connection_limit": 100,
            "protocol": "HTTP",
            "protocol_port": 80
        },
        "health_monitor": {
            "type": "HTTP",
            "delay": "1",
            "timeout": 1,
            "max_retries": 5,
            "admin_state_up": True,
            "http_method": "GET",
            "url_path": "/index.html",
            "expected_codes": "200,201,202"
        }
    }
}


def wait_for_status(func, client, obj_id, expected_status, timeout=60,
                    ignore_missing=False):
    # TODO(Yanyan Hu): Put timeout option into test configure file
    while timeout > 0:
        res = func(client, obj_id, ignore_missing)
        if not ignore_missing:
            if res['status'] == expected_status:
                return res
        else:
            if res.status == 404:
                return res
        time.sleep(5)
        timeout -= 5

    raise Exception('Timeout waiting for status.')


def wait_for_delete(func, client, obj, timeout=60):
    while timeout > 0:
        res = func(client, obj, ignore_missing=True)
        if res.status == 404:
            return res
        time.sleep(5)
        timeout -= 5

    raise Exception('Timeout waiting for deletion.')


def random_name(prefix, len_postfix=8):
    postfix = uuidutils.generate_uuid()[:len_postfix]
    return ''.join([prefix, '-', postfix])
