AMBARI-6682. Add generate_config method to Script (aonishuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/55bbcae4 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/55bbcae4 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/55bbcae4 Branch: refs/heads/trunk Commit: 55bbcae4634496cb52041770489963cece38594a Parents: dd88883 Author: Andrew Onishuk <aonis...@hortonworks.com> Authored: Fri Aug 1 16:21:55 2014 +0300 Committer: Andrew Onishuk <aonis...@hortonworks.com> Committed: Fri Aug 1 16:21:55 2014 +0300 ---------------------------------------------------------------------- ambari-agent/conf/unix/install-helper.sh | 10 + ambari-agent/pom.xml | 35 +-- .../main/python/resource_management/__init__.py | 26 -- .../python/resource_management/core/__init__.py | 33 --- .../python/resource_management/core/base.py | 173 ------------ .../resource_management/core/environment.py | 198 -------------- .../resource_management/core/exceptions.py | 46 ---- .../python/resource_management/core/logger.py | 92 ------- .../core/providers/__init__.py | 83 ------ .../core/providers/accounts.py | 116 -------- .../resource_management/core/providers/mount.py | 137 ---------- .../core/providers/package/__init__.py | 55 ---- .../core/providers/package/apt.py | 60 ----- .../core/providers/package/yumrpm.py | 53 ---- .../core/providers/package/zypper.py | 53 ---- .../core/providers/service.py | 96 ------- .../core/providers/system.py | 265 ------------------ .../core/resources/__init__.py | 26 -- .../core/resources/accounts.py | 48 ---- .../core/resources/packaging.py | 34 --- .../core/resources/service.py | 38 --- .../core/resources/system.py | 128 --------- .../python/resource_management/core/shell.py | 109 -------- .../python/resource_management/core/source.py | 171 ------------ .../python/resource_management/core/system.py | 160 ----------- .../python/resource_management/core/utils.py | 108 -------- .../resource_management/libraries/__init__.py | 26 -- .../libraries/functions/__init__.py | 30 --- .../libraries/functions/check_process_status.py | 57 ---- .../libraries/functions/default.py | 40 --- .../libraries/functions/format.py | 83 ------ .../libraries/functions/get_kinit_path.py | 42 --- .../libraries/functions/get_port_from_url.py | 40 --- .../functions/get_unique_id_and_date.py | 34 --- .../libraries/functions/is_empty.py | 28 -- .../libraries/functions/substitute_vars.py | 53 ---- .../libraries/providers/__init__.py | 42 --- .../libraries/providers/copy_from_local.py | 73 ----- .../libraries/providers/execute_hadoop.py | 48 ---- .../libraries/providers/hdfs_directory.py | 109 -------- .../libraries/providers/monitor_webserver.py | 55 ---- .../libraries/providers/properties_file.py | 49 ---- .../libraries/providers/repository.py | 98 ------- .../libraries/providers/template_config.py | 43 --- .../libraries/providers/xml_config.py | 61 ----- .../libraries/resources/__init__.py | 30 --- .../libraries/resources/copy_from_local.py | 38 --- .../libraries/resources/execute_hadoop.py | 43 --- .../libraries/resources/hdfs_directory.py | 44 --- .../libraries/resources/monitor_webserver.py | 29 -- .../libraries/resources/properties_file.py | 37 --- .../libraries/resources/repository.py | 36 --- .../libraries/resources/template_config.py | 35 --- .../libraries/resources/xml_config.py | 38 --- .../libraries/script/__init__.py | 25 -- .../libraries/script/config_dictionary.py | 81 ------ .../libraries/script/hook.py | 66 ----- .../libraries/script/script.py | 229 ---------------- .../main/python/resource_management/__init__.py | 26 ++ .../python/resource_management/core/__init__.py | 33 +++ .../python/resource_management/core/base.py | 173 ++++++++++++ .../resource_management/core/environment.py | 198 ++++++++++++++ .../resource_management/core/exceptions.py | 46 ++++ .../python/resource_management/core/logger.py | 92 +++++++ .../core/providers/__init__.py | 83 ++++++ .../core/providers/accounts.py | 116 ++++++++ .../resource_management/core/providers/mount.py | 137 ++++++++++ .../core/providers/package/__init__.py | 55 ++++ .../core/providers/package/apt.py | 60 +++++ .../core/providers/package/yumrpm.py | 53 ++++ .../core/providers/package/zypper.py | 53 ++++ .../core/providers/service.py | 96 +++++++ .../core/providers/system.py | 265 ++++++++++++++++++ .../core/resources/__init__.py | 26 ++ .../core/resources/accounts.py | 48 ++++ .../core/resources/packaging.py | 34 +++ .../core/resources/service.py | 38 +++ .../core/resources/system.py | 128 +++++++++ .../python/resource_management/core/shell.py | 109 ++++++++ .../python/resource_management/core/source.py | 171 ++++++++++++ .../python/resource_management/core/system.py | 160 +++++++++++ .../python/resource_management/core/utils.py | 108 ++++++++ .../resource_management/libraries/__init__.py | 26 ++ .../libraries/functions/__init__.py | 30 +++ .../libraries/functions/check_process_status.py | 57 ++++ .../libraries/functions/default.py | 40 +++ .../libraries/functions/format.py | 83 ++++++ .../libraries/functions/get_kinit_path.py | 42 +++ .../libraries/functions/get_port_from_url.py | 40 +++ .../functions/get_unique_id_and_date.py | 34 +++ .../libraries/functions/is_empty.py | 28 ++ .../libraries/functions/substitute_vars.py | 53 ++++ .../libraries/providers/__init__.py | 42 +++ .../libraries/providers/copy_from_local.py | 73 +++++ .../libraries/providers/execute_hadoop.py | 48 ++++ .../libraries/providers/hdfs_directory.py | 109 ++++++++ .../libraries/providers/monitor_webserver.py | 55 ++++ .../libraries/providers/properties_file.py | 49 ++++ .../libraries/providers/repository.py | 98 +++++++ .../libraries/providers/template_config.py | 43 +++ .../libraries/providers/xml_config.py | 61 +++++ .../libraries/resources/__init__.py | 30 +++ .../libraries/resources/copy_from_local.py | 38 +++ .../libraries/resources/execute_hadoop.py | 43 +++ .../libraries/resources/hdfs_directory.py | 44 +++ .../libraries/resources/monitor_webserver.py | 29 ++ .../libraries/resources/properties_file.py | 37 +++ .../libraries/resources/repository.py | 36 +++ .../libraries/resources/template_config.py | 35 +++ .../libraries/resources/xml_config.py | 38 +++ .../libraries/script/__init__.py | 25 ++ .../libraries/script/config_dictionary.py | 81 ++++++ .../libraries/script/hook.py | 66 +++++ .../libraries/script/script.py | 267 +++++++++++++++++++ ambari-server/conf/unix/install-helper.sh | 7 + ambari-server/pom.xml | 26 +- .../stacks/2.0.6/HDFS/test_hdfs_client.py | 54 ++++ .../python/stacks/2.0.6/configs/default.json | 5 +- 118 files changed, 4207 insertions(+), 4068 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/conf/unix/install-helper.sh ---------------------------------------------------------------------- diff --git a/ambari-agent/conf/unix/install-helper.sh b/ambari-agent/conf/unix/install-helper.sh index 70cf6d0..c2d2a3d 100644 --- a/ambari-agent/conf/unix/install-helper.sh +++ b/ambari-agent/conf/unix/install-helper.sh @@ -19,9 +19,11 @@ ################################################################## COMMON_DIR="/usr/lib/python2.6/site-packages/ambari_commons" +RESOURCE_MANAGEMENT_DIR="/usr/lib/python2.6/site-packages/resource_management" OLD_COMMON_DIR="/usr/lib/python2.6/site-packages/common_functions" INSTALL_HELPER_SERVER="/var/lib/ambari-server/install-helper.sh" COMMON_DIR_AGENT="/usr/lib/ambari-agent/lib/ambari_commons" +RESOURCE_MANAGEMENT_DIR_AGENT="/usr/lib/ambari-agent/lib/resource_management" PYTHON_WRAPER_TARGET="/usr/bin/ambari-python-wrap" PYTHON_WRAPER_SOURCE="/var/lib/ambari-agent/ambari-python-wrap" @@ -32,6 +34,10 @@ do_install(){ if [ ! -d "$COMMON_DIR" ]; then ln -s "$COMMON_DIR_AGENT" "$COMMON_DIR" fi + # setting resource_management shared resource + if [ ! -d "$RESOURCE_MANAGEMENT_DIR" ]; then + ln -s "$RESOURCE_MANAGEMENT_DIR_AGENT" "$RESOURCE_MANAGEMENT_DIR" + fi # setting python-wrapper script if [ ! -f "$PYTHON_WRAPER_TARGET" ]; then ln -s "$PYTHON_WRAPER_SOURCE" "$PYTHON_WRAPER_TARGET" @@ -43,6 +49,10 @@ do_remove(){ rm -f "$COMMON_DIR" fi + if [ -d "$RESOURCE_MANAGEMENT_DIR" ]; then # resource_management dir exists + rm -f "$RESOURCE_MANAGEMENT_DIR" + fi + if [ -f "$PYTHON_WRAPER_TARGET" ]; then rm -f "$PYTHON_WRAPER_TARGET" fi http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-agent/pom.xml b/ambari-agent/pom.xml index 192e05b..c98af34 100644 --- a/ambari-agent/pom.xml +++ b/ambari-agent/pom.xml @@ -38,8 +38,8 @@ <package.pid.dir>/var/run/ambari-agent</package.pid.dir> <skipTests>false</skipTests> <agent.install.dir>/usr/lib/python2.6/site-packages/ambari_agent</agent.install.dir> - <resmgmt.install.dir>/usr/lib/python2.6/site-packages/resource_management</resmgmt.install.dir> <ambari_commons.install.dir>/usr/lib/ambari-agent/lib/ambari_commons</ambari_commons.install.dir> + <resource_management.install.dir>/usr/lib/ambari-agent/lib/resource_management</resource_management.install.dir> <jinja.install.dir>/usr/lib/python2.6/site-packages/jinja2</jinja.install.dir> <lib.dir>/usr/lib/ambari-agent/lib</lib.dir> <python.ver>python >= 2.6</python.ver> @@ -114,7 +114,7 @@ <argument>unitTests.py</argument> </arguments> <environmentVariables> - <PYTHONPATH>${project.basedir}/../ambari-common/src/main/python/jinja2:${project.basedir}/../ambari-common/src/main/python/ambari_commons:${project.basedir}/../ambari-common/src/test/python:${project.basedir}/../ambari-common/src/main/python:${project.basedir}/src/main/python/ambari_agent:${project.basedir}/src/main/python/resource_management:${project.basedir}/src/test/python/ambari_agent:${project.basedir}/src/test/python/resource_management:${project.basedir}/src/main/python:${project.basedir}/../ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/package/files:${project.basedir}/../ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HDFS/package/files:$PYTHONPATH</PYTHONPATH> + <PYTHONPATH>${project.basedir}/../ambari-common/src/main/python/jinja2:${project.basedir}/../ambari-common/src/main/python/ambari_commons:${project.basedir}/../ambari-common/src/main/python/resource_management:${project.basedir}/../ambari-common/src/test/python:${project.basedir}/../ambari-common/src/main/python:${project.basedir}/src/main/python/ambari_agent:${project.basedir}/src/test/python/ambari_agent:${project.basedir}/src/test/python/resource_management:${project.basedir}/src/main/python:${project.basedir}/../ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/package/files:${project.basedir}/../ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HDFS/package/files:$PYTHONPATH</PYTHONPATH> </environmentVariables> <skip>${skipTests}</skip> </configuration> @@ -225,22 +225,22 @@ </sources> </mapping> <mapping> - <directory>${resmgmt.install.dir}</directory> + <directory>${ambari_commons.install.dir}</directory> <username>root</username> <groupname>root</groupname> <sources> <source> - <location>${project.build.directory}/${project.artifactId}-${project.version}/resource_management</location> + <location>${project.basedir}/../ambari-common/src/main/python/ambari_commons</location> </source> </sources> </mapping> <mapping> - <directory>${ambari_commons.install.dir}</directory> + <directory>${resource_management.install.dir}</directory> <username>root</username> <groupname>root</groupname> <sources> <source> - <location>${project.basedir}/../ambari-common/src/main/python/ambari_commons</location> + <location>${project.basedir}/../ambari-common/src/main/python/resource_management</location> </source> </sources> </mapping> @@ -408,16 +408,6 @@ </mapper> </data> <data> - <src>${project.build.directory}/${project.artifactId}-${project.version}/resource_management</src> - <type>directory</type> - <mapper> - <type>perm</type> - <prefix>${resmgmt.install.dir}</prefix> - <user>root</user> - <group>root</group> - </mapper> - </data> - <data> <src>${project.basedir}/../ambari-common/src/main/python/jinja2/jinja2</src> <excludes>${project.basedir}/../ambari-common/src/main/python/jinja2/jinja2/testsuite</excludes> <type>directory</type> @@ -556,6 +546,19 @@ <group>root</group> </mapper> </data> + <data> + <src> + ${project.basedir}/../ambari-common/src/main/python/resource_management + </src> + <type>directory</type> + <mapper> + <type>perm</type> + <prefix>${resource_management.install.dir}</prefix> + <filemode>755</filemode> + <user>root</user> + <group>root</group> + </mapper> + </data> </dataSet> </configuration> </plugin> http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/__init__.py b/ambari-agent/src/main/python/resource_management/__init__.py deleted file mode 100644 index fee91fd..0000000 --- a/ambari-agent/src/main/python/resource_management/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from resource_management.libraries import * -from resource_management.core import * - - http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/__init__.py b/ambari-agent/src/main/python/resource_management/core/__init__.py deleted file mode 100644 index 1af793b..0000000 --- a/ambari-agent/src/main/python/resource_management/core/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from resource_management.core.base import * -from resource_management.core.environment import * -from resource_management.core.exceptions import * -from resource_management.core.providers import * -from resource_management.core.resources import * -from resource_management.core.source import * -from resource_management.core.system import * -from resource_management.core.shell import * -from resource_management.core.logger import * - -__version__ = "0.4.1" http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/base.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/base.py b/ambari-agent/src/main/python/resource_management/core/base.py deleted file mode 100644 index 52f1dff..0000000 --- a/ambari-agent/src/main/python/resource_management/core/base.py +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["Resource", "ResourceArgument", "ForcedListArgument", - "BooleanArgument"] - -from resource_management.core.exceptions import Fail, InvalidArgument -from resource_management.core.environment import Environment -from resource_management.core.logger import Logger - -class ResourceArgument(object): - def __init__(self, default=None, required=False): - self.required = False # Prevents the initial validate from failing - if hasattr(default, '__call__'): - self.default = default - else: - self.default = self.validate(default) - self.required = required - - def validate(self, value): - if self.required and value is None: - raise InvalidArgument("Required argument %s missing" % self.name) - return value - - -class ForcedListArgument(ResourceArgument): - def validate(self, value): - value = super(ForcedListArgument, self).validate(value) - if not isinstance(value, (tuple, list)): - value = [value] - return value - - -class BooleanArgument(ResourceArgument): - def validate(self, value): - value = super(BooleanArgument, self).validate(value) - if not value in (True, False): - raise InvalidArgument( - "Expected a boolean for %s received %r" % (self.name, value)) - return value - - -class Accessor(object): - def __init__(self, name): - self.name = name - - def __get__(self, obj, cls): - try: - return obj.arguments[self.name] - except KeyError: - val = obj._arguments[self.name].default - if hasattr(val, '__call__'): - val = val(obj) - return val - - def __set__(self, obj, value): - obj.arguments[self.name] = obj._arguments[self.name].validate(value) - - -class ResourceMetaclass(type): - # def __new__(cls, name, bases, attrs): - # super_new = super(ResourceMetaclass, cls).__new__ - # return super_new(cls, name, bases, attrs) - - def __init__(mcs, _name, bases, attrs): - mcs._arguments = getattr(bases[0], '_arguments', {}).copy() - for key, value in list(attrs.items()): - if isinstance(value, ResourceArgument): - value.name = key - mcs._arguments[key] = value - setattr(mcs, key, Accessor(key)) - - -class Resource(object): - __metaclass__ = ResourceMetaclass - - action = ForcedListArgument(default="nothing") - ignore_failures = BooleanArgument(default=False) - not_if = ResourceArgument() # pass command e.g. not_if = ('ls','/root/jdk') - only_if = ResourceArgument() # pass command - initial_wait = ResourceArgument() # in seconds - - actions = ["nothing"] - - def __new__(cls, name, env=None, provider=None, **kwargs): - if isinstance(name, list): - while len(name) != 1: - cls(name.pop(0), env, provider, **kwargs) - - name = name[0] - - env = env or Environment.get_instance() - provider = provider or getattr(cls, 'provider', None) - - r_type = cls.__name__ - if r_type not in env.resources: - env.resources[r_type] = {} - - obj = super(Resource, cls).__new__(cls) - env.resources[r_type][name] = obj - env.resource_list.append(obj) - return obj - - def __init__(self, name, env=None, provider=None, **kwargs): - if isinstance(name, list): - name = name.pop(0) - - if hasattr(self, 'name'): - return - - self.env = env or Environment.get_instance() - self.name = name - - self.provider = provider or getattr(self, 'provider', None) - - self.arguments = {} - for key, value in kwargs.items(): - try: - arg = self._arguments[key] - except KeyError: - raise Fail("%s received unsupported argument %s" % (self, key)) - else: - try: - self.arguments[key] = arg.validate(value) - except InvalidArgument, exc: - raise InvalidArgument("%s %s" % (self, exc)) - - if not self.env.test_mode: - self.env.run() - - def validate(self): - pass - - def __repr__(self): - return "%s['%s']" % (self.__class__.__name__, self.name) - - def __unicode__(self): - return u"%s['%s']" % (self.__class__.__name__, self.name) - - def __getstate__(self): - return dict( - name=self.name, - provider=self.provider, - arguments=self.arguments, - env=self.env, - ) - - def __setstate__(self, state): - self.name = state['name'] - self.provider = state['provider'] - self.arguments = state['arguments'] - self.env = state['env'] - - self.validate() http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/environment.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/environment.py b/ambari-agent/src/main/python/resource_management/core/environment.py deleted file mode 100644 index 8f0ec27..0000000 --- a/ambari-agent/src/main/python/resource_management/core/environment.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["Environment"] - -import os -import shutil -import time -from datetime import datetime - -from resource_management.core import shell -from resource_management.core.exceptions import Fail -from resource_management.core.providers import find_provider -from resource_management.core.utils import AttributeDictionary -from resource_management.core.system import System -from resource_management.core.logger import Logger - - -class Environment(object): - _instances = [] - - def __init__(self, basedir=None, test_mode=False): - """ - @param basedir: basedir/files, basedir/templates are the places where templates / static files - are looked up - @param test_mode: if this is enabled, resources won't be executed until manualy running env.run(). - """ - self.reset(basedir, test_mode) - - def reset(self, basedir, test_mode): - self.system = System.get_instance() - self.config = AttributeDictionary() - self.resources = {} - self.resource_list = [] - self.delayed_actions = set() - self.test_mode = test_mode - self.update_config({ - # current time - 'date': datetime.now(), - # backups here files which were rewritten while executing File resource - 'backup.path': '/tmp/resource_management/backup', - # prefix for this files - 'backup.prefix': datetime.now().strftime("%Y%m%d%H%M%S"), - # dir where templates,failes dirs are - 'basedir': basedir, - # variables, which can be used in templates - 'params': {}, - }) - - def backup_file(self, path): - if self.config.backup: - if not os.path.exists(self.config.backup.path): - os.makedirs(self.config.backup.path, 0700) - new_name = self.config.backup.prefix + path.replace('/', '-') - backup_path = os.path.join(self.config.backup.path, new_name) - Logger.info("backing up %s to %s" % (path, backup_path)) - shutil.copy(path, backup_path) - - def update_config(self, attributes, overwrite=True): - for key, value in attributes.items(): - attr = self.config - path = key.split('.') - for pth in path[:-1]: - if pth not in attr: - attr[pth] = AttributeDictionary() - attr = attr[pth] - if overwrite or path[-1] not in attr: - attr[path[-1]] = value - - def set_params(self, arg): - """ - @param arg: is a dictionary of configurations, or a module with the configurations - """ - if isinstance(arg, dict): - variables = arg - else: - variables = dict((var, getattr(arg, var)) for var in dir(arg)) - - for variable, value in variables.iteritems(): - # don't include system variables, methods, classes, modules - if not variable.startswith("__") and \ - not hasattr(value, '__call__')and \ - not hasattr(value, '__file__'): - self.config.params[variable] = value - - def run_action(self, resource, action): - Logger.debug("Performing action %s on %s" % (action, resource)) - - provider_class = find_provider(self, resource.__class__.__name__, - resource.provider) - provider = provider_class(resource) - try: - provider_action = getattr(provider, 'action_%s' % action) - except AttributeError: - raise Fail("%r does not implement action %s" % (provider, action)) - provider_action() - - def _check_condition(self, cond): - if hasattr(cond, '__call__'): - return cond() - - if isinstance(cond, basestring): - ret, out = shell.call(cond) - return ret == 0 - - raise Exception("Unknown condition type %r" % cond) - - def run(self): - with self: - # Run resource actions - while self.resource_list: - resource = self.resource_list.pop(0) - Logger.info_resource(resource) - - if resource.initial_wait: - time.sleep(resource.initial_wait) - - if resource.not_if is not None and self._check_condition( - resource.not_if): - Logger.info("Skipping %s due to not_if" % resource) - continue - - if resource.only_if is not None and not self._check_condition( - resource.only_if): - Logger.info("Skipping %s due to only_if" % resource) - continue - - for action in resource.action: - if not resource.ignore_failures: - self.run_action(resource, action) - else: - try: - self.run_action(resource, action) - except Exception as ex: - Logger.info("Skipping failure of %s due to ignore_failures. Failure reason: %s" % (resource, str(ex))) - pass - - # Run delayed actions - while self.delayed_actions: - action, resource = self.delayed_actions.pop() - self.run_action(resource, action) - - @classmethod - def get_instance(cls): - return cls._instances[-1] - - @classmethod - def get_instance_copy(cls): - """ - Copy only configurations, but not resources execution state - """ - old_instance = cls.get_instance() - new_instance = Environment() - new_instance.config = old_instance.config.copy() - - return new_instance - - def __enter__(self): - self.__class__._instances.append(self) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.__class__._instances.pop() - return False - - def __getstate__(self): - return dict( - config=self.config, - resources=self.resources, - resource_list=self.resource_list, - delayed_actions=self.delayed_actions, - ) - - def __setstate__(self, state): - self.__init__() - self.config = state['config'] - self.resources = state['resources'] - self.resource_list = state['resource_list'] - self.delayed_actions = state['delayed_actions'] http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/exceptions.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/exceptions.py b/ambari-agent/src/main/python/resource_management/core/exceptions.py deleted file mode 100644 index 3c001cc..0000000 --- a/ambari-agent/src/main/python/resource_management/core/exceptions.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -class Fail(Exception): - pass - -class ExecuteTimeoutException(Exception): - pass - -class InvalidArgument(Fail): - pass - -class ClientComponentHasNoStatus(Fail): - """ - Thrown when status() method is called for a CLIENT component. - The only valid status for CLIENT component is installed, - that's why exception is thrown and later silently processed at script.py - """ - pass - -class ComponentIsNotRunning(Fail): - """ - Thrown when status() method is called for a component (only - in situations when component process is not running). - Later exception is silently processed at script.py - """ - pass http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/logger.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/logger.py b/ambari-agent/src/main/python/resource_management/core/logger.py deleted file mode 100644 index da64f6a..0000000 --- a/ambari-agent/src/main/python/resource_management/core/logger.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["Logger"] -import logging -from resource_management.libraries.script.config_dictionary import UnknownConfiguration - -class Logger: - logger = logging.getLogger("resource_management") - - # unprotected_strings : protected_strings map - sensitive_strings = {} - - @staticmethod - def info(text): - Logger.logger.info(Logger.get_protected_text(text)) - - @staticmethod - def debug(text): - Logger.logger.debug(Logger.get_protected_text(text)) - - @staticmethod - def info_resource(resource): - Logger.info(Logger.get_protected_text(Logger._get_resource_repr(resource))) - - @staticmethod - def debug_resource(resource): - Logger.debug(Logger.get_protected_text(Logger._get_resource_repr(resource))) - - @staticmethod - def get_protected_text(text): - """ - Replace passwords with [PROTECTED] - """ - for unprotected_string, protected_string in Logger.sensitive_strings.iteritems(): - text = text.replace(unprotected_string, protected_string) - - return text - - @staticmethod - def _get_resource_repr(resource): - MESSAGE_MAX_LEN = 256 - logger_level = logging._levelNames[Logger.logger.level] - - arguments_str = "" - for x,y in resource.arguments.iteritems(): - - # strip unicode 'u' sign - if isinstance(y, unicode): - # don't show long messages - if len(y) > MESSAGE_MAX_LEN: - y = '...' - val = repr(y).lstrip('u') - # don't show dicts of configurations - # usually too long - elif logger_level != 'DEBUG' and isinstance(y, dict): - val = "..." - # for configs which didn't come - elif isinstance(y, UnknownConfiguration): - val = "[EMPTY]" - # correctly output 'mode' (as they are octal values like 0755) - elif y and x == 'mode': - val = oct(y) - else: - val = repr(y) - - - arguments_str += "'{0}': {1}, ".format(x, val) - - if arguments_str: - arguments_str = arguments_str[:-2] - - return "{0} {{{1}}}".format(resource, arguments_str) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/__init__.py b/ambari-agent/src/main/python/resource_management/core/providers/__init__.py deleted file mode 100644 index f22dc74..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/__init__.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["Provider", "find_provider"] - -from resource_management.core.exceptions import Fail -from resource_management.libraries.providers import PROVIDERS as LIBRARY_PROVIDERS - - -class Provider(object): - def __init__(self, resource): - self.resource = resource - - def action_nothing(self): - pass - - def __repr__(self): - return self.__unicode__() - - def __unicode__(self): - return u"%s[%s]" % (self.__class__.__name__, self.resource) - - -PROVIDERS = dict( - redhat=dict( - Package="resource_management.core.providers.package.yumrpm.YumProvider", - ), - suse=dict( - Package="resource_management.core.providers.package.zypper.ZypperProvider", - ), - debian=dict( - Package="resource_management.core.providers.package.apt.AptProvider", - ), - default=dict( - File="resource_management.core.providers.system.FileProvider", - Directory="resource_management.core.providers.system.DirectoryProvider", - Link="resource_management.core.providers.system.LinkProvider", - Execute="resource_management.core.providers.system.ExecuteProvider", - ExecuteScript="resource_management.core.providers.system.ExecuteScriptProvider", - Mount="resource_management.core.providers.mount.MountProvider", - User="resource_management.core.providers.accounts.UserProvider", - Group="resource_management.core.providers.accounts.GroupProvider", - Service="resource_management.core.providers.service.ServiceProvider", - ), -) - - -def find_provider(env, resource, class_path=None): - if not class_path: - providers = [PROVIDERS, LIBRARY_PROVIDERS] - for provider in providers: - if resource in provider[env.system.os_family]: - class_path = provider[env.system.os_family][resource] - break - if resource in provider["default"]: - class_path = provider["default"][resource] - break - - try: - mod_path, class_name = class_path.rsplit('.', 1) - except ValueError: - raise Fail("Unable to find provider for %s as %s" % (resource, class_path)) - mod = __import__(mod_path, {}, {}, [class_name]) - return getattr(mod, class_name) http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/accounts.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/accounts.py b/ambari-agent/src/main/python/resource_management/core/providers/accounts.py deleted file mode 100644 index 92a528b..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/accounts.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from __future__ import with_statement - -import grp -import pwd -from resource_management.core import shell -from resource_management.core.providers import Provider -from resource_management.core.logger import Logger - - -class UserProvider(Provider): - def action_create(self): - if not self.user: - command = ['useradd', "-m"] - Logger.info("Adding user %s" % self.resource) - else: - command = ['usermod'] - Logger.info("Modifying user %s" % (self.resource.username)) - - options = dict( - comment="-c", - gid="-g", - uid="-u", - shell="-s", - password="-p", - home="-d", - ) - - if self.resource.system and not self.user: - command.append("--system") - - if self.resource.groups: - command += ["-G", ",".join(self.resource.groups)] - - for option_name, option_flag in options.items(): - option_value = getattr(self.resource, option_name) - if option_flag and option_value: - command += [option_flag, str(option_value)] - - command.append(self.resource.username) - - shell.checked_call(command) - - def action_remove(self): - if self.user: - command = ['userdel', self.resource.username] - shell.checked_call(command) - Logger.info("Removed user %s" % self.resource) - - @property - def user(self): - try: - return pwd.getpwnam(self.resource.username) - except KeyError: - return None - - -class GroupProvider(Provider): - def action_create(self): - group = self.group - if not group: - command = ['groupadd'] - Logger.info("Adding group %s" % self.resource) - else: - command = ['groupmod'] - Logger.info("Modifying group %s" % (self.resource.group_name)) - - options = dict( - gid="-g", - password="-p", - ) - - for option_name, option_flag in options.items(): - option_value = getattr(self.resource, option_name) - if option_flag and option_value: - command += [option_flag, str(option_value)] - - command.append(self.resource.group_name) - - shell.checked_call(command) - - group = self.group - - def action_remove(self): - if self.group: - command = ['groupdel', self.resource.group_name] - shell.checked_call(command) - Logger.info("Removed group %s" % self.resource) - - @property - def group(self): - try: - return grp.getgrnam(self.resource.group_name) - except KeyError: - return None http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/mount.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/mount.py b/ambari-agent/src/main/python/resource_management/core/providers/mount.py deleted file mode 100644 index dc6d7d9..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/mount.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from __future__ import with_statement - -import os -import re -from resource_management.core.base import Fail -from resource_management.core.providers import Provider -from resource_management.core.logger import Logger - - -class MountProvider(Provider): - def action_mount(self): - if not os.path.exists(self.resource.mount_point): - os.makedirs(self.resource.mount_point) - - if self.is_mounted(): - Logger.debug("%s already mounted" % self) - else: - args = ["mount"] - if self.resource.fstype: - args += ["-t", self.resource.fstype] - if self.resource.options: - args += ["-o", ",".join(self.resource.options)] - if self.resource.device: - args.append(self.resource.device) - args.append(self.resource.mount_point) - - check_call(args) - - Logger.info("%s mounted" % self) - - def action_umount(self): - if self.is_mounted(): - check_call(["umount", self.resource.mount_point]) - - Logger.info("%s unmounted" % self) - else: - Logger.debug("%s is not mounted" % self) - - def action_enable(self): - if self.is_enabled(): - Logger.debug("%s already enabled" % self) - else: - if not self.resource.device: - raise Fail("[%s] device not set but required for enable action" % self) - if not self.resource.fstype: - raise Fail("[%s] fstype not set but required for enable action" % self) - - with open("/etc/fstab", "a") as fp: - fp.write("%s %s %s %s %d %d\n" % ( - self.resource.device, - self.resource.mount_point, - self.resource.fstype, - ",".join(self.resource.options or ["defaults"]), - self.resource.dump, - self.resource.passno, - )) - - Logger.info("%s enabled" % self) - - def action_disable(self): - pass # TODO - - def is_mounted(self): - if not os.path.exists(self.resource.mount_point): - return False - - if self.resource.device and not os.path.exists(self.resource.device): - raise Fail("%s Device %s does not exist" % (self, self.resource.device)) - - mounts = self.get_mounted() - for m in mounts: - if m['mount_point'] == self.resource.mount_point: - return True - - return False - - def is_enabled(self): - mounts = self.get_fstab() - for m in mounts: - if m['mount_point'] == self.resource.mount_point: - return True - - return False - - def get_mounted(self): - p = Popen("mount", stdout=PIPE, stderr=STDOUT, shell=True) - out = p.communicate()[0] - if p.wait() != 0: - raise Fail("[%s] Getting list of mounts (calling mount) failed" % self) - - mounts = [x.split(' ') for x in out.strip().split('\n')] - - return [dict( - device=m[0], - mount_point=m[2], - fstype=m[4], - options=m[5][1:-1].split(','), - ) for m in mounts if m[1] == "on" and m[3] == "type"] - - def get_fstab(self): - mounts = [] - with open("/etc/fstab", "r") as fp: - for line in fp: - line = line.split('#', 1)[0].strip() - mount = re.split('\s+', line) - if len(mount) == 6: - mounts.append(dict( - device=mount[0], - mount_point=mount[1], - fstype=mount[2], - options=mount[3].split(","), - dump=int(mount[4]), - passno=int(mount[5]), - )) - return mounts http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/package/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/package/__init__.py b/ambari-agent/src/main/python/resource_management/core/providers/package/__init__.py deleted file mode 100644 index 5ab2b27..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/package/__init__.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from resource_management.core.base import Fail -from resource_management.core.providers import Provider - - -class PackageProvider(Provider): - def __init__(self, *args, **kwargs): - super(PackageProvider, self).__init__(*args, **kwargs) - - def install_package(self, name, version): - raise NotImplementedError() - def remove_package(self, name): - raise NotImplementedError() - def upgrade_package(self, name, version): - raise NotImplementedError() - - def action_install(self): - package_name = self.get_package_name_with_version() - self.install_package(package_name) - - def action_upgrade(self): - package_name = self.get_package_name_with_version() - self.upgrade_package(package_name) - - def action_remove(self): - package_name = self.get_package_name_with_version() - self.remove_package(package_name) - - def get_package_name_with_version(self): - if self.resource.version: - return self.resource.package_name + '-' + self.resource.version - else: - return self.resource.package_name - http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py b/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py deleted file mode 100644 index 4c6e2dd..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -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. - -Ambari Agent - -""" - -from resource_management.core.providers.package import PackageProvider -from resource_management.core import shell -from resource_management.core.logger import Logger - -INSTALL_CMD = "DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef' --allow-unauthenticated --assume-yes install %s" -REPO_UPDATE_CMD = "apt-get update -qq" -REMOVE_CMD = "/usr/bin/apt-get -y -q remove %s" -CHECK_CMD = "dpkg --get-selections %s | grep -v deinstall" - -class AptProvider(PackageProvider): - def install_package(self, name): - if not self._check_existence(name): - cmd = INSTALL_CMD % (name) - Logger.info("Installing package %s ('%s')" % (name, cmd)) - code = shell.call(cmd)[0] - - # apt-get update wasn't done too long - if code: - Logger.info("Failed to install package %s. Executing `apt-get update`" % (name)) - shell.checked_call(REPO_UPDATE_CMD) - Logger.info("Retrying to install package %s" % (name)) - shell.checked_call(cmd) - else: - Logger.info("Skipping installing existent package %s" % (name)) - - def upgrade_package(self, name): - return self.install_package(name) - - def remove_package(self, name): - if self._check_existence(name): - cmd = REMOVE_CMD % (name) - Logger.info("Removing package %s ('%s')" % (name, cmd)) - shell.checked_call(cmd) - else: - Logger.info("Skipping removing non-existent package %s" % (name)) - - def _check_existence(self, name): - code, out = shell.call(CHECK_CMD % name) - return not bool(code) http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/package/yumrpm.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/package/yumrpm.py b/ambari-agent/src/main/python/resource_management/core/providers/package/yumrpm.py deleted file mode 100644 index 7b729f8..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/package/yumrpm.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from resource_management.core.providers.package import PackageProvider -from resource_management.core import shell -from resource_management.core.logger import Logger - -INSTALL_CMD = "/usr/bin/yum -d 0 -e 0 -y install %s" -REMOVE_CMD = "/usr/bin/yum -d 0 -e 0 -y erase %s" -CHECK_CMD = "rpm -q --quiet %s" - -class YumProvider(PackageProvider): - def install_package(self, name): - if not self._check_existence(name): - cmd = INSTALL_CMD % (name) - Logger.info("Installing package %s ('%s')" % (name, cmd)) - shell.checked_call(cmd) - else: - Logger.info("Skipping installing existent package %s" % (name)) - - def upgrade_package(self, name): - return self.install_package(name) - - def remove_package(self, name): - if self._check_existence(name): - cmd = REMOVE_CMD % (name) - Logger.info("Removing package %s ('%s')" % (name, cmd)) - shell.checked_call(cmd) - else: - Logger.info("Skipping removing non-existent package %s" % (name)) - - def _check_existence(self, name): - code, out = shell.call(CHECK_CMD % name) - return not bool(code) http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/package/zypper.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/package/zypper.py b/ambari-agent/src/main/python/resource_management/core/providers/package/zypper.py deleted file mode 100644 index 6577c47..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/package/zypper.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from resource_management.core.providers.package import PackageProvider -from resource_management.core import shell -from resource_management.core.logger import Logger - -INSTALL_CMD = "/usr/bin/zypper --quiet install --auto-agree-with-licenses --no-confirm %s" -REMOVE_CMD = "/usr/bin/zypper --quiet remove --no-confirm %s" -CHECK_CMD = "rpm -q --quiet %s" - -class ZypperProvider(PackageProvider): - def install_package(self, name): - if not self._check_existence(name): - cmd = INSTALL_CMD % (name) - Logger.info("Installing package %s ('%s')" % (name, cmd)) - shell.checked_call(cmd) - else: - Logger.info("Skipping installing existent package %s" % (name)) - - def upgrade_package(self, name): - return self.install_package(name) - - def remove_package(self, name): - if self._check_existence(name): - cmd = REMOVE_CMD % (name) - Logger.info("Removing package %s ('%s')" % (name, cmd)) - shell.checked_call(cmd) - else: - Logger.info("Skipping removing non-existent package %s" % (name)) - - def _check_existence(self, name): - code, out = shell.call(CHECK_CMD % name) - return not bool(code) http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/service.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/service.py b/ambari-agent/src/main/python/resource_management/core/providers/service.py deleted file mode 100644 index 23b1b3a..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/service.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -import os - -from resource_management.core import shell -from resource_management.core.base import Fail -from resource_management.core.providers import Provider -from resource_management.core.logger import Logger - - -class ServiceProvider(Provider): - def action_start(self): - if not self.status(): - self._exec_cmd("start", 0) - - def action_stop(self): - if self.status(): - self._exec_cmd("stop", 0) - - def action_restart(self): - if not self.status(): - self._exec_cmd("start", 0) - else: - self._exec_cmd("restart", 0) - - def action_reload(self): - if not self.status(): - self._exec_cmd("start", 0) - else: - self._exec_cmd("reload", 0) - - def status(self): - return self._exec_cmd("status") == 0 - - def _exec_cmd(self, command, expect=None): - if command != "status": - Logger.info("%s command '%s'" % (self.resource, command)) - - custom_cmd = getattr(self.resource, "%s_command" % command, None) - if custom_cmd: - Logger.debug("%s executing '%s'" % (self.resource, custom_cmd)) - if hasattr(custom_cmd, "__call__"): - if custom_cmd(): - ret = 0 - else: - ret = 1 - else: - ret,out = shell.call(custom_cmd) - else: - ret = self._init_cmd(command) - - if expect is not None and expect != ret: - raise Fail("%r command %s for service %s failed with return code: %d. %s" % ( - self, command, self.resource.service_name, ret, out)) - return ret - - def _init_cmd(self, command): - if self._upstart: - if command == "status": - ret,out = shell.call(["/sbin/" + command, self.resource.service_name]) - _proc, state = out.strip().split(' ', 1) - ret = 0 if state != "stop/waiting" else 1 - else: - ret,out = shell.call(["/sbin/" + command, self.resource.service_name]) - else: - ret,out = shell.call(["/etc/init.d/%s" % self.resource.service_name, command]) - return ret - - @property - def _upstart(self): - try: - return self.__upstart - except AttributeError: - self.__upstart = os.path.exists("/sbin/start") \ - and os.path.exists("/etc/init/%s.conf" % self.resource.service_name) - return self.__upstart http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/providers/system.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/system.py b/ambari-agent/src/main/python/resource_management/core/providers/system.py deleted file mode 100644 index 33b9ad9..0000000 --- a/ambari-agent/src/main/python/resource_management/core/providers/system.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from __future__ import with_statement - -import grp -import os -import pwd -import time -import shutil -from resource_management.core import shell -from resource_management.core.base import Fail -from resource_management.core import ExecuteTimeoutException -from resource_management.core.providers import Provider -from resource_management.core.logger import Logger - - -def _coerce_uid(user): - try: - uid = int(user) - except ValueError: - try: - uid = pwd.getpwnam(user).pw_uid - except KeyError: - raise Fail("User %s doesn't exist." % user) - return uid - - -def _coerce_gid(group): - try: - gid = int(group) - except ValueError: - try: - gid = grp.getgrnam(group).gr_gid - except KeyError: - raise Fail("Group %s doesn't exist." % group) - return gid - - -def _ensure_metadata(path, user, group, mode=None): - stat = os.stat(path) - - if mode: - existing_mode = stat.st_mode & 07777 - if existing_mode != mode: - Logger.info("Changing permission for %s from %o to %o" % ( - path, existing_mode, mode)) - os.chmod(path, mode) - - if user: - uid = _coerce_uid(user) - if stat.st_uid != uid: - Logger.info( - "Changing owner for %s from %d to %s" % (path, stat.st_uid, user)) - os.chown(path, uid, -1) - - if group: - gid = _coerce_gid(group) - if stat.st_gid != gid: - Logger.info( - "Changing group for %s from %d to %s" % (path, stat.st_gid, group)) - os.chown(path, -1, gid) - - -class FileProvider(Provider): - def action_create(self): - path = self.resource.path - - if os.path.isdir(path): - raise Fail("Applying %s failed, directory with name %s exists" % (self.resource, path)) - - dirname = os.path.dirname(path) - if not os.path.isdir(dirname): - raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname)) - - write = False - content = self._get_content() - if not os.path.exists(path): - write = True - reason = "it doesn't exist" - elif self.resource.replace: - if content is not None: - with open(path, "rb") as fp: - old_content = fp.read() - if content != old_content: - write = True - reason = "contents don't match" - if self.resource.backup: - self.resource.env.backup_file(path) - - if write: - Logger.info("Writing %s because %s" % (self.resource, reason)) - with open(path, "wb") as fp: - if content: - fp.write(content) - - _ensure_metadata(self.resource.path, self.resource.owner, - self.resource.group, mode=self.resource.mode) - - def action_delete(self): - path = self.resource.path - - if os.path.isdir(path): - raise Fail("Applying %s failed, %s is directory not file!" % (self.resource, path)) - - if os.path.exists(path): - Logger.info("Deleting %s" % self.resource) - os.unlink(path) - - def _get_content(self): - content = self.resource.content - if content is None: - return None - elif isinstance(content, basestring): - return content - elif hasattr(content, "__call__"): - return content() - raise Fail("Unknown source type for %s: %r" % (self, content)) - - -class DirectoryProvider(Provider): - def action_create(self): - path = self.resource.path - if not os.path.exists(path): - Logger.info("Creating directory %s" % self.resource) - if self.resource.recursive: - os.makedirs(path, self.resource.mode or 0755) - else: - dirname = os.path.dirname(path) - if not os.path.isdir(dirname): - raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname)) - - os.mkdir(path, self.resource.mode or 0755) - - if not os.path.isdir(path): - raise Fail("Applying %s failed, file %s already exists" % (self.resource, path)) - - _ensure_metadata(path, self.resource.owner, self.resource.group, - mode=self.resource.mode) - - def action_delete(self): - path = self.resource.path - if os.path.exists(path): - if not os.path.isdir(path): - raise Fail("Applying %s failed, %s is not a directory" % (self.resource, path)) - - Logger.info("Removing directory %s and all its content" % self.resource) - shutil.rmtree(path) - - -class LinkProvider(Provider): - def action_create(self): - path = self.resource.path - - if os.path.lexists(path): - oldpath = os.path.realpath(path) - if oldpath == self.resource.to: - return - if not os.path.islink(path): - raise Fail( - "%s trying to create a symlink with the same name as an existing file or directory" % self) - Logger.info("%s replacing old symlink to %s" % (self.resource, oldpath)) - os.unlink(path) - - if self.resource.hard: - if not os.path.exists(self.resource.to): - raise Fail("Failed to apply %s, linking to nonexistent location %s" % (self.resource, self.resource.to)) - if os.path.isdir(self.resource.to): - raise Fail("Failed to apply %s, cannot create hard link to a directory (%s)" % (self.resource, self.resource.to)) - - Logger.info("Creating hard %s" % self.resource) - os.link(self.resource.to, path) - else: - if not os.path.exists(self.resource.to): - Logger.info("Warning: linking to nonexistent location %s" % self.resource.to) - - Logger.info("Creating symbolic %s" % self.resource) - os.symlink(self.resource.to, path) - - def action_delete(self): - path = self.resource.path - if os.path.exists(path): - Logger.info("Deleting %s" % self.resource) - os.unlink(path) - - -def _preexec_fn(resource): - def preexec(): - if resource.group: - gid = _coerce_gid(resource.group) - os.setgid(gid) - os.setegid(gid) - - return preexec - - -class ExecuteProvider(Provider): - def action_run(self): - if self.resource.creates: - if os.path.exists(self.resource.creates): - return - - Logger.debug("Executing %s" % self.resource) - - if self.resource.path != []: - if not self.resource.environment: - self.resource.environment = {} - - self.resource.environment['PATH'] = os.pathsep.join(self.resource.path) - - for i in range (0, self.resource.tries): - try: - shell.checked_call(self.resource.command, logoutput=self.resource.logoutput, - cwd=self.resource.cwd, env=self.resource.environment, - preexec_fn=_preexec_fn(self.resource), user=self.resource.user, - wait_for_finish=self.resource.wait_for_finish, timeout=self.resource.timeout) - break - except Fail as ex: - if i == self.resource.tries-1: # last try - raise ex - else: - Logger.info("Retrying after %d seconds. Reason: %s" % (self.resource.try_sleep, str(ex))) - time.sleep(self.resource.try_sleep) - except ExecuteTimeoutException: - err_msg = ("Execution of '%s' was killed due timeout after %d seconds") % (self.resource.command, self.resource.timeout) - - if self.resource.on_timeout: - Logger.info("Executing '%s'. Reason: %s" % (self.resource.on_timeout, err_msg)) - shell.checked_call(self.resource.on_timeout) - else: - raise Fail(err_msg) - - -class ExecuteScriptProvider(Provider): - def action_run(self): - from tempfile import NamedTemporaryFile - - Logger.info("Running script %s" % self.resource) - with NamedTemporaryFile(prefix="resource_management-script", bufsize=0) as tf: - tf.write(self.resource.code) - tf.flush() - - _ensure_metadata(tf.name, self.resource.user, self.resource.group) - shell.call([self.resource.interpreter, tf.name], - cwd=self.resource.cwd, env=self.resource.environment, - preexec_fn=_preexec_fn(self.resource)) http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/resources/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/resources/__init__.py b/ambari-agent/src/main/python/resource_management/core/resources/__init__.py deleted file mode 100644 index d5e903c..0000000 --- a/ambari-agent/src/main/python/resource_management/core/resources/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -from resource_management.core.resources.accounts import * -from resource_management.core.resources.packaging import * -from resource_management.core.resources.service import * -from resource_management.core.resources.system import * http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/resources/accounts.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/resources/accounts.py b/ambari-agent/src/main/python/resource_management/core/resources/accounts.py deleted file mode 100644 index f498db5..0000000 --- a/ambari-agent/src/main/python/resource_management/core/resources/accounts.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" -__all__ = ["Group", "User"] - -from resource_management.core.base import Resource, ForcedListArgument, ResourceArgument, BooleanArgument - - -class Group(Resource): - action = ForcedListArgument(default="create") - group_name = ResourceArgument(default=lambda obj: obj.name) - gid = ResourceArgument() - password = ResourceArgument() - - actions = Resource.actions + ["create", "remove"] - - -class User(Resource): - action = ForcedListArgument(default="create") - username = ResourceArgument(default=lambda obj: obj.name) - comment = ResourceArgument() - uid = ResourceArgument() - gid = ResourceArgument() - groups = ForcedListArgument(default=[]) # supplementary groups - home = ResourceArgument() - shell = ResourceArgument(default="/bin/bash") - password = ResourceArgument() - system = BooleanArgument(default=False) - - actions = Resource.actions + ["create", "remove"] http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/resources/packaging.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/resources/packaging.py b/ambari-agent/src/main/python/resource_management/core/resources/packaging.py deleted file mode 100644 index c2ff20e..0000000 --- a/ambari-agent/src/main/python/resource_management/core/resources/packaging.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["Package"] - -from resource_management.core.base import Resource, ForcedListArgument, ResourceArgument - - -class Package(Resource): - action = ForcedListArgument(default="install") - package_name = ResourceArgument(default=lambda obj: obj.name) - location = ResourceArgument(default=lambda obj: obj.package_name) - version = ResourceArgument() - actions = ["install", "upgrade", "remove"] - build_vars = ForcedListArgument(default=[]) http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/resources/service.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/resources/service.py b/ambari-agent/src/main/python/resource_management/core/resources/service.py deleted file mode 100644 index 20d5c1b..0000000 --- a/ambari-agent/src/main/python/resource_management/core/resources/service.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["Service"] - -from resource_management.core.base import Resource, ResourceArgument, ForcedListArgument - - -class Service(Resource): - action = ForcedListArgument(default="start") - service_name = ResourceArgument(default=lambda obj: obj.name) - #enabled = ResourceArgument() # Maybe add support to put in/out autostart. - start_command = ResourceArgument() - stop_command = ResourceArgument() - restart_command = ResourceArgument() - reload_command = ResourceArgument() # reload the config file without interrupting pending operations - status_command = ResourceArgument() - - actions = ["nothing", "start", "stop", "restart", "reload"] http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/resources/system.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/resources/system.py b/ambari-agent/src/main/python/resource_management/core/resources/system.py deleted file mode 100644 index 0952c48..0000000 --- a/ambari-agent/src/main/python/resource_management/core/resources/system.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["File", "Directory", "Link", "Execute", "ExecuteScript", "Mount"] - -from resource_management.core.base import Resource, ForcedListArgument, ResourceArgument, BooleanArgument - - -class File(Resource): - action = ForcedListArgument(default="create") - path = ResourceArgument(default=lambda obj: obj.name) - backup = ResourceArgument() - mode = ResourceArgument() - owner = ResourceArgument() - group = ResourceArgument() - content = ResourceArgument() - # whether to replace files with different content - replace = ResourceArgument(default=True) - - actions = Resource.actions + ["create", "delete"] - - -class Directory(Resource): - action = ForcedListArgument(default="create") - path = ResourceArgument(default=lambda obj: obj.name) - mode = ResourceArgument() - owner = ResourceArgument() - group = ResourceArgument() - recursive = BooleanArgument(default=False) # this work for 'create', 'delete' is anyway recursive - - actions = Resource.actions + ["create", "delete"] - - -class Link(Resource): - action = ForcedListArgument(default="create") - path = ResourceArgument(default=lambda obj: obj.name) - to = ResourceArgument(required=True) - hard = BooleanArgument(default=False) - - actions = Resource.actions + ["create", "delete"] - - -class Execute(Resource): - action = ForcedListArgument(default="run") - - """ - Recommended: - command = ('rm','-f','myfile') - Not recommended: - command = 'rm -f myfile' - - The first one helps to stop escaping issues - """ - command = ResourceArgument(default=lambda obj: obj.name) - - creates = ResourceArgument() - cwd = ResourceArgument() - # this runs command with a specific env variables, env={'JAVA_HOME': '/usr/jdk'} - environment = ResourceArgument() - user = ResourceArgument() - group = ResourceArgument() - returns = ForcedListArgument(default=0) - tries = ResourceArgument(default=1) - try_sleep = ResourceArgument(default=0) # seconds - path = ForcedListArgument(default=[]) - actions = Resource.actions + ["run"] - logoutput = BooleanArgument(default=False) - """ - if on_timeout is not set leads to failing after x seconds, - otherwise calls on_timeout - """ - timeout = ResourceArgument() # seconds - on_timeout = ResourceArgument() - """ - Wait for command to finish or not. - - NOTE: - In case of False, since any command results are skipped, it disables some functionality: - - non-zero return code failure - - logoutput - - tries - - try_sleep - """ - wait_for_finish = BooleanArgument(default=True) - - -class ExecuteScript(Resource): - action = ForcedListArgument(default="run") - code = ResourceArgument(required=True) - cwd = ResourceArgument() - environment = ResourceArgument() - interpreter = ResourceArgument(default="/bin/bash") - user = ResourceArgument() - group = ResourceArgument() - - actions = Resource.actions + ["run"] - - -class Mount(Resource): - action = ForcedListArgument(default="mount") - mount_point = ResourceArgument(default=lambda obj: obj.name) - device = ResourceArgument() - fstype = ResourceArgument() - options = ResourceArgument(default=["defaults"]) - dump = ResourceArgument(default=0) - passno = ResourceArgument(default=2) - - actions = Resource.actions + ["mount", "umount", "remount", "enable", - "disable"] http://git-wip-us.apache.org/repos/asf/ambari/blob/55bbcae4/ambari-agent/src/main/python/resource_management/core/shell.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/shell.py b/ambari-agent/src/main/python/resource_management/core/shell.py deleted file mode 100644 index 80e2a38..0000000 --- a/ambari-agent/src/main/python/resource_management/core/shell.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python -""" -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Ambari Agent - -""" - -__all__ = ["checked_call", "call", "quote_bash_args"] - -import string -import subprocess -import threading -from multiprocessing import Queue -from exceptions import Fail -from exceptions import ExecuteTimeoutException -from resource_management.core.logger import Logger - -def checked_call(command, logoutput=False, - cwd=None, env=None, preexec_fn=None, user=None, wait_for_finish=True, timeout=None): - return _call(command, logoutput, True, cwd, env, preexec_fn, user, wait_for_finish, timeout) - -def call(command, logoutput=False, - cwd=None, env=None, preexec_fn=None, user=None, wait_for_finish=True, timeout=None): - return _call(command, logoutput, False, cwd, env, preexec_fn, user, wait_for_finish, timeout) - -def _call(command, logoutput=False, throw_on_failure=True, - cwd=None, env=None, preexec_fn=None, user=None, wait_for_finish=True, timeout=None): - """ - Execute shell command - - @param command: list/tuple of arguments (recommended as more safe - don't need to escape) - or string of the command to execute - @param logoutput: boolean, whether command output should be logged of not - @param throw_on_failure: if true, when return code is not zero exception is thrown - - @return: retrun_code, stdout - """ - # convert to string and escape - if isinstance(command, (list, tuple)): - command = ' '.join(quote_bash_args(x) for x in command) - - if user: - command = ["su", "-", user, "-c", command] - else: - command = ["/bin/bash","--login","-c", command] - - proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - cwd=cwd, env=env, shell=False, - preexec_fn=preexec_fn) - - if not wait_for_finish: - return None, None - - if timeout: - q = Queue() - t = threading.Timer( timeout, on_timeout, [proc, q] ) - t.start() - - out = proc.communicate()[0].strip('\n') - - if timeout: - if q.empty(): - t.cancel() - # timeout occurred - else: - raise ExecuteTimeoutException() - - code = proc.returncode - - if logoutput and out: - Logger.info(out) - - if throw_on_failure and code: - err_msg = Logger.get_protected_text(("Execution of '%s' returned %d. %s") % (command[-1], code, out)) - raise Fail(err_msg) - - return code, out - -def on_timeout(proc, q): - q.put(True) - if proc.poll() == None: - try: - proc.terminate() - except: - pass - -def quote_bash_args(command): - if not command: - return "''" - valid = set(string.ascii_letters + string.digits + '@%_-+=:,./') - for char in command: - if char not in valid: - return "'" + command.replace("'", "'\"'\"'") + "'" - return command \ No newline at end of file