Thursday, April 7, 2016

OpenStack Swift – tips to get through SAIO installation

This blogpost is not intended to give step by step instructions for installing OpenStack Swift All In One (SAIO) on a single node, but if you are looking for that, please refer to http://docs.openstack.org/developer/swift/development_saio.html [1] which provides sufficient information for a successful setup (might also provide you reasons to visit this blogpost back! :) )
This blogpost lists the potential errors along with their fixes, during SAIO setup on an Ubuntu 14.04 LTS server, while following the instructions from [1]. Issues and fixes are categorized in that order.

Getting the code/ build a development installation of Swift:
$ sudo pip install –r requirements.txt
Error:
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
status = self.run(options, args)
File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 262, in run
for req in parse_requirements(filename, finder=finder, options=options, session=session):
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1632, in parse_requirements
req = InstallRequirement.from_line(line, comes_from, prereleases=getattr(options, "pre", None))
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 173, in from_line
return cls(req, comes_from, url=url, prereleases=prereleases)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 71, in __init__
req = pkg_resources.Requirement.parse(req)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2667, in parse
reqs = list(parse_requirements(s))
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2605, in parse_requirements
line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec")
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2583, in scan_list
"Expected ',' or end-of-list in",line,"at",line[p:]
ValueError: ("Expected ',' or end-of-list in", "dnspython>=1.12.0;python_version<'3.0'", 'at', ";python_version<'3.0'") Storing debug log for failure in /home/stack/.pip/pip.log
Fix: Possible cause: older pip version; uninstall pip and install from http://pip.readthedocs.org/en/stable/installing/
$ sudo apt-get purge python-pip
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
view raw gistfile1.txt hosted with ❤ by GitHub
Error:
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
status = self.run(options, args)
File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 262, in run
for req in parse_requirements(filename, finder=finder, options=options, session=session):
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1632, in parse_requirements
req = InstallRequirement.from_line(line, comes_from, prereleases=getattr(options, "pre", None))
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 173, in from_line
return cls(req, comes_from, url=url, prereleases=prereleases)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 71, in __init__
req = pkg_resources.Requirement.parse(req)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2667, in parse
reqs = list(parse_requirements(s))
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2605, in parse_requirements
line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec")
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2583, in scan_list
"Expected ',' or end-of-list in",line,"at",line[p:]
ValueError: ("Expected ',' or end-of-list in", "dnspython>=1.12.0;python_version<'3.0'", 'at', ";python_version<'3.0'")
Storing debug log for failure in /home/swift/.pip/pip.log
error in setup command: Invalid environment marker: (python_version>='3.0')
Fix:
$ sudo pip install -U pip tox pbr virtualenv setuptools
$ sudo apt-get install libpython3.4-dev
view raw gistfile1.txt hosted with ❤ by GitHub

Building development installation of Swift:
$ sudo python setup.py develop
Error:
error in setup command: Invalid environment marker: (python_version>='3.0')
Fix:
$ sudo pip install -U pip tox pbr virtualenv setuptools
view raw gistfile1.txt hosted with ❤ by GitHub

 Verifying the unit tests run:
$ HOME/swift/.unittests
Error:
liberasurecode[20837]: liberasurecode_backend_open: dynamic linking error libJerasure.so: cannot open shared object file: No such file or directory
ERROR: Invalid Storage Policy Configuration in /etc/swift/swift.conf (Error creating EC policy (pyeclib_c_init ERROR: Invalid arguments. Please inspect syslog for liberasurecode error report.), for index 2)
/home/swift/swift
Fix: check if libJerasure is present, install if not
$ sudo find / -name "libJerasure.so*"
$ sudo apt-get install liberasurecode-dev
Error:
File "/usr/lib/python2.7/dist-packages/nose/loader.py", line 411, in loadTestsFromName
addr.filename, addr.module)
File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 47, in importFromPath return self.importFromDir(dir_path, fqname)
File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/swift/swift/test/unit/obj/test_replicator.py", line 37, in <module>
from swift.obj import diskfile, replicator as object_replicator
File "/home/swift/swift/swift/obj/replicator.py", line 23, in <module>
from six import viewkeys
ImportError: cannot import name viewkeys
Fix:
#remove the default python-six package
$ sudo apt-get remove python-six
#pip install the six package
$ sudo pip install -U six
view raw gistfile1.txt hosted with ❤ by GitHub


