예제 #1
0
def check_database_environment_variable():
    try:
        database_config.get_database_config()
        return True
    except Exception as e:
        logging.error(
            "You should provide a DATABASE_URL by adding a database service "
            "to this application, it can be either MySQL or Postgres "
            "If this is the first push of a new app, set up a database service "
            "and push again afterwards: %s",
            e,
        )
        return False
예제 #2
0
def _set_up_postgres():
    # TODO: set up a way to disable this, on shared database (mxapps.io) we
    # don't want to allow this.
    if not buildpackutil.i_am_primary_instance():
        return
    dbconfig = database_config.get_database_config()
    for k in (
        "DatabaseType",
        "DatabaseUserName",
        "DatabasePassword",
        "DatabaseHost",
    ):
        if k not in dbconfig:
            logger.warn(
                "Skipping database configuration for DataDog because "
                "configuration is not found. See database_config.py "
                "for details"
            )
            return
    if dbconfig["DatabaseType"] != "PostgreSQL":
        return
    with open(".local/datadog/conf.d/postgres.yaml", "w") as fh:
        config = {
            "init_config": {},
            "instances": [
                {
                    "host": dbconfig["DatabaseHost"].split(":")[0],
                    "port": int(dbconfig["DatabaseHost"].split(":")[1]),
                    "username": dbconfig["DatabaseUserName"],
                    "password": dbconfig["DatabasePassword"],
                    "dbname": dbconfig["DatabaseName"],
                }
            ],
        }
        fh.write(yaml.safe_dump(config))
