summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorDan Wendlandt <dan@nicira.com>2011-08-12 17:33:30 -0700
committerDan Wendlandt <dan@nicira.com>2011-08-12 17:33:30 -0700
commit86d2109b8f3b27e460aa41c11924166cb07d7bb4 (patch)
tree99b79011748fc0b67df507db103779237caa40a9 /bin
parent18f09f165b5dca5f11253b143045b2ff7327532d (diff)
parentfe0bde67193ce76376e72a7263b89240a63722a8 (diff)
merge in trunk, resolving conflicts with ttx's branch to switch from using sudo to run_as_root=True
Diffstat (limited to 'bin')
-rwxr-xr-xbin/nova-ajax-console-proxy10
-rwxr-xr-xbin/nova-import-canonical-imagestore110
-rwxr-xr-xbin/nova-manage48
3 files changed, 48 insertions, 120 deletions
diff --git a/bin/nova-ajax-console-proxy b/bin/nova-ajax-console-proxy
index 21cf68007..2329581a2 100755
--- a/bin/nova-ajax-console-proxy
+++ b/bin/nova-ajax-console-proxy
@@ -114,11 +114,11 @@ class AjaxConsoleProxy(object):
AjaxConsoleProxy.tokens[kwargs['token']] = \
{'args': kwargs, 'last_activity': time.time()}
- conn = rpc.Connection.instance(new=True)
- consumer = rpc.TopicAdapterConsumer(
- connection=conn,
- proxy=TopicProxy,
- topic=FLAGS.ajax_console_proxy_topic)
+ conn = rpc.create_connection(new=True)
+ consumer = rpc.create_consumer(
+ conn,
+ FLAGS.ajax_console_proxy_topic,
+ TopicProxy)
def delete_expired_tokens():
now = time.time()
diff --git a/bin/nova-import-canonical-imagestore b/bin/nova-import-canonical-imagestore
deleted file mode 100755
index 404ae37f4..000000000
--- a/bin/nova-import-canonical-imagestore
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/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.
-
-"""
- Download images from Canonical Image Store
-"""
-
-import gettext
-import json
-import os
-import tempfile
-import shutil
-import subprocess
-import sys
-import urllib2
-
-# 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 utils
-from nova.objectstore import image
-
-FLAGS = flags.FLAGS
-
-API_URL = 'https://imagestore.canonical.com/api/dashboard'
-
-
-def get_images():
- """Get a list of the images from the imagestore URL."""
- images = json.load(urllib2.urlopen(API_URL))['images']
- images = [img for img in images if img['title'].find('amd64') > -1]
- return images
-
-
-def download(img):
- """Download an image to the local filesystem."""
- # FIXME(ja): add checksum/signature checks
- tempdir = tempfile.mkdtemp(prefix='cis-')
-
- kernel_id = None
- ramdisk_id = None
-
- for f in img['files']:
- if f['kind'] == 'kernel':
- dest = os.path.join(tempdir, 'kernel')
- subprocess.call(['curl', '--fail', f['url'], '-o', dest])
- kernel_id = image.Image.add(dest,
- description='kernel/' + img['title'], kernel=True)
-
- for f in img['files']:
- if f['kind'] == 'ramdisk':
- dest = os.path.join(tempdir, 'ramdisk')
- subprocess.call(['curl', '--fail', f['url'], '-o', dest])
- ramdisk_id = image.Image.add(dest,
- description='ramdisk/' + img['title'], ramdisk=True)
-
- for f in img['files']:
- if f['kind'] == 'image':
- dest = os.path.join(tempdir, 'image')
- subprocess.call(['curl', '--fail', f['url'], '-o', dest])
- ramdisk_id = image.Image.add(dest,
- description=img['title'], kernel=kernel_id, ramdisk=ramdisk_id)
-
- shutil.rmtree(tempdir)
-
-
-def main():
- """Main entry point."""
- utils.default_flagfile()
- argv = FLAGS(sys.argv)
- logging.setup()
- images = get_images()
-
- if len(argv) == 2:
- for img in images:
- if argv[1] == 'all' or argv[1] == img['title']:
- download(img)
- else:
- print 'usage: %s (title|all)'
- print 'available images:'
- for img in images:
- print img['title']
-
-if __name__ == '__main__':
- main()
diff --git a/bin/nova-manage b/bin/nova-manage
index 807753a2e..077a89d6f 100755
--- a/bin/nova-manage
+++ b/bin/nova-manage
@@ -56,6 +56,7 @@
import gettext
import glob
import json
+import math
import netaddr
import os
import sys
@@ -591,6 +592,31 @@ class FixedIpCommands(object):
fixed_ip['address'],
mac_address, hostname, host)
+ @args('--address', dest="address", metavar='<ip address>',
+ help='IP address')
+ def reserve(self, address):
+ """Mark fixed ip as reserved
+ arguments: address"""
+ self._set_reserved(address, True)
+
+ @args('--address', dest="address", metavar='<ip address>',
+ help='IP address')
+ def unreserve(self, address):
+ """Mark fixed ip as free to use
+ arguments: address"""
+ self._set_reserved(address, False)
+
+ def _set_reserved(self, address, reserved):
+ ctxt = context.get_admin_context()
+
+ try:
+ fixed_ip = db.fixed_ip_get_by_address(ctxt, address)
+ db.fixed_ip_update(ctxt, fixed_ip['address'],
+ {'reserved': reserved})
+ except exception.NotFound as ex:
+ print "error: %s" % ex
+ sys.exit(2)
+
class FloatingIpCommands(object):
"""Class for managing floating ip."""
@@ -694,7 +720,16 @@ class NetworkCommands(object):
if not num_networks:
num_networks = FLAGS.num_networks
if not network_size:
- network_size = FLAGS.network_size
+ fixnet = netaddr.IPNetwork(fixed_range_v4)
+ each_subnet_size = fixnet.size / int(num_networks)
+ if each_subnet_size > FLAGS.network_size:
+ network_size = FLAGS.network_size
+ subnet = 32 - int(math.log(network_size, 2))
+ oversize_msg = _('Subnet(s) too large, defaulting to /%s.'
+ ' To override, specify network_size flag.') % subnet
+ print oversize_msg
+ else:
+ network_size = fixnet.size
if not multi_host:
multi_host = FLAGS.multi_host
else:
@@ -1084,10 +1119,12 @@ class InstanceTypeCommands(object):
@args('--name', dest='name', metavar='<name>',
help='Name of instance type/flavor')
- def delete(self, name, purge=None):
+ @args('--purge', action="store_true", dest='purge', default=False,
+ help='purge record from database')
+ def delete(self, name, purge):
"""Marks instance types / flavors as deleted"""
try:
- if purge == "--purge":
+ if purge:
instance_types.purge(name)
verb = "purged"
else:
@@ -1224,11 +1261,12 @@ class ImageCommands(object):
is_public, architecture)
def _lookup(self, old_image_id):
+ elevated = context.get_admin_context()
try:
internal_id = ec2utils.ec2_id_to_id(old_image_id)
- image = self.image_service.show(context, internal_id)
+ image = self.image_service.show(elevated, internal_id)
except (exception.InvalidEc2Id, exception.ImageNotFound):
- image = self.image_service.show_by_name(context, old_image_id)
+ image = self.image_service.show_by_name(elevated, old_image_id)
return image['id']
def _old_to_new(self, old):