コード例 #1
0
ファイル: service.py プロジェクト: ChrisMukherjee/aimmo
def create_game_service(api, name, _config):
    service = Service(
        api,
        {
            'kind': 'Service',
            'apiVersion': 'v1',
            'metadata': {
                'name': "game-%s" % name,
                'labels': {
                    'app': 'aimmo-game',
                    'game': name,
                },
            },
            'spec': {
                'selector': {
                    'app': 'aimmo-game',
                    'game': name,
                },
                'ports': [
                    {
                        'protocol': 'TCP',
                        'port': 80,
                        'targetPort': 5000,
                    },
                ],
                'type': 'NodePort',
            },
        },
    )
    service.create()
コード例 #2
0
ファイル: service.py プロジェクト: jameelgrand/aimmo
def create_game_service(api, name, _config):
    service = Service(
        api,
        {
            'kind': 'Service',
            'apiVersion': 'v1',
            'metadata': {
                'name': "game-%s" % name,
                'labels': {
                    'app': 'aimmo-game',
                    'game': name,
                },
            },
            'spec': {
                'selector': {
                    'app': 'aimmo-game',
                    'game': name,
                },
                'ports': [
                    {
                        'protocol': 'TCP',
                        'port': 80,
                        'targetPort': 5000,
                    },
                ],
                'type': 'NodePort',
            },
        },
    )
    service.create()
コード例 #3
0
ファイル: report.py プロジェクト: mrandi/kube-resource-report
def find_backend_application(client, ingress, rule):
    '''
    The Ingress object might not have a "application" label, so let's try to find the application by looking at the backend service and its pods
    '''
    paths = rule.get('http', {}).get('paths', [])
    selectors = []
    for path in paths:
        service_name = path.get('backend', {}).get('serviceName')
        if service_name:
            try:
                service = Service.objects(
                    client, namespace=ingress.namespace).get(name=service_name)
            except ObjectDoesNotExist:
                logger.debug(
                    f'Referenced service does not exist: {ingress.namespace}/{service_name}'
                )
            else:
                selector = service.obj['spec'].get('selector', {})
                selectors.append(selector)
                application = get_application_from_labels(selector)
                if application:
                    return application
    # we still haven't found the application, let's look up pods by label selectors
    for selector in selectors:
        application_candidates = set()
        for pod in Pod.objects(client).filter(namespace=ingress.namespace,
                                              selector=selector):
            application = get_application_from_labels(pod.labels)
            if application:
                application_candidates.add(application)

        if len(application_candidates) == 1:
            return application_candidates.pop()
    return ''
コード例 #4
0
    def start(self, object_type, object_file_path, force=False):

        if not self.api:
            logging.info('API Client does not exist')
            return

        with open(object_file_path) as json_data:
            json_file = json.load(json_data)

        if object_type is KubernetesObjects.POD:

            pod = Pod(self.api, json_file)
            self._recreate_object(pod, force)
            self._add_object_to_kube_objects_dict('pods', pod)

        elif object_type is KubernetesObjects.SERVICE:

            service = Service(self.api, json_file)
            self._recreate_object(service, force)
            self._add_object_to_kube_objects_dict('services', service)

        elif object_type is KubernetesObjects.REPLICATION_CONTROLLER:

            rc = ReplicationController(self.api, json_file)
            self._recreate_object(rc, force)
            self._add_object_to_kube_objects_dict('rcs', rc)
コード例 #5
0
ファイル: handlers.py プロジェクト: paguos/fog-rollouts
def delete(body, meta, spec, status, **kwargs):
    api = K8SApi.from_env()

    deployment_name = f"{meta['name']}-{LAYER}"
    logger.info(f"Deleting deployment {deployment_name} ...")

    try:
        deployment = Deployment.objects(api).filter(
            namespace=meta["namespace"]).get(name=deployment_name)
        deployment.delete()
    except ObjectDoesNotExist:
        logger.warning(f"Deployment {deployment_name} doesn't exist")

    logger.info(f"Deleting deployment {deployment_name} ... done!")

    service_name = f"{meta['name']}"
    logger.info(f"Deleting service {service_name} ...")

    try:
        service = Service.objects(api).filter(namespace=meta["namespace"]).get(
            name=service_name)
        service.delete()
    except ObjectDoesNotExist:
        logger.warning(f"Service {service_name} doesn't exist")

    logger.info(f"Deleting service {service_name} ... done!")
    api.session.close()
    return {'job1-status': 100}
コード例 #6
0
def test_services(kube_cluster: Cluster):
    services_response = Service.objects(
        kube_cluster.kube_client).filter(namespace="default")
    for service_name in [
            "apiserver", "giantswarm-todo-app-mysql", "todomanager"
    ]:
        service = services_response.get_by_name(service_name)
        assert service is not None
コード例 #7
0
ファイル: handlers.py プロジェクト: paguos/fog-rollouts
def create(body, meta, spec, status, **kwargs):
    api = K8SApi.from_env()

    logger.info("Creating deployment ...")
    deployment_data = create_deployment_data(meta, spec)
    kopf.adopt(deployment_data)
    # kopf.label(pod_data, {'application': 'kopf-example-10'})

    deployment = Deployment(api, deployment_data)
    if deployment.exists():
        deployment.update()
    else:
        deployment.create()
    logger.info("Creating deployment ... done!")

    logger.info("Creating service ...")
    service_data = create_service_data(meta, spec)
    kopf.adopt(service_data)

    service = Service(api, service_data)
    if service.exists():
        service.update()
    else:
        service.create()
    logger.info("Creating service ... done!")

    api.session.close()
    return {'job1-status': 100}
コード例 #8
0
def delete(namespace, names, logger):
    api = HTTPClient(KubeConfig.from_file())
    for name in names:
        deploy = Deployment.objects(api, namespace=namespace).get(name=name)
        deploy.delete()
        logger.info(f'delete Deployment: {str(deploy)}')
        service = Service.objects(api, namespace=namespace).get(name=name)
        service.delete()
        logger.info(f'delete Service:    {str(service)}')
コード例 #9
0
def get_application_label_from_service(client: pykube.HTTPClient, namespace,
                                       service_name):
    try:
        service = Service.objects(client,
                                  namespace=namespace).get(name=service_name)
    except ObjectDoesNotExist:
        logger.debug(
            f"Referenced service does not exist: {namespace}/{service_name}")
        return None, None
    else:
        selector = service.obj["spec"].get("selector", {})
        application = get_application_from_labels(selector)
        if application:
            return application, []
        return "", selector
コード例 #10
0
def test_get_todos(kube_cluster: Cluster, cluster_type: str,
                   chart_extra_info: Dict[str, str]):
    # unfortunately, when services and deployments are ready, traffic forwarding doesn't yet
    # work fo 100% :( That's why we need a retry.
    logger.info(
        f"Running on cluster of type {cluster_type}, extra info is: {chart_extra_info}"
    )
    apiserver_service = (Service.objects(kube_cluster.kube_client).filter(
        namespace="default").get(name="apiserver"))
    res = proxy_http_get(kube_cluster.kube_client, apiserver_service,
                         "v1/todo")
    assert res is not None
    assert res.content == b"null\n"
    assert res.status_code == 200
    assert "Content-Type" in res.headers
    assert res.headers["Content-Type"] == "application/json; charset=utf-8"
コード例 #11
0
ファイル: utils.py プロジェクト: cmendible/k8spin-operator
def create_helloworld_service(api, organization_name, tenant_name, space_name,
                              service_name):
    obj = yaml.safe_load(f"""
            kind: Service
            apiVersion: v1
            metadata:
                namespace: org-{organization_name}-tenant-{tenant_name}-space-{space_name}
                name: {service_name}
            spec:
                selector:
                    app: {service_name}
                ports:
                    - protocol: TCP
                      port: 80
                      targetPort: 8080
        """)
    return Service(api, obj)
