fix api bugs which are not used in UI

Change-Id: Ia4c719dda4ff47e31e22b0ce7c5744e8b5088670
This commit is contained in:
xiaodongwang 2014-10-19 20:37:00 -07:00
parent f4eaac1813
commit 97ab3abb39
12 changed files with 179 additions and 240 deletions

View File

@ -189,16 +189,19 @@ def _wrap_response(func, response_code):
return wrapped_func return wrapped_func
def _reformat_host_networks(networks):
network_mapping = {}
for network in networks:
if 'interface' in network:
network_mapping[network['interface']] = network
return network_mapping
def _reformat_host(host): def _reformat_host(host):
if isinstance(host, list): if isinstance(host, list):
return [_reformat_host(item) for item in host] return [_reformat_host(item) for item in host]
if 'networks' in host: if 'networks' in host:
networks = host['networks'] host['networks'] = _reformat_host_networks(host['networks'])
network_mapping = {}
for network in networks:
if 'interface' in network:
network_mapping[network['interface']] = network
host['networks'] = network_mapping
return host return host
@ -355,21 +358,29 @@ def take_user_action(user_id):
), ),
200 200
) )
def disable_user(disable_user=None):
return user_api.update_user(
current_user, user_id, active=False
)
disable_user_func = _wrap_response( disable_user_func = _wrap_response(
functools.partial( disable_user,
user_api.update_user, current_user, user_id, active=False
),
200 200
) )
def enable_user(enable_user=None):
return user_api.update_user(
current_user, user_id, active=True
)
enable_user_func = _wrap_response( enable_user_func = _wrap_response(
functools.partial( enable_user,
user_api.update_user, current_user, user_id, active=True
),
200 200
) )
return _group_data_action( return _group_data_action(
data, data,
add_permission=update_permissions_func, add_permissions=update_permissions_func,
remove_permissions=update_permissions_func, remove_permissions=update_permissions_func,
set_permissions=update_permissions_func, set_permissions=update_permissions_func,
enable_user=enable_user_func, enable_user=enable_user_func,
@ -399,7 +410,7 @@ def show_user_permission(user_id, permission_id):
@log_user_action @log_user_action
@login_required @login_required
def add_user_permission(user_id): def add_user_permission(user_id):
"""Delete a specific user permission.""" """Add permission to a specific user."""
data = _get_request_data() data = _get_request_data()
return utils.make_json_response( return utils.make_json_response(
200, 200,
@ -518,7 +529,6 @@ def list_user_actions(user_id):
def delete_all_user_actions(): def delete_all_user_actions():
"""Delete all user actions.""" """Delete all user actions."""
data = _get_request_data() data = _get_request_data()
_filter_timestamp(data)
return utils.make_json_response( return utils.make_json_response(
200, 200,
user_log_api.del_actions( user_log_api.del_actions(
@ -533,7 +543,6 @@ def delete_all_user_actions():
def delete_user_actions(user_id): def delete_user_actions(user_id):
"""Delete user actions.""" """Delete user actions."""
data = _get_request_data() data = _get_request_data()
_filter_timestamp(data)
return utils.make_json_response( return utils.make_json_response(
200, 200,
user_log_api.del_user_actions( user_log_api.del_user_actions(
@ -933,17 +942,20 @@ def take_machine_action(machine_id):
poweron_func = _wrap_response( poweron_func = _wrap_response(
functools.partial( functools.partial(
machine_api.poweron_machine, current_user, machine_id machine_api.poweron_machine, current_user, machine_id
) ),
202
) )
poweroff_func = _wrap_response( poweroff_func = _wrap_response(
functools.partial( functools.partial(
machine_api.poweroff_machine, current_user, machine_id machine_api.poweroff_machine, current_user, machine_id
) ),
202
) )
reset_func = _wrap_response( reset_func = _wrap_response(
functools.partial( functools.partial(
machine_api.reset_machine, current_user, machine_id machine_api.reset_machine, current_user, machine_id
) ),
202
) )
return _group_data_action( return _group_data_action(
data, data,
@ -1228,20 +1240,6 @@ def show_adapter(adapter_id):
) )
@app.route("/adapters/<int:adapter_id>/roles", methods=['GET'])
@log_user_action
@login_required
def show_adapter_roles(adapter_id):
"""Get adapter roles."""
data = _get_request_args()
return utils.make_json_response(
200,
adapter_api.get_adapter_roles(
current_user, adapter_id, **data
)
)
@app.route("/adapters/<int:adapter_id>/metadata", methods=['GET']) @app.route("/adapters/<int:adapter_id>/metadata", methods=['GET'])
@log_user_action @log_user_action
@login_required @login_required
@ -2000,7 +1998,12 @@ def list_host_networks(host_id):
"""list host networks.""" """list host networks."""
data = _get_request_args() data = _get_request_args()
return utils.make_json_response( return utils.make_json_response(
200, host_api.list_host_networks(current_user, host_id, **data) 200,
_reformat_host_networks(
host_api.list_host_networks(
current_user, host_id, **data
)
)
) )
@ -2014,7 +2017,10 @@ def list_hostnetworks():
is_promiscuous=_bool_converter is_promiscuous=_bool_converter
) )
return utils.make_json_response( return utils.make_json_response(
200, host_api.list_hostnetworks(current_user, **data) 200,
_reformat_host_networks(
host_api.list_hostnetworks(current_user, **data)
)
) )
@ -2311,6 +2317,31 @@ def proxy_put(url):
) )
@app.route("/proxy/<path:url>", methods=['PATCH'])
@log_user_action
@login_required
def proxy_patch(url):
"""proxy url."""
headers = _get_headers(
'Content-Type', 'Accept-Encoding',
'Content-Encoding', 'Accept', 'User-Agent',
'Content-MD5', 'Transfer-Encoding',
'Cookie'
)
response = requests.patch(
'%s/%s' % (setting.PROXY_URL_PREFIX, url),
data=request.data,
headers=headers
)
logging.debug(
'proxy %s response: %s',
url, response.text
)
return utils.make_json_response(
response.status_code, _get_response_json(response)
)
@app.route("/proxy/<path:url>", methods=['DELETE']) @app.route("/proxy/<path:url>", methods=['DELETE'])
@log_user_action @log_user_action
@login_required @login_required

View File

@ -128,15 +128,3 @@ def get_adapter_internal(session, adapter_id):
def get_adapter(session, getter, adapter_id, **kwargs): def get_adapter(session, getter, adapter_id, **kwargs):
"""get adapter.""" """get adapter."""
return get_adapter_internal(session, adapter_id) return get_adapter_internal(session, adapter_id)
@utils.supported_filters([])
@database.run_in_session()
@user_api.check_user_permission_in_session(
permission.PERMISSION_LIST_ADAPTERS
)
@utils.wrap_to_dict(RESP_ROLES_FIELDS)
def get_adapter_roles(session, getter, adapter_id, **kwargs):
"""get adapter roles."""
adapter = get_adapter_internal(session, adapter_id)
return adapter.get('roles', [])

View File

@ -29,14 +29,15 @@ from compass.utils import util
SUPPORTED_FIELDS = [ SUPPORTED_FIELDS = [
'name', 'os_name', 'distributed_system_name', 'owner', 'adapter_id' 'name', 'os_name', 'distributed_system_name', 'owner',
'adapter_name', 'flavor_name'
] ]
SUPPORTED_CLUSTERHOST_FIELDS = [] SUPPORTED_CLUSTERHOST_FIELDS = []
RESP_FIELDS = [ RESP_FIELDS = [
'id', 'name', 'os_name', 'os_id', 'distributed_system_id', 'id', 'name', 'os_name', 'os_id', 'distributed_system_id',
'reinstall_distributed_system', 'flavor', 'reinstall_distributed_system', 'flavor',
'distributed_system_name', 'distributed_system_installed', 'distributed_system_name', 'distributed_system_installed',
'owner', 'adapter_id', 'owner', 'adapter_id', 'adapter_name', 'flavor_name',
'created_at', 'updated_at' 'created_at', 'updated_at'
] ]
RESP_CLUSTERHOST_FIELDS = [ RESP_CLUSTERHOST_FIELDS = [
@ -691,27 +692,25 @@ def _update_clusterhost(session, updater, clusterhost, **kwargs):
cluster_roles = [] cluster_roles = []
cluster = clusterhost.cluster cluster = clusterhost.cluster
flavor = cluster.flavor flavor = cluster.flavor
if not flavor:
raise exception.InvalidParameter(
'not flavor in cluster %s' % cluster.name
)
for flavor_roles in flavor.flavor_roles:
cluster_roles.append(flavor_roles.role.name)
for role in roles:
if role not in cluster_roles:
raise exception.InvalidParameter(
'role %s is not in cluster roles %s' % (
role, cluster_roles
)
)
if 'roles' in kwargs:
roles = kwargs['roles']
flavor = clusterhost.cluster.flavor
if not roles: if not roles:
if flavor and flavor.flavor_roles: if flavor:
raise exception.InvalidParameter( raise exception.InvalidParameter(
'roles %s is empty' % roles 'roles %s is empty' % roles
) )
else:
if not flavor:
raise exception.InvalidParameter(
'not flavor in cluster %s' % cluster.name
)
for flavor_roles in flavor.flavor_roles:
cluster_roles.append(flavor_roles.role.name)
for role in roles:
if role not in cluster_roles:
raise exception.InvalidParameter(
'role %s is not in cluster roles %s' % (
role, cluster_roles
)
)
@utils.input_validates( @utils.input_validates(
roles=roles_validates, roles=roles_validates,

View File

@ -58,10 +58,6 @@ ADDED_MACHINES_FIELDS = ['mac', 'port']
OPTIONAL_ADDED_MACHINES_FIELDS = [ OPTIONAL_ADDED_MACHINES_FIELDS = [
'vlans', 'ipmi_credentials', 'tag', 'location' 'vlans', 'ipmi_credentials', 'tag', 'location'
] ]
OPTIONAL_CHECK_FILTER_FIELDS = [
'filter_type', 'ports', 'port_prefix', 'port_suffix',
'port_start', 'port_end'
]
ADDED_SWITCH_MACHINES_FIELDS = ['port', 'vlans'] ADDED_SWITCH_MACHINES_FIELDS = ['port', 'vlans']
UPDATED_MACHINES_FIELDS = [ UPDATED_MACHINES_FIELDS = [
'port', 'vlans', 'ipmi_credentials', 'port', 'vlans', 'ipmi_credentials',
@ -104,18 +100,7 @@ RESP_CLUSTER_FIELDS = [
def _check_filters(switch_filters): def _check_filters(switch_filters):
logging.debug('check filters: %s', switch_filters) logging.debug('check filters: %s', switch_filters)
switch_filters = models.Switch.parse_filters(switch_filters) models.Switch.parse_filters(switch_filters)
for switch_filter in switch_filters:
_check_filter_internal(**switch_filter)
@utils.supported_filters(
optional_support_keys=OPTIONAL_CHECK_FILTER_FIELDS
)
def _check_filter_internal(
**switch_filter
):
pass
def _check_vlans(vlans): def _check_vlans(vlans):
@ -791,7 +776,7 @@ def _update_machine_internal(session, switch_id, machine_id, **kwargs):
def _add_machines(session, switch, machines): def _add_machines(session, switch, machines):
for machine in machines.items(): for machine in machines:
_update_machine_internal( _update_machine_internal(
session, switch.id, **machine session, switch.id, **machine
) )
@ -809,7 +794,7 @@ def _set_machines(session, switch, machines):
session, models.SwitchMachine, session, models.SwitchMachine,
switch_id=switch.id switch_id=switch.id
) )
for switch_machine in machines.items(): for switch_machine in machines:
_update_machine_internal( _update_machine_internal(
session, switch.id, **switch_machine session, switch.id, **switch_machine
) )

View File

@ -367,7 +367,7 @@ def update_user(session, updater, user_id, **kwargs):
allowed_fields |= set(ADMIN_UPDATED_FIELDS) allowed_fields |= set(ADMIN_UPDATED_FIELDS)
if updater.id == user_id: if updater.id == user_id:
allowed_fields |= set(SELF_UPDATED_FIELDS) allowed_fields |= set(SELF_UPDATED_FIELDS)
unsupported_fields = allowed_fields - set(kwargs) unsupported_fields = set(kwargs) - allowed_fields
if unsupported_fields: if unsupported_fields:
# The user is not allowed to update a user. # The user is not allowed to update a user.
raise exception.Forbidden( raise exception.Forbidden(

View File

@ -35,40 +35,15 @@ def log_user_action(session, user_id, action):
) )
def _compress_response(actions, user_id):
user_actions = []
for action in actions:
action_dict = action.to_dict()
del action_dict['user_id']
user_actions.append(action_dict)
return {'user_id': user_id, 'logs': user_actions}
def _compress_response_by_user(actions):
actions_by_user = {}
for action in actions:
action_dict = action.to_dict()
user_id = action_dict['user_id']
del action_dict['user_id']
actions_by_user.setdefault(user_id, []).append(action_dict)
return [
{'user_id': user_id, 'logs': user_actions}
for user_id, user_actions in actions_by_user.items()
]
@utils.supported_filters(optional_support_keys=USER_SUPPORTED_FIELDS) @utils.supported_filters(optional_support_keys=USER_SUPPORTED_FIELDS)
@user_api.check_user_admin_or_owner() @user_api.check_user_admin_or_owner()
@database.run_in_session() @database.run_in_session()
@utils.wrap_to_dict(RESP_FIELDS) @utils.wrap_to_dict(RESP_FIELDS)
def list_user_actions(session, lister, user_id, **filters): def list_user_actions(session, lister, user_id, **filters):
"""list user actions.""" """list user actions."""
return _compress_response( return utils.list_db_objects(
utils.list_db_objects( session, models.UserLog, order_by=['timestamp'],
session, models.UserLog, user_id=user_id, **filters user_id=user_id, **filters
),
user_id
) )
@ -78,35 +53,28 @@ def list_user_actions(session, lister, user_id, **filters):
@utils.wrap_to_dict(RESP_FIELDS) @utils.wrap_to_dict(RESP_FIELDS)
def list_actions(session, lister, **filters): def list_actions(session, lister, **filters):
"""list actions.""" """list actions."""
return _compress_response_by_user( return utils.list_db_objects(
utils.list_db_objects( session, models.UserLog, order_by=['timestamp'], **filters
session, models.UserLog, **filters
)
) )
@utils.supported_filters(optional_support_keys=USER_SUPPORTED_FIELDS) @utils.supported_filters()
@user_api.check_user_admin_or_owner() @user_api.check_user_admin_or_owner()
@database.run_in_session() @database.run_in_session()
@utils.wrap_to_dict(RESP_FIELDS) @utils.wrap_to_dict(RESP_FIELDS)
def del_user_actions(session, deleter, user_id, **filters): def del_user_actions(session, deleter, user_id, **filters):
"""delete user actions.""" """delete user actions."""
return _compress_response( return utils.del_db_objects(
utils.del_db_objects( session, models.UserLog, user_id=user_id, **filters
session, models.UserLog, user_id=user_id, **filters
),
user_id
) )
@utils.supported_filters(optional_support_keys=SUPPORTED_FIELDS) @utils.supported_filters()
@user_api.check_user_admin() @user_api.check_user_admin()
@database.run_in_session() @database.run_in_session()
@utils.wrap_to_dict(RESP_FIELDS) @utils.wrap_to_dict(RESP_FIELDS)
def del_actions(session, deleter, **filters): def del_actions(session, deleter, **filters):
"""delete actions.""" """delete actions."""
return _compress_response_by_user( return utils.del_db_objects(
utils.del_db_objects( session, models.UserLog, **filters
session, models.UserLog, **filters
)
) )

View File

@ -77,12 +77,38 @@ def _between_condition(col_attr, value):
return None return None
def model_order_by(query, model, order_by):
if not order_by:
return query
order_by_cols = []
for key in order_by:
if isinstance(key, tuple):
key, is_desc = key
else:
is_desc = False
if isinstance(key, basestring):
if hasattr(model, key):
col_attr = getattr(model, key)
else:
continue
else:
col_attr = key
if is_desc:
order_by_cols.append(col_attr.desc())
else:
order_by_cols.append(col_attr)
return query.order_by(*order_by_cols)
def model_filter(query, model, **filters): def model_filter(query, model, **filters):
for key, value in filters.items(): for key, value in filters.items():
if hasattr(model, key): if isinstance(key, basestring):
col_attr = getattr(model, key) if hasattr(model, key):
col_attr = getattr(model, key)
else:
continue
else: else:
continue col_attr = key
if isinstance(value, list): if isinstance(value, list):
query = query.filter(col_attr.in_(value)) query = query.filter(col_attr.in_(value))
elif isinstance(value, dict): elif isinstance(value, dict):
@ -505,15 +531,21 @@ def add_db_object(session, table, exception_when_existing=True,
return db_object return db_object
def list_db_objects(session, table, **filters): def list_db_objects(session, table, order_by=[], **filters):
"""List db objects.""" """List db objects."""
with session.begin(subtransactions=True): with session.begin(subtransactions=True):
logging.debug( logging.debug(
'session %s list db objects by filters %s in table %s', 'session %s list db objects by filters %s in table %s',
session, filters, table.__name__ session, filters, table.__name__
) )
db_objects = model_filter( db_objects = model_order_by(
model_query(session, table), table, **filters model_filter(
model_query(session, table),
table,
**filters
),
table,
order_by
).all() ).all()
logging.debug( logging.debug(
'session %s got listed db objects: %s', 'session %s got listed db objects: %s',

View File

@ -121,7 +121,7 @@ class HelperMixin(object):
class MetadataMixin(HelperMixin): class MetadataMixin(HelperMixin):
name = Column(String(80)) name = Column(String(80), nullable=False)
display_name = Column(String(80)) display_name = Column(String(80))
path = Column(String(256)) path = Column(String(256))
description = Column(Text) description = Column(Text)
@ -309,7 +309,7 @@ class MetadataMixin(HelperMixin):
class FieldMixin(HelperMixin): class FieldMixin(HelperMixin):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
field = Column(String(80), unique=True) field = Column(String(80), unique=True, nullable=False)
field_type_data = Column( field_type_data = Column(
'field_type', 'field_type',
Enum( Enum(
@ -395,8 +395,8 @@ class FieldMixin(HelperMixin):
class InstallerMixin(HelperMixin): class InstallerMixin(HelperMixin):
name = Column(String(80)) name = Column(String(80), nullable=False)
alias = Column(String(80), unique=True) alias = Column(String(80), unique=True, nullable=False)
settings = Column(JSONEncoded, default={}) settings = Column(JSONEncoded, default={})
def validate(self): def validate(self):
@ -468,12 +468,12 @@ class HostNetwork(BASE, TimestampMixin, HelperMixin):
ForeignKey('host.id', onupdate='CASCADE', ondelete='CASCADE') ForeignKey('host.id', onupdate='CASCADE', ondelete='CASCADE')
) )
interface = Column( interface = Column(
String(80)) String(80), nullable=False)
subnet_id = Column( subnet_id = Column(
Integer, Integer,
ForeignKey('subnet.id', onupdate='CASCADE', ondelete='CASCADE') ForeignKey('subnet.id', onupdate='CASCADE', ondelete='CASCADE')
) )
ip_int = Column(BigInteger, unique=True) ip_int = Column(BigInteger, unique=True, nullable=False)
is_mgmt = Column(Boolean, default=False) is_mgmt = Column(Boolean, default=False)
is_promiscuous = Column(Boolean, default=False) is_promiscuous = Column(Boolean, default=False)
@ -543,7 +543,7 @@ class ClusterHostLogHistory(BASE, LogHistoryMixin):
ForeignKey('clusterhost.id', onupdate='CASCADE', ondelete='CASCADE'), ForeignKey('clusterhost.id', onupdate='CASCADE', ondelete='CASCADE'),
primary_key=True primary_key=True
) )
filename = Column(String(80), primary_key=True) filename = Column(String(80), primary_key=True, nullable=False)
cluster_id = Column( cluster_id = Column(
Integer, Integer,
ForeignKey('cluster.id') ForeignKey('cluster.id')
@ -573,7 +573,7 @@ class HostLogHistory(BASE, LogHistoryMixin):
Integer, Integer,
ForeignKey('host.id', onupdate='CASCADE', ondelete='CASCADE'), ForeignKey('host.id', onupdate='CASCADE', ondelete='CASCADE'),
primary_key=True) primary_key=True)
filename = Column(String(80), primary_key=True) filename = Column(String(80), primary_key=True, nullable=False)
def __init__(self, id, filename, **kwargs): def __init__(self, id, filename, **kwargs):
self.id = id self.id = id
@ -754,7 +754,7 @@ class ClusterHost(BASE, TimestampMixin, HelperMixin):
@hostname.expression @hostname.expression
def hostname(cls): def hostname(cls):
return cls.host.name return Host.hostname
@property @property
def distributed_system_installed(self): def distributed_system_installed(self):
@ -897,7 +897,7 @@ class Host(BASE, TimestampMixin, HelperMixin):
"""Host table.""" """Host table."""
__tablename__ = 'host' __tablename__ = 'host'
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=True)
os_id = Column(Integer, ForeignKey('os.id')) os_id = Column(Integer, ForeignKey('os.id'))
config_step = Column(String(80), default='') config_step = Column(String(80), default='')
os_config = Column(JSONEncoded, default={}) os_config = Column(JSONEncoded, default={})
@ -954,10 +954,7 @@ class Host(BASE, TimestampMixin, HelperMixin):
@hybrid_property @hybrid_property
def hostname(self): def hostname(self):
if self.name == str(self.id): return self.name
return None
else:
return self.name
@hostname.expression @hostname.expression
def hostname(cls): def hostname(cls):
@ -988,13 +985,9 @@ class Host(BASE, TimestampMixin, HelperMixin):
def __init__(self, id, **kwargs): def __init__(self, id, **kwargs):
self.id = id self.id = id
self.name = str(self.id)
self.state = HostState() self.state = HostState()
super(Host, self).__init__(**kwargs) super(Host, self).__init__(**kwargs)
def initialize(self):
super(Host, self).initialize()
def update(self): def update(self):
creator = self.creator creator = self.creator
if creator: if creator:
@ -1160,7 +1153,7 @@ class Cluster(BASE, TimestampMixin, HelperMixin):
__tablename__ = 'cluster' __tablename__ = 'cluster'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=False)
reinstall_distributed_system = Column(Boolean, default=True) reinstall_distributed_system = Column(Boolean, default=True)
config_step = Column(String(80), default='') config_step = Column(String(80), default='')
os_id = Column(Integer, ForeignKey('os.id')) os_id = Column(Integer, ForeignKey('os.id'))
@ -1184,7 +1177,7 @@ class Cluster(BASE, TimestampMixin, HelperMixin):
deployed_package_config = Column(JSONEncoded, default={}) deployed_package_config = Column(JSONEncoded, default={})
config_validated = Column(Boolean, default=False) config_validated = Column(Boolean, default=False)
adapter_id = Column(Integer, ForeignKey('adapter.id')) adapter_id = Column(Integer, ForeignKey('adapter.id'))
adapter_name = Column(String(80), nullable=True) adapter_name = Column(String(80))
creator_id = Column(Integer, ForeignKey('user.id')) creator_id = Column(Integer, ForeignKey('user.id'))
owner = Column(String(80)) owner = Column(String(80))
clusterhosts = relationship( clusterhosts = relationship(
@ -1240,12 +1233,6 @@ class Cluster(BASE, TimestampMixin, HelperMixin):
self.flavor_name = flavor.name self.flavor_name = flavor.name
else: else:
self.flavor_name = None self.flavor_name = None
else:
self.adapter_name = None
self.distributed_system = None
self.distributed_system_name = None
self.flavor = None
self.flavor_name = None
super(Cluster, self).update() super(Cluster, self).update()
def validate(self): def validate(self):
@ -1403,7 +1390,7 @@ class Permission(BASE, HelperMixin, TimestampMixin):
__tablename__ = 'permission' __tablename__ = 'permission'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=False)
alias = Column(String(100)) alias = Column(String(100))
description = Column(Text) description = Column(Text)
user_permissions = relationship( user_permissions = relationship(
@ -1427,7 +1414,7 @@ class UserToken(BASE, HelperMixin):
Integer, Integer,
ForeignKey('user.id', onupdate='CASCADE', ondelete='CASCADE') ForeignKey('user.id', onupdate='CASCADE', ondelete='CASCADE')
) )
token = Column(String(256), unique=True) token = Column(String(256), unique=True, nullable=False)
expire_timestamp = Column( expire_timestamp = Column(
DateTime, default=lambda: datetime.datetime.now() DateTime, default=lambda: datetime.datetime.now()
) )
@ -1473,7 +1460,7 @@ class User(BASE, HelperMixin, TimestampMixin):
__tablename__ = 'user' __tablename__ = 'user'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
email = Column(String(80), unique=True) email = Column(String(80), unique=True, nullable=False)
crypted_password = Column('password', String(225)) crypted_password = Column('password', String(225))
firstname = Column(String(80)) firstname = Column(String(80))
lastname = Column(String(80)) lastname = Column(String(80))
@ -1699,7 +1686,7 @@ class Machine(BASE, HelperMixin, TimestampMixin):
"""Machine table.""" """Machine table."""
__tablename__ = 'machine' __tablename__ = 'machine'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
mac = Column(String(24), unique=True) mac = Column(String(24), unique=True, nullable=False)
ipmi_credentials = Column(JSONEncoded, default={}) ipmi_credentials = Column(JSONEncoded, default={})
tag = Column(JSONEncoded, default={}) tag = Column(JSONEncoded, default={})
location = Column(JSONEncoded, default={}) location = Column(JSONEncoded, default={})
@ -1787,7 +1774,7 @@ class Switch(BASE, HelperMixin, TimestampMixin):
"""Switch table.""" """Switch table."""
__tablename__ = 'switch' __tablename__ = 'switch'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
ip_int = Column('ip', BigInteger, unique=True) ip_int = Column('ip', BigInteger, unique=True, nullable=False)
credentials = Column(JSONEncoded, default={}) credentials = Column(JSONEncoded, default={})
vendor = Column(String(256), nullable=True) vendor = Column(String(256), nullable=True)
state = Column(Enum('initialized', 'unreachable', 'notsupported', state = Column(Enum('initialized', 'unreachable', 'notsupported',
@ -2075,7 +2062,7 @@ class OperatingSystem(BASE, HelperMixin):
ForeignKey('os.id', onupdate='CASCADE', ondelete='CASCADE'), ForeignKey('os.id', onupdate='CASCADE', ondelete='CASCADE'),
nullable=True nullable=True
) )
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=False)
deployable = Column(Boolean, default=False) deployable = Column(Boolean, default=False)
metadatas = relationship( metadatas = relationship(
@ -2190,7 +2177,7 @@ class AdapterFlavor(BASE, HelperMixin):
Integer, Integer,
ForeignKey('adapter.id', onupdate='CASCADE', ondelete='CASCADE') ForeignKey('adapter.id', onupdate='CASCADE', ondelete='CASCADE')
) )
name = Column(String(80)) name = Column(String(80), nullable=False)
display_name = Column(String(80)) display_name = Column(String(80))
template = Column(String(80)) template = Column(String(80))
_ordered_flavor_roles = Column( _ordered_flavor_roles = Column(
@ -2269,7 +2256,7 @@ class AdapterRole(BASE, HelperMixin):
__tablename__ = "adapter_role" __tablename__ = "adapter_role"
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(80)) name = Column(String(80), nullable=False)
display_name = Column(String(80)) display_name = Column(String(80))
description = Column(Text) description = Column(Text)
optional = Column(Boolean, default=False) optional = Column(Boolean, default=False)
@ -2377,7 +2364,7 @@ class Adapter(BASE, HelperMixin):
__tablename__ = 'adapter' __tablename__ = 'adapter'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=False)
display_name = Column(String(80)) display_name = Column(String(80))
parent_id = Column( parent_id = Column(
Integer, Integer,
@ -2548,9 +2535,6 @@ class Adapter(BASE, HelperMixin):
def to_dict(self): def to_dict(self):
dict_info = super(Adapter, self).to_dict() dict_info = super(Adapter, self).to_dict()
dict_info.update({ dict_info.update({
'roles': [
role.to_dict() for role in self.adapter_roles
],
'supported_oses': [ 'supported_oses': [
adapter_os.to_dict() adapter_os.to_dict()
for adapter_os in self.adapter_supported_oses for adapter_os in self.adapter_supported_oses
@ -2585,7 +2569,7 @@ class DistributedSystem(BASE, HelperMixin):
), ),
nullable=True nullable=True
) )
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=False)
deployable = Column(Boolean, default=False) deployable = Column(Boolean, default=False)
adapters = relationship( adapters = relationship(
@ -2650,8 +2634,8 @@ class Subnet(BASE, TimestampMixin, HelperMixin):
__tablename__ = 'subnet' __tablename__ = 'subnet'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True) name = Column(String(80), unique=True, nullable=True)
subnet = Column(String(80), unique=True) subnet = Column(String(80), unique=True, nullable=False)
host_networks = relationship( host_networks = relationship(
HostNetwork, HostNetwork,
@ -2664,7 +2648,8 @@ class Subnet(BASE, TimestampMixin, HelperMixin):
self.subnet = subnet self.subnet = subnet
super(Subnet, self).__init__(**kwargs) super(Subnet, self).__init__(**kwargs)
def initialize(self): def to_dict(self):
dict_info = super(Subnet, self).to_dict()
if not self.name: if not self.name:
self.name = self.subnet dict_info['name'] = self.subnet
super(Subnet, self).initialize() return dict_info

View File

@ -720,17 +720,6 @@ class TestAdapterAPI(ApiTestCase):
return_value = self.get(url) return_value = self.get(url)
self.assertEqual(return_value.status_code, 404) self.assertEqual(return_value.status_code, 404)
def test_show_adapter_roles(self):
# get adapter role successfully
url = '/adapters/%s/roles' % self.adapter_id
return_value = self.get(url)
self.assertEqual(return_value.status_code, 200)
# give a non-existed id
url = '/adapters/99/roles'
return_value = self.get(url)
self.assertEqual(return_value.status_code, 404)
class TestHostAPI(ApiTestCase): class TestHostAPI(ApiTestCase):
"""Test host api.""" """Test host api."""
@ -784,13 +773,15 @@ class TestHostAPI(ApiTestCase):
url = '/hosts/1/networks' url = '/hosts/1/networks'
datas = [ datas = [
{ {
'ip': '179049563', 'interface': 'eth0',
'ip': '10.172.20.91',
'subnet_id': 1, 'subnet_id': 1,
'is_mgmt': False, 'is_mgmt': False,
'is_promiscuous': False 'is_promiscuous': False
}, },
{ {
'ip': '179049582', 'interface': 'eth1',
'ip': '10.172.20.110',
'subnet_id': 1, 'subnet_id': 1,
'is_mgmt': False, 'is_mgmt': False,
'is_promiscuous': False 'is_promiscuous': False
@ -883,7 +874,7 @@ class TestHostAPI(ApiTestCase):
return_value = self.get(url) return_value = self.get(url)
resp = json.loads(return_value.get_data()) resp = json.loads(return_value.get_data())
count = len(resp) count = len(resp)
self.assertEqual(count, 1) self.assertEqual(count, 2)
self.assertEqual(return_value.status_code, 200) self.assertEqual(return_value.status_code, 200)
def test_show_host_network(self): def test_show_host_network(self):

View File

@ -143,49 +143,6 @@ class TestGetAdapter(AdapterTestCase):
) )
class TestGetAdapterRoles(AdapterTestCase):
"""Test get adapter roles."""
def setUp(self):
super(TestGetAdapterRoles, self).setUp()
def tearDown(self):
super(TestGetAdapterRoles, self).tearDown()
def test_get_adapter_roles(self):
adapter_roles = adapter.get_adapter_roles(
self.user_object,
self.adapter_id
)
result = []
for adapter_role in adapter_roles:
for k, v in adapter_role.items():
if k == 'display_name':
result.append(v)
expected = [
'compute node',
'network node',
'storage node',
'image node',
'vnc proxy node',
'controller node',
'message queue node',
'database node',
'ha proxy node',
'all in one compute'
]
self.assertIsNotNone(adapter_roles)
self.assertListEqual(result, expected)
def test_adapter_non_exist(self):
self.assertRaises(
exception.RecordNotExists,
adapter.get_adapter_roles,
self.user_object,
99
)
if __name__ == '__main__': if __name__ == '__main__':
flags.init() flags.init()
logsetting.init() logsetting.init()

View File

@ -223,11 +223,14 @@ class TestUpdateUser(BaseTest):
password='dummy', password='dummy',
is_admin=False is_admin=False
) )
user_object = user_api.get_user_object('dummy@abc.com')
print 'user object: %s' % user_object
self.assertRaises( self.assertRaises(
exception.Forbidden, exception.Forbidden,
user_api.update_user, user_api.update_user,
self.user_object, user_object,
2 2,
is_admin=False
) )

View File

@ -54,7 +54,7 @@ class TestListUserActions(BaseTest):
) )
self.assertEqual( self.assertEqual(
1, 1,
user_action['user_id'] user_action[0]['user_id']
) )
def test_list_none_user_actions(self): def test_list_none_user_actions(self):
@ -66,7 +66,7 @@ class TestListUserActions(BaseTest):
self.user_object, self.user_object,
2 2
) )
self.assertEqual([], user_action['logs']) self.assertEqual([], user_action)
class TestListActions(BaseTest): class TestListActions(BaseTest):
@ -109,7 +109,7 @@ class TestDelUserActions(BaseTest):
self.user_object, self.user_object,
self.user_object.id self.user_object.id
) )
self.assertEqual([], del_user_action['logs']) self.assertEqual([], del_user_action)
class TestDelActions(BaseTest): class TestDelActions(BaseTest):