Beispiel #1
0
    def __init__(self, knative_config):
        self.log_level = os.getenv('PYWREN_LOGLEVEL')
        self.name = 'knative'
        self.knative_config = knative_config
        self.endpoint = self.knative_config.get('endpoint')
        self.service_hosts = {}

        # k8s config can be incluster, in ~/.kube/config or generate kube-config.yaml file and
        # set env variable KUBECONFIG=<path-to-kube-confg>
        try:
            config.load_kube_config()
            current_context = config.list_kube_config_contexts()[1].get('context')
            self.namespace = current_context.get('namespace', 'default')
            self.cluster = current_context.get('cluster')
        except Exception:
            config.load_incluster_config()
            self.namespace = 'default'
            self.cluster = 'default'

        self.api = client.CustomObjectsApi()
        self.v1 = client.CoreV1Api()

        self.headers = {'content-type': 'application/json'}

        if self.endpoint is None:
            try:
                ingress = self.v1.read_namespaced_service('istio-ingressgateway', 'istio-system')
                http_port = list(filter(lambda port: port.port == 80, ingress.spec.ports))[0].node_port
                https_port = list(filter(lambda port: port.port == 443, ingress.spec.ports))[0].node_port

                if ingress.status.load_balancer.ingress is not None:
                    # get loadbalancer ip
                    ip = ingress.status.load_balancer.ingress[0].ip
                else:
                    # for minikube or a baremetal cluster that has no external load balancer
                    node = self.v1.list_node()
                    ip = node.items[0].status.addresses[0].address

                self.endpoint = 'http://{}:{}'.format(ip, http_port)

            except Exception as e:
                log_msg = "Something went wrong getting the istio-ingressgateway endpoint: {}".format(e)
                logger.info(log_msg)

        self.serice_host_filename = os.path.join(CACHE_DIR, 'knative', self.cluster, 'service_host')
        self.service_host_suffix = None
        if os.path.exists(self.serice_host_filename):
            serice_host_data = load_yaml_config(self.serice_host_filename)
            self.service_host_suffix = serice_host_data['service_host_suffix']
            logger.debug('Loaded service host suffix: {}'.format(self.service_host_suffix))

        log_msg = 'PyWren v{} init for Knative - Endpoint: {}'.format(__version__, self.endpoint)
        if not self.log_level:
            print(log_msg)
        logger.info(log_msg)
Beispiel #2
0
    def __init__(self, knative_config):
        self.log_level = os.getenv('CB_LOG_LEVEL')
        self.name = 'knative'
        self.knative_config = knative_config
        self.endpoint = self.knative_config.get('endpoint')
        self.service_hosts = {}

        # k8s config can be in ~/.kube/config or generate kube-config.yml file and
        # set env variable KUBECONFIG=<path-to-kube-confg>
        config.load_kube_config()
        self.api = client.CustomObjectsApi()
        self.v1 = client.CoreV1Api()

        self.headers = {'content-type': 'application/json'}

        if self.endpoint is None:
            try:
                ingress = self.v1.read_namespaced_service('istio-ingressgateway', 'istio-system')
                http_port = list(filter(lambda port: port.port == 80, ingress.spec.ports))[0].node_port
                https_port = list(filter(lambda port: port.port == 443, ingress.spec.ports))[0].node_port

                if ingress.status.load_balancer.ingress is not None:
                    # get loadbalancer ip
                    ip = ingress.status.load_balancer.ingress[0].ip
                else:
                    # for minikube or a baremetal cluster that has no external load balancer
                    node = self.v1.list_node()
                    ip = node.items[0].status.addresses[0].address

                self.endpoint = 'http://{}:{}'.format(ip, http_port)

            except Exception as e:
                raise Exception("Something went wrong getting the istio-ingressgateway endpoint: {}".format(e))

        log_msg = 'PyWren v{} init for Knative Serving - Endpoint: {}'.format(__version__, self.endpoint)
        logger.info(log_msg)
        if not self.log_level:
            print(log_msg)
        logger.debug('Knative Serving init for endpoint: {}'.format(self.endpoint))
