コード例 #1
0
"""
pygluu.kubernetes.terminal.sql
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for jackrabbit terminal prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import click

from pygluu.kubernetes.helpers import get_logger, prompt_password

logger = get_logger("gluu-prompt-sql")


class PromptSQL:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """
    def __init__(self, settings):
        self.settings = settings

    def prompt_sql(self):
        """Prompts for SQL server
        """
        sql_dialect = {
            1: "mysql",
            2: "pgsql",
        }

        if self.settings.get(
コード例 #2
0
 https://www.apache.org/licenses/LICENSE-2.0
 Generate certificate authority cert,  key and chain cert and key signed by CA generated.
"""

import datetime
import OpenSSL.crypto
import OpenSSL.SSL
from pygluu.kubernetes.helpers import get_logger
from cryptography import x509
from cryptography.x509.oid import NameOID, ExtendedKeyUsageOID
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa

logger = get_logger("gluu-cert-manager  ")


def setup_crts(ca_common_name,
               cert_common_name,
               san_list,
               ca_cert_file="./ca.crt",
               ca_key_file="./ca.key",
               cert_file="./chain.pem",
               key_file="./pkey.key"):
    """
    Generate certificate authority cert,  key and chain cert and key signed by CA generated.

    :param ca_common_name:
    :param cert_common_name:
    :param san_list:
コード例 #3
0
"""
pygluu.kubernetes.redis
~~~~~~~~~~~~~~~~~~~~~~~

 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Handles Redis installation for testing.
"""

from pathlib import Path
from pygluu.kubernetes.yamlparser import Parser
from pygluu.kubernetes.helpers import get_logger, exec_cmd, analyze_storage_class
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.settings import SettingsHandler

logger = get_logger("gluu-redis         ")


class Redis(object):
    def __init__(self):
        self.settings = SettingsHandler()
        self.kubernetes = Kubernetes()
        self.timeout = 120
        if self.settings.get("DEPLOYMENT_ARCH") == "gke":
            user_account, stderr, retcode = exec_cmd(
                "gcloud config get-value core/account")
            user_account = str(user_account, "utf-8").strip()

            user, stderr, retcode = exec_cmd("whoami")
            user = str(user, "utf-8").strip()
            cluster_role_binding_name = "cluster-admin-{}".format(user)
コード例 #4
0
License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import contextlib
import json
import os
import sys
import shutil
import jsonschema
from dotty_dict import dotty
from pygluu.kubernetes.yamlparser import Parser
from pathlib import Path
from pygluu.kubernetes.helpers import get_logger

logger = get_logger("gluu-values-yaml    ")


def unlink_values_yaml():
    filename = Path("./helm/gluu/values.yaml")
    with contextlib.suppress(FileNotFoundError):
        os.unlink(filename)


class ValuesHandler(object):
    def __init__(self,
                 values_file="./helm/gluu/values.yaml",
                 values_schema_file="./helm/gluu/values.schema.json"):
        self.values_file = Path(values_file)
        self.values_schema = Path(values_schema_file)
        self.errors = list()
コード例 #5
0
~~~~~~~~~~~~~~~~~~~~~~~~~

 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
"""

import sys
import time

from kubernetes import client, utils, config
from kubernetes.stream import stream

from pygluu.kubernetes.helpers import get_logger, check_microk8s_kube_config_file, exec_cmd
from pygluu.kubernetes.yamlparser import Parser

logger = get_logger("gluu-kubernetes-api")


def load_kubernetes_config(mute=True):
    """
    Loads kubernetes in cluster or from file configuration
    :param mute:
    """
    config_loaded = False
    try:
        config.load_incluster_config()
        config_loaded = True
    except config.config_exception.ConfigException:
        if not mute:
            logger.warning(
                "Unable to load in-cluster configuration; trying to load from Kube config file"
コード例 #6
0
 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Handles Helm Gluu Chart
"""

from pathlib import Path
from pygluu.kubernetes.yamlparser import Parser
from pygluu.kubernetes.helpers import get_logger, exec_cmd
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.couchbase import Couchbase
from pygluu.kubernetes.settings import ValuesHandler
import time
import socket

logger = get_logger("gluu-helm          ")


class Gluu(object):
    def __init__(self):
        self.values_file = Path("./helm/gluu/override-values.yaml").resolve()
        self.upgrade_values_file = Path(
            "./helm/gluu-upgrade/values.yaml").resolve()
        self.settings = ValuesHandler()
        self.kubernetes = Kubernetes()
        self.ldap_backup_release_name = self.settings.get(
            "installer-settings.releaseName") + "-ldap-backup"
        if "gke" in self.settings.get(
                "installer-settings.volumeProvisionStrategy"):
            # Clusterrolebinding needs to be created for gke with CB installed
            if self.settings.get("config.configmap.cnCacheType") == "REDIS" or \
コード例 #7
0
~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with settings saved in a dictionary  for terminal and GUI installations.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import contextlib
import json
import os
import shutil
import jsonschema
from pathlib import Path
from pygluu.kubernetes.helpers import get_logger, update_settings_json_file

logger = get_logger("gluu-setting        ")


def unlink_settings_json():
    filename = Path("./settings.json")
    with contextlib.suppress(FileNotFoundError):
        os.unlink(filename)


class SettingsHandler(object):
    def __init__(self):
        self.setting_file = Path("./settings.json")
        self.setting_schema = Path("./settings_schema.json")
        self.errors = tuple()
        self.db = self.default_settings
        self.load()
コード例 #8
0
 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Handles  Postgres operations
"""

from pathlib import Path
from psycopg2 import connect, sql
from pygluu.kubernetes.yamlparser import Parser
from pygluu.kubernetes.helpers import get_logger, analyze_storage_class
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.settings import ValuesHandler
import time
import base64

logger = get_logger("gluu-postgres      ")


class Postgres(object):
    def __init__(self):
        self.settings = ValuesHandler()
        self.kubernetes = Kubernetes()
        self.timeout = 120

    @property
    def generate_postgres_init_sql(self):
        services_using_postgres = []
        if self.settings.get("installer-settings.jackrabbit.clusterMode"):
            services_using_postgres.append("JACKRABBIT")
        if self.settings.get("installer-settings.gluuGateway.install"):
            services_using_postgres.append("KONG")
コード例 #9
0
YAML parser.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""

from pathlib import Path
import contextlib
import os
from ruamel.yaml import YAML
from ruamel.yaml.comments import CommentedMap
from collections import OrderedDict, Mapping
from pygluu.kubernetes.helpers import get_logger

logger = get_logger("gluu-yaml-parser   ")


class Parser(dict):
    def __init__(self,
                 filename,
                 check_value=None,
                 check_value_name=None,
                 check_key='kind'):
        super().__init__()
        self.filename = Path(filename)
        self.yaml = YAML()
        self.yaml.preserve_quotes = True
        self.manifests_dict_list = []
        self.modify_dict = dict
        self.tmp_yaml_file = Path("./tmp.yaml")
コード例 #10
0
"""
 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Installs Gluu
"""
import argparse
import time
import sys
from pygluu.kubernetes.couchbase import Couchbase
from pygluu.kubernetes.terminal.prompt import Prompt
from pygluu.kubernetes.helpers import get_logger, copy_templates
from pygluu.kubernetes.helm import Helm
from pygluu.kubernetes.kustomize import Kustomize
from pygluu.kubernetes.settings import SettingsHandler

logger = get_logger("gluu-create        ")


def create_parser():
    """Create parser to handle arguments from CLI.
    :return:
    """
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(title="Commands", dest="subparser_name")
    subparsers.add_parser("generate-settings", help="Generate settings.json to install "
                                                    "Gluu Cloud Native Edition non-interactively")
    subparsers.add_parser("install", help="Install Gluu Cloud Native Edition")
    subparsers.add_parser("install-no-wait", help="Install Gluu Cloud Native Edition. "
                                                  "There will be no wait time between installing services. "
                                                  "Pods may look like they are restarting but they will "
                                                  "be waiting for hierarchy "
コード例 #11
0
"""
pygluu.kubernetes.terminal.license
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for terminal license prompt .

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
from pygluu.kubernetes.helpers import get_logger
import click

logger = get_logger("gluu-prompt-license")


class PromptLicense:
    def __init__(self, settings, accept_license=False):
        self.settings = settings
        if accept_license:
            self.settings.set("installer-settings", True)
        self.prompt_license()

    def prompt_license(self):
        """Prompts user to accept Apache 2.0 license
        """
        if not self.settings.get("installer-settings.acceptLicense"):
            with open("./LICENSE") as f:
                print(f.read())

            self.settings.set(
                "installer-settings.acceptLicense",
コード例 #12
0
"""
pygluu.kubernetes.terminal.istio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for istio terminal prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import click
from pygluu.kubernetes.helpers import get_logger
from pygluu.kubernetes.terminal.helpers import confirm_yesno

logger = get_logger("gluu-prompt-istio  ")


class PromptIstio:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """
    def __init__(self, settings):
        self.settings = settings
        self.enabled_services = self.settings.get("ENABLED_SERVICES_LIST")

    def prompt_istio(self):
        """Prompt for Istio
        """
        if not self.settings.get("USE_ISTIO_INGRESS") and self.settings.get(
                "DEPLOYMENT_ARCH") not in ("microk8s", "minikube"):
            self.settings.set(
                "USE_ISTIO_INGRESS",
                confirm_yesno("[Alpha] Would you like to use "
コード例 #13
0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Handles Gluu Gateway and Gluu Gateway UI
"""

from pathlib import Path
from pygluu.kubernetes.yamlparser import Parser
from pygluu.kubernetes.helpers import get_logger, exec_cmd
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.settings import SettingsHandler
from ast import literal_eval
import base64

logger = get_logger("gluu-gateway       ")


def register_op_client(namespace, client_name, op_host, client_api_url,
                       release_name):
    """Registers an op client using client_api.

    :param namespace:
    :param client_name:
    :param op_host:
    :param client_api_url:
    :param release_name:
    :return:
    """
    kubernetes = Kubernetes()
    logger.info("Registering a client : {}".format(client_name))
コード例 #14
0
"""
pygluu.kubernetes.terminal.jackrabbit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for jackrabbit terminal prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import click

from pygluu.kubernetes.helpers import get_logger, prompt_password
from pygluu.kubernetes.terminal.postgres import PromptPostgres

logger = get_logger("gluu-prompt-jackrabbit")


class PromptJackrabbit:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """

    def __init__(self, settings):
        self.settings = settings
        self.postgres = PromptPostgres(self.settings)

    def prompt_jackrabbit(self):
        """Prompts for Jackrabbit content repository
        """
        if self.settings.get("global.jackrabbit.enabled") in (None, ''):
            logger.info("Jackrabbit must be installed. If the following prompt is answered with N it is assumed "
                        "the jackrabbit content repository is either installed locally or remotely")
コード例 #15
0
import os
import sys
import traceback
import threading
import time
from pathlib import Path
from queue import Queue
from pygtail import Pygtail
from pygluu.kubernetes.couchbase import Couchbase
from pygluu.kubernetes.gluu import Gluu
from pygluu.kubernetes.helpers import get_logger
from .extensions import gluu_settings

logger = get_logger("gluu-gui        ")


class InstallHandler(object):
    def __init__(self, target, timeout=120):
        self.target = target
        self.timeout = timeout
        self.queue = Queue()
        self.thread = None
        self.event = threading.Event()

    @staticmethod
    def initialize():
        # remove setup log offset and set new offset
        log_offset = Path("./setup.log.offset")
        if log_offset.exists():
            os.unlink('./setup.log.offset')
        Pygtail("./setup.log", paranoid=True).readlines()
コード例 #16
0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for configuration terminal prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""

from pathlib import Path
import re
import json
import click

from pygluu.kubernetes.helpers import get_logger, prompt_password

logger = get_logger("gluu-prompt-config ")


class PromptConfiguration:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """

    def __init__(self, settings):
        self.settings = settings
        self.config_settings = {"hostname": "", "country_code": "", "state": "", "city": "", "admin_pw": "",
                                "ldap_pw": "", "email": "", "org_name": "", "redis_pw": ""}

    def prompt_config(self):
        """Prompts for generation of configuration layer
        """
        check_fqdn_provided = False
コード例 #17
0
"""
pygluu.kubernetes.terminal.aws
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for aws terminal prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import click

from pygluu.kubernetes.helpers import get_logger

logger = get_logger("gluu-prompt-aws    ")


class PromptAws:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """
    def __init__(self, settings):
        self.settings = settings

    def prompt_aws_lb(self):
        """Prompts for AWS Load balancer information
        """
        lb_map = {
            1: "clb",
            2: "nlb",
            3: "alb",
        }
コード例 #18
0
"""
pygluu.kubernetes.terminal.common
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers for terminal prompt classes

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""

import click
from pygluu.kubernetes.helpers import get_logger

logger = get_logger("gluu-prompt-common")


def gather_ip():
    """Attempts to detect and return ip automatically.
    Also set node names, zones, and addresses in a cloud deployment.

    :return:
    """
    from pygluu.kubernetes.kubeapi import Kubernetes
    from pygluu.kubernetes.settings import ValuesHandler
    import ipaddress
    kubernetes = Kubernetes()
    settings = ValuesHandler()
    logger.info(
        "Determining OS type and attempting to gather external IP address")
    ip = ""
コード例 #19
0
"""

from pathlib import Path
import shutil
import tarfile
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.yamlparser import Parser
from pygluu.kubernetes.helpers import get_logger, exec_cmd
from pygluu.kubernetes.settings import SettingsHandler
from pygluu.kubernetes.pycert import setup_crts
import sys
import base64
import random
import os

logger = get_logger("gluu-couchbase     ")


def extract_couchbase_tar(tar_file):
    """
    Extracts couchbase kubernetes tar file
    :param tar_file:
    """
    extract_folder = Path("./couchbase-source-folder")
    logger.info("Extracting {} in {} ".format(tar_file, extract_folder))
    tr = tarfile.open(tar_file)
    tr.extractall(path=extract_folder)
    tr.close()


def set_memory_for_buckets(memory_quota):
コード例 #20
0
"""
pygluu.kubernetes.kubedb
~~~~~~~~~~~~~~~~~~~~~~~~

 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Handles KubeDB
"""

from pathlib import Path
from pygluu.kubernetes.helpers import get_logger, exec_cmd
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.settings import SettingsHandler
import time

logger = get_logger("gluu-kubedb        ")


class Kubedb(object):
    def __init__(self):
        self.values_file = Path("./helm/gluu/values.yaml").resolve()
        self.upgrade_values_file = Path(
            "./helm/gluu-upgrade/values.yaml").resolve()
        self.settings = SettingsHandler()
        self.kubernetes = Kubernetes()
        self.ldap_backup_release_name = self.settings.get(
            'CN_HELM_RELEASE_NAME') + "-ldap-backup"
        if self.settings.get("DEPLOYMENT_ARCH") == "gke":
            # Clusterrolebinding needs to be created for gke with CB or kubeDB installed
            if self.settings.get("INSTALL_REDIS") == "Y" or \
                    self.settings.get("INSTALL_GLUU_GATEWAY") == "Y" or \
コード例 #21
0
"""
pygluu.kubernetes.terminal.testenv
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for terminal test environment prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import click
from pygluu.kubernetes.terminal.helpers import confirm_yesno
from pygluu.kubernetes.helpers import get_logger

logger = get_logger("gluu-prompt-test-env")


class PromptTestEnvironment:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """

    def __init__(self, settings):
        self.settings = settings

    def prompt_test_environment(self):
        """Prompts for test environment.
        """
        logger.info("A test environment means that the installer will strip all resource requirements, "
                    "and hence will use as much as needed only. The pods are subject to eviction. Please use "
                    " at least 8GB Ram , 4 CPU, and 50 GB disk.")
        self.settings.set("TEST_ENVIRONMENT", confirm_yesno("Is this a test environment."))
コード例 #22
0
"""
pygluu.kubernetes.terminal.redis
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for terminal redis prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""
import click

from pygluu.kubernetes.helpers import get_logger, prompt_password

logger = get_logger("gluu-prompt-redis  ")


class PromptRedis:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """

    def __init__(self, settings):
        self.settings = settings

    def prompt_redis(self):
        """Prompts for Redis
        """
        if self.settings.get("config.configmap.cnRedisType") in (None, ''):
            logger.info("STANDALONE, CLUSTER")
            self.settings.set("config.configmap.cnRedisType", click.prompt("Please enter redis type", default="CLUSTER"))

        if self.settings.get("installer-settings.redis.install"):
コード例 #23
0
License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""

from pathlib import Path
import shutil
import base64

import click
from pygluu.kubernetes.helpers import get_logger, prompt_password
from pygluu.kubernetes.terminal.backup import PromptBackup
from pygluu.kubernetes.terminal.architecture import PromptArch
from pygluu.kubernetes.terminal.helpers import confirm_yesno, gather_ip
from pygluu.kubernetes.terminal.namespace import PromptNamespace
logger = get_logger("gluu-prompt-couchbase")


class PromptCouchbase:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """
    def __init__(self, settings):
        self.settings = settings
        self.backup = PromptBackup(self.settings)
        self.arch = PromptArch(self.settings)
        self.namespace = PromptNamespace(self.settings)

    def prompt_couchbase(self):
        self.arch.prompt_arch()
        self.namespace.prompt_gluu_namespace()
コード例 #24
0
"""
pygluu.kubernetes.terminal.volumes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module contains helpers to interact with user's inputs for volume terminal prompts.

License terms and conditions for Gluu Cloud Native Edition:
https://www.apache.org/licenses/LICENSE-2.0
"""

import click

from pygluu.kubernetes.helpers import get_logger

logger = get_logger("gluu-prompt-volumes")


class PromptVolumes:
    """Prompt is used for prompting users for input used in deploying Gluu.
    """
    def __init__(self, settings):
        self.settings = settings

    def prompt_app_volume_type(self):
        """Prompts for volume type
        """
        gluu_volume_map = {
            1: "microk8sDynamic",
            2: "minikubeDynamic",
            6: "awsOpenEbsHostPathDynamic",
            7: "awsEbsDynamic",
コード例 #25
0
"""
pygluu.kubernetes.mysql
~~~~~~~~~~~~~~~~~~~~~~~
 License terms and conditions for Gluu Cloud Native Edition:
 https://www.apache.org/licenses/LICENSE-2.0
 Handles  MySQL operations
"""

from pygluu.kubernetes.helpers import get_logger, exec_cmd
from pygluu.kubernetes.kubeapi import Kubernetes
from pygluu.kubernetes.settings import ValuesHandler

logger = get_logger("gluu-mysql         ")


class MySQL(object):
    def __init__(self):
        self.settings = ValuesHandler()
        self.kubernetes = Kubernetes()
        self.timeout = 120

    def install_mysql(self):
        self.uninstall_mysql()
        self.kubernetes.create_namespace(
            name=self.settings.get("installer-settings.sql.namespace"),
            labels={"app": "mysql"})

        exec_cmd("helm repo add bitnami https://charts.bitnami.com/bitnami")
        exec_cmd("helm repo update")
        exec_cmd("helm install {} bitnami/mysql "
                 "--set auth.rootPassword={} "