示例#1
0
def k8s_cluster(request):
    agent_image_name = request.config.getoption("--agent-image-name")

    conf = request.config
    kube_context = None
    if conf.getoption("--kubeconfig") or conf.getoption(
            "--kube-context") or conf.getoption("--no-use-minikube"):
        assert agent_image_name, "You must specify the agent image name when not using minikube"
        kube_config_path = conf.getoption("--kubeconfig")
        kube_context = conf.getoption("--kube-context")
    else:
        minikube_container_name = conf.getoption("--minikube-container-name")
        dclient = get_docker_client()
        assert get_docker_client().containers.get(
            minikube_container_name
        ), f"You must start the minikube container ({minikube_container_name}) before running pytest by running `make minikube`."

        # Pull the kubeconfig out of the minikube container and make a cluster instance based on it.
        minikube_cont = dclient.containers.get(minikube_container_name)
        _, kubeconfig_bytes = minikube_cont.exec_run("cat /kubeconfig")

        _, kube_config_path = tempfile.mkstemp()
        request.addfinalizer(lambda: os.remove(kube_config_path))

        with open(kube_config_path, "wb") as fd:
            fd.write(kubeconfig_bytes)
        if not agent_image_name:
            agent_image_name = "localhost:5000/signalfx-agent:latest"

    cluster = Cluster(kube_config_path=kube_config_path,
                      kube_context=kube_context,
                      agent_image_name=agent_image_name)
    request.addfinalizer(cluster.delete_test_namespace)
    return cluster
示例#2
0
def kong_image():
    dockerfile = BytesIO(
        bytes(
            dedent(r"""
        from kong:0.13-centos
        RUN yum install -y epel-release
        RUN yum install -y postgresql git
        WORKDIR /usr/local/share/lua/5.1/kong
        RUN sed -i '38ilua_shared_dict kong_signalfx_aggregation 10m;' templates/nginx_kong.lua
        RUN sed -i '38ilua_shared_dict kong_signalfx_locks 100k;' templates/nginx_kong.lua
        RUN sed -i '29i\ \ "signalfx",' constants.lua
        WORKDIR /opt/
        RUN git clone --depth 1 https://github.com/signalfx/kong-plugin-signalfx.git
        RUN cd kong-plugin-signalfx && luarocks make
        WORKDIR /
        RUN mkdir -p /usr/local/kong/logs
        RUN ln -s /dev/stderr /usr/local/kong/logs/error.log
        RUN ln -s /dev/stdout /usr/local/kong/logs/access.log
    """),
            "ascii",
        ))
    client = get_docker_client()
    image, _ = client.images.build(fileobj=dockerfile, forcerm=True)
    try:
        yield image.short_id
    finally:
        client.images.remove(image=image.id, force=True)
示例#3
0
def build_base_image(name, path=DOCKERFILES_DIR, dockerfile=None):
    client = get_docker_client()
    dockerfile = dockerfile or Path(path) / f"Dockerfile.{name}"
    image, _ = client.images.build(path=str(path),
                                   dockerfile=str(dockerfile),
                                   pull=True,
                                   rm=True,
                                   forcerm=True)

    return image.id
示例#4
0
def build_base_image(name):
    client = get_docker_client()
    image, logs = client.images.build(path=DOCKERFILES_DIR,
                                      dockerfile=os.path.join(
                                          DOCKERFILES_DIR,
                                          "Dockerfile.%s" % name),
                                      rm=True,
                                      forcerm=True)

    return image.id
示例#5
0
def build_base_image(name, path=DOCKERFILES_DIR, dockerfile=None):
    client = get_docker_client()
    if not dockerfile:
        dockerfile = os.path.join(path, "Dockerfile.%s" % name)
    image, _ = client.images.build(path=path,
                                   dockerfile=dockerfile,
                                   pull=True,
                                   rm=True,
                                   forcerm=True)

    return image.id
示例#6
0
 def __init__(self):
     self.agent = Agent()
     self.client = None
     self.cluster_name = None
     self.container = None
     self.container_ip = None
     self.container_name = None
     self.host_client = get_docker_client()
     self.image_tag = None
     self.k8s_version = None
     self.kubeconfig = None
     self.registry_port = 5000
     self.resources = []
     self.version = None
