import json
import pytest
import logging
import subprocess
import tempfile
import os
import shutil

import evolve
import layers.packet


def pytest_addoption(parser):
    """
    Adds options to pytest
    """
    parser.addoption(
        "--evolve-logger", action="store", choices=("debug", "info", "warning", "critical", "error"), help="Sets the log level", default="info"
        )


@pytest.fixture(scope="session")
def logger(request):
    """
    Returns log level requested.
    """
    # On some systems, docker and urllib3 log levels are cleared (such as Travis)
    # Reset them to warnings only to keep logging sane.
    logging.getLogger("docker").setLevel(logging.WARNING)
    logging.getLogger("urllib3").setLevel(logging.WARNING)

    level = request.config.getoption("--evolve-logger")
    logger = evolve.setup_logger(level)
    return logger


@pytest.fixture(autouse=True, scope="function")
def reset_packet_restrictions():
    """
    Autouse feature to make sure tests have a clean slate for processing.
    """
    layers.packet.Packet.reset_restrictions()


@pytest.mark.tryfirst
@pytest.fixture(autouse=True, scope="function")
def blank_new_line():
    """
    Autouse feature to print a new line after the test name for cleaner printing.
    """
    print("")


@pytest.fixture
def client_worker(request):
    """
    Defines a client worker fixture. This creates a docker container
    with SSH enabled and the code mounted to test the evaluator's client workers.
    """
    container = {}
    worker_path = tempfile.mkdtemp()
    os.makedirs(os.path.join(worker_path, "test_container"))
    info_path = os.path.join(worker_path, "worker.json")
    worker_dict = {
        "ip" : "127.0.0.1",
        "port" : 2222,
        "username" : "root",
        "password" : "<PASSWORD>!",
        "geneva_path" : "/code",
        "python" : "python3"
    }

    with open(info_path, "w") as fd:
        json.dump(worker_dict, fd)
    container["worker"] = info_path

    def fin(cid):
        shutil.rmtree(worker_path)
        if cid:
            print("\nCleaning up container")
            subprocess.check_call(["docker", "stop", cid])

    cid = None
    # Run the base docker container to give us a worker client
    cid = subprocess.check_output(["docker", "run", "--privileged", "--dns=8.8.8.8", "-id", "-p", "2222:22", "-v", "%s:/code" % os.path.abspath(os.getcwd()), "base"]).decode("utf-8").strip()
    request.addfinalizer(lambda: fin(cid))
    print("\nCreated container %s" % cid[:8])
    container["id"] = cid
    container["cid"] = cid[:8]

    #output = subprocess.check_output(["docker", "exec", "-i", cid, "ifconfig", "eth0"])

    #ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', output.decode("utf-8"))[0]
    #print("Parsed container ip: %s" % ip)
    container["ip"] = "0.0.0.0"

    subprocess.check_call(["docker", "exec", "-i", cid, "service", "ssh", "start"])
    return container

import json
import pytest
import logging
import subprocess
import tempfile
import os
import shutil

import evolve
import layers.packet


def pytest_addoption(parser):
    """
    Adds options to pytest
    """
    parser.addoption(
        "--evolve-logger", action="store", choices=("debug", "info", "warning", "critical", "error"), help="Sets the log level", default="info"
        )


@pytest.fixture(scope="session")
def logger(request):
    """
    Returns log level requested.
    """
    # On some systems, docker and urllib3 log levels are cleared (such as Travis)
    # Reset them to warnings only to keep logging sane.
    logging.getLogger("docker").setLevel(logging.WARNING)
    logging.getLogger("urllib3").setLevel(logging.WARNING)

    level = request.config.getoption("--evolve-logger")
    logger = evolve.setup_logger(level)
    return logger


@pytest.fixture(autouse=True, scope="function")
def reset_packet_restrictions():
    """
    Autouse feature to make sure tests have a clean slate for processing.
    """
    layers.packet.Packet.reset_restrictions()


@pytest.mark.tryfirst
@pytest.fixture(autouse=True, scope="function")
def blank_new_line():
    """
    Autouse feature to print a new line after the test name for cleaner printing.
    """
    print("")


@pytest.fixture
def client_worker(request):
    """
    Defines a client worker fixture. This creates a docker container
    with SSH enabled and the code mounted to test the evaluator's client workers.
    """
    container = {}
    worker_path = tempfile.mkdtemp()
    os.makedirs(os.path.join(worker_path, "test_container"))
    info_path = os.path.join(worker_path, "worker.json")
    worker_dict = {
        "ip" : "127.0.0.1",
        "port" : 2222,
        "username" : "root",
        "password" : "<PASSWORD>!",
        "geneva_path" : "/code",
        "python" : "python3"
    }

    with open(info_path, "w") as fd:
        json.dump(worker_dict, fd)
    container["worker"] = info_path

    def fin(cid):
        shutil.rmtree(worker_path)
        if cid:
            print("\nCleaning up container")
            subprocess.check_call(["docker", "stop", cid])

    cid = None
    # Run the base docker container to give us a worker client
    cid = subprocess.check_output(["docker", "run", "--privileged", "--dns=8.8.8.8", "-id", "-p", "2222:22", "-v", "%s:/code" % os.path.abspath(os.getcwd()), "base"]).decode("utf-8").strip()
    request.addfinalizer(lambda: fin(cid))
    print("\nCreated container %s" % cid[:8])
    container["id"] = cid
    container["cid"] = cid[:8]

    #output = subprocess.check_output(["docker", "exec", "-i", cid, "ifconfig", "eth0"])

    #ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', output.decode("utf-8"))[0]
    #print("Parsed container ip: %s" % ip)
    container["ip"] = "0.0.0.0"

    subprocess.check_call(["docker", "exec", "-i", cid, "service", "ssh", "start"])
    return container

Adds options to pytest Returns log level requested. # On some systems, docker and urllib3 log levels are cleared (such as Travis) # Reset them to warnings only to keep logging sane. Autouse feature to make sure tests have a clean slate for processing. Autouse feature to print a new line after the test name for cleaner printing. Defines a client worker fixture. This creates a docker container     with SSH enabled and the code mounted to test the evaluator's client workers. # Run the base docker container to give us a worker client #output = subprocess.check_output(["docker", "exec", "-i", cid, "ifconfig", "eth0"]) #ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', output.decode("utf-8"))[0] #print("Parsed container ip: %s" % ip)