예제 #1
0
 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."))
예제 #2
0
 def prompt_couchbase_multi_cluster(self):
     """Prompts for couchbase multi cluster
     """
     print(
         "|------------------------------------------------------------------|"
     )
     print(
         "|         Is this a multi-cloud/region setup[N] ? [Y/N]            |"
     )
     print(
         "|------------------------------------------------------------------|"
     )
     print(
         "|                             Notes                                |"
     )
     print(
         "|------------------------------------------------------------------|"
     )
     print(
         "If you are planning for a multi-cloud/region setup and this is the first cluster answer N or"
         " leave blank. You will answer Y for the second and more cluster setup   "
     )
     print(
         "|------------------------------------------------------------------|"
     )
     self.settings.set("DEPLOY_MULTI_CLUSTER",
                       confirm_yesno("Is this a multi-cloud/region setup"))
예제 #3
0
    def prompt_override_couchbase_files(self):
        if not self.settings.get("COUCHBASE_CLUSTER_FILE_OVERRIDE"):
            self.settings.set(
                "COUCHBASE_CLUSTER_FILE_OVERRIDE",
                confirm_yesno(
                    "Override couchbase-cluster.yaml with a custom couchbase-cluster.yaml",
                ))

        if self.settings.get("COUCHBASE_CLUSTER_FILE_OVERRIDE") == "Y":
            try:
                shutil.copy(Path("./couchbase-cluster.yaml"),
                            Path("./couchbase/couchbase-cluster.yaml"))
                shutil.copy(Path("./couchbase-buckets.yaml"),
                            Path("./couchbase/couchbase-buckets.yaml"))
                shutil.copy(
                    Path("./couchbase-ephemeral-buckets.yaml"),
                    Path("./couchbase/couchbase-ephemeral-buckets.yaml"))

            except FileNotFoundError:
                logger.error(
                    "An override option has been chosen but there is a missing couchbase file that "
                    "could not be found at the current path. Please place the override files under the name"
                    " couchbase-cluster.yaml, couchbase-buckets.yaml, and couchbase-ephemeral-buckets.yaml"
                    " in the same directory pygluu-kubernetes.pyz exists ")
                raise SystemExit(1)
예제 #4
0
    def prompt_image_name_tag(self):
        """Manual prompts for image names and tags if changed from default or at a different repository.
        """

        def prompt_and_set_setting(service, image_name_key, image_tag_key):
            self.settings.set(image_name_key,
                              click.prompt(f"{service} image name", default=self.settings.get(image_name_key)))
            self.settings.set(image_tag_key,
                              click.prompt(f"{service} image tag", default=self.settings.get(image_tag_key)))

        if not self.settings.get("EDIT_IMAGE_NAMES_TAGS"):
            self.settings.set("EDIT_IMAGE_NAMES_TAGS", confirm_yesno(
                "Would you like to manually edit the image source/name and tag"))

        if self.settings.get("EDIT_IMAGE_NAMES_TAGS") == "Y":
            # CASA
            if self.settings.get("ENABLE_CASA") == "Y":
                prompt_and_set_setting("Casa", "CASA_IMAGE_NAME", "CASA_IMAGE_TAG")
            # CONFIG
            prompt_and_set_setting("Config", "CONFIG_IMAGE_NAME", "CONFIG_IMAGE_TAG")
            # CACHE_REFRESH_ROTATE
            if self.settings.get("ENABLE_CACHE_REFRESH") == "Y":
                prompt_and_set_setting("CR-rotate", "CACHE_REFRESH_ROTATE_IMAGE_NAME", "CACHE_REFRESH_ROTATE_IMAGE_TAG")
            # KEY_ROTATE
            if self.settings.get("ENABLE_AUTH_SERVER_KEY_ROTATE") == "Y":
                prompt_and_set_setting("Key rotate", "CERT_MANAGER_IMAGE_NAME", "CERT_MANAGER_IMAGE_TAG")
            # LDAP
            if self.settings.get("PERSISTENCE_BACKEND") == "hybrid" or \
                    self.settings.get("PERSISTENCE_BACKEND") == "ldap":
                prompt_and_set_setting("OpenDJ", "LDAP_IMAGE_NAME", "LDAP_IMAGE_TAG")
            # Jackrabbit
            prompt_and_set_setting("jackrabbit", "JACKRABBIT_IMAGE_NAME", "JACKRABBIT_IMAGE_TAG")
            # AUTH_SERVER
            prompt_and_set_setting("Auth-Server", "AUTH_SERVER_IMAGE_NAME", "AUTH_SERVER_IMAGE_TAG")
            # CLIENT_API
            if self.settings.get("ENABLE_CLIENT_API") == "Y":
                prompt_and_set_setting("CLIENT_API server", "CLIENT_API_IMAGE_NAME", "CLIENT_API_IMAGE_TAG")
            # OXPASSPORT
            if self.settings.get("ENABLE_OXPASSPORT") == "Y":
                prompt_and_set_setting("oxPassport", "OXPASSPORT_IMAGE_NAME", "OXPASSPORT_IMAGE_TAG")
            # OXSHIBBBOLETH
            if self.settings.get("ENABLE_OXSHIBBOLETH") == "Y":
                prompt_and_set_setting("oxShibboleth", "OXSHIBBOLETH_IMAGE_NAME", "OXSHIBBOLETH_IMAGE_TAG")
            # OXTRUST
            prompt_and_set_setting("oxTrust", "OXTRUST_IMAGE_NAME", "OXTRUST_IMAGE_TAG")
            # PERSISTENCE
            prompt_and_set_setting("Persistence", "PERSISTENCE_IMAGE_NAME", "PERSISTENCE_IMAGE_TAG")
            # RADIUS
            if self.settings.get("ENABLE_RADIUS") == "Y":
                prompt_and_set_setting("Radius", "RADIUS_IMAGE_NAME", "RADIUS_IMAGE_TAG")
            # Gluu-Gateway
            if self.settings.get("INSTALL_GLUU_GATEWAY") == "Y":
                prompt_and_set_setting("Gluu-Gateway", "GLUU_GATEWAY_IMAGE_NAME", "GLUU_GATEWAY_IMAGE_TAG")
                # Gluu-Gateway-UI
                prompt_and_set_setting("Gluu-Gateway-UI", "GLUU_GATEWAY_UI_IMAGE_NAME", "GLUU_GATEWAY_UI_IMAGE_TAG")
            self.settings.set("EDIT_IMAGE_NAMES_TAGS", "N")
예제 #5
0
    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 "
                              "Istio Ingress with Gluu ?"))
        if self.settings.get("USE_ISTIO_INGRESS") == "Y":
            self.settings.set("USE_ISTIO", "Y")

        if not self.settings.get("USE_ISTIO"):
            logger.info(
                "Please follow https://istio.io/latest/docs/ to learn more.")
            logger.info(
                "Istio will auto inject side cars into all pods in Gluus namespace chosen. "
                "The label istio-injection=enabled will be added to the namespace Gluu will be installed in "
                "if the namespace does not exist. If it does please run "
                "kubectl label namespace <namespace> istio-injection=enabled")
            self.settings.set(
                "USE_ISTIO",
                confirm_yesno(
                    "[Alpha] Would you like to use Istio with Gluu ?"))

        if not self.settings.get("ISTIO_SYSTEM_NAMESPACE"
                                 ) and self.settings.get("USE_ISTIO") == "Y":
            self.settings.set(
                "ISTIO_SYSTEM_NAMESPACE",
                click.prompt("Istio namespace", default="istio-system"))
        if self.settings.get("USE_ISTIO_INGRESS") == "Y":
            self.enabled_services.append("cn-istio-ingress")
            self.settings.set("ENABLED_SERVICES_LIST", self.enabled_services)

            if not self.settings.get("LB_ADD"):
                self.settings.set(
                    "LB_ADD",
                    click.prompt(
                        "Istio loadbalancer adderss(eks) or "
                        "ip (gke, aks, digital ocean, local)",
                        default=""))
예제 #6
0
    def prompt_license(self):
        """Prompts user to accept Apache 2.0 license
        """
        if self.settings.get("ACCEPT_CN_LICENSE") != "Y":
            with open("./LICENSE") as f:
                print(f.read())

            self.settings.set(
                "ACCEPT_CN_LICENSE",
                confirm_yesno("Do you accept the Gluu license stated above"))
            if self.settings.get("ACCEPT_CN_LICENSE") != "Y":
                logger.info("License not accepted.")
                raise SystemExit(1)
예제 #7
0
    def prompt_redis(self):
        """Prompts for Redis
        """
        if not self.settings.get("REDIS_TYPE"):
            logger.info("STANDALONE, CLUSTER")
            self.settings.set("REDIS_TYPE", click.prompt("Please enter redis type", default="CLUSTER"))

        if not self.settings.get("INSTALL_REDIS"):
            logger.info("For the following prompt if placed [N] the Redis is assumed to be"
                        " installed or remotely provisioned")
            self.settings.set("INSTALL_REDIS", confirm_yesno("Install Redis", default=True))

        if self.settings.get("INSTALL_REDIS") == "Y":
            if not self.settings.get("REDIS_MASTER_NODES"):
                self.settings.set("REDIS_MASTER_NODES",
                                  click.prompt("The number of master node. Minimum is 3", default=3))

            if not self.settings.get("REDIS_NODES_PER_MASTER"):
                self.settings.set("REDIS_NODES_PER_MASTER", click.prompt("The number of nodes per master node",
                                                                         default=2))

            if not self.settings.get("REDIS_NAMESPACE"):
                self.settings.set("REDIS_NAMESPACE", click.prompt("Please enter a namespace for Redis cluster",
                                                                  default="gluu-redis-cluster"))
        else:
            # Placing password in kubedb is currently not supported. # Todo: Remove else once supported
            if not self.settings.get("REDIS_PW"):
                self.settings.set("REDIS_PW", prompt_password("Redis"))

        if not self.settings.get("REDIS_URL"):
            if self.settings.get("INSTALL_REDIS") == "Y":
                redis_url_prompt = "redis-cluster.{}.svc.cluster.local:6379".format(
                    self.settings.get("REDIS_NAMESPACE"))
            else:
                logger.info(
                    "Redis URL can be : redis-cluster.gluu-redis-cluster.svc.cluster.local:6379 in a redis deployment")
                logger.info("Redis URL using AWS ElastiCach [Configuration Endpoint]: "
                            "clustercfg.testing-redis.icrbdv.euc1.cache.amazonaws.com:6379")
                logger.info("Redis URL using Google MemoryStore : <ip>:6379")
                redis_url_prompt = click.prompt(
                    "Please enter redis URL. If you are deploying redis",
                    default="redis-cluster.gluu-redis-cluster.svc.cluster.local:6379",
                )
            self.settings.set("REDIS_URL", redis_url_prompt)
예제 #8
0
    def prompt_couchbase(self):
        self.arch.prompt_arch()
        self.namespace.prompt_gluu_namespace()

        if self.settings.get("DEPLOYMENT_ARCH") not in ("microk8s",
                                                        "minikube"):
            self.backup.prompt_backup()

        if not self.settings.get("HOST_EXT_IP"):
            ip = gather_ip
            self.settings.set("HOST_EXT_IP", ip)

        if not self.settings.get("INSTALL_COUCHBASE"):
            logger.info(
                "For the following prompt  if placed [N] the couchbase is assumed to be"
                " installed or remotely provisioned")
            self.settings.set("INSTALL_COUCHBASE",
                              confirm_yesno("Install Couchbase", default=True))

        if self.settings.get("INSTALL_COUCHBASE") == "N":
            if not self.settings.get("COUCHBASE_CRT"):
                print(
                    "Place the Couchbase certificate authority certificate in a file called couchbase.crt at "
                    "the same location as the installation script.")
                print(
                    "This can also be found in your couchbase UI Security > Root Certificate"
                )
                _ = input("Hit 'enter' or 'return' when ready.")
                with open(Path("./couchbase.crt")) as content_file:
                    ca_crt = content_file.read()
                    encoded_ca_crt_bytes = base64.b64encode(
                        ca_crt.encode("utf-8"))
                    encoded_ca_crt_string = str(encoded_ca_crt_bytes, "utf-8")
                self.settings.set("COUCHBASE_CRT", encoded_ca_crt_string)
        else:
            self.settings.set("COUCHBASE_CRT", "")

        self.prompt_override_couchbase_files()

        if self.settings.get("DEPLOYMENT_ARCH") in ("microk8s", "minikube"):
            self.settings.set("COUCHBASE_USE_LOW_RESOURCES", "Y")

        if not self.settings.get("COUCHBASE_USE_LOW_RESOURCES"):
            self.settings.set(
                "COUCHBASE_USE_LOW_RESOURCES",
                confirm_yesno(
                    "Setup CB nodes using low resources for demo purposes"))

        if self.settings.get("COUCHBASE_USE_LOW_RESOURCES") == "N" and \
                self.settings.get("COUCHBASE_CLUSTER_FILE_OVERRIDE") == "N" and \
                self.settings.get("INSTALL_COUCHBASE") == "Y":
            self.prompt_couchbase_calculator()

        if not self.settings.get("COUCHBASE_NAMESPACE"):
            self.settings.set(
                "COUCHBASE_NAMESPACE",
                click.prompt("Please enter a namespace for CB objects.",
                             default="cbns"))

        if not self.settings.get("COUCHBASE_CLUSTER_NAME"):
            self.settings.set(
                "COUCHBASE_CLUSTER_NAME",
                click.prompt("Please enter a cluster name.", default="cbgluu"))

        if not self.settings.get("COUCHBASE_URL"):
            self.settings.set(
                "COUCHBASE_URL",
                click.prompt(
                    "Please enter  couchbase (remote or local) URL base name",
                    default=
                    f"{self.settings.get('COUCHBASE_CLUSTER_NAME')}.{self.settings.get('COUCHBASE_NAMESPACE')}.svc"
                    f".cluster.local",
                ))

        if not self.settings.get("COUCHBASE_INDEX_NUM_REPLICA"):
            self.settings.set(
                "COUCHBASE_INDEX_NUM_REPLICA",
                click.prompt(
                    "Please enter the number of replicas per index created. "
                    "Please note that the number of index nodes must be one greater than the number of replicas. "
                    "That means if your couchbase cluster only has 2 "
                    "index nodes you cannot place the number of replicas to be higher than 1.",
                    default="0",
                ))

        if not self.settings.get("COUCHBASE_SUPERUSER"):
            self.settings.set(
                "COUCHBASE_SUPERUSER",
                click.prompt("Please enter couchbase superuser username.",
                             default="admin"))

        if not self.settings.get("COUCHBASE_SUPERUSER_PASSWORD"):
            self.settings.set("COUCHBASE_SUPERUSER_PASSWORD",
                              prompt_password("Couchbase superuser"))

        if not self.settings.get("COUCHBASE_USER"):
            self.settings.set(
                "COUCHBASE_USER",
                click.prompt("Please enter gluu couchbase username.",
                             default="gluu"))

        if not self.settings.get("COUCHBASE_PASSWORD"):
            self.settings.set("COUCHBASE_PASSWORD",
                              prompt_password("Couchbase Gluu user"))

        self.find_couchbase_certs_or_set_san_cn()