示例#7
0
 def __init__(self):
     self.bootstrapper = None
     self.container = None
     self.client = None
     self.version = None
     self.k8s_version = None
     self.name = None
     self.host_client = get_docker_client()
     self.yamls = []
     self.agent = Agent()
     self.cluster_name = "minikube"
     self.kubeconfig = None
     self.namespace = "default"
     self.worker_id = "master"
     self.registry_port = None
示例#8
0
def agent_image(minikube, request, worker_id):  # pylint: disable=redefined-outer-name
    def teardown():
        if temp_agent_name and temp_agent_tag:
            try:
                client.images.remove("%s:%s" % (temp_agent_name, temp_agent_tag))
            except:  # noqa pylint: disable=bare-except
                pass

    request.addfinalizer(teardown)
    sfx_agent_name = os.environ.get("K8S_SFX_AGENT")
    if not sfx_agent_name:
        sfx_agent_name = request.config.getoption("--k8s-sfx-agent")
    if sfx_agent_name:
        try:
            agent_image_name, agent_image_tag = sfx_agent_name.rsplit(":", maxsplit=1)
        except ValueError:
            agent_image_name = sfx_agent_name
            agent_image_tag = "latest"
    else:
        agent_image_name = "signalfx-agent"
        agent_image_tag = "k8s-test"
    temp_agent_name = None
    temp_agent_tag = None
    client = get_docker_client()
    if worker_id in ("master", "gw0"):
        if sfx_agent_name and not has_docker_image(client, sfx_agent_name):
            print('\nAgent image "%s" not found in local registry.' % sfx_agent_name)
            print("Attempting to pull from remote registry to minikube ...")
            sfx_agent_image = minikube.pull_agent_image(agent_image_name, agent_image_tag)
            _, output = minikube.container.exec_run("docker images")
            print(output.decode("utf-8"))
            return {"name": agent_image_name, "tag": agent_image_tag, "id": sfx_agent_image.id}

        if sfx_agent_name:
            print('\nAgent image "%s" found in local registry.' % sfx_agent_name)
            sfx_agent_image = client.images.get(sfx_agent_name)
        else:
            print(
                '\nBuilding agent image from local source and tagging as "%s:%s" ...'
                % (agent_image_name, agent_image_tag)
            )
            subprocess.run(
                "make image",
                shell=True,
                env={"PULL_CACHE": "yes", "AGENT_IMAGE_NAME": agent_image_name, "AGENT_VERSION": agent_image_tag},
                stderr=subprocess.STDOUT,
                check=True,
                cwd=REPO_ROOT_DIR,
                timeout=K8S_SFX_AGENT_BUILD_TIMEOUT,
            )
            sfx_agent_image = client.images.get(agent_image_name + ":" + agent_image_tag)
        temp_agent_name = "localhost:%d/signalfx-agent-dev" % minikube.registry_port
        temp_agent_tag = "latest"
        print("\nPushing agent image to minikube ...")
        sfx_agent_image.tag(temp_agent_name, tag=temp_agent_tag)
        client.images.push(temp_agent_name, tag=temp_agent_tag)
        sfx_agent_image = minikube.pull_agent_image(temp_agent_name, temp_agent_tag, sfx_agent_image.id)
        sfx_agent_image.tag(agent_image_name, tag=agent_image_tag)
        _, output = minikube.container.exec_run("docker images")
        print(output.decode("utf-8").strip())
    else:
        print("\nWaiting for agent image to be built/pulled to minikube ...")
        assert wait_for(
            p(has_docker_image, minikube.client, agent_image_name, agent_image_tag),
            timeout_seconds=K8S_SFX_AGENT_BUILD_TIMEOUT,
            interval_seconds=2,
        ), 'timed out waiting for agent image "%s:%s"!' % (agent_image_name, agent_image_tag)
        sfx_agent_image = minikube.client.images.get(agent_image_name + ":" + agent_image_tag)
    return {"name": agent_image_name, "tag": agent_image_tag, "id": sfx_agent_image.id}