From a659e7561b6c378d2759b78165f6b2325e6e1eab Mon Sep 17 00:00:00 2001 From: takehirokaneko Date: Mon, 5 Jan 2015 13:49:00 +0900 Subject: [PATCH] Add RabbitMQ to proxy and improve process delete API. Add RabbitMQ as an interprocess communication tool. Improved process delete API. Change-Id: Ie4956e356c2110a25962eda36c36d6f043847c03 --- rack/api/v1/processes.py | 34 ++++++------ rack/tests/api/v1/test_processes.py | 81 +++++++++++++++++++++++++---- tools/setup/imagebuild.sh | 27 ++++------ tools/setup/init.sh | 3 +- 4 files changed, 100 insertions(+), 45 deletions(-) diff --git a/rack/api/v1/processes.py b/rack/api/v1/processes.py index f06ee04..29e3366 100644 --- a/rack/api/v1/processes.py +++ b/rack/api/v1/processes.py @@ -417,28 +417,30 @@ class Controller(wsgi.Controller): @wsgi.response(204) def delete(self, req, gid, pid): - def _get_children(context, gid, pid): + def _delete_children(context, gid, pid): processes = db.process_get_all(context, gid, {"ppid": pid}) - target_list = [] for process in processes: - target_list.append(process) - target_list.extend( - _get_children(context, gid, process["pid"])) - return target_list + _delete_children(context, gid, process["pid"]) + _delete(context, gid, process["pid"], + process["nova_instance_id"]) + return + def _delete(context, gid, pid, nova_id): + self.manager.process_delete(context, nova_id) + try: + db.process_delete(context, gid, pid) + except exception.NotFound as e: + LOG.exception(e) + + self._uuid_check(gid, pid) + context = req.environ['rack.context'] try: - self._uuid_check(gid, pid) - context = req.environ['rack.context'] process = db.process_get_by_pid(context, gid, pid) - target_list = _get_children(context, gid, pid) - target_list.append(process) + except exception.NotFound as e: + raise webob.exc.HTTPNotFound(explanation=e.format_message()) - for process in target_list: - self.manager.process_delete( - context, process["nova_instance_id"]) - db.process_delete(context, gid, process["pid"]) - except exception.NotFound as exc: - raise webob.exc.HTTPNotFound(explanation=exc.format_message()) + _delete_children(context, gid, pid) + _delete(context, gid, pid, process["nova_instance_id"]) def create_resource(): diff --git a/rack/tests/api/v1/test_processes.py b/rack/tests/api/v1/test_processes.py index af5433c..a870cf1 100644 --- a/rack/tests/api/v1/test_processes.py +++ b/rack/tests/api/v1/test_processes.py @@ -1886,23 +1886,82 @@ class ProcessesTest(test.NoDBTestCase): self.mox.StubOutWithMock(db, "process_get_by_pid") self.mox.StubOutWithMock(db, 'process_get_all') self.mox.StubOutWithMock(manager.ResourceOperator, "process_delete") - db.process_get_by_pid(IsA(context.RequestContext), GID, PID1)\ + + # ppid + # |-- pid_1 + # | |---pid_1_1 + # |---pid_2 + # | |---pid_2_1 + # | |---pid_2_1_1 + # | |---pid_2_1_2 + # |---pid_3 + ppid = unicode(uuid.uuid4()) + pid_1 = unicode(uuid.uuid4()) + pid_1_1 = unicode(uuid.uuid4()) + pid_2 = unicode(uuid.uuid4()) + pid_2_1 = unicode(uuid.uuid4()) + pid_2_1_1 = unicode(uuid.uuid4()) + pid_2_1_2 = unicode(uuid.uuid4()) + pid_3 = unicode(uuid.uuid4()) + + db.process_get_by_pid(IsA(context.RequestContext), GID, ppid)\ .AndReturn( - {"pid": PPID1, "nova_instance_id": "nova_instance_id_data1"}) + {"pid": ppid, "nova_instance_id": "nova_id_ppid"}) + + # ppid -> [pid_1, pid_2, pid_3] db.process_get_all( - IsA(context.RequestContext), GID, {"ppid": PID1})\ + IsA(context.RequestContext), GID, {"ppid": ppid})\ .AndReturn( - [{"pid": PID2, "nova_instance_id": - "nova_instance_id_data2"}]) + [{"pid": pid_1, "nova_instance_id": "nova_id_pid_1"}, + {"pid": pid_2, "nova_instance_id": "nova_id_pid_2"}, + {"pid": pid_3, "nova_instance_id": "nova_id_pid_3"}]) + + # pid_1 -> [pid_1_1] db.process_get_all( - IsA(context.RequestContext), GID, {"ppid": PID2}).AndReturn([]) - manager.ResourceOperator.process_delete( - IsA(context.RequestContext), IsA(str)) - manager.ResourceOperator.process_delete( - IsA(context.RequestContext), IsA(str)) + IsA(context.RequestContext), GID, {"ppid": pid_1})\ + .AndReturn( + [{"pid": pid_1_1, "nova_instance_id": "nova_id_pid_1_1"}]) + + # pid_1_1 -> [] + db.process_get_all( + IsA(context.RequestContext), GID, {"ppid": pid_1_1})\ + .AndReturn([]) + + # pid_2 -> [pid_2_1] + db.process_get_all( + IsA(context.RequestContext), GID, {"ppid": pid_2})\ + .AndReturn( + [{"pid": pid_2_1, "nova_instance_id": "nova_id_pid_2_1"}]) + + # pid_2_1 -> [pid_2_1_1, pid_2_1_2] + db.process_get_all( + IsA(context.RequestContext), GID, {"ppid": pid_2_1})\ + .AndReturn( + [{"pid": pid_2_1_1, "nova_instance_id": "nova_id_pid_2_1_1"}, + {"pid": pid_2_1_2, "nova_instance_id": "nova_id_pid_2_1_2"}]) + + # pid_2_1_1 -> [] + db.process_get_all( + IsA(context.RequestContext), GID, {"ppid": pid_2_1_1})\ + .AndReturn([]) + + # pid_2_1_2 -> [] + db.process_get_all( + IsA(context.RequestContext), GID, {"ppid": pid_2_1_2})\ + .AndReturn([]) + + # pid_3 -> [] + db.process_get_all( + IsA(context.RequestContext), GID, {"ppid": pid_3})\ + .AndReturn([]) + + for i in range(8): + manager.ResourceOperator.process_delete( + IsA(context.RequestContext), IsA(str)) + self.mox.ReplayAll() - url = get_base_url(GID) + "/" + PID1 + url = get_base_url(GID) + "/" + ppid req = get_request(url, "DELETE") res = req.get_response(self.app) self.assertEqual(res.status_code, 204) diff --git a/tools/setup/imagebuild.sh b/tools/setup/imagebuild.sh index 46f9570..8c88536 100755 --- a/tools/setup/imagebuild.sh +++ b/tools/setup/imagebuild.sh @@ -54,7 +54,7 @@ yum -y install \ libffi-devel libgcc-devel gcc python-devel python-lxml libxslt-devel \ libxml2-devel openssl-devel MySQL-python mysql-server python-pip redis \ openstack-swift openstack-swift-proxy openstack-swift-account openstack-swift-container \ - openstack-swift-object memcached rsync xinetd openstack-utils xfsprogs || \ + openstack-swift-object memcached rsync xinetd openstack-utils xfsprogs rabbitmq-server || \ exit_abort "Failed to install the required rpm packages" service iptables stop @@ -76,6 +76,14 @@ sed -i -e "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf service redis restart || exit_abort "Failed to start redis" +######################################## +# Setup RabbitMQ +######################################## +echo "Setup RabbitMQ..." +/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management +service rabbitmq-server restart || exit_abort "Failed to start rabbitmq-server" + + ######################################## # Deploy RACK ######################################## @@ -134,22 +142,6 @@ cp -f $ROOT_DIR/tools/setup/websocket_server.py /usr/bin/websocket_server chmod +x /usr/bin/websocket_server -######################################## -# Install python-rackclient -######################################## -echo "Install python-rackclient..." -retval=$(which rack > /dev/null 2>&1; echo $?) -if [ "$retval" -ne 0 ]; then - rm -fr ~/python-rackclient - git clone https://github.com/stackforge/python-rackclient.git ~/python-rackclient ||\ - exit_abort "Failed to clone python-rackclient repository" - cd ~/python-rackclient - pip install -r requirements.txt || exit_abort "Failed to install the rackclient requirements" - python setup.py install || exit_abort "Failed to install rackclient" -fi - - - ######################################## # Setup Swift ######################################## @@ -247,6 +239,7 @@ swift-init rest start || exit_abort "Failed to start the rest of the Swift servi chkconfig mysqld off chkconfig redis off chkconfig iptables off +chkconfig rabbitmq-server off # set SELinux disabled sed -i "s/\(^SELINUX=\).*/\1Disabled/" /etc/selinux/config diff --git a/tools/setup/init.sh b/tools/setup/init.sh index fcd326b..5546264 100755 --- a/tools/setup/init.sh +++ b/tools/setup/init.sh @@ -39,6 +39,7 @@ proxy() { websocket_server -d --bind-ipaddress 0.0.0.0 --bind-port 8888 --logfile /var/log/rack/ipc.log & service redis start || { echo "Error: redis could not start."; exit 1; } + service rabbitmq-server start || { echo "Error: rabbitmq-server could not start."; exit 1; } service memcached start || { echo "Error: memcached could not start."; exit 1; } service xinetd start || { echo "Error: xinetd could not start."; exit 1; } swift-init main start && swift-init rest start || { echo "Error: Swift services could not start."; exit 1; } @@ -49,4 +50,4 @@ if [ "$RACK_PID" == "null" ]; then api elif [ "$RACK_PID" != "null" ]; then proxy -fi \ No newline at end of file +fi