public
Authored by avatar CY.Wang

Service Discovery for MongoDB and PostgreSQL on Cloud Foundry and Docker Swarm

serviceDiscovery.ts 3.52 KiB
import { readFile } from 'fs';
import { promisify } from 'util';

export async function discoverMongooseEnvVars() {
  const TAG = '#discoverMongooseEnvVars';
  const {
    VCAP_SERVICES,

    MONGO_INITDB_ROOT_USERNAME,
    MONGO_INITDB_ROOT_PASSWORD_FILE,

    MONGODB_HOST,
    MONGODB_PORT,
    MONGODB_DATABASE,
    MONGODB_AUTH_SOURCE,

    MONGOOSE_DEBUG,
    MONGOOSE_AUTO_INDEX,
  } = process.env;
  let {
    MONGODB_URL,
    MONGO_INITDB_ROOT_PASSWORD,
  } = process.env;

  if (VCAP_SERVICES) {
    const {
      credentials,
    } = JSON.parse(VCAP_SERVICES).mongodb[0];

    const url = new URL(credentials.uri);
    const { searchParams } = url;

    if (!searchParams.has('replicaSet') && credentials.replicaSetName) {
      searchParams.set('replicaSet', credentials.replicaSetName);
    }

    process.env.MONGODB_URL = MONGODB_URL = url.toString();
  }

  if (MONGODB_URL) { return console.log(TAG, 'MONGODB_URL', MONGODB_URL); }

  console.log(TAG, 'MONGO_INITDB_ROOT_USERNAME', MONGO_INITDB_ROOT_USERNAME);

  console.log(TAG, 'MONGO_INITDB_ROOT_PASSWORD', typeof MONGO_INITDB_ROOT_PASSWORD);
  console.log(TAG, 'MONGO_INITDB_ROOT_PASSWORD_FILE', MONGO_INITDB_ROOT_PASSWORD_FILE);
  let HIDE_PSWD = '';
  if (!MONGO_INITDB_ROOT_PASSWORD && MONGO_INITDB_ROOT_PASSWORD_FILE) {
    MONGO_INITDB_ROOT_PASSWORD = (await promisify(readFile)(MONGO_INITDB_ROOT_PASSWORD_FILE)).toString();
    HIDE_PSWD = `${typeof MONGO_INITDB_ROOT_PASSWORD}(${MONGO_INITDB_ROOT_PASSWORD.length})`;
    console.log(TAG, 'MONGO_INITDB_ROOT_PASSWORD', HIDE_PSWD);
  }

  console.log(TAG, 'MONGODB_HOST', MONGODB_HOST);
  console.log(TAG, 'MONGODB_PORT', MONGODB_PORT);
  console.log(TAG, 'MONGODB_DATABASE', MONGODB_DATABASE);
  console.log(TAG, 'MONGODB_AUTH_SOURCE', MONGODB_AUTH_SOURCE);

  MONGODB_URL = `
mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@${MONGODB_HOST}:${MONGODB_PORT}/${MONGODB_DATABASE}
    `.trim();
  if (MONGODB_AUTH_SOURCE) { MONGODB_URL += '?authSource=' + MONGODB_AUTH_SOURCE; }

  const MONGODB_URL_HIDE_PSWD = MONGO_INITDB_ROOT_PASSWORD ?
    MONGODB_URL.replace(MONGO_INITDB_ROOT_PASSWORD, HIDE_PSWD) :
    MONGODB_URL;
  console.log(TAG, 'MONGODB_URL', MONGODB_URL_HIDE_PSWD);
  process.env.MONGODB_URL = MONGODB_URL;

  console.log(TAG, 'MONGOOSE_DEBUG', MONGOOSE_DEBUG);
  console.log(TAG, 'MONGOOSE_AUTO_INDEX', MONGOOSE_AUTO_INDEX);
}

export async function discoverPGEnvVars() {
  const TAG = '#discoverPGEnvVars';
  const {
    VCAP_SERVICES,
  } = process.env;

  if (VCAP_SERVICES) {
    const {
      credentials,
    } = JSON.parse(VCAP_SERVICES).postgresql[0];

    process.env = Object.assign({
      PGHOST: credentials.host,
      PGPORT: credentials.port,
      PGUSER: credentials.username,
      PGPASSWORD: credentials.password,
      PGDATABASE: credentials.database,
    }, process.env);
  }

  const {
    PGHOST,
    PGPORT,
    PGUSER,
    PGDATABASE,

    POSTGRES_PASSWORD_FILE,
  } = process.env;
  let {
    PGPASSWORD,
  } = process.env;

  console.log(TAG, 'PGHOST', PGHOST);
  console.log(TAG, 'PGPORT', PGPORT);
  console.log(TAG, 'PGUSER', PGUSER);
  console.log(TAG, 'PGDATABASE', PGDATABASE);

  console.log(TAG, 'PGPASSWORD', typeof PGPASSWORD);
  console.log(TAG, 'POSTGRES_PASSWORD_FILE', POSTGRES_PASSWORD_FILE);
  let HIDE_PSWD = '';
  if (!PGPASSWORD && POSTGRES_PASSWORD_FILE) {
    PGPASSWORD = (await promisify(readFile)(POSTGRES_PASSWORD_FILE)).toString();
    HIDE_PSWD = `${typeof PGPASSWORD}(${PGPASSWORD.length})`;
    console.log(TAG, 'PGPASSWORD', HIDE_PSWD);
    process.env.PGPASSWORD = PGPASSWORD;
  }
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment