merged trunk and resolved conflict
This commit is contained in:
		@@ -61,6 +61,7 @@ import math
 | 
			
		||||
import netaddr
 | 
			
		||||
from optparse import OptionParser
 | 
			
		||||
import os
 | 
			
		||||
import StringIO
 | 
			
		||||
import sys
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
@@ -274,6 +275,58 @@ class ShellCommands(object):
 | 
			
		||||
        arguments: path"""
 | 
			
		||||
        exec(compile(open(path).read(), path, 'exec'), locals(), globals())
 | 
			
		||||
 | 
			
		||||
    @args('--filename', dest='filename', metavar='<path>', default=False,
 | 
			
		||||
          help='Export file path')
 | 
			
		||||
    def export(self, filename):
 | 
			
		||||
        """Export Nova users into a file that can be consumed by Keystone"""
 | 
			
		||||
 | 
			
		||||
        def create_file(filename):
 | 
			
		||||
            data = generate_data()
 | 
			
		||||
            with open(filename, 'w') as f:
 | 
			
		||||
                f.write(data.getvalue())
 | 
			
		||||
 | 
			
		||||
        def tenants(data, am):
 | 
			
		||||
            for project in am.get_projects():
 | 
			
		||||
                print >> data, ("tenant add '%s'" %
 | 
			
		||||
                               (project.name))
 | 
			
		||||
                for u in project.member_ids:
 | 
			
		||||
                    user = am.get_user(u)
 | 
			
		||||
                    print >> data, ("user add '%s' '%s' '%s'" %
 | 
			
		||||
                                   (user.name, user.access, project.name))
 | 
			
		||||
                    print >> data, ("credentials add 'EC2' '%s:%s' '%s' '%s'" %
 | 
			
		||||
                            (user.access, project.id, user.secret, project.id))
 | 
			
		||||
 | 
			
		||||
        def roles(data, am):
 | 
			
		||||
            for role in am.get_roles():
 | 
			
		||||
                print >> data, ("role add '%s'" % (role))
 | 
			
		||||
 | 
			
		||||
        def grant_roles(data, am):
 | 
			
		||||
            roles = am.get_roles()
 | 
			
		||||
            for project in am.get_projects():
 | 
			
		||||
                for u in project.member_ids:
 | 
			
		||||
                    user = am.get_user(u)
 | 
			
		||||
                    for role in db.user_get_roles_for_project(ctxt, u,
 | 
			
		||||
                                                              project.id):
 | 
			
		||||
                        print >> data, ("role grant '%s', '%s', '%s')," %
 | 
			
		||||
                                       (user.name, role, project.name))
 | 
			
		||||
            print >> data
 | 
			
		||||
 | 
			
		||||
        def generate_data():
 | 
			
		||||
            data = StringIO.StringIO()
 | 
			
		||||
            am = manager.AuthManager()
 | 
			
		||||
            tenants(data, am)
 | 
			
		||||
            roles(data, am)
 | 
			
		||||
            grant_roles(data, am)
 | 
			
		||||
            data.seek(0)
 | 
			
		||||
            return data
 | 
			
		||||
 | 
			
		||||
        ctxt = context.get_admin_context()
 | 
			
		||||
        if filename:
 | 
			
		||||
            create_file(filename)
 | 
			
		||||
        else:
 | 
			
		||||
            data = generate_data()
 | 
			
		||||
            print data.getvalue()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RoleCommands(object):
 | 
			
		||||
    """Class for managing roles."""
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,8 @@
 | 
			
		||||
 | 
			
		||||
"""Unit tests for the DB API"""
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
 | 
			
		||||
from nova import test
 | 
			
		||||
from nova import context
 | 
			
		||||
from nova import db
 | 
			
		||||
@@ -98,3 +100,26 @@ class DbApiTestCase(test.TestCase):
 | 
			
		||||
            self.assertTrue(result[0].deleted)
 | 
			
		||||
        else:
 | 
			
		||||
            self.assertTrue(result[1].deleted)
 | 
			
		||||
 | 
			
		||||
    def test_migration_get_all_unconfirmed(self):
 | 
			
		||||
        ctxt = context.get_admin_context()
 | 
			
		||||
 | 
			
		||||
        # Ensure no migrations are returned.
 | 
			
		||||
        results = db.migration_get_all_unconfirmed(ctxt, 10)
 | 
			
		||||
        self.assertEqual(0, len(results))
 | 
			
		||||
 | 
			
		||||
        # Ensure one migration older than 10 seconds is returned.
 | 
			
		||||
        updated_at = datetime.datetime(2000, 01, 01, 12, 00, 00)
 | 
			
		||||
        values = {"status": "FINISHED", "updated_at": updated_at}
 | 
			
		||||
        migration = db.migration_create(ctxt, values)
 | 
			
		||||
        results = db.migration_get_all_unconfirmed(ctxt, 10)
 | 
			
		||||
        self.assertEqual(1, len(results))
 | 
			
		||||
        db.migration_update(ctxt, migration.id, {"status": "CONFIRMED"})
 | 
			
		||||
 | 
			
		||||
        # Ensure the new migration is not returned.
 | 
			
		||||
        updated_at = datetime.datetime.utcnow()
 | 
			
		||||
        values = {"status": "FINISHED", "updated_at": updated_at}
 | 
			
		||||
        migration = db.migration_create(ctxt, values)
 | 
			
		||||
        results = db.migration_get_all_unconfirmed(ctxt, 10)
 | 
			
		||||
        self.assertEqual(0, len(results))
 | 
			
		||||
        db.migration_update(ctxt, migration.id, {"status": "CONFIRMED"})
 | 
			
		||||
 
 | 
			
		||||
@@ -176,6 +176,10 @@ class _VirtDriverTestCase(test.TestCase):
 | 
			
		||||
    def test_poll_rescued_instances(self):
 | 
			
		||||
        self.connection.poll_rescued_instances(10)
 | 
			
		||||
 | 
			
		||||
    @catch_notimplementederror
 | 
			
		||||
    def test_poll_unconfirmed_resizes(self):
 | 
			
		||||
        self.connection.poll_unconfirmed_resizes(10)
 | 
			
		||||
 | 
			
		||||
    @catch_notimplementederror
 | 
			
		||||
    def test_migrate_disk_and_power_off(self):
 | 
			
		||||
        instance_ref = test_utils.get_test_instance()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user