Fix flake8 errors and disable ignore case
below issures are removed from ignore cases: E114 indentation is not a multiple of four (comment) E116 unexpected indentation (comment) E121 continuation line under-indented for hanging indent E122 continuation line missing indentation or outdented E123 closing bracket does not match indentation of opening bracket's line E124 closing bracket does not match visual indentation E125 continuation line with same indent as next logical line E126 continuation line over-indented for hanging indent E127 continuation line over-indented for visual indent E128 continuation line under-indented for visual indent E129 visually indented line with same indent as next logical line E131 continuation line unaligned for hanging indent E201 whitespace after '(' E228 missing whitespace around modulo operator E231 missing whitespace after ',' E241 multiple spaces after ':' E251 unexpected spaces around keyword / parameter equals E265 block comment should start with '#' E271 multiple spaces after keyword E302 expected 2 blank lines, found 1 E303 too many blank lines E305 expected 2 blank lines after class or function definition, found 1 E704 multiple statements on one line (def) E713 test for membership should be 'not in' E714 test for object identity should be 'is not' E722 do not use bare except' E731 do not assign a lambda expression, use a def E999 SyntaxError: invalid syntax (this is likely python3) F401 <foo> imported but unused F841 local variable 'foo' is assigned to but never used H201: no 'except:' H233: Python 3.x incompatible use of print operator B001 Do not use bare `except:` B004 Using `hasattr(x, '__call__')` to test if `x` is callable is unreliable. B305 `.next()` is not a thing on Python 3. Use the `next()` builtin. B306 `BaseException.message` has been deprecated as of Python 2.6 and is removed in Python 3. B007 Loop control variable 'key' not used within the loop body. remain below issues in ignores: E402 module level import not at top of file ./service-mgmt-api/sm-api/sm_api/cmd/__init__.py:25 Hxxx since which are related with document format F811 redefinition of unused '<foo>' from line <x> ./service-mgmt-tools/sm-tools/sm_tools/sm_configure.py:18 F821 undefined name 'e' ./service-mgmt-api/sm-api/sm_api/common/utils.py:448 B006 Do not use mutable data structures for argument defaults. ./service-mgmt-api/sm-api/sm_api/common/service.py:59 B008 Do not perform calls in argument defaults. ./service-mgmt-api/sm-api/sm_api/openstack/common/timeutils.py:117 Test have been done:Build,Deploy,some smc command,such as smc service-list, smc service-show, sm-dump, etc Story: 2003430 Task: 26524 Change-Id: I3e2a4a31f87e3ff66cfce86f54285e830ee1c3dc Signed-off-by: Sun Austin <austin.sun@intel.com>
This commit is contained in:
parent
fa29551d9e
commit
da53f143ee
|
@ -6,19 +6,19 @@
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
API_SERVICE_OPTS = [
|
API_SERVICE_OPTS = [
|
||||||
cfg.StrOpt('sm_api_bind_ip',
|
cfg.StrOpt('sm_api_bind_ip',
|
||||||
default='0.0.0.0',
|
default='0.0.0.0',
|
||||||
help='IP for the Service Management API server to bind to',
|
help='IP for the Service Management API server to bind to',
|
||||||
),
|
),
|
||||||
cfg.IntOpt('sm_api_port',
|
cfg.IntOpt('sm_api_port',
|
||||||
default=7777,
|
default=7777,
|
||||||
help='The port for the Service Management API server',
|
help='The port for the Service Management API server',
|
||||||
),
|
),
|
||||||
cfg.IntOpt('api_limit_max',
|
cfg.IntOpt('api_limit_max',
|
||||||
default=1000,
|
default=1000,
|
||||||
help='the maximum number of items returned in a single '
|
help='the maximum number of items returned in a single '
|
||||||
'response from a collection resource'),
|
'response from a collection resource'),
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
opt_group = cfg.OptGroup(name='api',
|
opt_group = cfg.OptGroup(name='api',
|
||||||
|
|
|
@ -39,7 +39,7 @@ def register_opts(conf):
|
||||||
|
|
||||||
:param conf: SmApi settings.
|
:param conf: SmApi settings.
|
||||||
"""
|
"""
|
||||||
#conf.register_opts(keystone_auth_token._OPTS, group=OPT_GROUP_NAME)
|
# conf.register_opts(keystone_auth_token._OPTS, group=OPT_GROUP_NAME)
|
||||||
keystone_auth_token.CONF = conf
|
keystone_auth_token.CONF = conf
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,6 +69,7 @@ class AdminAuthHook(hooks.PecanHook):
|
||||||
rejects the request otherwise.
|
rejects the request otherwise.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def before(self, state):
|
def before(self, state):
|
||||||
ctx = state.request.context
|
ctx = state.request.context
|
||||||
|
|
||||||
|
|
|
@ -64,4 +64,5 @@ def main():
|
||||||
print(e)
|
print(e)
|
||||||
sys.exit(-4)
|
sys.exit(-4)
|
||||||
|
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -20,9 +20,9 @@ from sm_api.common import policy
|
||||||
|
|
||||||
auth_opts = [
|
auth_opts = [
|
||||||
cfg.StrOpt('auth_strategy',
|
cfg.StrOpt('auth_strategy',
|
||||||
default='keystone',
|
default='keystone',
|
||||||
help='Method to use for auth: noauth or keystone.'),
|
help='Method to use for auth: noauth or keystone.'),
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
CONF.register_opts(auth_opts)
|
CONF.register_opts(auth_opts)
|
||||||
|
|
|
@ -14,4 +14,4 @@ app = {'root': 'sm_api.api.controllers.root.RootController',
|
||||||
'debug': False,
|
'debug': False,
|
||||||
'enable_acl': True,
|
'enable_acl': True,
|
||||||
'acl_public_routes': ['/', '/v1']
|
'acl_public_routes': ['/', '/v1']
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,10 +75,10 @@ class Version1(wsme_types.Base):
|
||||||
v1.servicenode = [link.Link.make_link('self',
|
v1.servicenode = [link.Link.make_link('self',
|
||||||
pecan.request.host_url,
|
pecan.request.host_url,
|
||||||
'servicenode', ''),
|
'servicenode', ''),
|
||||||
link.Link.make_link('bookmark',
|
link.Link.make_link('bookmark',
|
||||||
pecan.request.host_url,
|
pecan.request.host_url,
|
||||||
'servicenode', '',
|
'servicenode', '',
|
||||||
bookmark=True)]
|
bookmark=True)]
|
||||||
v1.sm_sda = [link.Link.make_link('self',
|
v1.sm_sda = [link.Link.make_link('self',
|
||||||
pecan.request.host_url,
|
pecan.request.host_url,
|
||||||
'sm_sda', ''),
|
'sm_sda', ''),
|
||||||
|
@ -103,4 +103,5 @@ class Controller(rest.RestController):
|
||||||
def get(self):
|
def get(self):
|
||||||
return Version1.convert()
|
return Version1.convert()
|
||||||
|
|
||||||
|
|
||||||
__all__ = Controller
|
__all__ = Controller
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
import wsme
|
import wsme
|
||||||
from wsme import types as wsme_types
|
from wsme import types as wsme_types
|
||||||
|
|
||||||
|
@ -50,6 +48,6 @@ class APIBase(wsme_types.Base):
|
||||||
# Unset non-required fields so they do not appear
|
# Unset non-required fields so they do not appear
|
||||||
# in the message body
|
# in the message body
|
||||||
obj_dict.update(dict((k, wsme.Unset)
|
obj_dict.update(dict((k, wsme.Unset)
|
||||||
for k in obj_dict.keys()
|
for k in obj_dict.keys()
|
||||||
if fields and k not in fields))
|
if fields and k not in fields))
|
||||||
return cls(**obj_dict)
|
return cls(**obj_dict)
|
||||||
|
|
|
@ -48,8 +48,8 @@ class Collection(base.APIBase):
|
||||||
resource_url = url or self._type
|
resource_url = url or self._type
|
||||||
q_args = ''.join(['%s=%s&' % (key, kwargs[key]) for key in kwargs])
|
q_args = ''.join(['%s=%s&' % (key, kwargs[key]) for key in kwargs])
|
||||||
next_args = '?%(args)slimit=%(limit)d&marker=%(marker)s' % {
|
next_args = '?%(args)slimit=%(limit)d&marker=%(marker)s' % {
|
||||||
'args': q_args, 'limit': limit,
|
'args': q_args, 'limit': limit,
|
||||||
'marker': self.collection[-1].uuid}
|
'marker': self.collection[-1].uuid}
|
||||||
|
|
||||||
return link.Link.make_link('next', pecan.request.host_url,
|
return link.Link.make_link('next', pecan.request.host_url,
|
||||||
resource_url, next_args).href
|
resource_url, next_args).href
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
|
||||||
import json
|
|
||||||
import wsme
|
|
||||||
from wsme import types as wsme_types
|
from wsme import types as wsme_types
|
||||||
import wsmeext.pecan as wsme_pecan
|
import wsmeext.pecan as wsme_pecan
|
||||||
import pecan
|
import pecan
|
||||||
|
@ -66,7 +64,7 @@ class Nodes(base.APIBase):
|
||||||
'ready_state']
|
'ready_state']
|
||||||
fields = minimum_fields if not expand else None
|
fields = minimum_fields if not expand else None
|
||||||
nodes = Nodes.from_rpc_object(
|
nodes = Nodes.from_rpc_object(
|
||||||
rpc_nodes, fields)
|
rpc_nodes, fields)
|
||||||
|
|
||||||
return nodes
|
return nodes
|
||||||
|
|
||||||
|
@ -85,8 +83,8 @@ class NodesCollection(collection.Collection):
|
||||||
expand=False, **kwargs):
|
expand=False, **kwargs):
|
||||||
collection = NodesCollection()
|
collection = NodesCollection()
|
||||||
collection.nodes = [
|
collection.nodes = [
|
||||||
Nodes.convert_with_links(ch, expand)
|
Nodes.convert_with_links(ch, expand)
|
||||||
for ch in nodes]
|
for ch in nodes]
|
||||||
url = url or None
|
url = url or None
|
||||||
collection.next = collection.get_next(limit, url=url, **kwargs)
|
collection.next = collection.get_next(limit, url=url, **kwargs)
|
||||||
return collection
|
return collection
|
||||||
|
@ -103,7 +101,7 @@ class NodesController(rest.RestController):
|
||||||
marker_obj = None
|
marker_obj = None
|
||||||
if marker:
|
if marker:
|
||||||
marker_obj = objects.sm_node.get_by_uuid(
|
marker_obj = objects.sm_node.get_by_uuid(
|
||||||
pecan.request.context, marker)
|
pecan.request.context, marker)
|
||||||
|
|
||||||
nodes = pecan.request.dbapi.sm_node_get_list(limit,
|
nodes = pecan.request.dbapi.sm_node_get_list(limit,
|
||||||
marker_obj,
|
marker_obj,
|
||||||
|
@ -118,7 +116,7 @@ class NodesController(rest.RestController):
|
||||||
except exception.ServerNotFound:
|
except exception.ServerNotFound:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return Nodes.convert_with_links(rpc_sg)
|
return Nodes.convert_with_links(rpc_sg)
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(NodesCollection, six.text_type, int,
|
@wsme_pecan.wsexpose(NodesCollection, six.text_type, int,
|
||||||
six.text_type, six.text_type)
|
six.text_type, six.text_type)
|
||||||
|
@ -132,8 +130,8 @@ class NodesController(rest.RestController):
|
||||||
sort_dir)
|
sort_dir)
|
||||||
|
|
||||||
return NodesCollection.convert_with_links(nodes, limit,
|
return NodesCollection.convert_with_links(nodes, limit,
|
||||||
sort_key=sort_key,
|
sort_key=sort_key,
|
||||||
sort_dir=sort_dir)
|
sort_dir=sort_dir)
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(NodesCommandResult, six.text_type,
|
@wsme_pecan.wsexpose(NodesCommandResult, six.text_type,
|
||||||
body=NodesCommand)
|
body=NodesCommand)
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
|
||||||
import json
|
|
||||||
import wsme
|
|
||||||
from wsme import types as wsme_types
|
from wsme import types as wsme_types
|
||||||
import wsmeext.pecan as wsme_pecan
|
import wsmeext.pecan as wsme_pecan
|
||||||
import pecan
|
import pecan
|
||||||
|
@ -72,7 +70,7 @@ class ServiceGroup(base.APIBase):
|
||||||
|
|
||||||
fields = minimum_fields if not expand else None
|
fields = minimum_fields if not expand else None
|
||||||
service_groups = ServiceGroup.from_rpc_object(
|
service_groups = ServiceGroup.from_rpc_object(
|
||||||
rpc_service_groups, fields)
|
rpc_service_groups, fields)
|
||||||
|
|
||||||
return service_groups
|
return service_groups
|
||||||
|
|
||||||
|
@ -91,8 +89,8 @@ class ServiceGroupCollection(collection.Collection):
|
||||||
expand=False, **kwargs):
|
expand=False, **kwargs):
|
||||||
collection = ServiceGroupCollection()
|
collection = ServiceGroupCollection()
|
||||||
collection.service_groups = [
|
collection.service_groups = [
|
||||||
ServiceGroup.convert_with_links(ch, expand)
|
ServiceGroup.convert_with_links(ch, expand)
|
||||||
for ch in service_groups]
|
for ch in service_groups]
|
||||||
url = url or None
|
url = url or None
|
||||||
collection.next = collection.get_next(limit, url=url, **kwargs)
|
collection.next = collection.get_next(limit, url=url, **kwargs)
|
||||||
return collection
|
return collection
|
||||||
|
@ -141,13 +139,13 @@ class ServiceGroupController(rest.RestController):
|
||||||
"""Retrieve list of servicegroups."""
|
"""Retrieve list of servicegroups."""
|
||||||
|
|
||||||
service_groups = self._get_service_groups(marker,
|
service_groups = self._get_service_groups(marker,
|
||||||
limit,
|
limit,
|
||||||
sort_key,
|
sort_key,
|
||||||
sort_dir)
|
sort_dir)
|
||||||
|
|
||||||
return ServiceGroupCollection.convert_with_links(service_groups, limit,
|
return ServiceGroupCollection.convert_with_links(service_groups, limit,
|
||||||
sort_key=sort_key,
|
sort_key=sort_key,
|
||||||
sort_dir=sort_dir)
|
sort_dir=sort_dir)
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(ServiceGroupCommandResult, six.text_type,
|
@wsme_pecan.wsexpose(ServiceGroupCommandResult, six.text_type,
|
||||||
body=ServiceGroupCommand)
|
body=ServiceGroupCommand)
|
||||||
|
|
|
@ -33,7 +33,6 @@ import json
|
||||||
from sm_api.api.controllers.v1 import base
|
from sm_api.api.controllers.v1 import base
|
||||||
from sm_api.api.controllers.v1 import smc_api
|
from sm_api.api.controllers.v1 import smc_api
|
||||||
from sm_api.openstack.common import log
|
from sm_api.openstack.common import log
|
||||||
from sm_api.api.controllers.v1 import services
|
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -226,7 +225,7 @@ class ServiceNodeController(rest.RestController):
|
||||||
# check whether hostname exists in nodes table
|
# check whether hostname exists in nodes table
|
||||||
node_exists = False
|
node_exists = False
|
||||||
sm_nodes = pecan.request.dbapi.sm_node_get_by_name(hostname)
|
sm_nodes = pecan.request.dbapi.sm_node_get_by_name(hostname)
|
||||||
for sm_node in sm_nodes:
|
for _sm_node in sm_nodes:
|
||||||
node_exists = True
|
node_exists = True
|
||||||
|
|
||||||
return node_exists
|
return node_exists
|
||||||
|
@ -339,7 +338,7 @@ class ServiceNodeController(rest.RestController):
|
||||||
# degraded or failure of A/A service on the target host
|
# degraded or failure of A/A service on the target host
|
||||||
# would not stop swact
|
# would not stop swact
|
||||||
sdm = self._sm_sdm_get(sm_sda.name,
|
sdm = self._sm_sdm_get(sm_sda.name,
|
||||||
sm_sda.service_group_name)
|
sm_sda.service_group_name)
|
||||||
if (self._is_aa_service_group(sdm)):
|
if (self._is_aa_service_group(sdm)):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -349,14 +348,14 @@ class ServiceNodeController(rest.RestController):
|
||||||
# or service only provisioned in the other host
|
# or service only provisioned in the other host
|
||||||
# or service state are the same on both hosts
|
# or service state are the same on both hosts
|
||||||
if SM_SERVICE_GROUP_STATE_ACTIVE != sm_sda.state \
|
if SM_SERVICE_GROUP_STATE_ACTIVE != sm_sda.state \
|
||||||
and SM_SERVICE_GROUP_STATE_STANDBY != sm_sda.state \
|
and SM_SERVICE_GROUP_STATE_STANDBY != sm_sda.state \
|
||||||
and sm_sda.service_group_name in origin_state \
|
and sm_sda.service_group_name in origin_state \
|
||||||
and origin_state[sm_sda.service_group_name] != sm_sda.state:
|
and origin_state[sm_sda.service_group_name] != sm_sda.state:
|
||||||
check_result = (
|
check_result = (
|
||||||
"%s on %s is not ready to take service, "
|
"%s on %s is not ready to take service, "
|
||||||
"service not in the active or standby "
|
"service not in the active or standby "
|
||||||
"state" % (sm_sda.service_group_name,
|
"state" % (sm_sda.service_group_name,
|
||||||
sm_sda.node_name))
|
sm_sda.node_name))
|
||||||
break
|
break
|
||||||
|
|
||||||
# Verify that all the services are in the desired state on
|
# Verify that all the services are in the desired state on
|
||||||
|
@ -481,7 +480,7 @@ class ServiceNodeController(rest.RestController):
|
||||||
rsvc = self.get_remote_svc(sda.node_name, service_name)
|
rsvc = self.get_remote_svc(sda.node_name, service_name)
|
||||||
if (SM_SERVICE_STATE_ENABLED_ACTIVE ==
|
if (SM_SERVICE_STATE_ENABLED_ACTIVE ==
|
||||||
rsvc['desired_state'] and
|
rsvc['desired_state'] and
|
||||||
SM_SERVICE_STATE_ENABLED_ACTIVE == rsvc['state']):
|
SM_SERVICE_STATE_ENABLED_ACTIVE == rsvc['state']):
|
||||||
chk_list[sda.service_group_name].remove(service_name)
|
chk_list[sda.service_group_name].remove(service_name)
|
||||||
|
|
||||||
all_good = True
|
all_good = True
|
||||||
|
@ -495,7 +494,7 @@ class ServiceNodeController(rest.RestController):
|
||||||
target_services = []
|
target_services = []
|
||||||
for sda in sdas:
|
for sda in sdas:
|
||||||
if (sda.node_name == hostname and
|
if (sda.node_name == hostname and
|
||||||
sda.service_group_name in chk_list):
|
sda.service_group_name in chk_list):
|
||||||
for service_name in chk_list[sda.service_group_name]:
|
for service_name in chk_list[sda.service_group_name]:
|
||||||
LOG.info("checking %s on %s" % (service_name, hostname))
|
LOG.info("checking %s on %s" % (service_name, hostname))
|
||||||
rsvc = self.get_remote_svc(sda.node_name, service_name)
|
rsvc = self.get_remote_svc(sda.node_name, service_name)
|
||||||
|
@ -503,7 +502,7 @@ class ServiceNodeController(rest.RestController):
|
||||||
continue
|
continue
|
||||||
if (SM_SERVICE_STATE_ENABLED_ACTIVE ==
|
if (SM_SERVICE_STATE_ENABLED_ACTIVE ==
|
||||||
rsvc['desired_state'] and
|
rsvc['desired_state'] and
|
||||||
SM_SERVICE_STATE_ENABLED_ACTIVE == rsvc['state']):
|
SM_SERVICE_STATE_ENABLED_ACTIVE == rsvc['state']):
|
||||||
LOG.info("which is %s %s" % (rsvc['desired_state'], rsvc['state']))
|
LOG.info("which is %s %s" % (rsvc['desired_state'], rsvc['state']))
|
||||||
target_services.append(service_name)
|
target_services.append(service_name)
|
||||||
LOG.info("services %s solely running on %s" % (','.join(target_services), hostname))
|
LOG.info("services %s solely running on %s" % (','.join(target_services), hostname))
|
||||||
|
@ -579,30 +578,30 @@ class ServiceNodeController(rest.RestController):
|
||||||
ack_avail = sm_ack_dict['SM_API_MSG_NODE_AVAIL'].lower()
|
ack_avail = sm_ack_dict['SM_API_MSG_NODE_AVAIL'].lower()
|
||||||
|
|
||||||
LOG.info("sm-api _do_modify_command sm_ack_dict: %s ACK admin: "
|
LOG.info("sm-api _do_modify_command sm_ack_dict: %s ACK admin: "
|
||||||
"%s oper: %s avail: %s." % (sm_ack_dict, ack_admin,
|
"%s oper: %s avail: %s." % (sm_ack_dict, ack_admin,
|
||||||
ack_oper, ack_avail))
|
ack_oper, ack_avail))
|
||||||
|
|
||||||
# loose check on admin and oper only
|
# loose check on admin and oper only
|
||||||
if (command.admin == ack_admin) and (command.oper == ack_oper):
|
if (command.admin == ack_admin) and (command.oper == ack_oper):
|
||||||
return ServiceNodeCommandResult(
|
return ServiceNodeCommandResult(
|
||||||
origin=sm_ack_dict['SM_API_MSG_ORIGIN'],
|
origin=sm_ack_dict['SM_API_MSG_ORIGIN'],
|
||||||
hostname=sm_ack_dict['SM_API_MSG_NODE_NAME'],
|
hostname=sm_ack_dict['SM_API_MSG_NODE_NAME'],
|
||||||
action=sm_ack_dict['SM_API_MSG_NODE_ACTION'],
|
action=sm_ack_dict['SM_API_MSG_NODE_ACTION'],
|
||||||
admin=ack_admin,
|
admin=ack_admin,
|
||||||
oper=ack_oper,
|
oper=ack_oper,
|
||||||
avail=ack_avail,
|
avail=ack_avail,
|
||||||
error_code=ERR_CODE_SUCCESS,
|
error_code=ERR_CODE_SUCCESS,
|
||||||
error_msg="success")
|
error_msg="success")
|
||||||
else:
|
else:
|
||||||
result = ServiceNodeCommandResult(
|
result = ServiceNodeCommandResult(
|
||||||
origin="sm",
|
origin="sm",
|
||||||
hostname=hostname,
|
hostname=hostname,
|
||||||
action=sm_ack_dict['SM_API_MSG_NODE_ACTION'],
|
action=sm_ack_dict['SM_API_MSG_NODE_ACTION'],
|
||||||
admin=ack_admin,
|
admin=ack_admin,
|
||||||
oper=ack_oper,
|
oper=ack_oper,
|
||||||
avail=ack_avail,
|
avail=ack_avail,
|
||||||
error_code=ERR_CODE_ACTION_FAILED,
|
error_code=ERR_CODE_ACTION_FAILED,
|
||||||
error_details="action failed")
|
error_details="action failed")
|
||||||
|
|
||||||
return wsme.api.Response(result, status_code=500)
|
return wsme.api.Response(result, status_code=500)
|
||||||
else:
|
else:
|
||||||
|
@ -613,7 +612,7 @@ class ServiceNodeController(rest.RestController):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = self._get_sm_node_state(hostname)
|
data = self._get_sm_node_state(hostname)
|
||||||
except:
|
except Exception as e:
|
||||||
LOG.exception("No entry in database for %s:" % hostname)
|
LOG.exception("No entry in database for %s:" % hostname)
|
||||||
return ServiceNode(origin="sm",
|
return ServiceNode(origin="sm",
|
||||||
hostname=hostname,
|
hostname=hostname,
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
|
||||||
import json
|
|
||||||
import wsme
|
|
||||||
from wsme import types as wsme_types
|
from wsme import types as wsme_types
|
||||||
import wsmeext.pecan as wsme_pecan
|
import wsmeext.pecan as wsme_pecan
|
||||||
import pecan
|
import pecan
|
||||||
|
@ -65,7 +63,7 @@ class Services(base.APIBase):
|
||||||
minimum_fields = ['id', 'name', 'desired_state', 'state', 'status']
|
minimum_fields = ['id', 'name', 'desired_state', 'state', 'status']
|
||||||
fields = minimum_fields if not expand else None
|
fields = minimum_fields if not expand else None
|
||||||
services = Services.from_rpc_object(
|
services = Services.from_rpc_object(
|
||||||
rpc_services, fields)
|
rpc_services, fields)
|
||||||
|
|
||||||
return services
|
return services
|
||||||
|
|
||||||
|
@ -84,8 +82,8 @@ class ServicesCollection(collection.Collection):
|
||||||
expand=False, **kwargs):
|
expand=False, **kwargs):
|
||||||
collection = ServicesCollection()
|
collection = ServicesCollection()
|
||||||
collection.services = [
|
collection.services = [
|
||||||
Services.convert_with_links(ch, expand)
|
Services.convert_with_links(ch, expand)
|
||||||
for ch in services]
|
for ch in services]
|
||||||
url = url or None
|
url = url or None
|
||||||
collection.next = collection.get_next(limit, url=url, **kwargs)
|
collection.next = collection.get_next(limit, url=url, **kwargs)
|
||||||
return collection
|
return collection
|
||||||
|
@ -102,12 +100,12 @@ class ServicesController(rest.RestController):
|
||||||
marker_obj = None
|
marker_obj = None
|
||||||
if marker:
|
if marker:
|
||||||
marker_obj = objects.service.get_by_uuid(
|
marker_obj = objects.service.get_by_uuid(
|
||||||
pecan.request.context, marker)
|
pecan.request.context, marker)
|
||||||
|
|
||||||
services = pecan.request.dbapi.sm_service_get_list(limit,
|
services = pecan.request.dbapi.sm_service_get_list(limit,
|
||||||
marker_obj,
|
marker_obj,
|
||||||
sort_key=sort_key,
|
sort_key=sort_key,
|
||||||
sort_dir=sort_dir)
|
sort_dir=sort_dir)
|
||||||
return services
|
return services
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(Services, six.text_type)
|
@wsme_pecan.wsexpose(Services, six.text_type)
|
||||||
|
@ -134,9 +132,9 @@ class ServicesController(rest.RestController):
|
||||||
"""Retrieve list of services."""
|
"""Retrieve list of services."""
|
||||||
|
|
||||||
services = self._get_services(marker,
|
services = self._get_services(marker,
|
||||||
limit,
|
limit,
|
||||||
sort_key,
|
sort_key,
|
||||||
sort_dir)
|
sort_dir)
|
||||||
|
|
||||||
return ServicesCollection.convert_with_links(services, limit,
|
return ServicesCollection.convert_with_links(services, limit,
|
||||||
sort_key=sort_key,
|
sort_key=sort_key,
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
|
||||||
import json
|
|
||||||
import wsme
|
|
||||||
from wsme import types as wsme_types
|
from wsme import types as wsme_types
|
||||||
import wsmeext.pecan as wsme_pecan
|
import wsmeext.pecan as wsme_pecan
|
||||||
import pecan
|
import pecan
|
||||||
|
@ -71,7 +69,7 @@ class SmSda(base.APIBase):
|
||||||
'state', 'status', 'condition']
|
'state', 'status', 'condition']
|
||||||
fields = minimum_fields if not expand else None
|
fields = minimum_fields if not expand else None
|
||||||
sm_sda = SmSda.from_rpc_object(
|
sm_sda = SmSda.from_rpc_object(
|
||||||
rpc_sm_sda, fields)
|
rpc_sm_sda, fields)
|
||||||
|
|
||||||
return sm_sda
|
return sm_sda
|
||||||
|
|
||||||
|
@ -90,8 +88,8 @@ class SmSdaCollection(collection.Collection):
|
||||||
expand=False, **kwargs):
|
expand=False, **kwargs):
|
||||||
collection = SmSdaCollection()
|
collection = SmSdaCollection()
|
||||||
collection.sm_sda = [
|
collection.sm_sda = [
|
||||||
SmSda.convert_with_links(ch, expand)
|
SmSda.convert_with_links(ch, expand)
|
||||||
for ch in sm_sda]
|
for ch in sm_sda]
|
||||||
url = url or None
|
url = url or None
|
||||||
collection.next = collection.get_next(limit, url=url, **kwargs)
|
collection.next = collection.get_next(limit, url=url, **kwargs)
|
||||||
return collection
|
return collection
|
||||||
|
|
|
@ -91,19 +91,19 @@ def sm_api_notify(sm_dict):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
LOG.debug(_("sm-api mismatch seqno tx message: %s rx message: %s " % (sm_buf, sm_ack)))
|
LOG.debug(_("sm-api mismatch seqno tx message: %s rx message: %s " % (sm_buf, sm_ack)))
|
||||||
except:
|
except Exception as e:
|
||||||
LOG.exception(_("sm-api bad rx message: %s" % sm_ack))
|
LOG.exception(_("sm-api bad rx message: %s" % sm_ack))
|
||||||
|
|
||||||
except socket.error as e:
|
except socket.error as e:
|
||||||
LOG.exception(_("sm-api socket error: %s on %s") % (e, sm_buf))
|
LOG.exception(_("sm-api socket error: %s on %s") % (e, sm_buf))
|
||||||
sm_ack_dict = {
|
sm_ack_dict = {
|
||||||
'SM_API_MSG_TYPE': "unknown_set_node",
|
'SM_API_MSG_TYPE': "unknown_set_node",
|
||||||
'SM_API_MSG_NODE_ACTION': sm_dict['SM_API_MSG_NODE_ACTION'],
|
'SM_API_MSG_NODE_ACTION': sm_dict['SM_API_MSG_NODE_ACTION'],
|
||||||
'SM_API_MSG_ORIGIN': "sm",
|
'SM_API_MSG_ORIGIN': "sm",
|
||||||
'SM_API_MSG_NODE_NAME': sm_dict['SM_API_MSG_NODE_NAME'],
|
'SM_API_MSG_NODE_NAME': sm_dict['SM_API_MSG_NODE_NAME'],
|
||||||
'SM_API_MSG_NODE_ADMIN': "unknown",
|
'SM_API_MSG_NODE_ADMIN': "unknown",
|
||||||
'SM_API_MSG_NODE_OPER': "unknown",
|
'SM_API_MSG_NODE_OPER': "unknown",
|
||||||
'SM_API_MSG_NODE_AVAIL': "unknown"}
|
'SM_API_MSG_NODE_AVAIL': "unknown"}
|
||||||
|
|
||||||
return sm_ack_dict
|
return sm_ack_dict
|
||||||
|
|
||||||
|
@ -116,46 +116,46 @@ def sm_api_notify(sm_dict):
|
||||||
try:
|
try:
|
||||||
sm_ack_list = sm_ack.split(",")
|
sm_ack_list = sm_ack.split(",")
|
||||||
sm_ack_dict = {
|
sm_ack_dict = {
|
||||||
'SM_API_MSG_VERSION': sm_ack_list[SM_API_MSG_VERSION_FIELD],
|
'SM_API_MSG_VERSION': sm_ack_list[SM_API_MSG_VERSION_FIELD],
|
||||||
'SM_API_MSG_REVISION': sm_ack_list[SM_API_MSG_REVISION_FIELD],
|
'SM_API_MSG_REVISION': sm_ack_list[SM_API_MSG_REVISION_FIELD],
|
||||||
'SM_API_MSG_SEQNO': sm_ack_list[SM_API_MSG_SEQNO_FIELD],
|
'SM_API_MSG_SEQNO': sm_ack_list[SM_API_MSG_SEQNO_FIELD],
|
||||||
'SM_API_MSG_TYPE': sm_ack_list[SM_API_MSG_TYPE_FIELD],
|
'SM_API_MSG_TYPE': sm_ack_list[SM_API_MSG_TYPE_FIELD],
|
||||||
'SM_API_MSG_NODE_ACTION': sm_ack_list[SM_API_MSG_NODE_ACTION_FIELD],
|
'SM_API_MSG_NODE_ACTION': sm_ack_list[SM_API_MSG_NODE_ACTION_FIELD],
|
||||||
|
|
||||||
'SM_API_MSG_ORIGIN': sm_ack_list[SM_API_MSG_ORIGIN_FIELD],
|
'SM_API_MSG_ORIGIN': sm_ack_list[SM_API_MSG_ORIGIN_FIELD],
|
||||||
'SM_API_MSG_NODE_NAME': sm_ack_list[SM_API_MSG_NODE_NAME_FIELD],
|
'SM_API_MSG_NODE_NAME': sm_ack_list[SM_API_MSG_NODE_NAME_FIELD],
|
||||||
'SM_API_MSG_NODE_ADMIN': sm_ack_list[SM_API_MSG_NODE_ADMIN_FIELD],
|
'SM_API_MSG_NODE_ADMIN': sm_ack_list[SM_API_MSG_NODE_ADMIN_FIELD],
|
||||||
'SM_API_MSG_NODE_OPER': sm_ack_list[SM_API_MSG_NODE_OPER_FIELD],
|
'SM_API_MSG_NODE_OPER': sm_ack_list[SM_API_MSG_NODE_OPER_FIELD],
|
||||||
'SM_API_MSG_NODE_AVAIL': sm_ack_list[SM_API_MSG_NODE_AVAIL_FIELD]
|
'SM_API_MSG_NODE_AVAIL': sm_ack_list[SM_API_MSG_NODE_AVAIL_FIELD]
|
||||||
}
|
}
|
||||||
except:
|
except Exception as e:
|
||||||
LOG.exception(_("sm-api ack message error: %s" % sm_ack))
|
LOG.exception(_("sm-api ack message error: %s" % sm_ack))
|
||||||
sm_ack_dict = {
|
sm_ack_dict = {
|
||||||
'SM_API_MSG_TYPE': "unknown_set_node",
|
'SM_API_MSG_TYPE': "unknown_set_node",
|
||||||
|
|
||||||
'SM_API_MSG_ORIGIN': "sm",
|
'SM_API_MSG_ORIGIN': "sm",
|
||||||
'SM_API_MSG_NODE_NAME': sm_dict['SM_API_MSG_NODE_NAME'],
|
'SM_API_MSG_NODE_NAME': sm_dict['SM_API_MSG_NODE_NAME'],
|
||||||
'SM_API_MSG_NODE_ADMIN': "unknown",
|
'SM_API_MSG_NODE_ADMIN': "unknown",
|
||||||
'SM_API_MSG_NODE_OPEsR': "unknown",
|
'SM_API_MSG_NODE_OPEsR': "unknown",
|
||||||
'SM_API_MSG_NODE_AVAIL': "unknown"
|
'SM_API_MSG_NODE_AVAIL': "unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
return sm_ack_dict
|
return sm_ack_dict
|
||||||
|
|
||||||
|
|
||||||
def sm_api_set_node_state(origin, hostname, action, admin, avail, oper, seqno):
|
def sm_api_set_node_state(origin, hostname, action, admin, avail, oper, seqno):
|
||||||
sm_ack_dict = {}
|
sm_ack_dict = {}
|
||||||
sm_dict = {'SM_API_MSG_TYPE': SM_API_MSG_TYPE_SET_NODE,
|
sm_dict = {'SM_API_MSG_TYPE': SM_API_MSG_TYPE_SET_NODE,
|
||||||
|
|
||||||
'SM_API_MSG_ORIGIN': origin,
|
'SM_API_MSG_ORIGIN': origin,
|
||||||
'SM_API_MSG_NODE_NAME': hostname,
|
'SM_API_MSG_NODE_NAME': hostname,
|
||||||
|
|
||||||
'SM_API_MSG_NODE_ACTION': action,
|
'SM_API_MSG_NODE_ACTION': action,
|
||||||
'SM_API_MSG_NODE_ADMIN': admin,
|
'SM_API_MSG_NODE_ADMIN': admin,
|
||||||
'SM_API_MSG_NODE_OPER': oper,
|
'SM_API_MSG_NODE_OPER': oper,
|
||||||
'SM_API_MSG_NODE_AVAIL': avail,
|
'SM_API_MSG_NODE_AVAIL': avail,
|
||||||
'SM_API_MSG_SEQNO': seqno,
|
'SM_API_MSG_SEQNO': seqno,
|
||||||
}
|
}
|
||||||
|
|
||||||
sm_ack_dict = sm_api_notify(sm_dict)
|
sm_ack_dict = sm_api_notify(sm_dict)
|
||||||
|
|
||||||
|
|
|
@ -61,14 +61,14 @@ def validate_patch(patch):
|
||||||
if not isinstance(p, dict) or \
|
if not isinstance(p, dict) or \
|
||||||
any(key for key in ["path", "op"] if key not in p):
|
any(key for key in ["path", "op"] if key not in p):
|
||||||
raise wsme.exc.ClientSideError(_("Invalid patch format: %s")
|
raise wsme.exc.ClientSideError(_("Invalid patch format: %s")
|
||||||
% str(p))
|
% str(p))
|
||||||
|
|
||||||
path = p["path"]
|
path = p["path"]
|
||||||
op = p["op"]
|
op = p["op"]
|
||||||
|
|
||||||
if op not in ["add", "replace", "remove"]:
|
if op not in ["add", "replace", "remove"]:
|
||||||
raise wsme.exc.ClientSideError(_("Operation not supported: %s")
|
raise wsme.exc.ClientSideError(_("Operation not supported: %s")
|
||||||
% op)
|
% op)
|
||||||
|
|
||||||
if not path_pattern.match(path):
|
if not path_pattern.match(path):
|
||||||
raise wsme.exc.ClientSideError(_("Invalid path: %s") % path)
|
raise wsme.exc.ClientSideError(_("Invalid path: %s") % path)
|
||||||
|
@ -78,7 +78,7 @@ def validate_patch(patch):
|
||||||
raise wsme.exc.ClientSideError(_("Adding an additional "
|
raise wsme.exc.ClientSideError(_("Adding an additional "
|
||||||
"attribute (%s) to the "
|
"attribute (%s) to the "
|
||||||
"resource is not allowed")
|
"resource is not allowed")
|
||||||
% path)
|
% path)
|
||||||
|
|
||||||
|
|
||||||
class ValidTypes(wsme.types.UserType):
|
class ValidTypes(wsme.types.UserType):
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
Hooks
|
Hooks
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlite3
|
|
||||||
from pecan import hooks
|
from pecan import hooks
|
||||||
|
|
||||||
from sm_api.common import context
|
from sm_api.common import context
|
||||||
|
@ -60,6 +59,7 @@ class ContextHook(hooks.PecanHook):
|
||||||
or admin substring. Otherwise it is set to False.
|
or admin substring. Otherwise it is set to False.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, public_api_routes):
|
def __init__(self, public_api_routes):
|
||||||
self.public_api_routes = public_api_routes
|
self.public_api_routes = public_api_routes
|
||||||
super(ContextHook, self).__init__()
|
super(ContextHook, self).__init__()
|
||||||
|
|
|
@ -20,6 +20,7 @@ class AuthTokenMiddleware(auth_token.AuthProtocol):
|
||||||
for public routes in the API.
|
for public routes in the API.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, app, conf, public_api_routes=[]):
|
def __init__(self, app, conf, public_api_routes=[]):
|
||||||
self.smapi_app = app
|
self.smapi_app = app
|
||||||
self.public_api_routes = set(public_api_routes)
|
self.public_api_routes = set(public_api_routes)
|
||||||
|
|
|
@ -38,6 +38,7 @@ LOG = log.getLogger(__name__)
|
||||||
class ParsableErrorMiddleware(object):
|
class ParsableErrorMiddleware(object):
|
||||||
"""Replace error body with something the client can parse.
|
"""Replace error body with something the client can parse.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, app):
|
def __init__(self, app):
|
||||||
self.app = app
|
self.app = app
|
||||||
|
|
||||||
|
@ -75,7 +76,7 @@ class ParsableErrorMiddleware(object):
|
||||||
req = webob.Request(environ)
|
req = webob.Request(environ)
|
||||||
if (req.accept.best_match(
|
if (req.accept.best_match(
|
||||||
['application/json', 'application/xml']) ==
|
['application/json', 'application/xml']) ==
|
||||||
'application/xml'):
|
'application/xml'):
|
||||||
try:
|
try:
|
||||||
# simple check xml is valid
|
# simple check xml is valid
|
||||||
body = [et.ElementTree.tostring(
|
body = [et.ElementTree.tostring(
|
||||||
|
|
|
@ -73,7 +73,7 @@ class ProcessExecutionError(IOError):
|
||||||
|
|
||||||
def _cleanse_dict(original):
|
def _cleanse_dict(original):
|
||||||
"""Strip all admin_password, new_pass, rescue_pass keys from a dict."""
|
"""Strip all admin_password, new_pass, rescue_pass keys from a dict."""
|
||||||
return dict((k, v) for k, v in original.items() if not "_pass" in k)
|
return dict((k, v) for k, v in original.items() if "_pass" not in k)
|
||||||
|
|
||||||
|
|
||||||
def wrap_exception(notifier=None, publisher_id=None, event_type=None,
|
def wrap_exception(notifier=None, publisher_id=None, event_type=None,
|
||||||
|
@ -319,12 +319,12 @@ class NodeInUse(SmApiException):
|
||||||
|
|
||||||
class NodeInWrongPowerState(SmApiException):
|
class NodeInWrongPowerState(SmApiException):
|
||||||
message = _("Can not change instance association while node "
|
message = _("Can not change instance association while node "
|
||||||
"%(node)s is in power state %(pstate)s.")
|
"%(node)s is in power state %(pstate)s.")
|
||||||
|
|
||||||
|
|
||||||
class NodeNotConfigured(SmApiException):
|
class NodeNotConfigured(SmApiException):
|
||||||
message = _("Can not change power state because node %(node)s "
|
message = _("Can not change power state because node %(node)s "
|
||||||
"is not fully configured.")
|
"is not fully configured.")
|
||||||
|
|
||||||
|
|
||||||
class ChassisNotEmpty(SmApiException):
|
class ChassisNotEmpty(SmApiException):
|
||||||
|
|
|
@ -37,7 +37,7 @@ policy_opts = [
|
||||||
cfg.StrOpt('policy_default_rule',
|
cfg.StrOpt('policy_default_rule',
|
||||||
default='default',
|
default='default',
|
||||||
help=_('Rule checked when requested rule is not found')),
|
help=_('Rule checked when requested rule is not found')),
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
CONF.register_opts(policy_opts)
|
CONF.register_opts(policy_opts)
|
||||||
|
|
|
@ -36,7 +36,7 @@ def getcallargs(function, *args, **kwargs):
|
||||||
|
|
||||||
keyed_args.update(kwargs)
|
keyed_args.update(kwargs)
|
||||||
|
|
||||||
#NOTE(alaski) the implicit 'self' or 'cls' argument shows up in
|
# NOTE(alaski) the implicit 'self' or 'cls' argument shows up in
|
||||||
# argnames but not in args or kwargs. Uses 'in' rather than '==' because
|
# argnames but not in args or kwargs. Uses 'in' rather than '==' because
|
||||||
# some tests use 'self2'.
|
# some tests use 'self2'.
|
||||||
if 'self' in argnames[0] or 'cls' == argnames[0]:
|
if 'self' in argnames[0] or 'cls' == argnames[0]:
|
||||||
|
|
|
@ -29,7 +29,7 @@ import errno
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
#import paramiko
|
# import paramiko
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
@ -120,7 +120,7 @@ def execute(*cmd, **kwargs):
|
||||||
|
|
||||||
if len(kwargs):
|
if len(kwargs):
|
||||||
raise exception.SmApiException(_('Got unknown keyword args '
|
raise exception.SmApiException(_('Got unknown keyword args '
|
||||||
'to utils.execute: %r') % kwargs)
|
'to utils.execute: %r') % kwargs)
|
||||||
|
|
||||||
if run_as_root and os.geteuid() != 0:
|
if run_as_root and os.geteuid() != 0:
|
||||||
cmd = ['sudo', 'sm_api-rootwrap', CONF.rootwrap_config] + list(cmd)
|
cmd = ['sudo', 'sm_api-rootwrap', CONF.rootwrap_config] + list(cmd)
|
||||||
|
@ -158,10 +158,10 @@ def execute(*cmd, **kwargs):
|
||||||
if not ignore_exit_code and _returncode not in check_exit_code:
|
if not ignore_exit_code and _returncode not in check_exit_code:
|
||||||
(stdout, stderr) = result
|
(stdout, stderr) = result
|
||||||
raise exception.ProcessExecutionError(
|
raise exception.ProcessExecutionError(
|
||||||
exit_code=_returncode,
|
exit_code=_returncode,
|
||||||
stdout=stdout,
|
stdout=stdout,
|
||||||
stderr=stderr,
|
stderr=stderr,
|
||||||
cmd=' '.join(cmd))
|
cmd=' '.join(cmd))
|
||||||
return result
|
return result
|
||||||
except exception.ProcessExecutionError:
|
except exception.ProcessExecutionError:
|
||||||
if not attempts:
|
if not attempts:
|
||||||
|
@ -376,7 +376,7 @@ def is_valid_cidr(address):
|
||||||
ip_segment = address.split('/')
|
ip_segment = address.split('/')
|
||||||
|
|
||||||
if (len(ip_segment) <= 1 or
|
if (len(ip_segment) <= 1 or
|
||||||
ip_segment[1] == ''):
|
ip_segment[1] == ''):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -530,7 +530,7 @@ def mkfs(fs, path, label=None):
|
||||||
args = ['mkswap']
|
args = ['mkswap']
|
||||||
else:
|
else:
|
||||||
args = ['mkfs', '-t', fs]
|
args = ['mkfs', '-t', fs]
|
||||||
#add -F to force no interactive execute on non-block device.
|
# add -F to force no interactive execute on non-block device.
|
||||||
if fs in ('ext3', 'ext4'):
|
if fs in ('ext3', 'ext4'):
|
||||||
args.extend(['-F'])
|
args.extend(['-F'])
|
||||||
if label:
|
if label:
|
||||||
|
@ -548,13 +548,13 @@ def mkfs(fs, path, label=None):
|
||||||
# or reimplement as a common lib,
|
# or reimplement as a common lib,
|
||||||
# or make a driver that doesn't need to do this.
|
# or make a driver that doesn't need to do this.
|
||||||
#
|
#
|
||||||
#def cache_image(context, target, image_id, user_id, project_id):
|
# def cache_image(context, target, image_id, user_id, project_id):
|
||||||
# if not os.path.exists(target):
|
# if not os.path.exists(target):
|
||||||
# libvirt_utils.fetch_image(context, target, image_id,
|
# libvirt_utils.fetch_image(context, target, image_id,
|
||||||
# user_id, project_id)
|
# user_id, project_id)
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
#def inject_into_image(image, key, net, metadata, admin_password,
|
# def inject_into_image(image, key, net, metadata, admin_password,
|
||||||
# files, partition, use_cow=False):
|
# files, partition, use_cow=False):
|
||||||
# try:
|
# try:
|
||||||
# disk_api.inject_data(image, key, net, metadata, admin_password,
|
# disk_api.inject_data(image, key, net, metadata, admin_password,
|
||||||
|
@ -572,7 +572,7 @@ def unlink_without_raise(path):
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
LOG.warn(_("Failed to unlink %(path)s, error: %(e)s") %
|
LOG.warn(_("Failed to unlink %(path)s, error: %(e)s") %
|
||||||
{'path': path, 'e': e})
|
{'path': path, 'e': e})
|
||||||
|
|
||||||
|
|
||||||
def rmtree_without_raise(path):
|
def rmtree_without_raise(path):
|
||||||
|
@ -581,7 +581,7 @@ def rmtree_without_raise(path):
|
||||||
shutil.rmtree(path)
|
shutil.rmtree(path)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
LOG.warn(_("Failed to remove dir %(path)s, error: %(e)s") %
|
LOG.warn(_("Failed to remove dir %(path)s, error: %(e)s") %
|
||||||
{'path': path, 'e': e})
|
{'path': path, 'e': e})
|
||||||
|
|
||||||
|
|
||||||
def write_to_file(path, contents):
|
def write_to_file(path, contents):
|
||||||
|
@ -598,7 +598,7 @@ def create_link_without_raise(source, link):
|
||||||
else:
|
else:
|
||||||
LOG.warn(_("Failed to create symlink from %(source)s to %(link)s"
|
LOG.warn(_("Failed to create symlink from %(source)s to %(link)s"
|
||||||
", error: %(e)s") %
|
", error: %(e)s") %
|
||||||
{'source': source, 'link': link, 'e': e})
|
{'source': source, 'link': link, 'e': e})
|
||||||
|
|
||||||
|
|
||||||
def safe_rstrip(value, chars=None):
|
def safe_rstrip(value, chars=None):
|
||||||
|
@ -659,13 +659,13 @@ def notify_mtc_and_recv(mtc_address, mtc_port, idict):
|
||||||
try:
|
try:
|
||||||
mtc_response_dict = json.loads(mtc_response)
|
mtc_response_dict = json.loads(mtc_response)
|
||||||
LOG.warning("Mtc Response: %s" % mtc_response_dict)
|
LOG.warning("Mtc Response: %s" % mtc_response_dict)
|
||||||
except:
|
except Exception as e:
|
||||||
LOG.exception("Mtc Response Error: %s" % mtc_response)
|
LOG.exception("Mtc Response Error: %s" % mtc_response)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
except socket.error as e:
|
except socket.error as e:
|
||||||
LOG.exception(_("Socket Error: %s on %s:%s for %s") % (e,
|
LOG.exception(_("Socket Error: %s on %s:%s for %s") % (e,
|
||||||
mtc_address, mtc_port, serialized_idict))
|
mtc_address, mtc_port, serialized_idict))
|
||||||
# if e not in [errno.EWOULDBLOCK, errno.EINTR]:
|
# if e not in [errno.EWOULDBLOCK, errno.EINTR]:
|
||||||
# raise exception.CommunicationError(_(
|
# raise exception.CommunicationError(_(
|
||||||
# "Socket error: address=%s port=%s error=%s ") % (
|
# "Socket error: address=%s port=%s error=%s ") % (
|
||||||
|
|
|
@ -157,7 +157,7 @@ class Connection(object):
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def sm_service_get_list(self, limit=None, marker=None,
|
def sm_service_get_list(self, limit=None, marker=None,
|
||||||
sort_key=None, sort_dir=None):
|
sort_key=None, sort_dir=None):
|
||||||
"""Return a list of services.
|
"""Return a list of services.
|
||||||
|
|
||||||
:param limit: Maximum number of services to return.
|
:param limit: Maximum number of services to return.
|
||||||
|
@ -174,7 +174,6 @@ class Connection(object):
|
||||||
:param name: The name of the services.
|
:param name: The name of the services.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def sm_service_group_members_get_list(self, service_group_name):
|
def sm_service_group_members_get_list(self, service_group_name):
|
||||||
"""Return service group members in a service group
|
"""Return service group members in a service group
|
||||||
|
|
|
@ -32,9 +32,9 @@ CONF.import_opt('backend',
|
||||||
group='database')
|
group='database')
|
||||||
|
|
||||||
IMPL = utils.LazyPluggable(
|
IMPL = utils.LazyPluggable(
|
||||||
pivot='backend',
|
pivot='backend',
|
||||||
config_group='database',
|
config_group='database',
|
||||||
sqlalchemy='sm_api.db.sqlalchemy.migration')
|
sqlalchemy='sm_api.db.sqlalchemy.migration')
|
||||||
|
|
||||||
INIT_VERSION = 0
|
INIT_VERSION = 0
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,6 @@ from sm_api.common import utils
|
||||||
from sm_api.db import api
|
from sm_api.db import api
|
||||||
from sm_api.db.sqlalchemy import models
|
from sm_api.db.sqlalchemy import models
|
||||||
from sm_api import objects
|
from sm_api import objects
|
||||||
from sm_api.openstack.common.db import exception as db_exc
|
|
||||||
from sm_api.openstack.common.db.sqlalchemy import session as db_session
|
from sm_api.openstack.common.db.sqlalchemy import session as db_session
|
||||||
from sm_api.openstack.common.db.sqlalchemy import utils as db_utils
|
from sm_api.openstack.common.db.sqlalchemy import utils as db_utils
|
||||||
from sm_api.openstack.common import log
|
from sm_api.openstack.common import log
|
||||||
|
@ -169,8 +168,7 @@ class Connection(api.Connection):
|
||||||
@objects.objectify(objects.service)
|
@objects.objectify(objects.service)
|
||||||
def iservice_get_by_name(self, name):
|
def iservice_get_by_name(self, name):
|
||||||
result = model_query(models.service, read_deleted="no").\
|
result = model_query(models.service, read_deleted="no").\
|
||||||
filter_by(name=name)
|
filter_by(name=name)
|
||||||
# first() since want a list
|
|
||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
raise exception.NodeNotFound(node=name)
|
raise exception.NodeNotFound(node=name)
|
||||||
|
@ -211,7 +209,7 @@ class Connection(api.Connection):
|
||||||
|
|
||||||
@objects.objectify(objects.sm_node)
|
@objects.objectify(objects.sm_node)
|
||||||
def sm_node_get_list(self, limit=None, marker=None,
|
def sm_node_get_list(self, limit=None, marker=None,
|
||||||
sort_key=None, sort_dir=None):
|
sort_key=None, sort_dir=None):
|
||||||
return _paginate_query(models.sm_node, limit, marker,
|
return _paginate_query(models.sm_node, limit, marker,
|
||||||
sort_key, sort_dir)
|
sort_key, sort_dir)
|
||||||
|
|
||||||
|
@ -231,8 +229,7 @@ class Connection(api.Connection):
|
||||||
@objects.objectify(objects.sm_node)
|
@objects.objectify(objects.sm_node)
|
||||||
def sm_node_get_by_name(self, name):
|
def sm_node_get_by_name(self, name):
|
||||||
result = model_query(models.sm_node, read_deleted="no").\
|
result = model_query(models.sm_node, read_deleted="no").\
|
||||||
filter_by(name=name)
|
filter_by(name=name)
|
||||||
# first() since want a list
|
|
||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
raise exception.NodeNotFound(node=name)
|
raise exception.NodeNotFound(node=name)
|
||||||
|
@ -256,21 +253,20 @@ class Connection(api.Connection):
|
||||||
|
|
||||||
@objects.objectify(objects.service)
|
@objects.objectify(objects.service)
|
||||||
def sm_service_get_list(self, limit=None, marker=None,
|
def sm_service_get_list(self, limit=None, marker=None,
|
||||||
sort_key=None, sort_dir=None):
|
sort_key=None, sort_dir=None):
|
||||||
return _paginate_query(models.service, limit, marker,
|
return _paginate_query(models.service, limit, marker,
|
||||||
sort_key, sort_dir)
|
sort_key, sort_dir)
|
||||||
|
|
||||||
@objects.objectify(objects.service)
|
@objects.objectify(objects.service)
|
||||||
def sm_service_get_by_name(self, name):
|
def sm_service_get_by_name(self, name):
|
||||||
result = model_query(models.service, read_deleted="no").\
|
result = model_query(models.service, read_deleted="no").\
|
||||||
filter_by(name=name)
|
filter_by(name=name)
|
||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
raise exception.ServiceNotFound(service=name)
|
raise exception.ServiceNotFound(service=name)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@objects.objectify(objects.service_group_member)
|
@objects.objectify(objects.service_group_member)
|
||||||
def sm_service_group_members_get_list(self, service_group_name):
|
def sm_service_group_members_get_list(self, service_group_name):
|
||||||
result = model_query(models.sm_service_group_member,
|
result = model_query(models.sm_service_group_member,
|
||||||
|
|
|
@ -9,9 +9,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
from sqlalchemy import Column, MetaData, String, Table, UniqueConstraint
|
from sqlalchemy import Column, MetaData, String, Table, UniqueConstraint
|
||||||
from sqlalchemy import Boolean, Integer, Enum, Text, ForeignKey, DateTime
|
from sqlalchemy import Integer, Text, ForeignKey, DateTime
|
||||||
from sqlalchemy import Index
|
|
||||||
from sqlalchemy.dialects import postgresql
|
|
||||||
|
|
||||||
ENGINE = 'InnoDB'
|
ENGINE = 'InnoDB'
|
||||||
CHARSET = 'utf8'
|
CHARSET = 'utf8'
|
||||||
|
@ -70,5 +68,5 @@ def upgrade(migrate_engine):
|
||||||
def downgrade(migrate_engine):
|
def downgrade(migrate_engine):
|
||||||
raise NotImplementedError('Downgrade from Initial is unsupported.')
|
raise NotImplementedError('Downgrade from Initial is unsupported.')
|
||||||
|
|
||||||
#t = Table('i_disk', meta, autoload=True)
|
# t = Table('i_disk', meta, autoload=True)
|
||||||
#t.drop()
|
# t.drop()
|
||||||
|
|
|
@ -50,7 +50,7 @@ def patched_with_engine(f, *a, **kw):
|
||||||
# on that version or higher, this can be removed
|
# on that version or higher, this can be removed
|
||||||
MIN_PKG_VERSION = dist_version.StrictVersion('0.7.3')
|
MIN_PKG_VERSION = dist_version.StrictVersion('0.7.3')
|
||||||
if (not hasattr(migrate, '__version__') or
|
if (not hasattr(migrate, '__version__') or
|
||||||
dist_version.StrictVersion(migrate.__version__) < MIN_PKG_VERSION):
|
dist_version.StrictVersion(migrate.__version__) < MIN_PKG_VERSION):
|
||||||
migrate_util.with_engine = patched_with_engine
|
migrate_util.with_engine = patched_with_engine
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,8 @@ import json
|
||||||
from six.moves.urllib.parse import urlparse
|
from six.moves.urllib.parse import urlparse
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from sqlalchemy import Column, ForeignKey, Integer, Boolean
|
from sqlalchemy import Column, ForeignKey, Integer
|
||||||
from sqlalchemy import Enum, UniqueConstraint, String
|
from sqlalchemy import String
|
||||||
from sqlalchemy import Index
|
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy.types import TypeDecorator, VARCHAR
|
from sqlalchemy.types import TypeDecorator, VARCHAR
|
||||||
|
|
||||||
|
|
|
@ -50,10 +50,10 @@ sm_node = smo_node.sm_node
|
||||||
service_group_member = smo_sgm.service_group_member
|
service_group_member = smo_sgm.service_group_member
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
service_groups,
|
service_groups,
|
||||||
service_group_member,
|
service_group_member,
|
||||||
service,
|
service,
|
||||||
sm_sdm,
|
sm_sdm,
|
||||||
sm_sda,
|
sm_sda,
|
||||||
sm_node,
|
sm_node,
|
||||||
objectify)
|
objectify)
|
||||||
|
|
|
@ -106,6 +106,7 @@ def remotable_classmethod(fn):
|
||||||
# "orphaned" and remotable methods cannot be called.
|
# "orphaned" and remotable methods cannot be called.
|
||||||
def remotable(fn):
|
def remotable(fn):
|
||||||
"""Decorator for remotable object methods."""
|
"""Decorator for remotable object methods."""
|
||||||
|
|
||||||
def wrapper(self, *args, **kwargs):
|
def wrapper(self, *args, **kwargs):
|
||||||
ctxt = self._context
|
ctxt = self._context
|
||||||
try:
|
try:
|
||||||
|
@ -337,7 +338,8 @@ class Sm_apiObject(object):
|
||||||
name in self.obj_extra_fields):
|
name in self.obj_extra_fields):
|
||||||
yield name, getattr(self, name)
|
yield name, getattr(self, name)
|
||||||
|
|
||||||
items = lambda self: list(self.items())
|
def items(self):
|
||||||
|
return list(self.items())
|
||||||
|
|
||||||
def __getitem__(self, name):
|
def __getitem__(self, name):
|
||||||
"""For backwards-compatibility with dict-based objects.
|
"""For backwards-compatibility with dict-based objects.
|
||||||
|
@ -377,8 +379,8 @@ class Sm_apiObject(object):
|
||||||
|
|
||||||
def as_dict(self):
|
def as_dict(self):
|
||||||
return dict((k, getattr(self, k))
|
return dict((k, getattr(self, k))
|
||||||
for k in self.fields
|
for k in self.fields
|
||||||
if hasattr(self, k))
|
if hasattr(self, k))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_defaults(cls):
|
def get_defaults(cls):
|
||||||
|
@ -398,7 +400,7 @@ class ObjectListBase(object):
|
||||||
"""
|
"""
|
||||||
fields = {
|
fields = {
|
||||||
'objects': list,
|
'objects': list,
|
||||||
}
|
}
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
"""List iterator interface."""
|
"""List iterator interface."""
|
||||||
|
|
|
@ -12,18 +12,19 @@ from sm_api.db import api as db_api
|
||||||
from sm_api.objects import base
|
from sm_api.objects import base
|
||||||
from sm_api.objects import utils
|
from sm_api.objects import utils
|
||||||
|
|
||||||
|
|
||||||
class sm_node(base.Sm_apiObject):
|
class sm_node(base.Sm_apiObject):
|
||||||
|
|
||||||
dbapi = db_api.get_instance()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': int,
|
'id': int,
|
||||||
'name': utils.str_or_none,
|
'name': utils.str_or_none,
|
||||||
'administrative_state': utils.str_or_none,
|
'administrative_state': utils.str_or_none,
|
||||||
'operational_state': utils.str_or_none,
|
'operational_state': utils.str_or_none,
|
||||||
'availability_status': utils.str_or_none,
|
'availability_status': utils.str_or_none,
|
||||||
'ready_state': utils.str_or_none,
|
'ready_state': utils.str_or_none,
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(server, db_server):
|
def _from_db_object(server, db_server):
|
||||||
|
|
|
@ -18,20 +18,20 @@ class sm_sda(base.Sm_apiObject):
|
||||||
dbapi = db_api.get_instance()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': int,
|
'id': int,
|
||||||
'uuid': utils.str_or_none,
|
'uuid': utils.str_or_none,
|
||||||
# 'deleted': utils.str_or_none,
|
# 'deleted': utils.str_or_none,
|
||||||
|
|
||||||
# 'created_at': utils.datetime_str_or_none,
|
# 'created_at': utils.datetime_str_or_none,
|
||||||
# 'updated_at': utils.datetime_str_or_none,
|
# 'updated_at': utils.datetime_str_or_none,
|
||||||
'name': utils.str_or_none,
|
'name': utils.str_or_none,
|
||||||
'node_name': utils.str_or_none,
|
'node_name': utils.str_or_none,
|
||||||
'service_group_name': utils.str_or_none,
|
'service_group_name': utils.str_or_none,
|
||||||
'state': utils.str_or_none,
|
'state': utils.str_or_none,
|
||||||
'desired_state': utils.str_or_none,
|
'desired_state': utils.str_or_none,
|
||||||
'status': utils.str_or_none,
|
'status': utils.str_or_none,
|
||||||
'condition': utils.str_or_none,
|
'condition': utils.str_or_none,
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(server, db_server):
|
def _from_db_object(server, db_server):
|
||||||
|
|
|
@ -18,13 +18,13 @@ class sm_sdm(base.Sm_apiObject):
|
||||||
dbapi = db_api.get_instance()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': int,
|
'id': int,
|
||||||
'name': utils.str_or_none,
|
'name': utils.str_or_none,
|
||||||
'service_group_name': utils.str_or_none,
|
'service_group_name': utils.str_or_none,
|
||||||
'redundancy_model': utils.str_or_none,
|
'redundancy_model': utils.str_or_none,
|
||||||
'n_active': int,
|
'n_active': int,
|
||||||
'm_standby': int,
|
'm_standby': int,
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(server, db_server):
|
def _from_db_object(server, db_server):
|
||||||
|
|
|
@ -18,12 +18,12 @@ class service(base.Sm_apiObject):
|
||||||
dbapi = db_api.get_instance()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': int,
|
'id': int,
|
||||||
'name': utils.str_or_none,
|
'name': utils.str_or_none,
|
||||||
'desired_state': utils.str_or_none,
|
'desired_state': utils.str_or_none,
|
||||||
'state': utils.str_or_none,
|
'state': utils.str_or_none,
|
||||||
'status': utils.str_or_none,
|
'status': utils.str_or_none,
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(server, db_server):
|
def _from_db_object(server, db_server):
|
||||||
|
|
|
@ -18,16 +18,16 @@ class service_groups(base.Sm_apiObject):
|
||||||
dbapi = db_api.get_instance()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': utils.int_or_none,
|
'id': utils.int_or_none,
|
||||||
# 'uuid': utils.str_or_none,
|
# 'uuid': utils.str_or_none,
|
||||||
# 'deleted': utils.str_or_none,
|
# 'deleted': utils.str_or_none,
|
||||||
|
|
||||||
# 'created_at': utils.datetime_str_or_none,
|
# 'created_at': utils.datetime_str_or_none,
|
||||||
# 'updated_at': utils.datetime_str_or_none,
|
# 'updated_at': utils.datetime_str_or_none,
|
||||||
'name': utils.str_or_none,
|
'name': utils.str_or_none,
|
||||||
'state': utils.str_or_none,
|
'state': utils.str_or_none,
|
||||||
'status': utils.str_or_none,
|
'status': utils.str_or_none,
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(server, db_server):
|
def _from_db_object(server, db_server):
|
||||||
|
|
|
@ -18,11 +18,11 @@ class service_group_member(base.Sm_apiObject):
|
||||||
dbapi = db_api.get_instance()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'id': utils.int_or_none,
|
'id': utils.int_or_none,
|
||||||
'name': utils.str_or_none,
|
'name': utils.str_or_none,
|
||||||
'service_name': utils.str_or_none,
|
'service_name': utils.str_or_none,
|
||||||
'service_failure_impact': utils.str_or_none
|
'service_failure_impact': utils.str_or_none
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(server, db_server):
|
def _from_db_object(server, db_server):
|
||||||
|
|
|
@ -105,6 +105,7 @@ def nested_object_or_none(objclass):
|
||||||
|
|
||||||
def dt_serializer(name):
|
def dt_serializer(name):
|
||||||
"""Return a datetime serializer for a named attribute."""
|
"""Return a datetime serializer for a named attribute."""
|
||||||
|
|
||||||
def serializer(self, name=name):
|
def serializer(self, name=name):
|
||||||
if getattr(self, name) is not None:
|
if getattr(self, name) is not None:
|
||||||
return timeutils.isotime(getattr(self, name))
|
return timeutils.isotime(getattr(self, name))
|
||||||
|
|
|
@ -120,7 +120,7 @@ def _import_module(mod_str):
|
||||||
|
|
||||||
def _is_in_group(opt, group):
|
def _is_in_group(opt, group):
|
||||||
"Check if opt is in group."
|
"Check if opt is in group."
|
||||||
for key, value in group._opts.items():
|
for _key, value in group._opts.items():
|
||||||
if value['opt'] == opt:
|
if value['opt'] == opt:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
@ -132,7 +132,7 @@ def _guess_groups(opt, mod_obj):
|
||||||
return 'DEFAULT'
|
return 'DEFAULT'
|
||||||
|
|
||||||
# what other groups is it in?
|
# what other groups is it in?
|
||||||
for key, value in cfg.CONF.items():
|
for _key, value in cfg.CONF.items():
|
||||||
if isinstance(value, cfg.CONF.GroupAttr):
|
if isinstance(value, cfg.CONF.GroupAttr):
|
||||||
if _is_in_group(opt, value._group):
|
if _is_in_group(opt, value._group):
|
||||||
return value._group.name
|
return value._group.name
|
||||||
|
@ -254,5 +254,6 @@ def main():
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
generate(sys.argv[1:])
|
generate(sys.argv[1:])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -100,7 +100,7 @@ class DBAPI(object):
|
||||||
def __getattr__(self, key):
|
def __getattr__(self, key):
|
||||||
backend = self.__backend or self.__get_backend()
|
backend = self.__backend or self.__get_backend()
|
||||||
attr = getattr(backend, key)
|
attr = getattr(backend, key)
|
||||||
if not self.__use_tpool or not hasattr(attr, '__call__'):
|
if not self.__use_tpool or not callable(attr):
|
||||||
return attr
|
return attr
|
||||||
|
|
||||||
def tpool_wrapper(*args, **kwargs):
|
def tpool_wrapper(*args, **kwargs):
|
||||||
|
|
|
@ -25,6 +25,7 @@ from sm_api.openstack.common.gettextutils import _ # noqa
|
||||||
|
|
||||||
class DBError(Exception):
|
class DBError(Exception):
|
||||||
"""Wraps an implementation specific exception."""
|
"""Wraps an implementation specific exception."""
|
||||||
|
|
||||||
def __init__(self, inner_exception=None):
|
def __init__(self, inner_exception=None):
|
||||||
self.inner_exception = inner_exception
|
self.inner_exception = inner_exception
|
||||||
super(DBError, self).__init__(str(inner_exception))
|
super(DBError, self).__init__(str(inner_exception))
|
||||||
|
@ -32,6 +33,7 @@ class DBError(Exception):
|
||||||
|
|
||||||
class DBDuplicateEntry(DBError):
|
class DBDuplicateEntry(DBError):
|
||||||
"""Wraps an implementation specific exception."""
|
"""Wraps an implementation specific exception."""
|
||||||
|
|
||||||
def __init__(self, columns=[], inner_exception=None):
|
def __init__(self, columns=[], inner_exception=None):
|
||||||
self.columns = columns
|
self.columns = columns
|
||||||
super(DBDuplicateEntry, self).__init__(inner_exception)
|
super(DBDuplicateEntry, self).__init__(inner_exception)
|
||||||
|
@ -49,6 +51,7 @@ class DBInvalidUnicodeParameter(Exception):
|
||||||
|
|
||||||
class DbMigrationError(DBError):
|
class DbMigrationError(DBError):
|
||||||
"""Wraps migration specific exception."""
|
"""Wraps migration specific exception."""
|
||||||
|
|
||||||
def __init__(self, message=None):
|
def __init__(self, message=None):
|
||||||
super(DbMigrationError, self).__init__(str(message))
|
super(DbMigrationError, self).__init__(str(message))
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ class ModelBase(object):
|
||||||
Includes attributes from joins."""
|
Includes attributes from joins."""
|
||||||
local = dict(self)
|
local = dict(self)
|
||||||
joined = dict([(k, v) for k, v in self.__dict__.items()
|
joined = dict([(k, v) for k, v in self.__dict__.items()
|
||||||
if not k[0] == '_'])
|
if not k[0] == '_'])
|
||||||
local.update(joined)
|
local.update(joined)
|
||||||
return iter(local.items())
|
return iter(local.items())
|
||||||
|
|
||||||
|
|
|
@ -246,7 +246,6 @@ Efficient use of soft deletes:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os.path
|
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
@ -277,13 +276,13 @@ sqlite_db_opts = [
|
||||||
]
|
]
|
||||||
|
|
||||||
database_opts = [
|
database_opts = [
|
||||||
cfg.StrOpt('connection',
|
cfg.StrOpt('connection',
|
||||||
default='sqlite:////var/run/sm/sm.db',
|
default='sqlite:////var/run/sm/sm.db',
|
||||||
help='The SQLAlchemy connection string used to connect to the '
|
help='The SQLAlchemy connection string used to connect to the '
|
||||||
'database',
|
'database',
|
||||||
deprecated_name='sql_connection',
|
deprecated_name='sql_connection',
|
||||||
deprecated_group=DEFAULT,
|
deprecated_group=DEFAULT,
|
||||||
secret=True),
|
secret=True),
|
||||||
cfg.IntOpt('idle_timeout',
|
cfg.IntOpt('idle_timeout',
|
||||||
default=3600,
|
default=3600,
|
||||||
deprecated_name='sql_idle_timeout',
|
deprecated_name='sql_idle_timeout',
|
||||||
|
@ -366,6 +365,7 @@ class SqliteForeignKeysListener(PoolListener):
|
||||||
so the foreign key constraints will be enabled here for every
|
so the foreign key constraints will be enabled here for every
|
||||||
database connection
|
database connection
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def connect(self, dbapi_con, con_record):
|
def connect(self, dbapi_con, con_record):
|
||||||
dbapi_con.execute('pragma foreign_keys=ON')
|
dbapi_con.execute('pragma foreign_keys=ON')
|
||||||
|
|
||||||
|
@ -627,6 +627,7 @@ def create_engine(sql_connection, sqlite_fk=False):
|
||||||
|
|
||||||
class Query(sqlalchemy.orm.query.Query):
|
class Query(sqlalchemy.orm.query.Query):
|
||||||
"""Subclass of sqlalchemy.query with soft_delete() method."""
|
"""Subclass of sqlalchemy.query with soft_delete() method."""
|
||||||
|
|
||||||
def soft_delete(self, synchronize_session='evaluate'):
|
def soft_delete(self, synchronize_session='evaluate'):
|
||||||
return self.update({'deleted': literal_column('id'),
|
return self.update({'deleted': literal_column('id'),
|
||||||
'updated_at': literal_column('updated_at'),
|
'updated_at': literal_column('updated_at'),
|
||||||
|
|
|
@ -52,4 +52,4 @@ def save_and_reraise_exception():
|
||||||
logging.error(_('Original exception being dropped: %s'),
|
logging.error(_('Original exception being dropped: %s'),
|
||||||
traceback.format_exception(type_, value, tb))
|
traceback.format_exception(type_, value, tb))
|
||||||
raise
|
raise
|
||||||
raise_(type_,value,tb)
|
raise_(type_, value, tb)
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import contextlib
|
import contextlib
|
||||||
import errno
|
import errno
|
||||||
import os
|
import os
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import errno
|
import errno
|
||||||
import functools
|
import functools
|
||||||
import os
|
import os
|
||||||
|
|
|
@ -367,8 +367,7 @@ def setup(product_name):
|
||||||
|
|
||||||
def set_defaults(logging_context_format_string):
|
def set_defaults(logging_context_format_string):
|
||||||
cfg.set_defaults(log_opts,
|
cfg.set_defaults(log_opts,
|
||||||
logging_context_format_string=
|
logging_context_format_string=logging_context_format_string)
|
||||||
logging_context_format_string)
|
|
||||||
|
|
||||||
|
|
||||||
def _find_facility_from_conf():
|
def _find_facility_from_conf():
|
||||||
|
@ -452,6 +451,7 @@ def _setup_logging_from_conf():
|
||||||
logger = logging.getLogger(mod)
|
logger = logging.getLogger(mod)
|
||||||
logger.setLevel(level)
|
logger.setLevel(level)
|
||||||
|
|
||||||
|
|
||||||
_loggers = {}
|
_loggers = {}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def notify(_context, message):
|
def notify(_context, message):
|
||||||
"""Notifies the recipient of the desired event given the model"""
|
"""Notifies the recipient of the desired event given the model"""
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NOTIFICATIONS = []
|
NOTIFICATIONS = []
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -470,7 +470,7 @@ def _parse_tokenize(rule):
|
||||||
|
|
||||||
# Handle leading parens on the token
|
# Handle leading parens on the token
|
||||||
clean = tok.lstrip('(')
|
clean = tok.lstrip('(')
|
||||||
for i in range(len(tok) - len(clean)):
|
for _i in range(len(tok) - len(clean)):
|
||||||
yield '(', '('
|
yield '(', '('
|
||||||
|
|
||||||
# If it was only parentheses, continue
|
# If it was only parentheses, continue
|
||||||
|
@ -498,7 +498,7 @@ def _parse_tokenize(rule):
|
||||||
yield 'check', _parse_check(clean)
|
yield 'check', _parse_check(clean)
|
||||||
|
|
||||||
# Yield the trailing parens
|
# Yield the trailing parens
|
||||||
for i in range(trail):
|
for _i in range(trail):
|
||||||
yield ')', ')'
|
yield ')', ')'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ def main():
|
||||||
rawconfig.read(configfile)
|
rawconfig.read(configfile)
|
||||||
config = wrapper.RootwrapConfig(rawconfig)
|
config = wrapper.RootwrapConfig(rawconfig)
|
||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
msg = "Incorrect value in %s: %s" % (configfile, exc.message)
|
msg = "Incorrect value in %s: %s" % (configfile, str(exc))
|
||||||
_exit_error(execname, msg, RC_BADCONFIG, log=False)
|
_exit_error(execname, msg, RC_BADCONFIG, log=False)
|
||||||
except configparser.Error:
|
except configparser.Error:
|
||||||
_exit_error(execname, "Incorrect configuration file: %s" % configfile,
|
_exit_error(execname, "Incorrect configuration file: %s" % configfile,
|
||||||
|
|
|
@ -105,7 +105,7 @@ class PathFilter(CommandFilter):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def match(self, userargs):
|
def match(self, userargs):
|
||||||
command, arguments = userargs[0], userargs[1:]
|
arguments = userargs[1:]
|
||||||
|
|
||||||
equal_args_num = len(self.args) == len(arguments)
|
equal_args_num = len(self.args) == len(arguments)
|
||||||
exec_is_valid = super(PathFilter, self).match(userargs)
|
exec_is_valid = super(PathFilter, self).match(userargs)
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from six.moves import configparser
|
from six.moves import configparser
|
||||||
import logging
|
import logging
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
|
@ -39,6 +38,7 @@ class FilterMatchNotExecutable(Exception):
|
||||||
This exception is raised when a filter matched but no executable was
|
This exception is raised when a filter matched but no executable was
|
||||||
found.
|
found.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, match=None, **kwargs):
|
def __init__(self, match=None, **kwargs):
|
||||||
self.match = match
|
self.match = match
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
class Pool(pools.Pool):
|
class Pool(pools.Pool):
|
||||||
"""Class that implements a Pool of Connections."""
|
"""Class that implements a Pool of Connections."""
|
||||||
|
|
||||||
def __init__(self, conf, connection_cls, *args, **kwargs):
|
def __init__(self, conf, connection_cls, *args, **kwargs):
|
||||||
self.connection_cls = connection_cls
|
self.connection_cls = connection_cls
|
||||||
self.conf = conf
|
self.conf = conf
|
||||||
|
@ -188,6 +189,7 @@ class ConnectionContext(rpc_common.Connection):
|
||||||
|
|
||||||
class ReplyProxy(ConnectionContext):
|
class ReplyProxy(ConnectionContext):
|
||||||
""" Connection class for RPC replies / callbacks """
|
""" Connection class for RPC replies / callbacks """
|
||||||
|
|
||||||
def __init__(self, conf, connection_pool):
|
def __init__(self, conf, connection_pool):
|
||||||
self._call_waiters = {}
|
self._call_waiters = {}
|
||||||
self._num_call_waiters = 0
|
self._num_call_waiters = 0
|
||||||
|
@ -240,7 +242,7 @@ def msg_reply(conf, msg_id, reply_q, connection_pool, reply=None,
|
||||||
msg = {'result': reply, 'failure': failure}
|
msg = {'result': reply, 'failure': failure}
|
||||||
except TypeError:
|
except TypeError:
|
||||||
msg = {'result': dict((k, repr(v))
|
msg = {'result': dict((k, repr(v))
|
||||||
for k, v in reply.__dict__.items()),
|
for k, v in reply.__dict__.items()),
|
||||||
'failure': failure}
|
'failure': failure}
|
||||||
if ending:
|
if ending:
|
||||||
msg['ending'] = True
|
msg['ending'] = True
|
||||||
|
@ -257,6 +259,7 @@ def msg_reply(conf, msg_id, reply_q, connection_pool, reply=None,
|
||||||
|
|
||||||
class RpcContext(rpc_common.CommonRpcContext):
|
class RpcContext(rpc_common.CommonRpcContext):
|
||||||
"""Context that supports replying to a rpc.call"""
|
"""Context that supports replying to a rpc.call"""
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
self.msg_id = kwargs.pop('msg_id', None)
|
self.msg_id = kwargs.pop('msg_id', None)
|
||||||
self.reply_q = kwargs.pop('reply_q', None)
|
self.reply_q = kwargs.pop('reply_q', None)
|
||||||
|
@ -517,7 +520,7 @@ class MulticallProxyWaiter(object):
|
||||||
yield result
|
yield result
|
||||||
|
|
||||||
|
|
||||||
#TODO(pekowski): Remove MulticallWaiter() in Havana.
|
# TODO(pekowski): Remove MulticallWaiter() in Havana.
|
||||||
class MulticallWaiter(object):
|
class MulticallWaiter(object):
|
||||||
def __init__(self, conf, connection, timeout):
|
def __init__(self, conf, connection, timeout):
|
||||||
self._connection = connection
|
self._connection = connection
|
||||||
|
|
|
@ -173,6 +173,7 @@ class Connection(object):
|
||||||
An instance of this class should never be created by users of the rpc API.
|
An instance of this class should never be created by users of the rpc API.
|
||||||
Use rpc.create_connection() instead.
|
Use rpc.create_connection() instead.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Close the connection.
|
"""Close the connection.
|
||||||
|
|
||||||
|
@ -354,7 +355,9 @@ def deserialize_remote_exception(conf, data):
|
||||||
return RemoteError(name, failure.get('message'), trace)
|
return RemoteError(name, failure.get('message'), trace)
|
||||||
|
|
||||||
ex_type = type(failure)
|
ex_type = type(failure)
|
||||||
str_override = lambda self: message
|
|
||||||
|
def str_override(self):
|
||||||
|
return message
|
||||||
new_ex_type = type(ex_type.__name__ + "_Remote", (ex_type,),
|
new_ex_type = type(ex_type.__name__ + "_Remote", (ex_type,),
|
||||||
{'__str__': str_override, '__unicode__': str_override})
|
{'__str__': str_override, '__unicode__': str_override})
|
||||||
try:
|
try:
|
||||||
|
@ -422,6 +425,7 @@ class ClientException(Exception):
|
||||||
hit by an RPC proxy object. Merely instantiating it records the
|
hit by an RPC proxy object. Merely instantiating it records the
|
||||||
current exception information, which will be passed back to the
|
current exception information, which will be passed back to the
|
||||||
RPC client without exceptional logging."""
|
RPC client without exceptional logging."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._exc_info = sys.exc_info()
|
self._exc_info = sys.exc_info()
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ class Consumer(object):
|
||||||
# Caller might have called ctxt.reply() manually
|
# Caller might have called ctxt.reply() manually
|
||||||
for (reply, failure) in ctxt._response:
|
for (reply, failure) in ctxt._response:
|
||||||
if failure:
|
if failure:
|
||||||
raise_(failure[0],failure[1],failure[2])
|
raise_(failure[0], failure[1], failure[2])
|
||||||
res.append(reply)
|
res.append(reply)
|
||||||
# if ending not 'sent'...we might have more data to
|
# if ending not 'sent'...we might have more data to
|
||||||
# return from the function itself
|
# return from the function itself
|
||||||
|
|
|
@ -322,6 +322,7 @@ class Publisher(object):
|
||||||
|
|
||||||
class DirectPublisher(Publisher):
|
class DirectPublisher(Publisher):
|
||||||
"""Publisher class for 'direct'"""
|
"""Publisher class for 'direct'"""
|
||||||
|
|
||||||
def __init__(self, conf, channel, msg_id, **kwargs):
|
def __init__(self, conf, channel, msg_id, **kwargs):
|
||||||
"""init a 'direct' publisher.
|
"""init a 'direct' publisher.
|
||||||
|
|
||||||
|
@ -338,6 +339,7 @@ class DirectPublisher(Publisher):
|
||||||
|
|
||||||
class TopicPublisher(Publisher):
|
class TopicPublisher(Publisher):
|
||||||
"""Publisher class for 'topic'"""
|
"""Publisher class for 'topic'"""
|
||||||
|
|
||||||
def __init__(self, conf, channel, topic, **kwargs):
|
def __init__(self, conf, channel, topic, **kwargs):
|
||||||
"""init a 'topic' publisher.
|
"""init a 'topic' publisher.
|
||||||
|
|
||||||
|
@ -357,6 +359,7 @@ class TopicPublisher(Publisher):
|
||||||
|
|
||||||
class FanoutPublisher(Publisher):
|
class FanoutPublisher(Publisher):
|
||||||
"""Publisher class for 'fanout'"""
|
"""Publisher class for 'fanout'"""
|
||||||
|
|
||||||
def __init__(self, conf, channel, topic, **kwargs):
|
def __init__(self, conf, channel, topic, **kwargs):
|
||||||
"""init a 'fanout' publisher.
|
"""init a 'fanout' publisher.
|
||||||
|
|
||||||
|
@ -482,7 +485,7 @@ class Connection(object):
|
||||||
"""
|
"""
|
||||||
if self.connection:
|
if self.connection:
|
||||||
LOG.info(_("Reconnecting to AMQP server on "
|
LOG.info(_("Reconnecting to AMQP server on "
|
||||||
"%(hostname)s:%(port)d") % params)
|
"%(hostname)s:%(port)d") % params)
|
||||||
try:
|
try:
|
||||||
self.connection.release()
|
self.connection.release()
|
||||||
except self.connection_errors:
|
except self.connection_errors:
|
||||||
|
@ -612,7 +615,7 @@ class Connection(object):
|
||||||
def _connect_error(exc):
|
def _connect_error(exc):
|
||||||
log_info = {'topic': topic, 'err_str': str(exc)}
|
log_info = {'topic': topic, 'err_str': str(exc)}
|
||||||
LOG.error(_("Failed to declare consumer for topic '%(topic)s': "
|
LOG.error(_("Failed to declare consumer for topic '%(topic)s': "
|
||||||
"%(err_str)s") % log_info)
|
"%(err_str)s") % log_info)
|
||||||
|
|
||||||
def _declare_consumer():
|
def _declare_consumer():
|
||||||
consumer = consumer_cls(self.conf, self.channel, topic, callback,
|
consumer = consumer_cls(self.conf, self.channel, topic, callback,
|
||||||
|
@ -673,7 +676,7 @@ class Connection(object):
|
||||||
def _error_callback(exc):
|
def _error_callback(exc):
|
||||||
log_info = {'topic': topic, 'err_str': str(exc)}
|
log_info = {'topic': topic, 'err_str': str(exc)}
|
||||||
LOG.exception(_("Failed to publish message to topic "
|
LOG.exception(_("Failed to publish message to topic "
|
||||||
"'%(topic)s': %(err_str)s") % log_info)
|
"'%(topic)s': %(err_str)s") % log_info)
|
||||||
|
|
||||||
def _publish():
|
def _publish():
|
||||||
publisher = cls(self.conf, self.channel, topic, **kwargs)
|
publisher = cls(self.conf, self.channel, topic, **kwargs)
|
||||||
|
|
|
@ -239,6 +239,7 @@ class Publisher(object):
|
||||||
|
|
||||||
class DirectPublisher(Publisher):
|
class DirectPublisher(Publisher):
|
||||||
"""Publisher class for 'direct'"""
|
"""Publisher class for 'direct'"""
|
||||||
|
|
||||||
def __init__(self, conf, session, msg_id):
|
def __init__(self, conf, session, msg_id):
|
||||||
"""Init a 'direct' publisher."""
|
"""Init a 'direct' publisher."""
|
||||||
super(DirectPublisher, self).__init__(session, msg_id,
|
super(DirectPublisher, self).__init__(session, msg_id,
|
||||||
|
@ -247,6 +248,7 @@ class DirectPublisher(Publisher):
|
||||||
|
|
||||||
class TopicPublisher(Publisher):
|
class TopicPublisher(Publisher):
|
||||||
"""Publisher class for 'topic'"""
|
"""Publisher class for 'topic'"""
|
||||||
|
|
||||||
def __init__(self, conf, session, topic):
|
def __init__(self, conf, session, topic):
|
||||||
"""init a 'topic' publisher.
|
"""init a 'topic' publisher.
|
||||||
"""
|
"""
|
||||||
|
@ -257,6 +259,7 @@ class TopicPublisher(Publisher):
|
||||||
|
|
||||||
class FanoutPublisher(Publisher):
|
class FanoutPublisher(Publisher):
|
||||||
"""Publisher class for 'fanout'"""
|
"""Publisher class for 'fanout'"""
|
||||||
|
|
||||||
def __init__(self, conf, session, topic):
|
def __init__(self, conf, session, topic):
|
||||||
"""init a 'fanout' publisher.
|
"""init a 'fanout' publisher.
|
||||||
"""
|
"""
|
||||||
|
@ -267,6 +270,7 @@ class FanoutPublisher(Publisher):
|
||||||
|
|
||||||
class NotifyPublisher(Publisher):
|
class NotifyPublisher(Publisher):
|
||||||
"""Publisher class for notifications"""
|
"""Publisher class for notifications"""
|
||||||
|
|
||||||
def __init__(self, conf, session, topic):
|
def __init__(self, conf, session, topic):
|
||||||
"""init a 'topic' publisher.
|
"""init a 'topic' publisher.
|
||||||
"""
|
"""
|
||||||
|
@ -406,7 +410,7 @@ class Connection(object):
|
||||||
def _connect_error(exc):
|
def _connect_error(exc):
|
||||||
log_info = {'topic': topic, 'err_str': str(exc)}
|
log_info = {'topic': topic, 'err_str': str(exc)}
|
||||||
LOG.error(_("Failed to declare consumer for topic '%(topic)s': "
|
LOG.error(_("Failed to declare consumer for topic '%(topic)s': "
|
||||||
"%(err_str)s") % log_info)
|
"%(err_str)s") % log_info)
|
||||||
|
|
||||||
def _declare_consumer():
|
def _declare_consumer():
|
||||||
consumer = consumer_cls(self.conf, self.session, topic, callback)
|
consumer = consumer_cls(self.conf, self.session, topic, callback)
|
||||||
|
@ -460,7 +464,7 @@ class Connection(object):
|
||||||
def _connect_error(exc):
|
def _connect_error(exc):
|
||||||
log_info = {'topic': topic, 'err_str': str(exc)}
|
log_info = {'topic': topic, 'err_str': str(exc)}
|
||||||
LOG.exception(_("Failed to publish message to topic "
|
LOG.exception(_("Failed to publish message to topic "
|
||||||
"'%(topic)s': %(err_str)s") % log_info)
|
"'%(topic)s': %(err_str)s") % log_info)
|
||||||
|
|
||||||
def _publisher_send():
|
def _publisher_send():
|
||||||
publisher = cls(self.conf, self.session, topic)
|
publisher = cls(self.conf, self.session, topic)
|
||||||
|
|
|
@ -228,13 +228,13 @@ class ZmqClient(object):
|
||||||
|
|
||||||
if not envelope:
|
if not envelope:
|
||||||
self.outq.send(map(bytes,
|
self.outq.send(map(bytes,
|
||||||
(msg_id, topic, 'cast', _serialize(data))))
|
(msg_id, topic, 'cast', _serialize(data))))
|
||||||
return
|
return
|
||||||
|
|
||||||
rpc_envelope = rpc_common.serialize_msg(data[1], envelope)
|
rpc_envelope = rpc_common.serialize_msg(data[1], envelope)
|
||||||
zmq_msg = reduce(lambda x, y: x + y, rpc_envelope.items())
|
zmq_msg = reduce(lambda x, y: x + y, rpc_envelope.items())
|
||||||
self.outq.send(map(bytes,
|
self.outq.send(map(bytes,
|
||||||
(msg_id, topic, 'impl_zmq_v2', data[0]) + zmq_msg))
|
(msg_id, topic, 'impl_zmq_v2', data[0]) + zmq_msg))
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.outq.close()
|
self.outq.close()
|
||||||
|
@ -242,6 +242,7 @@ class ZmqClient(object):
|
||||||
|
|
||||||
class RpcContext(rpc_common.CommonRpcContext):
|
class RpcContext(rpc_common.CommonRpcContext):
|
||||||
"""Context that supports replying to a rpc.call."""
|
"""Context that supports replying to a rpc.call."""
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
self.replies = []
|
self.replies = []
|
||||||
super(RpcContext, self).__init__(**kwargs)
|
super(RpcContext, self).__init__(**kwargs)
|
||||||
|
@ -331,7 +332,7 @@ class ConsumerBase(object):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def normalize_reply(self, result, replies):
|
def normalize_reply(self, result, replies):
|
||||||
#TODO(ewindisch): re-evaluate and document this method.
|
# TODO(ewindisch): re-evaluate and document this method.
|
||||||
if isinstance(result, types.GeneratorType):
|
if isinstance(result, types.GeneratorType):
|
||||||
return list(result)
|
return list(result)
|
||||||
elif replies:
|
elif replies:
|
||||||
|
@ -451,7 +452,7 @@ class ZmqProxy(ZmqBaseReactor):
|
||||||
def consume(self, sock):
|
def consume(self, sock):
|
||||||
ipc_dir = CONF.rpc_zmq_ipc_dir
|
ipc_dir = CONF.rpc_zmq_ipc_dir
|
||||||
|
|
||||||
#TODO(ewindisch): use zero-copy (i.e. references, not copying)
|
# TODO(ewindisch): use zero-copy (i.e. references, not copying)
|
||||||
data = sock.recv()
|
data = sock.recv()
|
||||||
topic = data[1]
|
topic = data[1]
|
||||||
|
|
||||||
|
@ -576,7 +577,7 @@ class ZmqReactor(ZmqBaseReactor):
|
||||||
super(ZmqReactor, self).__init__(conf)
|
super(ZmqReactor, self).__init__(conf)
|
||||||
|
|
||||||
def consume(self, sock):
|
def consume(self, sock):
|
||||||
#TODO(ewindisch): use zero-copy (i.e. references, not copying)
|
# TODO(ewindisch): use zero-copy (i.e. references, not copying)
|
||||||
data = sock.recv()
|
data = sock.recv()
|
||||||
LOG.debug(_("CONSUMER RECEIVED DATA: %s"), data)
|
LOG.debug(_("CONSUMER RECEIVED DATA: %s"), data)
|
||||||
if sock in self.mapping:
|
if sock in self.mapping:
|
||||||
|
|
|
@ -56,6 +56,7 @@ class Exchange(object):
|
||||||
Implements lookups.
|
Implements lookups.
|
||||||
Subclass this to support hashtables, dns, etc.
|
Subclass this to support hashtables, dns, etc.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -67,6 +68,7 @@ class Binding(object):
|
||||||
"""
|
"""
|
||||||
A binding on which to perform a lookup.
|
A binding on which to perform a lookup.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -80,6 +82,7 @@ class MatchMakerBase(object):
|
||||||
Build off HeartbeatMatchMakerBase if building a
|
Build off HeartbeatMatchMakerBase if building a
|
||||||
heartbeat-capable MatchMaker.
|
heartbeat-capable MatchMaker.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# Array of tuples. Index [2] toggles negation, [3] is last-if-true
|
# Array of tuples. Index [2] toggles negation, [3] is last-if-true
|
||||||
self.bindings = []
|
self.bindings = []
|
||||||
|
@ -145,9 +148,9 @@ class MatchMakerBase(object):
|
||||||
def add_binding(self, binding, rule, last=True):
|
def add_binding(self, binding, rule, last=True):
|
||||||
self.bindings.append((binding, rule, False, last))
|
self.bindings.append((binding, rule, False, last))
|
||||||
|
|
||||||
#NOTE(ewindisch): kept the following method in case we implement the
|
# NOTE(ewindisch): kept the following method in case we implement the
|
||||||
# underlying support.
|
# underlying support.
|
||||||
#def add_negate_binding(self, binding, rule, last=True):
|
# def add_negate_binding(self, binding, rule, last=True):
|
||||||
# self.bindings.append((binding, rule, True, last))
|
# self.bindings.append((binding, rule, True, last))
|
||||||
|
|
||||||
def queues(self, key):
|
def queues(self, key):
|
||||||
|
@ -155,7 +158,7 @@ class MatchMakerBase(object):
|
||||||
|
|
||||||
# bit is for negate bindings - if we choose to implement it.
|
# bit is for negate bindings - if we choose to implement it.
|
||||||
# last stops processing rules if this matches.
|
# last stops processing rules if this matches.
|
||||||
for (binding, exchange, bit, last) in self.bindings:
|
for (binding, exchange, _bit, last) in self.bindings:
|
||||||
if binding.test(key):
|
if binding.test(key):
|
||||||
workers.extend(exchange.run(key))
|
workers.extend(exchange.run(key))
|
||||||
|
|
||||||
|
@ -171,6 +174,7 @@ class HeartbeatMatchMakerBase(MatchMakerBase):
|
||||||
Provides common methods for registering,
|
Provides common methods for registering,
|
||||||
unregistering, and maintaining heartbeats.
|
unregistering, and maintaining heartbeats.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.hosts = set()
|
self.hosts = set()
|
||||||
self._heart = None
|
self._heart = None
|
||||||
|
@ -269,6 +273,7 @@ class DirectBinding(Binding):
|
||||||
Although dots are used in the key, the behavior here is
|
Although dots are used in the key, the behavior here is
|
||||||
that it maps directly to a host, thus direct.
|
that it maps directly to a host, thus direct.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def test(self, key):
|
def test(self, key):
|
||||||
if '.' in key:
|
if '.' in key:
|
||||||
return True
|
return True
|
||||||
|
@ -283,6 +288,7 @@ class TopicBinding(Binding):
|
||||||
that of a topic exchange (whereas where there are dots, behavior
|
that of a topic exchange (whereas where there are dots, behavior
|
||||||
matches that of a direct exchange.
|
matches that of a direct exchange.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def test(self, key):
|
def test(self, key):
|
||||||
if '.' not in key:
|
if '.' not in key:
|
||||||
return True
|
return True
|
||||||
|
@ -291,6 +297,7 @@ class TopicBinding(Binding):
|
||||||
|
|
||||||
class FanoutBinding(Binding):
|
class FanoutBinding(Binding):
|
||||||
"""Match on fanout keys, where key starts with 'fanout.' string."""
|
"""Match on fanout keys, where key starts with 'fanout.' string."""
|
||||||
|
|
||||||
def test(self, key):
|
def test(self, key):
|
||||||
if key.startswith('fanout~'):
|
if key.startswith('fanout~'):
|
||||||
return True
|
return True
|
||||||
|
@ -299,12 +306,14 @@ class FanoutBinding(Binding):
|
||||||
|
|
||||||
class StubExchange(Exchange):
|
class StubExchange(Exchange):
|
||||||
"""Exchange that does nothing."""
|
"""Exchange that does nothing."""
|
||||||
|
|
||||||
def run(self, key):
|
def run(self, key):
|
||||||
return [(key, None)]
|
return [(key, None)]
|
||||||
|
|
||||||
|
|
||||||
class LocalhostExchange(Exchange):
|
class LocalhostExchange(Exchange):
|
||||||
"""Exchange where all direct topics are local."""
|
"""Exchange where all direct topics are local."""
|
||||||
|
|
||||||
def __init__(self, host='localhost'):
|
def __init__(self, host='localhost'):
|
||||||
self.host = host
|
self.host = host
|
||||||
super(Exchange, self).__init__()
|
super(Exchange, self).__init__()
|
||||||
|
@ -318,6 +327,7 @@ class DirectExchange(Exchange):
|
||||||
Exchange where all topic keys are split, sending to second half.
|
Exchange where all topic keys are split, sending to second half.
|
||||||
i.e. "compute.host" sends a message to "compute.host" running on "host"
|
i.e. "compute.host" sends a message to "compute.host" running on "host"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Exchange, self).__init__()
|
super(Exchange, self).__init__()
|
||||||
|
|
||||||
|
@ -331,6 +341,7 @@ class MatchMakerLocalhost(MatchMakerBase):
|
||||||
Match Maker where all bare topics resolve to localhost.
|
Match Maker where all bare topics resolve to localhost.
|
||||||
Useful for testing.
|
Useful for testing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, host='localhost'):
|
def __init__(self, host='localhost'):
|
||||||
super(MatchMakerLocalhost, self).__init__()
|
super(MatchMakerLocalhost, self).__init__()
|
||||||
self.add_binding(FanoutBinding(), LocalhostExchange(host))
|
self.add_binding(FanoutBinding(), LocalhostExchange(host))
|
||||||
|
@ -344,6 +355,7 @@ class MatchMakerStub(MatchMakerBase):
|
||||||
Useful for testing, or for AMQP/brokered queues.
|
Useful for testing, or for AMQP/brokered queues.
|
||||||
Will not work where knowledge of hosts is known (i.e. zeromq)
|
Will not work where knowledge of hosts is known (i.e. zeromq)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(MatchMakerLocalhost, self).__init__()
|
super(MatchMakerLocalhost, self).__init__()
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ class RedisTopicExchange(RedisExchange):
|
||||||
Exchange where all topic keys are split, sending to second half.
|
Exchange where all topic keys are split, sending to second half.
|
||||||
i.e. "compute.host" sends a message to "compute" running on "host"
|
i.e. "compute.host" sends a message to "compute" running on "host"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def run(self, topic):
|
def run(self, topic):
|
||||||
while True:
|
while True:
|
||||||
member_name = self.redis.srandmember(topic)
|
member_name = self.redis.srandmember(topic)
|
||||||
|
@ -84,11 +85,12 @@ class RedisFanoutExchange(RedisExchange):
|
||||||
"""
|
"""
|
||||||
Return a list of all hosts.
|
Return a list of all hosts.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def run(self, topic):
|
def run(self, topic):
|
||||||
topic = topic.split('~', 1)[1]
|
topic = topic.split('~', 1)[1]
|
||||||
hosts = self.redis.smembers(topic)
|
hosts = self.redis.smembers(topic)
|
||||||
good_hosts = [host for host in hosts if
|
good_hosts = [host for host in hosts if
|
||||||
self.matchmaker.is_alive(topic, host)]
|
self.matchmaker.is_alive(topic, host)]
|
||||||
|
|
||||||
return [(x, x.split('.', 1)[1]) for x in good_hosts]
|
return [(x, x.split('.', 1)[1]) for x in good_hosts]
|
||||||
|
|
||||||
|
@ -97,6 +99,7 @@ class MatchMakerRedis(mm_common.HeartbeatMatchMakerBase):
|
||||||
"""
|
"""
|
||||||
MatchMaker registering and looking-up hosts with a Redis server.
|
MatchMaker registering and looking-up hosts with a Redis server.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(MatchMakerRedis, self).__init__()
|
super(MatchMakerRedis, self).__init__()
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ class RingExchange(mm.Exchange):
|
||||||
__init__ takes optional ring dictionary argument, otherwise
|
__init__ takes optional ring dictionary argument, otherwise
|
||||||
loads the ringfile from CONF.mathcmaker_ringfile.
|
loads the ringfile from CONF.mathcmaker_ringfile.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, ring=None):
|
def __init__(self, ring=None):
|
||||||
super(RingExchange, self).__init__()
|
super(RingExchange, self).__init__()
|
||||||
|
|
||||||
|
@ -76,6 +77,7 @@ class RingExchange(mm.Exchange):
|
||||||
|
|
||||||
class RoundRobinRingExchange(RingExchange):
|
class RoundRobinRingExchange(RingExchange):
|
||||||
"""A Topic Exchange based on a hashmap."""
|
"""A Topic Exchange based on a hashmap."""
|
||||||
|
|
||||||
def __init__(self, ring=None):
|
def __init__(self, ring=None):
|
||||||
super(RoundRobinRingExchange, self).__init__(ring)
|
super(RoundRobinRingExchange, self).__init__(ring)
|
||||||
|
|
||||||
|
@ -92,6 +94,7 @@ class RoundRobinRingExchange(RingExchange):
|
||||||
|
|
||||||
class FanoutRingExchange(RingExchange):
|
class FanoutRingExchange(RingExchange):
|
||||||
"""Fanout Exchange based on a hashmap."""
|
"""Fanout Exchange based on a hashmap."""
|
||||||
|
|
||||||
def __init__(self, ring=None):
|
def __init__(self, ring=None):
|
||||||
super(FanoutRingExchange, self).__init__(ring)
|
super(FanoutRingExchange, self).__init__(ring)
|
||||||
|
|
||||||
|
@ -111,6 +114,7 @@ class MatchMakerRing(mm.MatchMakerBase):
|
||||||
"""
|
"""
|
||||||
Match Maker where hosts are loaded from a static hashmap.
|
Match Maker where hosts are loaded from a static hashmap.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, ring=None):
|
def __init__(self, ring=None):
|
||||||
super(MatchMakerRing, self).__init__()
|
super(MatchMakerRing, self).__init__()
|
||||||
self.add_binding(mm.FanoutBinding(), FanoutRingExchange(ring))
|
self.add_binding(mm.FanoutBinding(), FanoutRingExchange(ring))
|
||||||
|
|
|
@ -35,6 +35,7 @@ class Service(service.Service):
|
||||||
"""Service object for binaries running on hosts.
|
"""Service object for binaries running on hosts.
|
||||||
|
|
||||||
A service enables rpc by listening to queues based on topic and host."""
|
A service enables rpc by listening to queues based on topic and host."""
|
||||||
|
|
||||||
def __init__(self, host, topic, manager=None, serializer=None):
|
def __init__(self, host, topic, manager=None, serializer=None):
|
||||||
super(Service, self).__init__()
|
super(Service, self).__init__()
|
||||||
self.host = host
|
self.host = host
|
||||||
|
|
|
@ -82,12 +82,12 @@ def parse_requirements(requirements_files=['requirements.txt',
|
||||||
# -e git://github.com/openstack/nova/master#egg=nova
|
# -e git://github.com/openstack/nova/master#egg=nova
|
||||||
if re.match(r'\s*-e\s+', line):
|
if re.match(r'\s*-e\s+', line):
|
||||||
requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
|
requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
|
||||||
line))
|
line))
|
||||||
# such as:
|
# such as:
|
||||||
# http://github.com/openstack/nova/zipball/master#egg=nova
|
# http://github.com/openstack/nova/zipball/master#egg=nova
|
||||||
elif re.match(r'\s*https?:', line):
|
elif re.match(r'\s*https?:', line):
|
||||||
requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1',
|
requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1',
|
||||||
line))
|
line))
|
||||||
# -f lines are for index locations, and don't get used here
|
# -f lines are for index locations, and don't get used here
|
||||||
elif re.match(r'\s*-f\s+', line):
|
elif re.match(r'\s*-f\s+', line):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -42,6 +42,7 @@ class Thread(object):
|
||||||
:class:`ThreadGroup`. The Thread will notify the :class:`ThreadGroup` when
|
:class:`ThreadGroup`. The Thread will notify the :class:`ThreadGroup` when
|
||||||
it has done so it can be removed from the threads list.
|
it has done so it can be removed from the threads list.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, thread, group):
|
def __init__(self, thread, group):
|
||||||
self.thread = thread
|
self.thread = thread
|
||||||
self.thread.link(_thread_done, group=group, thread=self)
|
self.thread.link(_thread_done, group=group, thread=self)
|
||||||
|
@ -60,6 +61,7 @@ class ThreadGroup(object):
|
||||||
when need be).
|
when need be).
|
||||||
* provide an easy API to add timers.
|
* provide an easy API to add timers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, thread_pool_size=10):
|
def __init__(self, thread_pool_size=10):
|
||||||
self.pool = greenpool.GreenPool(thread_pool_size)
|
self.pool = greenpool.GreenPool(thread_pool_size)
|
||||||
self.threads = []
|
self.threads = []
|
||||||
|
|
|
@ -52,9 +52,9 @@ def parse_isotime(timestr):
|
||||||
try:
|
try:
|
||||||
return iso8601.parse_date(timestr)
|
return iso8601.parse_date(timestr)
|
||||||
except iso8601.ParseError as e:
|
except iso8601.ParseError as e:
|
||||||
raise ValueError(e.message)
|
raise ValueError(str(e))
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
raise ValueError(e.message)
|
raise ValueError(str(e))
|
||||||
|
|
||||||
|
|
||||||
def strtime(at=None, fmt=PERFECT_TIME_FORMAT):
|
def strtime(at=None, fmt=PERFECT_TIME_FORMAT):
|
||||||
|
@ -124,7 +124,7 @@ def set_time_override(override_time=datetime.datetime.utcnow()):
|
||||||
|
|
||||||
def advance_time_delta(timedelta):
|
def advance_time_delta(timedelta):
|
||||||
"""Advance overridden time using a datetime.timedelta."""
|
"""Advance overridden time using a datetime.timedelta."""
|
||||||
assert(not utcnow.override_time is None)
|
assert(utcnow.override_time is not None)
|
||||||
try:
|
try:
|
||||||
for dt in utcnow.override_time:
|
for dt in utcnow.override_time:
|
||||||
dt += timedelta
|
dt += timedelta
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
from sm_client.common import utils
|
from sm_client.common import utils
|
||||||
from keystoneclient.v3 import client as ksclient
|
from keystoneclient.v3 import client as ksclient
|
||||||
|
|
||||||
|
|
||||||
def _get_ksclient(**kwargs):
|
def _get_ksclient(**kwargs):
|
||||||
"""Get an endpoint and auth token from Keystone.
|
"""Get an endpoint and auth token from Keystone.
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,7 @@ class Resource(object):
|
||||||
:param info: dictionary representing resource attributes
|
:param info: dictionary representing resource attributes
|
||||||
:param loaded: prevent lazy-loading if set to True
|
:param loaded: prevent lazy-loading if set to True
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, manager, info, loaded=False):
|
def __init__(self, manager, info, loaded=False):
|
||||||
self.manager = manager
|
self.manager = manager
|
||||||
self._info = info
|
self._info = info
|
||||||
|
|
|
@ -28,7 +28,7 @@ from six.moves.urllib.parse import urlparse
|
||||||
try:
|
try:
|
||||||
import ssl
|
import ssl
|
||||||
except ImportError:
|
except ImportError:
|
||||||
#TODO(bcwaldon): Handle this failure more gracefully
|
# TODO(bcwaldon): Handle this failure more gracefully
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
@ -98,7 +99,7 @@ def print_list(objs, fields, field_labels, formatters={}, sortby=0):
|
||||||
data = getattr(o, field, '')
|
data = getattr(o, field, '')
|
||||||
row.append(data)
|
row.append(data)
|
||||||
pt.add_row(row)
|
pt.add_row(row)
|
||||||
print pt.get_string(sortby=field_labels[sortby])
|
print(pt.get_string(sortby=field_labels[sortby]))
|
||||||
|
|
||||||
|
|
||||||
def print_tuple_list(tuples, tuple_labels=[]):
|
def print_tuple_list(tuples, tuple_labels=[]):
|
||||||
|
@ -111,11 +112,11 @@ def print_tuple_list(tuples, tuple_labels=[]):
|
||||||
if len(t) == 2:
|
if len(t) == 2:
|
||||||
pt.add_row([t[0], t[1]])
|
pt.add_row([t[0], t[1]])
|
||||||
else:
|
else:
|
||||||
for t,l in zip(tuples,tuple_labels):
|
for t, l in zip(tuples, tuple_labels):
|
||||||
if len(t) == 2:
|
if len(t) == 2:
|
||||||
pt.add_row([l, t[1]])
|
pt.add_row([l, t[1]])
|
||||||
|
|
||||||
print pt.get_string()
|
print(pt.get_string())
|
||||||
|
|
||||||
|
|
||||||
def print_mapping(data, fields, dict_property="Property", wrap=0):
|
def print_mapping(data, fields, dict_property="Property", wrap=0):
|
||||||
|
@ -142,7 +143,8 @@ def print_mapping(data, fields, dict_property="Property", wrap=0):
|
||||||
col1 = ''
|
col1 = ''
|
||||||
else:
|
else:
|
||||||
pt.add_row([k, v])
|
pt.add_row([k, v])
|
||||||
print pt.get_string()
|
print(pt.get_string())
|
||||||
|
|
||||||
|
|
||||||
def print_dict(d, fields, dict_property="Property", wrap=0):
|
def print_dict(d, fields, dict_property="Property", wrap=0):
|
||||||
pt = prettytable.PrettyTable([dict_property, 'Value'],
|
pt = prettytable.PrettyTable([dict_property, 'Value'],
|
||||||
|
@ -169,7 +171,7 @@ def print_dict(d, fields, dict_property="Property", wrap=0):
|
||||||
col1 = ''
|
col1 = ''
|
||||||
else:
|
else:
|
||||||
pt.add_row([k, v])
|
pt.add_row([k, v])
|
||||||
print pt.get_string()
|
print(pt.get_string())
|
||||||
|
|
||||||
|
|
||||||
def find_resource(manager, name_or_id):
|
def find_resource(manager, name_or_id):
|
||||||
|
@ -258,5 +260,5 @@ def args_array_to_patch(op, attributes):
|
||||||
|
|
||||||
def exit(msg=''):
|
def exit(msg=''):
|
||||||
if msg:
|
if msg:
|
||||||
print >> sys.stderr, msg
|
print(msg, file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
|
@ -10,6 +10,7 @@ import sys
|
||||||
|
|
||||||
class BaseException(Exception):
|
class BaseException(Exception):
|
||||||
"""An error occurred."""
|
"""An error occurred."""
|
||||||
|
|
||||||
def __init__(self, message=None):
|
def __init__(self, message=None):
|
||||||
self.message = message
|
self.message = message
|
||||||
|
|
||||||
|
@ -164,6 +165,7 @@ class AmbiguousAuthSystem(ClientException):
|
||||||
"""Could not obtain token and endpoint using provided credentials."""
|
"""Could not obtain token and endpoint using provided credentials."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# Alias for backwards compatibility
|
# Alias for backwards compatibility
|
||||||
AmbigiousAuthSystem = AmbiguousAuthSystem
|
AmbigiousAuthSystem = AmbiguousAuthSystem
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ def _import_module(mod_str):
|
||||||
|
|
||||||
def _is_in_group(opt, group):
|
def _is_in_group(opt, group):
|
||||||
"Check if opt is in group."
|
"Check if opt is in group."
|
||||||
for key, value in group._opts.items():
|
for _key, value in group._opts.items():
|
||||||
if value['opt'] == opt:
|
if value['opt'] == opt:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
@ -132,7 +132,7 @@ def _guess_groups(opt, mod_obj):
|
||||||
return 'DEFAULT'
|
return 'DEFAULT'
|
||||||
|
|
||||||
# what other groups is it in?
|
# what other groups is it in?
|
||||||
for key, value in cfg.CONF.items():
|
for _key, value in cfg.CONF.items():
|
||||||
if isinstance(value, cfg.CONF.GroupAttr):
|
if isinstance(value, cfg.CONF.GroupAttr):
|
||||||
if _is_in_group(opt, value._group):
|
if _is_in_group(opt, value._group):
|
||||||
return value._group.name
|
return value._group.name
|
||||||
|
@ -254,5 +254,6 @@ def main():
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
generate(sys.argv[1:])
|
generate(sys.argv[1:])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -79,7 +79,7 @@ def main():
|
||||||
rawconfig.read(configfile)
|
rawconfig.read(configfile)
|
||||||
config = wrapper.RootwrapConfig(rawconfig)
|
config = wrapper.RootwrapConfig(rawconfig)
|
||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
msg = "Incorrect value in %s: %s" % (configfile, exc.message)
|
msg = "Incorrect value in %s: %s" % (configfile, str(exc))
|
||||||
_exit_error(execname, msg, RC_BADCONFIG, log=False)
|
_exit_error(execname, msg, RC_BADCONFIG, log=False)
|
||||||
except configparser.Error:
|
except configparser.Error:
|
||||||
_exit_error(execname, "Incorrect configuration file: %s" % configfile,
|
_exit_error(execname, "Incorrect configuration file: %s" % configfile,
|
||||||
|
|
|
@ -105,7 +105,7 @@ class PathFilter(CommandFilter):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def match(self, userargs):
|
def match(self, userargs):
|
||||||
command, arguments = userargs[0], userargs[1:]
|
arguments = userargs[1:]
|
||||||
|
|
||||||
equal_args_num = len(self.args) == len(arguments)
|
equal_args_num = len(self.args) == len(arguments)
|
||||||
exec_is_valid = super(PathFilter, self).match(userargs)
|
exec_is_valid = super(PathFilter, self).match(userargs)
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from six.moves import configparser
|
from six.moves import configparser
|
||||||
import logging
|
import logging
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
|
@ -40,6 +39,7 @@ class FilterMatchNotExecutable(Exception):
|
||||||
This exception is raised when a filter matched but no executable was
|
This exception is raised when a filter matched but no executable was
|
||||||
found.
|
found.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, match=None, **kwargs):
|
def __init__(self, match=None, **kwargs):
|
||||||
self.match = match
|
self.match = match
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
"""
|
"""
|
||||||
Command-line interface for Service Manager (SM)
|
Command-line interface for Service Manager (SM)
|
||||||
"""
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
import argparse
|
import argparse
|
||||||
import httplib2
|
import httplib2
|
||||||
import logging
|
import logging
|
||||||
|
@ -131,7 +131,7 @@ class SmcShell(object):
|
||||||
|
|
||||||
parser.add_argument('--smc-api-version',
|
parser.add_argument('--smc-api-version',
|
||||||
default=utils.env(
|
default=utils.env(
|
||||||
'SMC_API_VERSION', default='1'),
|
'SMC_API_VERSION', default='1'),
|
||||||
help='Defaults to env[SMC_API_VERSION] '
|
help='Defaults to env[SMC_API_VERSION] '
|
||||||
'or 1')
|
'or 1')
|
||||||
|
|
||||||
|
@ -203,8 +203,8 @@ class SmcShell(object):
|
||||||
httplib2.debuglevel = 1
|
httplib2.debuglevel = 1
|
||||||
else:
|
else:
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
format="%(levelname)s %(message)s",
|
format="%(levelname)s %(message)s",
|
||||||
level=logging.CRITICAL)
|
level=logging.CRITICAL)
|
||||||
|
|
||||||
def main(self, argv):
|
def main(self, argv):
|
||||||
# Parse args once to find version
|
# Parse args once to find version
|
||||||
|
@ -249,7 +249,7 @@ class SmcShell(object):
|
||||||
|
|
||||||
client = cgclient.get_client(api_version, **(args.__dict__))
|
client = cgclient.get_client(api_version, **(args.__dict__))
|
||||||
|
|
||||||
nargs = args.__dict__
|
# nargs = args.__dict__
|
||||||
# nargs['neutron_endpoint'] = client.neutron_endpoint
|
# nargs['neutron_endpoint'] = client.neutron_endpoint
|
||||||
# client.neutronClient = get_neutron_client(**nargs)
|
# client.neutronClient = get_neutron_client(**nargs)
|
||||||
|
|
||||||
|
@ -284,8 +284,9 @@ def main():
|
||||||
SmcShell().main(sys.argv[1:])
|
SmcShell().main(sys.argv[1:])
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print >> sys.stderr, e
|
print(e, file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -16,7 +16,7 @@ COMMAND_MODULES = [
|
||||||
smc_service_shell,
|
smc_service_shell,
|
||||||
smc_service_node_shell,
|
smc_service_node_shell,
|
||||||
smc_servicegroup_shell,
|
smc_servicegroup_shell,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def enhance_parser(parser, subparsers, cmd_mapper):
|
def enhance_parser(parser, subparsers, cmd_mapper):
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
from sm_client import exc
|
|
||||||
from sm_client.common import base
|
from sm_client.common import base
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
from sm_client import exc
|
|
||||||
from sm_client.common import base
|
from sm_client.common import base
|
||||||
|
|
||||||
|
|
||||||
class SmcNode(base.Resource):
|
class SmcNode(base.Resource):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<SmcNode %s>" % self._info
|
return "<SmcNode %s>" % self._info
|
||||||
|
|
|
@ -16,6 +16,7 @@ def _print_sm_service_node_show(node):
|
||||||
'availability_status', 'ready_state']
|
'availability_status', 'ready_state']
|
||||||
utils.print_mapping(node, fields, wrap=72)
|
utils.print_mapping(node, fields, wrap=72)
|
||||||
|
|
||||||
|
|
||||||
def do_servicenode_list(cc, args):
|
def do_servicenode_list(cc, args):
|
||||||
"""List Service Nodes."""
|
"""List Service Nodes."""
|
||||||
try:
|
try:
|
||||||
|
@ -44,6 +45,6 @@ def do_servicenode_show(cc, args):
|
||||||
"requires 'admin' level")
|
"requires 'admin' level")
|
||||||
else:
|
else:
|
||||||
if node is None:
|
if node is None:
|
||||||
print "Service node %s could not be found" % args.node
|
print("Service node %s could not be found" % args.node)
|
||||||
return
|
return
|
||||||
_print_sm_service_node_show(node)
|
_print_sm_service_node_show(node)
|
||||||
|
|
|
@ -53,7 +53,7 @@ def do_service_show(cc, args):
|
||||||
"requires 'admin' level")
|
"requires 'admin' level")
|
||||||
else:
|
else:
|
||||||
if service is None:
|
if service is None:
|
||||||
print "Service %s could not be found" % args.service
|
print("Service %s could not be found" % args.service)
|
||||||
return
|
return
|
||||||
if service.status:
|
if service.status:
|
||||||
setattr(service, 'state', service.state + '-' + service.status)
|
setattr(service, 'state', service.state + '-' + service.status)
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
from sm_client import exc
|
|
||||||
from sm_client.common import base
|
from sm_client.common import base
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ def do_servicegroup_show(cc, args):
|
||||||
"requires 'admin' level")
|
"requires 'admin' level")
|
||||||
else:
|
else:
|
||||||
if servicegroup is None:
|
if servicegroup is None:
|
||||||
print "Service group %s could not be found" % args.servicegroup
|
print("Service group %s could not be found" % args.servicegroup)
|
||||||
return
|
return
|
||||||
if servicegroup.status:
|
if servicegroup.status:
|
||||||
setattr(servicegroup, 'state', servicegroup.state + '-' +
|
setattr(servicegroup, 'state', servicegroup.state + '-' +
|
||||||
|
|
|
@ -101,7 +101,7 @@ class InstallVenv(object):
|
||||||
print('Creating venv...', end=' ')
|
print('Creating venv...', end=' ')
|
||||||
if no_site_packages:
|
if no_site_packages:
|
||||||
self.run_command(['virtualenv', '-q', '--no-site-packages',
|
self.run_command(['virtualenv', '-q', '--no-site-packages',
|
||||||
self.venv])
|
self.venv])
|
||||||
else:
|
else:
|
||||||
self.run_command(['virtualenv', '-q', self.venv])
|
self.run_command(['virtualenv', '-q', self.venv])
|
||||||
print('done.')
|
print('done.')
|
||||||
|
@ -111,7 +111,7 @@ class InstallVenv(object):
|
||||||
|
|
||||||
def pip_install(self, *args):
|
def pip_install(self, *args):
|
||||||
self.run_command(['tools/with_venv.sh',
|
self.run_command(['tools/with_venv.sh',
|
||||||
'pip', 'install', '--upgrade'] + list(args),
|
'pip', 'install', '--upgrade'] + list(args),
|
||||||
redirect_output=False)
|
redirect_output=False)
|
||||||
|
|
||||||
def install_dependencies(self):
|
def install_dependencies(self):
|
||||||
|
@ -142,7 +142,7 @@ class Distro(InstallVenv):
|
||||||
|
|
||||||
def check_cmd(self, cmd):
|
def check_cmd(self, cmd):
|
||||||
return bool(self.run_command(['which', cmd],
|
return bool(self.run_command(['which', cmd],
|
||||||
check_exit_code=False).strip())
|
check_exit_code=False).strip())
|
||||||
|
|
||||||
def install_virtualenv(self):
|
def install_virtualenv(self):
|
||||||
if self.check_cmd('virtualenv'):
|
if self.check_cmd('virtualenv'):
|
||||||
|
|
|
@ -49,7 +49,7 @@ def main():
|
||||||
si_parser.add_argument('parameters', help='instance parameters')
|
si_parser.add_argument('parameters', help='instance parameters')
|
||||||
|
|
||||||
sys_parser = subparsers.add_parser('system',
|
sys_parser = subparsers.add_parser('system',
|
||||||
help='system Configuration')
|
help='system Configuration')
|
||||||
sys_parser.set_defaults(which='system')
|
sys_parser.set_defaults(which='system')
|
||||||
sys_parser.add_argument(
|
sys_parser.add_argument(
|
||||||
"--cpe_mode", choices=[cpe_duplex, cpe_duplex_direct],
|
"--cpe_mode", choices=[cpe_duplex, cpe_duplex_direct],
|
||||||
|
|
|
@ -20,7 +20,7 @@ def get_pid(pid_file):
|
||||||
pid = f.readline().strip('\n ')
|
pid = f.readline().strip('\n ')
|
||||||
try:
|
try:
|
||||||
pid = int(pid)
|
pid = int(pid)
|
||||||
except:
|
except Exception as e:
|
||||||
pid = -1
|
pid = -1
|
||||||
return pid
|
return pid
|
||||||
return -1
|
return -1
|
||||||
|
@ -39,7 +39,7 @@ def get_process_name(pid):
|
||||||
name = ntpath.basename(cmd_line[1])
|
name = ntpath.basename(cmd_line[1])
|
||||||
|
|
||||||
return name
|
return name
|
||||||
except:
|
except Exception as e:
|
||||||
# most likely it is a leftover pid
|
# most likely it is a leftover pid
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ def main():
|
||||||
pid_file = row[5]
|
pid_file = row[5]
|
||||||
pid = get_pid(pid_file)
|
pid = get_pid(pid_file)
|
||||||
pn = get_process_name(pid)
|
pn = get_process_name(pid)
|
||||||
msg = "%-32s %-20s %-20s " % (row[0], row[1],row[2])
|
msg = "%-32s %-20s %-20s " % (row[0], row[1], row[2])
|
||||||
if args.impact:
|
if args.impact:
|
||||||
msg += "%-10s" % (row[6])
|
msg += "%-10s" % (row[6])
|
||||||
if args.pid:
|
if args.pid:
|
||||||
|
@ -122,7 +122,7 @@ def main():
|
||||||
if args.pid_file:
|
if args.pid_file:
|
||||||
msg += "%-25s" % (pid_file)
|
msg += "%-25s" % (pid_file)
|
||||||
msg += "%-10s %20s" % (row[3], row[4])
|
msg += "%-10s %20s" % (row[3], row[4])
|
||||||
print msg
|
print(msg)
|
||||||
|
|
||||||
print("%s" % ('-' * len))
|
print("%s" % ('-' * len))
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ def main():
|
||||||
pid_file = row[4]
|
pid_file = row[4]
|
||||||
pid = get_pid(pid_file)
|
pid = get_pid(pid_file)
|
||||||
pn = get_process_name(pid)
|
pn = get_process_name(pid)
|
||||||
msg = "%-32s %-20s %-20s " % (row[0], row[1],row[2])
|
msg = "%-32s %-20s %-20s " % (row[0], row[1], row[2])
|
||||||
if args.impact:
|
if args.impact:
|
||||||
msg += "%-10s" % (row[5])
|
msg += "%-10s" % (row[5])
|
||||||
if args.pid:
|
if args.pid:
|
||||||
|
@ -193,9 +193,9 @@ def main():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
sys.stdout.close()
|
sys.stdout.close()
|
||||||
except:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
sys.stderr.close()
|
sys.stderr.close()
|
||||||
except:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -64,7 +64,7 @@ def main():
|
||||||
|
|
||||||
cursor.execute("SELECT NAME, DESIRED_STATE, STATE FROM "
|
cursor.execute("SELECT NAME, DESIRED_STATE, STATE FROM "
|
||||||
"SERVICE_GROUPS WHERE NAME IN (%s) AND PROVISIONED='yes';"
|
"SERVICE_GROUPS WHERE NAME IN (%s) AND PROVISIONED='yes';"
|
||||||
% ','.join("'%s'"%i for i in args.service_group_name))
|
% ','.join("'%s'" % i for i in args.service_group_name))
|
||||||
|
|
||||||
rows = cursor.fetchall()
|
rows = cursor.fetchall()
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ def main():
|
||||||
not_found_list.append(g)
|
not_found_list.append(g)
|
||||||
|
|
||||||
if len(not_found_list) > 1:
|
if len(not_found_list) > 1:
|
||||||
print("%s are not provisioned"%','.join( (g for g in not_found_list)))
|
print("%s are not provisioned" % ','.join((g for g in not_found_list)))
|
||||||
elif len(not_found_list) == 1:
|
elif len(not_found_list) == 1:
|
||||||
print("%s is not provisioned" % ','.join((g for g in not_found_list)))
|
print("%s is not provisioned" % ','.join((g for g in not_found_list)))
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
# SERVICE_GROUP_AGGREGATE_DESIRED_STATE=<service-group-state>
|
# SERVICE_GROUP_AGGREGATE_DESIRED_STATE=<service-group-state>
|
||||||
# SERVICE_GROUP_AGGREGATE_STATE=<service-group-state>
|
# SERVICE_GROUP_AGGREGATE_STATE=<service-group-state>
|
||||||
#
|
#
|
||||||
# SERVICE_GROUP_NAME=<service-group-name>
|
# SERVICE_GROUP_NAME=<service-group-name>
|
||||||
# SERVICE_GROUP_DESIRED_STATE=<service-group-state>
|
# SERVICE_GROUP_DESIRED_STATE=<service-group-state>
|
||||||
# SERVICE_GROUP_STATE=<service-group-state>
|
# SERVICE_GROUP_STATE=<service-group-state>
|
||||||
# SERVICE_GROUP_NOTIFICATION=<service-group-notification>
|
# SERVICE_GROUP_NOTIFICATION=<service-group-notification>
|
||||||
|
|
45
tox.ini
45
tox.ini
|
@ -51,40 +51,11 @@ commands =
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
# The following are being suppressed for now
|
# The following are being suppressed for now
|
||||||
# E114 indentation is not a multiple of four (comment)
|
|
||||||
# E116 unexpected indentation (comment)
|
|
||||||
# E121 continuation line under-indented for hanging indent
|
|
||||||
# E122 continuation line missing indentation or outdented
|
|
||||||
# E123 closing bracket does not match indentation of opening bracket's line
|
|
||||||
# E124 closing bracket does not match visual indentation
|
|
||||||
# E125 continuation line with same indent as next logical line
|
|
||||||
# E126 continuation line over-indented for hanging indent
|
|
||||||
# E127 continuation line over-indented for visual indent
|
|
||||||
# E128 continuation line under-indented for visual indent
|
|
||||||
# E129 visually indented line with same indent as next logical line
|
|
||||||
# E131 continuation line unaligned for hanging indent
|
|
||||||
# E201 whitespace after '('
|
|
||||||
# E228 missing whitespace around modulo operator
|
|
||||||
# E231 missing whitespace after ','
|
|
||||||
# E241 multiple spaces after ':'
|
|
||||||
# E251 unexpected spaces around keyword / parameter equals
|
|
||||||
# E265 block comment should start with '#'
|
|
||||||
# E271 multiple spaces after keyword
|
|
||||||
# E302 expected 2 blank lines, found 1
|
|
||||||
# E303 too many blank lines
|
|
||||||
# E305 expected 2 blank lines after class or function definition, found 1
|
|
||||||
# E402 module level import not at top of file
|
# E402 module level import not at top of file
|
||||||
# E713 test for membership should be 'not in'
|
|
||||||
# E714 test for object identity should be 'is not'
|
|
||||||
# E722 do not use bare except'
|
|
||||||
# E731 do not assign a lambda expression, use a def
|
|
||||||
# E999 SyntaxError: invalid syntax (this is likely python3)
|
|
||||||
# - hacking codes -
|
# - hacking codes -
|
||||||
# H102: license header not found
|
# H102: license header not found
|
||||||
# H104: File contains nothing but comments
|
# H104: File contains nothing but comments
|
||||||
# H105: Don't use author tags
|
# H105: Don't use author tags
|
||||||
# H201: no 'except:'
|
|
||||||
# H233: Python 3.x incompatible use of print operator
|
|
||||||
# H306: imports not in alphabetical order
|
# H306: imports not in alphabetical order
|
||||||
# H401: docstring should not start with a space
|
# H401: docstring should not start with a space
|
||||||
# H403: multi line docstrings should end on a new line
|
# H403: multi line docstrings should end on a new line
|
||||||
|
@ -92,23 +63,15 @@ commands =
|
||||||
# H405: multi line docstring summary not separated with an empty line
|
# H405: multi line docstring summary not separated with an empty line
|
||||||
# H501: Do not use locals() for string formatting
|
# H501: Do not use locals() for string formatting
|
||||||
# - errors -
|
# - errors -
|
||||||
# F401 <foo> imported but unused
|
|
||||||
# F811 redefinition of unused '<foo>' from line <x>
|
# F811 redefinition of unused '<foo>' from line <x>
|
||||||
# F821 undefined name 'e'
|
# F821 undefined name 'e'
|
||||||
# F841 local variable 'foo' is assigned to but never used
|
|
||||||
# - bugbear -
|
# - bugbear -
|
||||||
# B001 Do not use bare `except:`. Prefer `except Exception:`. If you're sure what you're doing, be explicit and write `except BaseException:`.
|
|
||||||
# B004 Using `hasattr(x, '__call__')` to test if `x` is callable is unreliable.
|
|
||||||
# B006 Do not use mutable data structures for argument defaults. (python3)
|
# B006 Do not use mutable data structures for argument defaults. (python3)
|
||||||
# B007 Loop control variable 'key' not used within the loop body. If this is intended, start the name with an underscore.
|
|
||||||
# B008 Do not perform calls in argument defaults. The call is performed only once at function definition time.
|
# B008 Do not perform calls in argument defaults. The call is performed only once at function definition time.
|
||||||
# B305 `.next()` is not a thing on Python 3. Use the `next()` builtin. For Python 2 compatibility, use `six.next()`.
|
ignore= E402,
|
||||||
# B306 `BaseException.message` has been deprecated as of Python 2.6 and is removed in Python 3.
|
H102,H104,H105,H106,H306,H401,H403,H404,H405,H501,
|
||||||
ignore= E114,E116,E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E201,E228,E231,E241,E251,E265,E271,
|
F811,F821,
|
||||||
E302,E303,E305,E402,E713,E714,E722,E731,E999,
|
B006,B008
|
||||||
H102,H104,H105,H106,H201,H233,H306,H401,H403,H404,H405,H501,
|
|
||||||
F401,F811,F821,F841,
|
|
||||||
B001,B004,B006,B007,B008,B305,B306
|
|
||||||
# Enable checks which are off by default
|
# Enable checks which are off by default
|
||||||
# H106 Don’t put vim configuration in source files (off by default). SHOULD BE ENABLED.
|
# H106 Don’t put vim configuration in source files (off by default). SHOULD BE ENABLED.
|
||||||
# H203 Use assertIs(Not)None to check for None (off by default).
|
# H203 Use assertIs(Not)None to check for None (off by default).
|
||||||
|
|
Loading…
Reference in New Issue