207 lines
7.3 KiB
Python
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")
|