merged trunk
This commit is contained in:
commit
0e307db62b
|
@ -12,3 +12,4 @@ CA/openssl.cnf
|
|||
CA/serial*
|
||||
CA/newcerts/*.pem
|
||||
CA/private/cakey.pem
|
||||
nova/vcsversion.py
|
||||
|
|
1
.mailmap
1
.mailmap
|
@ -30,3 +30,4 @@
|
|||
<rconradharris@gmail.com> <rick.harris@rackspace.com>
|
||||
<corywright@gmail.com> <cory.wright@rackspace.com>
|
||||
<ant@openstack.org> <amesserl@rackspace.com>
|
||||
<chiradeep@cloud.com> <chiradeep@chiradeep-lt2>
|
||||
|
|
7
Authors
7
Authors
|
@ -3,6 +3,7 @@ Anne Gentle <anne@openstack.org>
|
|||
Anthony Young <sleepsonthefloor@gmail.com>
|
||||
Antony Messerli <ant@openstack.org>
|
||||
Armando Migliaccio <Armando.Migliaccio@eu.citrix.com>
|
||||
Chiradeep Vittal <chiradeep@cloud.com>
|
||||
Chris Behrens <cbehrens@codestud.com>
|
||||
Chmouel Boudjnah <chmouel@chmouel.com>
|
||||
Cory Wright <corywright@gmail.com>
|
||||
|
@ -14,16 +15,21 @@ Eldar Nugaev <enugaev@griddynamics.com>
|
|||
Eric Day <eday@oddments.org>
|
||||
Ewan Mellor <ewan.mellor@citrix.com>
|
||||
Hisaki Ohara <hisaki.ohara@intel.com>
|
||||
Ilya Alekseyev <ialekseev@griddynamics.com>
|
||||
Jay Pipes <jaypipes@gmail.com>
|
||||
Jesse Andrews <anotherjesse@gmail.com>
|
||||
Joe Heck <heckj@mac.com>
|
||||
Joel Moore <joelbm24@gmail.com>
|
||||
Jonathan Bryce <jbryce@jbryce.com>
|
||||
Josh Durgin <joshd@hq.newdream.net>
|
||||
Josh Kearney <josh.kearney@rackspace.com>
|
||||
Joshua McKenty <jmckenty@gmail.com>
|
||||
Justin Santa Barbara <justin@fathomdb.com>
|
||||
Ken Pepple <ken.pepple@gmail.com>
|
||||
Lorin Hochstein <lorin@isi.edu>
|
||||
Matt Dietz <matt.dietz@rackspace.com>
|
||||
Michael Gundlach <michael.gundlach@rackspace.com>
|
||||
Monsyne Dragon <mdragon@rackspace.com>
|
||||
Monty Taylor <mordred@inaugust.com>
|
||||
Paul Voccio <paul@openstack.org>
|
||||
Rick Clark <rick@openstack.org>
|
||||
|
@ -39,4 +45,3 @@ Trey Morris <trey.morris@rackspace.com>
|
|||
Vishvananda Ishaya <vishvananda@gmail.com>
|
||||
Youcef Laribi <Youcef.Laribi@eu.citrix.com>
|
||||
Zhixue Wu <Zhixue.Wu@citrix.com>
|
||||
|
||||
|
|
4
README
4
README
|
@ -1,7 +1,7 @@
|
|||
The Choose Your Own Adventure README for Nova:
|
||||
|
||||
You have come across a cloud computing fabric controller. It has identified
|
||||
itself as "Nova." It is apparent that it maintains compatability with
|
||||
itself as "Nova." It is apparent that it maintains compatibility with
|
||||
the popular Amazon EC2 and S3 APIs.
|
||||
|
||||
To monitor it from a distance: follow @novacc on twitter
|
||||
|
@ -10,7 +10,7 @@ To tame it for use in your own cloud: read http://nova.openstack.org/getting.sta
|
|||
|
||||
To study its anatomy: read http://nova.openstack.org/architecture.html
|
||||
|
||||
To disect it in detail: visit http://code.launchpad.net/nova
|
||||
To dissect it in detail: visit http://code.launchpad.net/nova
|
||||
|
||||
To taunt it with its weaknesses: use http://bugs.launchpad.net/nova
|
||||
|
||||
|
|
|
@ -0,0 +1,137 @@
|
|||
#!/usr/bin/env python
|
||||
# pylint: disable-msg=C0103
|
||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||
|
||||
# Copyright 2010 United States Government as represented by the
|
||||
# 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.
|
||||
|
||||
"""Ajax Console Proxy Server"""
|
||||
|
||||
from eventlet import greenthread
|
||||
from eventlet.green import urllib2
|
||||
|
||||
import exceptions
|
||||
import gettext
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import urlparse
|
||||
|
||||
# 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 flags
|
||||
from nova import log as logging
|
||||
from nova import rpc
|
||||
from nova import utils
|
||||
from nova import wsgi
|
||||
|
||||
FLAGS = flags.FLAGS
|
||||
|
||||
flags.DEFINE_integer('ajax_console_idle_timeout', 300,
|
||||
'Seconds before idle connection destroyed')
|
||||
|
||||
LOG = logging.getLogger('nova.ajax_console_proxy')
|
||||
LOG.setLevel(logging.DEBUG)
|
||||
LOG.addHandler(logging.StreamHandler())
|
||||
|
||||
|
||||
class AjaxConsoleProxy(object):
|
||||
tokens = {}
|
||||
|
||||
def __call__(self, env, start_response):
|
||||
try:
|
||||
req_url = '%s://%s%s?%s' % (env['wsgi.url_scheme'],
|
||||
env['HTTP_HOST'],
|
||||
env['PATH_INFO'],
|
||||
env['QUERY_STRING'])
|
||||
if 'HTTP_REFERER' in env:
|
||||
auth_url = env['HTTP_REFERER']
|
||||
else:
|
||||
auth_url = req_url
|
||||
|
||||
auth_params = urlparse.parse_qs(urlparse.urlparse(auth_url).query)
|
||||
parsed_url = urlparse.urlparse(req_url)
|
||||
|
||||
auth_info = AjaxConsoleProxy.tokens[auth_params['token'][0]]
|
||||
args = auth_info['args']
|
||||
auth_info['last_activity'] = time.time()
|
||||
|
||||
remote_url = ("http://%s:%s%s?token=%s" % (
|
||||
str(args['host']),
|
||||
str(args['port']),
|
||||
parsed_url.path,
|
||||
str(args['token'])))
|
||||
|
||||
opener = urllib2.urlopen(remote_url, env['wsgi.input'].read())
|
||||
body = opener.read()
|
||||
info = opener.info()
|
||||
|
||||
start_response("200 OK", info.dict.items())
|
||||
return body
|
||||
except (exceptions.KeyError):
|
||||
if env['PATH_INFO'] != '/favicon.ico':
|
||||
LOG.audit("Unauthorized request %s, %s"
|
||||
% (req_url, str(env)))
|
||||
start_response("401 NOT AUTHORIZED", [])
|
||||
return "Not Authorized"
|
||||
except Exception:
|
||||
start_response("500 ERROR", [])
|
||||
return "Server Error"
|
||||
|
||||
def register_listeners(self):
|
||||
class Callback:
|
||||
def __call__(self, data, message):
|
||||
if data['method'] == 'authorize_ajax_console':
|
||||
AjaxConsoleProxy.tokens[data['args']['token']] = \
|
||||
{'args': data['args'], 'last_activity': time.time()}
|
||||
|
||||
conn = rpc.Connection.instance(new=True)
|
||||
consumer = rpc.TopicConsumer(
|
||||
connection=conn,
|
||||
topic=FLAGS.ajax_console_proxy_topic)
|
||||
consumer.register_callback(Callback())
|
||||
|
||||
def delete_expired_tokens():
|
||||
now = time.time()
|
||||
to_delete = []
|
||||
for k, v in AjaxConsoleProxy.tokens.items():
|
||||
if now - v['last_activity'] > FLAGS.ajax_console_idle_timeout:
|
||||
to_delete.append(k)
|
||||
|
||||
for k in to_delete:
|
||||
del AjaxConsoleProxy.tokens[k]
|
||||
|
||||
utils.LoopingCall(consumer.fetch, auto_ack=True,
|
||||
enable_callbacks=True).start(0.1)
|
||||
utils.LoopingCall(delete_expired_tokens).start(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
utils.default_flagfile()
|
||||
FLAGS(sys.argv)
|
||||
server = wsgi.Server()
|
||||
acp = AjaxConsoleProxy()
|
||||
acp.register_listeners()
|
||||
server.start(acp, FLAGS.ajax_console_proxy_port, host='0.0.0.0')
|
||||
server.wait()
|
|
@ -41,7 +41,6 @@ from nova import wsgi
|
|||
|
||||
|
||||
FLAGS = flags.FLAGS
|
||||
flags.DEFINE_integer('osapi_port', 8774, 'OpenStack API port')
|
||||
flags.DEFINE_string('osapi_host', '0.0.0.0', 'OpenStack API host')
|
||||
flags.DEFINE_integer('ec2api_port', 8773, 'EC2 API port')
|
||||
flags.DEFINE_string('ec2api_host', '0.0.0.0', 'EC2 API host')
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
"""Starter script for Nova API."""
|
||||
|
||||
import gettext
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
@ -38,6 +37,7 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||
gettext.install('nova', unicode=1)
|
||||
|
||||
from nova import flags
|
||||
from nova import log as logging
|
||||
from nova import wsgi
|
||||
|
||||
LOG = logging.getLogger('nova.api')
|
||||
|
|
|
@ -44,7 +44,6 @@ from nova import wsgi
|
|||
|
||||
|
||||
FLAGS = flags.FLAGS
|
||||
flags.DEFINE_integer('osapi_port', 8774, 'OpenStack API port')
|
||||
flags.DEFINE_string('osapi_host', '0.0.0.0', 'OpenStack API host')
|
||||
flags.DEFINE_integer('ec2api_port', 8773, 'EC2 API port')
|
||||
flags.DEFINE_string('ec2api_host', '0.0.0.0', 'EC2 API host')
|
||||
|
|
|
@ -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()
|
|
@ -22,7 +22,6 @@ Handle lease database updates from DHCP servers.
|
|||
"""
|
||||
|
||||
import gettext
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
@ -39,6 +38,7 @@ gettext.install('nova', unicode=1)
|
|||
from nova import context
|
||||
from nova import db
|
||||
from nova import flags
|
||||
from nova import log as logging
|
||||
from nova import rpc
|
||||
from nova import utils
|
||||
from nova.network import linux_net
|
||||
|
@ -49,11 +49,13 @@ flags.DECLARE('network_size', 'nova.network.manager')
|
|||
flags.DECLARE('num_networks', 'nova.network.manager')
|
||||
flags.DECLARE('update_dhcp_on_disassociate', 'nova.network.manager')
|
||||
|
||||
LOG = logging.getLogger('nova.dhcpbridge')
|
||||
|
||||
|
||||
def add_lease(mac, ip_address, _hostname, _interface):
|
||||
"""Set the IP that was assigned by the DHCP server."""
|
||||
if FLAGS.fake_rabbit:
|
||||
logging.debug("leasing ip")
|
||||
LOG.debug(_("leasing ip"))
|
||||
network_manager = utils.import_object(FLAGS.network_manager)
|
||||
network_manager.lease_fixed_ip(context.get_admin_context(),
|
||||
mac,
|
||||
|
@ -68,14 +70,14 @@ def add_lease(mac, ip_address, _hostname, _interface):
|
|||
|
||||
def old_lease(mac, ip_address, hostname, interface):
|
||||
"""Update just as add lease."""
|
||||
logging.debug("Adopted old lease or got a change of mac/hostname")
|
||||
LOG.debug(_("Adopted old lease or got a change of mac/hostname"))
|
||||
add_lease(mac, ip_address, hostname, interface)
|
||||
|
||||
|
||||
def del_lease(mac, ip_address, _hostname, _interface):
|
||||
"""Called when a lease expires."""
|
||||
if FLAGS.fake_rabbit:
|
||||
logging.debug("releasing ip")
|
||||
LOG.debug(_("releasing ip"))
|
||||
network_manager = utils.import_object(FLAGS.network_manager)
|
||||
network_manager.release_fixed_ip(context.get_admin_context(),
|
||||
mac,
|
||||
|
@ -100,6 +102,7 @@ def main():
|
|||
flagfile = os.environ.get('FLAGFILE', FLAGS.dhcpbridge_flagfile)
|
||||
utils.default_flagfile(flagfile)
|
||||
argv = FLAGS(sys.argv)
|
||||
logging.basicConfig()
|
||||
interface = os.environ.get('DNSMASQ_INTERFACE', 'br0')
|
||||
if int(os.environ.get('TESTING', '0')):
|
||||
FLAGS.fake_rabbit = True
|
||||
|
@ -117,9 +120,9 @@ def main():
|
|||
mac = argv[2]
|
||||
ip = argv[3]
|
||||
hostname = argv[4]
|
||||
logging.debug("Called %s for mac %s with ip %s and "
|
||||
"hostname %s on interface %s",
|
||||
action, mac, ip, hostname, interface)
|
||||
LOG.debug(_("Called %s for mac %s with ip %s and "
|
||||
"hostname %s on interface %s"),
|
||||
action, mac, ip, hostname, interface)
|
||||
globals()[action + '_lease'](mac, ip, hostname, interface)
|
||||
else:
|
||||
print init_leases(interface)
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
import gettext
|
||||
import os
|
||||
import logging
|
||||
import sys
|
||||
from twisted.application import service
|
||||
|
||||
|
@ -37,19 +36,23 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|||
|
||||
gettext.install('nova', unicode=1)
|
||||
|
||||
from nova import log as logging
|
||||
from nova import utils
|
||||
from nova import twistd
|
||||
from nova.compute import monitor
|
||||
|
||||
# TODO(todd): shouldn't this be done with flags? And what about verbose?
|
||||
logging.getLogger('boto').setLevel(logging.WARN)
|
||||
|
||||
LOG = logging.getLogger('nova.instancemonitor')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
utils.default_flagfile()
|
||||
twistd.serve(__file__)
|
||||
|
||||
if __name__ == '__builtin__':
|
||||
logging.warn('Starting instance monitor')
|
||||
LOG.warn(_('Starting instance monitor'))
|
||||
# pylint: disable-msg=C0103
|
||||
monitor = monitor.InstanceMonitor()
|
||||
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
# Copyright 2010 United States Government as represented by the
|
||||
# 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.
|
||||
|
||||
"""
|
||||
Tools for working with logs generated by nova components
|
||||
"""
|
||||
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
class Request(object):
|
||||
def __init__(self):
|
||||
self.time = ""
|
||||
self.host = ""
|
||||
self.logger = ""
|
||||
self.message = ""
|
||||
self.trace = ""
|
||||
self.env = ""
|
||||
self.request_id = ""
|
||||
|
||||
def add_error_line(self, error_line):
|
||||
self.time = " ".join(error_line.split(" ")[:3])
|
||||
self.host = error_line.split(" ")[3]
|
||||
self.logger = error_line.split("(")[1].split(" ")[0]
|
||||
self.request_id = error_line.split("[")[1].split(" ")[0]
|
||||
error_lines = error_line.split("#012")
|
||||
self.message = self.clean_log_line(error_lines.pop(0))
|
||||
self.trace = "\n".join([self.clean_trace(l) for l in error_lines])
|
||||
|
||||
def add_environment_line(self, env_line):
|
||||
self.env = self.clean_env_line(env_line)
|
||||
|
||||
def clean_log_line(self, line):
|
||||
"""Remove log format for time, level, etc: split after context"""
|
||||
return line.split('] ')[-1]
|
||||
|
||||
def clean_env_line(self, line):
|
||||
"""Also has an 'Environment: ' string in the message"""
|
||||
return re.sub(r'^Environment: ', '', self.clean_log_line(line))
|
||||
|
||||
def clean_trace(self, line):
|
||||
"""trace has a different format, so split on TRACE:"""
|
||||
return line.split('TRACE: ')[-1]
|
||||
|
||||
def to_dict(self):
|
||||
return {'traceback': self.trace, 'message': self.message,
|
||||
'host': self.host, 'env': self.env, 'logger': self.logger,
|
||||
'request_id': self.request_id}
|
||||
|
||||
|
||||
class LogReader(object):
|
||||
def __init__(self, filename):
|
||||
self.filename = filename
|
||||
self._errors = {}
|
||||
|
||||
def process(self, spooldir):
|
||||
with open(self.filename) as f:
|
||||
line = f.readline()
|
||||
while len(line) > 0:
|
||||
parts = line.split(" ")
|
||||
level = (len(parts) < 6) or parts[5]
|
||||
if level == 'ERROR':
|
||||
self.handle_logged_error(line)
|
||||
elif level == '[-]' and self.last_error:
|
||||
# twisted stack trace line
|
||||
clean_line = " ".join(line.split(" ")[6:])
|
||||
self.last_error.trace = self.last_error.trace + clean_line
|
||||
else:
|
||||
self.last_error = None
|
||||
line = f.readline()
|
||||
self.update_spool(spooldir)
|
||||
|
||||
def handle_logged_error(self, line):
|
||||
request_id = re.search(r' \[([A-Z0-9\-/]+)', line)
|
||||
if not request_id:
|
||||
raise Exception("Unable to parse request id from %s" % line)
|
||||
request_id = request_id.group(1)
|
||||
data = self._errors.get(request_id, Request())
|
||||
if self.is_env_line(line):
|
||||
data.add_environment_line(line)
|
||||
elif self.is_error_line(line):
|
||||
data.add_error_line(line)
|
||||
else:
|
||||
# possibly error from twsited
|
||||
data.add_error_line(line)
|
||||
self.last_error = data
|
||||
self._errors[request_id] = data
|
||||
|
||||
def is_env_line(self, line):
|
||||
return re.search('Environment: ', line)
|
||||
|
||||
def is_error_line(self, line):
|
||||
return re.search('raised', line)
|
||||
|
||||
def update_spool(self, directory):
|
||||
processed_dir = "%s/processed" % directory
|
||||
self._ensure_dir_exists(processed_dir)
|
||||
for rid, value in self._errors.iteritems():
|
||||
if not self.has_been_processed(processed_dir, rid):
|
||||
with open("%s/%s" % (directory, rid), "w") as spool:
|
||||
spool.write(json.dumps(value.to_dict()))
|
||||
self.flush_old_processed_spool(processed_dir)
|
||||
|
||||
def _ensure_dir_exists(self, d):
|
||||
mkdir = False
|
||||
try:
|
||||
os.stat(d)
|
||||
except:
|
||||
mkdir = True
|
||||
if mkdir:
|
||||
os.mkdir(d)
|
||||
|
||||
def has_been_processed(self, processed_dir, rid):
|
||||
rv = False
|
||||
try:
|
||||
os.stat("%s/%s" % (processed_dir, rid))
|
||||
rv = True
|
||||
except:
|
||||
pass
|
||||
return rv
|
||||
|
||||
def flush_old_processed_spool(self, processed_dir):
|
||||
keys = self._errors.keys()
|
||||
procs = os.listdir(processed_dir)
|
||||
for p in procs:
|
||||
if p not in keys:
|
||||
# log has rotated and the old error won't be seen again
|
||||
os.unlink("%s/%s" % (processed_dir, p))
|
||||
|
||||
if __name__ == '__main__':
|
||||
filename = '/var/log/nova.log'
|
||||
spooldir = '/var/spool/nova'
|
||||
if len(sys.argv) > 1:
|
||||
filename = sys.argv[1]
|
||||
if len(sys.argv) > 2:
|
||||
spooldir = sys.argv[2]
|
||||
LogReader(filename).process(spooldir)
|
|
@ -55,8 +55,8 @@
|
|||
|
||||
import datetime
|
||||
import gettext
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
@ -77,12 +77,14 @@ from nova import crypto
|
|||
from nova import db
|
||||
from nova import exception
|
||||
from nova import flags
|
||||
from nova import log as logging
|
||||
from nova import quota
|
||||
from nova import utils
|
||||
from nova.auth import manager
|
||||
from nova.cloudpipe import pipelib
|
||||
|
||||
|
||||
logging.basicConfig()
|
||||
FLAGS = flags.FLAGS
|
||||
flags.DECLARE('fixed_range', 'nova.network.manager')
|
||||
flags.DECLARE('num_networks', 'nova.network.manager')
|
||||
|
@ -333,6 +335,11 @@ class ProjectCommands(object):
|
|||
arguments: name project_manager [description]"""
|
||||
self.manager.create_project(name, project_manager, description)
|
||||
|
||||
def modify(self, name, project_manager, description=None):
|
||||
"""Modifies a project
|
||||
arguments: name project_manager [description]"""
|
||||
self.manager.modify_project(name, project_manager, description)
|
||||
|
||||
def delete(self, name):
|
||||
"""Deletes an existing project
|
||||
arguments: name"""
|
||||
|
@ -499,6 +506,15 @@ class ServiceCommands(object):
|
|||
db.service_update(ctxt, svc['id'], {'disabled': True})
|
||||
|
||||
|
||||
class LogCommands(object):
|
||||
def request(self, request_id, logfile='/var/log/nova.log'):
|
||||
"""Show all fields in the log for the given request. Assumes you
|
||||
haven't changed the log format too much.
|
||||
ARGS: request_id [logfile]"""
|
||||
lines = utils.execute("cat %s | grep '\[%s '" % (logfile, request_id))
|
||||
print re.sub('#012', "\n", "\n".join(lines))
|
||||
|
||||
|
||||
CATEGORIES = [
|
||||
('user', UserCommands),
|
||||
('project', ProjectCommands),
|
||||
|
@ -507,7 +523,8 @@ CATEGORIES = [
|
|||
('vpn', VpnCommands),
|
||||
('floating', FloatingIpCommands),
|
||||
('network', NetworkCommands),
|
||||
('service', ServiceCommands)]
|
||||
('service', ServiceCommands),
|
||||
('log', LogCommands)]
|
||||
|
||||
|
||||
def lazy_match(name, key_value_tuples):
|
||||
|
@ -546,9 +563,6 @@ def main():
|
|||
utils.default_flagfile()
|
||||
argv = FLAGS(sys.argv)
|
||||
|
||||
if FLAGS.verbose:
|
||||
logging.getLogger().setLevel(logging.DEBUG)
|
||||
|
||||
script_name = argv.pop(0)
|
||||
if len(argv) < 1:
|
||||
print script_name + " category action [<args>]"
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
#!/usr/bin/env python
|
||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||
|
||||
# Copyright 2010 United States Government as represented by the
|
||||
# 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.
|
||||
|
||||
|
||||
import base64
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import urllib
|
||||
import urllib2
|
||||
try:
|
||||
import cPickle as pickle
|
||||
except:
|
||||
import pickle
|
||||
|
||||
|
||||
class SpoolSentry(object):
|
||||
def __init__(self, spool_dir, sentry_url, key=None):
|
||||
self.spool_dir = spool_dir
|
||||
self.sentry_url = sentry_url
|
||||
self.key = key
|
||||
|
||||
def process(self):
|
||||
for fname in os.listdir(self.spool_dir):
|
||||
if fname == "processed":
|
||||
continue
|
||||
try:
|
||||
sourcefile = "%s/%s" % (self.spool_dir, fname)
|
||||
with open(sourcefile) as f:
|
||||
fdata = f.read()
|
||||
data_from_json = json.loads(fdata)
|
||||
data = self.build_data(data_from_json)
|
||||
self.send_data(data)
|
||||
destfile = "%s/processed/%s" % (self.spool_dir, fname)
|
||||
shutil.move(sourcefile, destfile)
|
||||
except:
|
||||
logging.exception("Unable to upload record %s", fname)
|
||||
raise
|
||||
|
||||
def build_data(self, filejson):
|
||||
env = {'SERVER_NAME': 'unknown', 'SERVER_PORT': '0000',
|
||||
'SCRIPT_NAME': '/unknown/', 'PATH_INFO': 'unknown'}
|
||||
if filejson['env']:
|
||||
env = json.loads(filejson['env'])
|
||||
url = "http://%s:%s%s%s" % (env['SERVER_NAME'], env['SERVER_PORT'],
|
||||
env['SCRIPT_NAME'], env['PATH_INFO'])
|
||||
rv = {'logger': filejson['logger'], 'level': logging.ERROR,
|
||||
'server_name': filejson['host'], 'url': url,
|
||||
'message': filejson['message'],
|
||||
'traceback': filejson['traceback']}
|
||||
rv['data'] = {}
|
||||
if filejson['env']:
|
||||
rv['data']['META'] = env
|
||||
if filejson['request_id']:
|
||||
rv['data']['request_id'] = filejson['request_id']
|
||||
return rv
|
||||
|
||||
def send_data(self, data):
|
||||
data = {
|
||||
'data': base64.b64encode(pickle.dumps(data).encode('zlib')),
|
||||
'key': self.key
|
||||
}
|
||||
req = urllib2.Request(self.sentry_url)
|
||||
res = urllib2.urlopen(req, urllib.urlencode(data))
|
||||
if res.getcode() != 200:
|
||||
raise Exception("Bad HTTP code: %s" % res.getcode())
|
||||
txt = res.read()
|
||||
|
||||
if __name__ == '__main__':
|
||||
sentryurl = 'http://127.0.0.1/sentry/store/'
|
||||
key = ''
|
||||
spooldir = '/var/spool/nova'
|
||||
if len(sys.argv) > 1:
|
||||
sentryurl = sys.argv[1]
|
||||
if len(sys.argv) > 2:
|
||||
key = sys.argv[2]
|
||||
if len(sys.argv) > 3:
|
||||
spooldir = sys.argv[3]
|
||||
SpoolSentry(spooldir, sentryurl, key).process()
|
|
@ -78,6 +78,7 @@ if [ "$CMD" == "install" ]; then
|
|||
sudo apt-get install -y user-mode-linux kvm libvirt-bin
|
||||
sudo apt-get install -y screen euca2ools vlan curl rabbitmq-server
|
||||
sudo apt-get install -y lvm2 iscsitarget open-iscsi
|
||||
sudo apt-get install -y socat
|
||||
echo "ISCSITARGET_ENABLE=true" | sudo tee /etc/default/iscsitarget
|
||||
sudo /etc/init.d/iscsitarget restart
|
||||
sudo modprobe kvm
|
||||
|
@ -156,6 +157,7 @@ if [ "$CMD" == "run" ]; then
|
|||
screen_it network "$NOVA_DIR/bin/nova-network"
|
||||
screen_it scheduler "$NOVA_DIR/bin/nova-scheduler"
|
||||
screen_it volume "$NOVA_DIR/bin/nova-volume"
|
||||
screen_it ajax_console_proxy "$NOVA_DIR/bin/nova-ajax-console-proxy"
|
||||
screen_it test ". $NOVA_DIR/novarc"
|
||||
screen -S nova -x
|
||||
fi
|
||||
|
|
|
@ -1,97 +0,0 @@
|
|||
source/api/nova..adminclient.rst
|
||||
source/api/nova..api.cloud.rst
|
||||
source/api/nova..api.ec2.admin.rst
|
||||
source/api/nova..api.ec2.apirequest.rst
|
||||
source/api/nova..api.ec2.cloud.rst
|
||||
source/api/nova..api.ec2.images.rst
|
||||
source/api/nova..api.ec2.metadatarequesthandler.rst
|
||||
source/api/nova..api.openstack.auth.rst
|
||||
source/api/nova..api.openstack.backup_schedules.rst
|
||||
source/api/nova..api.openstack.faults.rst
|
||||
source/api/nova..api.openstack.flavors.rst
|
||||
source/api/nova..api.openstack.images.rst
|
||||
source/api/nova..api.openstack.servers.rst
|
||||
source/api/nova..api.openstack.sharedipgroups.rst
|
||||
source/api/nova..auth.dbdriver.rst
|
||||
source/api/nova..auth.fakeldap.rst
|
||||
source/api/nova..auth.ldapdriver.rst
|
||||
source/api/nova..auth.manager.rst
|
||||
source/api/nova..auth.signer.rst
|
||||
source/api/nova..cloudpipe.pipelib.rst
|
||||
source/api/nova..compute.disk.rst
|
||||
source/api/nova..compute.instance_types.rst
|
||||
source/api/nova..compute.manager.rst
|
||||
source/api/nova..compute.monitor.rst
|
||||
source/api/nova..compute.power_state.rst
|
||||
source/api/nova..context.rst
|
||||
source/api/nova..crypto.rst
|
||||
source/api/nova..db.api.rst
|
||||
source/api/nova..db.sqlalchemy.api.rst
|
||||
source/api/nova..db.sqlalchemy.models.rst
|
||||
source/api/nova..db.sqlalchemy.session.rst
|
||||
source/api/nova..exception.rst
|
||||
source/api/nova..fakerabbit.rst
|
||||
source/api/nova..flags.rst
|
||||
source/api/nova..image.service.rst
|
||||
source/api/nova..manager.rst
|
||||
source/api/nova..network.linux_net.rst
|
||||
source/api/nova..network.manager.rst
|
||||
source/api/nova..objectstore.bucket.rst
|
||||
source/api/nova..objectstore.handler.rst
|
||||
source/api/nova..objectstore.image.rst
|
||||
source/api/nova..objectstore.stored.rst
|
||||
source/api/nova..process.rst
|
||||
source/api/nova..quota.rst
|
||||
source/api/nova..rpc.rst
|
||||
source/api/nova..scheduler.chance.rst
|
||||
source/api/nova..scheduler.driver.rst
|
||||
source/api/nova..scheduler.manager.rst
|
||||
source/api/nova..scheduler.simple.rst
|
||||
source/api/nova..server.rst
|
||||
source/api/nova..service.rst
|
||||
source/api/nova..test.rst
|
||||
source/api/nova..tests.access_unittest.rst
|
||||
source/api/nova..tests.api.fakes.rst
|
||||
source/api/nova..tests.api.openstack.fakes.rst
|
||||
source/api/nova..tests.api.openstack.test_api.rst
|
||||
source/api/nova..tests.api.openstack.test_auth.rst
|
||||
source/api/nova..tests.api.openstack.test_faults.rst
|
||||
source/api/nova..tests.api.openstack.test_flavors.rst
|
||||
source/api/nova..tests.api.openstack.test_images.rst
|
||||
source/api/nova..tests.api.openstack.test_ratelimiting.rst
|
||||
source/api/nova..tests.api.openstack.test_servers.rst
|
||||
source/api/nova..tests.api.openstack.test_sharedipgroups.rst
|
||||
source/api/nova..tests.api.test_wsgi.rst
|
||||
source/api/nova..tests.api_integration.rst
|
||||
source/api/nova..tests.api_unittest.rst
|
||||
source/api/nova..tests.auth_unittest.rst
|
||||
source/api/nova..tests.cloud_unittest.rst
|
||||
source/api/nova..tests.compute_unittest.rst
|
||||
source/api/nova..tests.declare_flags.rst
|
||||
source/api/nova..tests.fake_flags.rst
|
||||
source/api/nova..tests.flags_unittest.rst
|
||||
source/api/nova..tests.network_unittest.rst
|
||||
source/api/nova..tests.objectstore_unittest.rst
|
||||
source/api/nova..tests.process_unittest.rst
|
||||
source/api/nova..tests.quota_unittest.rst
|
||||
source/api/nova..tests.real_flags.rst
|
||||
source/api/nova..tests.rpc_unittest.rst
|
||||
source/api/nova..tests.runtime_flags.rst
|
||||
source/api/nova..tests.scheduler_unittest.rst
|
||||
source/api/nova..tests.service_unittest.rst
|
||||
source/api/nova..tests.twistd_unittest.rst
|
||||
source/api/nova..tests.validator_unittest.rst
|
||||
source/api/nova..tests.virt_unittest.rst
|
||||
source/api/nova..tests.volume_unittest.rst
|
||||
source/api/nova..twistd.rst
|
||||
source/api/nova..utils.rst
|
||||
source/api/nova..validate.rst
|
||||
source/api/nova..virt.connection.rst
|
||||
source/api/nova..virt.fake.rst
|
||||
source/api/nova..virt.images.rst
|
||||
source/api/nova..virt.libvirt_conn.rst
|
||||
source/api/nova..virt.xenapi.rst
|
||||
source/api/nova..volume.driver.rst
|
||||
source/api/nova..volume.manager.rst
|
||||
source/api/nova..wsgi.rst
|
||||
source/api/autoindex.rst
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
Overview Sections Copyright 2010 Citrix
|
||||
Overview Sections Copyright 2010-2011 Citrix
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
|
@ -17,36 +18,35 @@
|
|||
|
||||
Installing Nova on Multiple Servers
|
||||
===================================
|
||||
|
||||
|
||||
When you move beyond evaluating the technology and into building an actual
|
||||
production environment, you will need to know how to configure your datacenter
|
||||
and how to deploy components across your clusters. This guide should help you
|
||||
through that process.
|
||||
|
||||
|
||||
You can install multiple nodes to increase performance and availability of the OpenStack Compute installation.
|
||||
|
||||
|
||||
This setup is based on an Ubuntu Lucid 10.04 installation with the latest updates. Most of this works around issues that need to be resolved in the installation and configuration scripts as of October 18th 2010. It also needs to eventually be generalized, but the intent here is to get the multi-node configuration bootstrapped so folks can move forward.
|
||||
|
||||
|
||||
|
||||
|
||||
Requirements for a multi-node installation
|
||||
------------------------------------------
|
||||
|
||||
|
||||
* You need a real database, compatible with SQLAlchemy (mysql, postgresql) There's not a specific reason to choose one over another, it basically depends what you know. MySQL is easier to do High Availability (HA) with, but people may already know Postgres. We should document both configurations, though.
|
||||
* For a recommended HA setup, consider a MySQL master/slave replication, with as many slaves as you like, and probably a heartbeat to kick one of the slaves into being a master if it dies.
|
||||
* For performance optimization, split reads and writes to the database. MySQL proxy is the easiest way to make this work if running MySQL.
|
||||
|
||||
|
||||
Assumptions
|
||||
^^^^^^^^^^^
|
||||
|
||||
-----------
|
||||
|
||||
* Networking is configured between/through the physical machines on a single subnet.
|
||||
* Installation and execution are both performed by root user.
|
||||
* Installation and execution are both performed by ROOT user.
|
||||
|
||||
|
||||
Step 1 - Use apt-get to get the latest code
|
||||
-------------------------------------------
|
||||
|
||||
|
||||
|
||||
Step 1 Use apt-get to get the latest code
|
||||
-----------------------------------------
|
||||
|
||||
1. Setup Nova PPA with https://launchpad.net/~nova-core/+archive/trunk.
|
||||
1. Setup Nova PPA with https://launchpad.net/~nova-core/+archive/trunk. The ‘python-software-properties’ package is a pre-requisite for setting up the nova package repo:
|
||||
|
||||
::
|
||||
|
||||
|
@ -69,201 +69,260 @@ Step 1 Use apt-get to get the latest code
|
|||
It is highly likely that there will be errors when the nova services come up since they are not yet configured. Don't worry, you're only at step 1!
|
||||
|
||||
Step 2 Setup configuration file (installed in /etc/nova)
|
||||
---------------------------------------------------------
|
||||
--------------------------------------------------------
|
||||
|
||||
1. Nova development has consolidated all config files to nova.conf as of November 2010. There is a default set of options that are already configured in nova.conf:
|
||||
|
||||
::
|
||||
|
||||
--daemonize=1
|
||||
--dhcpbridge_flagfile=/etc/nova/nova.conf
|
||||
--dhcpbridge=/usr/bin/nova-dhcpbridge
|
||||
--logdir=/var/log/nova
|
||||
--state_path=/var/lib/nova
|
||||
|
||||
The following items ALSO need to be defined in /etc/nova/nova.conf. I’ve added some explanation of the variables, as comments CANNOT be in nova.conf. There seems to be an issue with nova-manage not processing the comments/whitespace correctly:
|
||||
|
||||
--sql_connection ### Location of Nova SQL DB
|
||||
|
||||
--s3_host ### This is where Nova is hosting the objectstore service, which will contain the VM images and buckets
|
||||
|
||||
--rabbit_host ### This is where the rabbit AMQP messaging service is hosted
|
||||
|
||||
--cc_host ### This is where the the nova-api service lives
|
||||
|
||||
--verbose ### Optional but very helpful during initial setup
|
||||
|
||||
--ec2_url ### The location to interface nova-api
|
||||
|
||||
--network_manager ### Many options here, discussed below. This is how your controller will communicate with additional Nova nodes and VMs:
|
||||
|
||||
nova.network.manager.FlatManager # Simple, no-vlan networking type
|
||||
nova.network.manager. FlatDHCPManager # Flat networking with DHCP
|
||||
nova.network.manager.VlanManager # Vlan networking with DHCP – /DEFAULT/ if no network manager is defined in nova.conf
|
||||
|
||||
--fixed_range=<network/prefix> ### This will be the IP network that ALL the projects for future VM guests will reside on. E.g. 192.168.0.0/12
|
||||
|
||||
--network_size=<# of addrs> ### This is the total number of IP Addrs to use for VM guests, of all projects. E.g. 5000
|
||||
|
||||
The following code can be cut and paste, and edited to your setup:
|
||||
|
||||
Note: CC_ADDR=<the external IP address of your cloud controller>
|
||||
|
||||
Nova development has consolidated all .conf files to nova.conf as of November 2010. References to specific .conf files may be ignored.
|
||||
|
||||
#. These need to be defined in the nova.conf configuration file::
|
||||
|
||||
--sql_connection=mysql://root:nova@$CC_ADDR/nova # location of nova sql db
|
||||
--s3_host=$CC_ADDR # This is where Nova is hosting the objectstore service, which
|
||||
# will contain the VM images and buckets
|
||||
--rabbit_host=$CC_ADDR # This is where the rabbit AMQP messaging service is hosted
|
||||
--cc_host=$CC_ADDR # This is where the the nova-api service lives
|
||||
--verbose # Optional but very helpful during initial setup
|
||||
--ec2_url=http://$CC_ADDR:8773/services/Cloud
|
||||
--network_manager=nova.network.manager.FlatManager # simple, no-vlan networking type
|
||||
--fixed_range=<network/prefix> # ip network to use for VM guests, ex 192.168.2.64/26
|
||||
--network_size=<# of addrs> # number of ip addrs to use for VM guests, ex 64
|
||||
|
||||
#. Create a nova group::
|
||||
|
||||
sudo addgroup nova
|
||||
|
||||
The Nova config file should have its owner set to root:nova, and mode set to 0640, since they contain your MySQL server's root password.
|
||||
|
||||
Detailed explanation of the following example is available above.
|
||||
|
||||
::
|
||||
|
||||
--sql_connection=mysql://root:nova@<CC_ADDR>/nova
|
||||
--s3_host=<CC_ADDR>
|
||||
--rabbit_host=<CC_ADDR>
|
||||
--cc_host=<CC_ADDR>
|
||||
--verbose
|
||||
--ec2_url=http://<CC_ADDR>:8773/services/Cloud
|
||||
--network_manager=nova.network.manager.VlanManager
|
||||
--fixed_range=<network/prefix>
|
||||
--network_size=<# of addrs>
|
||||
|
||||
2. Create a “nova” group, and set permissions::
|
||||
|
||||
cd /etc/nova
|
||||
chown -R root:nova .
|
||||
addgroup nova
|
||||
|
||||
The Nova config file should have its owner set to root:nova, and mode set to 0644, since they contain your MySQL server's root password. ::
|
||||
|
||||
Step 3 Setup the sql db
|
||||
-----------------------
|
||||
chown -R root:nova /etc/nova
|
||||
chmod 644 /etc/nova/nova.conf
|
||||
|
||||
Step 3 - Setup the SQL DB (MySQL for this setup)
|
||||
------------------------------------------------
|
||||
|
||||
1. First you 'preseed' to bypass all the installation prompts::
|
||||
|
||||
1. First you 'preseed' (using the Quick Start method :doc:`../quickstart`). Run this as root.
|
||||
bash
|
||||
MYSQL_PASS=nova
|
||||
cat <<MYSQL_PRESEED | debconf-set-selections
|
||||
mysql-server-5.1 mysql-server/root_password password $MYSQL_PASS
|
||||
mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
|
||||
mysql-server-5.1 mysql-server/start_on_boot boolean true
|
||||
MYSQL_PRESEED
|
||||
|
||||
2. Install MySQL::
|
||||
|
||||
apt-get install -y mysql-server
|
||||
|
||||
3. Edit /etc/mysql/my.cnf to change ‘bind-address’ from localhost to any::
|
||||
|
||||
::
|
||||
|
||||
sudo apt-get install bzr git-core
|
||||
sudo bash
|
||||
export MYSQL_PASS=nova
|
||||
|
||||
|
||||
::
|
||||
|
||||
cat <<MYSQL_PRESEED | debconf-set-selections
|
||||
mysql-server-5.1 mysql-server/root_password password $MYSQL_PASS
|
||||
mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
|
||||
mysql-server-5.1 mysql-server/start_on_boot boolean true
|
||||
MYSQL_PRESEED
|
||||
|
||||
2. Install mysql
|
||||
|
||||
::
|
||||
|
||||
sudo apt-get install -y mysql-server
|
||||
|
||||
4. Edit /etc/mysql/my.cnf and set this line: bind-address=0.0.0.0 and then sighup or restart mysql
|
||||
|
||||
5. create nova's db
|
||||
|
||||
::
|
||||
|
||||
mysql -uroot -pnova -e 'CREATE DATABASE nova;'
|
||||
|
||||
|
||||
6. Update the db to include user 'root'@'%'
|
||||
|
||||
::
|
||||
|
||||
mysql -u root -p nova
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
|
||||
SET PASSWORD FOR 'root'@'%' = PASSWORD('nova');
|
||||
|
||||
7. Branch and install Nova
|
||||
|
||||
::
|
||||
|
||||
sudo -i
|
||||
cd ~
|
||||
export USE_MYSQL=1
|
||||
export MYSQL_PASS=nova
|
||||
git clone https://github.com/vishvananda/novascript.git
|
||||
cd novascript
|
||||
./nova.sh branch
|
||||
./nova.sh install
|
||||
./nova.sh run
|
||||
|
||||
Step 4 Setup Nova environment
|
||||
-----------------------------
|
||||
|
||||
::
|
||||
|
||||
/usr/bin/python /usr/bin/nova-manage user admin <user_name>
|
||||
/usr/bin/python /usr/bin/nova-manage project create <project_name> <user_name>
|
||||
/usr/bin/python /usr/bin/nova-manage project create network
|
||||
|
||||
Note: The nova-manage service assumes that the first IP address is your network (like 192.168.0.0), that the 2nd IP is your gateway (192.168.0.1), and that the broadcast is the very last IP in the range you defined (192.168.0.255). If this is not the case you will need to manually edit the sql db 'networks' table.o.
|
||||
|
||||
On running this command, entries are made in the 'networks' and 'fixed_ips' table. However, one of the networks listed in the 'networks' table needs to be marked as bridge in order for the code to know that a bridge exists. The Network is marked as bridged automatically based on the type of network manager selected.
|
||||
|
||||
More networking details to create a network bridge for flat network
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Nova defaults to a bridge device named 'br100'. This needs to be created and somehow integrated into YOUR network. In my case, I wanted to keep things as simple as possible and have all the vm guests on the same network as the vm hosts (the compute nodes). Thus, I set the compute node's external IP address to be on the bridge and added eth0 to that bridge. To do this, edit your network interfaces config to look like the following::
|
||||
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
|
||||
service mysql restart
|
||||
|
||||
3. Network Configuration
|
||||
|
||||
If you use FlatManager (as opposed to VlanManager that we set) as your network manager, there are some additional networking changes you’ll have to make to ensure connectivity between your nodes and VMs. If you chose VlanManager or FlatDHCP, you may skip this section, as it’s set up for you automatically.
|
||||
|
||||
Nova defaults to a bridge device named 'br100'. This needs to be created and somehow integrated into YOUR network. To keep things as simple as possible, have all the VM guests on the same network as the VM hosts (the compute nodes). To do so, set the compute node's external IP address to be on the bridge and add eth0 to that bridge. To do this, edit your network interfaces config to look like the following::
|
||||
|
||||
< begin /etc/network/interfaces >
|
||||
# The loopback network interface
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
|
||||
# Networking for NOVA
|
||||
auto br100
|
||||
|
||||
|
||||
iface br100 inet dhcp
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_maxwait 0
|
||||
bridge_fd 0
|
||||
< end /etc/network/interfaces >
|
||||
|
||||
|
||||
|
||||
Next, restart networking to apply the changes::
|
||||
|
||||
sudo /etc/init.d/networking restart
|
||||
|
||||
sudo /etc/init.d/networking restart
|
||||
4. MySQL DB configuration:
|
||||
|
||||
Create NOVA database::
|
||||
|
||||
Step 5: Create nova certs.
|
||||
--------------------------
|
||||
mysql -uroot -p$MYSQL_PASS -e 'CREATE DATABASE nova;'
|
||||
|
||||
Update the DB to include user 'root'@'%' with super user privileges::
|
||||
|
||||
Generate the certs as a zip file::
|
||||
mysql -uroot -p$MYSQL_PASS -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;"
|
||||
|
||||
Set mySQL root password::
|
||||
|
||||
mkdir creds
|
||||
sudo /usr/bin/python /usr/bin/nova-manage project zip admin admin creds/nova.zip
|
||||
mysql -uroot -p$MYSQL_PASS -e "SET PASSWORD FOR 'root'@'%' = PASSWORD('$MYSQL_PASS');"
|
||||
|
||||
Step 4 - Setup Nova environment
|
||||
-------------------------------
|
||||
|
||||
you can get the rc file more easily with::
|
||||
These are the commands you run to set up a user and project::
|
||||
|
||||
sudo /usr/bin/python /usr/bin/nova-manage project env admin admin creds/novarc
|
||||
/usr/bin/python /usr/bin/nova-manage user admin <user_name>
|
||||
/usr/bin/python /usr/bin/nova-manage project create <project_name> <user_name>
|
||||
/usr/bin/python /usr/bin/nova-manage network create <project-network> <number-of-networks-in-project> <IPs in project>
|
||||
|
||||
Here is an example of what this looks like with real data::
|
||||
|
||||
unzip them in your home directory, and add them to your environment::
|
||||
/usr/bin/python /usr/bin/nova-manage user admin dub
|
||||
/usr/bin/python /usr/bin/nova-manage project create dubproject dub
|
||||
/usr/bin/python /usr/bin/nova-manage network create 192.168.0.0/24 1 255
|
||||
|
||||
(I chose a /24 since that falls inside my /12 range I set in ‘fixed-range’ in nova.conf. Currently, there can only be one network, and I am using the max IP’s available in a /24. You can choose to use any valid amount that you would like.)
|
||||
|
||||
Note: The nova-manage service assumes that the first IP address is your network (like 192.168.0.0), that the 2nd IP is your gateway (192.168.0.1), and that the broadcast is the very last IP in the range you defined (192.168.0.255). If this is not the case you will need to manually edit the sql db 'networks' table.o.
|
||||
|
||||
On running this command, entries are made in the 'networks' and 'fixed_ips' table. However, one of the networks listed in the 'networks' table needs to be marked as bridge in order for the code to know that a bridge exists. The Network is marked as bridged automatically based on the type of network manager selected. This is ONLY necessary if you chose FlatManager as your network type. More information can be found at the end of this document discussing setting up the bridge device.
|
||||
|
||||
|
||||
Step 5 - Create Nova certifications
|
||||
-----------------------------------
|
||||
|
||||
1. Generate the certs as a zip file. These are the certs you will use to launch instances, bundle images, and all the other assorted api functions.
|
||||
|
||||
unzip creds/nova.zip
|
||||
echo ". creds/novarc" >> ~/.bashrc
|
||||
~/.bashrc
|
||||
::
|
||||
|
||||
Step 6 Restart all relevant services
|
||||
------------------------------------
|
||||
mkdir –p /root/creds
|
||||
/usr/bin/python /usr/bin/nova-manage project zipfile $NOVA_PROJECT $NOVA_PROJECT_USER /root/creds/novacreds.zip
|
||||
|
||||
2. Unzip them in your home directory, and add them to your environment.
|
||||
|
||||
Restart Libvirt::
|
||||
::
|
||||
|
||||
sudo /etc/init.d/libvirt-bin restart
|
||||
unzip /root/creds/novacreds.zip -d /root/creds/
|
||||
cat /root/creds/novarc >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
|
||||
Restart relevant nova services::
|
||||
Step 6 - Restart all relevant services
|
||||
--------------------------------------
|
||||
|
||||
sudo /etc/init.d/nova-compute restart
|
||||
sudo /etc/init.d/nova-volume restart
|
||||
Restart all six services in total, just to cover the entire spectrum::
|
||||
|
||||
libvirtd restart; service nova-network restart; service nova-compute restart; service nova-api restart; service nova-objectstore restart; service nova-scheduler restart
|
||||
|
||||
Step 7 - Closing steps, and cleaning up
|
||||
---------------------------------------
|
||||
|
||||
.. todo:: do we still need the content below?
|
||||
One of the most commonly missed configuration areas is not allowing the proper access to VMs. Use the 'euca-authorize' command to enable access. Below, you will find the commands to allow 'ping' and 'ssh' to your VMs::
|
||||
|
||||
Bare-metal Provisioning Notes
|
||||
-----------------------------
|
||||
euca-authorize -P icmp -t -1:-1 default
|
||||
euca-authorize -P tcp -p 22 default
|
||||
|
||||
To install the base operating system you can use PXE booting.
|
||||
Another common issue is you cannot ping or SSH your instances after issusing the 'euca-authorize' commands. Something to look at is the amount of 'dnsmasq' processes that are running. If you have a running instance, check to see that TWO 'dnsmasq' processes are running. If not, perform the following::
|
||||
|
||||
Types of Hosts
|
||||
--------------
|
||||
killall dnsmasq
|
||||
service nova-network restart
|
||||
|
||||
A single machine in your cluster can act as one or more of the following types
|
||||
of host:
|
||||
Step 8 – Testing the installation
|
||||
---------------------------------
|
||||
|
||||
Nova Services
|
||||
You can then use `euca2ools` to test some items::
|
||||
|
||||
* Network
|
||||
* Compute
|
||||
* Volume
|
||||
* API
|
||||
* Objectstore
|
||||
euca-describe-images
|
||||
euca-describe-instances
|
||||
|
||||
If you have issues with the API key, you may need to re-source your creds file::
|
||||
|
||||
Other supporting services
|
||||
. /root/creds/novarc
|
||||
|
||||
If you don’t get any immediate errors, you’re successfully making calls to your cloud!
|
||||
|
||||
* Message Queue
|
||||
* Database (optional)
|
||||
* Authentication database (optional)
|
||||
Step 9 - Spinning up a VM for testing
|
||||
-------------------------------------
|
||||
|
||||
Initial Setup
|
||||
-------------
|
||||
(This excerpt is from Thierry Carrez's blog, with reference to http://wiki.openstack.org/GettingImages.)
|
||||
|
||||
* Networking
|
||||
* Cloudadmin User Creation
|
||||
The image that you will use here will be a ttylinux image, so this is a limited function server. You will be able to ping and SSH to this instance, but it is in no way a full production VM.
|
||||
|
||||
Deployment Technologies
|
||||
-----------------------
|
||||
Download the image, and publish to your bucket:
|
||||
|
||||
Once you have machines with a base operating system installation, you can deploy
|
||||
code and configuration with your favorite tools to specify which machines in
|
||||
your cluster have which roles:
|
||||
::
|
||||
|
||||
image="ttylinux-uec-amd64-12.1_2.6.35-22_1.tar.gz"
|
||||
wget http://smoser.brickies.net/ubuntu/ttylinux-uec/$image
|
||||
uec-publish-tarball $image mybucket
|
||||
|
||||
This will output three references, an "emi", an "eri" and an "eki." (Image, ramdisk, and kernel) The emi is the one we use to launch instances, so take note of this.
|
||||
|
||||
Create a keypair to SSH to the server:
|
||||
|
||||
::
|
||||
|
||||
euca-add-keypair mykey > mykey.priv
|
||||
|
||||
chmod 0600 mykey.priv
|
||||
|
||||
Boot your instance:
|
||||
|
||||
::
|
||||
|
||||
euca-run-instances $emi -k mykey -t m1.tiny
|
||||
|
||||
($emi is replaced with the output from the previous command)
|
||||
|
||||
Checking status, and confirming communication:
|
||||
|
||||
Once you have booted the instance, you can check the status the the `euca-describe-instances` command. Here you can view the instance ID, IP, and current status of the VM.
|
||||
|
||||
::
|
||||
|
||||
euca-describe-instances
|
||||
|
||||
Once in a "running" state, you can use your SSH key connect:
|
||||
|
||||
::
|
||||
|
||||
ssh -i mykey.priv root@$ipaddress
|
||||
|
||||
When you are ready to terminate the instance, you may do so with the `euca-terminate-instances` command:
|
||||
|
||||
::
|
||||
|
||||
euca-terminate-instances $instance-id
|
||||
|
||||
You can determine the instance-id with `euca-describe-instances`, and the format is "i-" with a series of letter and numbers following: e.g. i-a4g9d.
|
||||
|
||||
For more information in creating you own custom (production ready) instance images, please visit http://wiki.openstack.org/GettingImages for more information!
|
||||
|
||||
Enjoy your new private cloud, and play responsibly!
|
||||
|
||||
* Puppet
|
||||
* Chef
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
@ -91,11 +91,10 @@ These do NOT have IP addresses in the host to protect host access.
|
|||
Compute nodes have iptables/ebtables entries created per project and
|
||||
instance to protect against IP/MAC address spoofing and ARP poisoning.
|
||||
|
||||
The network assignment to a project, and IP address assignment to a VM instance, are triggered when a user starts to run a VM instance. When running a VM instance, a user needs to specify a project for the instances, and the security groups (described in Security Groups) when the instance wants to join. If this is the first instance to be created for the project, then Nova (the cloud controller) needs to find a network controller to be the network host for the project; it then sets up a private network by finding an unused VLAN id, an unused subnet, and then the controller assigns them to the project, it also assigns a name to the project's Linux bridge, and allocating a private IP within the project's subnet for the new instance.
|
||||
The network assignment to a project, and IP address assignment to a VM instance, are triggered when a user starts to run a VM instance. When running a VM instance, a user needs to specify a project for the instances, and the security groups (described in Security Groups) when the instance wants to join. If this is the first instance to be created for the project, then Nova (the cloud controller) needs to find a network controller to be the network host for the project; it then sets up a private network by finding an unused VLAN id, an unused subnet, and then the controller assigns them to the project, it also assigns a name to the project's Linux bridge (br100 stored in the Nova database), and allocating a private IP within the project's subnet for the new instance.
|
||||
|
||||
If the instance the user wants to start is not the project's first, a subnet and a VLAN must have already been assigned to the project; therefore the system needs only to find an available IP address within the subnet and assign it to the new starting instance. If there is no private IP available within the subnet, an exception will be raised to the cloud controller, and the VM creation cannot proceed.
|
||||
|
||||
.. todo:: insert the name of the Linux bridge, is it always named bridge?
|
||||
|
||||
External Infrastructure
|
||||
-----------------------
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
..
|
||||
Copyright 2010 United States Government as represented by the
|
||||
Copyright 2010-2011 United States Government as represented by the
|
||||
Administrator of the National Aeronautics and Space Administration.
|
||||
All Rights Reserved.
|
||||
|
||||
|
|
|
@ -1,99 +0,0 @@
|
|||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
nova..adminclient.rst
|
||||
nova..api.cloud.rst
|
||||
nova..api.ec2.admin.rst
|
||||
nova..api.ec2.apirequest.rst
|
||||
nova..api.ec2.cloud.rst
|
||||
nova..api.ec2.images.rst
|
||||
nova..api.ec2.metadatarequesthandler.rst
|
||||
nova..api.openstack.auth.rst
|
||||
nova..api.openstack.backup_schedules.rst
|
||||
nova..api.openstack.faults.rst
|
||||
nova..api.openstack.flavors.rst
|
||||
nova..api.openstack.images.rst
|
||||
nova..api.openstack.servers.rst
|
||||
nova..api.openstack.sharedipgroups.rst
|
||||
nova..auth.dbdriver.rst
|
||||
nova..auth.fakeldap.rst
|
||||
nova..auth.ldapdriver.rst
|
||||
nova..auth.manager.rst
|
||||
nova..auth.signer.rst
|
||||
nova..cloudpipe.pipelib.rst
|
||||
nova..compute.disk.rst
|
||||
nova..compute.instance_types.rst
|
||||
nova..compute.manager.rst
|
||||
nova..compute.monitor.rst
|
||||
nova..compute.power_state.rst
|
||||
nova..context.rst
|
||||
nova..crypto.rst
|
||||
nova..db.api.rst
|
||||
nova..db.sqlalchemy.api.rst
|
||||
nova..db.sqlalchemy.models.rst
|
||||
nova..db.sqlalchemy.session.rst
|
||||
nova..exception.rst
|
||||
nova..fakerabbit.rst
|
||||
nova..flags.rst
|
||||
nova..image.service.rst
|
||||
nova..manager.rst
|
||||
nova..network.linux_net.rst
|
||||
nova..network.manager.rst
|
||||
nova..objectstore.bucket.rst
|
||||
nova..objectstore.handler.rst
|
||||
nova..objectstore.image.rst
|
||||
nova..objectstore.stored.rst
|
||||
nova..process.rst
|
||||
nova..quota.rst
|
||||
nova..rpc.rst
|
||||
nova..scheduler.chance.rst
|
||||
nova..scheduler.driver.rst
|
||||
nova..scheduler.manager.rst
|
||||
nova..scheduler.simple.rst
|
||||
nova..server.rst
|
||||
nova..service.rst
|
||||
nova..test.rst
|
||||
nova..tests.access_unittest.rst
|
||||
nova..tests.api.fakes.rst
|
||||
nova..tests.api.openstack.fakes.rst
|
||||
nova..tests.api.openstack.test_api.rst
|
||||
nova..tests.api.openstack.test_auth.rst
|
||||
nova..tests.api.openstack.test_faults.rst
|
||||
nova..tests.api.openstack.test_flavors.rst
|
||||
nova..tests.api.openstack.test_images.rst
|
||||
nova..tests.api.openstack.test_ratelimiting.rst
|
||||
nova..tests.api.openstack.test_servers.rst
|
||||
nova..tests.api.openstack.test_sharedipgroups.rst
|
||||
nova..tests.api.test_wsgi.rst
|
||||
nova..tests.api_integration.rst
|
||||
nova..tests.api_unittest.rst
|
||||
nova..tests.auth_unittest.rst
|
||||
nova..tests.cloud_unittest.rst
|
||||
nova..tests.compute_unittest.rst
|
||||
nova..tests.declare_flags.rst
|
||||
nova..tests.fake_flags.rst
|
||||
nova..tests.flags_unittest.rst
|
||||
nova..tests.network_unittest.rst
|
||||
nova..tests.objectstore_unittest.rst
|
||||
nova..tests.process_unittest.rst
|
||||
nova..tests.quota_unittest.rst
|
||||
nova..tests.real_flags.rst
|
||||
nova..tests.rpc_unittest.rst
|
||||
nova..tests.runtime_flags.rst
|
||||
nova..tests.scheduler_unittest.rst
|
||||
nova..tests.service_unittest.rst
|
||||
nova..tests.twistd_unittest.rst
|
||||
nova..tests.validator_unittest.rst
|
||||
nova..tests.virt_unittest.rst
|
||||
nova..tests.volume_unittest.rst
|
||||
nova..twistd.rst
|
||||
nova..utils.rst
|
||||
nova..validate.rst
|
||||
nova..virt.connection.rst
|
||||
nova..virt.fake.rst
|
||||
nova..virt.images.rst
|
||||
nova..virt.libvirt_conn.rst
|
||||
nova..virt.xenapi.rst
|
||||
nova..volume.driver.rst
|
||||
nova..volume.manager.rst
|
||||
nova..wsgi.rst
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..adminclient` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..adminclient
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.cloud` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.cloud
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.ec2.admin` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.ec2.admin
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.ec2.apirequest` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.ec2.apirequest
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.ec2.cloud` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.ec2.cloud
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.ec2.images` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.ec2.images
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.ec2.metadatarequesthandler` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.ec2.metadatarequesthandler
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.auth` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.auth
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.backup_schedules` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.backup_schedules
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.faults` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.faults
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.flavors` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.flavors
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.images` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.images
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.servers` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.servers
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..api.openstack.sharedipgroups` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..api.openstack.sharedipgroups
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..auth.dbdriver` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..auth.dbdriver
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..auth.fakeldap` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..auth.fakeldap
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..auth.ldapdriver` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..auth.ldapdriver
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..auth.manager` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..auth.manager
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..auth.signer` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..auth.signer
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..cloudpipe.pipelib` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..cloudpipe.pipelib
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..compute.disk` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..compute.disk
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..compute.instance_types` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..compute.instance_types
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..compute.manager` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..compute.manager
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..compute.monitor` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..compute.monitor
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..compute.power_state` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..compute.power_state
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..context` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..context
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..crypto` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..crypto
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..db.api` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..db.api
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..db.sqlalchemy.api` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..db.sqlalchemy.api
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..db.sqlalchemy.models` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..db.sqlalchemy.models
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..db.sqlalchemy.session` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..db.sqlalchemy.session
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..exception` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..exception
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..fakerabbit` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..fakerabbit
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..flags` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..flags
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..image.service` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..image.service
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..manager` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..manager
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..network.linux_net` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..network.linux_net
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..network.manager` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..network.manager
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..objectstore.bucket` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..objectstore.bucket
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..objectstore.handler` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..objectstore.handler
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..objectstore.image` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..objectstore.image
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..objectstore.stored` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..objectstore.stored
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..process` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..process
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..quota` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..quota
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..rpc` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..rpc
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..scheduler.chance` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..scheduler.chance
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..scheduler.driver` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..scheduler.driver
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..scheduler.manager` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..scheduler.manager
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..scheduler.simple` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..scheduler.simple
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..server` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..server
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..service` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..service
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..test` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..test
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.access_unittest` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.access_unittest
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.fakes` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.fakes
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.fakes` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.fakes
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_api` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_api
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_auth` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_auth
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_faults` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_faults
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_flavors` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_flavors
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_images` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_images
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_ratelimiting` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_ratelimiting
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_servers` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_servers
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.openstack.test_sharedipgroups` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.openstack.test_sharedipgroups
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api.test_wsgi` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api.test_wsgi
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api_integration` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api_integration
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.api_unittest` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.api_unittest
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.auth_unittest` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.auth_unittest
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
|
@ -1,6 +0,0 @@
|
|||
The :mod:`nova..tests.cloud_unittest` Module
|
||||
==============================================================================
|
||||
.. automodule:: nova..tests.cloud_unittest
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue