2012-02-04 20:41:27 -08:00

207 lines
7.3 KiB
Python

# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright (C) 2012 Yahoo! Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from devstack import component as comp
from devstack import log as logging
from devstack import settings
from devstack import shell as sh
LOG = logging.getLogger("devstack.components.swift")
# id
TYPE = settings.SWIFT
SWIFT_CONF = 'swift.conf'
PROXY_SERVER_CONF = 'proxy-server.conf'
ACCOUNT_SERVER_CONF = 'account-server.conf'
CONTAINER_SERVER_CONF = 'container-server.conf'
OBJECT_SERVER_CONF = 'object-server.conf'
RSYNC_CONF = 'rsyncd.conf'
SYSLOG_CONF = 'rsyslog.conf'
SWIFT_MAKERINGS = 'swift-remakerings'
SWIFT_STARTMAIN = 'swift-startmain'
CONFIGS = [SWIFT_CONF, PROXY_SERVER_CONF, ACCOUNT_SERVER_CONF,
CONTAINER_SERVER_CONF, OBJECT_SERVER_CONF, RSYNC_CONF,
SYSLOG_CONF, SWIFT_MAKERINGS, SWIFT_STARTMAIN]
SWIFT_NAME = 'swift'
# subdirs of the git checkout
BIN_DIR = 'bin'
CONFIG_DIR = 'etc'
# what to start
APP_OPTIONS = {
}
#the pkg json files swift requires for installation
REQ_PKGS = ['general.json', 'swift.json']
class SwiftUninstaller(comp.PythonUninstallComponent):
def __init__(self, *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):
def __init__(self, *args, **kargs):
comp.PythonInstallComponent.__init__(self, TYPE, *args, **kargs)
self.cfgdir = sh.joinpths(self.appdir, CONFIG_DIR)
self.bindir = sh.joinpths(self.appdir, BIN_DIR)
self.datadir = sh.joinpths(self.appdir, self.cfg.get('swift', 'data_location'))
self.logdir = sh.joinpths(self.datadir, 'logs')
self.auth_server = 'keystone'
def _get_download_locations(self):
places = list()
places.append({
'uri': ('git', 'swift_repo'),
'branch': ('git', 'swift_branch')
})
return places
def _get_config_files(self):
return list(CONFIGS)
def _get_pkgs(self):
return list(REQ_PKGS)
def _get_symlinks(self):
return {self.cfgdir: '/etc/swift'}
def warm_configs(self):
pws = ['service_token', 'swift_hash']
for pw_key in pws:
self.cfg.get("passwords", pw_key)
def _get_param_map(self, config_fn):
return {
'USER': self.cfg.get('swift', 'swift_user'),
'GROUP': self.cfg.get('swift', 'swift_group'),
'SWIFT_DATA_LOCATION': self.datadir,
'SWIFT_CONFIG_LOCATION': self.cfgdir,
'SERVICE_TOKEN': self.cfg.get('passwords', 'service_token'),
'AUTH_SERVER': self.auth_server,
'SWIFT_HASH': self.cfg.get('passwords', 'swift_hash'),
'SWIFT_LOGDIR': self.logdir,
'SWIFT_PARTITION_POWER_SIZE': self.cfg.get('swift',
'partition_power_size'),
'NODE_PATH': '%NODE_PATH%',
'BIND_PORT': '%BIND_PORT%',
'LOG_FACILITY': '%LOG_FACILITY%'
}
def __create_data_location(self):
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.conf' \
% (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 __delete_templates(self):
for type_ in ['object', 'container', 'account']:
sh.unlink(sh.joinpths(self.cfgdir, '%s-server.conf' % type_))
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)
self.__delete_templates()
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):
def __init__(self, *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):
description = """
Module: {module_name}
Description:
{description}
Component options:
{component_opts}
"""
params = dict()
params['component_opts'] = "TBD"
params['module_name'] = __name__
params['description'] = __doc__ or "Handles actions for the swift component."
out = description.format(**params)
return out.strip("\n")