예제 #9
0
    def prompt_couchbase_calculator(self):
        """Attempt to Calculate resources needed
        """
        if not self.settings.get("NUMBER_OF_EXPECTED_USERS"):
            self.settings.set(
                "NUMBER_OF_EXPECTED_USERS",
                click.prompt(
                    "Please enter the number of expected users "
                    "[alpha]",
                    default="1000000"))

        if not self.settings.get(
                "USING_RESOURCE_OWNER_PASSWORD_CRED_GRANT_FLOW"):
            self.settings.set(
                "USING_RESOURCE_OWNER_PASSWORD_CRED_GRANT_FLOW",
                confirm_yesno(
                    "Will you be using the resource owner password credential grant flow [alpha]",
                    default=True,
                ))

        if not self.settings.get("USING_CODE_FLOW"):
            self.settings.set(
                "USING_CODE_FLOW",
                confirm_yesno("Will you be using the code flow [alpha]",
                              default=True))

        if not self.settings.get("USING_SCIM_FLOW"):
            self.settings.set(
                "USING_SCIM_FLOW",
                confirm_yesno("Will you be using the SCIM flow [alpha]",
                              default=True))

        if not self.settings.get("EXPECTED_TRANSACTIONS_PER_SEC"):
            self.settings.set(
                "EXPECTED_TRANSACTIONS_PER_SEC",
                click.prompt("Expected transactions per second [alpha]",
                             default=2000))

        # couchbase-cluster.yaml specs
        if not self.settings.get("COUCHBASE_DATA_NODES"):
            self.settings.set(
                "COUCHBASE_DATA_NODES",
                click.prompt(
                    "Please enter the number of data nodes. [alpha] (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_INDEX_NODES"):
            self.settings.set(
                "COUCHBASE_INDEX_NODES",
                click.prompt(
                    "Please enter the number of index nodes. [alpha] (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_QUERY_NODES"):
            self.settings.set(
                "COUCHBASE_QUERY_NODES",
                click.prompt(
                    "Please enter the number of query nodes. [alpha] (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_SEARCH_EVENTING_ANALYTICS_NODES"):
            self.settings.set(
                "COUCHBASE_SEARCH_EVENTING_ANALYTICS_NODES",
                click.prompt(
                    "Please enter the number of search, eventing and analytics nodes. [alpha] (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_GENERAL_STORAGE"):
            self.settings.set(
                "COUCHBASE_GENERAL_STORAGE",
                click.prompt(
                    "Please enter the general storage size used for couchbase. [alpha] (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_DATA_STORAGE"):
            self.settings.set(
                "COUCHBASE_DATA_STORAGE",
                click.prompt(
                    "Please enter the data node storage size used for couchbase. [alpha] (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_INDEX_STORAGE"):
            self.settings.set(
                "COUCHBASE_INDEX_STORAGE",
                click.prompt(
                    "Please enter the index node storage size used for couchbase. (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_QUERY_STORAGE"):
            self.settings.set(
                "COUCHBASE_QUERY_STORAGE",
                click.prompt(
                    "Please enter the query node storage size used for couchbase. (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_ANALYTICS_STORAGE"):
            self.settings.set(
                "COUCHBASE_ANALYTICS_STORAGE",
                click.prompt(
                    "Please enter the analytics node storage size used for couchbase. (auto-calculated)",
                    default="",
                ))

        if not self.settings.get("COUCHBASE_VOLUME_TYPE"):
            logger.info("GCE GKE Options ('pd-standard', 'pd-ssd')")
            logger.info("AWS EKS Options ('gp2', 'io1', 'st1', 'sc1')")
            logger.info(
                "Azure Options ('Standard_LRS', 'Premium_LRS', 'StandardSSD_LRS', 'UltraSSD_LRS')"
            )
            self.settings.set(
                "COUCHBASE_VOLUME_TYPE",
                click.prompt("Please enter the volume type.", default="io1"))
예제 #10
0
def test_helpers_confirm_yesno(monkeypatch, given, expected):
    from pygluu.kubernetes.terminal.helpers import confirm_yesno

    monkeypatch.setattr("click.confirm", lambda x: given)
    assert confirm_yesno("Random question") == expected
예제 #11
0
    def prompt_gluu_gateway(self):
        """Prompts for Gluu Gateway
        """
        if not self.settings.get("INSTALL_GLUU_GATEWAY"):
            self.settings.set(
                "INSTALL_GLUU_GATEWAY",
                confirm_yesno("Install Gluu Gateway Database mode"))

        if self.settings.get("INSTALL_GLUU_GATEWAY") == "Y":
            self.enabled_services.append("gluu-gateway-ui")
            self.settings.set("ENABLED_SERVICES_LIST", self.enabled_services)
            self.settings.set("ENABLE_CLIENT_API", "Y")
            self.postgres.prompt_postgres()
            if not self.settings.get("KONG_NAMESPACE"):
                self.settings.set(
                    "KONG_NAMESPACE",
                    click.prompt("Please enter a namespace for Gluu Gateway",
                                 default="gluu-gateway"))

            if not self.settings.get("GLUU_GATEWAY_UI_NAMESPACE"):
                self.settings.set(
                    "GLUU_GATEWAY_UI_NAMESPACE",
                    click.prompt(
                        "Please enter a namespace for gluu gateway ui",
                        default="gg-ui"))

            if not self.settings.get("KONG_PG_USER"):
                self.settings.set(
                    "KONG_PG_USER",
                    click.prompt(
                        "Please enter a user for gluu-gateway postgres database",
                        default="kong"))

            if not self.settings.get("KONG_PG_PASSWORD"):
                self.settings.set("KONG_PG_PASSWORD",
                                  prompt_password("gluu-gateway-postgres"))

            if not self.settings.get("GLUU_GATEWAY_UI_PG_USER"):
                self.settings.set(
                    "GLUU_GATEWAY_UI_PG_USER",
                    click.prompt(
                        "Please enter a user for gluu-gateway-ui postgres database",
                        default="konga"))

            if not self.settings.get("GLUU_GATEWAY_UI_PG_PASSWORD"):
                self.settings.set("GLUU_GATEWAY_UI_PG_PASSWORD",
                                  prompt_password("gluu-gateway-ui-postgres"))

            if not self.settings.get("KONG_DATABASE"):
                self.settings.set(
                    "KONG_DATABASE",
                    click.prompt(
                        "Please enter gluu-gateway postgres database name",
                        default="kong"))

            if not self.settings.get("GLUU_GATEWAY_UI_DATABASE"):
                self.settings.set(
                    "GLUU_GATEWAY_UI_DATABASE",
                    click.prompt(
                        "Please enter gluu-gateway-ui postgres database name",
                        default="konga"))
    def prompt_optional_services(self):
        if not self.settings.get("ENABLE_CACHE_REFRESH"):
            self.settings.set("ENABLE_CACHE_REFRESH",
                              confirm_yesno("Deploy Cr-Rotate"))
        if self.settings.get("ENABLE_CACHE_REFRESH") == "Y":
            self.enabled_services.append("cr-rotate")

        if not self.settings.get("ENABLE_AUTH_SERVER_KEY_ROTATE"):
            self.settings.set("ENABLE_AUTH_SERVER_KEY_ROTATE",
                              confirm_yesno("Deploy Key-Rotation"))

        if self.settings.get("ENABLE_AUTH_SERVER_KEY_ROTATE") == "Y":
            self.enabled_services.append("auth-server-key-rotation")
            if not self.settings.get("AUTH_SERVER_KEYS_LIFE"):
                self.settings.set(
                    "AUTH_SERVER_KEYS_LIFE",
                    click.prompt("Auth-Server keys life in hours", default=48))

        if not self.settings.get("ENABLE_RADIUS"):
            self.settings.set("ENABLE_RADIUS", confirm_yesno("Deploy Radius"))
        if self.settings.get("ENABLE_RADIUS") == "Y":
            self.enabled_services.append("radius")
            self.settings.set("ENABLE_RADIUS_BOOLEAN", "true")

        if not self.settings.get("ENABLE_OXPASSPORT"):
            self.settings.set("ENABLE_OXPASSPORT",
                              confirm_yesno("Deploy Passport"))
        if self.settings.get("ENABLE_OXPASSPORT") == "Y":
            self.enabled_services.append("oxpassport")
            self.settings.set("ENABLE_OXPASSPORT_BOOLEAN", "true")

        if not self.settings.get("ENABLE_OXSHIBBOLETH"):
            self.settings.set("ENABLE_OXSHIBBOLETH",
                              confirm_yesno("Deploy Shibboleth SAML IDP"))
        if self.settings.get("ENABLE_OXSHIBBOLETH") == "Y":
            self.enabled_services.append("oxshibboleth")
            self.settings.set("ENABLE_SAML_BOOLEAN", "true")

        if not self.settings.get("ENABLE_CASA"):
            self.settings.set("ENABLE_CASA", confirm_yesno("Deploy Casa"))
        if self.settings.get("ENABLE_CASA") == "Y":
            self.enabled_services.append("casa")
            self.settings.set("ENABLE_CASA_BOOLEAN", "true")
            self.settings.set("ENABLE_CLIENT_API", "Y")

        if not self.settings.get("ENABLE_FIDO2"):
            self.settings.set("ENABLE_FIDO2", confirm_yesno("Deploy fido2"))
        if self.settings.get("ENABLE_FIDO2") == "Y":
            self.enabled_services.append("fido2")

        if not self.settings.get("ENABLE_SCIM"):
            self.settings.set("ENABLE_SCIM", confirm_yesno("Deploy scim"))
        if self.settings.get("ENABLE_SCIM") == "Y":
            self.enabled_services.append("scim")

        if not self.settings.get("ENABLE_CLIENT_API"):
            self.settings.set("ENABLE_CLIENT_API",
                              confirm_yesno("Deploy Client API"))

        if self.settings.get("ENABLE_CLIENT_API") == "Y":
            self.enabled_services.append("client-api")
            if not self.settings.get("CLIENT_API_APPLICATION_KEYSTORE_CN"):
                self.settings.set(
                    "CLIENT_API_APPLICATION_KEYSTORE_CN",
                    click.prompt("Client API application keystore name",
                                 default="client-api"))
            if not self.settings.get("CLIENT_API_ADMIN_KEYSTORE_CN"):
                self.settings.set(
                    "CLIENT_API_ADMIN_KEYSTORE_CN",
                    click.prompt("Client API admin keystore name",
                                 default="client-api"))

        if not self.settings.get("ENABLE_OXTRUST_API"):
            self.settings.set("ENABLE_OXTRUST_API",
                              confirm_yesno("Enable oxTrust API"))

        if self.settings.get("ENABLE_OXTRUST_API"):
            self.settings.set("ENABLE_OXTRUST_API_BOOLEAN", "true")
            if not self.settings.get("ENABLE_OXTRUST_TEST_MODE"):
                self.settings.set("ENABLE_OXTRUST_TEST_MODE",
                                  confirm_yesno("Enable oxTrust Test Mode"))
        if self.settings.get("ENABLE_OXTRUST_TEST_MODE") == "Y":
            self.settings.set("ENABLE_OXTRUST_TEST_MODE_BOOLEAN", "true")
        self.settings.set("ENABLED_SERVICES_LIST", self.enabled_services)
예제 #13
0
    def prompt_helm(self):
        """Prompts for helm installation and returns updated settings.

        :return:
        """
        if not self.settings.get("CN_HELM_RELEASE_NAME"):
            self.settings.set(
                "CN_HELM_RELEASE_NAME",
                click.prompt("Please enter Gluu helm name", default="gluu"))

        # ALPHA-FEATURE: Multi cluster ldap replication
        if self.settings.get("PERSISTENCE_BACKEND") in ("hybrid", "ldap") and \
                not self.settings.get("CN_LDAP_MULTI_CLUSTER"):
            self.settings.set(
                "CN_LDAP_MULTI_CLUSTER",
                confirm_yesno(
                    "ALPHA-FEATURE-Are you setting up a multi kubernetes cluster"
                ))

        if self.settings.get("CN_LDAP_MULTI_CLUSTER") == "Y":
            if not self.settings.get("CN_LDAP_SERF_PORT"):
                self.settings.set(
                    "CN_LDAP_SERF_PORT",
                    click.prompt(
                        "ALPHA-FEATURE-Please enter LDAP serf port (NodePort)",
                        default="30946"))
            if not self.settings.get("CN_LDAP_ADVERTISE_ADDRESS"):
                self.settings.set(
                    "CN_LDAP_ADVERTISE_ADDRESS",
                    click.prompt("Please enter Serf advertise address",
                                 default="demoexample.gluu.org:30946"))
            if not self.settings.get("CN_LDAP_ADVERTISE_ADMIN_PORT"):
                self.settings.set(
                    "CN_LDAP_ADVERTISE_ADMIN_PORT",
                    click.prompt(
                        "ALPHA-FEATURE-Please enter LDAP advertise admin port (NodePort)",
                        default="30444"))
            if not self.settings.get("CN_LDAP_ADVERTISE_LDAPS_PORT"):
                self.settings.set(
                    "CN_LDAP_ADVERTISE_LDAPS_PORT",
                    click.prompt(
                        "ALPHA-FEATURE-Please enter LDAP advertise LDAPS port (NodePort)",
                        default="30636"))
            if not self.settings.get("CN_LDAP_ADVERTISE_REPLICATION_PORT"):
                self.settings.set(
                    "CN_LDAP_ADVERTISE_REPLICATION_PORT",
                    click.prompt(
                        "ALPHA-FEATURE-Please enter LDAP advertise replication port (NodePort)",
                        default="30989"))
            if not self.settings.get("CN_LDAP_SECONDARY_CLUSTER"):
                self.settings.set(
                    "CN_LDAP_SECONDARY_CLUSTER",
                    confirm_yesno(
                        "ALPHA-FEATURE-Is this not the first kubernetes cluster"
                    ))
            if not self.settings.get("CN_LDAP_SERF_PEERS"):
                self.settings.set(
                    "CN_LDAP_SERF_PEERS",
                    click.prompt(
                        "ALPHA-FEATURE-Please enter LDAP advertise serf peers as an array",
                        default=
                        "['firstldap.gluu.org:30946', 'secondldap.gluu.org:31946']"
                    ))

        if not self.settings.get(
                "NGINX_INGRESS_RELEASE_NAME") and self.settings.get(
                    "AWS_LB_TYPE") != "alb":
            self.settings.set(
                "NGINX_INGRESS_RELEASE_NAME",
                click.prompt("Please enter nginx-ingress helm name",
                             default="ningress"))

        if not self.settings.get(
                "NGINX_INGRESS_NAMESPACE") and self.settings.get(
                    "AWS_LB_TYPE") != "alb":
            self.settings.set(
                "NGINX_INGRESS_NAMESPACE",
                click.prompt("Please enter nginx-ingress helm namespace",
                             default="ingress-nginx"))

        if self.settings.get("INSTALL_GLUU_GATEWAY") == "Y":
            if not self.settings.get("KONG_HELM_RELEASE_NAME"):
                self.settings.set(
                    "KONG_HELM_RELEASE_NAME",
                    click.prompt("Please enter Gluu Gateway helm name",
                                 default="gluu-gateway"))

            if not self.settings.get("GLUU_GATEWAY_UI_HELM_RELEASE_NAME"):
                self.settings.set(
                    "GLUU_GATEWAY_UI_HELM_RELEASE_NAME",
                    click.prompt("Please enter Gluu Gateway UI helm name",
                                 default="gluu-gateway-ui"))
예제 #14
0
    def prompt_config(self):
        """Prompts for generation of configuration layer
        """
        check_fqdn_provided = False

        while True:
            if not self.settings.get("CN_FQDN") or check_fqdn_provided:
                self.settings.set(
                    "CN_FQDN",
                    click.prompt("Enter Hostname",
                                 default="demoexample.gluu.org"))

            regex_bool = re.match(
                '^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.){2,}([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]){2,}$',
                # noqa: W605
                self.settings.get("CN_FQDN"))

            if regex_bool:
                break
            else:
                check_fqdn_provided = True
                logger.error(
                    "Input not FQDN structred. Please enter a FQDN with the format demoexample.gluu.org"
                )

        if not self.settings.get("COUNTRY_CODE"):
            self.settings.set("COUNTRY_CODE",
                              click.prompt("Enter Country Code", default="US"))

        if not self.settings.get("STATE"):
            self.settings.set("STATE", click.prompt("Enter State",
                                                    default="TX"))

        if not self.settings.get("CITY"):
            self.settings.set("CITY",
                              click.prompt("Enter City", default="Austin"))

        if not self.settings.get("EMAIL"):
            self.settings.set(
                "EMAIL", click.prompt("Enter email",
                                      default="*****@*****.**"))

        if not self.settings.get("ORG_NAME"):
            self.settings.set(
                "ORG_NAME", click.prompt("Enter Organization", default="Gluu"))

        if not self.settings.get("ADMIN_PW"):
            self.settings.set("ADMIN_PW", prompt_password("oxTrust"))

        if not self.settings.get("LDAP_PW"):
            if self.settings.get("PERSISTENCE_BACKEND") in ("hybrid", "ldap"):
                self.settings.set("LDAP_PW", prompt_password("LDAP"))
            else:
                self.settings.set("LDAP_PW",
                                  self.settings.get("COUCHBASE_PASSWORD"))

        if self.settings.get("DEPLOYMENT_ARCH") in ("microk8s", "minikube"):
            self.settings.set("IS_CN_FQDN_REGISTERED", "N")

        if not self.settings.get("IS_CN_FQDN_REGISTERED"):
            self.settings.set(
                "IS_CN_FQDN_REGISTERED",
                confirm_yesno("Are you using a globally resolvable FQDN"))

        if self.settings.get("IS_CN_FQDN_REGISTERED") == "N":
            self.enabled_services.append("update-lb-ip")
            self.settings.set("ENABLED_SERVICES_LIST", self.enabled_services)

        logger.info(
            "You can mount your FQDN certification and key by placing them inside "
            "gluu.crt and gluu.key respectivley at the same location pygluu-kubernetes.pyz is at."
        )
        self.generate_main_config()
예제 #15
0
    def prompt_jackrabbit(self):
        """Prompts for Jackrabbit content repository
        """
        if not self.settings.get("INSTALL_JACKRABBIT"):
            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"
            )
            self.settings.set(
                "INSTALL_JACKRABBIT",
                confirm_yesno("Install Jackrabbit content repository",
                              default=True))

        jackrabbit_cluster_prompt = "Is"
        if self.settings.get("INSTALL_JACKRABBIT") == "Y":
            if not self.settings.get("JACKRABBIT_STORAGE_SIZE"):
                self.settings.set(
                    "JACKRABBIT_STORAGE_SIZE",
                    click.prompt(
                        "Size of Jackrabbit content repository volume storage",
                        default="4Gi"))
            self.settings.set("JACKRABBIT_URL", "http://jackrabbit:8080")
            jackrabbit_cluster_prompt = "Enable"

        if not self.settings.get("JACKRABBIT_URL"):
            self.settings.set(
                "JACKRABBIT_URL",
                click.prompt("Please enter jackrabbit url.",
                             default="http://jackrabbit:8080"))
        if not self.settings.get("JACKRABBIT_ADMIN_ID"):
            self.settings.set(
                "JACKRABBIT_ADMIN_ID",
                click.prompt("Please enter Jackrabit admin user",
                             default="admin"))

        if not self.settings.get("JACKRABBIT_ADMIN_PASSWORD"):
            self.settings.set("JACKRABBIT_ADMIN_PASSWORD",
                              prompt_password("jackrabbit-admin", 24))

        if not self.settings.get("JACKRABBIT_CLUSTER"):
            self.settings.set(
                "JACKRABBIT_CLUSTER",
                confirm_yesno("{} Jackrabbit in cluster mode[beta] "
                              "Recommended in production".format(
                                  jackrabbit_cluster_prompt),
                              default=True))
        if self.settings.get("JACKRABBIT_CLUSTER") == "Y":
            self.postgres.prompt_postgres()
            if not self.settings.get("JACKRABBIT_PG_USER"):
                self.settings.set(
                    "JACKRABBIT_PG_USER",
                    click.prompt(
                        "Please enter a user for jackrabbit postgres "
                        "database",
                        default="jackrabbit"))

            if not self.settings.get("JACKRABBIT_PG_PASSWORD"):
                self.settings.set("JACKRABBIT_PG_PASSWORD",
                                  prompt_password("jackrabbit-postgres"))

            if not self.settings.get("JACKRABBIT_DATABASE"):
                self.settings.set(
                    "JACKRABBIT_DATABASE",
                    click.prompt(
                        "Please enter jackrabbit postgres database name",
                        default="jackrabbit"))
예제 #16
0
    def prompt_aws_lb(self):
        """Prompts for AWS Load balancer information
        """
        lb_map = {
            1: "clb",
            2: "nlb",
            3: "alb",
        }

        if self.settings.get("AWS_LB_TYPE") not in lb_map.values():
            print(
                "|-----------------------------------------------------------------|"
            )
            print(
                "|                     AWS Loadbalancer type                       |"
            )
            print(
                "|-----------------------------------------------------------------|"
            )
            print(
                "| [1] Classic Load Balancer (CLB) [default]                       |"
            )
            print(
                "| [2] Network Load Balancer (NLB - Alpha) -- Static IP            |"
            )
            print(
                "| [3] Application Load Balancer (ALB - Alpha) DEV_ONLY            |"
            )
            print(
                "|-----------------------------------------------------------------|"
            )

            choice = click.prompt("Loadbalancer type", default=1)
            self.settings.set("AWS_LB_TYPE", lb_map.get(choice, "clb"))
            if self.settings.get("AWS_LB_TYPE") == "alb":
                logger.info(
                    "A prompt later during installation will appear to input the ALB DNS address"
                )

        if not self.settings.get("USE_ARN"):
            self.settings.set(
                "USE_ARN",
                confirm_yesno(
                    "Are you terminating SSL traffic at LB and using certificate from AWS"
                ))

        if not self.settings.get("VPC_CIDR") and self.settings.get(
                "USE_ARN") == "Y":
            self.settings.set(
                "AWS_VPC_CIDR",
                click.prompt(
                    "Enter VPC CIDR in use for the Kubernetes cluster i.e 192.168.1.1/16",
                    default="0.0.0.0/0"))

        if not self.settings.get("ARN_AWS_IAM") and self.settings.get(
                "USE_ARN") == "Y":
            # no default means it will try to prompt in loop until user inputs
            self.settings.set(
                "ARN_AWS_IAM",
                click.prompt(
                    "Enter aws-load-balancer-ssl-cert arn quoted ('arn:aws:acm:us-west-2:XXXXXXXX:"
                    "certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX')"))