Discussion:
[Libstoragemgmt-devel] [PATCH 09/10] lsm_datatypes.cpp: Fix memory leak
Tony Asleson
2014-06-30 20:47:15 UTC
Permalink
Signed-off-by: Tony Asleson <***@redhat.com>
---
c_binding/lsm_datatypes.cpp | 2 ++
1 file changed, 2 insertions(+)

diff --git a/c_binding/lsm_datatypes.cpp b/c_binding/lsm_datatypes.cpp
index 5949c44..9811541 100644
--- a/c_binding/lsm_datatypes.cpp
+++ b/c_binding/lsm_datatypes.cpp
@@ -1845,6 +1845,8 @@ int lsm_target_port_record_free(lsm_target_port *tp)
{
if( LSM_IS_TARGET_PORT(tp) ) {
tp->magic = LSM_DEL_MAGIC(LSM_TARGET_PORT_MAGIC);
+ free(tp->id);
+ tp->id = NULL;
free(tp->plugin_data);
tp->plugin_data = NULL;
free(tp->system_id);
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:14 UTC
Permalink
Signed-off-by: Tony Asleson <***@redhat.com>
---
c_binding/lsm_convert.cpp | 4 ++--
c_binding/lsm_datatypes.cpp | 26 +++++++++++++-------------
c_binding/lsm_datatypes.hpp | 6 +++---
c_binding/lsm_ipc.cpp | 2 +-
c_binding/lsm_ipc.hpp | 2 +-
c_binding/lsm_mgmt.cpp | 8 ++++----
6 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/c_binding/lsm_convert.cpp b/c_binding/lsm_convert.cpp
index c149738..c1e5364 100644
--- a/c_binding/lsm_convert.cpp
+++ b/c_binding/lsm_convert.cpp
@@ -19,8 +19,8 @@

#include "lsm_convert.hpp"
#include "libstoragemgmt/libstoragemgmt_accessgroups.h"
-#include <libstoragemgmt/libstoragemgmt_blockrange.h>
-#include <libstoragemgmt/libstoragemgmt_nfsexport.h>
+#include "libstoragemgmt/libstoragemgmt_blockrange.h"
+#include "libstoragemgmt/libstoragemgmt_nfsexport.h"

static bool is_expected_object(Value &obj, std::string class_name)
{
diff --git a/c_binding/lsm_datatypes.cpp b/c_binding/lsm_datatypes.cpp
index b654557..5949c44 100644
--- a/c_binding/lsm_datatypes.cpp
+++ b/c_binding/lsm_datatypes.cpp
@@ -25,19 +25,19 @@

#include "lsm_datatypes.hpp"

-#include <libstoragemgmt/libstoragemgmt_accessgroups.h>
-#include <libstoragemgmt/libstoragemgmt_common.h>
-#include <libstoragemgmt/libstoragemgmt_disk.h>
-#include <libstoragemgmt/libstoragemgmt_error.h>
-#include <libstoragemgmt/libstoragemgmt_fs.h>
-#include <libstoragemgmt/libstoragemgmt_nfsexport.h>
-#include <libstoragemgmt/libstoragemgmt_plug_interface.h>
-#include <libstoragemgmt/libstoragemgmt_pool.h>
-#include <libstoragemgmt/libstoragemgmt_snapshot.h>
-#include <libstoragemgmt/libstoragemgmt_systems.h>
-#include <libstoragemgmt/libstoragemgmt_targetport.h>
-#include <libstoragemgmt/libstoragemgmt_types.h>
-#include <libstoragemgmt/libstoragemgmt_volumes.h>
+#include "libstoragemgmt/libstoragemgmt_accessgroups.h"
+#include "libstoragemgmt/libstoragemgmt_common.h"
+#include "libstoragemgmt/libstoragemgmt_disk.h"
+#include "libstoragemgmt/libstoragemgmt_error.h"
+#include "libstoragemgmt/libstoragemgmt_fs.h"
+#include "libstoragemgmt/libstoragemgmt_nfsexport.h"
+#include "libstoragemgmt/libstoragemgmt_plug_interface.h"
+#include "libstoragemgmt/libstoragemgmt_pool.h"
+#include "libstoragemgmt/libstoragemgmt_snapshot.h"
+#include "libstoragemgmt/libstoragemgmt_systems.h"
+#include "libstoragemgmt/libstoragemgmt_targetport.h"
+#include "libstoragemgmt/libstoragemgmt_types.h"
+#include "libstoragemgmt/libstoragemgmt_volumes.h"

#include <string.h>
#include <stdlib.h>
diff --git a/c_binding/lsm_datatypes.hpp b/c_binding/lsm_datatypes.hpp
index a1d62f5..40f2935 100644
--- a/c_binding/lsm_datatypes.hpp
+++ b/c_binding/lsm_datatypes.hpp
@@ -20,9 +20,9 @@
#ifndef LSM_DATATYPES_H
#define LSM_DATATYPES_H

-#include <libstoragemgmt/libstoragemgmt_plug_interface.h>
-#include <libstoragemgmt/libstoragemgmt_common.h>
-#include <libxml/uri.h>
+#include "libstoragemgmt/libstoragemgmt_plug_interface.h"
+#include "libstoragemgmt/libstoragemgmt_common.h"
+#include "libxml/uri.h"
#include <glib.h>
#include "lsm_ipc.hpp"

diff --git a/c_binding/lsm_ipc.cpp b/c_binding/lsm_ipc.cpp
index 59684bf..51c862a 100644
--- a/c_binding/lsm_ipc.cpp
+++ b/c_binding/lsm_ipc.cpp
@@ -19,7 +19,7 @@

#include "lsm_ipc.hpp"

-#include <libstoragemgmt/libstoragemgmt_plug_interface.h>
+#include "libstoragemgmt/libstoragemgmt_plug_interface.h"

#include <unistd.h>
#include <errno.h>
diff --git a/c_binding/lsm_ipc.hpp b/c_binding/lsm_ipc.hpp
index c250efc..8377386 100644
--- a/c_binding/lsm_ipc.hpp
+++ b/c_binding/lsm_ipc.hpp
@@ -20,7 +20,7 @@
#ifndef LSM_IPC_H
#define LSM_IPC_H

-#include <libstoragemgmt/libstoragemgmt_common.h>
+#include "libstoragemgmt/libstoragemgmt_common.h"
#include <yajl/yajl_parse.h>
#include <yajl/yajl_gen.h>
#include <stdint.h>
diff --git a/c_binding/lsm_mgmt.cpp b/c_binding/lsm_mgmt.cpp
index 9b14bef..c57263a 100644
--- a/c_binding/lsm_mgmt.cpp
+++ b/c_binding/lsm_mgmt.cpp
@@ -17,10 +17,10 @@
* Author: tasleson
*/

-#include <libstoragemgmt/libstoragemgmt.h>
-#include <libstoragemgmt/libstoragemgmt_error.h>
-#include <libstoragemgmt/libstoragemgmt_plug_interface.h>
-#include <libstoragemgmt/libstoragemgmt_types.h>
+#include "libstoragemgmt/libstoragemgmt.h"
+#include "libstoragemgmt/libstoragemgmt_error.h"
+#include "libstoragemgmt/libstoragemgmt_plug_interface.h"
+#include "libstoragemgmt/libstoragemgmt_types.h"
#include <stdio.h>
#include <string.h>
#include <dirent.h>
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:11 UTC
Permalink
Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/ontap/na.py | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/plugin/ontap/na.py b/plugin/ontap/na.py
index c1a2555..fc9c68f 100644
--- a/plugin/ontap/na.py
+++ b/plugin/ontap/na.py
@@ -756,8 +756,8 @@ class Filer(object):

if 'fcp-config-adapters' in rc:
if 'fcp-config-adapter-info' in rc['fcp-config-adapters']:
-
- adapters = rc['fcp-config-adapters']['fcp-config-adapter-info']
+ fc_config = rc['fcp-config-adapters']
+ adapters = fc_config['fcp-config-adapter-info']
for f in adapters:
fcp_list.append(dict(addr=f['port-name'],
adapter=f['adapter']))
@@ -783,8 +783,9 @@ class Filer(object):
rc = self._invoke('net-ifconfig-get')

if 'interface-config-info' in rc:
- if 'interface-config-info' in rc['interface-config-info']:
- tmp = to_list(rc['interface-config-info']['interface-config-info'])
+ i_config = rc['interface-config-info']
+ if 'interface-config-info' in i_config:
+ tmp = to_list(i_config['interface-config-info'])
for i in tmp:
i_info[i['interface-name']] = i

@@ -800,14 +801,16 @@ class Filer(object):
rc = self._invoke('iscsi-portal-list-info')

if 'iscsi-portal-list-entries' in rc:
- if 'iscsi-portal-list-entry-info' in rc['iscsi-portal-list-entries']:
- tmp = rc['iscsi-portal-list-entries']['iscsi-portal-list-entry-info']
+ portal_entries = rc['iscsi-portal-list-entries']
+ if 'iscsi-portal-list-entry-info' in portal_entries:
+ tmp = portal_entries['iscsi-portal-list-entry-info']
portals = to_list(tmp)
for p in portals:
+ mac = i_info[p['interface-name']]['mac-address']
i_list.append(dict(interface=p['interface-name'],
ip=p['ip-address'],
port=p['ip-port'],
- mac=i_info[p['interface-name']]['mac-address']))
+ mac=mac))
except FilerError as na:
if na.errno != Filer.EAPILICENSE:
raise
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:10 UTC
Permalink
Python convention is for functions to be in lower case.

Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/nstor/nstor.py | 4 ++--
plugin/ontap/ontap.py | 4 ++--
plugin/smispy/smis.py | 4 ++--
python_binding/lsm/__init__.py | 2 +-
python_binding/lsm/_common.py | 8 ++++----
python_binding/lsm/_pluginrunner.py | 14 +++++++-------
6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/plugin/nstor/nstor.py b/plugin/nstor/nstor.py
index 78173f7..aa4e2ea 100644
--- a/plugin/nstor/nstor.py
+++ b/plugin/nstor/nstor.py
@@ -31,7 +31,7 @@ import traceback

from lsm import (AccessGroup, Capabilities, ErrorNumber, FileSystem, INfs,
IStorageAreaNetwork, LsmError, NfsExport, Pool,
- FsSnapshot, System, VERSION, Volume, md5, Error,
+ FsSnapshot, System, VERSION, Volume, md5, error,
common_urllib2_error_handler, search_property)


@@ -42,7 +42,7 @@ def handle_nstor_errors(method):
except LsmError as lsm:
raise
except Exception as e:
- Error("Unexpected exception:\n" + traceback.format_exc())
+ error("Unexpected exception:\n" + traceback.format_exc())
raise LsmError(ErrorNumber.PLUGIN_ERROR, str(e),
traceback.format_exc())
return nstor_wrapper
diff --git a/plugin/ontap/ontap.py b/plugin/ontap/ontap.py
index fba6660..bc364d0 100644
--- a/plugin/ontap/ontap.py
+++ b/plugin/ontap/ontap.py
@@ -26,7 +26,7 @@ import na
from lsm import (Volume, FileSystem, FsSnapshot, NfsExport,
AccessGroup, System, Capabilities, Disk, Pool,
IStorageAreaNetwork, INfs, LsmError, ErrorNumber, JobStatus,
- md5, Error, VERSION, common_urllib2_error_handler,
+ md5, error, VERSION, common_urllib2_error_handler,
search_property, TargetPort)

#Maps na to lsm, this is expected to expand over time.
@@ -499,7 +499,7 @@ class Ontap(IStorageAreaNetwork, INfs):
#Anything happens here we are only going to report the
#primary error through the API and log the secondary
#error to syslog.
- Error("Exception on trying to restore NA volume size:"
+ error("Exception on trying to restore NA volume size:"
+ traceback.format_exc())
finally:
#Restore timeout.
diff --git a/plugin/smispy/smis.py b/plugin/smispy/smis.py
index 9bc83ba..81e0dcd 100644
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -24,7 +24,7 @@ import traceback
import pywbem
from pywbem import CIMError

-from lsm import (IStorageAreaNetwork, Error, uri_parse, LsmError, ErrorNumber,
+from lsm import (IStorageAreaNetwork, error, uri_parse, LsmError, ErrorNumber,
JobStatus, md5, Pool, Volume, AccessGroup, System,
Capabilities, Disk, txt_a, VERSION, TargetPort,
search_property)
@@ -83,7 +83,7 @@ def handle_cim_errors(method):
except pywbem.cim_http.Error as te:
raise LsmError(ErrorNumber.NETWORK_ERROR, str(te))
except Exception as e:
- Error("Unexpected exception:\n" + traceback.format_exc())
+ error("Unexpected exception:\n" + traceback.format_exc())
raise LsmError(ErrorNumber.PLUGIN_ERROR, str(e),
traceback.format_exc())
return cim_wrapper
diff --git a/python_binding/lsm/__init__.py b/python_binding/lsm/__init__.py
index 7bd8a94..1887c93 100644
--- a/python_binding/lsm/__init__.py
+++ b/python_binding/lsm/__init__.py
@@ -2,7 +2,7 @@ __all__ = []

from version import VERSION

-from _common import Error, Info, LsmError, ErrorLevel, ErrorNumber, \
+from _common import error, info, LsmError, ErrorLevel, ErrorNumber, \
JobStatus, uri_parse, md5, Proxy, size_bytes_2_size_human, \
common_urllib2_error_handler, size_human_2_size_bytes
from _data import (Disk, Volume, Pool, System, FileSystem, FsSnapshot,
diff --git a/python_binding/lsm/_common.py b/python_binding/lsm/_common.py
index 452f8fd..3f4d5e9 100644
--- a/python_binding/lsm/_common.py
+++ b/python_binding/lsm/_common.py
@@ -68,11 +68,11 @@ def common_urllib2_error_handler(exp):
if 'Errno 113' in desc:
raise LsmError(ErrorNumber.NETWORK_HOSTDOWN,
'Host is down')
- Error("Unexpected network error:\n" + traceback.format_exc())
+ error("Unexpected network error:\n" + traceback.format_exc())
raise LsmError(ErrorNumber.NETWORK_ERROR, desc)

stack_trace = traceback.format_exc()
- Error("Unexpected exception:\n" + stack_trace)
+ error("Unexpected exception:\n" + stack_trace)
raise LsmError(ErrorNumber.PLUGIN_ERROR, "Unexpected exception",
stack_trace)

@@ -346,12 +346,12 @@ def post_msg(level, prg, msg):
syslog.syslog(level, prg + ": " + l)


-def Error(*msg):
+def error(*msg):
post_msg(syslog.LOG_ERR, os.path.basename(sys.argv[0]),
params_to_string(*msg))


-def Info(*msg):
+def info(*msg):
if LOG_VERBOSE:
post_msg(syslog.LOG_INFO, os.path.basename(sys.argv[0]),
params_to_string(*msg))
diff --git a/python_binding/lsm/_pluginrunner.py b/python_binding/lsm/_pluginrunner.py
index 8882b53..024fc0d 100644
--- a/python_binding/lsm/_pluginrunner.py
+++ b/python_binding/lsm/_pluginrunner.py
@@ -19,7 +19,7 @@ import socket
import traceback
import sys
from _common import SocketEOF as _SocketEOF
-from lsm import LsmError, Error, ErrorNumber
+from lsm import LsmError, error, ErrorNumber
import _transport
from lsm.lsmcli import cmd_line_wrapper

@@ -72,8 +72,8 @@ class PluginRunner(object):
raise exception_info[1], None, exception_info[2]

except Exception:
- Error(traceback.format_exc())
- Error('Plug-in exiting.')
+ error(traceback.format_exc())
+ error('Plug-in exiting.')
sys.exit(2)

else:
@@ -123,19 +123,19 @@ class PluginRunner(object):
break

except ValueError as ve:
- Error(traceback.format_exc())
+ error(traceback.format_exc())
self.tp.send_error(msg_id, -32700, str(ve))
except AttributeError as ae:
- Error(traceback.format_exc())
+ error(traceback.format_exc())
self.tp.send_error(msg_id, -32601, str(ae))
except LsmError as lsm_err:
self.tp.send_error(msg_id, lsm_err.code, lsm_err.msg,
lsm_err.data)
except _SocketEOF:
#Client went away
- Error('Client went away, exiting plug-in')
+ error('Client went away, exiting plug-in')
except Exception:
- Error("Unhandled exception in plug-in!\n" + traceback.format_exc())
+ error("Unhandled exception in plug-in!\n" + traceback.format_exc())

try:
self.tp.send_error(msg_id, ErrorNumber.PLUGIN_ERROR,
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:08 UTC
Permalink
Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/nstor/nstor.py | 3 ++-
plugin/sim/simarray.py | 3 ++-
plugin/smispy/smis.py | 38 +++++++++++++++++++-------------------
3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/plugin/nstor/nstor.py b/plugin/nstor/nstor.py
index 3b835ea..78173f7 100644
--- a/plugin/nstor/nstor.py
+++ b/plugin/nstor/nstor.py
@@ -132,7 +132,7 @@ class NexentaStor(INfs, IStorageAreaNetwork):
[str(pool), ""])

pools.append(Pool(pool_info['name'], pool_info['name'],
- Pool.ELEMENT_TYPE_VOLUME|Pool.ELEMENT_TYPE_FS,
+ Pool.ELEMENT_TYPE_VOLUME | Pool.ELEMENT_TYPE_FS,
NexentaStor._to_bytes(pool_info['size']),
NexentaStor._to_bytes(pool_info['free']),
Pool.STATUS_UNKNOWN, '', self.system.id))
@@ -426,6 +426,7 @@ class NexentaStor(INfs, IStorageAreaNetwork):
fs_id, fs_dict])
return NfsExport(md5_id, fs_id, export_path, auth_type, root_list,
rw_list, ro_list, anon_uid, anon_gid, options)
+
@handle_nstor_errors
def export_remove(self, export, flags=0):
"""
diff --git a/plugin/sim/simarray.py b/plugin/sim/simarray.py
index 0534929..20058d9 100644
--- a/plugin/sim/simarray.py
+++ b/plugin/sim/simarray.py
@@ -1049,6 +1049,7 @@ class SimData(object):
"init_id %s already exist in other "
% init_id +
"access group %s" % sim_ag['ag_id'])
+
def _check_dup_name(self, sim_list, name, error_num):
used_names = [x['name'] for x in sim_list]
if name in used_names:
@@ -1287,7 +1288,7 @@ class SimData(object):
return None

def fs_snapshot_restore(self, fs_id, snap_id, files, restore_files,
- flag_all_files, flags):
+ flag_all_files, flags):
if fs_id not in self.fs_dict.keys():
raise LsmError(ErrorNumber.NOT_FOUND_FS,
"File System: %s not found" % fs_id)
diff --git a/plugin/smispy/smis.py b/plugin/smispy/smis.py
index 2e4c7bc..f5a35c6 100644
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -109,9 +109,10 @@ def _spec_ver_str_to_num(spec_ver_str):
def _merge_list(list_a, list_b):
return list(set(list_a + list_b))

+
def _hex_string_format(hex_str, length, every):
hex_str = hex_str.lower()
- return ':'.join(hex_str[i:i+every] for i in range(0,length,every))
+ return ':'.join(hex_str[i:i + every] for i in range(0, length, every))


class DMTF(object):
@@ -915,7 +916,6 @@ class Smis(IStorageAreaNetwork):
cap.set(Capabilities.TARGET_PORTS)
return

-
@handle_cim_errors
def capabilities(self, system, flags=0):
cap = self._common_capabilities(system)
@@ -3575,7 +3575,7 @@ class Smis(IStorageAreaNetwork):
mac_address = _hex_string_format(mac_address, 12, 2)

if ipv4_addr:
- network_address="%s:%s" % (ipv4_addr, tcp_port)
+ network_address = "%s:%s" % (ipv4_addr, tcp_port)
port_id = md5("%s:%s:%s" % (mac_address,
network_address,
iscsi_node_name))
@@ -3587,12 +3587,12 @@ class Smis(IStorageAreaNetwork):
# DMTF or SNIA did defined the IPv6 string format.
# we just guess here.
if len(ipv6_addr) == 39:
- ipv6_addr = ipv6_addr.replace(':','')
+ ipv6_addr = ipv6_addr.replace(':', '')
if len(ipv6_addr) == 32:
ipv6_addr = _hex_string_format(
ipv6_addr, 32, 4)

- network_address="[%s]:%s" % (ipv6_addr, tcp_port)
+ network_address = "[%s]:%s" % (ipv6_addr, tcp_port)
port_id = md5("%s:%s:%s" % (mac_address,
network_address,
iscsi_node_name))
@@ -3614,12 +3614,12 @@ class Smis(IStorageAreaNetwork):
loop_counter = max_loop_count
rc = []
leaf_cim_syss = self._c.Associators(
- cim_sys_path,
- ResultClass='CIM_ComputerSystem',
- AssocClass='CIM_ComponentCS',
- Role='GroupComponent',
- ResultRole='PartComponent',
- PropertyList=property_list)
+ cim_sys_path,
+ ResultClass='CIM_ComputerSystem',
+ AssocClass='CIM_ComponentCS',
+ Role='GroupComponent',
+ ResultRole='PartComponent',
+ PropertyList=property_list)
if len(leaf_cim_syss) > 0:
rc = leaf_cim_syss
for cim_sys in leaf_cim_syss:
@@ -3695,10 +3695,10 @@ class Smis(IStorageAreaNetwork):
leaf_cim_syss = self._leaf_cim_syss_of(cim_sys.path)
for leaf_cim_sys in leaf_cim_syss:
cur_cim_fc_tgts = self._c.Associators(
- leaf_cim_sys.path,
- AssocClass='CIM_SystemDevice',
- ResultClass='CIM_FCPort',
- PropertyList=cim_fc_tgt_pros)
+ leaf_cim_sys.path,
+ AssocClass='CIM_SystemDevice',
+ ResultClass='CIM_FCPort',
+ PropertyList=cim_fc_tgt_pros)

# Update SystemName which will be used as system_id
for cim_fc_tgt in cur_cim_fc_tgts:
@@ -3723,10 +3723,10 @@ class Smis(IStorageAreaNetwork):
property_list=self._property_list_of_id('System'))
for cim_sys in cim_syss:
cim_iscsi_pgs = self._c.Associators(
- cim_sys.path,
- AssocClass='CIM_HostedAccessPoint',
- ResultClass='CIM_iSCSIProtocolEndpoint',
- PropertyList=cim_iscsi_pg_pros)
+ cim_sys.path,
+ AssocClass='CIM_HostedAccessPoint',
+ ResultClass='CIM_iSCSIProtocolEndpoint',
+ PropertyList=cim_iscsi_pg_pros)
system_id = self._sys_id(cim_sys)
if flag_multi_sys_support:
leaf_cim_syss = self._leaf_cim_syss_of(cim_sys.path)
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:07 UTC
Permalink
1. The call to self._get_class_instance is incorrect
2. The base smi-s plugin doesn't support this functionality
3. The eseries plugin doesn't allow you to create a plugin, so
difficult to test

Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/smispy/eseries.py | 12 ------------
1 file changed, 12 deletions(-)

diff --git a/plugin/smispy/eseries.py b/plugin/smispy/eseries.py
index 2b3d5e3..2e4b828 100644
--- a/plugin/smispy/eseries.py
+++ b/plugin/smispy/eseries.py
@@ -102,18 +102,6 @@ class ESeries(Smis):
return True

@handle_cim_errors
- def access_group_delete(self, group, flags=0):
- ccs = self._get_class_instance('CIM_ControllerConfigurationService')
-
- pc = self._get_cim_instance_by_id('AccessGroup', group.id)
-
- in_params = {'ProtocolController': pc.path}
-
- return self._pi("access_group_delete", Smis.JOB_RETRIEVE_NONE,
- *(self._c.InvokeMethod('DeleteProtocolController',
- ccs.path, **in_params)))[0]
-
- @handle_cim_errors
def capabilities(self, system, flags=0):
cap = self._common_capabilities(system)
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:09 UTC
Permalink
Both of these variables are declared in a try/except block.
Thus if an exception is thrown they will not exist before
they are potentially referenced. Declaring and initializing
to safe values.

Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/smispy/smis.py | 2 ++
1 file changed, 2 insertions(+)

diff --git a/plugin/smispy/smis.py b/plugin/smispy/smis.py
index f5a35c6..9bc83ba 100644
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -2024,6 +2024,7 @@ class Smis(IStorageAreaNetwork):
v
CIM_SCSIProtocolController
"""
+ cim_ccss_path = []
rc_cim_ags = []

if property_list is None:
@@ -3332,6 +3333,7 @@ class Smis(IStorageAreaNetwork):
this is assumption should work. Tested on EMC SMI-S provider which
provide 1.4, 1.5, 1.6 root profile.
"""
+ cim_scss_path = []
id_pros = self._property_list_of_id('System', property_list)
if property_list is None:
property_list = id_pros
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:12 UTC
Permalink
Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/ontap/ontap.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/plugin/ontap/ontap.py b/plugin/ontap/ontap.py
index bc364d0..683bac3 100644
--- a/plugin/ontap/ontap.py
+++ b/plugin/ontap/ontap.py
@@ -68,8 +68,8 @@ def handle_ontap_errors(method):
except LsmError:
raise
except na.FilerError as oe:
- error, error_msg = error_map(oe)
- raise LsmError(error, error_msg)
+ error_code, error_msg = error_map(oe)
+ raise LsmError(error_code, error_msg)
except Exception as e:
common_urllib2_error_handler(e)
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:16 UTC
Permalink
We were getting false reports of memory leaks because
glib does some interesting pointer manipulation. Fixed
test script to G_SLICE & G_DEBUG env. variables were
defined for lsmd and subsequently the plug-ins that
were executed.

Signed-off-by: Tony Asleson <***@redhat.com>
---
daemon/lsm_daemon.c | 2 +-
test/runtests.sh | 11 ++++++-----
2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/daemon/lsm_daemon.c b/daemon/lsm_daemon.c
index 29b8fd9..923b66e 100644
--- a/daemon/lsm_daemon.c
+++ b/daemon/lsm_daemon.c
@@ -545,7 +545,7 @@ void exec_plugin( char *plugin, int client_fd )

plugin_argv[0] = "valgrind";
plugin_argv[1] = "--leak-check=full";
- plugin_argv[2] = "--show-reachable=yes";
+ plugin_argv[2] = "--show-reachable=no";
plugin_argv[3] = debug_out;
plugin_argv[4] = p_copy;
plugin_argv[5] = fd_str;
diff --git a/test/runtests.sh b/test/runtests.sh
index e77b1fd..daf151b 100755
--- a/test/runtests.sh
+++ b/test/runtests.sh
@@ -19,6 +19,12 @@
#
# Unit test case driver

+# Make sure these are available in the envirnoment before we start lsmd
+export G_SLICE=always-malloc
+export G_DEBUG=gc-friendly
+export CK_DEFAULT_TIMEOUT=600
+export CK_export CK_FORK=no
+
rundir=$RANDOM
base=/tmp/$rundir

@@ -127,12 +133,7 @@ good "$LSMD_DAEMON --plugindir $plugins --socketdir $LSM_UDS_PATH" -v

LSMD_PID=$(ps aux | grep $LSM_UDS_PATH | grep -v grep | awk '{print $2}')

-export G_SLICE=always-malloc
-export G_DEBUG=gc-friendly
-
#Run C unit test
-export CK_DEFAULT_TIMEOUT=600
-export CK_export CK_FORK=no
good "$c_unit"

#Run cmdline against the simulator if we are not checking for leaks
--
1.8.2.1
Tony Asleson
2014-06-30 20:47:13 UTC
Permalink
Conform to python convention of using lower case method names.

Signed-off-by: Tony Asleson <***@redhat.com>
---
plugin/ontap/na.py | 4 ++--
python_binding/lsm/external/xmltodict.py | 34 ++++++++++++++++----------------
2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/plugin/ontap/na.py b/plugin/ontap/na.py
index fc9c68f..fb9d36f 100644
--- a/plugin/ontap/na.py
+++ b/plugin/ontap/na.py
@@ -25,7 +25,7 @@ from _ssl import SSLError

from M2Crypto import RC4

-from lsm.external.xmltodict import ConvertXmlToDict
+from lsm.external.xmltodict import convert_xml_to_dict
from lsm import (ErrorNumber)


@@ -39,7 +39,7 @@ def netapp_filer_parse_response(resp):
out.write(resp)
out.close()

- return ConvertXmlToDict(ElementTree.fromstring(resp))
+ return convert_xml_to_dict(ElementTree.fromstring(resp))


def param_value(val):
diff --git a/python_binding/lsm/external/xmltodict.py b/python_binding/lsm/external/xmltodict.py
index 6e08166..80fbf55 100644
--- a/python_binding/lsm/external/xmltodict.py
+++ b/python_binding/lsm/external/xmltodict.py
@@ -33,37 +33,37 @@ class XmlDictObject(dict):
return ''

@staticmethod
- def Wrap(x):
+ def wrap(x):
"""
Static method to wrap a dictionary recursively as an XmlDictObject
"""
if isinstance(x, dict):
return XmlDictObject(
- (k, XmlDictObject.Wrap(v)) for (k, v) in x.iteritems())
+ (k, XmlDictObject.wrap(v)) for (k, v) in x.iteritems())
elif isinstance(x, list):
- return [XmlDictObject.Wrap(v) for v in x]
+ return [XmlDictObject.wrap(v) for v in x]
else:
return x

@staticmethod
- def _UnWrap(x):
+ def _un_wrap(x):
if isinstance(x, dict):
return dict(
- (k, XmlDictObject._UnWrap(v)) for (k, v) in x.iteritems())
+ (k, XmlDictObject._un_wrap(v)) for (k, v) in x.iteritems())
elif isinstance(x, list):
- return [XmlDictObject._UnWrap(v) for v in x]
+ return [XmlDictObject._un_wrap(v) for v in x]
else:
return x

- def UnWrap(self):
+ def un_wrap(self):
"""
Recursively converts an XmlDictObject to a standard dictionary and
returns the result.
"""
- return XmlDictObject._UnWrap(self)
+ return XmlDictObject._un_wrap(self)


-def _ConvertDictToXmlRecurse(parent, dictitem):
+def _convert_dict_to_xml_recurse(parent, dictitem):
assert isinstance(dictitem, dict)

if isinstance(dictitem, dict):
@@ -75,26 +75,26 @@ def _ConvertDictToXmlRecurse(parent, dictitem):
for listchild in child:
elem = ElementTree.Element(tag)
parent.append(elem)
- _ConvertDictToXmlRecurse(elem, listchild)
+ _convert_dict_to_xml_recurse(elem, listchild)
else:
elem = ElementTree.Element(tag)
parent.append(elem)
- _ConvertDictToXmlRecurse(elem, child)
+ _convert_dict_to_xml_recurse(elem, child)
else:
parent.text = str(dictitem)


-def ConvertDictToXml(xmldict):
+def convert_dict_to_xml(xmldict):
"""
Converts a dictionary to an XML ElementTree Element
"""
roottag = xmldict.keys()[0]
root = ElementTree.Element(roottag)
- _ConvertDictToXmlRecurse(root, xmldict[roottag])
+ _convert_dict_to_xml_recurse(root, xmldict[roottag])
return root


-def _ConvertXmlToDictRecurse(node, dictclass):
+def _convert_xml_to_dict_recurse(node, dictclass):
nodedict = dictclass()

if len(node.items()) > 0:
@@ -109,7 +109,7 @@ def _ConvertXmlToDictRecurse(node, dictclass):

for child in node:
# recursively add the element's children
- newitem = _ConvertXmlToDictRecurse(child, dictclass)
+ newitem = _convert_xml_to_dict_recurse(child, dictclass)
if _ns(child.tag) in nodedict:
# found duplicate tag, force a list
if isinstance(nodedict[_ns(child.tag)], list):
@@ -139,9 +139,9 @@ def _ConvertXmlToDictRecurse(node, dictclass):
return nodedict


-def ConvertXmlToDict(root, dictclass=XmlDictObject):
+def convert_xml_to_dict(root, dictclass=XmlDictObject):
"""
Converts an ElementTree Element to a dictionary
"""
return dictclass(
- {_ns(root.tag): _ConvertXmlToDictRecurse(root, dictclass)})
+ {_ns(root.tag): _convert_xml_to_dict_recurse(root, dictclass)})
--
1.8.2.1
Loading...