Beispiel #3
0
    def __init__(self, knative_config, storage_config):
        self.log_active = logger.getEffectiveLevel() != logging.WARNING
        self.name = 'knative'
        self.knative_config = knative_config
        self.istio_endpoint = self.knative_config.get('istio_endpoint')

        # k8s config can be incluster, in ~/.kube/config or generate kube-config.yaml file and
        # set env variable KUBECONFIG=<path-to-kube-confg>
        try:
            config.load_kube_config()
            current_context = config.list_kube_config_contexts()[1].get(
                'context')
            self.namespace = current_context.get('namespace', 'default')
            self.cluster = current_context.get('cluster')
            self.knative_config['namespace'] = self.namespace
            self.knative_config['cluster'] = self.cluster
            self.is_incluster = False
        except Exception:
            config.load_incluster_config()
            self.namespace = self.knative_config.get('namespace', 'default')
            self.cluster = self.knative_config.get('cluster', 'default')
            self.is_incluster = True

        self.api = client.CustomObjectsApi()
        self.v1 = client.CoreV1Api()

        if self.istio_endpoint is None:
            try:
                ingress = self.v1.read_namespaced_service(
                    'istio-ingressgateway', 'istio-system')
                http_port = list(
                    filter(lambda port: port.port == 80,
                           ingress.spec.ports))[0].node_port
                # https_port = list(filter(lambda port: port.port == 443, ingress.spec.ports))[0].node_port

                if ingress.status.load_balancer.ingress is not None:
                    # get loadbalancer ip
                    ip = ingress.status.load_balancer.ingress[0].ip
                else:
                    # for minikube or a baremetal cluster that has no external load balancer
                    node = self.v1.list_node()
                    ip = node.items[0].status.addresses[0].address

                self.istio_endpoint = 'http://{}:{}'.format(ip, http_port)
                self.knative_config['istio_endpoint'] = self.istio_endpoint
            except Exception:
                logger.info("istio-ingressgateway endpoint not found")

        if 'service_host_suffix' not in self.knative_config:
            self.serice_host_filename = os.path.join(CACHE_DIR, 'knative',
                                                     self.cluster,
                                                     'service_host')
            self.service_host_suffix = None
            if os.path.exists(self.serice_host_filename):
                serice_host_data = load_yaml_config(self.serice_host_filename)
                self.service_host_suffix = serice_host_data[
                    'service_host_suffix']
                self.knative_config[
                    'service_host_suffix'] = self.service_host_suffix
        else:
            self.service_host_suffix = self.knative_config[
                'service_host_suffix']

        logger.debug('Loaded service host suffix: {}'.format(
            self.service_host_suffix))

        if self.istio_endpoint:
            log_msg = 'Lithops v{} init for Knative - Istio Endpoint: {}'.format(
                __version__, self.istio_endpoint)
        else:
            log_msg = 'Lithops v{} init for Knative'.format(__version__)
        if not self.log_active:
            print(log_msg)
        logger.info(log_msg)
