fix api bugs which are not used in UI
Change-Id: Ia4c719dda4ff47e31e22b0ce7c5744e8b5088670
This commit is contained in:
parent
f4eaac1813
commit
97ab3abb39
@ -189,16 +189,19 @@ def _wrap_response(func, response_code):
|
||||
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):
|
||||
if isinstance(host, list):
|
||||
return [_reformat_host(item) for item in host]
|
||||
if 'networks' in host:
|
||||
networks = host['networks']
|
||||
network_mapping = {}
|
||||
for network in networks:
|
||||
if 'interface' in network:
|
||||
network_mapping[network['interface']] = network
|
||||
host['networks'] = network_mapping
|
||||
host['networks'] = _reformat_host_networks(host['networks'])
|
||||
return host
|
||||
|
||||
|
||||
@ -355,21 +358,29 @@ def take_user_action(user_id):
|
||||
),
|
||||
200
|
||||
)
|
||||
|
||||
def disable_user(disable_user=None):
|
||||
return user_api.update_user(
|
||||
current_user, user_id, active=False
|
||||
)
|
||||
|
||||
disable_user_func = _wrap_response(
|
||||
functools.partial(
|
||||
user_api.update_user, current_user, user_id, active=False
|
||||
),
|
||||
disable_user,
|
||||
200
|
||||
)
|
||||
|
||||
def enable_user(enable_user=None):
|
||||
return user_api.update_user(
|
||||
current_user, user_id, active=True
|
||||
)
|
||||
|
||||
enable_user_func = _wrap_response(
|
||||
functools.partial(
|
||||
user_api.update_user, current_user, user_id, active=True
|
||||
),
|
||||
enable_user,
|
||||
200
|
||||
)
|
||||
return _group_data_action(
|
||||
data,
|
||||
add_permission=update_permissions_func,
|
||||
add_permissions=update_permissions_func,
|
||||
remove_permissions=update_permissions_func,
|
||||
set_permissions=update_permissions_func,
|
||||
enable_user=enable_user_func,
|
||||
@ -399,7 +410,7 @@ def show_user_permission(user_id, permission_id):
|
||||
@log_user_action
|
||||
@login_required
|
||||
def add_user_permission(user_id):
|
||||
"""Delete a specific user permission."""
|
||||
"""Add permission to a specific user."""
|
||||
data = _get_request_data()
|
||||
return utils.make_json_response(
|
||||
200,
|
||||
@ -518,7 +529,6 @@ def list_user_actions(user_id):
|
||||
def delete_all_user_actions():
|
||||
"""Delete all user actions."""
|
||||
data = _get_request_data()
|
||||
_filter_timestamp(data)
|
||||
return utils.make_json_response(
|
||||
200,
|
||||
user_log_api.del_actions(
|
||||
@ -533,7 +543,6 @@ def delete_all_user_actions():
|
||||
def delete_user_actions(user_id):
|
||||
"""Delete user actions."""
|
||||
data = _get_request_data()
|
||||
_filter_timestamp(data)
|
||||
return utils.make_json_response(
|
||||
200,
|
||||
user_log_api.del_user_actions(
|
||||
@ -933,17 +942,20 @@ def take_machine_action(machine_id):
|
||||
poweron_func = _wrap_response(
|
||||
functools.partial(
|
||||
machine_api.poweron_machine, current_user, machine_id
|
||||
)
|
||||
),
|
||||
202
|
||||
)
|
||||
poweroff_func = _wrap_response(
|
||||
functools.partial(
|
||||
machine_api.poweroff_machine, current_user, machine_id
|
||||
)
|
||||
),
|
||||
202
|
||||
)
|
||||
reset_func = _wrap_response(
|
||||
functools.partial(
|
||||
machine_api.reset_machine, current_user, machine_id
|
||||
)
|
||||
),
|
||||
202
|
||||
)
|
||||
return _group_data_action(
|
||||
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'])
|
||||
@log_user_action
|
||||
@login_required
|
||||
@ -2000,7 +1998,12 @@ def list_host_networks(host_id):
|
||||
"""list host networks."""
|
||||
data = _get_request_args()
|
||||
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
|
||||
)
|
||||
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'])
|
||||
@log_user_action
|
||||
@login_required
|
||||
|
@ -128,15 +128,3 @@ def get_adapter_internal(session, adapter_id):
|
||||
def get_adapter(session, getter, adapter_id, **kwargs):
|
||||
"""get adapter."""
|
||||
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', [])
|
||||
|
@ -29,14 +29,15 @@ from compass.utils import util
|
||||
|
||||
|
||||
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 = []
|
||||
RESP_FIELDS = [
|
||||
'id', 'name', 'os_name', 'os_id', 'distributed_system_id',
|
||||
'reinstall_distributed_system', 'flavor',
|
||||
'distributed_system_name', 'distributed_system_installed',
|
||||
'owner', 'adapter_id',
|
||||
'owner', 'adapter_id', 'adapter_name', 'flavor_name',
|
||||
'created_at', 'updated_at'
|
||||
]
|
||||
RESP_CLUSTERHOST_FIELDS = [
|
||||
@ -691,27 +692,25 @@ def _update_clusterhost(session, updater, clusterhost, **kwargs):
|
||||
cluster_roles = []
|
||||
cluster = clusterhost.cluster
|
||||
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 flavor and flavor.flavor_roles:
|
||||
if flavor:
|
||||
raise exception.InvalidParameter(
|
||||
'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(
|
||||
roles=roles_validates,
|
||||
|
@ -58,10 +58,6 @@ ADDED_MACHINES_FIELDS = ['mac', 'port']
|
||||
OPTIONAL_ADDED_MACHINES_FIELDS = [
|
||||
'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']
|
||||
UPDATED_MACHINES_FIELDS = [
|
||||
'port', 'vlans', 'ipmi_credentials',
|
||||
@ -104,18 +100,7 @@ RESP_CLUSTER_FIELDS = [
|
||||
|
||||
def _check_filters(switch_filters):
|
||||
logging.debug('check filters: %s', switch_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
|
||||
models.Switch.parse_filters(switch_filters)
|
||||
|
||||
|
||||
def _check_vlans(vlans):
|
||||
@ -791,7 +776,7 @@ def _update_machine_internal(session, switch_id, machine_id, **kwargs):
|
||||
|
||||
|
||||
def _add_machines(session, switch, machines):
|
||||
for machine in machines.items():
|
||||
for machine in machines:
|
||||
_update_machine_internal(
|
||||
session, switch.id, **machine
|
||||
)
|
||||
@ -809,7 +794,7 @@ def _set_machines(session, switch, machines):
|
||||
session, models.SwitchMachine,
|
||||
switch_id=switch.id
|
||||
)
|
||||
for switch_machine in machines.items():
|
||||
for switch_machine in machines:
|
||||
_update_machine_internal(
|
||||
session, switch.id, **switch_machine
|
||||
)
|
||||
|
@ -367,7 +367,7 @@ def update_user(session, updater, user_id, **kwargs):
|
||||
allowed_fields |= set(ADMIN_UPDATED_FIELDS)
|
||||
if updater.id == user_id:
|
||||
allowed_fields |= set(SELF_UPDATED_FIELDS)
|
||||
unsupported_fields = allowed_fields - set(kwargs)
|
||||
unsupported_fields = set(kwargs) - allowed_fields
|
||||
if unsupported_fields:
|
||||
# The user is not allowed to update a user.
|
||||
raise exception.Forbidden(
|
||||
|
@ -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)
|
||||
@user_api.check_user_admin_or_owner()
|
||||
@database.run_in_session()
|
||||
@utils.wrap_to_dict(RESP_FIELDS)
|
||||
def list_user_actions(session, lister, user_id, **filters):
|
||||
"""list user actions."""
|
||||
return _compress_response(
|
||||
utils.list_db_objects(
|
||||
session, models.UserLog, user_id=user_id, **filters
|
||||
),
|
||||
user_id
|
||||
return utils.list_db_objects(
|
||||
session, models.UserLog, order_by=['timestamp'],
|
||||
user_id=user_id, **filters
|
||||
)
|
||||
|
||||
|
||||
@ -78,35 +53,28 @@ def list_user_actions(session, lister, user_id, **filters):
|
||||
@utils.wrap_to_dict(RESP_FIELDS)
|
||||
def list_actions(session, lister, **filters):
|
||||
"""list actions."""
|
||||
return _compress_response_by_user(
|
||||
utils.list_db_objects(
|
||||
session, models.UserLog, **filters
|
||||
)
|
||||
return utils.list_db_objects(
|
||||
session, models.UserLog, order_by=['timestamp'], **filters
|
||||
)
|
||||
|
||||
|
||||
@utils.supported_filters(optional_support_keys=USER_SUPPORTED_FIELDS)
|
||||
@utils.supported_filters()
|
||||
@user_api.check_user_admin_or_owner()
|
||||
@database.run_in_session()
|
||||
@utils.wrap_to_dict(RESP_FIELDS)
|
||||
def del_user_actions(session, deleter, user_id, **filters):
|
||||
"""delete user actions."""
|
||||
return _compress_response(
|
||||
utils.del_db_objects(
|
||||
session, models.UserLog, user_id=user_id, **filters
|
||||
),
|
||||
user_id
|
||||
return utils.del_db_objects(
|
||||
session, models.UserLog, user_id=user_id, **filters
|
||||
)
|
||||
|
||||
|
||||
@utils.supported_filters(optional_support_keys=SUPPORTED_FIELDS)
|
||||
@utils.supported_filters()
|
||||
@user_api.check_user_admin()
|
||||
@database.run_in_session()
|
||||
@utils.wrap_to_dict(RESP_FIELDS)
|
||||
def del_actions(session, deleter, **filters):
|
||||
"""delete actions."""
|
||||
return _compress_response_by_user(
|
||||
utils.del_db_objects(
|
||||
session, models.UserLog, **filters
|
||||
)
|
||||
return utils.del_db_objects(
|
||||
session, models.UserLog, **filters
|
||||
)
|
||||
|
@ -77,12 +77,38 @@ def _between_condition(col_attr, value):
|
||||
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):
|
||||
for key, value in filters.items():
|
||||
if hasattr(model, key):
|
||||
col_attr = getattr(model, key)
|
||||
if isinstance(key, basestring):
|
||||
if hasattr(model, key):
|
||||
col_attr = getattr(model, key)
|
||||
else:
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
col_attr = key
|
||||
if isinstance(value, list):
|
||||
query = query.filter(col_attr.in_(value))
|
||||
elif isinstance(value, dict):
|
||||
@ -505,15 +531,21 @@ def add_db_object(session, table, exception_when_existing=True,
|
||||
return db_object
|
||||
|
||||
|
||||
def list_db_objects(session, table, **filters):
|
||||
def list_db_objects(session, table, order_by=[], **filters):
|
||||
"""List db objects."""
|
||||
with session.begin(subtransactions=True):
|
||||
logging.debug(
|
||||
'session %s list db objects by filters %s in table %s',
|
||||
session, filters, table.__name__
|
||||
)
|
||||
db_objects = model_filter(
|
||||
model_query(session, table), table, **filters
|
||||
db_objects = model_order_by(
|
||||
model_filter(
|
||||
model_query(session, table),
|
||||
table,
|
||||
**filters
|
||||
),
|
||||
table,
|
||||
order_by
|
||||
).all()
|
||||
logging.debug(
|
||||
'session %s got listed db objects: %s',
|
||||
|
@ -121,7 +121,7 @@ class HelperMixin(object):
|
||||
|
||||
|
||||
class MetadataMixin(HelperMixin):
|
||||
name = Column(String(80))
|
||||
name = Column(String(80), nullable=False)
|
||||
display_name = Column(String(80))
|
||||
path = Column(String(256))
|
||||
description = Column(Text)
|
||||
@ -309,7 +309,7 @@ class MetadataMixin(HelperMixin):
|
||||
|
||||
class FieldMixin(HelperMixin):
|
||||
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',
|
||||
Enum(
|
||||
@ -395,8 +395,8 @@ class FieldMixin(HelperMixin):
|
||||
|
||||
|
||||
class InstallerMixin(HelperMixin):
|
||||
name = Column(String(80))
|
||||
alias = Column(String(80), unique=True)
|
||||
name = Column(String(80), nullable=False)
|
||||
alias = Column(String(80), unique=True, nullable=False)
|
||||
settings = Column(JSONEncoded, default={})
|
||||
|
||||
def validate(self):
|
||||
@ -468,12 +468,12 @@ class HostNetwork(BASE, TimestampMixin, HelperMixin):
|
||||
ForeignKey('host.id', onupdate='CASCADE', ondelete='CASCADE')
|
||||
)
|
||||
interface = Column(
|
||||
String(80))
|
||||
String(80), nullable=False)
|
||||
subnet_id = Column(
|
||||
Integer,
|
||||
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_promiscuous = Column(Boolean, default=False)
|
||||
|
||||
@ -543,7 +543,7 @@ class ClusterHostLogHistory(BASE, LogHistoryMixin):
|
||||
ForeignKey('clusterhost.id', onupdate='CASCADE', ondelete='CASCADE'),
|
||||
primary_key=True
|
||||
)
|
||||
filename = Column(String(80), primary_key=True)
|
||||
filename = Column(String(80), primary_key=True, nullable=False)
|
||||
cluster_id = Column(
|
||||
Integer,
|
||||
ForeignKey('cluster.id')
|
||||
@ -573,7 +573,7 @@ class HostLogHistory(BASE, LogHistoryMixin):
|
||||
Integer,
|
||||
ForeignKey('host.id', onupdate='CASCADE', ondelete='CASCADE'),
|
||||
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):
|
||||
self.id = id
|
||||
@ -754,7 +754,7 @@ class ClusterHost(BASE, TimestampMixin, HelperMixin):
|
||||
|
||||
@hostname.expression
|
||||
def hostname(cls):
|
||||
return cls.host.name
|
||||
return Host.hostname
|
||||
|
||||
@property
|
||||
def distributed_system_installed(self):
|
||||
@ -897,7 +897,7 @@ class Host(BASE, TimestampMixin, HelperMixin):
|
||||
"""Host table."""
|
||||
__tablename__ = 'host'
|
||||
|
||||
name = Column(String(80), unique=True)
|
||||
name = Column(String(80), unique=True, nullable=True)
|
||||
os_id = Column(Integer, ForeignKey('os.id'))
|
||||
config_step = Column(String(80), default='')
|
||||
os_config = Column(JSONEncoded, default={})
|
||||
@ -954,10 +954,7 @@ class Host(BASE, TimestampMixin, HelperMixin):
|
||||
|
||||
@hybrid_property
|
||||
def hostname(self):
|
||||
if self.name == str(self.id):
|
||||
return None
|
||||
else:
|
||||
return self.name
|
||||
return self.name
|
||||
|
||||
@hostname.expression
|
||||
def hostname(cls):
|
||||
@ -988,13 +985,9 @@ class Host(BASE, TimestampMixin, HelperMixin):
|
||||
|
||||
def __init__(self, id, **kwargs):
|
||||
self.id = id
|
||||
self.name = str(self.id)
|
||||
self.state = HostState()
|
||||
super(Host, self).__init__(**kwargs)
|
||||
|
||||
def initialize(self):
|
||||
super(Host, self).initialize()
|
||||
|
||||
def update(self):
|
||||
creator = self.creator
|
||||
if creator:
|
||||
@ -1160,7 +1153,7 @@ class Cluster(BASE, TimestampMixin, HelperMixin):
|
||||
__tablename__ = 'cluster'
|
||||
|
||||
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)
|
||||
config_step = Column(String(80), default='')
|
||||
os_id = Column(Integer, ForeignKey('os.id'))
|
||||
@ -1184,7 +1177,7 @@ class Cluster(BASE, TimestampMixin, HelperMixin):
|
||||
deployed_package_config = Column(JSONEncoded, default={})
|
||||
config_validated = Column(Boolean, default=False)
|
||||
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'))
|
||||
owner = Column(String(80))
|
||||
clusterhosts = relationship(
|
||||
@ -1240,12 +1233,6 @@ class Cluster(BASE, TimestampMixin, HelperMixin):
|
||||
self.flavor_name = flavor.name
|
||||
else:
|
||||
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()
|
||||
|
||||
def validate(self):
|
||||
@ -1403,7 +1390,7 @@ class Permission(BASE, HelperMixin, TimestampMixin):
|
||||
__tablename__ = 'permission'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(80), unique=True)
|
||||
name = Column(String(80), unique=True, nullable=False)
|
||||
alias = Column(String(100))
|
||||
description = Column(Text)
|
||||
user_permissions = relationship(
|
||||
@ -1427,7 +1414,7 @@ class UserToken(BASE, HelperMixin):
|
||||
Integer,
|
||||
ForeignKey('user.id', onupdate='CASCADE', ondelete='CASCADE')
|
||||
)
|
||||
token = Column(String(256), unique=True)
|
||||
token = Column(String(256), unique=True, nullable=False)
|
||||
expire_timestamp = Column(
|
||||
DateTime, default=lambda: datetime.datetime.now()
|
||||
)
|
||||
@ -1473,7 +1460,7 @@ class User(BASE, HelperMixin, TimestampMixin):
|
||||
__tablename__ = 'user'
|
||||
|
||||
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))
|
||||
firstname = Column(String(80))
|
||||
lastname = Column(String(80))
|
||||
@ -1699,7 +1686,7 @@ class Machine(BASE, HelperMixin, TimestampMixin):
|
||||
"""Machine table."""
|
||||
__tablename__ = 'machine'
|
||||
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={})
|
||||
tag = Column(JSONEncoded, default={})
|
||||
location = Column(JSONEncoded, default={})
|
||||
@ -1787,7 +1774,7 @@ class Switch(BASE, HelperMixin, TimestampMixin):
|
||||
"""Switch table."""
|
||||
__tablename__ = 'switch'
|
||||
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={})
|
||||
vendor = Column(String(256), nullable=True)
|
||||
state = Column(Enum('initialized', 'unreachable', 'notsupported',
|
||||
@ -2075,7 +2062,7 @@ class OperatingSystem(BASE, HelperMixin):
|
||||
ForeignKey('os.id', onupdate='CASCADE', ondelete='CASCADE'),
|
||||
nullable=True
|
||||
)
|
||||
name = Column(String(80), unique=True)
|
||||
name = Column(String(80), unique=True, nullable=False)
|
||||
deployable = Column(Boolean, default=False)
|
||||
|
||||
metadatas = relationship(
|
||||
@ -2190,7 +2177,7 @@ class AdapterFlavor(BASE, HelperMixin):
|
||||
Integer,
|
||||
ForeignKey('adapter.id', onupdate='CASCADE', ondelete='CASCADE')
|
||||
)
|
||||
name = Column(String(80))
|
||||
name = Column(String(80), nullable=False)
|
||||
display_name = Column(String(80))
|
||||
template = Column(String(80))
|
||||
_ordered_flavor_roles = Column(
|
||||
@ -2269,7 +2256,7 @@ class AdapterRole(BASE, HelperMixin):
|
||||
|
||||
__tablename__ = "adapter_role"
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(80))
|
||||
name = Column(String(80), nullable=False)
|
||||
display_name = Column(String(80))
|
||||
description = Column(Text)
|
||||
optional = Column(Boolean, default=False)
|
||||
@ -2377,7 +2364,7 @@ class Adapter(BASE, HelperMixin):
|
||||
__tablename__ = 'adapter'
|
||||
|
||||
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))
|
||||
parent_id = Column(
|
||||
Integer,
|
||||
@ -2548,9 +2535,6 @@ class Adapter(BASE, HelperMixin):
|
||||
def to_dict(self):
|
||||
dict_info = super(Adapter, self).to_dict()
|
||||
dict_info.update({
|
||||
'roles': [
|
||||
role.to_dict() for role in self.adapter_roles
|
||||
],
|
||||
'supported_oses': [
|
||||
adapter_os.to_dict()
|
||||
for adapter_os in self.adapter_supported_oses
|
||||
@ -2585,7 +2569,7 @@ class DistributedSystem(BASE, HelperMixin):
|
||||
),
|
||||
nullable=True
|
||||
)
|
||||
name = Column(String(80), unique=True)
|
||||
name = Column(String(80), unique=True, nullable=False)
|
||||
deployable = Column(Boolean, default=False)
|
||||
|
||||
adapters = relationship(
|
||||
@ -2650,8 +2634,8 @@ class Subnet(BASE, TimestampMixin, HelperMixin):
|
||||
__tablename__ = 'subnet'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(80), unique=True)
|
||||
subnet = Column(String(80), unique=True)
|
||||
name = Column(String(80), unique=True, nullable=True)
|
||||
subnet = Column(String(80), unique=True, nullable=False)
|
||||
|
||||
host_networks = relationship(
|
||||
HostNetwork,
|
||||
@ -2664,7 +2648,8 @@ class Subnet(BASE, TimestampMixin, HelperMixin):
|
||||
self.subnet = subnet
|
||||
super(Subnet, self).__init__(**kwargs)
|
||||
|
||||
def initialize(self):
|
||||
def to_dict(self):
|
||||
dict_info = super(Subnet, self).to_dict()
|
||||
if not self.name:
|
||||
self.name = self.subnet
|
||||
super(Subnet, self).initialize()
|
||||
dict_info['name'] = self.subnet
|
||||
return dict_info
|
||||
|
@ -720,17 +720,6 @@ class TestAdapterAPI(ApiTestCase):
|
||||
return_value = self.get(url)
|
||||
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):
|
||||
"""Test host api."""
|
||||
@ -784,13 +773,15 @@ class TestHostAPI(ApiTestCase):
|
||||
url = '/hosts/1/networks'
|
||||
datas = [
|
||||
{
|
||||
'ip': '179049563',
|
||||
'interface': 'eth0',
|
||||
'ip': '10.172.20.91',
|
||||
'subnet_id': 1,
|
||||
'is_mgmt': False,
|
||||
'is_promiscuous': False
|
||||
},
|
||||
{
|
||||
'ip': '179049582',
|
||||
'interface': 'eth1',
|
||||
'ip': '10.172.20.110',
|
||||
'subnet_id': 1,
|
||||
'is_mgmt': False,
|
||||
'is_promiscuous': False
|
||||
@ -883,7 +874,7 @@ class TestHostAPI(ApiTestCase):
|
||||
return_value = self.get(url)
|
||||
resp = json.loads(return_value.get_data())
|
||||
count = len(resp)
|
||||
self.assertEqual(count, 1)
|
||||
self.assertEqual(count, 2)
|
||||
self.assertEqual(return_value.status_code, 200)
|
||||
|
||||
def test_show_host_network(self):
|
||||
|
@ -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__':
|
||||
flags.init()
|
||||
logsetting.init()
|
||||
|
@ -223,11 +223,14 @@ class TestUpdateUser(BaseTest):
|
||||
password='dummy',
|
||||
is_admin=False
|
||||
)
|
||||
user_object = user_api.get_user_object('dummy@abc.com')
|
||||
print 'user object: %s' % user_object
|
||||
self.assertRaises(
|
||||
exception.Forbidden,
|
||||
user_api.update_user,
|
||||
self.user_object,
|
||||
2
|
||||
user_object,
|
||||
2,
|
||||
is_admin=False
|
||||
)
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@ class TestListUserActions(BaseTest):
|
||||
)
|
||||
self.assertEqual(
|
||||
1,
|
||||
user_action['user_id']
|
||||
user_action[0]['user_id']
|
||||
)
|
||||
|
||||
def test_list_none_user_actions(self):
|
||||
@ -66,7 +66,7 @@ class TestListUserActions(BaseTest):
|
||||
self.user_object,
|
||||
2
|
||||
)
|
||||
self.assertEqual([], user_action['logs'])
|
||||
self.assertEqual([], user_action)
|
||||
|
||||
|
||||
class TestListActions(BaseTest):
|
||||
@ -109,7 +109,7 @@ class TestDelUserActions(BaseTest):
|
||||
self.user_object,
|
||||
self.user_object.id
|
||||
)
|
||||
self.assertEqual([], del_user_action['logs'])
|
||||
self.assertEqual([], del_user_action)
|
||||
|
||||
|
||||
class TestDelActions(BaseTest):
|
||||
|
Loading…
x
Reference in New Issue
Block a user