blob: 29a47d9dbb44b444f01c0ea9cafa9ae76dfcba93 [file] [log] [blame]
'''
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.
'''
import os
from unittest import TestCase
from mock.mock import patch, MagicMock
import socket
class TestHDP22StackAdvisor(TestCase):
def setUp(self):
import imp
self.maxDiff = None
self.testDirectory = os.path.dirname(os.path.abspath(__file__))
stackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/stack_advisor.py')
hdp206StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.0.6/services/stack_advisor.py')
hdp21StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.1/services/stack_advisor.py')
hdp22StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.2/services/stack_advisor.py')
hdp22StackAdvisorClassName = 'HDP22StackAdvisor'
with open(stackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor', fp, stackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp206StackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor_impl', fp, hdp206StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp21StackAdvisorPath, 'rb') as fp:
imp.load_module('stack_advisor_impl', fp, hdp21StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
with open(hdp22StackAdvisorPath, 'rb') as fp:
stack_advisor_impl = imp.load_module('stack_advisor_impl', fp, hdp22StackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
clazz = getattr(stack_advisor_impl, hdp22StackAdvisorClassName)
self.stackAdvisor = clazz()
# substitute method in the instance
self.get_system_min_uid_real = self.stackAdvisor.get_system_min_uid
self.stackAdvisor.get_system_min_uid = self.get_system_min_uid_magic
@patch('__builtin__.open')
@patch('os.path.exists')
def get_system_min_uid_magic(self, exists_mock, open_mock):
class MagicFile(object):
def read(self):
return """
#test line UID_MIN 200
UID_MIN 500
"""
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def __enter__(self):
return self
exists_mock.return_value = True
open_mock.return_value = MagicFile()
return self.get_system_min_uid_real()
@patch('os.path.exists')
@patch('os.path.isdir')
@patch('os.listdir')
def test_recommendTezConfigurations(self, os_listdir_mock, os_isdir_mock, os_exists_mock):
os_exists_mock.return_value = True
os_isdir_mock.return_value = True
os_listdir_mock.return_value = ['TEZ{0.7.0.2.3.0.0-2155}']
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "2048",
},
}
}
clusterData = {
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
"tez-site": {
"properties": {
# tez.am.resource.memory.mb must be <= yarn.scheduler.maximum-allocation-mb
'tez.queue.name': 'default',
"tez.am.resource.memory.mb": "2048",
"tez.task.resource.memory.mb": "768",
"tez.runtime.io.sort.mb": "307",
"tez.runtime.unordered.output.buffer.size-mb": "57",
'tez.session.am.dag.submit.timeout.secs': '600'
}
},
'yarn-site': {
'properties': {
'yarn.scheduler.minimum-allocation-mb': '256',
'yarn.scheduler.maximum-allocation-mb': '2048'
}
}
}
services = {
"ambari-server-properties": {}
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
server_host = socket.getfqdn()
for host in hosts["items"]:
if server_host == host["Hosts"]["host_name"]:
server_host = host["Hosts"]["public_host_name"]
tez_ui_url = "http://" + server_host + ":8080/#/main/views/TEZ/0.7.0.2.3.0.0-2155/TEZ_CLUSTER_INSTANCE"
services['ambari-server-properties'] = {'api.ssl': 'false'}
expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendTezConfigurations_amMemoryMoreThan3072(self):
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "2048",
},
}
}
clusterData = {
"mapMemory": 4000,
"amMemory": 3100,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
"tez-site": {
"properties": {
# tez.am.resource.memory.mb must be <= yarn.scheduler.maximum-allocation-mb
'tez.queue.name': 'default',
"tez.am.resource.memory.mb": "2048",
"tez.task.resource.memory.mb": "768",
"tez.runtime.io.sort.mb": "307",
"tez.runtime.unordered.output.buffer.size-mb": "57",
'tez.session.am.dag.submit.timeout.secs': '600'
}
},
'yarn-site': {
'properties': {
'yarn.scheduler.minimum-allocation-mb': '256',
'yarn.scheduler.maximum-allocation-mb': '2048'
}
}
}
services = {
"ambari-server-properties": {}
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendTezConfigurations_mapMemoryLessThan768(self):
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "2048",
},
}
}
clusterData = {
"mapMemory": 760,
"amMemory": 2000,
"reduceMemory": 760,
"containers": 3,
"ramPerContainer": 256
}
expected = {
"tez-site": {
"properties": {
# tez.am.resource.memory.mb must be <= yarn.scheduler.maximum-allocation-mb
'tez.queue.name': 'default',
"tez.am.resource.memory.mb": "2048",
"tez.task.resource.memory.mb": "760",
"tez.runtime.io.sort.mb": "304",
"tez.runtime.unordered.output.buffer.size-mb": "57",
'tez.session.am.dag.submit.timeout.secs': '600'
}
},
'yarn-site': {
'properties': {
'yarn.scheduler.minimum-allocation-mb': '256',
'yarn.scheduler.maximum-allocation-mb': '2048'
}
}
}
services = {
"ambari-server-properties": {}
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_validateHDFSConfigurations(self):
recommendedDefaults = {
'dfs.datanode.du.reserved': '1024'
}
unsecure_cluster_core_site = {
'hadoop.security.authentication': 'simple',
'hadoop.security.authorization': 'false',
}
secure_cluster_core_site = {
'hadoop.security.authentication': 'kerberos',
'hadoop.security.authorization': 'true',
}
# TEST CASE: Unsecured cluster, secure ports
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': unsecure_cluster_core_site
},
'ranger-hdfs-plugin-properties':{
'properties': {'ranger-hdfs-plugin-enabled':'Yes'}
}
}
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2",
}
}],
"configurations": {}
}
expected = [] # No warnings
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Unsecured cluster, unsecure ports
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.datanode.address': '0.0.0.0:55555',
'dfs.datanode.http.address': '0.0.0.0:55555',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': unsecure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [] # No warnings
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2",
},
}],
"configurations": {}
}
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, invalid dfs.http.policy value
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'WRONG_VALUE',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [{'config-name': 'dfs.http.policy',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "Invalid property value: WRONG_VALUE. Valid values are ['HTTP_ONLY', 'HTTPS_ONLY', 'HTTP_AND_HTTPS']",
'type': 'configuration'}]
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2",
},
}],
"configurations": {}
}
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, https address not defined
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:1019',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [ ]
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2",
}
}],
"configurations": {}
}
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, https address defined and secure
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.https.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = []
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2",
}
}],
"configurations": {}
}
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, https address defined and non secure
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.https.address': '0.0.0.0:50475',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = []
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2",
}
}],
"configurations": {}
}
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, non secure dfs port, https property not defined
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:50010',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [{'config-name': 'dfs.datanode.address',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "You set up datanode to use some non-secure ports. "
"If you want to run Datanode under non-root user in "
"a secure cluster, you should set all these properties "
"['dfs.datanode.address', 'dfs.datanode.https.address'] "
"to use non-secure ports (if property "
"dfs.datanode.https.address does not exist, just add it). "
"You may also set up property dfs.data.transfer.protection "
"('authentication' is a good default value). Also, set up "
"WebHDFS with SSL as described in manual in order to "
"be able to use HTTPS.",
'type': 'configuration'},
{'config-name': 'dfs.datanode.https.address',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "You set up datanode to use some non-secure ports. "
"If you want to run Datanode under non-root user in "
"a secure cluster, you should set all these properties "
"['dfs.datanode.address', 'dfs.datanode.https.address'] "
"to use non-secure ports (if property dfs.datanode.https.address "
"does not exist, just add it). You may also set up property "
"dfs.data.transfer.protection ('authentication' is a good default value). "
"Also, set up WebHDFS with SSL as described in manual in "
"order to be able to use HTTPS.",
'type': 'configuration'}
]
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, non secure dfs port, https defined and secure
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:50010',
'dfs.datanode.https.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [{'config-name': 'dfs.datanode.address',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "You set up datanode to use some non-secure ports. "
"If you want to run Datanode under non-root user in "
"a secure cluster, you should set all these properties "
"['dfs.datanode.address', 'dfs.datanode.https.address'] "
"to use non-secure ports (if property dfs.datanode.https.address "
"does not exist, just add it). You may also set up property "
"dfs.data.transfer.protection ('authentication' is a good "
"default value). Also, set up WebHDFS with SSL as described "
"in manual in order to be able to use HTTPS.",
'type': 'configuration'},
{'config-name': 'dfs.datanode.https.address',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "You set up datanode to use some non-secure ports. "
"If you want to run Datanode under non-root user in "
"a secure cluster, you should set all these properties "
"['dfs.datanode.address', 'dfs.datanode.https.address'] "
"to use non-secure ports (if property dfs.datanode.https.address "
"does not exist, just add it). You may also set up property "
"dfs.data.transfer.protection ('authentication' is a good default value). "
"Also, set up WebHDFS with SSL as described in manual in order to be "
"able to use HTTPS.",
'type': 'configuration'}
]
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, valid non-root configuration
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:50010',
'dfs.datanode.https.address': '0.0.0.0:50475',
'dfs.data.transfer.protection': 'authentication',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = []
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTP_ONLY, insecure port
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTP_ONLY',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:50475',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [{'config-name': 'dfs.datanode.address',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "You have set up datanode to use some non-secure ports, "
"but dfs.http.policy is set to HTTP_ONLY. In a secure cluster, "
"Datanode forbids using non-secure ports if dfs.http.policy is not "
"set to HTTPS_ONLY. Please make sure that properties "
"['dfs.datanode.address', 'dfs.datanode.http.address'] use secure ports.",
'type': 'configuration'},
{'config-name': 'dfs.datanode.http.address',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "You have set up datanode to use some non-secure ports, "
"but dfs.http.policy is set to HTTP_ONLY. In a secure cluster, "
"Datanode forbids using non-secure ports if dfs.http.policy is not "
"set to HTTPS_ONLY. Please make sure that properties "
"['dfs.datanode.address', 'dfs.datanode.http.address'] use secure ports.",
'type': 'configuration'}
]
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTP_ONLY, valid configuration
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTP_ONLY',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = []
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, absent dfs.http.policy (typical situation)
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = []
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTP_ONLY, misusage of dfs.data.transfer.protection warning
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTP_ONLY',
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:1022',
'dfs.data.transfer.protection': 'authentication',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [{'config-name': 'dfs.data.transfer.protection',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "dfs.data.transfer.protection property can not be used when dfs.http.policy is "
"set to any value other then HTTPS_ONLY. Tip: When dfs.http.policy property is not defined, it defaults to HTTP_ONLY",
'type': 'configuration'}]
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, wrong dfs.data.transfer.protection value
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.http.policy': 'HTTPS_ONLY',
'dfs.datanode.address': '0.0.0.0:50010',
'dfs.datanode.https.address': '0.0.0.0:50475',
'dfs.data.transfer.protection': 'WRONG_VALUE',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [{'config-name': 'dfs.data.transfer.protection',
'config-type': 'hdfs-site',
'level': 'WARN',
'message': "Invalid property value: WRONG_VALUE. Valid values are ['authentication', 'integrity', 'privacy'].",
'type': 'configuration'}]
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
# TEST CASE: Hadoop wire encryption enabled
properties = { # hdfs-site
'dfs.datanode.du.reserved': '1024',
'dfs.datanode.data.dir': '/hadoop/hdfs/data',
'dfs.encrypt.data.transfer': 'true', # Wire encryption
'dfs.datanode.address': '0.0.0.0:1019',
'dfs.datanode.http.address': '0.0.0.0:1022',
}
configurations = {
'hdfs-site': {
'properties': properties,
},
'core-site': {
'properties': secure_cluster_core_site
},
'ranger-hdfs-plugin-properties': {
'properties':{
'ranger-hdfs-plugin-enabled':'Yes'
}
}
}
expected = [] # No warnings
validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None)
self.assertEquals(validation_problems, expected)
def test_recommendYARNConfigurations(self):
configurations = {}
services = {"configurations": configurations}
services['services'] = [
{
"StackServices": {
"service_name": "HDFS"
},
},
{
"StackServices": {
"service_name": "YARN"
},
},
{
"StackServices": {
"service_name": "SLIDER"
},
}
]
clusterData = {
"cpu": 4,
"containers" : 5,
"ramPerContainer": 256
}
expected = {
"yarn-env": {
"properties": {
"min_user_id": "500",
'service_check.queue.name': 'default'
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.resource.memory-mb": "1280",
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "1280",
"yarn.scheduler.maximum-allocation-vcores": "4",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.nodemanager.resource.cpu-vcores": "4",
"hadoop.registry.rm.enabled": "true"
}
}
}
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected)
def test_recommendSPARKConfigurations(self):
configurations = {}
services = {"configurations": configurations}
services['services'] = [
{
"StackServices": {
"service_name": "SPARK"
},
}
]
clusterData = {
"cpu": 4,
"containers": 5,
"ramPerContainer": 256
}
expected = {
"spark-defaults": {
"properties": {
"spark.yarn.queue": "default"
}
}
}
self.stackAdvisor.recommendSparkConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected)
def test_recommendYARNConfigurationAttributes(self):
configurations = {
"yarn-env": {
"properties": {
"min_user_id": "500"
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.resource.memory-mb": "1280",
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "1280",
"yarn.nodemanager.resource.cpu-vcores": "2"
},
}
}
clusterData = {
"cpu": 4,
"containers" : 5,
"ramPerContainer": 256
}
expected = {
"yarn-env": {
"properties": {
"min_user_id": "500",
'service_check.queue.name': 'default'
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.resource.memory-mb": "1280",
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-vcores": "2",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.scheduler.maximum-allocation-mb": "1280",
"yarn.nodemanager.resource.cpu-vcores": "2",
"hadoop.registry.rm.enabled": "false"
},
"property_attributes": {
'yarn.nodemanager.resource.memory-mb': {'maximum': '1877'},
'yarn.nodemanager.resource.cpu-vcores': {'maximum': '2'},
'yarn.scheduler.minimum-allocation-vcores': {'maximum': '2'},
'yarn.scheduler.maximum-allocation-vcores': {'maximum': '2'},
'yarn.scheduler.minimum-allocation-mb': {'maximum': '1280'},
'yarn.scheduler.maximum-allocation-mb': {'maximum': '1280'}
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": configurations,
"changed-configurations": [
{
"type": "yarn-site",
"name": "yarn.nodemanager.resource.memory-mb",
"old_value": "512"
},
{
"type": "yarn-site",
"name": "yarn.scheduler.minimum-allocation-mb",
"old_value": "512"
},
{
"type": "yarn-site",
"name": "yarn.scheduler.maximum-allocation-mb",
"old_value": "512"
},
{
"type": "yarn-site",
"name": "yarn.nodemanager.resource.cpu-vcores"
},
{
"type": "yarn-env",
"name": "min_user_id"
},
]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test host NodeManager CPU cores
hosts["items"][2]["Hosts"]["cpu_count"] = 6
services["changed-configurations"].remove({
"type": "yarn-site",
"name": "yarn.nodemanager.resource.cpu-vcores"
})
configurations["yarn-site"]["properties"].pop("yarn.nodemanager.resource.cpu-vcores", None)
expected["yarn-site"]["properties"]["yarn.nodemanager.resource.cpu-vcores"] = '4'
expected["yarn-site"]["properties"]["yarn.scheduler.minimum-allocation-vcores"] = '1'
expected["yarn-site"]["properties"]["yarn.scheduler.maximum-allocation-vcores"] = '4'
expected["yarn-site"]["property_attributes"]["yarn.nodemanager.resource.cpu-vcores"]["maximum"] = '12'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-vcores"]["maximum"] = '4'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-vcores"]["maximum"] = '4'
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test host NodeManager CPU cores and 'yarn.nodemanager.resource.percentage-physical-cpu-limit'
hosts["items"][2]["Hosts"]["cpu_count"] = 10
configurations["yarn-site"]["properties"]["yarn.nodemanager.resource.percentage-physical-cpu-limit"] = '0.5'
services["changed-configurations"].append({
"type": "yarn-site",
"name": "yarn.nodemanager.resource.percentage-physical-cpu-limit",
"old_value": "6"
})
expected["yarn-site"]["properties"]["yarn.nodemanager.resource.cpu-vcores"] = '5'
expected["yarn-site"]["properties"]["yarn.scheduler.minimum-allocation-vcores"] = '1'
expected["yarn-site"]["properties"]["yarn.scheduler.maximum-allocation-vcores"] = '5'
expected["yarn-site"]["properties"]["yarn.nodemanager.resource.percentage-physical-cpu-limit"] = '0.5'
expected["yarn-site"]["property_attributes"]["yarn.nodemanager.resource.cpu-vcores"]["maximum"] = '20'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-vcores"]["maximum"] = '5'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-vcores"]["maximum"] = '5'
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test - with no 'changed-configurations', we should get updated 'maximum's.
services.pop("changed-configurations", None)
services.pop("configurations", None)
services["configurations"] = {"yarn-site": {"properties": {"yarn.nodemanager.resource.memory-mb": '4321', "yarn.nodemanager.resource.cpu-vcores": '9'}}}
expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-vcores"]["maximum"] = '9'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-vcores"]["maximum"] = '9'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-mb"]["maximum"] = '4321'
expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-mb"]["maximum"] = '4321'
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendHiveConfigurationAttributes(self):
self.maxDiff = None
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "256",
"yarn.scheduler.maximum-allocation-mb": "8192"
}
}
}
clusterData = {
"cpu": 4,
"mapMemory": 3000,
"amMemory": 2000,
"reduceMemory": 2056,
"containers": 3,
"ramPerContainer": 256
}
expected = {
'yarn-site': {
'properties': {
'yarn.scheduler.minimum-allocation-mb': '256',
'yarn.scheduler.maximum-allocation-mb': '8192'
}
},
'hive-env': {
'properties': {
'hive_exec_orc_storage_strategy': 'SPEED',
'hive_security_authorization': 'None',
'hive_timeline_logging_enabled': 'true',
'hive_txn_acid': 'off'
}
},
'hive-site': {
'properties': {
'hive.server2.enable.doAs': 'true',
'hive.server2.tez.default.queues': "queue1,queue2",
'hive.server2.tez.initialize.default.sessions': 'false',
'hive.server2.tez.sessions.per.default.queue': '1',
'hive.auto.convert.join.noconditionaltask.size': '214748364',
'hive.compactor.initiator.on': 'false',
'hive.compactor.worker.threads': '0',
'hive.compute.query.using.stats': 'true',
'hive.enforce.bucketing': 'false',
'hive.exec.dynamic.partition.mode': 'strict',
'hive.exec.failure.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.orc.compression.strategy': 'SPEED',
'hive.exec.orc.default.compress': 'ZLIB',
'hive.exec.orc.default.stripe.size': '67108864',
'hive.exec.orc.encoding.strategy': 'SPEED',
'hive.exec.post.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.pre.hooks': 'org.apache.hadoop.hive.ql.hooks.ATSHook',
'hive.exec.reducers.bytes.per.reducer': '67108864',
'hive.execution.engine': 'mr',
'hive.optimize.index.filter': 'true',
'hive.optimize.sort.dynamic.partition': 'false',
'hive.prewarm.enabled': 'false',
'hive.prewarm.numcontainers': '3',
'hive.security.authorization.enabled': 'false',
'hive.server2.use.SSL': 'false',
'hive.stats.fetch.column.stats': 'true',
'hive.stats.fetch.partition.stats': 'true',
'hive.support.concurrency': 'false',
'hive.tez.auto.reducer.parallelism': 'true',
'hive.tez.container.size': '768',
'hive.tez.dynamic.partition.pruning': 'true',
'hive.tez.java.opts': '-server -Xmx615m -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseParallelGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps',
'hive.txn.manager': 'org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager',
'hive.vectorized.execution.enabled': 'true',
'hive.vectorized.execution.reduce.enabled': 'false',
'hive.security.metastore.authorization.manager': 'org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider',
'hive.security.authorization.manager': 'org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory',
'hive.metastore.uris' : 'thrift://c6402.ambari.apache.org:9083'
},
'property_attributes': {
'hive.auto.convert.join.noconditionaltask.size': {'maximum': '644245094'},
'hive.tez.container.size': {'maximum': '8192', 'minimum': '256'},
'hive.server2.authentication.pam.services': {'delete': 'true'},
'hive.server2.custom.authentication.class': {'delete': 'true'},
'hive.server2.authentication.kerberos.principal': {'delete': 'true'},
'hive.server2.authentication.kerberos.keytab': {'delete': 'true'},
'hive.server2.authentication.ldap.url': {'delete': 'true'},
'hive.server2.tez.default.queues': {
"entries": [
{
"value": "queue1",
"label": "queue1 queue"
},
{
"value": "queue2",
"label": "queue2 queue"
}
]
}
}
},
'hiveserver2-site': {
'properties': {
},
'property_attributes': {
'hive.security.authorization.manager': {'delete': 'true'},
'hive.security.authenticator.manager': {'delete': 'true'},
'hive.conf.restricted.list': {'delete': 'true'}
}
},
'webhcat-site': {
'properties': {
'templeton.hadoop.queue.name': 'queue1'
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/HIVE",
"StackServices": {
"service_name": "HIVE",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "HIVE_METASTORE",
"display_name": "HiveServer2",
"is_client": "false",
"is_master": "true",
"hostnames": [
"c6402.ambari.apache.org"
]
},
"dependencies": []
}
,
],
},
],
"configurations": {
"capacity-scheduler": {
"properties": {
"yarn.scheduler.capacity.root.queues": "queue1,queue2"
}
},
"hive-env": {
"properties": {
}
},
"hive-site": {
"properties": {
"hive.server2.authentication": "none",
"hive.server2.authentication.ldap.url": "",
"hive.server2.authentication.ldap.baseDN": "",
"hive.server2.authentication.kerberos.keytab": "",
"hive.server2.authentication.kerberos.principal": "",
"hive.server2.authentication.pam.services": "",
"hive.server2.custom.authentication.class": "",
"hive.cbo.enable": "true"
}
},
"hiveserver2-site": {
"properties": {
"hive.security.authorization.manager": "",
"hive.security.authenticator.manager": "",
"hive.conf.restricted.list": ""
}
}
},
"changed-configurations": [ ]
}
hiveService = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/HIVE",
"StackServices": {
"service_name": "HIVE",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "HIVE_SERVER",
"display_name": "HiveServer2",
"is_client": "false",
"is_master": "true",
"hostnames": [
"c6402.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "HIVE_CLIENT",
"display_name": "Hive Client",
"is_client": "true",
"is_master": "false",
"hostnames": [
"c6402.ambari.apache.org",
"c6403.ambari.apache.org"
]
},
"dependencies": []
}
]
},
],
"configurations": {
"hive-env": {
"properties": {
"hive.heapsize": "200",
"hive.metastore.heapsize": "200",
"hive.client.heapsize": "200"
}
},
"hive-site": {
"properties": {
"hive.server2.authentication": "none",
"hive.server2.authentication.ldap.url": "",
"hive.server2.authentication.ldap.baseDN": "",
"hive.server2.authentication.kerberos.keytab": "",
"hive.server2.authentication.kerberos.principal": "",
"hive.server2.authentication.pam.services": "",
"hive.server2.custom.authentication.class": "",
"hive.cbo.enable": "true"
}
},
"hiveserver2-site": {
"properties": {
"hive.security.authorization.manager": "",
"hive.security.authenticator.manager": "",
"hive.conf.restricted.list": ""
}
}
},
"changed-configurations": [ ]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
#test recommendations
services["configurations"]["hive-site"]["properties"]["hive.cbo.enable"] = "false"
services["configurations"]["hive-env"]["properties"]["hive_security_authorization"] = "sqlstdauth"
services["changed-configurations"] = [{"type": "hive-env", "name": "hive_security_authorization"}]
expected["hive-env"]["properties"]["hive_security_authorization"] = "sqlstdauth"
expected["hive-site"]["properties"]["hive.stats.fetch.partition.stats"]="false"
expected["hive-site"]["properties"]["hive.stats.fetch.column.stats"]="false"
expected["hive-site"]["properties"]["hive.security.authorization.enabled"]="true"
expected["hive-site"]["properties"]["hive.server2.enable.doAs"]="false"
expected["hive-site"]["properties"]["hive.security.metastore.authorization.manager"]=\
"org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider,org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly"
expected["hiveserver2-site"]["properties"]["hive.security.authorization.enabled"]="true"
expected["hiveserver2-site"]["properties"]["hive.security.authorization.manager"]="org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory"
expected["hiveserver2-site"]["properties"]["hive.security.authenticator.manager"]="org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator"
expected["hiveserver2-site"]["properties"]["hive.conf.restricted.list"]="hive.security.authenticator.manager,hive.security.authorization.manager,hive.users.in.admin.role"
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# test 'hive_security_authorization'=='sqlstdauth' => 'hive.server2.enable.doAs'=='false'
services["configurations"]["hive-env"]["properties"]["hive_security_authorization"] = "none"
expected["hive-env"]["properties"]["hive_security_authorization"] = "none"
expected["hive-site"]["properties"]["hive.security.authorization.enabled"]="false"
expected["hive-site"]["properties"]["hive.server2.enable.doAs"]="true"
expected["hive-site"]["properties"]["hive.security.metastore.authorization.manager"]=\
"org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider"
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# test 'hive.server2.tez.default.queues' leaf queues
services["configurations"]['capacity-scheduler']['properties'] = {
"capacity-scheduler" : "yarn.scheduler.capacity.maximum-am-resource-percent=0.2\n"
"yarn.scheduler.capacity.maximum-applications=10000\n"
"yarn.scheduler.capacity.node-locality-delay=40\n"
"yarn.scheduler.capacity.queue-mappings-override.enable=false\n"
"yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator\n"
"yarn.scheduler.capacity.root.accessible-node-labels=*\n"
"yarn.scheduler.capacity.root.acl_administer_queue=*\n"
"yarn.scheduler.capacity.root.capacity=100\n"
"yarn.scheduler.capacity.root.default.a.a1.acl_administer_queue=*\n"
"yarn.scheduler.capacity.root.default.a.a1.acl_submit_applications=*\n"
"yarn.scheduler.capacity.root.default.a.a1.capacity=75\n"
"yarn.scheduler.capacity.root.default.a.a1.maximum-capacity=100\n"
"yarn.scheduler.capacity.root.default.a.a1.minimum-user-limit-percent=100\n"
"yarn.scheduler.capacity.root.default.a.a1.ordering-policy=fifo\n"
"yarn.scheduler.capacity.root.default.a.a1.state=RUNNING\n"
"yarn.scheduler.capacity.root.default.a.a1.user-limit-factor=1\n"
"yarn.scheduler.capacity.root.default.a.a2.acl_administer_queue=*\n"
"yarn.scheduler.capacity.root.default.a.a2.acl_submit_applications=*\n"
"yarn.scheduler.capacity.root.default.a.a2.capacity=25\n"
"yarn.scheduler.capacity.root.default.a.a2.maximum-capacity=25\n"
"yarn.scheduler.capacity.root.default.a.a2.minimum-user-limit-percent=100\n"
"yarn.scheduler.capacity.root.default.a.a2.ordering-policy=fifo\n"
"yarn.scheduler.capacity.root.default.a.a2.state=RUNNING\n"
"yarn.scheduler.capacity.root.default.a.a2.user-limit-factor=1\n"
"yarn.scheduler.capacity.root.default.a.acl_administer_queue=*\n"
"yarn.scheduler.capacity.root.default.a.acl_submit_applications=*\n"
"yarn.scheduler.capacity.root.default.a.capacity=50\n"
"yarn.scheduler.capacity.root.default.a.maximum-capacity=100\n"
"yarn.scheduler.capacity.root.default.a.minimum-user-limit-percent=100\n"
"yarn.scheduler.capacity.root.default.a.ordering-policy=fifo\n"
"yarn.scheduler.capacity.root.default.a.queues=a1,a2\n"
"yarn.scheduler.capacity.root.default.a.state=RUNNING\n"
"yarn.scheduler.capacity.root.default.a.user-limit-factor=1\n"
"yarn.scheduler.capacity.root.default.acl_submit_applications=*\n"
"yarn.scheduler.capacity.root.default.b.acl_administer_queue=*\n"
"yarn.scheduler.capacity.root.default.b.acl_submit_applications=*\n"
"yarn.scheduler.capacity.root.default.b.capacity=50\n"
"yarn.scheduler.capacity.root.default.b.maximum-capacity=50\n"
"yarn.scheduler.capacity.root.default.b.minimum-user-limit-percent=100\n"
"yarn.scheduler.capacity.root.default.b.ordering-policy=fifo\n"
"yarn.scheduler.capacity.root.default.b.state=RUNNING\n"
"yarn.scheduler.capacity.root.default.b.user-limit-factor=1\n"
"yarn.scheduler.capacity.root.default.capacity=100\n"
"yarn.scheduler.capacity.root.default.maximum-capacity=100\n"
"yarn.scheduler.capacity.root.default.queues=a,b\n"
"yarn.scheduler.capacity.root.default.state=RUNNING\n"
"yarn.scheduler.capacity.root.default.user-limit-factor=1\n"
"yarn.scheduler.capacity.root.queues=default"}
expected['hive-site']['properties']['hive.server2.tez.default.queues'] = 'a1,a2,b'
expected['hive-site']['property_attributes']['hive.server2.tez.default.queues'] = {
'entries': [{'value': 'a1', 'label': 'a1 queue'}, {'value': 'a2', 'label': 'a2 queue'}, {'value': 'b', 'label': 'b queue'}]
}
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations['hive-site']['property_attributes']['hive.server2.tez.default.queues'], expected['hive-site']['property_attributes']['hive.server2.tez.default.queues'])
self.assertEquals(configurations['hive-site']['properties']['hive.server2.tez.default.queues'], expected['hive-site']['properties']['hive.server2.tez.default.queues'])
# Hive heapsize properties
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, hiveService, hosts)
# Recommended default values
self.assertEquals(configurations["hive-env"]["properties"]["hive.metastore.heapsize"], "512")
self.assertEquals(configurations["hive-env"]["properties"]["hive.heapsize"], "703")
self.assertEquals(configurations["hive-env"]["properties"]["hive.client.heapsize"], "1024")
# Recommended attributes for maximum values, minimum values defined in stack definition
self.assertEquals(configurations["hive-env"]["property_attributes"]["hive.heapsize"]["maximum"], "1877")
self.assertEquals(configurations["hive-env"]["property_attributes"]["hive.metastore.heapsize"]["maximum"], "1877")
self.assertEquals(configurations["hive-env"]["property_attributes"]["hive.client.heapsize"]["maximum"], "1877")
# test 'hive_security_authorization'=='ranger'
services["configurations"]["hive-env"]["properties"]["hive_security_authorization"] = "ranger"
expected["hiveserver2-site"]["properties"]["hive.security.authenticator.manager"] = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator"
expected["hiveserver2-site"]["properties"]["hive.security.authorization.manager"] = "com.xasecure.authorization.hive.authorizer.XaSecureHiveAuthorizerFactory"
expected["hiveserver2-site"]["properties"]["hive.security.authorization.enabled"] = "true"
expected["hiveserver2-site"]["properties"]["hive.conf.restricted.list"]="hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager"
self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations['hiveserver2-site'], expected["hiveserver2-site"])
def test_recommendMapredConfigurationAttributesWithPigService(self):
configurations = {
"mapred-site": {
"properties": {
"mapreduce.map.memory.mb": "1024",
"mapreduce.reduce.memory.mb": "682",
"yarn.app.mapreduce.am.command-opts": "-Xmx546m -Dhdp.version=${hdp.version}",
"mapreduce.reduce.java.opts": "-Xmx546m",
"yarn.app.mapreduce.am.resource.mb": "682",
"mapreduce.map.java.opts": "-Xmx546m",
"mapreduce.task.io.sort.mb": "273"
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.resource.memory-mb": "2048",
"yarn.scheduler.minimum-allocation-mb": "100",
"yarn.scheduler.maximum-allocation-mb": "2048",
"yarn.nodemanager.resource.cpu-vcores": "2"
},
},
"cluster-env": {
"properties": {
"user_group": "hadoopcustom",
}
}
}
clusterData = {
"cpu": 4,
"containers" : 7,
"ramPerContainer": 256,
"totalAvailableRam": 4096,
}
expected = {
"cluster-env": {
"properties": {
"user_group": "hadoopcustom"
}
},
"yarn-env": {
"properties": {
"min_user_id": "500",
'service_check.queue.name': 'default'
}
},
"mapred-site": {
"properties": {
'mapreduce.job.queuename': 'default',
"mapreduce.map.memory.mb": "1536",
"mapreduce.reduce.memory.mb": "1536",
"yarn.app.mapreduce.am.command-opts": "-Xmx80m -Dhdp.version=${hdp.version}",
"mapreduce.reduce.java.opts": "-Xmx1228m",
"yarn.app.mapreduce.am.resource.mb": "100",
"mapreduce.map.java.opts": "-Xmx1228m",
"mapreduce.task.io.sort.mb": "859"
},
"property_attributes": {
'mapreduce.task.io.sort.mb': {'maximum': '2047'},
'yarn.app.mapreduce.am.resource.mb': {'maximum': '1792',
'minimum': '100'},
'mapreduce.map.memory.mb': {'maximum': '1792',
'minimum': '100'},
'mapreduce.reduce.memory.mb': {'maximum': '1792',
'minimum': '100'}
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoopcustom",
"yarn.nodemanager.resource.memory-mb": "1792",
"yarn.scheduler.minimum-allocation-mb": "100",
"yarn.scheduler.maximum-allocation-vcores": "1",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.scheduler.maximum-allocation-mb": "1792",
"yarn.nodemanager.resource.cpu-vcores": "1",
"hadoop.registry.rm.enabled": "false"
},
"property_attributes": {
'yarn.nodemanager.resource.memory-mb': {'maximum': '1877'},
'yarn.nodemanager.resource.cpu-vcores': {'maximum': '2'},
'yarn.scheduler.minimum-allocation-vcores': {'maximum': '1'},
'yarn.scheduler.maximum-allocation-vcores': {'maximum': '1'},
'yarn.scheduler.minimum-allocation-mb': {'maximum': '1792'},
'yarn.scheduler.maximum-allocation-mb': {'maximum': '1792'}
}
}
}
services = {
"services": [
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/PIG",
"StackServices": {
"service_name": "PIG",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
}, "components": [
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "0+",
"component_category": "CLIENT",
"component_name": "PIG",
"display_name": "Pig",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
{
"href" : "/api/v1/stacks/HDP/versions/2.2/services/MAPREDUCE2",
"StackServices" : {
"service_name" : "MAPREDUCE2",
"service_version" : "2.6.0.2.2",
"stack_name" : "HDP",
"stack_version" : "2.2"
},
"components" : [ {
"href" : "/api/v1/stacks/HDP/versions/2.2/services/MAPREDUCE2/components/HISTORYSERVER",
"StackServiceComponents" : {
"advertise_version" : "true",
"cardinality" : "1",
"component_category" : "MASTER",
"component_name" : "HISTORYSERVER",
"custom_commands" : [ ],
"display_name" : "History Server",
"is_client" : "false",
"is_master" : "true",
"service_name" : "MAPREDUCE2",
"stack_name" : "HDP",
"stack_version" : "2.2",
"hostnames" : [ "c6402.ambari.apache.org" ]
},
"auto_deploy" : {
"enabled" : "true",
"location" : "YARN/RESOURCEMANAGER"
},
"dependencies" : [ {
"href" : "/api/v1/stacks/HDP/versions/2.2/services/MAPREDUCE2/components/HISTORYSERVER/dependencies/HDFS_CLIENT",
"Dependencies" : {
"component_name" : "HDFS_CLIENT",
"dependent_component_name" : "HISTORYSERVER",
"dependent_service_name" : "MAPREDUCE2",
"stack_name" : "HDP",
"stack_version" : "2.2"
}
} ]
}]},
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": configurations,
"changed-configurations": [
{
"type": "yarn-site",
"name": "yarn.scheduler.minimum-allocation-mb",
"old_value": "512"
},
]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendMapredConfigurationAttributes(self):
configurations = {
"mapred-site": {
"properties": {
"mapreduce.map.memory.mb": "1024",
"mapreduce.reduce.memory.mb": "682",
"yarn.app.mapreduce.am.command-opts": "-Xmx546m -Dhdp.version=${hdp.version}",
"mapreduce.reduce.java.opts": "-Xmx546m",
"yarn.app.mapreduce.am.resource.mb": "682",
"mapreduce.map.java.opts": "-Xmx546m",
"mapreduce.task.io.sort.mb": "273"
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.resource.memory-mb": "1280",
"yarn.scheduler.minimum-allocation-mb": "100",
"yarn.scheduler.maximum-allocation-mb": "1280",
"yarn.nodemanager.resource.cpu-vcores": "2"
},
}
}
clusterData = {
"cpu": 4,
"containers" : 5,
"ramPerContainer": 256
}
expected = {
"yarn-env": {
"properties": {
"min_user_id": "500",
'service_check.queue.name': 'default'
}
},
"mapred-site": {
"properties": {
'mapreduce.job.queuename': 'default',
"mapreduce.map.memory.mb": "100",
"mapreduce.reduce.memory.mb": "200",
"yarn.app.mapreduce.am.command-opts": "-Xmx80m -Dhdp.version=${hdp.version}",
"mapreduce.reduce.java.opts": "-Xmx160m",
"yarn.app.mapreduce.am.resource.mb": "100",
"mapreduce.map.java.opts": "-Xmx80m",
"mapreduce.task.io.sort.mb": "56"
},
"property_attributes": {
'mapreduce.task.io.sort.mb': {'maximum': '2047'},
'yarn.app.mapreduce.am.resource.mb': {'maximum': '1280',
'minimum': '100'},
'mapreduce.map.memory.mb': {'maximum': '1280',
'minimum': '100'},
'mapreduce.reduce.memory.mb': {'maximum': '1280',
'minimum': '100'}
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.resource.memory-mb": "1280",
"yarn.scheduler.minimum-allocation-mb": "100",
"yarn.scheduler.maximum-allocation-vcores": "1",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.scheduler.maximum-allocation-mb": "1280",
"yarn.nodemanager.resource.cpu-vcores": "1",
"hadoop.registry.rm.enabled": "false"
},
"property_attributes": {
'yarn.nodemanager.resource.memory-mb': {'maximum': '1877'},
'yarn.nodemanager.resource.cpu-vcores': {'maximum': '2'},
'yarn.scheduler.minimum-allocation-vcores': {'maximum': '1'},
'yarn.scheduler.maximum-allocation-vcores': {'maximum': '1'},
'yarn.scheduler.minimum-allocation-mb': {'maximum': '1280'},
'yarn.scheduler.maximum-allocation-mb': {'maximum': '1280'}
}
}
}
services = {
"services": [
{
"href" : "/api/v1/stacks/HDP/versions/2.2/services/MAPREDUCE2",
"StackServices" : {
"service_name" : "MAPREDUCE2",
"service_version" : "2.6.0.2.2",
"stack_name" : "HDP",
"stack_version" : "2.2"
},
"components" : [ {
"href" : "/api/v1/stacks/HDP/versions/2.2/services/MAPREDUCE2/components/HISTORYSERVER",
"StackServiceComponents" : {
"advertise_version" : "true",
"cardinality" : "1",
"component_category" : "MASTER",
"component_name" : "HISTORYSERVER",
"custom_commands" : [ ],
"display_name" : "History Server",
"is_client" : "false",
"is_master" : "true",
"service_name" : "MAPREDUCE2",
"stack_name" : "HDP",
"stack_version" : "2.2",
"hostnames" : [ "c6402.ambari.apache.org" ]
},
"auto_deploy" : {
"enabled" : "true",
"location" : "YARN/RESOURCEMANAGER"
},
"dependencies" : [ {
"href" : "/api/v1/stacks/HDP/versions/2.2/services/MAPREDUCE2/components/HISTORYSERVER/dependencies/HDFS_CLIENT",
"Dependencies" : {
"component_name" : "HDFS_CLIENT",
"dependent_component_name" : "HISTORYSERVER",
"dependent_service_name" : "MAPREDUCE2",
"stack_name" : "HDP",
"stack_version" : "2.2"
}
} ]
}]},
{
"href": "/api/v1/stacks/HDP/versions/2.2/services/YARN",
"StackServices": {
"service_name": "YARN",
"service_version": "2.6.0.2.2",
"stack_name": "HDP",
"stack_version": "2.2"
},
"components": [
{
"StackServiceComponents": {
"advertise_version": "false",
"cardinality": "1",
"component_category": "MASTER",
"component_name": "APP_TIMELINE_SERVER",
"display_name": "App Timeline Server",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "SLAVE",
"component_name": "NODEMANAGER",
"display_name": "NodeManager",
"is_client": "false",
"is_master": "false",
"hostnames": [
"c6403.ambari.apache.org"
]
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1-2",
"component_category": "MASTER",
"component_name": "RESOURCEMANAGER",
"display_name": "ResourceManager",
"is_client": "false",
"is_master": "true",
"hostnames": []
},
"dependencies": []
},
{
"StackServiceComponents": {
"advertise_version": "true",
"cardinality": "1+",
"component_category": "CLIENT",
"component_name": "YARN_CLIENT",
"display_name": "YARN Client",
"is_client": "true",
"is_master": "false",
"hostnames": []
},
"dependencies": []
}
]
},
],
"configurations": configurations,
"changed-configurations": [
{
"type": "yarn-site",
"name": "yarn.scheduler.minimum-allocation-mb",
"old_value": "512"
},
]
}
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/c6401.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6401.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6401.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6402.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6402.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6402.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
},
{
"href" : "/api/v1/hosts/c6403.ambari.apache.org",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "c6403.ambari.apache.org",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "c6403.ambari.apache.org",
"rack_info" : "/default-rack",
"total_mem" : 1922680
}
}
]
}
self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
configurations["yarn-site"]["properties"]["yarn.scheduler.minimum-allocation-mb"] = "700"
expected = {
"yarn-env": {
"properties": {
"min_user_id": "500",
'service_check.queue.name': 'default'
}
},
"mapred-site": {
"properties": {
'mapreduce.job.queuename': 'default',
"mapreduce.map.memory.mb": "700",
"mapreduce.reduce.memory.mb": "1280",
"yarn.app.mapreduce.am.command-opts": "-Xmx560m -Dhdp.version=${hdp.version}",
"mapreduce.reduce.java.opts": "-Xmx1024m",
"yarn.app.mapreduce.am.resource.mb": "700",
"mapreduce.map.java.opts": "-Xmx560m",
"mapreduce.task.io.sort.mb": "392"
},
"property_attributes": {
'mapreduce.task.io.sort.mb': {'maximum': '2047'},
'yarn.app.mapreduce.am.resource.mb': {'maximum': '1280',
'minimum': '700'},
'mapreduce.map.memory.mb': {'maximum': '1280',
'minimum': '700'},
'mapreduce.reduce.memory.mb': {'maximum': '1280',
'minimum': '700'}
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.resource.memory-mb": "1280",
"yarn.scheduler.minimum-allocation-mb": "700",
"yarn.scheduler.maximum-allocation-vcores": "1",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.scheduler.maximum-allocation-mb": "1280",
"yarn.nodemanager.resource.cpu-vcores": "1",
"hadoop.registry.rm.enabled": "false"
},
"property_attributes": {
'yarn.nodemanager.resource.memory-mb': {'maximum': '1877'},
'yarn.nodemanager.resource.cpu-vcores': {'maximum': '2'},
'yarn.scheduler.minimum-allocation-vcores': {'maximum': '1'},
'yarn.scheduler.maximum-allocation-vcores': {'maximum': '1'},
'yarn.scheduler.minimum-allocation-mb': {'maximum': '1280'},
'yarn.scheduler.maximum-allocation-mb': {'maximum': '1280'}
}
}
}
self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_recommendAmsConfigurations(self):
configurations = {}
clusterData = {}
services = {
"services": [ {
"StackServices": {
"service_name": "AMBARI_METRICS"
},
"components": [{
"StackServiceComponents": {
"component_name": "METRICS_COLLECTOR",
"hostnames": ["host1"]
}
}, {
"StackServiceComponents": {
"component_name": "METRICS_MONITOR",
"hostnames": ["host1"]
}
}]
}],
"configurations": []
}
hosts = {
"items": [{
"Hosts": {
"host_name": "host1",
}
}]
}
# 1-node cluster
expected = {
"ams-hbase-env": {
"properties": {
"hbase_master_xmn_size": "192",
"hbase_master_heapsize": "512",
"hbase_regionserver_heapsize": "768"
}
},
"ams-grafana-env": {
"properties" : {},
"property_attributes": {
"metrics_grafana_password": {
"visible": "false"
}
}
},
"ams-env": {
"properties": {
"metrics_collector_heapsize": "512",
}
},
"ams-hbase-site": {
"properties": {
"phoenix.coprocessor.maxMetaDataCacheSize": "20480000",
"hbase.regionserver.global.memstore.lowerLimit": "0.3",
"hbase.regionserver.global.memstore.upperLimit": "0.35",
"hbase.hregion.memstore.flush.size": "134217728",
"hfile.block.cache.size": "0.3",
"hbase.cluster.distributed": "false",
"hbase.rootdir": "file:///var/lib/ambari-metrics-collector/hbase",
"hbase.tmp.dir": "/var/lib/ambari-metrics-collector/hbase-tmp",
"hbase.zookeeper.property.clientPort": "61181",
}
},
"ams-site": {
"properties": {
"timeline.metrics.cluster.aggregate.splitpoints": "master.FileSystem.MetaHlogSplitTime_75th_percentile",
"timeline.metrics.host.aggregate.splitpoints": "master.FileSystem.MetaHlogSplitTime_75th_percentile",
"timeline.metrics.host.aggregator.ttl": "86400",
"timeline.metrics.service.handler.thread.count": "20",
'timeline.metrics.service.webapp.address': 'host1:6188',
'timeline.metrics.service.watcher.disabled': 'false'
}
}
}
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# 100-nodes cluster, but still only 1 sink (METRICS_COLLECTOR)
for i in range(2, 201):
hosts['items'].extend([{
"Hosts": {
"host_name": "host" + str(i)
}
}])
services['services'] = [
{
"StackServices": {
"service_name": "AMBARI_METRICS"
},
"components": [
{
"StackServiceComponents": {
"component_name": "METRICS_COLLECTOR",
"hostnames": ["host1"]
}
},
{
"StackServiceComponents": {
"component_name": "METRICS_MONITOR",
"hostnames": ["host" + str(i) for i in range(1, 201)]
}
}
]
}
]
expected["ams-hbase-env"]['properties']['hbase_master_heapsize'] = '1408'
expected["ams-hbase-env"]['properties']['hbase_master_xmn_size'] = '320'
expected["ams-env"]['properties']['metrics_collector_heapsize'] = '512'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Still 100 nodes, but with HDFS and YARN services installed on all nodes
services['services'] = [
{
"StackServices": {
"service_name": "HDFS"
},
"components": [
{
"StackServiceComponents": {
"component_name": "NAMENODE",
"hostnames": ["host1"]
}
},
{
"StackServiceComponents": {
"component_name": "DATANODE",
"hostnames": ["host" + str(i) for i in range(1, 201)]
}
}
]
},
{
"StackServices": {
"service_name": "YARN"
},
"components": [
{
"StackServiceComponents": {
"component_name": "RESOURCEMANAGER",
"hostnames": ["host1"]
}
},
{
"StackServiceComponents": {
"component_name": "NODEMANAGER",
"hostnames": ["host" + str(i) for i in range(1, 201)]
}
}
]
},
{
"StackServices": {
"service_name": "AMBARI_METRICS"
},
"components": [
{
"StackServiceComponents": {
"component_name": "METRICS_COLLECTOR",
"hostnames": ["host1"]
}
},
{
"StackServiceComponents": {
"component_name": "METRICS_MONITOR",
"hostnames": ["host" + str(i) for i in range(1, 201)]
}
}
]
}
]
expected["ams-site"]['properties']['timeline.metrics.host.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected["ams-site"]['properties']['timeline.metrics.cluster.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected["ams-hbase-env"]['properties']['hbase_master_heapsize'] = '2432'
expected["ams-hbase-env"]['properties']['hbase_master_xmn_size'] = '512'
expected["ams-env"]['properties']['metrics_collector_heapsize'] = '640'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test splitpoints, AMS embedded mode
services['changed-configurations'] = [
{
"type": "ams-hbase-env",
"name": "hbase_master_heapsize",
"old_value": "1024"
}
]
services['configurations'] = {
'core-site': {'properties': {}},
'ams-site': {'properties': {}},
'ams-hbase-site': {'properties': {}},
'ams-hbase-env': {'properties': {}}
}
# Embedded mode, 512m master heapsize, no splitpoints recommended
services["configurations"]['ams-hbase-env']['properties']['hbase_master_heapsize'] = '512'
services["configurations"]['ams-hbase-site']['properties']['hbase.regionserver.global.memstore.upperLimit'] = '0.4'
services["configurations"]['ams-hbase-site']['properties']['hbase.hregion.memstore.flush.size'] = '134217728'
expected['ams-site']['properties']['timeline.metrics.host.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected['ams-site']['properties']['timeline.metrics.cluster.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected['ams-hbase-env']['properties']['hbase_master_heapsize'] = '512'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Embedded mode, 4096m master heapsize, some splitpoints recommended
services["configurations"]['ams-hbase-env']['properties']['hbase_master_heapsize'] = '4096'
expected['ams-site']['properties']['timeline.metrics.host.aggregate.splitpoints'] = 'dfs.datanode.WriteBlockOpNumOps,' \
'mapred.ShuffleMetrics.ShuffleOutputsFailed,' \
'read_bps,' \
'rpcdetailed.rpcdetailed.GetContainerStatusesAvgTime'
expected['ams-site']['properties']['timeline.metrics.cluster.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected['ams-hbase-env']['properties']['hbase_master_heapsize'] = '4096'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Embedded mode, 8192m master heapsize, more splitpoints recommended
services["configurations"]['ams-hbase-env']['properties']['hbase_master_heapsize'] = '8192'
expected['ams-hbase-env']['properties']['hbase_master_heapsize'] = '8192'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(len(configurations['ams-site']['properties']['timeline.metrics.host.aggregate.splitpoints'].split(',')), 13)
self.assertEquals(len(configurations['ams-site']['properties']['timeline.metrics.cluster.aggregate.splitpoints'].split(',')), 2)
# Test splitpoints, AMS distributed mode
services['changed-configurations'] = [
{
"type": "ams-hbase-env",
"name": "hbase_regionserver_heapsize",
"old_value": "512"
}
]
services["configurations"]['ams-site']['properties']['timeline.metrics.service.operation.mode'] = 'distributed'
services["configurations"]["core-site"]["properties"]["fs.defaultFS"] = 'hdfs://host1:8020'
expected['ams-hbase-site']['properties']['hbase.cluster.distributed'] = 'true'
expected['ams-hbase-site']['properties']['hbase.rootdir'] = 'hdfs://host1:8020/user/ams/hbase'
expected['ams-hbase-site']['properties']['hbase.zookeeper.property.clientPort'] = '2181'
expected['ams-hbase-env']['properties']['hbase_master_heapsize'] = '512'
expected['ams-hbase-site']['properties']['dfs.client.read.shortcircuit'] = 'true'
# Distributed mode, low memory, no splitpoints recommended
services["configurations"]['ams-hbase-env']['properties']['hbase_regionserver_heapsize'] = '512'
expected['ams-site']['properties']['timeline.metrics.host.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected['ams-site']['properties']['timeline.metrics.cluster.aggregate.splitpoints'] = 'master.Server.numDeadRegionServers'
expected['ams-hbase-env']['properties']['hbase_regionserver_heapsize'] = '512'
expected["ams-hbase-env"]['properties']['hbase_master_xmn_size'] = '102'
expected['ams-hbase-env']['properties']['regionserver_xmn_size'] = '384'
expected['ams-site']['properties']['timeline.metrics.host.aggregator.ttl'] = '259200'
expected['ams-site']['properties']['timeline.metrics.service.watcher.disabled'] = 'true'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Distributed mode, more memory, more splitpoints recommended
services["configurations"]['ams-hbase-env']['properties']['hbase_regionserver_heapsize'] = '8192'
expected['ams-hbase-env']['properties']['hbase_regionserver_heapsize'] = '8192'
self.stackAdvisor.recommendAmsConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(len(configurations['ams-site']['properties']['timeline.metrics.host.aggregate.splitpoints'].split(',')), 13)
self.assertEquals(len(configurations['ams-site']['properties']['timeline.metrics.cluster.aggregate.splitpoints'].split(',')), 2)
def test_recommendHbaseConfigurations(self):
servicesList = ["HBASE"]
configurations = {}
components = []
hosts = {
"items" : [
{
"Hosts" : {
"cpu_count" : 6,
"total_mem" : 50331648,
"disk_info" : [
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"},
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"}
]
}
}
]
}
services = {
"services" : [
],
"configurations": {
"hbase-site": {
"properties": {
"hbase.superuser": "hbase"
}
},
"hbase-env": {
"properties": {
"hbase_user": "hbase123"
}
}
}
}
expected = {
'hbase-site': {
'properties': {
'hbase.superuser': 'hbase123'
}
},
"hbase-env": {
"properties": {
"hbase_master_heapsize": "1024",
"hbase_regionserver_heapsize": "8192",
}
}
}
clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None)
self.assertEquals(clusterData['hbaseRam'], 8)
self.stackAdvisor.recommendHbaseConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected)
def test_recommendKnoxConfigurations(self):
servicesList = ["KNOX"]
configurations = {}
components = []
services_without_auth_provider_ranger_plugin_enabled = {
"services" : [
],
"configurations": {
"ranger-env": {
"properties": {
"ranger-knox-plugin-enabled" : "Yes"
}
},
"ranger-knox-plugin-properties": {
"properties": {
}
},
"topology": {
"properties": {
"content" : "<topology> <gateway> </gateway> </topology>"
}
}
}
}
services_without_auth_provider_ranger_plugin_disabled = {
"services" : [
],
"configurations": {
"ranger-env": {
"properties": {
"ranger-knox-plugin-enabled" : "No"
}
},
"ranger-knox-plugin-properties": {
"properties": {
}
},
"topology": {
"properties": {
"content" : "<topology> <gateway> </gateway> </topology>"
}
}
}
}
services_with_auth_provider_ranger_plugin_disabled = {
"services" : [
],
"configurations": {
"ranger-env": {
"properties": {
"ranger-knox-plugin-enabled" : "No"
}
},
"ranger-knox-plugin-properties": {
"properties": {
}
},
"topology": {
"properties": {
"content" : "<topology> <gateway> <provider> <role>aaa</role><name>r</name><enabled>t</enabled></provider>"
" <provider><role>authorization</role><name>XASecurePDPKnox</name><enabled>true</enabled> </provider>"
"<provider><role>bbb</role><name>y</name><enabled>u</enabled></provider> </gateway> </topology>"
}
}
}
}
services_with_auth_provider_ranger_plugin_enabled = {
"services" : [
],
"configurations": {
"ranger-env": {
"properties": {
"ranger-knox-plugin-enabled" : "Yes"
}
},
"ranger-knox-plugin-properties": {
"properties": {
}
},
"topology": {
"properties": {
"content" : "<topology> <gateway> <provider><role>authorization</role><name>AclsAuthz</name><enabled>true</enabled></provider> </gateway> </topology>"
}
}
}
}
expected1 = {'ranger-knox-plugin-properties':
{'properties':
{'ranger-knox-plugin-enabled': 'Yes'}},
'topology':
{'properties':
{'content': '<topology> <gateway> <provider><role>authorization</role><name>XASecurePDPKnox</name><enabled>true</enabled></provider></gateway> </topology>'}}}
expected2 = {'ranger-knox-plugin-properties':
{'properties':
{'ranger-knox-plugin-enabled': 'No'}},
'topology':
{'properties':
{'content': '<topology> <gateway> <provider><role>authorization</role><name>AclsAuthz</name><enabled>true</enabled></provider></gateway> </topology>'}}}
expected3 = {'ranger-knox-plugin-properties':
{'properties':
{'ranger-knox-plugin-enabled': 'No'}},
'topology':
{'properties':
{'content': '<topology> <gateway> <provider> <role>aaa</role><name>r</name><enabled>t</enabled></provider> <provider><role>authorization</role><name>AclsAuthz</name><enabled>true</enabled> </provider><provider><role>bbb</role><name>y</name><enabled>u</enabled></provider> </gateway> </topology>'}}}
expected4 = {'ranger-knox-plugin-properties':
{'properties':
{'ranger-knox-plugin-enabled': 'Yes'}},
'topology':
{'properties':
{'content': '<topology> <gateway> <provider><role>authorization</role><name>XASecurePDPKnox</name><enabled>true</enabled></provider> </gateway> </topology>'}}}
self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_without_auth_provider_ranger_plugin_enabled, None)
self.assertEquals(configurations, expected1)
self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_without_auth_provider_ranger_plugin_disabled, None)
self.assertEquals(configurations, expected2)
self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_with_auth_provider_ranger_plugin_disabled, None)
self.assertEquals(configurations, expected3)
self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_with_auth_provider_ranger_plugin_enabled, None)
self.assertEquals(configurations, expected4)
def test_recommendHbaseSiteConfigurations(self):
servicesList = ["HBASE"]
configurations = {}
components = []
hosts = {
"items" : [
{
"Hosts" : {
"cpu_count" : 6,
"total_mem" : 50331648,
"disk_info" : [
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"},
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"}
]
}
}
]
}
services = {
"services" : [
{
"StackServices": {
"service_name": "RANGER",
"service_version": "0.4.0"
},
"components": [
{
"StackServiceComponents": {
"component_name": "RANGER_ADMIN",
"hostnames": ["host1"]
}
}
]
}
],
"Versions": {
"stack_version": "2.2"
},
"configurations": {
"hbase-env": {
"properties": {
"phoenix_sql_enabled": "true",
"hbase_max_direct_memory_size": ""
}
},
"hbase-site": {
"properties": {
"hbase.rpc.controllerfactory.class": "",
"phoenix.functions.allowUserDefinedFunctions": "",
"hbase.bucketcache.ioengine": "",
"hbase.bucketcache.size": "",
"hbase.bucketcache.percentage.in.combinedcache": "",
"hbase.coprocessor.regionserver.classes": "",
"hbase.coprocessor.region.classes": "{{hbase_coprocessor_region_classes}}"
}
},
"ranger-hbase-plugin-properties": {
"properties": {
"ranger-hbase-plugin-enabled" : "No"
}
}
}
}
expected = {
"hbase-site": {
"properties": {
"hbase.regionserver.wal.codec": "org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec",
"phoenix.functions.allowUserDefinedFunctions": "true",
"hbase.regionserver.global.memstore.size": "0.4",
"hbase.coprocessor.region.classes": "org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint",
"hbase.coprocessor.regionserver.classes": "",
"hbase.coprocessor.master.classes": "",
},
'property_attributes': {
"hbase.bucketcache.size": {
"delete": "true"
},
"hbase.bucketcache.percentage.in.combinedcache": {
"delete": "true"
},
"hbase.coprocessor.regionserver.classes": {
"delete": "true"
},
"hbase.bucketcache.ioengine": {
"delete": "true"
}
}
},
"hbase-env": {
"properties": {
"hbase_master_heapsize": "1024",
"hbase_regionserver_heapsize": "8192",
},
"property_attributes": {
"hbase_max_direct_memory_size": {
"delete": "true"
}
}
}
}
clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None)
self.assertEquals(clusterData['hbaseRam'], 8)
# Test when phoenix_sql_enabled = true
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test when Phoenix sql is enabled")
# Test when phoenix_sql_enabled = false
services['configurations']['hbase-env']['properties']['phoenix_sql_enabled'] = 'false'
expected['hbase-site']['properties']['hbase.regionserver.wal.codec'] = 'org.apache.hadoop.hbase.regionserver.wal.WALCellCodec'
expected['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'] = {'delete': 'true'}
expected['hbase-site']['property_attributes']['hbase.coprocessor.regionserver.classes'] = {'delete': 'true'}
expected['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'] = {'delete': 'true'}
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test when Phoenix sql is disabled")
# Test hbase_master_heapsize maximum
hosts['items'][0]['Hosts']['host_name'] = 'host1'
services['services'].append({"StackServices":
{"service_name" : "HBASE",
"service_version" : "2.6.0.2.2"
},
"components":[
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HBASE/components/HBASE_MASTER",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"1+",
"component_name":"HBASE_MASTER",
"custom_commands":[],
"display_name":"DataNode",
"is_client":"false",
"is_master":"false",
"service_name":"HBASE",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host1"
]
},
"dependencies":[]
}]})
services['configurations']['hbase-env']['properties']['phoenix_sql_enabled'] = 'false'
expected['hbase-site']['properties']['hbase.regionserver.wal.codec'] = 'org.apache.hadoop.hbase.regionserver.wal.WALCellCodec'
expected['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'] = {'delete': 'true'}
expected['hbase-site']['property_attributes']['hbase.coprocessor.regionserver.classes'] = {'delete': 'true'}
expected['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'] = {'delete': 'true'}
expected['hbase-env']['property_attributes']['hbase_master_heapsize'] = {'maximum': '49152'}
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected, "Test with Phoenix disabled")
# Test when hbase.security.authentication = kerberos
services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'kerberos'
expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint'
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test with Kerberos enabled")
# Test when hbase.security.authentication = simple
services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'simple'
expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint'
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test with Kerberos disabled")
# Test when Ranger plugin HBase is enabled in non-kerberos environment
configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None)
configurations['hbase-site']['properties'].pop('hbase.coprocessor.master.classes', None)
configurations['hbase-site']['properties'].pop('hbase.coprocessor.regionserver.classes', None)
services['configurations']['ranger-hbase-plugin-properties']['properties']['ranger-hbase-plugin-enabled'] = 'Yes'
services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'simple'
services['configurations']['hbase-site']['properties']['hbase.security.authorization'] = 'false'
services['configurations']['hbase-site']['properties']['hbase.coprocessor.region.classes'] = ''
services['configurations']['hbase-site']['properties']['hbase.coprocessor.master.classes'] = ''
expected['hbase-site']['properties']['hbase.security.authorization'] = "true"
expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor'
expected['hbase-site']['properties']['hbase.coprocessor.master.classes'] = 'com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor'
expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = 'com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor'
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test when Ranger plugin HBase is enabled in non-kerberos environment")
# Test when hbase.security.authentication = kerberos AND class already there
configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None)
configurations['hbase-site']['properties'].pop('hbase.coprocessor.master.classes', None)
configurations['hbase-site']['properties'].pop('hbase.coprocessor.regionserver.classes', None)
configurations['hbase-site']['properties'].pop('hbase.security.authorization', None)
services['configurations']['ranger-hbase-plugin-properties']['properties']['ranger-hbase-plugin-enabled'] = 'No'
services['configurations']['hbase-site']['properties']['hbase.security.authorization'] = 'false'
services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'kerberos'
services['configurations']['hbase-site']['properties']['hbase.coprocessor.master.classes'] = ''
services['configurations']['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'a.b.c.d, {{hbase_coprocessor_region_classes}}'
expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'a.b.c.d,org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint'
expected['hbase-site']['properties']['hbase.coprocessor.master.classes'] = ''
expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = ''
del expected['hbase-site']['properties']['hbase.security.authorization']
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test with Kerberos enabled and hbase.coprocessor.region.classes predefined")
# Test when hbase.security.authentication = kerberos AND authorization = true
configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None)
services['configurations']['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None)
services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'kerberos'
services['configurations']['hbase-site']['properties']['hbase.security.authorization'] = 'true'
expected['hbase-site']['properties']['hbase.coprocessor.master.classes'] = "org.apache.hadoop.hbase.security.access.AccessController"
expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint'
expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = "org.apache.hadoop.hbase.security.access.AccessController"
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test with Kerberos enabled and authorization is true")
# Test when Ranger plugin HBase is enabled in kerberos environment
configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None)
services['configurations']['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.access.AccessController'
services['configurations']['hbase-site']['properties']['hbase.coprocessor.master.classes'] = 'org.apache.hadoop.hbase.security.access.AccessController'
services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'kerberos'
services['configurations']['hbase-site']['properties']['hbase.security.authorization'] = 'false'
services['configurations']['ranger-hbase-plugin-properties']['properties']['ranger-hbase-plugin-enabled'] = 'Yes'
expected['hbase-site']['properties']['hbase.security.authorization'] = 'true'
expected['hbase-site']['properties']['hbase.coprocessor.master.classes'] = 'com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor'
expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = "com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor"
expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor'
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations, expected, "Test with Kerberos enabled and HBase ranger plugin enabled")
# Test - default recommendations should have certain configs deleted. HAS TO BE LAST TEST.
services["configurations"] = {"hbase-site": {"properties": {"phoenix.functions.allowUserDefinedFunctions": '', "hbase.rpc.controllerfactory.class": ''}}}
configurations = {}
self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'], {'delete': 'true'})
self.assertEquals(configurations['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'], {'delete': 'true'})
self.assertEquals(configurations['hbase-site']['properties']['hbase.regionserver.wal.codec'], "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec")
def test_recommendStormConfigurations(self):
configurations = {}
clusterData = {}
services = {
"services":
[
{
"StackServices": {
"service_name" : "STORM",
"service_version" : "2.6.0.2.2"
}
},
{
"StackServices": {
"service_name": "RANGER",
"service_version": "0.4.0"
},
"components": [
{
"StackServiceComponents": {
"component_name": "RANGER_ADMIN",
"hostnames": ["host1"]
}
}
]
}
],
"Versions": {
"stack_version": "2.2"
},
"configurations": {
"storm-site": {
"properties": {
"nimbus.authorizer" : "backtype.storm.security.auth.authorizer.SimpleACLAuthorizer"
},
"property_attributes": {}
},
"ranger-storm-plugin-properties": {
"properties": {
"ranger-storm-plugin-enabled": "No"
}
}
}
}
# Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment
self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment")
# Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment
configurations['storm-site']['properties'] = {}
configurations['storm-site']['property_attributes'] = {}
services['configurations']['ranger-storm-plugin-properties']['properties']['ranger-storm-plugin-enabled'] = 'Yes'
self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment")
# Test nimbus.authorizer with Ranger Storm plugin being enabled in kerberos environment
configurations['storm-site']['properties'] = {}
configurations['storm-site']['property_attributes'] = {}
services['configurations']['storm-site']['properties']['nimbus.authorizer'] = ''
services['configurations']['ranger-storm-plugin-properties']['properties']['ranger-storm-plugin-enabled'] = 'Yes'
services['configurations']['storm-site']['properties']['storm.zookeeper.superACL'] = 'sasl:{{storm_bare_jaas_principal}}'
self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['storm-site']['properties']['nimbus.authorizer'], 'com.xasecure.authorization.storm.authorizer.XaSecureStormAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin enabled in kerberos environment")
# Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment
configurations['storm-site']['properties'] = {}
configurations['storm-site']['property_attributes'] = {}
services['configurations']['ranger-storm-plugin-properties']['properties']['ranger-storm-plugin-enabled'] = 'No'
services['configurations']['storm-site']['properties']['storm.zookeeper.superACL'] = 'sasl:{{storm_bare_jaas_principal}}'
services['configurations']['storm-site']['properties']['nimbus.authorizer'] = 'com.xasecure.authorization.storm.authorizer.XaSecureStormAuthorizer'
self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None)
self.assertEquals(configurations['storm-site']['properties']['nimbus.authorizer'], 'backtype.storm.security.auth.authorizer.SimpleACLAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment")
def test_recommendHDFSConfigurations(self):
configurations = {
'ranger-hdfs-plugin-properties':{
"properties": {"ranger-hdfs-plugin-enabled":"Yes"}
},
'hdfs-site': {
"properties": {"dfs.datanode.data.dir": "/path/1,/path/2,/path/3,/path/4"}
},
"hadoop-env": {
"properties": {"hdfs_user": "hdfs"}
}
}
clusterData = {
"totalAvailableRam": 2048,
"hBaseInstalled": True,
"hbaseRam": 112,
"reservedRam": 128
}
ambariHostName = socket.getfqdn()
expected = {
'hadoop-env': {
'properties': {
'namenode_heapsize': '1024',
'namenode_opt_newsize' : '128',
'namenode_opt_maxnewsize' : '128',
"hdfs_user": "hdfs"
},
'property_attributes': {
'dtnode_heapsize': {'maximum': '2048'},
'namenode_heapsize': {'maximum': '10240'}
}
},
'hdfs-site': {
'properties': {
'dfs.datanode.du.reserved': '10240000000',
'dfs.datanode.max.transfer.threads': '16384',
'dfs.namenode.safemode.threshold-pct': '1.000',
'dfs.datanode.failed.volumes.tolerated': '1',
'dfs.namenode.handler.count': '25',
'dfs.datanode.data.dir': '/path/1,/path/2,/path/3,/path/4'
},
'property_attributes': {
'dfs.datanode.failed.volumes.tolerated': {'maximum': '4'},
'dfs.encryption.key.provider.uri': {'delete': 'true'}
}
},
'ranger-hdfs-plugin-properties': {
'properties': {
'ranger-hdfs-plugin-enabled': 'Yes'
}
},
"core-site": {
"properties": {
"hadoop.proxyuser.hdfs.hosts": "*",
"hadoop.proxyuser.hdfs.groups": "*",
"hadoop.proxyuser.ambari_user.hosts": ambariHostName,
"hadoop.proxyuser.ambari_user.groups": "*"
},
'property_attributes': {
'hadoop.security.key.provider.path': {'delete': 'true'}
}
}
}
services = {"services":
[{"StackServices":
{"service_name" : "HDFS",
"service_version" : "2.6.0.2.2"
},
"components":[
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/DATANODE",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"1+",
"component_category":"SLAVE",
"component_name":"DATANODE",
"custom_commands":[
],
"display_name":"DataNode",
"is_client":"false",
"is_master":"false",
"service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host1"
]
},
"dependencies":[
]
},
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/JOURNALNODE",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"0+",
"component_category":"SLAVE",
"component_name":"JOURNALNODE",
"custom_commands":[
],
"display_name":"JournalNode",
"is_client":"false",
"is_master":"false",
"service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host1"
]
},
"dependencies":[
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/JOURNALNODE/dependencies/HDFS_CLIENT",
"Dependencies":{
"component_name":"HDFS_CLIENT",
"dependent_component_name":"JOURNALNODE",
"dependent_service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2"
}
}
]
},
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/HDFS/components/NAMENODE",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"1-2",
"component_category":"MASTER",
"component_name":"NAMENODE",
"custom_commands":[
"DECOMMISSION",
"REBALANCEHDFS"
],
"display_name":"NameNode",
"is_client":"false",
"is_master":"true",
"service_name":"HDFS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host2"
]
},
"dependencies":[
]
},
],
}],
"configurations": configurations,
"ambari-server-properties": {"ambari-server.user":"ambari_user"}
}
# One host has bigger volume size. Minimum should be used for the calculations of dfs.datanode.du.reserved
hosts = {
"items" : [
{
"href" : "/api/v1/hosts/host1",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "host1",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "host1",
"rack_info" : "/default-rack",
"total_mem" : 2097152,
"disk_info": [{
"size": '80000000',
"mountpoint": "/"
}]
}
},
{
"href" : "/api/v1/hosts/host2",
"Hosts" : {
"cpu_count" : 1,
"host_name" : "host2",
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : "host2",
"rack_info" : "/default-rack",
"total_mem" : 10485760,
"disk_info": [{
"size": '80000000000',
"mountpoint": "/"
}]
}
},
]
}
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test 1 - namenode heapsize depends on # of datanodes
datanode_hostnames = services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"] # datanode hostnames
for i in xrange(10):
hostname = "datanode" + `i`
datanode_hostnames.append(hostname)
hosts['items'].append(
{
"href" : "/api/v1/hosts/" + hostname,
"Hosts" : {
"cpu_count" : 1,
"host_name" : hostname,
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : hostname,
"rack_info" : "/default-rack",
"total_mem" : 2097152,
"disk_info": [{
"size": '80000000',
"mountpoint": "/"
}]
}
}
)
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "3072")
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "384")
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "384")
# Test 2 - add more datanodes
for i in xrange(11,30):
hostname = "datanode" + `i`
datanode_hostnames.append(hostname)
hosts['items'].append(
{
"href" : "/api/v1/hosts/" + hostname,
"Hosts" : {
"cpu_count" : 1,
"host_name" : hostname,
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : hostname,
"rack_info" : "/default-rack",
"total_mem" : 2097152,
"disk_info": [{
"size": '80000000',
"mountpoint": "/"
}]
}
}
)
# namenode_heapsize depends on number of disks used used by datanode
configurations["hdfs-site"]["properties"]["dfs.datanode.data.dir"] = "/path1,/path2,/path3,/path4"
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "9984")
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1248")
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1248")
# Test 3 - more datanodes than host can handle
for i in xrange(31, 90):
hostname = "datanode" + `i`
datanode_hostnames.append(hostname)
hosts['items'].append(
{
"href" : "/api/v1/hosts/" + hostname,
"Hosts" : {
"cpu_count" : 1,
"host_name" : hostname,
"os_arch" : "x86_64",
"os_type" : "centos6",
"ph_cpu_count" : 1,
"public_host_name" : hostname,
"rack_info" : "/default-rack",
"total_mem" : 2097152,
"disk_info": [{
"size": '80000000',
"mountpoint": "/"
}]
}
}
)
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "10112")
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1264")
self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1264")
# Test 4 - KMS empty test from previous call
self.assertTrue("dfs.encryption.key.provider.uri" not in configurations["hdfs-site"]["properties"])
# Test 5 - Calculated from hosts install location
services["services"].append(
{"StackServices":
{"service_name" : "RANGER_KMS",
"service_version" : "2.6.0.2.2"
},
"components":[
{
"href":"/api/v1/stacks/HDP/versions/2.2/services/RANGER_KMS/components/RANGER_KMS_SERVER",
"StackServiceComponents":{
"advertise_version":"true",
"cardinality":"1+",
"component_category":"SLAVE",
"component_name":"RANGER_KMS_SERVER",
"custom_commands":[
],
"display_name":"RANGER_KMS_SERVER",
"is_client":"false",
"is_master":"false",
"service_name":"RANGER_KMS",
"stack_name":"HDP",
"stack_version":"2.2",
"hostnames":[
"host1"
]
},
"dependencies":[
]
}
]
})
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEqual("kms://http@host1:9292/kms", configurations["hdfs-site"]["properties"]["dfs.encryption.key.provider.uri"])
# Test 6 - Multiple RANGER_KMS_SERVERs
services["services"][len(services["services"])-1]["components"][0]["StackServiceComponents"]["hostnames"].append("host2")
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEqual("kms://http@host1;host2:9292/kms", configurations["hdfs-site"]["properties"]["dfs.encryption.key.provider.uri"])
# Test 6 - Multiple RANGER_KMS_SERVERs and custom port
configurations["kms-env"] = {"properties": {"kms_port": "1111"}}
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEqual("kms://http@host1;host2:1111/kms", configurations["hdfs-site"]["properties"]["dfs.encryption.key.provider.uri"])
# Test 7 - Override by API caller
configurations["hadoop-env"] = {"properties": {"keyserver_host": "myhost1", "keyserver_port": "2222"}}
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEqual("kms://http@host1;host2:1111/kms", configurations["hdfs-site"]["properties"]["dfs.encryption.key.provider.uri"])
# Test - 'https' in KMS URL
configurations["ranger-kms-site"] = {"properties": {"ranger.service.https.attrib.ssl.enabled": "true"}}
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEqual("kms://https@host1;host2:1111/kms", configurations["hdfs-site"]["properties"]["dfs.encryption.key.provider.uri"])
# Test 8 - Dynamic maximum for 'dfs.namenode.handler.count'
hosts['items'][1]['Hosts']['cpu_count'] = 9
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertEqual(str(9 * 25), configurations["hdfs-site"]["property_attributes"]["dfs.namenode.handler.count"]['maximum'])
# Test 9 - Dynamic maximum for 'dfs.namenode.handler.count'
configurations["hdfs-site"]["property_attributes"].pop("dfs.namenode.handler.count", None)
hosts['items'][1]['Hosts']['cpu_count'] = 4
self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts)
self.assertTrue("dfs.namenode.handler.count" not in configurations["hdfs-site"]["property_attributes"])
def test_validateTezConfigurationsEnv(self):
configurations = {
"yarn-site": {
"properties": {
"yarn.scheduler.minimum-allocation-mb": "100",
"yarn.scheduler.maximum-allocation-mb": "2048"
}
}
}
recommendedDefaults = {'tez.task.resource.memory.mb': '1024',
'tez.runtime.io.sort.mb' : '256',
'tez.runtime.unordered.output.buffer.size-mb' : '256',
'tez.am.resource.memory.mb' : '1024',
'tez.tez-ui.history-url.base' : 'https://host:8443/#/main/views/TEZ/0.7.0.2.3.0.0-2155/TEZ_CLUSTER_INSTANCE'}
properties = {'tez.task.resource.memory.mb': '2050',
'tez.runtime.io.sort.mb' : '256',
'tez.runtime.unordered.output.buffer.size-mb' : '256',
'tez.am.resource.memory.mb' : '2050',
'tez.tez-ui.history-url.base' : 'http://host:8080/#/main/views/TEZ/0.7.0.2.3.0.0-2155/TEZ_CLUSTER_INSTANCE'}
res_expected = [{'config-name': 'tez.queue.name',
'config-type': 'tez-site',
'level': 'ERROR',
'message': 'Value should be set',
'type': 'configuration'},
{'config-name': 'tez.tez-ui.history-url.base',
'config-type': 'tez-site',
'level': 'WARN',
'message': "It is recommended to set value https://host:8443/#/main/views/TEZ/0.7.0.2.3.0.0-2155/TEZ_CLUSTER_INSTANCE for property tez.tez-ui.history-url.base",
'type': 'configuration'},
{'config-name': 'tez.am.resource.memory.mb',
'config-type': 'tez-site',
'level': 'WARN',
'message': "tez.am.resource.memory.mb should be less than YARN max allocation size (2048)",
'type': 'configuration'},
{'config-name': 'tez.task.resource.memory.mb',
'config-type': 'tez-site',
'level': 'WARN',
'message': "tez.task.resource.memory.mb should be less than YARN max allocation size (2048)",
'type': 'configuration'}]
res = self.stackAdvisor.validateTezConfigurations(properties, recommendedDefaults, configurations, '', '')
self.assertEquals(res, res_expected)
def test_validateHDFSConfigurationsEnv(self):
configurations = {}
# 1) ok: namenode_heapsize > recommended
recommendedDefaults = {'namenode_heapsize': '1024',
'namenode_opt_newsize' : '256',
'namenode_opt_maxnewsize' : '256'}
properties = {'namenode_heapsize': '2048',
'namenode_opt_newsize' : '300',
'namenode_opt_maxnewsize' : '300'}
res_expected = []
res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '')
self.assertEquals(res, res_expected)
# 2) fail: namenode_heapsize, namenode_opt_maxnewsize < recommended
properties['namenode_heapsize'] = '1022'
properties['namenode_opt_maxnewsize'] = '255'
res_expected = [{'config-type': 'hadoop-env',
'message': 'Value is less than the recommended default of 1024',
'type': 'configuration',
'config-name': 'namenode_heapsize',
'level': 'WARN'},
{'config-name': 'namenode_opt_maxnewsize',
'config-type': 'hadoop-env',
'level': 'WARN',
'message': 'Value is less than the recommended default of 256',
'type': 'configuration'}]
res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '')
self.assertEquals(res, res_expected)
def test_validateYARNConfigurationsEnv(self):
configurations = {}
services = {}
services['configurations'] = configurations
# 1) ok: No yarn_cgroups_enabled
recommendedDefaults = {'namenode_heapsize': '1024',
'namenode_opt_newsize' : '256',
'namenode_opt_maxnewsize' : '256'}
properties = {}
properties['service_check.queue.name'] = 'default'
res_expected = []
res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '')
self.assertEquals(res, res_expected)
# 2) ok: yarn_cgroups_enabled=false, but security enabled
properties['yarn_cgroups_enabled'] = 'false'
configurations = {
"core-site": {
"properties": {
"hadoop.security.authentication": "kerberos",
"hadoop.security.authorization": "true"
}
}
}
res_expected = []
res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '')
self.assertEquals(res, res_expected)
# 3) ok: yarn_cgroups_enabled=true, but security enabled
properties['yarn_cgroups_enabled'] = 'true'
res_expected = []
res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '')
self.assertEquals(res, res_expected)
# 4) fail: yarn_cgroups_enabled=true, but security disabled
configurations['core-site']['properties']['hadoop.security.authorization'] = 'false'
res_expected = [{'config-type': 'yarn-env',
'message': 'CPU Isolation should only be enabled if security is enabled',
'type': 'configuration',
'config-name': 'yarn_cgroups_enabled',
'level': 'WARN'}]
res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '')
self.assertEquals(res, res_expected)
def test_validateMR2XmxOptsEnv(self):
recommendedDefaults = {'mapreduce.map.java.opts': '-Xmx500m',
'mapreduce.reduce.java.opts': '-Xmx600m',
'mapreduce.task.io.sort.mb': '100',
'mapreduce.map.memory.mb': '200',
'mapreduce.reduce.memory.mb': '300',
'yarn.app.mapreduce.am.resource.mb': '400',
'yarn.app.mapreduce.am.command-opts': '-Xmx546m -Dhdp.version=${hdp.version}'}
properties = {'mapreduce.map.java.opts': '-Xmxm',
'mapreduce.reduce.java.opts': '-Xmx0m',
'mapreduce.task.io.sort.mb': '110',
'mapreduce.map.memory.mb': '210',
'mapreduce.reduce.memory.mb': '310',
'yarn.app.mapreduce.am.resource.mb': '410',
'yarn.app.mapreduce.am.command-opts': '-Xmx545m -Dhdp.version=${hdp.version}'}
res_expected = [{'config-type': 'mapred-site',
'message': 'Invalid value format',
'type': 'configuration',
'config-name': 'mapreduce.map.java.opts',
'level': 'ERROR'},
{'config-type': 'mapred-site',
'message': 'Value is less than the recommended default of -Xmx600m',
'type': 'configuration',
'config-name': 'mapreduce.reduce.java.opts',
'level': 'WARN'},
{'config-type': 'mapred-site',
'message': 'Value is less than the recommended default of -Xmx546m',
'type': 'configuration',
'config-name': 'yarn.app.mapreduce.am.command-opts',
'level': 'WARN'},
{'config-name': 'mapreduce.job.queuename',
'config-type': 'mapred-site',
'level': 'ERROR',
'message': 'Value should be set',
'type': 'configuration'},
{'config-type': 'mapred-site',
'message': 'yarn.app.mapreduce.am.command-opts Xmx should be less than yarn.app.mapreduce.am.resource.mb (410)',
'type': 'configuration',
'config-name': 'yarn.app.mapreduce.am.command-opts',
'level': 'WARN'}]
res = self.stackAdvisor.validateMapReduce2Configurations(properties, recommendedDefaults, {}, '', '')
self.assertEquals(res, res_expected)
def test_validateHiveConfigurationsEnv(self):
properties = {"hive_security_authorization": "None"}
configurations = {"hive-site": {
"properties": {"hive.security.authorization.enabled": "true"}
},
"hive-env": {
"properties": {"hive_security_authorization": "None"}
}
}
res_expected = [
{
"config-type": "hive-env",
"message": "hive_security_authorization should not be None if hive.security.authorization.enabled is set",
'type': 'configuration',
"config-name": "hive_security_authorization",
"level": "ERROR"
}
]
res = self.stackAdvisor.validateHiveConfigurationsEnv(properties, {}, configurations, {}, {})
self.assertEquals(res, res_expected)
# 2) fail: hive_security_authorization=Ranger but ranger plugin is disabled in ranger-env
properties = {"hive_security_authorization": "Ranger"}
configurations = {
"ranger-env":{
"properties":{
"ranger-hive-plugin-enabled":"No",
}
},
"hive-env":{
"properties":{
"hive_security_authorization": "Ranger",
}
}
}
services = {
"configurations": configurations
}
res_expected = []
services['configurations']['ranger-env']['properties']['ranger-hive-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'hive-env',
'message': 'ranger-env/ranger-hive-plugin-enabled must be enabled when hive_security_authorization is set to Ranger',
'type': 'configuration',
'config-name': 'hive_security_authorization',
'level': 'WARN'}]
res = self.stackAdvisor.validateHiveConfigurationsEnv(properties, {}, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateHiveConfigurations(self):
properties = {"hive_security_authorization": "None",
"hive.server2.authentication": "LDAP",
"hive.exec.orc.default.stripe.size": "8388608",
'hive.tez.container.size': '2048',
'hive.tez.java.opts': '-Xmx300m',
'hive.auto.convert.join.noconditionaltask.size': '1100000000'}
recommendedDefaults = {'hive.tez.container.size': '1024',
'hive.tez.java.opts': '-Xmx256m',
'hive.auto.convert.join.noconditionaltask.size': '1000000000'}
configurations = {
"hive-site": {
"properties": {"hive.security.authorization.enabled": "true"}
},
"hive-env": {
"properties": {"hive_security_authorization": "None"}
}
}
services = {
"services": []
}
# Test for 'ranger-hive-plugin-properties' not being in configs
res_expected = [{'config-type': 'hive-site', 'message': 'According to LDAP value for hive.server2.authentication, '
'you should add hive.server2.authentication.ldap.Domain property, if you are using AD, if not, '
'then hive.server2.authentication.ldap.baseDN!', 'type': 'configuration', 'config-name':
'hive.server2.authentication', 'level': 'WARN'}]
res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
pass
def test_validateHiveServer2Configurations(self):
properties = {"hive_security_authorization": "None",
"hive.exec.orc.default.stripe.size": "8388608",
'hive.tez.container.size': '2048',
'hive.tez.java.opts': '-Xmx300m',
'hive.auto.convert.join.noconditionaltask.size': '1100000000'}
recommendedDefaults = {'hive.tez.container.size': '1024',
'hive.tez.java.opts': '-Xmx256m',
'hive.auto.convert.join.noconditionaltask.size': '1000000000'}
configurations = {
"hive-site": {
"properties": {"hive.security.authorization.enabled": "true"}
},
"hive-env": {
"properties": {"hive_security_authorization": "ranger"}
}
}
services = {
"services": [
{
"StackServices": {
"service_name": "RANGER",
},
}
],
}
# Test with ranger plugin enabled, validation fails
res_expected = [{'config-type': 'hiveserver2-site', 'message': 'If Ranger Hive Plugin is enabled. hive.security.authorization.manager under hiveserver2-site needs to be set to com.xasecure.authorization.hive.authorizer.XaSecureHiveAuthorizerFactory', 'type': 'configuration', 'config-name': 'hive.security.authorization.manager', 'level': 'WARN'}, {'config-type': 'hiveserver2-site', 'message': 'If Ranger Hive Plugin is enabled. hive.security.authenticator.manager under hiveserver2-site needs to be set to org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator', 'type': 'configuration', 'config-name': 'hive.security.authenticator.manager', 'level': 'WARN'}, {'config-type': 'hiveserver2-site', 'message': 'If Ranger Hive Plugin is enabled. hive.conf.restricted.list under hiveserver2-site needs to contain missing value hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager', 'type': 'configuration', 'config-name': 'hive.conf.restricted.list', 'level': 'WARN'}]
res = self.stackAdvisor.validateHiveServer2Configurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_recommendYarnCGroupConfigurations(self):
servicesList = ["YARN"]
configurations = {}
components = []
hosts = {
"items" : [
{
"Hosts" : {
"cpu_count" : 6,
"total_mem" : 50331648,
"disk_info" : [
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"},
{"mountpoint" : "/"},
{"mountpoint" : "/dev/shm"},
{"mountpoint" : "/vagrant"}
],
"public_host_name" : "c6401.ambari.apache.org",
"host_name" : "c6401.ambari.apache.org"
}
}
]
}
services = {
"services" : [ {
"StackServices":{
"service_name": "YARN",
},
"components": [
{
"StackServiceComponents": {
"component_name": "NODEMANAGER",
"hostnames": ["c6401.ambari.apache.org"]
}
}
]
}
],
"configurations": {
"yarn-env": {
"properties": {
"yarn_cgroups_enabled": "true"
}
},
"core-site": {
"properties": {
"hadoop.security.authentication": ""
}
}
}
}
expected = {
"yarn-env": {
"properties": {
"min_user_id": "500",
"service_check.queue.name": "default"
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.container-executor.class": "org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor",
"yarn.nodemanager.linux-container-executor.cgroups.mount-path": "/cgroup",
"yarn.nodemanager.linux-container-executor.cgroups.mount": "true",
"yarn.nodemanager.resource.memory-mb": "39424",
"yarn.scheduler.minimum-allocation-mb": "3584",
"yarn.scheduler.maximum-allocation-vcores": "4",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.nodemanager.resource.cpu-vcores": "4",
"yarn.nodemanager.linux-container-executor.cgroups.hierarchy": "/yarn",
"yarn.scheduler.maximum-allocation-mb": "39424",
"yarn.nodemanager.linux-container-executor.resources-handler.class": "org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler",
"hadoop.registry.rm.enabled": "false"
},
"property_attributes": {
"yarn.scheduler.minimum-allocation-vcores": {
"maximum": "4"
},
"yarn.scheduler.maximum-allocation-vcores": {
"maximum": "4"
},
"yarn.nodemanager.resource.memory-mb": {
"maximum": "49152"
},
"yarn.scheduler.minimum-allocation-mb": {
"maximum": "39424"
},
"yarn.nodemanager.resource.cpu-vcores": {
"maximum": "12"
},
"yarn.scheduler.maximum-allocation-mb": {
"maximum": "39424"
}
}
}
}
clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None)
self.assertEquals(clusterData['hbaseRam'], 8)
# Test when yarn_cgroups_enabled = true
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
# Test when yarn_cgroups_enabled = false
services['configurations']['yarn-env']['properties']['yarn_cgroups_enabled'] = 'false'
expected = {
"yarn-env": {
"properties": {
"min_user_id": "500",
'service_check.queue.name': 'default'
}
},
"yarn-site": {
"properties": {
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.container-executor.class": "org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor",
"yarn.nodemanager.linux-container-executor.cgroups.mount-path": "/cgroup",
"yarn.nodemanager.linux-container-executor.group": "hadoop",
"yarn.nodemanager.linux-container-executor.cgroups.mount": "true",
"yarn.nodemanager.resource.memory-mb": "39424",
"yarn.scheduler.minimum-allocation-mb": "3584",
"yarn.scheduler.maximum-allocation-vcores": "4",
"yarn.scheduler.minimum-allocation-vcores": "1",
"yarn.nodemanager.resource.cpu-vcores": "4",
"yarn.nodemanager.linux-container-executor.cgroups.hierarchy": "/yarn",
"yarn.scheduler.maximum-allocation-mb": "39424",
"yarn.nodemanager.linux-container-executor.resources-handler.class": "org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler",
"hadoop.registry.rm.enabled": "false"
},
"property_attributes": {
"yarn.nodemanager.linux-container-executor.cgroups.mount": {
"delete": "true"
},
"yarn.nodemanager.linux-container-executor.cgroups.hierarchy": {
"delete": "true"
},
"yarn.nodemanager.linux-container-executor.cgroups.mount-path": {
"delete": "true"
},
"yarn.scheduler.minimum-allocation-vcores": {
"maximum": "4"
},
"yarn.scheduler.maximum-allocation-vcores": {
"maximum": "4"
},
"yarn.nodemanager.resource.memory-mb": {
"maximum": "49152"
},
"yarn.scheduler.minimum-allocation-mb": {
"maximum": "39424"
},
"yarn.nodemanager.resource.cpu-vcores": {
"maximum": "12"
},
"yarn.scheduler.maximum-allocation-mb": {
"maximum": "39424"
},
"yarn.nodemanager.linux-container-executor.resources-handler.class": {
"delete": "true"
}
}
}
}
self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts)
self.assertEquals(configurations, expected)
def test_validateHDFSRangerPluginConfigurations(self):
configurations = {}
# 1) ok: ranger plugin is enabled in ranger-env and ranger-hdfs-plugin-properties
recommendedDefaults = {}
properties = {}
configurations = {
"ranger-env":{
"properties":{
"ranger-hdfs-plugin-enabled":"Yes",
}
},
"ranger-hdfs-plugin-properties":{
"properties":{
"ranger-hdfs-plugin-enabled":"Yes",
}
}
}
services = {
"configurations": configurations
}
res_expected = []
res = self.stackAdvisor.validateHDFSRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# 2) fail: ranger plugin is disabled in ranger-env
services['configurations']['ranger-env']['properties']['ranger-hdfs-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'ranger-hdfs-plugin-properties',
'message': 'ranger-hdfs-plugin-properties/ranger-hdfs-plugin-enabled must correspond ranger-env/ranger-hdfs-plugin-enabled',
'type': 'configuration',
'config-name': 'ranger-hdfs-plugin-enabled',
'level': 'WARN'}]
res = self.stackAdvisor.validateHDFSRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateYARNRangerPluginConfigurations(self):
configurations = {}
# 1) ok: ranger plugin is enabled in ranger-env and ranger-yarn-plugin-properties
recommendedDefaults = {}
properties = {}
configurations = {
"ranger-env":{
"properties":{
"ranger-yarn-plugin-enabled":"Yes",
}
},
"ranger-yarn-plugin-properties":{
"properties":{
"ranger-yarn-plugin-enabled":"Yes",
}
}
}
services = {
"configurations": configurations
}
res_expected = []
res = self.stackAdvisor.validateYARNRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# 2) fail: ranger plugin is disabled in ranger-env
services['configurations']['ranger-env']['properties']['ranger-yarn-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'ranger-yarn-plugin-properties',
'message': 'ranger-yarn-plugin-properties/ranger-yarn-plugin-enabled must correspond ranger-env/ranger-yarn-plugin-enabled',
'type': 'configuration',
'config-name': 'ranger-yarn-plugin-enabled',
'level': 'WARN'}]
res = self.stackAdvisor.validateYARNRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateHBASERangerPluginConfigurations(self):
configurations = {}
# 1) ok: ranger plugin is enabled in ranger-env and ranger-hbase-plugin-properties
recommendedDefaults = {}
properties = {}
configurations = {
"ranger-env":{
"properties":{
"ranger-hbase-plugin-enabled":"Yes",
}
},
"ranger-hbase-plugin-properties":{
"properties":{
"ranger-hbase-plugin-enabled":"Yes",
}
}
}
services = {
"configurations": configurations
}
res_expected = []
res = self.stackAdvisor.validateHBASERangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# 2) fail: ranger plugin is disabled in ranger-env
services['configurations']['ranger-env']['properties']['ranger-hbase-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'ranger-hbase-plugin-properties',
'message': 'ranger-hbase-plugin-properties/ranger-hbase-plugin-enabled must correspond ranger-env/ranger-hbase-plugin-enabled',
'type': 'configuration',
'config-name': 'ranger-hbase-plugin-enabled',
'level': 'WARN'}]
res = self.stackAdvisor.validateHBASERangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateKnoxRangerPluginConfigurations(self):
configurations = {}
# 1) ok: ranger plugin is enabled in ranger-env and ranger-knox-plugin-properties
recommendedDefaults = {}
properties = {}
configurations = {
"ranger-env":{
"properties":{
"ranger-knox-plugin-enabled":"Yes",
}
},
"ranger-knox-plugin-properties":{
"properties":{
"ranger-knox-plugin-enabled":"Yes",
}
}
}
services = {
"configurations": configurations
}
res_expected = []
res = self.stackAdvisor.validateKnoxRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# 2) fail: ranger plugin is disabled in ranger-env
services['configurations']['ranger-env']['properties']['ranger-knox-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'ranger-knox-plugin-properties',
'message': 'ranger-knox-plugin-properties/ranger-knox-plugin-enabled must correspond ranger-env/ranger-knox-plugin-enabled',
'type': 'configuration',
'config-name': 'ranger-knox-plugin-enabled',
'level': 'WARN'}]
res = self.stackAdvisor.validateKnoxRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateKafkaRangerPluginConfigurations(self):
configurations = {}
# 1) ok: ranger plugin is enabled in ranger-env and ranger-kafka-plugin-properties
recommendedDefaults = {}
properties = {}
configurations = {
"ranger-env":{
"properties":{
"ranger-kafka-plugin-enabled":"Yes",
}
},
"ranger-kafka-plugin-properties":{
"properties":{
"ranger-kafka-plugin-enabled":"Yes",
}
},
"cluster-env": {
"properties": {
"security_enabled" : "true"
}
}
}
services = {
"services":
[
{
"StackServices": {
"service_name" : "RANGER"
}
}
],
"configurations": configurations
}
res_expected = []
res = self.stackAdvisor.validateKafkaRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# 2) fail: ranger plugin is disabled in ranger-env
services['configurations']['ranger-env']['properties']['ranger-kafka-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'ranger-kafka-plugin-properties',
'message': 'ranger-kafka-plugin-properties/ranger-kafka-plugin-enabled must correspond ranger-env/ranger-kafka-plugin-enabled',
'type': 'configuration',
'config-name': 'ranger-kafka-plugin-enabled',
'level': 'WARN'}]
# Test to check security_enabled is false
services['configurations']['cluster-env']['properties']['security_enabled'] = "false"
res_expected.append({'config-type': 'ranger-kafka-plugin-properties', 'message': 'Ranger Kafka plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-kafka-plugin-enabled', 'level': 'WARN'})
res = self.stackAdvisor.validateKafkaRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
res = self.stackAdvisor.validateKafkaRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateStormRangerPluginConfigurations(self):
configurations = {}
# 1) ok: ranger plugin is enabled in ranger-env and ranger-storm-plugin-properties
recommendedDefaults = {}
properties = {}
configurations = {
"ranger-env":{
"properties":{
"ranger-storm-plugin-enabled":"Yes",
}
},
"ranger-storm-plugin-properties":{
"properties":{
"ranger-storm-plugin-enabled":"Yes",
}
},
"cluster-env": {
"properties": {
"security_enabled" : "true"
}
}
}
services = {
"services":
[
{
"StackServices": {
"service_name" : "RANGER"
}
}
],
"configurations": configurations
}
res_expected = []
res = self.stackAdvisor.validateStormRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# 2) fail: ranger plugin is disabled in ranger-env
services['configurations']['ranger-env']['properties']['ranger-storm-plugin-enabled'] = 'No'
res_expected = [{'config-type': 'ranger-storm-plugin-properties',
'message': 'ranger-storm-plugin-properties/ranger-storm-plugin-enabled must correspond ranger-env/ranger-storm-plugin-enabled',
'type': 'configuration',
'config-name': 'ranger-storm-plugin-enabled',
'level': 'WARN'}]
res = self.stackAdvisor.validateStormRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
# Test to check security_enabled is false
services['configurations']['cluster-env']['properties']['security_enabled'] = "false"
res_expected.append({'config-type': 'ranger-storm-plugin-properties', 'message': 'Ranger Storm plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-storm-plugin-enabled', 'level': 'WARN'})
res = self.stackAdvisor.validateStormRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_recommendRangerConfigurations(self):
clusterData = {}
# Recommend ranger-storm-plugin-enabled=No on non-kerberos cluster
services = {
"Versions" : {
"stack_version" : "2.3",
},
"services": [
{
"StackServices": {
"service_name": "RANGER",
"service_version": "0.5.0.2.3"
},
"components": [
{
"StackServiceComponents": {
"component_name": "RANGER_ADMIN",
"hostnames": ["host1"]
}
}
]
},
],
"configurations": {
"cluster-env": {
"properties": {
"security_enabled": "false",
}
},
},
}
expected = {
'admin-properties': {'properties': {'policymgr_external_url': 'http://host1:6080'}}, 'ranger-env': {'properties': {'ranger-storm-plugin-enabled': 'No'}}
}
recommendedConfigurations = {}
self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None)
self.assertEquals(recommendedConfigurations, expected)
def test_validateRangerConfigurationsEnv(self):
properties = {
"ranger-storm-plugin-enabled": "Yes",
}
recommendedDefaults = {
"ranger-storm-plugin-enabled": "No",
}
configurations = {
"cluster-env": {
"properties": {
"security_enabled": "false",
}
}
}
services = {
"services":
[
{
"StackServices": {
"service_name" : "STORM"
}
}
]
}
# Test with ranger plugin enabled, validation fails
res_expected = [{'config-type': 'ranger-env', 'message': 'Ranger Storm plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-storm-plugin-enabled', 'level': 'WARN'}]
res = self.stackAdvisor.validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)
def test_validateSparkDefaults(self):
properties = {}
recommendedDefaults = {
"spark.yarn.queue": "default",
}
configurations = {}
services = {
"services":
[
{
"StackServices": {
"service_name": "SPARK"
}
}
]
}
# Test with ranger plugin enabled, validation fails
res_expected = [{'config-type': 'spark-defaults', 'message': 'Value should be set', 'type': 'configuration', 'config-name': 'spark.yarn.queue', 'level': 'ERROR'}]
res = self.stackAdvisor.validateSparkDefaults(properties, recommendedDefaults, configurations, services, {})
self.assertEquals(res, res_expected)