コード例 #12
0
def test_create_delete_todo_entry(kube_cluster: Cluster):
    apiserver_service = (Service.objects(kube_cluster.kube_client).filter(
        namespace="default").get(name="apiserver"))
    body = '{"Text":"testing"}'
    headers = {"Content-Type": "application/json"}
    res = proxy_http_post(
        kube_cluster.kube_client,
        apiserver_service,
        "v1/todo",
        data=body,
        headers=headers,
    )
    assert res is not None
    assert res.status_code == 200
    todo_id = json.loads(res.text)["id"]
    res = proxy_http_delete(kube_cluster.kube_client, apiserver_service,
                            f"v1/todo/{todo_id}")
    assert res is not None
    assert res.status_code == 200
コード例 #13
0
def test_stormforger_load_app_creation(
        kube_cluster: Cluster,
        stormforger_load_app_factory: StormforgerLoadAppFactoryFunc) -> None:
    """This test deploys stormforger_load_app and checks if it response to basic requests.
    To make this example run, you need a ready cluster with Giant Swarm App Platform.
    The easiest way to create it is to run: `kube-app-testing.sh -j`.
    """
    loadtest_app = stormforger_load_app_factory(1, "test.local", None)
    assert loadtest_app.app is not None
    wait_for_deployments_to_run(kube_cluster.kube_client,
                                [loadtest_app.app.name],
                                loadtest_app.app.namespace, 60)
    srv: Service = Service.objects(kube_cluster.kube_client,
                                   loadtest_app.app.namespace).get_by_name(
                                       loadtest_app.app.name)
    assert srv is not None
    res = srv.proxy_http_get("/", headers={"Host": "test.local"})
    assert res is not None
    assert res.ok
    assert res.status_code == 200
    assert res.text.startswith("GET / HTTP/1.1\r\nHost: test.local\r\n")
コード例 #14
0
def find_backend_application(client: pykube.HTTPClient, ingress: Ingress, rule):
    """
    Find the application ID for a given Ingress object.

    The Ingress object might not have a "application" label, so let's try to find the application by looking at the backend service and its pods
    """
    paths = rule.get("http", {}).get("paths", [])
    selectors = []
    for path in paths:
        service_name = path.get("backend", {}).get("serviceName")
        if service_name:
            try:
                service = Service.objects(client, namespace=ingress.namespace).get(
                    name=service_name
                )
            except ObjectDoesNotExist:
                logger.debug(
                    f"Referenced service does not exist: {ingress.namespace}/{service_name}"
                )
            else:
                selector = service.obj["spec"].get("selector", {})
                selectors.append(selector)
                application = get_application_from_labels(selector)
                if application:
                    return application
    # we still haven't found the application, let's look up pods by label selectors
    for selector in selectors:
        application_candidates = set()
        for pod in Pod.objects(client).filter(
            namespace=ingress.namespace, selector=selector
        ):
            application = get_application_from_labels(pod.labels)
            if application:
                application_candidates.add(application)

        if len(application_candidates) == 1:
            return application_candidates.pop()
    return ""
コード例 #15
0
ファイル: handlers.py プロジェクト: paguos/fog-rollouts
def update(body, meta, spec, status, **kwargs):

    api = K8SApi.from_env()
    logger.info(f"Updating fog rollout {meta['name']} ...")

    deployment_data = create_deployment_data(meta, spec)
    kopf.adopt(deployment_data)
    deployment = Deployment(api, deployment_data)

    if deployment.exists():
        logger.info(f"Updating deployment {deployment.name} ...")
        deployment.update()
        logger.info(f"Updating deployment {deployment.name} ... done!")
    else:
        logger.warning(f"Deployment {deployment.name} doesn't exist")
        logger.info(f"Creating deployment {deployment.name} ...")
        deployment.create()
        logger.info(f"Creating deployment {deployment.name} ... done!")

    service_data = create_service_data(meta, spec)
    kopf.adopt(service_data)

    service = Service(api, service_data)

    if service.exists():
        logger.info(f"Updating service {service.name} ...")
        service.update()
        logger.info(f"Updating service {service.name} ... done!")
    else:
        logger.warning(f"Service {service.name} doesn't exist")
        logger.info(f"Creating service {service.name} ...")
        service.create()
        logger.info(f"Creating service {service.name} ... done!")

    logger.info(f"Updating fog rollout {meta['name']} ... done!")
    api.session.close()
    return {'job1-status': 100}