summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Andrews <jesse@ubuntu>2010-08-14 21:24:26 -0700
committerJesse Andrews <jesse@ubuntu>2010-08-14 21:24:26 -0700
commit5cc8d5839cdb20d588c808c2eac52889365e4454 (patch)
treecd80c01bd9927df499bf3665cb2711f860871f3e
parent8b344451f06f96e846cb4fe87131fd23b5c386cc (diff)
downloadnova-5cc8d5839cdb20d588c808c2eac52889365e4454.tar.gz
nova-5cc8d5839cdb20d588c808c2eac52889365e4454.tar.xz
nova-5cc8d5839cdb20d588c808c2eac52889365e4454.zip
more work on trying to get compute tests passing
-rw-r--r--nova/auth/manager.py10
-rw-r--r--nova/compute/service.py16
-rw-r--r--nova/models.py148
-rw-r--r--nova/network/service.py9
-rw-r--r--nova/tests/compute_unittest.py37
5 files changed, 83 insertions, 137 deletions
diff --git a/nova/auth/manager.py b/nova/auth/manager.py
index 064fd78bc..f7f454898 100644
--- a/nova/auth/manager.py
+++ b/nova/auth/manager.py
@@ -31,6 +31,7 @@ import zipfile
from nova import crypto
from nova import exception
from nova import flags
+from nova import models
from nova import utils
from nova.auth import signer
from nova.network import vpn
@@ -201,6 +202,11 @@ class Project(AuthBase):
ip, port = AuthManager().get_project_vpn_data(self)
return port
+ @property
+ def network(self):
+ session = models.create_session()
+ return session.query(models.Network).filter_by(project_id=self.id).first()
+
def has_manager(self, user):
return AuthManager().is_project_manager(user, self)
@@ -521,7 +527,9 @@ class AuthManager(object):
description,
member_users)
if project_dict:
- return Project(**project_dict)
+ project = Project(**project_dict)
+ # FIXME(ja): create network?
+ return project
def add_to_project(self, user, project):
"""Add user to project"""
diff --git a/nova/compute/service.py b/nova/compute/service.py
index 820116453..ff27a9b88 100644
--- a/nova/compute/service.py
+++ b/nova/compute/service.py
@@ -38,7 +38,7 @@ from nova import process
from nova import service
from nova import utils
from nova.compute import disk
-from nova.compute import model
+from nova import models
from nova.compute import power_state
from nova.compute.instance_types import INSTANCE_TYPES
from nova.network import service as network_service
@@ -61,7 +61,6 @@ class ComputeService(service.Service):
super(ComputeService, self).__init__()
self._instances = {}
self._conn = virt_connection.get_connection()
- self.instdir = model.InstanceDirectory()
# TODO(joshua): This needs to ensure system state, specifically: modprobe aoe
def noop(self):
@@ -116,19 +115,14 @@ class ComputeService(service.Service):
def run_instance(self, instance_id, **_kwargs):
""" launch a new instance with specified options """
logging.debug("Starting instance %s..." % (instance_id))
- inst = self.instdir.get(instance_id)
- # TODO: Get the real security group of launch in here
- security_group = "default"
+ session = models.create_session()
+ inst = session.query(models.Instance).filter_by(id=instance_id).first()
# NOTE(vish): passing network type allows us to express the
# network without making a call to network to find
# out which type of network to setup
- network_service.setup_compute_network(
- inst.get('network_type', 'vlan'),
- inst['user_id'],
- inst['project_id'],
- security_group)
+ network_service.setup_compute_network(inst)
- inst['node_name'] = FLAGS.node_name
+ inst.node_name = FLAGS.node_name
inst.save()
# TODO(vish) check to make sure the availability zone matches
new_inst = Instance(self._conn, name=instance_id, data=inst)
diff --git a/nova/models.py b/nova/models.py
index 4c739488a..067616029 100644
--- a/nova/models.py
+++ b/nova/models.py
@@ -1,107 +1,23 @@
from sqlalchemy.orm import relationship, backref, validates
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, DateTime, Boolean, Text
from sqlalchemy.ext.declarative import declarative_base
-from auth import *
+from nova import auth
Base = declarative_base()
-class User(Base):
- # sqlalchemy
- __tablename__ = 'users'
- sid = Column(String, primary_key=True)
-
- # backwards compatibility
- @classmethod
- def safe_id(cls, obj):
- """Safe get object id
-
- This method will return the id of the object if the object
- is of this class, otherwise it will return the original object.
- This allows methods to accept objects or ids as paramaters.
-
- """
- if isinstance(obj, cls):
- return obj.id
- else:
- return obj
-
-# def __init__(self, id, name, access, secret, admin):
-# self.id = id
-# self.name = name
-# self.access = access
-# self.secret = secret
-# self.admin = admin
-
- def __getattr__(self, name):
- if name == 'id':
- return self.uid
- else: raise AttributeError, name
-
- def is_superuser(self):
- return AuthManager().is_superuser(self)
-
- def is_admin(self):
- return AuthManager().is_admin(self)
-
- def has_role(self, role):
- return AuthManager().has_role(self, role)
-
- def add_role(self, role):
- return AuthManager().add_role(self, role)
-
- def remove_role(self, role):
- return AuthManager().remove_role(self, role)
-
- def is_project_member(self, project):
- return AuthManager().is_project_member(self, project)
-
- def is_project_manager(self, project):
- return AuthManager().is_project_manager(self, project)
-
- def generate_key_pair(self, name):
- return AuthManager().generate_key_pair(self.id, name)
-
- def create_key_pair(self, name, public_key, fingerprint):
- return AuthManager().create_key_pair(self.id,
- name,
- public_key,
- fingerprint)
-
- def get_key_pair(self, name):
- return AuthManager().get_key_pair(self.id, name)
-
- def delete_key_pair(self, name):
- return AuthManager().delete_key_pair(self.id, name)
-
- def get_key_pairs(self):
- return AuthManager().get_key_pairs(self.id)
-
- def __repr__(self):
- return "User('%s', '%s', '%s', '%s', %s)" % (self.id,
- self.name,
- self.access,
- self.secret,
- self.admin)
-
-
-
-class Project(Base):
- __tablename__ = 'projects'
- sid = Column(String, primary_key=True)
-
class Image(Base):
__tablename__ = 'images'
- user_sid = Column(String, ForeignKey('users.sid'), nullable=False)
- project_sid = Column(String, ForeignKey('projects.sid'), nullable=False)
+ user_id = Column(String)#, ForeignKey('users.id'), nullable=False)
+ project_id = Column(String)#, ForeignKey('projects.id'), nullable=False)
- sid = Column(String, primary_key=True)
+ id = Column(String, primary_key=True)
image_type = Column(String)
public = Column(Boolean, default=False)
state = Column(String)
location = Column(String)
arch = Column(String)
- default_kernel_sid = Column(String)
- default_ramdisk_sid = Column(String)
+ default_kernel_id = Column(String)
+ default_ramdisk_id = Column(String)
created_at = Column(DateTime)
updated_at = Column(DateTime) # auto update on change FIXME
@@ -115,13 +31,13 @@ class Image(Base):
def validate_state(self, key, state):
assert(state in ['available', 'pending', 'disabled'])
- @validates('default_kernel_sid')
- def validate_kernel_sid(self, key, val):
+ @validates('default_kernel_id')
+ def validate_kernel_id(self, key, val):
if val != 'machine':
assert(val is None)
- @validates('default_ramdisk_sid')
- def validate_ramdisk_sid(self, key, val):
+ @validates('default_ramdisk_id')
+ def validate_ramdisk_id(self, key, val):
if val != 'machine':
assert(val is None)
@@ -131,7 +47,7 @@ class Network(Base):
bridge = Column(String)
vlan = Column(String)
#vpn_port = Column(Integer)
- project_sid = Column(String, ForeignKey('projects.sid'), nullable=False)
+ project_id = Column(String) #, ForeignKey('projects.id'), nullable=False)
class PhysicalNode(Base):
__tablename__ = 'physical_nodes'
@@ -141,16 +57,25 @@ class Instance(Base):
__tablename__ = 'instances'
id = Column(Integer, primary_key=True)
- user_sid = Column(String, ForeignKey('users.sid'), nullable=False)
- project_sid = Column(String, ForeignKey('projects.sid'))
+ user_id = Column(String) #, ForeignKey('users.id'), nullable=False)
+ project_id = Column(String) #, ForeignKey('projects.id'))
+
+ @property
+ def user(self):
+ return auth.manager.AuthManager().get_user(self.user_id)
+
+ @property
+ def project(self):
+ return auth.manager.AuthManager().get_project(self.project_id)
- image_sid = Column(Integer, ForeignKey('images.sid'), nullable=False)
- kernel_sid = Column(String, ForeignKey('images.sid'), nullable=True)
- ramdisk_sid = Column(String, ForeignKey('images.sid'), nullable=True)
+ image_id = Column(Integer, ForeignKey('images.id'), nullable=False)
+ kernel_id = Column(String, ForeignKey('images.id'), nullable=True)
+ ramdisk_id = Column(String, ForeignKey('images.id'), nullable=True)
launch_index = Column(Integer)
key_name = Column(String)
key_data = Column(Text)
+ security_group = Column(String)
state = Column(String)
@@ -161,7 +86,6 @@ class Instance(Base):
user_data = Column(Text)
-# user = relationship(User, backref=backref('instances', order_by=id))
# ramdisk = relationship(Ramdisk, backref=backref('instances', order_by=id))
# kernel = relationship(Kernel, backref=backref('instances', order_by=id))
# project = relationship(Project, backref=backref('instances', order_by=id))
@@ -182,17 +106,29 @@ class Volume(Base):
blade_id = Column(Integer)
-if __name__ == '__main__':
+engine = None
+def create_engine():
+ global engine
+ if engine is not None:
+ return engine
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)
- Base.metadata.create_all(engine)
+ Base.metadata.create_all(engine)
+ return engine
+def create_session(engine=None):
+ if engine is None:
+ engine = create_engine()
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
- session = Session()
+ return Session()
+
+if __name__ == '__main__':
+ engine = create_engine()
+ session = create_session(engine)
- instance = Instance(image_sid='as', ramdisk_sid='AS', user_sid='anthony')
- user = User(sid='anthony')
+ instance = Instance(image_id='as', ramdisk_id='AS', user_id='anthony')
+ user = User(id='anthony')
session.add(instance)
session.commit()
diff --git a/nova/network/service.py b/nova/network/service.py
index 9c0f5520b..4be855960 100644
--- a/nova/network/service.py
+++ b/nova/network/service.py
@@ -61,13 +61,10 @@ def type_to_class(network_type):
raise NotFound("Couldn't find %s network type" % network_type)
-def setup_compute_network(network_type, user_id, project_id, security_group):
+def setup_compute_network(instance):
"""Sets up the network on a compute host"""
- srv = type_to_class(network_type)
- srv.setup_compute_network(network_type,
- user_id,
- project_id,
- security_group)
+ srv = type_to_class(instance.project.network.kind)
+ srv.setup_compute_network(inst)
def get_host_for_project(project_id):
diff --git a/nova/tests/compute_unittest.py b/nova/tests/compute_unittest.py
index da0f82e3a..c079f9a4d 100644
--- a/nova/tests/compute_unittest.py
+++ b/nova/tests/compute_unittest.py
@@ -25,7 +25,8 @@ from nova import exception
from nova import flags
from nova import test
from nova import utils
-from nova.compute import model
+from nova import models
+from nova.auth import manager
from nova.compute import service
@@ -60,21 +61,31 @@ class ComputeConnectionTestCase(test.TrialTestCase):
self.flags(connection_type='fake',
fake_storage=True)
self.compute = service.ComputeService()
+ self.manager = manager.AuthManager()
+ user = self.manager.create_user('fake', 'fake', 'fake')
+ project = self.manager.create_project('fake', 'fake', 'fake')
+
+ def tearDown(self):
+ self.manager.delete_user('fake')
+ self.manager.delete_project('fake')
def create_instance(self):
- instdir = model.InstanceDirectory()
- inst = instdir.new()
+ session = models.create_session()
+
+ inst = models.Instance(user_id='fake', project_id='fake', image_id='ami-test')
+ session.add(inst)
+ session.commit()
# TODO(ja): add ami, ari, aki, user_data
- inst['reservation_id'] = 'r-fakeres'
- inst['launch_time'] = '10'
- inst['user_id'] = 'fake'
- inst['project_id'] = 'fake'
- inst['instance_type'] = 'm1.tiny'
- inst['node_name'] = FLAGS.node_name
- inst['mac_address'] = utils.generate_mac()
- inst['ami_launch_index'] = 0
- inst.save()
- return inst['instance_id']
+ # inst['reservation_id'] = 'r-fakeres'
+ # inst['launch_time'] = '10'
+ #inst['user_id'] = 'fake'
+ #inst['project_id'] = 'fake'
+ #inst['instance_type'] = 'm1.tiny'
+ #inst['node_name'] = FLAGS.node_name
+ #inst['mac_address'] = utils.generate_mac()
+ #inst['ami_launch_index'] = 0
+ #inst.save()
+ return inst.id
@defer.inlineCallbacks
def test_run_describe_terminate(self):