#!/usr/bin/env python
"""
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

"""

from functions import calc_xmn_from_xms
from resource_management import *
import status_params

# server configurations
config = Script.get_config()

java64_home = config['hostLevelParams']['java_home']
hbase_root = config['configurations']['global']['app_root']
hbase_instance_name = config['configurations']['global']['hbase_instance_name']
hbase_user = status_params.hbase_user
user_group = config['configurations']['global']['user_group']

pid_dir = status_params.pid_dir
tmp_dir = config['configurations']['hbase-site']['hbase.tmp.dir']
local_dir = substitute_vars(config['configurations']['hbase-site']['hbase.local.dir'],
                            config['configurations']['hbase-site'])
conf_dir = format("{hbase_root}/conf")
log_dir = config['configurations']['global']['app_log_dir']
input_conf_files_dir = config['configurations']['global']['app_input_conf_dir']

hbase_hdfs_root_dir = config['configurations']['hbase-site']['hbase.rootdir']

"""
Read various ports, unused as of now
"""
rest_port = config['configurations']['global']['hbase_rest_port']
thrift_port = config['configurations']['global']['hbase_thrift_port']
thrift2_port = config['configurations']['global']['hbase_thrift2_port']

"""
Compute or read various heap sizes
"""
master_heapsize = config['configurations']['hbase-env']['hbase_master_heapsize']
regionserver_heapsize = config['configurations']['hbase-env']['hbase_regionserver_heapsize']
regionserver_xmn_max = config['configurations']['hbase-env']['hbase_regionserver_xmn_max']
regionserver_xmn_percent = config['configurations']['hbase-env']['hbase_regionserver_xmn_ratio']
regionserver_xmn_size = calc_xmn_from_xms(regionserver_heapsize, regionserver_xmn_percent, regionserver_xmn_max)

restserver_heapsize =  default("configurations/hbase-env/hbase_restserver_heapsize", "512m")
thriftserver_heapsize =  default("configurations/hbase-env/hbase_thriftserver_heapsize", "512m")
thrift2server_heapsize =  default("configurations/hbase-env/hbase_thrift2server_heapsize", "512m")

hbase_env_sh_template = config['configurations']['hbase-env']['content']
java_library_path = config['configurations']['global']['java_library_path']
hbase_additional_cp = config['configurations']['global']['hbase_additional_cp']

# log4j.properties
if (('hbase-log4j' in config['configurations']) and ('content' in config['configurations']['hbase-log4j'])):
  log4j_props = config['configurations']['hbase-log4j']['content']
else:
  log4j_props = None