summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Pepple <ken.pepple@gmail.com>2011-02-03 17:57:46 -0800
committerKen Pepple <ken.pepple@gmail.com>2011-02-03 17:57:46 -0800
commit9be0770208b0e75c7d93ba10165b82d5be11be27 (patch)
tree4ddf682a513bdb8152a426760c33f930f1fc46df
parent563a77fd4aa80da9bddac5cf7f8f27ed2dedb39d (diff)
flagged all INSTANCE_TYPES usage with FIXME comment. Added basic usage to nova-manage (needs formatting). created api methods.
-rwxr-xr-xbin/nova-manage39
-rw-r--r--nova/api/ec2/admin.py1
-rw-r--r--nova/api/openstack/flavors.py2
-rw-r--r--nova/compute/api.py2
-rw-r--r--nova/compute/instance_types.py17
-rw-r--r--nova/db/api.py20
-rw-r--r--nova/db/sqlalchemy/api.py31
-rw-r--r--nova/db/sqlalchemy/models.py1
-rw-r--r--nova/tests/api/openstack/test_flavors.py30
-rw-r--r--nova/tests/db/fakes.py1
-rw-r--r--nova/tests/test_quota.py3
-rw-r--r--nova/tests/test_xenapi.py1
-rw-r--r--nova/virt/libvirt_conn.py2
-rw-r--r--nova/virt/xenapi/vm_utils.py1
14 files changed, 102 insertions, 49 deletions
diff --git a/bin/nova-manage b/bin/nova-manage
index 952bf4fd1..0406a2dd9 100755
--- a/bin/nova-manage
+++ b/bin/nova-manage
@@ -611,40 +611,29 @@ class VolumeCommands(object):
class InstanceTypesCommands(object):
"""Class for managing instance types / flavors."""
+ def usage(self):
+ print "$ nova-manage instance_type NAME MEMORY_MB VCPUS LOCAL_GB"
- def create(self, name, memory, vcpus, localstorage):
+ def create(self, name, memory, vcpus, local_gb):
"""Creates instance types / flavors
- arguments: name memory vcpus localstorage"""
- #for address in IPy.IP(range):
- # db.floating_ip_create(context.get_admin_context(),
- # {'address': str(address),
- # 'host': host})
+ arguments: name memory_mb vcpus local_gb"""
+ db.instance_type_create(context.get_admin_context(), name, memory, vcpus, local_gb)
def delete(self, name):
- """Deletes instance types / flavors
+ """Marks instance types / flavors as deleted
arguments: name"""
- #for address in IPy.IP(ip_range):
- # db.floating_ip_destroy(context.get_admin_context(),
- # str(address))
+ ctxt = context.get_admin_context()
+ # check to see if it exists
+ db.instance_type_delete(context,name)
def list(self):
"""Lists all instance types / flavors
arguments: <none>"""
- #ctxt = context.get_admin_context()
- #if host == None:
- # floating_ips = db.floating_ip_get_all(ctxt)
- #else:
- # floating_ips = db.floating_ip_get_all_by_host(ctxt, host)
- #for floating_ip in floating_ips:
- # instance = None
- # if floating_ip['fixed_ip']:
- # instance = floating_ip['fixed_ip']['instance']['ec2_id']
- # print "%s\t%s\t%s" % (floating_ip['host'],
- # floating_ip['address'],
- # instance)
- # print "%-10s %-10s %-8s %s %s" % (svc['host'], svc['binary'],
- # active, art,
- # svc['updated_at'])
+ instance_types = db.instance_type_get_all(context.get_admin_context())
+ for instance in instance_types:
+ print "%s : %s memory (MB), %s vcpus, %s storage(GB)" % (instance.name,
+ instance.memory_mb, instance.vcpus,
+ instance.local_gb)
CATEGORIES = [
diff --git a/nova/api/ec2/admin.py b/nova/api/ec2/admin.py
index d7e899d12..55cca1041 100644
--- a/nova/api/ec2/admin.py
+++ b/nova/api/ec2/admin.py
@@ -79,6 +79,7 @@ class AdminController(object):
def __str__(self):
return 'AdminController'
+ # FIX-ME(kpepple) for dynamic flavors
def describe_instance_types(self, _context, **_kwargs):
return {'instanceTypeSet': [instance_dict(n, v) for n, v in
instance_types.INSTANCE_TYPES.iteritems()]}
diff --git a/nova/api/openstack/flavors.py b/nova/api/openstack/flavors.py
index f620d4107..1f5185134 100644
--- a/nova/api/openstack/flavors.py
+++ b/nova/api/openstack/flavors.py
@@ -45,6 +45,7 @@ class Controller(wsgi.Controller):
def show(self, req, id):
"""Return data about the given flavor id."""
+ # FIX-ME(kpepple) for dynamic flavors
for name, val in instance_types.INSTANCE_TYPES.iteritems():
if val['flavorid'] == int(id):
item = dict(ram=val['memory_mb'], disk=val['local_gb'],
@@ -54,4 +55,5 @@ class Controller(wsgi.Controller):
def _all_ids(self):
"""Return the list of all flavorids."""
+ # FIX-ME(kpepple) for dynamic flavors
return [i['flavorid'] for i in instance_types.INSTANCE_TYPES.values()]
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 1d8b9d79f..3ae722226 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -89,6 +89,8 @@ class API(base.Base):
"""Create the number of instances requested if quota and
other arguments check out ok."""
+ # FIXME(kpepple) this needs to be changed from using the old constant
+ #type_data = db.instance_type_get_by_name(context.get_admin_context(), instance_type)
type_data = instance_types.INSTANCE_TYPES[instance_type]
num_instances = quota.allowed_instances(context, max_count, type_data)
if num_instances < min_count:
diff --git a/nova/compute/instance_types.py b/nova/compute/instance_types.py
index 1b3d0d0eb..0594aa063 100644
--- a/nova/compute/instance_types.py
+++ b/nova/compute/instance_types.py
@@ -25,6 +25,7 @@ from nova import flags
from nova import exception
FLAGS = flags.FLAGS
+# FIX-ME(kpepple) for dynamic flavors
INSTANCE_TYPES = {
'm1.tiny': dict(memory_mb=512, vcpus=1, local_gb=0, flavorid=1),
'm1.small': dict(memory_mb=2048, vcpus=1, local_gb=20, flavorid=2),
@@ -35,8 +36,9 @@ INSTANCE_TYPES = {
def get_by_type(instance_type):
"""Build instance data structure and save it to the data store."""
+ # FIX-ME(kpepple) for dynamic flavors
if instance_type is None:
- return FLAGS.default_instance_type
+ return FLAGS.default_instance_type
if instance_type not in INSTANCE_TYPES:
raise exception.ApiError(_("Unknown instance type: %s"),
instance_type)
@@ -44,19 +46,8 @@ def get_by_type(instance_type):
def get_by_flavor_id(flavor_id):
+ # FIX-ME(kpepple) for dynamic flavors
for instance_type, details in INSTANCE_TYPES.iteritems():
if details['flavorid'] == flavor_id:
return instance_type
return FLAGS.default_instance_type
-
-
-def list_flavors():
- return instance_type
-
-
-def create_flavor():
- return instance_type
-
-
-def delete_flavor():
- return instance_type
diff --git a/nova/db/api.py b/nova/db/api.py
index c6c03fb0e..ffb1d08ce 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -985,3 +985,23 @@ def console_get_all_by_instance(context, instance_id):
def console_get(context, console_id, instance_id=None):
"""Get a specific console (possibly on a given instance)."""
return IMPL.console_get(context, console_id, instance_id)
+
+
+ ##################
+
+
+def instance_type_create(context, values):
+ """Create a new instance type"""
+ return IMPL.instance_type_create(context, values)
+
+def instance_type_get_all(context):
+ """Get all instance types"""
+ return IMPL.instance_type_get_all(context)
+
+def instance_type_get_by_name(context, name):
+ """Get instance type by name"""
+ return IMPL.instance_type_get_by_name(context, name)
+
+def instance_type_destroy(context, name):
+ """Delete a instance type"""
+ return IMPL.instance_type_destroy(context,name)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index fa060228f..aa6434b65 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -2018,3 +2018,34 @@ def console_get(context, console_id, instance_id=None):
raise exception.NotFound(_("No console with id %(console_id)s"
" %(idesc)s") % locals())
return result
+
+
+ ##################
+
+
+@require_admin_context
+def instance_type_create(context, values):
+ instance_type_ref = models.InstanceTypes()
+ instance_type_ref.update(values)
+ instance_type_ref.save()
+ return instance_type_ref
+
+def instance_type_get_all(context):
+ session = get_session()
+ return session.query(models.InstanceTypes).\
+ filter_by(deleted=0)
+
+def instance_type_get_by_name(context, name):
+ session = get_session()
+ return session.query(models.InstanceTypes).\
+ filter_by(name=name).\
+ first()
+
+@require_admin_context
+def instance_type_destroy(context,name):
+ session = get_session()
+ instance_type_ref = session.query(models.InstanceTypes).\
+ filter_by(name=name)
+ rows = instance_type_ref.update(dict(deleted=1))
+ return instance_type_ref
+
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index 762425670..44583861b 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -214,6 +214,7 @@ class InstanceTypes(BASE, NovaBase):
"""Represent possible instance_types or flavor of VM offered"""
__tablename__ = "instance_types"
id = Column(Integer, primary_key=True)
+ name = Column(String(255), unique=True)
memory_mb = Column(Integer)
vcpus = Column(Integer)
local_gb = Column(Integer)
diff --git a/nova/tests/api/openstack/test_flavors.py b/nova/tests/api/openstack/test_flavors.py
index 05624c5a9..0f0ed2e84 100644
--- a/nova/tests/api/openstack/test_flavors.py
+++ b/nova/tests/api/openstack/test_flavors.py
@@ -21,6 +21,8 @@ import stubout
import webob
import nova.api
+from nova import context
+from nova import db
from nova.api.openstack import flavors
from nova.tests.api.openstack import fakes
@@ -33,6 +35,7 @@ class FlavorsTest(unittest.TestCase):
fakes.stub_out_networking(self.stubs)
fakes.stub_out_rate_limiting(self.stubs)
fakes.stub_out_auth(self.stubs)
+ self.context = context.get_admin_context()
def tearDown(self):
self.stubs.UnsetAll()
@@ -41,17 +44,22 @@ class FlavorsTest(unittest.TestCase):
req = webob.Request.blank('/v1.0/flavors')
res = req.get_response(fakes.wsgi_app())
- def test_get_flavor_by_id(self):
- pass
-
- def test_create_favor(self):
- pass
-
- def test_delete_flavor(self):
- pass
-
- def test_list_flavors(self):
- pass
+ def test_create_list_delete_favor(self):
+ # create a new flavor
+ starting_flavors = db.instance_type_get_all(self.context)
+ new_instance_type = dict(name="os1.big",memory_mb=512, vcpus=1, local_gb=120, flavorid=25)
+ new_flavor = db.instance_type_create(self.context, new_instance_type)
+ self.assertEqual(new_flavor["name"], new_instance_type["name"])
+ # retrieve the newly created flavor
+ retrieved_new_flavor = db.instance_type_get_by_name(self.context, new_instance_type["name"])
+ # self.assertEqual(len(tuple(retrieved_new_flavor)),1)
+ self.assertEqual(retrieved_new_flavor["memory_mb"], new_instance_type["memory_mb"])
+ flavors = db.instance_type_get_all(self.context)
+ self.assertNotEqual(starting_flavors, flavors)
+ # delete the newly created flavor
+ delete_query = db.instance_type_destroy(self.context,new_instance_type["name"])
+ retrieve_deleted_flavor = db.instance_type_get_by_name(self.context, new_instance_type["name"])
+ self.assertEqual(retrieve_deleted_flavor["deleted"], 1)
if __name__ == '__main__':
diff --git a/nova/tests/db/fakes.py b/nova/tests/db/fakes.py
index 05bdd172e..6cf917d76 100644
--- a/nova/tests/db/fakes.py
+++ b/nova/tests/db/fakes.py
@@ -44,6 +44,7 @@ def stub_out_db_instance_api(stubs):
def fake_instance_create(values):
""" Stubs out the db.instance_create method """
+ # FIX-ME(kpepple) for dynamic flavors
type_data = instance_types.INSTANCE_TYPES[values['instance_type']]
base_options = {
diff --git a/nova/tests/test_quota.py b/nova/tests/test_quota.py
index 9548a8c13..f2c9c456f 100644
--- a/nova/tests/test_quota.py
+++ b/nova/tests/test_quota.py
@@ -75,15 +75,18 @@ class QuotaTestCase(test.TestCase):
def test_quota_overrides(self):
"""Make sure overriding a projects quotas works"""
+ # FIX-ME(kpepple) for dynamic flavors
num_instances = quota.allowed_instances(self.context, 100,
instance_types.INSTANCE_TYPES['m1.small'])
self.assertEqual(num_instances, 2)
db.quota_create(self.context, {'project_id': self.project.id,
'instances': 10})
+ # FIX-ME(kpepple) for dynamic flavors
num_instances = quota.allowed_instances(self.context, 100,
instance_types.INSTANCE_TYPES['m1.small'])
self.assertEqual(num_instances, 4)
db.quota_update(self.context, self.project.id, {'cores': 100})
+ # FIX-ME(kpepple) for dynamic flavors
num_instances = quota.allowed_instances(self.context, 100,
instance_types.INSTANCE_TYPES['m1.small'])
self.assertEqual(num_instances, 10)
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py
index 9f5b266f3..e38bd4dab 100644
--- a/nova/tests/test_xenapi.py
+++ b/nova/tests/test_xenapi.py
@@ -225,6 +225,7 @@ class XenAPIVMTestCase(test.TestCase):
vm = vms[0]
# Check that m1.large above turned into the right thing.
+ # FIX-ME(kpepple) for dynamic flavors
instance_type = instance_types.INSTANCE_TYPES['m1.large']
mem_kib = long(instance_type['memory_mb']) << 10
mem_bytes = str(mem_kib << 10)
diff --git a/nova/virt/libvirt_conn.py b/nova/virt/libvirt_conn.py
index bd5c9c4ee..9ed6d4a71 100644
--- a/nova/virt/libvirt_conn.py
+++ b/nova/virt/libvirt_conn.py
@@ -611,6 +611,7 @@ class LibvirtConnection(object):
user=user,
project=project,
size=size)
+ # FIX-ME(kpepple) for dynamic flavors
type_data = instance_types.INSTANCE_TYPES[inst['instance_type']]
if type_data['local_gb']:
@@ -671,6 +672,7 @@ class LibvirtConnection(object):
network = db.network_get_by_instance(context.get_admin_context(),
instance['id'])
# FIXME(vish): stick this in db
+ # FIX-ME(kpepple) for dynamic flavors
instance_type = instance['instance_type']
instance_type = instance_types.INSTANCE_TYPES[instance_type]
ip_address = db.instance_get_fixed_address(context.get_admin_context(),
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index 4afd28dd8..4d09b2afa 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -82,6 +82,7 @@ class VMHelper(HelperBase):
the pv_kernel flag indicates whether the guest is HVM or PV
"""
+ # FIX-ME(kpepple) for dynamic flavors
instance_type = instance_types.INSTANCE_TYPES[instance.instance_type]
mem = str(long(instance_type['memory_mb']) * 1024 * 1024)
vcpus = str(instance_type['vcpus'])