You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2013/11/01 16:28:18 UTC
[07/15] AMBARI-3658. Resource management. Support common custom
libraries. (Andrew Onischuk via dlysnichenko)
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/__init__.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/__init__.py b/ambari-agent/src/main/python/resource_management/providers/__init__.py
deleted file mode 100644
index 21dd953..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/__init__.py
+++ /dev/null
@@ -1,68 +0,0 @@
-__all__ = ["Provider", "find_provider"]
-
-import logging
-from resource_management.exceptions import Fail
-
-
-class Provider(object):
- def __init__(self, resource):
- self.log = logging.getLogger("resource_management.provider")
- 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.providers.package.yumrpm.YumProvider",
- ),
- centos=dict(
- Package="resource_management.providers.package.yumrpm.YumProvider",
- ),
- suse=dict(
- Package="resource_management.providers.package.zypper.ZypperProvider",
- ),
- fedora=dict(
- Package="resource_management.providers.package.yumrpm.YumProvider",
- ),
- amazon=dict(
- Package="resource_management.providers.package.yumrpm.YumProvider",
- ),
- default=dict(
- File="resource_management.providers.system.FileProvider",
- Directory="resource_management.providers.system.DirectoryProvider",
- Link="resource_management.providers.system.LinkProvider",
- Execute="resource_management.providers.system.ExecuteProvider",
- Script="resource_management.providers.system.ScriptProvider",
- Mount="resource_management.providers.mount.MountProvider",
- User="resource_management.providers.accounts.UserProvider",
- Group="resource_management.providers.accounts.GroupProvider",
- Service="resource_management.providers.service.ServiceProvider",
- ),
-)
-
-
-def find_provider(env, resource, class_path=None):
- if not class_path:
- try:
- class_path = PROVIDERS[env.system.platform][resource]
- except KeyError:
- class_path = PROVIDERS["default"][resource]
-
- if class_path.startswith('*'):
- cookbook, classname = class_path[1:].split('.')
- return getattr(env.cookbooks[cookbook], classname)
-
- 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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/accounts.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/accounts.py b/ambari-agent/src/main/python/resource_management/providers/accounts.py
deleted file mode 100644
index e164eb2..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/accounts.py
+++ /dev/null
@@ -1,97 +0,0 @@
-from __future__ import with_statement
-
-import grp
-import pwd
-from resource_management import shell
-from resource_management.providers import Provider
-
-
-class UserProvider(Provider):
- def action_create(self):
- if not self.user:
- command = ['useradd', "-m"]
- self.log.info("Adding user %s" % self.resource)
- else:
- command = ['usermod']
- self.log.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)
- self.resource.updated()
-
- def action_remove(self):
- if self.user:
- command = ['userdel', self.resource.username]
- shell.checked_call(command)
- self.resource.updated()
- self.log.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']
- self.log.info("Adding group %s" % self.resource)
- else:
- command = ['groupmod']
- self.log.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)
- self.resource.updated()
-
- group = self.group
-
- def action_remove(self):
- if self.group:
- command = ['groupdel', self.resource.group_name]
- shell.checked_call(command)
- self.resource.updated()
- self.log.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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/mount.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/mount.py b/ambari-agent/src/main/python/resource_management/providers/mount.py
deleted file mode 100644
index 4170d3b..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/mount.py
+++ /dev/null
@@ -1,117 +0,0 @@
-from __future__ import with_statement
-
-import os
-import re
-from resource_management.base import Fail
-from resource_management.providers import Provider
-
-
-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():
- self.log.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)
-
- self.log.info("%s mounted" % self)
- self.resource.updated()
-
- def action_umount(self):
- if self.is_mounted():
- check_call(["umount", self.resource.mount_point])
-
- self.log.info("%s unmounted" % self)
- self.resource.updated()
- else:
- self.log.debug("%s is not mounted" % self)
-
- def action_enable(self):
- if self.is_enabled():
- self.log.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,
- ))
-
- self.log.info("%s enabled" % self)
- self.resource.updated()
-
- 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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/package/__init__.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/package/__init__.py b/ambari-agent/src/main/python/resource_management/providers/package/__init__.py
deleted file mode 100644
index db83c62..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/package/__init__.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from resource_management.base import Fail
-from resource_management.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.log.info("Installing package %s", package_name)
- self.install_package(package_name)
-
- def action_upgrade(self):
- package_name = self.get_package_name_with_version()
- self.log.info("Upgrading package %s", package_name)
- self.upgrade_package(package_name)
-
- def action_remove(self):
- package_name = self.get_package_name_with_version()
- self.log.info("Removing package %s", package_name)
- 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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py b/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py
deleted file mode 100644
index 652597e..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from resource_management.providers.package import PackageProvider
-from resource_management import shell
-
-INSTALL_CMD = "/usr/bin/yum -d 0 -e 0 -y install %s"
-REMOVE_CMD = "/usr/bin/yum -d 0 -e 0 -y erase %s"
-
-class YumProvider(PackageProvider):
- def install_package(self, name):
- shell.checked_call(INSTALL_CMD % (name))
-
- def upgrade_package(self, name):
- return self.install_package(name)
-
- def remove_package(self, name):
- shell.checked_call(REMOVE_CMD % (name))
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/package/zypper.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/package/zypper.py b/ambari-agent/src/main/python/resource_management/providers/package/zypper.py
deleted file mode 100644
index fe4cadd..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/package/zypper.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from resource_management.providers.package import PackageProvider
-from resource_management import shell
-
-INSTALL_CMD = "/usr/bin/zypper --quiet install --auto-agree-with-licenses --no-confirm %s"
-REMOVE_CMD = "/usr/bin/zypper --quiet remove --no-confirm %s"
-
-class ZypperProvider(PackageProvider):
- def install_package(self, name):
- shell.checked_call(INSTALL_CMD % (name))
-
- def upgrade_package(self, name):
- return self.install_package(name)
-
- def remove_package(self, name):
- shell.checked_call(REMOVE_CMD % (name))
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/service.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/service.py b/ambari-agent/src/main/python/resource_management/providers/service.py
deleted file mode 100644
index beb1c24..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/service.py
+++ /dev/null
@@ -1,79 +0,0 @@
-import os
-
-from resource_management import shell
-from resource_management.base import Fail
-from resource_management.providers import Provider
-
-
-class ServiceProvider(Provider):
- def action_start(self):
- if not self.status():
- self._exec_cmd("start", 0)
- self.resource.updated()
-
- def action_stop(self):
- if self.status():
- self._exec_cmd("stop", 0)
- self.resource.updated()
-
- def action_restart(self):
- if not self.status():
- self._exec_cmd("start", 0)
- self.resource.updated()
- else:
- self._exec_cmd("restart", 0)
- self.resource.updated()
-
- def action_reload(self):
- if not self.status():
- self._exec_cmd("start", 0)
- self.resource.updated()
- else:
- self._exec_cmd("reload", 0)
- self.resource.updated()
-
- def status(self):
- return self._exec_cmd("status") == 0
-
- def _exec_cmd(self, command, expect=None):
- if command != "status":
- self.log.info("%s command '%s'" % (self.resource, command))
-
- custom_cmd = getattr(self.resource, "%s_command" % command, None)
- if custom_cmd:
- self.log.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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/providers/system.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/system.py b/ambari-agent/src/main/python/resource_management/providers/system.py
deleted file mode 100644
index d4ff90c..0000000
--- a/ambari-agent/src/main/python/resource_management/providers/system.py
+++ /dev/null
@@ -1,248 +0,0 @@
-from __future__ import with_statement
-
-import grp
-import os
-import pwd
-import time
-import shutil
-from resource_management import shell
-from resource_management.base import Fail
-from resource_management.providers import Provider
-
-
-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, log=None):
- stat = os.stat(path)
- updated = False
-
- if mode:
- existing_mode = stat.st_mode & 07777
- if existing_mode != mode:
- log and log.info("Changing permission for %s from %o to %o" % (
- path, existing_mode, mode))
- os.chmod(path, mode)
- updated = True
-
- if user:
- uid = _coerce_uid(user)
- if stat.st_uid != uid:
- log and log.info(
- "Changing owner for %s from %d to %s" % (path, stat.st_uid, user))
- os.chown(path, uid, -1)
- updated = True
-
- if group:
- gid = _coerce_gid(group)
- if stat.st_gid != gid:
- log and log.info(
- "Changing group for %s from %d to %s" % (path, stat.st_gid, group))
- os.chown(path, -1, gid)
- updated = True
-
- return updated
-
-
-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:
- self.log.info("Writing %s because %s" % (self.resource, reason))
- with open(path, "wb") as fp:
- if content:
- fp.write(content)
- self.resource.updated()
-
- if _ensure_metadata(self.resource.path, self.resource.owner,
- self.resource.group, mode=self.resource.mode,
- log=self.log):
- self.resource.updated()
-
- 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):
- self.log.info("Deleting %s" % self.resource)
- os.unlink(path)
- self.resource.updated()
-
- 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):
- self.log.info("Creating directory %s" % self.resource)
- if self.resource.recursive:
- os.makedirs(path, self.resource.mode or 0755)
- else:
- os.mkdir(path, self.resource.mode or 0755)
- self.resource.updated()
-
- if not os.path.isdir(path):
- raise Fail("Applying %s failed, file %s already exists" % (self.resource, path))
-
- if _ensure_metadata(path, self.resource.owner, self.resource.group,
- mode=self.resource.mode, log=self.log):
- self.resource.updated()
-
- 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))
-
- self.log.info("Removing directory %s and all its content" % self.resource)
- shutil.rmtree(path)
- self.resource.updated()
-
-
-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)
- self.log.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))
-
- self.log.info("Creating hard %s" % self.resource)
- os.link(self.resource.to, path)
- self.resource.updated()
- else:
- if not os.path.exists(self.resource.to):
- self.log.info("Warning: linking to nonexistent location %s", self.resource.to)
-
- self.log.info("Creating symbolic %s" % self.resource)
- os.symlink(self.resource.to, path)
- self.resource.updated()
-
- def action_delete(self):
- path = self.resource.path
- if os.path.exists(path):
- self.log.info("Deleting %s" % self.resource)
- os.unlink(path)
- self.resource.updated()
-
-
-def _preexec_fn(resource):
- def preexec():
- if resource.group:
- gid = _coerce_gid(resource.group)
- os.setgid(gid)
- os.setegid(gid)
- if resource.user:
- uid = _coerce_uid(resource.user)
- os.setuid(uid)
- os.seteuid(uid)
-
- return preexec
-
-
-class ExecuteProvider(Provider):
- def action_run(self):
- if self.resource.creates:
- if os.path.exists(self.resource.creates):
- return
-
- self.log.info("Executing %s" % self.resource)
-
- if self.resource.path != []:
- 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))
- break
- except Fail as ex:
- if i == self.resource.tries-1: # last try
- raise ex
- else:
- self.log.info("Retrying after %d seconds. Reason: %s", self.resource.try_sleep, str(ex))
- time.sleep(self.resource.try_sleep)
-
- self.resource.updated()
-
-
-class ScriptProvider(Provider):
- def action_run(self):
- from tempfile import NamedTemporaryFile
-
- self.log.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))
- self.resource.updated()
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/resources/__init__.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/resources/__init__.py b/ambari-agent/src/main/python/resource_management/resources/__init__.py
deleted file mode 100644
index 00af1b6..0000000
--- a/ambari-agent/src/main/python/resource_management/resources/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from resource_management.resources.accounts import *
-from resource_management.resources.packaging import *
-from resource_management.resources.service import *
-from resource_management.resources.system import *
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/resources/accounts.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/resources/accounts.py b/ambari-agent/src/main/python/resource_management/resources/accounts.py
deleted file mode 100644
index c087ac9..0000000
--- a/ambari-agent/src/main/python/resource_management/resources/accounts.py
+++ /dev/null
@@ -1,27 +0,0 @@
-__all__ = ["Group", "User"]
-
-from resource_management.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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/resources/packaging.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/resources/packaging.py b/ambari-agent/src/main/python/resource_management/resources/packaging.py
deleted file mode 100644
index d615ea5..0000000
--- a/ambari-agent/src/main/python/resource_management/resources/packaging.py
+++ /dev/null
@@ -1,12 +0,0 @@
-__all__ = ["Package"]
-
-from resource_management.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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/resources/service.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/resources/service.py b/ambari-agent/src/main/python/resource_management/resources/service.py
deleted file mode 100644
index 7fbcd89..0000000
--- a/ambari-agent/src/main/python/resource_management/resources/service.py
+++ /dev/null
@@ -1,16 +0,0 @@
-__all__ = ["Service"]
-
-from resource_management.base import Resource, ResourceArgument, BooleanArgument, 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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/resources/system.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/resources/system.py b/ambari-agent/src/main/python/resource_management/resources/system.py
deleted file mode 100644
index e53a569..0000000
--- a/ambari-agent/src/main/python/resource_management/resources/system.py
+++ /dev/null
@@ -1,89 +0,0 @@
-__all__ = ["File", "Directory", "Link", "Execute", "Script", "Mount"]
-
-from resource_management.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(default={})
- 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)
-
-
-class Script(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/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/script.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/script.py b/ambari-agent/src/main/python/resource_management/script.py
deleted file mode 100644
index d64010a..0000000
--- a/ambari-agent/src/main/python/resource_management/script.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env python2.6
-
-'''
-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 sys
-import json
-import logging
-
-from resource_management.environment import Environment
-from resource_management.exceptions import Fail
-
-
-class Script():
- """
- Executes a command for custom service. stdout and stderr are written to
- tmpoutfile and to tmperrfile respectively.
- """
-
- def __init__(self):
- pass
-
-
- def start(self, env, params): # TODO: just for test runs; remove
- env.set_prefixes("ddd")
- print "Start!"
- pass
-
-
- def execute(self):
- """
- Sets up logging;
- Parses command parameters and executes method relevant to command type
- """
- # set up logging (two separate loggers for stderr and stdout with different loglevels)
- logger = logging.getLogger('resource_management')
- logger.setLevel(logging.DEBUG)
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- chout = logging.StreamHandler(sys.stdout)
- chout.setLevel(logging.DEBUG)
- chout.setFormatter(formatter)
- cherr = logging.StreamHandler(sys.stderr)
- cherr.setLevel(logging.ERROR)
- cherr.setFormatter(formatter)
- logger.addHandler(cherr)
- # parse arguments
- if len(sys.argv) < 1+3:
- logger.error("Script expects at least 3 arguments")
- sys.exit(1)
- command_type = str.lower(sys.argv[1])
- # parse command parameters
- command_data_file = sys.argv[2]
- basedir = sys.argv[3]
- try:
- with open(command_data_file, "r") as f:
- pass
- params = json.load(f)
- except IOError:
- logger.exception("Can not read json file with command parameters: ")
- sys.exit(1)
- # Run class method mentioned by a command type
- self_methods = dir(self)
- if not command_type in self_methods:
- logger.error("Script {0} has not method '{1}'".format(sys.argv[0], command_type))
- sys.exit(1)
- method = getattr(self, command_type)
- try:
- with Environment(basedir, params) as env:
- method(env, params)
- env.run()
- except Fail:
- logger.exception("Got exception while executing method '{0}':".format(command_type))
- sys.exit(1)
-
-
-
- def fail_with_error(self, message):
- """
- Prints error message and exits with non-zero exit code
- """
- print("Error: " + message)
- sys.stderr.write("Error: " + message)
- sys.exit(1)
-
-
-if __name__ == "__main__":
- Script().execute()
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/shell.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/shell.py b/ambari-agent/src/main/python/resource_management/shell.py
deleted file mode 100644
index 0ebba09..0000000
--- a/ambari-agent/src/main/python/resource_management/shell.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import logging
-import subprocess
-from exceptions import Fail
-
-log = logging.getLogger("resource_management.provider")
-
-def checked_call(command, logoutput=False,
- cwd=None, env=None, preexec_fn=None):
- return _call(command, logoutput, True, cwd, env, preexec_fn)
-
-def call(command, logoutput=False,
- cwd=None, env=None, preexec_fn=None):
- return _call(command, logoutput, False, cwd, env, preexec_fn)
-
-
-def _call(command, logoutput=False, throw_on_failure=True,
- cwd=None, env=None, preexec_fn=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
- """
-
- shell = not isinstance(command, (list, tuple))
-
- proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
- cwd=cwd, env=env, shell=shell,
- preexec_fn=preexec_fn)
-
- out = proc.communicate()[0]
- code = proc.returncode
-
- if logoutput and out and out!="":
- log.info(out)
-
- if throw_on_failure and code:
- err_msg = ("Execution of '%s' returned %d. %s") % (command, code, out)
- raise Fail(err_msg)
-
- return code, out
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/source.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/source.py b/ambari-agent/src/main/python/resource_management/source.py
deleted file mode 100644
index 925bd65..0000000
--- a/ambari-agent/src/main/python/resource_management/source.py
+++ /dev/null
@@ -1,124 +0,0 @@
-from __future__ import with_statement
-from resource_management import environment
-
-__all__ = ["Source", "Template", "StaticFile", "DownloadSource"]
-
-import hashlib
-import os
-import urllib2
-import urlparse
-from resource_management.exceptions import Fail
-
-
-class Source(object):
- def get_content(self):
- raise NotImplementedError()
-
- def get_checksum(self):
- return None
-
- def __call__(self):
- return self.get_content()
-
-
-class StaticFile(Source):
- def __init__(self, name, env=None):
- self.name = name
- self.env = env or environment.Environment.get_instance()
-
- def get_content(self):
- # absolute path
- if self.name.startswith(os.path.sep):
- path = self.name
- # relative path
- else:
- basedir = self.env.config.basedir
- path = os.path.join(basedir, "files", self.name)
-
- with open(path, "rb") as fp:
- return fp.read()
-
-
-try:
- from jinja2 import Environment, BaseLoader, TemplateNotFound
-except ImportError:
- class Template(Source):
- def __init__(self, name, variables=None, env=None):
- raise Exception("Jinja2 required for Template")
-else:
- class TemplateLoader(BaseLoader):
- def __init__(self, env=None):
- self.env = env or environment.Environment.get_instance()
-
- def get_source(self, environment, template_name):
- # absolute path
- if template_name.startswith(os.path.sep):
- path = template_name
- # relative path
- else:
- basedir = self.env.config.basedir
- path = os.path.join(basedir, "templates", template_name)
-
- if not os.path.exists(path):
- raise TemplateNotFound("%s at %s" % (template_name, path))
- mtime = os.path.getmtime(path)
- with open(path, "rb") as fp:
- source = fp.read().decode('utf-8')
- return source, path, lambda: mtime == os.path.getmtime(path)
-
- class Template(Source):
- def __init__(self, name, variables=None, env=None):
- self.name = name
- self.env = env or environment.Environment.get_instance()
- params = self.env.config.params
- variables = params if params else variables
- self.context = variables.copy() if variables else {}
- self.template_env = Environment(loader=TemplateLoader(self.env),
- autoescape=False)
- self.template = self.template_env.get_template(self.name)
-
- def get_content(self):
- self.context.update(
- env=self.env,
- repr=repr,
- str=str,
- bool=bool,
- )
- rendered = self.template.render(self.context)
- return rendered + "\n" if not rendered.endswith('\n') else rendered
-
-
-class DownloadSource(Source):
- def __init__(self, url, cache=True, md5sum=None, env=None):
- self.env = env or environment.Environment.get_instance()
- self.url = url
- self.md5sum = md5sum
- self.cache = cache
- if not 'download_path' in env.config:
- env.config.download_path = '/var/tmp/downloads'
- if not os.path.exists(env.config.download_path):
- os.makedirs(self.env.config.download_path)
-
- def get_content(self):
- filepath = os.path.basename(urlparse.urlparse(self.url).path)
- content = None
- if not self.cache or not os.path.exists(
- os.path.join(self.env.config.download_path, filepath)):
- web_file = urllib2.urlopen(self.url)
- content = web_file.read()
- else:
- update = False
- with open(os.path.join(self.env.config.download_path, filepath)) as fp:
- content = fp.read()
- if self.md5sum:
- m = hashlib.md5(content)
- md5 = m.hexdigest()
- if md5 != self.md5sum:
- web_file = urllib2.urlopen(self.url)
- content = web_file.read()
- update = True
- if self.cache and update:
- with open(os.path.join(self.env.config.download_path, filepath),
- 'w') as fp:
- fp.write(content)
- return content
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/system.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/system.py b/ambari-agent/src/main/python/resource_management/system.py
deleted file mode 100644
index 89c53cd..0000000
--- a/ambari-agent/src/main/python/resource_management/system.py
+++ /dev/null
@@ -1,128 +0,0 @@
-__all__ = ["System"]
-
-import os
-import sys
-from resource_management import shell
-from functools import wraps
-
-def lazy_property(undecorated):
- name = '_' + undecorated.__name__
-
- @property
- @wraps(undecorated)
- def decorated(self):
- try:
- return getattr(self, name)
- except AttributeError:
- v = undecorated(self)
- setattr(self, name, v)
- return v
-
- return decorated
-
-class System(object):
- @lazy_property
- def os(self):
- platform = sys.platform
- if platform.startswith('linux'):
- return "linux"
- elif platform == "darwin":
- return "darwin"
- else:
- return "unknown"
-
- def unquote(self, val):
- if val[0] == '"':
- val = val[1:-1]
- return val
-
- @lazy_property
- def arch(self):
- machine = self.machine
- if machine in ("i386", "i486", "i686"):
- return "x86_32"
- return machine
-
- @lazy_property
- def machine(self):
- code, out = shell.call(["/bin/uname", "-m"])
- return out.strip()
-
- @lazy_property
- def lsb(self):
- if os.path.exists("/usr/bin/lsb_release"):
- code, out = shell.call(["/usr/bin/lsb_release", "-a"])
- lsb = {}
- for l in out.split('\n'):
- v = l.split(':', 1)
- if len(v) != 2:
- continue
- lsb[v[0].strip().lower()] = self.unquote(v[1].strip().lower())
-
- # failsafe
- if not 'distributor id' in lsb:
- return None
-
- lsb['id'] = lsb.pop('distributor id')
- return lsb
-
- return None
-
- @lazy_property
- def platform(self):
- operatingsystem = self.os
- if operatingsystem == "linux":
- lsb = self.lsb
- if not lsb:
- if os.path.exists("/etc/redhat-release"):
- return "redhat"
- if os.path.exists("/etc/fedora-release"):
- return "fedora"
- if os.path.exists("/etc/centos-release"):
- return "centos"
- if os.path.exists("/etc/SuSE-release"):
- return "suse"
- if os.path.exists("/etc/system-release"):
- with open("/etc/system-release", "rb") as fp:
- release = fp.read()
- if "Amazon Linux" in release:
- return "amazon"
- return "unknown"
-
- lsb_id = lsb['id'].lower()
- if lsb_id =="suse linux":
- return "suse"
- return lsb_id
- return "unknown"
-
- @lazy_property
- def locales(self):
- code, out = shell.call("locale -a")
- return out.strip().split("\n")
-
- @lazy_property
- def ec2(self):
- if not os.path.exists("/proc/xen"):
- return False
- if os.path.exists("/etc/ec2_version"):
- return True
- return False
-
- @lazy_property
- def vm(self):
- if os.path.exists("/usr/bin/VBoxControl"):
- return "vbox"
- elif os.path.exists("/usr/bin/vmware-toolbox-cmd") or os.path.exists(
- "/usr/sbin/vmware-toolbox-cmd"):
- return "vmware"
- elif os.path.exists("/proc/xen"):
- return "xen"
- return None
-
- @classmethod
- def get_instance(cls):
- try:
- return cls._instance
- except AttributeError:
- cls._instance = cls()
- return cls._instance
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/84274b4f/ambari-agent/src/main/python/resource_management/utils.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/utils.py b/ambari-agent/src/main/python/resource_management/utils.py
deleted file mode 100644
index 4a00576..0000000
--- a/ambari-agent/src/main/python/resource_management/utils.py
+++ /dev/null
@@ -1,133 +0,0 @@
-class AttributeDictionary(object):
- def __init__(self, *args, **kwargs):
- d = kwargs
- if args:
- d = args[0]
- super(AttributeDictionary, self).__setattr__("_dict", d)
-
- def __setattr__(self, name, value):
- self[name] = value
-
- def __getattr__(self, name):
- if name in self.__dict__:
- return self.__dict__[name]
- try:
- return self[name]
- except KeyError:
- raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name))
-
- def __setitem__(self, name, value):
- self._dict[name] = self._convert_value(value)
-
- def __getitem__(self, name):
- return self._convert_value(self._dict[name])
-
- def _convert_value(self, value):
- if isinstance(value, dict) and not isinstance(value, AttributeDictionary):
- return AttributeDictionary(value)
- return value
-
- def copy(self):
- return self.__class__(self._dict.copy())
-
- def update(self, *args, **kwargs):
- self._dict.update(*args, **kwargs)
-
- def items(self):
- return self._dict.items()
-
- def values(self):
- return self._dict.values()
-
- def keys(self):
- return self._dict.keys()
-
- def pop(self, *args, **kwargs):
- return self._dict.pop(*args, **kwargs)
-
- def get(self, *args, **kwargs):
- return self._dict.get(*args, **kwargs)
-
- def __repr__(self):
- return self._dict.__repr__()
-
- def __unicode__(self):
- return self._dict.__unicode__()
-
- def __str__(self):
- return self._dict.__str__()
-
- def __iter__(self):
- return self._dict.__iter__()
-
- def __getstate__(self):
- return self._dict
-
- def __setstate__(self, state):
- super(AttributeDictionary, self).__setattr__("_dict", state)
-
-class ParamsAttributeDictionary(object):
- """
- This class can store user parameters
- and support some features necessary for substitution to work.
- """
- def __init__(self, substitutor, *args, **kwargs):
- d = kwargs
- if len(args)==1:
- d = args[0]
- super(ParamsAttributeDictionary, self).__setattr__("_dict", d)
- super(ParamsAttributeDictionary, self).__setattr__("substitutor", substitutor)
-
- def __setattr__(self, name, value):
- self[name] = value
-
- def __setitem__(self, name, value):
- self._dict[name] = self._convert_value(value)
-
- def __getitem__(self, name):
- val = self.substitutor.get_subdict(name, self._dict)
- return self._convert_value(val)
-
- def _convert_value(self, value):
- if isinstance(value, dict) and not isinstance(value, ParamsAttributeDictionary):
- return ParamsAttributeDictionary(self.substitutor, value)
- return value
-
- def copy(self):
- return self.__class__(self._dict.copy())
-
- def update(self, *args, **kwargs):
- self._dict.update(*args, **kwargs)
-
- def items(self):
- return self._dict.items()
-
- def values(self):
- return self._dict.values()
-
- def keys(self):
- return self._dict.keys()
-
- def pop(self, *args, **kwargs):
- return self._dict.pop(*args, **kwargs)
-
- def get(self, *args, **kwargs):
- return self._dict.get(*args, **kwargs)
-
- def __repr__(self):
- return self._dict.__repr__()
-
- def __unicode__(self):
- return self._dict.__unicode__()
-
- def __str__(self):
- return self._dict.__str__()
-
- def __iter__(self):
- return self._dict.__iter__()
-
- def __getstate__(self):
- return self._dict
-
- def __setstate__(self, state):
- super(ParamsAttributeDictionary, self).__setattr__("_dict", state)
\ No newline at end of file