add in xs-console worker and tests.
This commit is contained in:
1
Authors
1
Authors
@@ -22,6 +22,7 @@ Joshua McKenty <jmckenty@gmail.com>
|
|||||||
Justin Santa Barbara <justin@fathomdb.com>
|
Justin Santa Barbara <justin@fathomdb.com>
|
||||||
Matt Dietz <matt.dietz@rackspace.com>
|
Matt Dietz <matt.dietz@rackspace.com>
|
||||||
Michael Gundlach <michael.gundlach@rackspace.com>
|
Michael Gundlach <michael.gundlach@rackspace.com>
|
||||||
|
Monsyne Dragon <mdragon@rackspace.com>
|
||||||
Monty Taylor <mordred@inaugust.com>
|
Monty Taylor <mordred@inaugust.com>
|
||||||
Paul Voccio <paul@openstack.org>
|
Paul Voccio <paul@openstack.org>
|
||||||
Rick Clark <rick@openstack.org>
|
Rick Clark <rick@openstack.org>
|
||||||
|
|||||||
@@ -56,11 +56,12 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
compute = service.Service.create(binary='nova-compute')
|
compute = service.Service.create(binary='nova-compute')
|
||||||
network = service.Service.create(binary='nova-network')
|
network = service.Service.create(binary='nova-network')
|
||||||
volume = service.Service.create(binary='nova-volume')
|
# volume = service.Service.create(binary='nova-volume')
|
||||||
scheduler = service.Service.create(binary='nova-scheduler')
|
scheduler = service.Service.create(binary='nova-scheduler')
|
||||||
#objectstore = service.Service.create(binary='nova-objectstore')
|
#objectstore = service.Service.create(binary='nova-objectstore')
|
||||||
|
|
||||||
service.serve(compute, network, volume, scheduler)
|
# service.serve(compute, network, volume, scheduler)
|
||||||
|
service.serve(compute, network, scheduler)
|
||||||
|
|
||||||
server = wsgi.Server()
|
server = wsgi.Server()
|
||||||
server.start(api.API('os'), FLAGS.osapi_port, host=FLAGS.osapi_host)
|
server.start(api.API('os'), FLAGS.osapi_port, host=FLAGS.osapi_host)
|
||||||
|
|||||||
44
bin/nova-console
Executable file
44
bin/nova-console
Executable file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright (c) 2010 Openstack, LLC.
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
"""Starter script for Nova Console Proxy."""
|
||||||
|
|
||||||
|
import eventlet
|
||||||
|
eventlet.monkey_patch()
|
||||||
|
|
||||||
|
import gettext
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# If ../nova/__init__.py exists, add ../ to Python search path, so that
|
||||||
|
# it will override what happens to be installed in /usr/(local/)lib/python...
|
||||||
|
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
||||||
|
os.pardir,
|
||||||
|
os.pardir))
|
||||||
|
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
||||||
|
sys.path.insert(0, possible_topdir)
|
||||||
|
|
||||||
|
gettext.install('nova', unicode=1)
|
||||||
|
|
||||||
|
from nova import service
|
||||||
|
from nova import utils
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
utils.default_flagfile()
|
||||||
|
service.serve()
|
||||||
|
service.wait()
|
||||||
@@ -216,6 +216,7 @@ DEFINE_integer('s3_port', 3333, 's3 port')
|
|||||||
DEFINE_string('s3_host', utils.get_my_ip(), 's3 host (for infrastructure)')
|
DEFINE_string('s3_host', utils.get_my_ip(), 's3 host (for infrastructure)')
|
||||||
DEFINE_string('s3_dmz', utils.get_my_ip(), 's3 dmz ip (for instances)')
|
DEFINE_string('s3_dmz', utils.get_my_ip(), 's3 dmz ip (for instances)')
|
||||||
DEFINE_string('compute_topic', 'compute', 'the topic compute nodes listen on')
|
DEFINE_string('compute_topic', 'compute', 'the topic compute nodes listen on')
|
||||||
|
DEFINE_string('console_topic', 'console', 'the topic console proxy nodes listen on')
|
||||||
DEFINE_string('scheduler_topic', 'scheduler',
|
DEFINE_string('scheduler_topic', 'scheduler',
|
||||||
'the topic scheduler nodes listen on')
|
'the topic scheduler nodes listen on')
|
||||||
DEFINE_string('volume_topic', 'volume', 'the topic volume nodes listen on')
|
DEFINE_string('volume_topic', 'volume', 'the topic volume nodes listen on')
|
||||||
@@ -263,6 +264,8 @@ DEFINE_string('sql_connection',
|
|||||||
|
|
||||||
DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager',
|
DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager',
|
||||||
'Manager for compute')
|
'Manager for compute')
|
||||||
|
DEFINE_string('console_manager', 'nova.console.manager.ConsoleProxyManager',
|
||||||
|
'Manager for console proxy')
|
||||||
DEFINE_string('network_manager', 'nova.network.manager.VlanManager',
|
DEFINE_string('network_manager', 'nova.network.manager.VlanManager',
|
||||||
'Manager for network')
|
'Manager for network')
|
||||||
DEFINE_string('volume_manager', 'nova.volume.manager.VolumeManager',
|
DEFINE_string('volume_manager', 'nova.volume.manager.VolumeManager',
|
||||||
|
|||||||
134
nova/tests/test_console.py
Normal file
134
nova/tests/test_console.py
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright (c) 2010 Openstack, LLC.
|
||||||
|
# Administrator of the National Aeronautics and Space Administration.
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Tests For Console proxy.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from nova import context
|
||||||
|
from nova import db
|
||||||
|
from nova import exception
|
||||||
|
from nova import flags
|
||||||
|
from nova import test
|
||||||
|
from nova import utils
|
||||||
|
from nova.auth import manager
|
||||||
|
from nova.console import manager as console_manager
|
||||||
|
|
||||||
|
FLAGS = flags.FLAGS
|
||||||
|
|
||||||
|
|
||||||
|
class ConsoleTestCase(test.TestCase):
|
||||||
|
"""Test case for console proxy"""
|
||||||
|
def setUp(self):
|
||||||
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
super(ConsoleTestCase, self).setUp()
|
||||||
|
self.flags(console_driver='nova.console.fake.FakeConsoleProxy',
|
||||||
|
stub_compute=True)
|
||||||
|
self.console = utils.import_object(FLAGS.console_manager)
|
||||||
|
self.manager = manager.AuthManager()
|
||||||
|
self.user = self.manager.create_user('fake', 'fake', 'fake')
|
||||||
|
self.project = self.manager.create_project('fake', 'fake', 'fake')
|
||||||
|
self.context = context.get_admin_context()
|
||||||
|
self.host = 'test_compute_host'
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.manager.delete_user(self.user)
|
||||||
|
self.manager.delete_project(self.project)
|
||||||
|
super(ConsoleTestCase, self).tearDown()
|
||||||
|
|
||||||
|
def _create_instance(self):
|
||||||
|
"""Create a test instance"""
|
||||||
|
inst = {}
|
||||||
|
#inst['host'] = self.host
|
||||||
|
#inst['name'] = 'instance-1234'
|
||||||
|
inst['image_id'] = 'ami-test'
|
||||||
|
inst['reservation_id'] = 'r-fakeres'
|
||||||
|
inst['launch_time'] = '10'
|
||||||
|
inst['user_id'] = self.user.id
|
||||||
|
inst['project_id'] = self.project.id
|
||||||
|
inst['instance_type'] = 'm1.tiny'
|
||||||
|
inst['mac_address'] = utils.generate_mac()
|
||||||
|
inst['ami_launch_index'] = 0
|
||||||
|
return db.instance_create(self.context, inst)['id']
|
||||||
|
|
||||||
|
def test_get_pool_for_instance_host(self):
|
||||||
|
pool = self.console.get_pool_for_instance_host(self.context, self.host)
|
||||||
|
self.assertEqual(pool['compute_host'], self.host)
|
||||||
|
|
||||||
|
def test_get_pool_creates_new_pool_if_needed(self):
|
||||||
|
self.assertRaises(exception.NotFound,
|
||||||
|
db.console_pool_get_by_host_type,
|
||||||
|
self.context,
|
||||||
|
self.host,
|
||||||
|
self.console.host,
|
||||||
|
self.console.driver.console_type)
|
||||||
|
pool = self.console.get_pool_for_instance_host(self.context,
|
||||||
|
self.host)
|
||||||
|
pool2 = db.console_pool_get_by_host_type(self.context,
|
||||||
|
self.host,
|
||||||
|
self.console.host,
|
||||||
|
self.console.driver.console_type)
|
||||||
|
self.assertEqual(pool['id'], pool2['id'])
|
||||||
|
|
||||||
|
def test_get_pool_does_not_create_new_pool_if_exists(self):
|
||||||
|
pool_info = {'address' : '127.0.0.1',
|
||||||
|
'username' : 'test',
|
||||||
|
'password' : '1234pass',
|
||||||
|
'host' : self.console.host,
|
||||||
|
'console_type' : self.console.driver.console_type,
|
||||||
|
'compute_host' : 'sometesthostname' }
|
||||||
|
new_pool = db.console_pool_create(self.context, pool_info)
|
||||||
|
pool = self.console.get_pool_for_instance_host(self.context,
|
||||||
|
'sometesthostname')
|
||||||
|
self.assertEqual(pool['id'], new_pool['id'])
|
||||||
|
|
||||||
|
def test_add_console(self):
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
self.console.add_console(self.context, instance_id)
|
||||||
|
instance = db.instance_get(self.context, instance_id)
|
||||||
|
pool = db.console_pool_get_by_host_type(self.context,
|
||||||
|
instance['host'],
|
||||||
|
self.console.host,
|
||||||
|
self.console.driver.console_type)
|
||||||
|
|
||||||
|
console_instances = [con['instance_id'] for con in pool.consoles]
|
||||||
|
self.assert_(instance_id in console_instances)
|
||||||
|
|
||||||
|
def test_add_console_does_not_duplicate(self):
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
cons1 = self.console.add_console(self.context, instance_id)
|
||||||
|
cons2 = self.console.add_console(self.context, instance_id)
|
||||||
|
self.assertEqual(cons1,cons2)
|
||||||
|
|
||||||
|
def test_remove_console(self):
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
self.console.add_console(self.context, instance_id)
|
||||||
|
self.console.remove_console(self.context, instance_id)
|
||||||
|
|
||||||
|
instance = db.instance_get(self.context, instance_id)
|
||||||
|
pool = db.console_pool_get_by_host_type(self.context,
|
||||||
|
instance['host'],
|
||||||
|
self.console.host,
|
||||||
|
self.console.driver.console_type)
|
||||||
|
|
||||||
|
console_instances = [con['instance_id'] for con in pool.consoles]
|
||||||
|
self.assert_(instance_id not in console_instances)
|
||||||
|
|
||||||
Reference in New Issue
Block a user