Start the "main" Swift daemon processes:
$ startmain
Error:
File "/usr/local/bin/swift-container-server", line 6, in <module>
exec(compile(open(__file__).read(), __file__, 'exec'))
File "/home/swift/swift/bin/swift-container-server", line 23, in <module>
sys.exit(run_wsgi(conf_file, 'container-server', **options))
File "/home/swift/swift/swift/common/wsgi.py", line 883, in run_wsgi
error_msg = strategy.bind_ports()
File "/home/swift/swift/swift/common/wsgi.py", line 481, in bind_ports
self.sock = get_socket(self.conf)
File "/home/swift/swift/swift/common/wsgi.py", line 201, in get_socket
bind_addr[0], bind_addr[1], bind_timeout))
Exception: Could not bind to 127.0.0.1:6011 after trying for 30 seconds
Traceback (most recent call last):
File "/usr/local/bin/swift-account-server", line 6, in <module>
exec(compile(open(__file__).read(), __file__, 'exec'))
File "/home/swift/swift/bin/swift-account-server", line 23, in <module>
sys.exit(run_wsgi(conf_file, 'account-server', **options))
File "/home/swift/swift/swift/common/wsgi.py", line 883, in run_wsgi
error_msg = strategy.bind_ports()
File "/home/swift/swift/swift/common/wsgi.py", line 481, in bind_ports
self.sock = get_socket(self.conf)
File "/home/swift/swift/swift/common/wsgi.py", line 201, in get_socket
bind_addr[0], bind_addr[1], bind_timeout))
Exception: Could not bind to 127.0.0.1:6012 after trying for 30 seconds
Fix:
When running SAIO, sometimes the servers will fail to load (with the above error) as ports 6012/11/10 is/are in use by ‘sshd’. This happens when you have enabled port forwarding on your VM and connect to it.
1.Edit /etc/ssh/sshd_config
2.Change X11DisplayOffset to a different number (say set it to 100)
3.Kill all SSH connections and restart ssh daemon.
$ sudo vim /etc/ssh/sshd_config
$ ps –ef | grep ssh
$ sudo kill -5 <PID>
$ sudo service ssh restart
view raw gistfile1.txt hosted with ❤ by GitHub


Verifying the functionality tests:
$ HOME/swift/.functests
Error:
$ ./.functests
Traceback (most recent call last):
File "/usr/local/bin/ostestr", line 7, in <module>
from os_testr.os_testr import main
File "/usr/local/lib/python2.7/dist-packages/os_testr/__init__.py", line 15, in <module>
import pbr.version
ImportError: No module named pbr.version
Fix: Check if pbr is installed
1. If not present, install
$ sudo apt-get purge python-setuptools
$ sudo apt-get install python-pbr
$ sudo pip install -r requirements.txt
$ sudo pip install -r test-requirements.txt
2. If pbr were present say in python-swiftclient directory, then delete that .egg for pbr
$ sudo rm –rf pbr-<version> .egg
$ sudo pip install –r requirements.txt –-upgrade
$ cd ../swift
$ sudo pip install six --upgrade
$ sudo pip install mock –-upgrade
view raw gistfile1.txt hosted with ❤ by GitHub


Please note above are some of the most commonly encountered issues, given that you are correctly following the instructions provided at [1]. There could be several issues such as - you miss a step to replace with your username as mentioned in [1] or your proxy settings or user permissions etc. which are user/environment-specific, all of which are not covered in this blogpost; but feel free to reach out for further tips/answers. Most of the fixes/tips listed here can be found online, and are put here together to help new contributors to OpenStack Swift community.

If you have already gone through the SAIO setup, and have faced more issues/found fixes, then you are welcome to leave comments/suggestions and share your approaches.


References:
[1] OpenStack Swift documentation for SAIO development setup. Available online at http://docs.openstack.org/developer/swift/development_saio.html