Merge pull request #42 from hagleitn/master

swift stuff
This commit is contained in:
Gunther Hagleitner
2012-02-04 04:04:51 -08:00
5 changed files with 155 additions and 17 deletions

View File

@@ -41,6 +41,10 @@
"sqlite3": { "sqlite3": {
"version": "3.7*", "version": "3.7*",
"removable": true "removable": true
},
"xfsprogs": {
"version": "3.1*",
"removable": true
} }
}, },
"rhel-6": { "rhel-6": {

View File

@@ -119,7 +119,7 @@ class KeystoneInstaller(comp.PythonInstallComponent):
def _setup_data(self): def _setup_data(self):
LOG.info("Configuring data setup template %s.", MANAGE_DATA_CONF) LOG.info("Configuring data setup template %s.", MANAGE_DATA_CONF)
(src_fn, contents) = utils.load_template(self.component_name, MANAGE_DATA_CONF) (_, contents) = utils.load_template(self.component_name, MANAGE_DATA_CONF)
params = self._get_param_map(MANAGE_DATA_CONF) params = self._get_param_map(MANAGE_DATA_CONF)
contents = utils.param_replace(contents, params, True) contents = utils.param_replace(contents, params, True)
tgt_fn = sh.joinpths(self.bindir, MANAGE_DATA_CONF) tgt_fn = sh.joinpths(self.bindir, MANAGE_DATA_CONF)

View File

@@ -545,7 +545,8 @@ class NovaConfigurator(object):
if img_service.lower().find("glance") != -1: if img_service.lower().find("glance") != -1:
glance_api_server = self._getstr('glance_server') glance_api_server = self._getstr('glance_server')
if not glance_api_server: if not glance_api_server:
glance_api_server = "%s:%d" % (hostip, DEF_GLANCE_PORT) glance_api_server = "%s:%d" % (self.cfg.get('host', 'ip'),
DEF_GLANCE_PORT)
nova_conf.add('glance_api_servers', glance_api_server) nova_conf.add('glance_api_servers', glance_api_server)
def _configure_vnc(self, nova_conf): def _configure_vnc(self, nova_conf):

View File

@@ -14,14 +14,10 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import os
import os.path
from devstack import component as comp from devstack import component as comp
from devstack import log as logging from devstack import log as logging
from devstack import settings from devstack import settings
from devstack import shell as sh from devstack import shell as sh
from devstack import utils
LOG = logging.getLogger("devstack.components.swift") LOG = logging.getLogger("devstack.components.swift")
@@ -58,6 +54,10 @@ REQ_PKGS = ['general.json', 'swift.json']
class SwiftUninstaller(comp.PythonUninstallComponent): class SwiftUninstaller(comp.PythonUninstallComponent):
def __init__(self, *args, **kargs): def __init__(self, *args, **kargs):
comp.PythonUninstallComponent.__init__(self, TYPE, *args, **kargs) comp.PythonUninstallComponent.__init__(self, TYPE, *args, **kargs)
self.datadir = sh.joinpths(self.appdir, self.cfg.get('swift', 'data_location'))
def pre_uninstall(self):
sh.umount(sh.joinpths(self.datadir, 'drives/sdb1'))
class SwiftInstaller(comp.PythonInstallComponent): class SwiftInstaller(comp.PythonInstallComponent):
@@ -82,6 +82,9 @@ class SwiftInstaller(comp.PythonInstallComponent):
def _get_pkgs(self): def _get_pkgs(self):
return list(REQ_PKGS) return list(REQ_PKGS)
def _get_symlinks(self):
return {self.cfgdir: '/etc/swift'}
def warm_configs(self): def warm_configs(self):
pws = ['service_token', 'swift_hash'] pws = ['service_token', 'swift_hash']
for pw_key in pws: for pw_key in pws:
@@ -91,25 +94,93 @@ class SwiftInstaller(comp.PythonInstallComponent):
return { return {
'USER': self.cfg.get('swift', 'swift_user'), 'USER': self.cfg.get('swift', 'swift_user'),
'GROUP': self.cfg.get('swift', 'swift_group'), 'GROUP': self.cfg.get('swift', 'swift_group'),
'SWIFT_DATA_LOCATION': self.cfg.get('swift', 'data_location'), 'SWIFT_DATA_LOCATION': self.datadir,
'SWIFT_CONFIG_LOCATION': self.cfgdir, 'SWIFT_CONFIG_LOCATION': self.cfgdir,
'SERVICE_TOKEN': self.cfg.get('passwords', 'service_token'), 'SERVICE_TOKEN': self.cfg.get('passwords', 'service_token'),
'AUTH_SERVER': self.auth_server, 'AUTH_SERVER': self.auth_server,
'SWIFT_HASH': self.cfg.get('passwords', 'swift_hash'), 'SWIFT_HASH': self.cfg.get('passwords', 'swift_hash'),
'NODE_PATH': '',
'BIND_PORT': '',
'LOG_FACILITY': '',
'SWIFT_LOGDIR': self.logdir, 'SWIFT_LOGDIR': self.logdir,
'SWIFT_PARTITION_POWER_SIZE': self.cfg.get('swift', 'partition_power_size') 'SWIFT_PARTITION_POWER_SIZE': self.cfg.get('swift',
'partition_power_size'),
'NODE_PATH': '%NODE_PATH%',
'BIND_PORT': '%BIND_PORT%',
'LOG_FACILITY': '%LOG_FACILITY%'
} }
def _post_install(self): def __create_data_location(self):
pass self.fs_image = sh.joinpths(self.datadir, 'drives/images/swift.img')
sh.create_loopback_file(fname=self.fs_image,
size=int(self.cfg.get('swift',
'loopback_disk_size')),
fs_type='xfs')
self.fs_dev = sh.joinpths(self.datadir, 'drives/sdb1/')
sh.mount_loopback_file(self.fs_image, self.fs_dev, 'xfs',
run_as_root=False)
def __create_node_config(self, node_number, port):
for type_ in ['object', 'container', 'account']:
sh.copy_replace_file(sh.joinpths(self.cfgdir, '%s-server.conf' % type_),
sh.joinpths(self.cfgdir, '%s-server/%d' % (type_, node_number)),
{
'%NODE_PATH%': sh.joinpths(self.datadir, str(node_number)),
'%BIND_PORT%': str(port),
'%LOG_FACILITY%': str(2 + node_number)
})
port += 1
def __create_nodes(self):
for i in range(1, 5):
sh.mkdirslist(sh.joinpths(self.fs_dev, '%d/node' % i))
sh.symlink(sh.joinpths(self.fs_dev, str(i)),
sh.joinpths(self.datadir, str(i)))
self.__create_node_config(i, 6010 + (i - 1) * 5)
def __turn_on_rsync(self):
sh.symlink(sh.joinpths(self.cfgdir, RSYNC_CONF),
'/etc/rsyncd.conf')
sh.replace_in_file('/etc/default/rsync',
'RSYNC_ENABLE=false',
'RSYNC_ENABLE=true')
def __create_log_dirs(self):
sh.mkdirslist(sh.joinpths(self.logdir, 'hourly'))
sh.symlink(sh.joinpths(self.cfgdir, SYSLOG_CONF),
'/etc/rsyslog.d/10-swift.conf')
def __setup_binaries(self):
self.makerings_file = sh.joinpths(self.bindir, SWIFT_MAKERINGS)
sh.move(sh.joinpths(self.cfgdir, SWIFT_MAKERINGS),
self.makerings_file)
sh.chmod(self.makerings_file, 777)
self.startmain_file = sh.joinpths(self.bindir, SWIFT_STARTMAIN)
sh.move(sh.joinpths(self.cfgdir, SWIFT_STARTMAIN),
self.startmain_file)
sh.chmod(self.startmain_file, 777)
def __make_rings(self):
sh.execute(self.makerings_file)
def post_install(self):
self.__create_data_location()
self.__create_nodes()
self.__turn_on_rsync()
self.__create_log_dirs()
self.__setup_binaries()
self.__make_rings()
class SwiftRuntime(comp.PythonRuntime): class SwiftRuntime(comp.PythonRuntime):
def __init__(self, *args, **kargs): def __init__(self, *args, **kargs):
comp.PythonRuntime.__init__(self, TYPE, *args, **kargs) comp.PythonRuntime.__init__(self, TYPE, *args, **kargs)
self.bindir = sh.joinpths(self.appdir, BIN_DIR)
def pre_start(self):
sh.execute('restart', 'rsyslog')
sh.execute('/etc/init.d/rsync', 'restart')
def post_start(self):
sh.execute(sh.joinpths(self.bindir, SWIFT_STARTMAIN))
def describe(opts=None): def describe(opts=None):

View File

@@ -16,12 +16,12 @@
import getpass import getpass
import grp import grp
import os
import os.path import os.path
import pwd import pwd
import shutil import shutil
import subprocess import subprocess
import tempfile import tempfile
import fileinput
from devstack import env from devstack import env
from devstack import exceptions as excp from devstack import exceptions as excp
@@ -263,7 +263,6 @@ def touch_file(fn, die_if_there=True, quiet=False, file_size=0):
def load_file(fn, quiet=False): def load_file(fn, quiet=False):
if not quiet: if not quiet:
LOG.debug("Loading data from file %s", fn) LOG.debug("Loading data from file %s", fn)
data = ""
with open(fn, "r") as f: with open(fn, "r") as f:
data = f.read() data = f.read()
if not quiet: if not quiet:
@@ -301,11 +300,12 @@ def rmdir(path, quiet=True):
pass pass
def symlink(source, link): def symlink(source, link, force=True):
path = dirname(link) path = dirname(link)
file_ = basename(link)
mkdirslist(path) mkdirslist(path)
LOG.debug("Creating symlink from %s => %s" % (link, source)) LOG.debug("Creating symlink from %s => %s" % (link, source))
if force and exists(link):
unlink(link, True)
os.symlink(source, link) os.symlink(source, link)
@@ -350,6 +350,42 @@ def getgroupname(gid=None):
return gid_info.gr_name return gid_info.gr_name
def create_loopback_file(fname, size, bsize=1024, fs_type='ext3', run_as_root=False):
dd_cmd = ['dd', 'if=/dev/zero', 'of=%s' % fname, 'bs=%d' % bsize,
'count=0', 'seek=%d' % size]
mkfs_cmd = ['mkfs.%s' % fs_type, '-f', '-i', 'size=%d' % bsize, fname]
# make sure folder exists
files = mkdirslist(dirname(fname))
# create file
touch_file(fname)
# fill with zeroes
execute(*dd_cmd, run_as_root=run_as_root)
# create fs on the file
execute(*mkfs_cmd, run_as_root=run_as_root)
return files
def mount_loopback_file(fname, device_name, fs_type='ext3', run_as_root=True):
mount_cmd = ['mount', '-t', fs_type, '-o',
'loop,noatime,nodiratime,nobarrier,logbufs=8', fname,
device_name]
files = mkdirslist(dirname(device_name))
execute(*mount_cmd, run_as_root=run_as_root)
return files
def umount(dev_name, run_as_root=True):
execute('umount', dev_name, run_as_root=run_as_root)
def unlink(path, ignore_errors=True): def unlink(path, ignore_errors=True):
try: try:
LOG.debug("Unlinking (removing) %s" % (path)) LOG.debug("Unlinking (removing) %s" % (path))
@@ -359,3 +395,29 @@ def unlink(path, ignore_errors=True):
raise raise
else: else:
pass pass
def move(src, dst):
shutil.move(src, dst)
def chmod(fname, mode):
os.chmod(fname, mode)
def replace_in_file(fname, search, replace):
# fileinput with inplace=1 moves file to tmp and redirects stdio to file
for line in fileinput.input(fname, inplace=1):
if search in line:
line = line.replace(search, replace)
print line,
def copy_replace_file(fsrc, fdst, map_):
files = mkdirslist(dirname(fdst))
with open(fdst, 'w') as fh:
for line in fileinput.input(fsrc):
for (k, v) in map_.items():
line = line.replace(k, v)
fh.write(line)
return files