예제 #3
0
    def _get_db_conn(self):
        if self.db and self.db.closed != 0:
            self.db.close()
            self.db = None

        if not self.db:
            db_config = database_config.get_database_config()
            if db_config["DatabaseType"] != "PostgreSQL":
                raise Exception("Metrics only supports postgresql, not %s" %
                                db_config["DatabaseType"])
            host_and_port = db_config["DatabaseHost"].split(":")
            host = host_and_port[0]
            if len(host_and_port) > 1:
                port = int(host_and_port[1])
            else:
                port = 5432
            self.db = psycopg2.connect(
                "options='-c statement_timeout=60s'",
                database=db_config["DatabaseName"],
                user=db_config["DatabaseUserName"],
                password=db_config["DatabasePassword"],
                host=host,
                port=port,
                connect_timeout=3,
            )
            self.db.set_isolation_level(
                psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
        return self.db
예제 #4
0
    def _get_db_conn(self):
        if self.db and self.db.closed != 0:
            self.db.close()
            self.db = None

        if not self.db:
            # get_database config may return None or empty
            db_config = database_config.get_database_config()
            if not db_config or "DatabaseType" not in db_config:
                raise ValueError(
                    "Database not set as VCAP or DATABASE_URL. Check "
                    "documentation to see supported configuration options.")
            if db_config["DatabaseType"] != "PostgreSQL":
                raise Exception("Metrics only supports postgresql, not %s" %
                                db_config["DatabaseType"])

            host_and_port = db_config["DatabaseHost"].split(":")
            host = host_and_port[0]
            if len(host_and_port) > 1:
                port = int(host_and_port[1])
            else:
                port = 5432
            self.db = psycopg2.connect(
                "options='-c statement_timeout=60s'",
                database=db_config["DatabaseName"],
                user=db_config["DatabaseUserName"],
                password=db_config["DatabasePassword"],
                host=host,
                port=port,
                connect_timeout=3,
            )
            self.db.set_isolation_level(
                psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
        return self.db
예제 #5
0
 def _get_database_table_size(self):
     conn = self._get_db_conn()
     db_config = database_config.get_database_config()
     with conn.cursor() as cursor:
         cursor.execute("SELECT pg_database_size('%s');" %
                        (db_config["DatabaseName"], ))
         rows = cursor.fetchall()
         return int_or_default(rows[0][0])
예제 #6
0
    def test_database_url(self):
        self.clean_env()
        os.environ[
            "DATABASE_URL"] = "jdbc:postgres://*****:*****@host/database"

        config = get_database_config()
        assert config
        assert config["DatabaseType"] == "PostgreSQL"
예제 #7
0
    def test_mx_runtime_db_config(self):
        """
        Test is MXRUNTIME variables are set up no database configuration is returned
        based on DATABASE_URL or VCAP_SERVICES
        """
        self.clean_env()
        os.environ["MXRUNTIME_DatabaseType"] = "PostgreSQL"
        os.environ[
            "MXRUNTIME_DatabaseJdbcUrl"] = "postgres://*****:*****@rdsbroker-testfree-nonprod-1-eu-west-1.asdbjasdg.eu-west-1.rds.amazonaws.com:5432/testdatabase"  # noqa E501

        config = get_database_config()
        assert not config
예제 #8
0
def set_runtime_config(metadata, mxruntime_config, vcap_data, m2ee):
    scheduled_event_execution, my_scheduled_events = get_scheduled_events(
        metadata
    )
    app_config = {
        "ApplicationRootUrl": "https://%s" % vcap_data["application_uris"][0],
        "MicroflowConstants": get_constants(metadata),
        "ScheduledEventExecution": scheduled_event_execution,
    }

    if my_scheduled_events is not None:
        app_config["MyScheduledEvents"] = my_scheduled_events

    if is_development_mode():
        logger.warning(
            "Runtime is being started in Development Mode. Set "
            'DEVELOPMENT_MODE to "false" (currently "true") to '
            "set it to production."
        )
        app_config["DTAPMode"] = "D"

    if m2ee.config.get_runtime_version() >= 7 and not i_am_primary_instance():
        app_config["com.mendix.core.isClusterSlave"] = "true"
    elif (
        m2ee.config.get_runtime_version() >= 5.15
        and os.getenv("ENABLE_STICKY_SESSIONS", "false").lower() == "true"
    ):
        logger.info("Enabling sticky sessions")
        app_config["com.mendix.core.SessionIdCookieName"] = "JSESSIONID"

    buildpackutil.mkdir_p(os.path.join(os.getcwd(), "model", "resources"))
    mxruntime_config.update(app_config)

    # db configuration might be None, database should then be set up with
    # MXRUNTIME_Database... custom runtime settings.
    runtime_db_config = database_config.get_database_config(
        development_mode=is_development_mode()
    )
    if runtime_db_config:
        mxruntime_config.update(runtime_db_config)

    mxruntime_config.update(get_filestore_config(m2ee))
    mxruntime_config.update(get_certificate_authorities())
    mxruntime_config.update(get_client_certificates())
    mxruntime_config.update(get_custom_settings(metadata, mxruntime_config))
    mxruntime_config.update(get_license_subscription())
    mxruntime_config.update(get_custom_runtime_settings())
예제 #9
0
 def _get_database_mutations(self):
     conn = self._get_db_conn()
     db_config = database_config.get_database_config()
     with conn.cursor() as cursor:
         cursor.execute("SELECT xact_commit, "
                        "       xact_rollback, "
                        "       tup_inserted, "
                        "       tup_updated, "
                        "       tup_deleted "
                        "FROM pg_stat_database "
                        "WHERE datname = '%s';" %
                        (db_config["DatabaseName"], ))
         rows = cursor.fetchall()
         return {
             "xact_commit": int_or_default(rows[0][0]),
             "xact_rollback": int_or_default(rows[0][1]),
             "tup_inserted": int_or_default(rows[0][2]),
             "tup_updated": int_or_default(rows[0][3]),
             "tup_deleted": int_or_default(rows[0][4]),
         }
     return None
예제 #10
0
    def test_vcap(self):
        self.clean_env()
        os.environ[
            "VCAP_SERVICES"
        ] = """
{
 "rds-testfree": [
   {
    "binding_name": null,
    "credentials": {
     "db_name": "dbuajsdhkasdhaks",
     "host": "rdsbroker-testfree-nonprod-1-eu-west-1.asdbjasdg.eu-west-1.rds.amazonaws.com",
     "password": "******",
     "uri": "postgres://*****:*****@rdsbroker-testfree-nonprod-1-eu-west-1.asdbjasdg.eu-west-1.rds.amazonaws.com:5432/dbuajsdhkasdhaks",
     "username": "******"
    },
    "instance_name": "ops-432a659e.test.foo.io-database",
    "label": "rds-testfree",
    "name": "ops-432a659e.test.foo.io-database",
    "plan": "shared-psql-testfree",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [
     "database",
     "RDS",
     "postgresql"
    ],
    "volume_mounts": []
   }
  ]
}
    """  # noqa

        config = get_database_config()
        assert config
        assert config["DatabaseType"] == "PostgreSQL"
예제 #11
0
def service_backups():
    vcap_services = buildpackutil.get_vcap_services_data()
    schnapps = None
    amazon_s3 = None
    for key in vcap_services:
        if key.startswith("amazon-s3"):
            amazon_s3 = key
        if key.startswith("schnapps"):
            schnapps = key

    if not vcap_services or schnapps not in vcap_services:
        logger.debug("No backup service detected")
        return

    backup_service = {}
    if amazon_s3 in vcap_services:
        s3_credentials = vcap_services[amazon_s3][0]["credentials"]
        backup_service["filesCredentials"] = {
            "accessKey": s3_credentials["access_key_id"],
            "secretKey": s3_credentials["secret_access_key"],
            "bucketName": s3_credentials["bucket"],
        }
        if "key_suffix" in s3_credentials:  # Not all s3 plans have this field
            backup_service["filesCredentials"]["keySuffix"] = s3_credentials[
                "key_suffix"
            ]

    try:
        db_config = database_config.get_database_config()
        if db_config["DatabaseType"] != "PostgreSQL":
            raise Exception(
                "Schnapps only supports postgresql, not %s"
                % db_config["DatabaseType"]
            )
        host_and_port = db_config["DatabaseHost"].split(":")
        backup_service["databaseCredentials"] = {
            "host": host_and_port[0],
            "username": db_config["DatabaseUserName"],
            "password": db_config["DatabasePassword"],
            "dbname": db_config["DatabaseName"],
            "port": int(host_and_port[1]) if len(host_and_port) > 1 else 5432,
        }
    except Exception as e:
        logger.exception(
            "Schnapps will not be activated because error occurred with "
            "parsing the database credentials"
        )
        return
    schnapps_url = vcap_services[schnapps][0]["credentials"]["url"]
    schnapps_api_key = vcap_services[schnapps][0]["credentials"]["apiKey"]

    try:
        result = requests.put(
            schnapps_url,
            headers={
                "Content-Type": "application/json",
                "apiKey": schnapps_api_key,
            },
            data=json.dumps(backup_service),
        )
    except requests.exceptions.SSLError as e:
        logger.warning("Failed to contact backup service. SSLError: " + str(e))
        return
    except Exception as e:
        logger.warning("Failed to contact backup service: ", exc_info=True)
        return

    if result.status_code == 200:
        logger.info("Successfully updated backup service")
    else:
        logger.warning("Failed to update backup service: " + result.text)
예제 #12
0
 def test_no_setup(self):
     self.clean_env()
     with self.assertRaises(RuntimeError):
         get_database_config()