Beispiel #4
0
    def __init__(self, knative_config, storage_config):
        self.name = 'knative'
        self.knative_config = knative_config
        self.istio_endpoint = self.knative_config.get('istio_endpoint')
        self.kubecfg_path = self.knative_config.get('kubecfg_path')

        # k8s config can be incluster, in ~/.kube/config or generate kube-config.yaml file and
        # set env variable KUBECONFIG=<path-to-kube-confg>
        try:
            config.load_kube_config(config_file=self.kubecfg_path)
            contexts = config.list_kube_config_contexts(
                config_file=self.kubecfg_path)
            current_context = contexts[1].get('context')
            self.namespace = current_context.get('namespace', 'default')
            self.cluster = current_context.get('cluster')
            self.knative_config['namespace'] = self.namespace
            self.knative_config['cluster'] = self.cluster
            self.is_incluster = False
        except Exception:
            config.load_incluster_config()
            self.namespace = self.knative_config.get('namespace', 'default')
            self.cluster = self.knative_config.get('cluster', 'default')
            self.is_incluster = True

        logger.debug("Set namespace to {}".format(self.namespace))
        logger.debug("Set cluster to {}".format(self.cluster))

        self.api = client.CustomObjectsApi()
        self.v1 = client.CoreV1Api()

        if self.istio_endpoint is None:
            try:
                ingress = self.v1.read_namespaced_service(
                    'istio-ingressgateway', 'istio-system')
                http_port = list(
                    filter(lambda port: port.port == 80,
                           ingress.spec.ports))[0].node_port
                # https_port = list(filter(lambda port: port.port == 443, ingress.spec.ports))[0].node_port

                if ingress.status.load_balancer.ingress is not None:
                    # get loadbalancer ip
                    ip = ingress.status.load_balancer.ingress[0].ip
                else:
                    # for minikube or a baremetal cluster that has no external load balancer
                    node = self.v1.list_node()
                    ip = node.items[0].status.addresses[0].address

                if ip and http_port:
                    self.istio_endpoint = 'http://{}:{}'.format(ip, http_port)
                    self.knative_config['istio_endpoint'] = self.istio_endpoint
            except Exception:
                pass

        if 'service_host_suffix' not in self.knative_config:
            self.serice_host_filename = os.path.join(CACHE_DIR, 'knative',
                                                     self.cluster,
                                                     'service_host')
            self.service_host_suffix = None
            if os.path.exists(self.serice_host_filename):
                serice_host_data = load_yaml_config(self.serice_host_filename)
                self.service_host_suffix = serice_host_data[
                    'service_host_suffix']
                self.knative_config[
                    'service_host_suffix'] = self.service_host_suffix
        else:
            self.service_host_suffix = self.knative_config[
                'service_host_suffix']

        logger.debug('Loaded service host suffix: {}'.format(
            self.service_host_suffix))

        msg = COMPUTE_CLI_MSG.format('Knative')
        if self.istio_endpoint:
            msg += ' - Istio Endpoint: {}'.format(self.istio_endpoint)
        elif self.cluster:
            msg += ' - Cluster: {}'.format(self.cluster)
        logger.info("{}".format(msg))
Beispiel #5
0
    def __init__(self, knative_config):
        self.log_level = os.getenv('PYWREN_LOG_LEVEL')
        self.name = 'knative'
        self.knative_config = knative_config
        self.endpoint = self.knative_config.get('endpoint')
        self.serving_host = self.knative_config.get('host')
        self.service_name = self.knative_config.get('service_name')
        # generate kube-config.yml file and set env variable KUBECONFIG=<path-to-kube-confg>
        config.load_kube_config()
        self.api = client.CustomObjectsApi()
        self.v1 = client.CoreV1Api()
        try:
            ingress = self.v1.read_namespaced_service('istio-ingressgateway',
                                                      'istio-system')
            if ingress.status.load_balancer.ingress is not None:
                # get loadbalancer ip
                self.endpoint = ingress.status.load_balancer.ingress[0].ip
            else:
                # for minikube or a baremetal cluster that has no external load balancer
                node = self.v1.list_node()
                node_port = list(
                    filter(lambda port: port.port == 80,
                           ingress.spec.ports))[0].node_port
                self.endpoint = node.items[0].status.addresses[
                    0].address + ":" + str(node_port)
        except ApiException as e:
            print("Exception when calling read_namespaced_service")

        print(self.endpoint)
        service_name = self._format_action_name(
            self.knative_config['service_name'])

        #basically for the domain host - but if endpoint still None then read it from the ksvc resource
        if self.endpoint is None or self.serving_host is None:
            try:
                pywren_svc = self.api.get_namespaced_custom_object(
                    group="serving.knative.dev",
                    version="v1alpha1",
                    name=service_name,
                    namespace="default",
                    plural="services")
                if pywren_svc is not None:
                    svc_url = pywren_svc['status']['url']
                    if self.endpoint is None:
                        self.endpoint = svc_url[7:]
                    if self.serving_host is None:
                        self.serving_host = svc_url[7:]
            except Exception as e:
                if json.loads(e.body)['code'] == 404:
                    log_msg = 'ksvc resource: {} Not Found'.format(
                        service_name)
                    logger.debug(log_msg)

        self.headers = {
            'content-type': 'application/json',
            'Host': self.serving_host
        }

        log_msg = 'PyWren v{} init for Knative Serving - IP: {} - Service: {}'.format(
            __version__, self.endpoint, self.serving_host)
        logger.info(log_msg)
        if not self.log_level:
            print(log_msg)
        logger.debug('Knative init for host: {}'.format(self.endpoint))
        logger.debug('Knative init for service: {}'.format(self.endpoint))