lib/gooddata/bricks/middleware/gooddata_middleware.rb
# encoding: UTF-8
#
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
require_relative 'base_middleware'
require 'gooddata/extensions/true'
require 'gooddata/extensions/false'
require 'gooddata/extensions/integer'
require 'gooddata/extensions/string'
require 'gooddata/extensions/nil'
using TrueExtensions
using FalseExtensions
using IntegerExtensions
using StringExtensions
using NilExtensions
module GoodData
module Bricks
# Connects to platform and enriches parameters with GoodData::Client
class GoodDataMiddleware < Bricks::Middleware
DEFAULT_PROTOCOL = 'https'
DEFAULT_HOSTNAME = 'secure.gooddata.com'
def call(params)
# Generate brick execution id
execution_id = GoodData.gd_logger.execution_id
# Convert possible jruby hash to plain hash
params = params.to_hash
# Transform keys
params = GoodData::Helpers.stringify_keys(params)
# params = GoodData::Helpers.symbolize_keys(params)
# Set parallelism
max_concurrency = params['max_concurrency'] || params['MAX_CONCURRENCY']
if max_concurrency && max_concurrency.to_i > 0
$pmap_default_thread_count = max_concurrency.to_i # rubocop:disable GlobalVars
end
# Connect Client
protocol = params['CLIENT_GDC_PROTOCOL'] || params['GDC_PROTOCOL'] || DEFAULT_PROTOCOL
hostname = params['CLIENT_GDC_HOSTNAME'] || params['GDC_HOSTNAME'] || DEFAULT_HOSTNAME
server = "#{protocol}://#{hostname}"
client = GoodDataMiddleware.connect(
server,
params['GDC_VERIFY_SSL'].to_b,
params['GDC_USERNAME'],
params['GDC_PASSWORD'],
params['GDC_SST'],
execution_id
)
opts = params['development_client']
if opts
if opts['server']
server = opts['server']
else
protocol = opts['protocol'] || DEFAULT_PROTOCOL
hostname = opts['hostname'] || DEFAULT_HOSTNAME
server = "#{protocol}://#{hostname}"
end
development_client = GoodDataMiddleware.connect(
server,
opts['verify_ssl'].to_b,
opts['username'] || opts['login'] || opts['email'],
opts['password'],
opts['sst'],
execution_id
)
else
development_client = client
end
new_params = {
'GDC_GD_CLIENT' => client,
'development_client' => development_client
}
# collect parent project if deployed as process
if params['GDC_PROJECT_ID']
new_params['gdc_project'] = GoodData.project = client.projects(params['GDC_PROJECT_ID'])
end
returning_value = @app.call(params.merge(new_params))
# Try to disconnect client
begin
client.disconnect
rescue StandardError => e
GoodData.logger.warn("Tried to disconnect client. Was unsuccessful. Proceeding anyway. Error: #{e}")
end
# Try to disconnect development_client
begin
development_client.disconnect if development_client != client
rescue StandardError => e
GoodData.logger.warn("Tried to disconnect development_client. Was unsuccessful. Proceeding anyway. Error: #{e}")
end
returning_value
end
class << self
def connect(server, verify_ssl, username, password, sst_token, execution_id) # rubocop:disable Metrics/ParameterLists
if username.nil? || password.nil?
GoodData.logger.info("Connecting with SST to server #{server}")
raise 'SST (SuperSecureToken) not present in params' if sst_token.nil?
conn = GoodData.connect(sst_token: sst_token, server: server, verify_ssl: verify_ssl, execution_id: execution_id)
else
GoodData.logger.info("Connecting as #{username} to server #{server}")
conn = GoodData.connect(username, password, server: server, verify_ssl: verify_ssl, execution_id: execution_id)
end
conn.stats_on
conn
end
end
end
end
end