'Syncs the druid datasource in main db with the provided config.
The endpoint takes 3 arguments:
user - user name to perform the operation as
cluster - name of the druid cluster
config - configuration stored in json that contains:
name: druid datasource name
dimensions: list of the dimensions, they become druid columns
with the type STRING
metrics_spec: list of metrics (dictionary). Metric consists of
2 attributes: type and name. Type can be count,
etc. `count` type is stored internally as longSum
other fields will be ignored.
Example: {
"name": "test_click",
"metrics_spec": [{"type": "count", "name": "count"}],
"dimensions": ["affiliate_id", "campaign", "first_seen"]'

@has_access
@expose(u'/sync_druid/', methods=[u'POST'])
@log_this
def sync_druid_source(self):

    payload = request.get_json(force=True)
    druid_config = payload[u'config']
    user_name = payload[u'user']
    cluster_name = payload[u'cluster']
    user = sm.find_user(username=user_name)
    DruidDatasource = ConnectorRegistry.sources[u'druid']
    DruidCluster = DruidDatasource.cluster_class
    if (not user):
        err_msg = __(u"Can't    find    User    '%(name)s',    please    ask    your    admin    to    create    one.", name=user_name)
        logging.error(err_msg)
        return json_error_response(err_msg)
    cluster = db.session.query(DruidCluster).filter_by(cluster_name=cluster_name).first()
    if (not cluster):
        err_msg = __(u"Can't    find    DruidCluster    with    cluster_name    =    '%(name)s'", name=cluster_name)
        logging.error(err_msg)
        return json_error_response(err_msg)
    try:
        DruidDatasource.sync_to_db_from_config(druid_config, user, cluster)
    except Exception as e:
        logging.exception(utils.error_msg_from_exception(e))
        return json_error_response(utils.error_msg_from_exception(e))
    return Response(status=201)
