def trigger_autosupport(): s = NaServer(cluster, 1, 110) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(username, password) api = NaElement("autosupport-invoke") api.child_add_string("message", "Possible NFSv4 lock bug discovered") api.child_add_string("node-name", "*") api.child_add_string("type", "all") s.invoke_elem(api)
def migrate_lifs(cluster, username, password, dest_node, dest_port, vserver, lif): s = NaServer(cluster, 1, 110) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(username, password) api = NaElement("net-interface-migrate") api.child_add_string("destination-node", dest_node) api.child_add_string("destination-port", dest_port) api.child_add_string("lif", lif) api.child_add_string("vserver", vserver) s.invoke_elem(api)
def aggr_rename(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] aggr = module.params['aggr'] new_aggr_name = module.params['new_aggr_name'] results = {} results['changed'] = False s = NaServer(cluster, 1 , 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("aggr-rename") api.child_add_string("aggregate",aggr) api.child_add_string("new-aggregate-name",new_aggr_name) xo = s.invoke_elem(api) if(xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def vol_size(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] vserver = module.params['vserver'] volume = module.params['volume'] size = module.params['size'] results = {} results['changed'] = False s = NaServer(cluster, 1, 15) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) s.set_vserver(vserver) api = NaElement("volume-size") api.child_add_string("volume", volume) api.child_add_string("new-size", size) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def snmp_community_add(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] vserver = module.params['vserver'] access_control = module.params['access_control'] community = module.params['community'] results = {} results['changed'] = False s = NaServer(cluster, 1 , 15) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) s.set_vserver(vserver) api = NaElement("snmp-community-add") api.child_add_string("access-control", access_control) api.child_add_string("community", community) xo = s.invoke_elem(api) if(xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def date_time(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] val_certs = module.params['val_certs'] timezone = module.params['timezone'] date = module.params['date'] connection = NaServer(cluster, 1, 0) connection.set_server_type("FILER") connection.set_transport_type("HTTPS") connection.set_port(443) connection.set_style("LOGIN") connection.set_admin_user(user_name, password) if not val_certs: try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_context results = {} results['changed'] = False args = NaElement("args") args.child_add(NaElement("arg", "cluster")) args.child_add(NaElement("arg", "date")) args.child_add(NaElement("arg", "modify")) if module.params['timezone']: args.child_add(NaElement("arg", "-timezone")) args.child_add(NaElement("arg", timezone)) if module.params['date']: args.child_add(NaElement("arg", "-date")) args.child_add(NaElement("arg", date)) systemCli = NaElement("system-cli") systemCli.child_add(args) xo = connection.invoke_elem(systemCli) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def int_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] vserver = module.params['vserver'] lif = module.params['lif'] role = module.params['role'] data_proto = module.params['data_proto'] port = module.params['port'] ip = module.params['ip'] netmask = module.params['netmask'] subnet = module.params['subnet'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement('net-interface-create') api.child_add_string('address', ip) xi = NaElement('data-protocols') api.child_add(xi) for proto in data_proto: xi.child_add_string('data-protocol', proto) api.child_add_string('home-node', node) api.child_add_string('home-port', port) api.child_add_string('interface-name', lif) api.child_add_string('netmask', netmask) api.child_add_string('role', role) api.child_add_string('vserver', vserver) if module.params['subnet']: api.child_add_string('subnet-name', subnet) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def storage_pool_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] val_certs = module.params['val_certs'] disk_list = module.params['disk_list'] storage_pool = module.params['storage_pool'] simulate = module.params['simulate'] results = {} results['changed'] = False if not val_certs: try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_context s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("storage-pool-create") api.child_add_string("storage-pool", storage_pool) if module.params['simulate']: api.child_add_string("simulate", simulate) xi = NaElement("disk-list") api.child_add(xi) for disk in disk_list: xi.child_add_string("disk-name", disk) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def aggr_add(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] val_certs = module.params['val_certs'] disk_type = module.params['disk_type'] aggr = module.params['aggr'] disk_count = module.params['disk_count'] disk_size = module.params['disk_size'] results = {} results['changed'] = False if not val_certs: try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_context s = NaServer(cluster, 1 , 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("aggr-add") api.child_add_string("disk-type", disk_type) api.child_add_string("aggregate", aggr) api.child_add_string("disk-count", disk_count) api.child_add_string("disk-size-with-unit", disk_size) xo = s.invoke_elem(api) if(xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def aggr_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] disk_type = module.params['disk_type'] aggr = module.params['aggr'] disk_count = module.params['disk_count'] disk_size = module.params['disk_size'] raid_size = module.params['raid_size'] raid_type = module.params['raid_type'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("aggr-create") api.child_add_string("disk-type", disk_type) api.child_add_string("aggregate", aggr) api.child_add_string("disk-count", disk_count) api.child_add_string("disk-size-with-unit", disk_size) api.child_add_string("raid-size", raid_size) api.child_add_string("raid-type", raid_type) xi = NaElement("nodes") api.child_add(xi) xi.child_add_string("node-name", node) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def vserver_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] vserver = module.params['vserver'] comment = module.params['comment'] ipspace = module.params['ipspace'] language = module.params['language'] root_vol = module.params['root_vol'] root_vol_aggr = module.params['root_vol_aggr'] security = module.params['security'] vserver_sub = module.params['vserver_sub'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement('vserver-create') api.child_add_string('comment', comment) api.child_add_string('ipspace', ipspace) api.child_add_string('language', language) api.child_add_string('vserver-name', vserver) api.child_add_string('root-volume', root_vol) api.child_add_string('root-volume-aggregate', root_vol_aggr) api.child_add_string('root-volume-security-style', security) api.child_add_string('vserver-subtype', vserver_sub) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def subnet_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] subnet_name = module.params['subnet_name'] subnet = module.params['subnet'] ip_ranges = module.params['ip_ranges'] bc_domain = module.params['bc_domain'] gateway = module.params['gateway'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("net-subnet-create") api.child_add_string("broadcast-domain", bc_domain) api.child_add_string("subnet-name", subnet_name) api.child_add_string("subnet", subnet) if module.params['gateway']: api.child_add_string("gateway", gateway) xi = NaElement("ip-ranges") api.child_add(xi) for ip in ip_ranges: xi.child_add_string("ip-range", ip) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def failover_group_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] failover_group = module.params['failover_group'] return_record = module.params['return_record'] targets = module.params['targets'] vserver = module.params['vserver'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("net-failover-group-create") api.child_add_string("failover-group", failover_group) if module.params['return_record']: api.child_add_string("ipspace", ipspace) api.child_add_string("vserver", vserver) xi = NaElement("targets") api.child_add(xi) for target in targets: xi.child_add_string("net-qualified-port-name", target) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def sp_modify(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] addr_family = module.params['addr_family'] dhcp = module.params['dhcp'] ip = module.params['ip'] netmask = module.params['netmask'] gateway = module.params['gateway'] enabled = module.params['enabled'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("service-processor-network-modify") api.child_add_string("address-type", addr_family) api.child_add_string("dhcp", dhcp) api.child_add_string("node", node) api.child_add_string("ip-address", ip) api.child_add_string("netmask", netmask) api.child_add_string("gateway-ip-address", gateway) api.child_add_string("is-enabled", enabled) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def date_time(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] timezone = module.params['timezone'] date = module.params['date'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) args = NaElement("args") args.child_add(NaElement("arg", "cluster")) args.child_add(NaElement("arg", "date")) args.child_add(NaElement("arg", "modify")) if module.params['timezone']: args.child_add(NaElement("arg", "-timezone")) args.child_add(NaElement("arg", timezone)) if module.params['date']: args.child_add(NaElement("arg", "-date")) args.child_add(NaElement("arg", date)) systemCli = NaElement("system-cli") systemCli.child_add(args) xo = s.invoke_elem(systemCli) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def dns_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] vserver = module.params['vserver'] domains = module.params['domains'] dns_servers = module.params['dns_servers'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) args = NaElement("args") args.child_add(NaElement("arg", "dns")) args.child_add(NaElement("arg", "create")) args.child_add(NaElement("arg", "-vserver")) args.child_add(NaElement("arg", vserver)) args.child_add(NaElement("arg", "-domains")) args.child_add(NaElement("arg", domains)) args.child_add(NaElement("arg", "-name-servers")) args.child_add(NaElement("arg", dns_servers)) systemCli = NaElement("system-cli") systemCli.child_add(args) xo = s.invoke_elem(systemCli) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def asup_invoke(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] message = module.params['message'] asup_type = module.params['asup_type'] uri = module.params['uri'] results = {} results['changed'] = False s = NaServer(cluster, 1 , 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("autosupport-invoke") api.child_add_string("node-name", node) api.child_add_string("type", asup_type) if module.params['message']: api.child_add_string("message", message) if module.params['uri']: api.child_add_string("uri", uri) xo = s.invoke_elem(api) if(xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def nfs_service_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] vserver = module.params['vserver'] nfs_access = module.params['nfs_access'] nfsv3_enabled = module.params['nfsv3_enabled'] nfsv40_enabled = module.params['nfsv40_enabled'] nfsv41_enabled = module.params['nfsv41_enabled'] vstorage_enabled = module.params['vstorage_enabled'] nfsv41_pnfs_enabled = module.params['nfsv41_pnfs_enabled'] results = {} results['changed'] = False s = NaServer(cluster, 1, 15) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) s.set_vserver(vserver) api = NaElement("nfs-service-create") api.child_add_string("is-nfs-access-enabled", nfs_access) api.child_add_string("is-nfsv3-enabled", nfsv3_enabled) api.child_add_string("is-nfsv40-enabled", nfsv40_enabled) api.child_add_string("is-nfsv41-enabled", nfsv41_enabled) api.child_add_string("is-vstorage-enabled", vstorage_enabled) api.child_add_string("is-nfsv41-pnfs-enabled", nfsv41_pnfs_enabled) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def lockcheck(node ,cluster_ip, username, password): s = NaServer(cluster_ip, 1, 110) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(username, password) cmd = shlex.split('statistics show -object nfsv4_diag -instance nfs4_diag -counter storePool_OpenAlloc -raw -node '+node) args = NaElement('args') for arg in cmd: args.child_add(NaElement('arg', arg)) cli = NaElement('system-cli') cli.child_add(args) cli.child_add(NaElement('priv', 'diagnostic')) out = s.invoke_elem(cli) format_output = out.sprintf() result = format_output.split('storePool_OpenAlloc')[1].splitlines()[0].strip(" ") result = int(result) return result
def cluster_peer_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] remote_user = module.params['remote_user'] remote_pass = module.params['remote_pass'] peer_addrs = module.params['peer_addrs'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("cluster-peer-create") if module.params['remote_user']: api.child_add_string("user-name", remote_user) api.child_add_string("password", remote_pass) xi = NaElement("peer-addresses") api.child_add(xi) for ip in peer_addrs: xi.child_add_string("remote-inet-address", ip) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def broadcast_domain_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] bc_domain = module.params['bc_domain'] mtu = module.params['mtu'] ports = module.params['ports'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("net-port-broadcast-domain-create") api.child_add_string("broadcast-domain", bc_domain) api.child_add_string("mtu", mtu) xi = NaElement("ports") api.child_add(xi) for port in ports: xi.child_add_string("net-qualified-port-name", port) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def vlan_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] int_name = module.params['int_name'] vlanid = module.params['vlanid'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("net-vlan-create") xi = NaElement("vlan-info") api.child_add(xi) xi.child_add_string('node', node) xi.child_add_string('parent-interface', int_name) xi.child_add_string('vlanid', vlanid) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def aggr_hybrid(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] aggr = module.params['aggr'] hybrid = module.params['hybrid'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) args = NaElement("args") args.child_add(NaElement("arg", "aggregate")) args.child_add(NaElement("arg", "modify")) args.child_add(NaElement("arg", aggr)) args.child_add(NaElement("arg", "-hybrid-enabled")) args.child_add(NaElement("arg", hybrid)) systemCli = NaElement("system-cli") systemCli.child_add(args) xo = s.invoke_elem(systemCli) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def ifgrp_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] ifgrp = module.params['ifgrp'] mode = module.params['mode'] dist_func = module.params['dist_func'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("net-port-ifgrp-create") api.child_add_string("distribution-function", dist_func) api.child_add_string("ifgrp-name", ifgrp) api.child_add_string("mode", mode) api.child_add_string("node", node) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def main(): module = AnsibleModule( argument_spec=dict( storage=dict(default=None, required=True), user=dict(default='admin', required=False), password=dict(default='P@ssw0rd', required=False), vserver_name=dict(default=None, required=True), volume_name=dict(default=None, required=True), security_style=dict(default='unix', required=False), guarantee=dict(default='volume', required=False), aggr_name=dict(default=None, required=True), ), ) storage = module.params['storage'] user = module.params['user'] password = module.params['password'] vserver_name = module.params['vserver_name'] volume_name = module.params['volume_name'] security_style = module.params['security_style'] guarantee = module.params['guarantee'] aggr_name = module.params['aggr_name'] s = NaServer(storage, 1, 20) s.set_admin_user(user, password) s.set_vserver(vserver_name) api = NaElement('volume-create') api.child_add_string('volume', volume_name) api.child_add_string('space-reserve', guarantee) api.child_add_string('containing-aggr-name', aggr_name) output = s.invoke_elem(api) #print(output.results_status()) #print(output.sprintf()) module.exit_json(changed=True)
def main(): module = AnsibleModule( argument_spec=dict( storage=dict(default=None, required=True), user=dict(default='admin', required=False), password=dict(default='P@ssw0rd', required=False), vserver_name=dict(default=None, required=True), root_volume=dict(default='svm_root', required=False), root_volume_aggregate=dict(default=None, required=True), root_volume_security_style=dict(default='unix', required=False), ), ) storage = module.params['storage'] user = module.params['user'] password = module.params['password'] vserver_name = module.params['vserver_name'] root_volume = module.params['root_volume'] root_volume_aggregate = module.params['root_volume_aggregate'] root_volume_security_style = module.params['root_volume_security_style'] s = NaServer(storage, 1, 20) s.set_admin_user(user, password) api = NaElement('vserver-create') api.child_add_string('language','C'); ns_switch = NaElement('name-server-switch'); api.child_add(ns_switch) ns_switch.child_add_string('nsswitch','file') api.child_add_string('root-volume', root_volume) api.child_add_string('root-volume-aggregate', root_volume_aggregate) api.child_add_string('root-volume-security-style', root_volume_security_style) api.child_add_string('vserver-name', vserver_name); output = s.invoke_elem(api) module.exit_json(changed=True)
def port_flow(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] node = module.params['node'] port = module.params['port'] flow_admin = module.params['flow_admin'] results = {} results['changed'] = False s = NaServer(cluster, 1 , 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("net-port-modify") api.child_add_string("administrative-flowcontrol", flow_admin) api.child_add_string("node", node) api.child_add_string("port", port) xo = s.invoke_elem(api) if(xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def NaConnect(cluster,password): s = NaServer(cluster, 1, 30) s.set_server_type('FILER') # set communication style - typically just 'LOGIN' resp = s.set_style('LOGIN') if (resp and resp.results_errno() != 0) : r = resp.results_reason() logmsg("Failed to set authentication style " + r + "\n") sys.exit (2) # set API transport type - HTTP is the default resp = s.set_transport_type('HTTPS') if (resp and resp.results_errno() != 0) : r = resp.results_reason() logmsg("Unable to set transport " + r + "\n") sys.exit(2) # set communication port s.set_port(443) # Connect and verify s.set_admin_user('admin', password) api = NaElement("system-get-version") output = s.invoke_elem(api) if XML: logmsg(output.sprintf()) if (output.results_status() == "failed"): r = output.results_reason() logmsg("Error connecting: " + str(r)) sys.exit(2) else: ontap_version = output.child_get_string("version") if VERBOSE: logmsg("Cluster " + cluster + " is running " + ontap_version) # return storage object return s
def export_policy_create(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] vserver = module.params['vserver'] policy_name = module.params['policy_name'] return_record = module.params['return_record'] results = {} results['changed'] = False s = NaServer(cluster, 1 , 15) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) s.set_vserver(vserver) api = NaElement("export-policy-create") api.child_add_string("policy-name", policy_name) if module.params['return_record']: api.child_add_string("return-record", return_record) xo = s.invoke_elem(api) if(xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
def license_add(module): cluster = module.params['cluster'] user_name = module.params['user_name'] password = module.params['password'] license_keys = module.params['license_keys'] results = {} results['changed'] = False s = NaServer(cluster, 1, 0) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user_name, password) api = NaElement("license-v2-add") xi = NaElement("codes") api.child_add(xi) for key in license_keys: xi.child_add_string("license-code-v2", key) xo = s.invoke_elem(api) if (xo.results_errno() != 0): r = xo.results_reason() module.fail_json(msg=r) results['changed'] = False else: results['changed'] = True return results
filerIP = raw_input("filer IP: ") myPass = raw_input("filer password: "******"dir path: ") s = NaServer(filerIP, 1 , 15) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user("root", myPass) # Obtain the Data ONTAP version. api = NaElement("system-get-version") xo = s.invoke_elem(api) if (xo.results_status() == "failed") : print ("Error:\n") print (xo.sprintf()) sys.exit (1) print ("Received:\n") print (xo.sprintf()) # Delete a directory. print "Deleting....\n" api = NaElement('file-delete-directory') # Path of the directory to delete. The value is expected to begin with /vol/<volumename>. The directory must be empty in order for this API to succeed. api.child_add_string('path',dir) xo = s.invoke_elem(api) if (xo.results_status() == 'failed'):
def define_metrics(Desc_Skel,params): max_records = 10 for filer in params.keys(): s = NaServer(params[filer]['ipaddr'], 1, 3) out = s.set_transport_type('HTTPS') if (out and out.results_errno() != 0) : r = out.results_reason() print ("Connection to filer failed: " + r + "\n") sys.exit(2) out = s.set_style('LOGIN') if (out and out.results_errno() != 0) : r = out.results_reason() print ("Connection to filer failed: " + r + "\n") sys.exit(2) out = s.set_admin_user(params[filer]['user'], params[filer]['password']) perf_in = NaElement("perf-object-get-instances-iter-start") #Hard coded volume, only volume stats gathered at present obj_name = "volume" perf_in.child_add_string("objectname", obj_name) #Create object of type counters counters = NaElement("counters") #Add counter names to the object counters.child_add_string("counter", "total_ops") counters.child_add_string("counter", "avg_latency") counters.child_add_string("counter", "read_ops") counters.child_add_string("counter", "read_latency") counters.child_add_string("counter", "write_ops") counters.child_add_string("counter", "write_latency") perf_in.child_add(counters) #Invoke API out = s.invoke_elem(perf_in) if(out.results_status() == "failed"): print(out.results_reason() + "\n") sys.exit(2) iter_tag = out.child_get_string("tag") num_records = 1 filername = params[filer]['name'] while(int(num_records) != 0): perf_in = NaElement("perf-object-get-instances-iter-next") perf_in.child_add_string("tag", iter_tag) perf_in.child_add_string("maximum", max_records) out = s.invoke_elem(perf_in) if(out.results_status() == "failed"): print(out.results_reason() + "\n") sys.exit(2) num_records = out.child_get_int("records") if(num_records > 0) : instances_list = out.child_get("instances") instances = instances_list.children_get() for inst in instances: inst_name = unicodedata.normalize('NFKD',inst.child_get_string("name")).encode('ascii','ignore') #print ("Instance = " + inst_name + "\n") counters_list = inst.child_get("counters") counters = counters_list.children_get() for counter in counters: counter_name = unicodedata.normalize('NFKD',counter.child_get_string("name")).encode('ascii','ignore') counter_value = counter.child_get_string("value") counter_unit = counter.child_get_string("unit") if 'total_ops' in counter_name: descriptors.append(create_desc(Desc_Skel, { "name" : filername + '_vol_' + inst_name + '_' + counter_name, "units" : 'iops', "description" : "volume iops", "spoof_host" : params[filer]['ipaddr'] + ':' + params[filer]['name'], "groups" : "iops" })) elif 'avg_latency' in counter_name: descriptors.append(create_desc(Desc_Skel, { "name" : filername + '_vol_' + inst_name + '_' + counter_name, "units" : 'ms', "description" : "volume avg latency", "spoof_host" : params[filer]['ipaddr'] + ':' + params[filer]['name'], "groups" : "latency" })) elif 'read_ops' in counter_name: descriptors.append(create_desc(Desc_Skel, { "name" : filername + '_vol_' + inst_name + '_' + counter_name, "units" : 'iops', "description" : "volume read iops", "spoof_host" : params[filer]['ipaddr'] + ':' + params[filer]['name'], "groups" : "iops" })) elif 'read_latency' in counter_name: descriptors.append(create_desc(Desc_Skel, { "name" : filername + '_vol_' + inst_name + '_' + counter_name, "units" : 'ms', "description" : "volume read latency", "spoof_host" : params[filer]['ipaddr'] + ':' + params[filer]['name'], "groups" : "latency" })) elif 'write_ops' in counter_name: descriptors.append(create_desc(Desc_Skel, { "name" : filername + '_vol_' + inst_name + '_' + counter_name, "units" : 'iops', "description" : "volume write iops", "spoof_host" : params[filer]['ipaddr'] + ':' + params[filer]['name'], "groups" : "iops" })) elif 'write_latency' in counter_name: descriptors.append(create_desc(Desc_Skel, { "name" : filername + '_vol_' + inst_name + '_' + counter_name, "units" : 'ms', "description" : "volume write latency", "spoof_host" : params[filer]['ipaddr'] + ':' + params[filer]['name'], "groups" : "latency" })) return descriptors
def get_metrics(name): global FASMETRICS, LAST_FASMETRICS, FASMETRICS_CACHE_MAX, params max_records = 10 metrics = {} if (time.time() - FASMETRICS['time']) > FASMETRICS_CACHE_MAX: for filer in filerdict.keys(): s = NaServer(filerdict[filer]['ipaddr'], 1, 3) out = s.set_transport_type('HTTPS') if (out and out.results_errno() != 0) : r = out.results_reason() print ("Connection to filer failed: " + r + "\n") sys.exit(2) out = s.set_style('LOGIN') if (out and out.results_errno() != 0) : r = out.results_reason() print ("Connection to filer failed: " + r + "\n") sys.exit(2) out = s.set_admin_user(filerdict[filer]['user'], filerdict[filer]['password']) perf_in = NaElement("perf-object-get-instances-iter-start") #Hard coding volume object for testing obj_name = "volume" perf_in.child_add_string("objectname", obj_name) #Create object of type counters counters = NaElement("counters") #Add counter names to the object counters.child_add_string("counter", "total_ops") counters.child_add_string("counter", "avg_latency") counters.child_add_string("counter", "read_ops") counters.child_add_string("counter", "read_latency") counters.child_add_string("counter", "write_ops") counters.child_add_string("counter", "write_latency") perf_in.child_add(counters) #Invoke API out = s.invoke_elem(perf_in) if(out.results_status() == "failed"): print(out.results_reason() + "\n") sys.exit(2) iter_tag = out.child_get_string("tag") num_records = 1 filername = filerdict[filer]['name'] while(int(num_records) != 0): perf_in = NaElement("perf-object-get-instances-iter-next") perf_in.child_add_string("tag", iter_tag) perf_in.child_add_string("maximum", max_records) out = s.invoke_elem(perf_in) if(out.results_status() == "failed"): print(out.results_reason() + "\n") sys.exit(2) num_records = out.child_get_int("records") if(num_records > 0) : instances_list = out.child_get("instances") instances = instances_list.children_get() for inst in instances: inst_name = unicodedata.normalize('NFKD',inst.child_get_string("name")).encode('ascii','ignore') counters_list = inst.child_get("counters") counters = counters_list.children_get() for counter in counters: counter_name = unicodedata.normalize('NFKD',counter.child_get_string("name")).encode('ascii','ignore') counter_value = counter.child_get_string("value") counter_unit = counter.child_get_string("unit") metrics[filername + '_vol_' + inst_name + '_' + counter_name] = float(counter_value) # update cache LAST_FASMETRICS = dict(FASMETRICS) FASMETRICS = { 'time': time.time(), 'data': metrics } else: metrics = FASMETRICS['data'] #print name #calculate change in values and return if 'total_ops' in name: try: delta = float(FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name])/(FASMETRICS['time'] - LAST_FASMETRICS['time']) if delta < 0: print "Less than 0" delta = 0 except StandardError: delta = 0 #This is the Operations per second return delta elif 'avg_latency' in name: try: #T1 and T2 #(T2_lat - T1_lat) / (T2_ops - T1_ops) #Find the metric name of the base counter total_ops_name = name.replace('avg_latency', 'total_ops') #Calculate latency in time (div 100 to change to ms) return float((FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / (FASMETRICS['data'][total_ops_name] -LAST_FASMETRICS['data'][total_ops_name])) / 100 except StandardError: return 0 elif 'read_ops' in name: try: delta = float(FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name])/(FASMETRICS['time'] - LAST_FASMETRICS['time']) if delta < 0: print "Less than 0" delta = 0 except StandardError: delta = 0 return delta elif 'read_latency' in name: try: read_ops_name = name.replace('read_latency', 'read_ops') return float((FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / (FASMETRICS['data'][read_ops_name] -LAST_FASMETRICS['data'][read_ops_name])) / 100 except StandardError: return 0 elif 'write_ops' in name: try: delta = float(FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name])/(FASMETRICS['time'] - LAST_FASMETRICS['time']) if delta < 0: print "Less than 0" delta = 0 except StandardError: delta = 0 return delta elif 'write_latency' in name: try: write_ops_name = name.replace('write_latency', 'write_ops') return float((FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / (FASMETRICS['data'][write_ops_name] -LAST_FASMETRICS['data'][write_ops_name])) / 100 except StandardError: return 0 return 0
filer.set_admin_user(user_name, password) def readable_size(size): for unit in ['bytes', 'KB', 'MB', 'GB', 'TB']: if size < 1000.0 and size > -1000.0: return "%3.2f %s" % (size, unit) size /= 1024.0 return "%3.2f %s" % (size, 'PB') #list_in = NaElement('volume-footprint-get-iter') #cmd = filer.invoke_elem(list_in) tag = "tag" while True: list_in = NaElement('volume-footprint-get-iter') cmd = filer.invoke_elem(list_in) if tag: list_in.child_add_string('tag', tag) #cmd = filer.invoke_elem(list_in) next_tag = cmd.child_get_string('next-tag') attrib_info = cmd.child_get('attributes-list') result = attrib_info.children_get() for attrib_list in result: attrib_name = attrib_list.child_get_string('volume') vol_meta = readable_size(int(attrib_list.child_get_string('flexvol-metadata-footprint'))) print("Volume: " + attrib_name +"\nMeta Footprint: " + vol_meta + "\n") if not tag: break
def ntap_get_share_list(host, user, password, protocol, interface, do_svms): svm_list = [] addr = "" hostname = {} host_lookup = () # Set up NetApp API session try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: pass else: ssl._create_default_https_context = _create_unverified_https_context netapp = NaServer(host, 1, 130) out = netapp.set_transport_type('HTTPS') ntap_set_err_check(out) out = netapp.set_style('LOGIN') ntap_set_err_check(out) out = netapp.set_admin_user(user, password) ntap_set_err_check(out) # Get list of SVMs from NetApp result = netapp.invoke('vserver-get-iter') ntap_invoke_err_check(result) vs_info = result.child_get('attributes-list').children_get() for vs in vs_info: vs_type = vs.child_get_string("vserver-type") if vs_type == "data": svm_list.append(vs.child_get_string('vserver-name')) # Get list of interfaces on the NetApp. Find the an applicable interface, grab the IP, # then try to get a hostname from it via DNS result = netapp.invoke('net-interface-get-iter') ntap_invoke_err_check(result) ints = result.child_get('attributes-list').children_get() for i in ints: if interface: if i.child_get_string('interface-name') not in interface: continue protocols = i.child_get('data-protocols').children_get() # Couldn't figure out how to pull the protocols properly, nasty hack. Should clean up later for p in protocols: proto = p.sprintf() proto = proto.replace('<', '>') pf = proto.split('>') if pf[2] == protocol or (pf[2] == "cifs" and protocol == "smb"): svm = i.child_get_string('vserver') addr = i.child_get_string('address') try: host_lookup = socket.gethostbyaddr(addr) hostname[svm] = host_lookup[0] except socket.herror: hostname[svm] = addr # For each SVM, grab the NFS exports of SMB shares. Generate the share_list structure for main() dprint("HOSTNAME_ARRAY: " + str(hostname)) for svm in svm_list: svm_share_list = [] junct_point = {} if do_svms and svm not in do_svms: continue dprint("SVM = " + svm) out = netapp.set_vserver(svm) if protocol == "nfs": result = netapp.invoke('volume-get-iter') ntap_invoke_err_check(result) vol_attrs = result.child_get('attributes-list').children_get() for v in vol_attrs: vid_attrs = v.child_get('volume-id-attributes') volume = vid_attrs.child_get_string('name') junction = vid_attrs.child_get_string('junction-path') junct_point[volume] = junction dprint("JP = " + str(junct_point)) result = netapp.invoke('qtree-list-iter') ntap_invoke_err_check(result) qt_attrs = result.child_get('attributes-list').children_get() for qt in qt_attrs: volume = qt.child_get_string('volume') qtree = qt.child_get_string('qtree') dprint("VOL= " + volume) dprint("QTREE= " + qtree) try: dprint("JUNCT_P= " + junct_point[volume]) except: dprint("No Junction Point found") dprint("JUNCT = " + str(junct_point)) if qtree == "": try: vol_j = junct_point[volume] except: continue else: vol_j = junct_point[volume] + "/" + qtree if vol_j != "/": svm_share_list.append(vol_j) elif protocol == "cifs" or protocol == "smb": api = NaElement("cifs-share-get-iter") xi = NaElement("desired-attributes") api.child_add(xi) xi1 = NaElement("cifs-share") xi1.child_add_string("vserver", "") xi1.child_add_string("path", "") xi.child_add(xi1) api.child_add_string('max-records', 5000) result = netapp.invoke_elem(api) ntap_invoke_err_check(result) try: attr = result.child_get('attributes-list').children_get() except: continue for sh in attr: sh_svm = sh.child_get_string('vserver') if sh_svm != svm: continue path = sh.child_get_string('path') if path == "/": # Exclude root volumes continue svm_share_list.append(sh.child_get_string('share-name')) share_list[hostname[svm]] = svm_share_list return (share_list)
#!/usr/bin/env python import sys sys.path.append("NMSDKpy") from NaServer import * cluster = "svlngen4-c01-trad-gen001" transport = "HTTPS" port = 443 style = "CERTIFICATE" cert = "devops_cert.pem" key = "devops_cert.key" s = NaServer(cluster, 1, 30) s.set_transport_type(transport) s.set_port(port) s.set_style(style) s.set_server_cert_verification(0) s.set_client_cert_and_key(cert, key) api = NaElement("system-get-version") output = s.invoke_elem(api) if (output.results_status() == "failed"): r = output.results_reason() print("Failed: " + str(r)) sys.exit(2) ontap_version = output.child_get_string("version") print ("V: " + ontap_version)
filer = raw_input("Filername: ") # password prompt (echo disabled) pw = getpass.getpass(prompt="Filer password: "******"FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user, pw) # Obtain the Data ONTAP version. api_sys_ver = NaElement("system-get-version") out = s.invoke_elem(api_sys_ver) if out.results_status() == "failed": print ("Error:\n") print (out.sprintf()) sys.exit(1) print ("\nResults:\n") print "Filer version:", out.child_get_string("version"), "\n" api_ifconfig_get = NaElement("net-ifconfig-get") # This is the name of the interface to display. If not provided, all interfaces will be displayed. # api_ifconfig_get.child_add_string("interface-name","<name>") out = s.invoke_elem(api_ifconfig_get) if out.results_status() == "failed": print ("Error:\n") print (out.sprintf())
if (inputxml > 0) : try : minidom.parseString(api) except: print("\nParse Error\n") sys.exit(1) rxi = s.parse_raw_xml(api) if (showxml == 1) : print ("INPUT:\n" + rxi.sprintf() + "\n") rxo = s.invoke_elem(rxi) print ("\nOUTPUT: \n" + rxo.sprintf()) sys.exit (5) # Create a XML element to print if (showxml == 1) : x = NaElement(api) length = args-i if((length & 1) != 0): while(i <= args): key = sys.argv[i] i = i + 1 value = sys.argv[i]
def netapp_info(module) : results = {} #This module is not built to make changes, so we are returning false here. results['changed'] = False results['rc'] = 0 results['ansible_facts'] = {} s = NaServer(module.params['host'], 1 , 21) s.set_server_type(module.params['na_server_type']) s.set_transport_type(module.params['na_transport_type']) s.set_port(module.params['na_port']) s.set_style(module.params['na_style']) s.set_admin_user(module.params['nauser'], module.params['napass']) # first we get base cluster OnTap version information cluster_version_info = {} api = NaElement("system-get-version") xo = s.invoke_elem(api) if (xo.results_status() == "failed") : errmsg = "errno: ", xo.results_errno(), "reason: ", xo.results_reason() module.fail_json(msg=errmsg) cluster_version = {} cluster_version['build_timestamp'] = xo.child_get_string('build-timestamp') cluster_version['is_clustered'] = xo.child_get_string('is-clustered') cluster_version['version'] = xo.child_get_string('version') cluster_version['version_tuple'] = xmltodict.parse(xo.child_get('version-tuple').sprintf()) cluster_version_info['cluster_version_info'] = cluster_version #o = xmltodict.parse(xo.sprintf()) results['ansible_facts'].update(cluster_version_info) # cluster identity info cluster_identity_info = {} api = NaElement("cluster-identity-get") xo = s.invoke_elem(api) if (xo.results_status() == "failed") : errmsg = "errno: ", xo.results_errno(), "reason: ", xo.results_reason() module.fail_json(msg=errmsg) cluster_identity = {} attr = xo.child_get('attributes') id_info = attr.child_get('cluster-identity-info') for cid in id_info.children_get() : cluster_name = id_info.child_get_string('cluster-name') cluster_identity[cluster_name] = xmltodict.parse(id_info.sprintf()) cluster_identity_info['cluster_identity'] = cluster_identity results['ansible_facts'].update(cluster_identity_info) # get node specific info system_node_info = {} system_info = {} api = NaElement("system-get-node-info-iter") xo = s.invoke_elem(api) if (xo.results_status() == "failed") : errmsg = "errno: ", xo.results_errno(), "reason: ", xo.results_reason() module.fail_json(msg=errmsg) system_nodes = xo.child_get('attributes-list') for node in system_nodes.children_get() : system_name = node.child_get_string('system-name') system_info[system_name] = xmltodict.parse(node.sprintf()) system_node_info['system_node_info'] = system_info results['ansible_facts'].update(system_node_info) # get svm info svm_info = {} vserver_info = {} api = NaElement("vserver-get-iter") xo = s.invoke_elem(api) if (xo.results_status() == "failed") : errmsg = "errno: ", xo.results_errno(), "reason: ", xo.results_reason() module.fail_json(msg=errmsg) vservers = xo.child_get('attributes-list') for vserver in vservers.children_get() : svm_name = vserver.child_get_string('vserver-name') vserver_info[svm_name] = xmltodict.parse(vserver.sprintf()) svm_info['svm_info'] = vserver_info results['ansible_facts'].update(svm_info) # get aggr info aggr_info = {} aggregate_info = {} api = NaElement("aggr-get-iter") xo = s.invoke_elem(api) if (xo.results_status() == "failed") : errmsg = "errno: ", xo.results_errno(), "reason: ", xo.results_reason() module.fail_json(msg=errmsg) aggr_list = xo.child_get('attributes-list') for aggrs in aggr_list.children_get() : aggr_attrs = aggr_list.child_get('aggr-attributes') for aggr in aggr_attrs.children_get() : aggregate_name = aggrs.child_get_string('aggregate-name') aggregate_info[aggregate_name] = xmltodict.parse(aggrs.sprintf()) aggr_info['aggr_info'] = aggregate_info results['ansible_facts'].update(aggr_info) return results
# invoke the api with api name and any supplied key-value pairs x = NaElement(arguments[0]) k = 0 arguments.remove(arguments[0]) length = len(arguments) - 1 if((length & 1) != 0): while(k <= length): key = arguments[k] k = k + 1 value = arguments[k] k = k + 1 x.child_add(NaElement(key,value)) else: print("Invalid number of parameters") print_usage() xo = server.invoke_elem(x) else: print_usage() if ( xo == None ) : print ("invoke_api failed to filer as user:password.\n") sys.exit (3) # format the output print ("Output: \n" + xo.sprintf() + "\n" )
def get_metrics(name): global FASMETRICS, LAST_FASMETRICS, FASMETRICS_CACHE_MAX, params max_records = 10 metrics = {} if (time.time() - FASMETRICS['time']) > FASMETRICS_CACHE_MAX: for filer in filerdict.keys(): s = NaServer(filerdict[filer]['ipaddr'], 1, 3) out = s.set_transport_type('HTTPS') if (out and out.results_errno() != 0): r = out.results_reason() print("Connection to filer failed: " + r + "\n") sys.exit(2) out = s.set_style('LOGIN') if (out and out.results_errno() != 0): r = out.results_reason() print("Connection to filer failed: " + r + "\n") sys.exit(2) out = s.set_admin_user(filerdict[filer]['user'], filerdict[filer]['password']) perf_in = NaElement("perf-object-get-instances-iter-start") #Hard coding volume object for testing obj_name = "volume" perf_in.child_add_string("objectname", obj_name) #Create object of type counters counters = NaElement("counters") #Add counter names to the object counters.child_add_string("counter", "total_ops") counters.child_add_string("counter", "avg_latency") counters.child_add_string("counter", "read_ops") counters.child_add_string("counter", "read_latency") counters.child_add_string("counter", "write_ops") counters.child_add_string("counter", "write_latency") perf_in.child_add(counters) #Invoke API out = s.invoke_elem(perf_in) if (out.results_status() == "failed"): print(out.results_reason() + "\n") sys.exit(2) iter_tag = out.child_get_string("tag") num_records = 1 filername = filerdict[filer]['name'] while (int(num_records) != 0): perf_in = NaElement("perf-object-get-instances-iter-next") perf_in.child_add_string("tag", iter_tag) perf_in.child_add_string("maximum", max_records) out = s.invoke_elem(perf_in) if (out.results_status() == "failed"): print(out.results_reason() + "\n") sys.exit(2) num_records = out.child_get_int("records") if (num_records > 0): instances_list = out.child_get("instances") instances = instances_list.children_get() for inst in instances: inst_name = unicodedata.normalize( 'NFKD', inst.child_get_string("name")).encode( 'ascii', 'ignore') counters_list = inst.child_get("counters") counters = counters_list.children_get() for counter in counters: counter_name = unicodedata.normalize( 'NFKD', counter.child_get_string("name")).encode( 'ascii', 'ignore') counter_value = counter.child_get_string("value") counter_unit = counter.child_get_string("unit") metrics[filername + '_vol_' + inst_name + '_' + counter_name] = float(counter_value) # update cache LAST_FASMETRICS = dict(FASMETRICS) FASMETRICS = {'time': time.time(), 'data': metrics} else: metrics = FASMETRICS['data'] #print name #calculate change in values and return if 'total_ops' in name: try: delta = float(FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / ( FASMETRICS['time'] - LAST_FASMETRICS['time']) if delta < 0: print "Less than 0" delta = 0 except StandardError: delta = 0 #This is the Operations per second return delta elif 'avg_latency' in name: try: #T1 and T2 #(T2_lat - T1_lat) / (T2_ops - T1_ops) #Find the metric name of the base counter total_ops_name = name.replace('avg_latency', 'total_ops') #Calculate latency in time (div 100 to change to ms) return float( (FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / (FASMETRICS['data'][total_ops_name] - LAST_FASMETRICS['data'][total_ops_name])) / 100 except StandardError: return 0 elif 'read_ops' in name: try: delta = float(FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / ( FASMETRICS['time'] - LAST_FASMETRICS['time']) if delta < 0: print "Less than 0" delta = 0 except StandardError: delta = 0 return delta elif 'read_latency' in name: try: read_ops_name = name.replace('read_latency', 'read_ops') return float( (FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / (FASMETRICS['data'][read_ops_name] - LAST_FASMETRICS['data'][read_ops_name])) / 100 except StandardError: return 0 elif 'write_ops' in name: try: delta = float(FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / ( FASMETRICS['time'] - LAST_FASMETRICS['time']) if delta < 0: print "Less than 0" delta = 0 except StandardError: delta = 0 return delta elif 'write_latency' in name: try: write_ops_name = name.replace('write_latency', 'write_ops') return float( (FASMETRICS['data'][name] - LAST_FASMETRICS['data'][name]) / (FASMETRICS['data'][write_ops_name] - LAST_FASMETRICS['data'][write_ops_name])) / 100 except StandardError: return 0 return 0
sys.path.append("/home/alvinch/netapp-manageability-sdk-5.2/lib/python/NetApp") from NaServer import * help = "script filer_username filer volume" args = len(sys.argv) user_name = sys.argv[1] password = getpass.getpass() filer_name = sys.argv[2] filer = NaServer(filer_name,1,6) filer.set_admin_user(user_name, password) tag = "tag" while True: naelement=NaElement('vserver-get-iter') out=filer.invoke_elem(naelement) if tag: naelement.child_add_string('tag', tag) #out=filer.invoke_elem(naelement) tag=out.child_get_string('next-tag') vserver_list=out.child_get('attributes-list').children_get() for v in vserver_list: name=v.child_get_string('vserver-name'); print name #if not name in self.vserver: # self.vserver[name]=dict()
"filer103", "filer104", "filer105", "filer106", "filer107", "filer108", "filer109", "filer110", "filer111") for filer_name in filer_list: print "============ %s ============ " % filer_name filer = NaServer(filer_name,1,6) filer.set_admin_user('root', 'password') cmd = NaElement("snapmirror-get-status") ret = filer.invoke_elem(cmd) if(ret.results_status() == "failed"): print "%s failed." % filer_name print(ret.results_reason() + "\n") sys.exit(2) status = ret.child_get("snapmirror-status") if(not(status == None)): result = status.children_get() else: print "status_children_get was empty\n" sys.exit(2) for snapStat in result:
class QoS_info: def __init__(self, cluster_name, cluster_ip, username, password, sdk_ver, server_type="FILER", transport_type="HTTPS", port="443", style="LOGIN"): major, minor = string.split(sdk_ver, '.') self.CLUSTER_NAME = cluster_name self.MAX_VOLUMES = 2000 self.s = NaServer(cluster_ip, major, minor) self.s.set_server_type(server_type) self.s.set_transport_type(transport_type) self.s.set_port(port) self.s.set_style(style) self.s.set_admin_user(username, password) def get_qos_stats(self): self.policy_groups = self.get_qos_pgs() self.workloads = self.get_qos_workloads() self.pgs = {} for pg in self.policy_groups['results']['attributes-list']['qos-policy-group-info']: max_iops = int(string.split(pg['max-throughput'], 'IOPS')[0]) curr_pg = pg['policy-group'] self.pgs[curr_pg] = {} self.pgs[curr_pg]['policy-group'] = pg['policy-group'] self.pgs[curr_pg]['max-throughput'] = max_iops self.pgs[curr_pg]['pgid'] = pg['pgid'] self.pgs[curr_pg]['policy-group-class'] = pg['policy-group-class'] self.pgs[curr_pg]['uuid'] = pg['uuid'] self.pgs[curr_pg]['timestamp'] = string.split(str(time.time()),'.')[0] for wl in self.workloads['results']['attributes-list']['qos-workload-info']: targ_pg = wl['policy-group'] try: self.pgs[targ_pg]['vserver'] = wl['vserver'] self.pgs[targ_pg]['volume'] = wl['volume'] except: pass lines = [] for line in self.pgs.values(): try: metric_string = "%s.%s.qos_max_iops" % (line['vserver'], line['volume']) data = {} data[metric_string] = float(line['max-throughput']) lines.append(data) except KeyError: pass return lines def get_vol_stats(self): ret = [] for v in self.get_volumes(): try: v_cn = v['cluster-name'] v_svm = v['owning-vserver-name'] v_vol = v['name'] c = self.get_vol_counters(v['instance-uuid']) c_ts = c['timestamp'] c_read_ops = c['read_ops'] c_write_ops = c['write_ops'] c_total_ops = c['total_ops'] metric_string = "%s.%s.total_ops" % (v_svm, v_vol) data = {} read_ops_key_u = "%s.%s.%s.read_ops" % (self.CLUSTER_NAME, v_svm, v_vol) read_ops_key = read_ops_key_u.encode('ascii','ignore') data[read_ops_key] = float(c['read_ops']) write_ops_key_u = "%s.%s.%s.write_ops" % (self.CLUSTER_NAME, v_svm, v_vol) write_ops_key = write_ops_key_u.encode('ascii','ignore') data[write_ops_key] = float(c['write_ops']) total_ops_key_u = "%s.%s.%s.total_ops" % (self.CLUSTER_NAME, v_svm, v_vol) total_ops_key = total_ops_key_u.encode('ascii','ignore') data[total_ops_key] = float(c['total_ops']) ret.append(data) except KeyError: continue return ret def get_volumes(self): api = NaElement("volume-get-iter") xi = NaElement("desired-attributes") api.child_add(xi) ## This specifies max number of volume records to pull from sdk api ## Default is 20. 20000 is enough for most clusters api.child_add_string("max-records",self.MAX_VOLUMES) xi1 = NaElement("volume-attributes") xi.child_add(xi1) xi41 = NaElement("volume-id-attributes") xi41.child_add_string("instance-uuid","<instance-uuid>") xi41.child_add_string("name","<name>") xi41.child_add_string("owning-vserver-name","<owning-vserver-name>") xi41.child_add_string("uuid","<uuid>") xi1.child_add(xi41) xo = self.s.invoke_elem(api) f = xmltodict.parse(xo.sprintf()) volumes = f['results']['attributes-list']['volume-attributes'] vol_list = [] for volume in volumes: vol_list.append({ 'cluster-name':self.CLUSTER_NAME, 'owning-vserver-name':volume['volume-id-attributes']['owning-vserver-name'], 'name':volume['volume-id-attributes']['name'], 'instance-uuid':volume['volume-id-attributes']['instance-uuid'] }) return vol_list def get_vol_counters(self, instance_uuid): api = NaElement("perf-object-get-instances") xi = NaElement("counters") api.child_add(xi) xi2 = NaElement("instances") api.child_add(xi2) api.child_add_string("objectname","volume") xi1 = NaElement("instance-uuids") api.child_add(xi1) xi1.child_add_string("instance-uuid",instance_uuid) ctrs = {} xo = self.s.invoke_elem(api) if (xo.results_status() == "failed") : ## ## Volumes which are currently offline will error here as no counters are collected ## fp = open('/var/tmp/ctrs-fail.xml','a') fp.write(xo.sprintf()) fp.close() return ctrs fp = open('/var/tmp/ctrs.xml','a') fp.write(xo.sprintf()) fp.close() try: f = xmltodict.parse(xo.sprintf()) except xml.parsers.expat.ExpatError: print xo.sprintf() ctrs['timestamp'] = f['results']['timestamp'] ctrs['volname'] = f['results']['instances']['instance-data']['name'] ctrs['voluuid'] = f['results']['instances']['instance-data']['uuid'] for ctr in f['results']['instances']['instance-data']['counters']['counter-data']: ctrs[ctr['name']] = ctr['value'] return ctrs def get_qos_pgs(self): api = NaElement("qos-policy-group-get-iter") xi = NaElement("desired-attributes") api.child_add(xi) xi1 = NaElement("qos-policy-group-info") xi.child_add(xi1) # These control what fields are returned for each record xi1.child_add_string("max-throughput","<max-throughput>") #xi1.child_add_string("num-workloads","<num-workloads>") xi1.child_add_string("pgid","<pgid>") xi1.child_add_string("policy-group","<policy-group>") xi1.child_add_string("policy-group-class","<policy-group-class>") xi1.child_add_string("uuid","<uuid>") xi1.child_add_string("vserver","<vserver>") api.child_add_string("max-records",100000) xi2 = NaElement("query") api.child_add(xi2) xi3 = NaElement("qos-policy-group-info") xi2.child_add(xi3) # These control what records are returned #xi3.child_add_string("max-throughput","<max-throughput>") #xi3.child_add_string("num-workloads","<num-workloads>") #xi3.child_add_string("pgid","<pgid>") #xi3.child_add_string("policy-group","<policy-group>") xi3.child_add_string("policy-group-class","user-defined") #xi3.child_add_string("uuid","<uuid>") #xi3.child_add_string("vserver","<vserver>") #api.child_add_string("tag","<tag>") xo = self.s.invoke_elem(api) if (xo.results_status() == "failed") : print ("Error:\n") print (xo.sprintf()) sys.exit (1) return xmltodict.parse(xo.sprintf()) def get_qos_workloads(self): api = NaElement("qos-workload-get-iter") xi = NaElement("desired-attributes") api.child_add(xi) xi1 = NaElement("qos-workload-info") xi.child_add(xi1) xi1.child_add_string("category","<category>") xi1.child_add_string("file","<file>") xi1.child_add_string("lun","<lun>") xi1.child_add_string("policy-group","<policy-group>") xi1.child_add_string("qtree","<qtree>") xi1.child_add_string("read-ahead","<read-ahead>") xi1.child_add_string("volume","<volume>") xi1.child_add_string("vserver","<vserver>") xi1.child_add_string("wid","<wid>") xi1.child_add_string("workload-class","<workload-class>") xi1.child_add_string("workload-name","<workload-name>") xi1.child_add_string("workload-uuid","<workload-uuid>") api.child_add_string("max-records",100000) xi2 = NaElement("query") api.child_add(xi2) xi3 = NaElement("qos-workload-info") xi2.child_add(xi3) #xi3.child_add_string("category","<category>") #xi3.child_add_string("file","<file>") #xi3.child_add_string("lun","<lun>") #xi3.child_add_string("policy-group","<policy-group>") #xi3.child_add_string("qtree","<qtree>") #xi3.child_add_string("read-ahead","<read-ahead>") #xi3.child_add_string("volume","<volume>") #xi3.child_add_string("vserver","<vserver>") #xi3.child_add_string("wid","<wid>") xi3.child_add_string("workload-class","user_defined") #xi3.child_add_string("workload-name","<workload-name>") #xi3.child_add_string("workload-uuid","<workload-uuid>") #api.child_add_string("tag","<tag>") xo = self.s.invoke_elem(api) if (xo.results_status() == "failed") : print ("Error:\n") print (xo.sprintf()) sys.exit (1) return xmltodict.parse(xo.sprintf())
import sys, getpass sys.path.append("/home/alvinch/netapp-manageability-sdk-5.2/lib/python/NetApp") from NaServer import * help = "script filer_username filer volume" args = len(sys.argv) user_name = sys.argv[1] password = getpass.getpass() filer_name = sys.argv[2] filer = NaServer(filer_name,1,6) filer.set_admin_user(user_name, password) tag = "" while True: api = NaElement('volume-footprint-get-iter') if tag: api.child_add_string('tag', tag) run = filer.invoke_elem(api) tag = run.child_get_string('next-tag') attribinfo = run.child_get('attributes-list') result = attribinfo.children_get() for output in result: volname = output.child_get_string('volume') print volname #if tag is None: if not tag: break
class CdotPerf: def __init__(self, cluster_name, cluster_ip, username, password, sdk_ver, server_type="FILER", transport_type="HTTPS", port="443", style="LOGIN"): major, minor = string.split(sdk_ver, '.') self.CLUSTER_NAME = cluster_name self.MAX_VOLUMES = 20000 self.s = NaServer(cluster_ip, major, minor) self.s.set_server_type(server_type) self.s.set_transport_type(transport_type) self.s.set_port(port) self.s.set_style(style) self.s.set_admin_user(username, password) self.sd = statsd.StatsClient('localhost',8125) self.fp = open("/var/tmp/tellme.log", "a") try: self.debug = open("/var/tmp/debugenabled") self.debug.close() self.debug = True except IOError: self.debug = False pass self.targ_vol_counters = "avg_latency,cifs_other_latency,cifs_other_ops,cifs_read_data,cifs_read_latency,cifs_read_ops,cifs_write_data,cifs_write_latency,cifs_write_ops,fcp_other_latency,fcp_other_ops,fcp_read_data,fcp_read_latency,fcp_read_ops,fcp_write_data,fcp_write_latency,fcp_write_ops,flexcache_other_ops,flexcache_read_data,flexcache_read_ops,flexcache_receive_data,flexcache_send_data,flexcache_write_data,flexcache_write_ops,iscsi_other_latency,iscsi_other_ops,iscsi_read_data,iscsi_read_latency,iscsi_read_ops,iscsi_write_data,iscsi_write_latency,iscsi_write_ops,nfs_other_latency,nfs_other_ops,nfs_read_data,nfs_read_latency,nfs_read_ops,nfs_write_data,nfs_write_latency,nfs_write_ops,other_latency,other_ops,read_blocks,read_data,read_latency,read_ops,san_other_latency,san_other_ops,san_read_data,san_read_latency,san_read_ops,san_write_data,san_write_latency,san_write_ops,total_ops,write_blocks,write_data,write_latency,write_ops" def tellme(self, message): if (self.debug): self.fp.write("%s\n" % message) def get_aggregates(self): """ Get list of volumes from cluster """ api = NaElement("aggr-get-iter") #xi = NaElement("desired-attributes") #api.child_add(xi) ## This specifies max number of volume records to pull from sdk api ## Default is 20. 20000 is enough for most clusters api.child_add_string("max-records",self.MAX_VOLUMES) #xi1 = NaElement("aggr-attributes") #xi.child_add(xi1) #xi41 = NaElement("volume-id-attributes") #xi41.child_add_string("instance-uuid","<instance-uuid>") #xi41.child_add_string("name","<name>") #xi41.child_add_string("owning-vserver-name","<owning-vserver-name>") #xi41.child_add_string("uuid","<uuid>") #xi1.child_add(xi41) xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") #print xo.sprintf() f = xmltodict.parse(xo.sprintf()) #print xo.sprintf() aggrs = f['results']['attributes-list']['aggr-attributes'] aggr_list = [] for aggr in aggrs: for z in aggr.keys(): try: if (z == 'aggregate-name'): aggr_name = aggr[z] #print "aggr_name: %s" % aggr_name elif (z == 'aggregate-uuid'): aggr_uuid = aggr[z] #print "aggr_uuid: %s" % aggr_uuid elif (z == 'aggr-ownership-attributes'): aggr_ownr = aggr[z]['owner-name'] #print "aggr_ownr: %s" % aggr_ownr #print "z: %s" % z #print "kggr[z].keys: %s" % aggr[z].keys() except AttributeError: #print "In Exception - aggr[z]: %s" % aggr[z] pass aggr_list.append({ 'cluster-name':self.CLUSTER_NAME, 'aggr-name':aggr_name, 'aggr-uuid':aggr_uuid, 'owner-name':aggr_ownr }) return aggr_list def get_volumes(self): """ Get list of volumes from cluster """ api = NaElement("volume-get-iter") xi = NaElement("desired-attributes") api.child_add(xi) ## This specifies max number of volume records to pull from sdk api ## Default is 20. 20000 is enough for most clusters api.child_add_string("max-records",self.MAX_VOLUMES) xi1 = NaElement("volume-attributes") xi.child_add(xi1) xi41 = NaElement("volume-id-attributes") xi41.child_add_string("instance-uuid","<instance-uuid>") xi41.child_add_string("name","<name>") xi41.child_add_string("owning-vserver-name","<owning-vserver-name>") xi41.child_add_string("uuid","<uuid>") xi1.child_add(xi41) xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") f = xmltodict.parse(xo.sprintf()) volumes = f['results']['attributes-list']['volume-attributes'] vol_list = [] for volume in volumes: vol_list.append({'cluster-name':self.CLUSTER_NAME, 'owning-vserver-name':volume['volume-id-attributes']['owning-vserver-name'], 'name':volume['volume-id-attributes']['name'], 'instance-uuid':volume['volume-id-attributes']['instance-uuid'] }) return vol_list def get_counters_by_name(self, instance_name, object_name, counter_filter_list=None): api = NaElement("perf-object-get-instances") #xi = NaElement("counters") #api.child_add(xi) #xi.child_add_string("counter",counter_filter_list) xi2 = NaElement("instances") api.child_add(xi2) xi2.child_add_string("instance",instance_name) #xi3 = NaElement("instance-uuids") #api.child_add(xi3) #xi3.child_add_string("instance-uuid",instance_uuid) ## ## TODO - make this generic to get counters for non-volume uuids ## api.child_add_string("objectname",object_name) #xi1 = NaElement("instance-uuids") #api.child_add(xi1) #xi1.child_add_string("instance-uuid",instance_uuid) ctrs = {} xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") if (xo.results_status() == "failed") : ## Volumes which are currently offline will error here as no counters are collected print xo.sprintf() return ctrs try: f = xmltodict.parse(xo.sprintf()) except xml.parsers.expat.ExpatError: print xo.sprintf() ctrs['timestamp'] = f['results']['timestamp'] ctrs['name'] = f['results']['instances']['instance-data']['name'] ctrs['uuid'] = f['results']['instances']['instance-data']['uuid'] for ctr in f['results']['instances']['instance-data']['counters']['counter-data']: ctrs[ctr['name']] = ctr['value'] return ctrs def get_object_instance_list_info(self, object_name): api = NaElement("perf-object-instance-list-info-iter") # xi = NaElement("desired-attributes") api.child_add(xi) # # #xi1 = NaElement("instance-info") #xi.child_add(xi1) # #xi1.child_add_string("name","<name>") #xi1.child_add_string("uuid","<uuid>") #api.child_add_string("filter-data","<filter-data>") api.child_add_string("max-records",1000000) api.child_add_string("objectname",object_name) # # xi2 = NaElement("query") # api.child_add(xi2) # # # xi3 = NaElement("instance-info") # xi2.child_add(xi3) # # xi3.child_add_string("name","<name>") # xi3.child_add_string("uuid","<uuid>") # api.child_add_string("tag","<tag>") # xo = self.s.invoke_elem(api) if (xo.results_status() == "failed") : print ("Error:\n") print (xo.sprintf()) sys.exit (1) # print ("Received:\n") print (xo.sprintf()) ctrs = {} xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") if (xo.results_status() == "failed") : ## Volumes which are currently offline will error here as no counters are collected print xo.sprintf() return ctrs try: f = xmltodict.parse(xo.sprintf()) except xml.parsers.expat.ExpatError: print xo.sprintf() # ctrs['timestamp'] = f['results']['timestamp'] # ctrs['volname'] = f['results']['instances']['instance-data']['name'] # ctrs['voluuid'] = f['results']['instances']['instance-data']['uuid'] # for ctr in f['results']['instances']['instance-data']['counters']['counter-data']: # ctrs[ctr['name']] = ctr['value'] # return ctrs def get_counters_by_uuid(self, instance_uuid, object_name, counter_filter_list=None): api = NaElement("perf-object-get-instances") xi = NaElement("counters") api.child_add(xi) xi.child_add_string("counter",counter_filter_list) #xi2 = NaElement("instances") #api.child_add(xi2) #xi2.child_add_string("instance",instance) xi3 = NaElement("instance-uuids") api.child_add(xi3) xi3.child_add_string("instance-uuid",instance_uuid) ## ## TODO - make this generic to get counters for non-volume uuids ## api.child_add_string("objectname",object_name) #xi1 = NaElement("instance-uuids") #api.child_add(xi1) #xi1.child_add_string("instance-uuid",instance_uuid) ctrs = {} xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") if (xo.results_status() == "failed") : ## Volumes which are currently offline will error here as no counters are collected print xo.sprintf() return ctrs try: f = xmltodict.parse(xo.sprintf()) except xml.parsers.expat.ExpatError: print xo.sprintf() ctrs['timestamp'] = f['results']['timestamp'] ctrs['name'] = f['results']['instances']['instance-data']['name'] ctrs['uuid'] = f['results']['instances']['instance-data']['uuid'] for ctr in f['results']['instances']['instance-data']['counters']['counter-data']: ctrs[ctr['name']] = ctr['value'] return ctrs def get_object_counter_info(self,targObject): api = NaElement("perf-object-counter-list-info") api.child_add_string("objectname",targObject) xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") if (xo.results_status() == "failed") : sys.exit (1) f = xmltodict.parse(xo.sprintf()) lines = [] for c in f['results']['counters']['counter-info']: ## Need more code to handle case where base-counter is present and where data type is array / histogram ## ## Mandatory fields returned: name, desc, privilege-level ## Optional fields returned: aggregation-style, base-counter, is-key, labels, properties, translation-input-counter, type, unit poss_fields = ["name","desc","privilege-level","aggregation-style","base-counter","is-key","labels","properties","translation-input-counter","type","unit"] fields = [] for pf in poss_fields: if (pf in c.keys()): if (pf == "labels"): try: fields.append(c[pf]['label-info'].encode('ascii','ignore')) except AttributeError: fields.append(c[pf]['label-info'][0].encode('ascii','ignore')) else: try: fields.append(c[pf].encode('ascii','ignore')) except AttributeError: print "In AttributeError in get_object_counter_info" else: fields.append("") lines.append(string.join(fields, "|")) return lines def get_perf_objects(self): api = NaElement("perf-object-list-info") xo = self.s.invoke_elem(api) self.sd.incr("api.invoke") if (xo.results_status() == "failed") : print ("Error:\n") print (xo.sprintf()) sys.exit (1) f = xmltodict.parse(xo.sprintf()) objects = [] for obj in f['results']['objects']['object-info']: objects.append(obj['name']) return objects def load_vol_counters(self, targ_file="/home/duane/cdot_api_pull/vol-perf-counters.txt"): self.vol_ctr_info = {} lines = open(targ_file).read() for line in string.split(lines, '\n'): try: fields = string.split(line, '|') f_cluster = fields[0] f_svm = fields[1] f_vol = fields[2] f_ctr = fields[3] f_desc = fields[4] f_priv = fields[5] f_junk = fields[6] f_basec = fields[7] # use f_iskey = fields[8] f_labels = fields[9] f_props = fields[10] # use f_junk = fields[11] f_type = fields[12] # use f_unit = fields[13] # use # if f_cluster not in self.vol_ctr_info: self.vol_ctr_info[f_cluster] = {} if f_svm not in self.vol_ctr_info[f_cluster]: self.vol_ctr_info[f_cluster][f_svm] = {} if f_vol not in self.vol_ctr_info[f_cluster][f_svm]: self.vol_ctr_info[f_cluster][f_svm][f_vol] = {} if f_ctr not in self.vol_ctr_info[f_cluster][f_svm][f_vol]: self.vol_ctr_info[f_cluster][f_svm][f_vol][f_ctr] = {} # self.vol_ctr_info[f_cluster][f_svm][f_vol][f_ctr]['base-counter'] = f_basec self.vol_ctr_info[f_cluster][f_svm][f_vol][f_ctr]['properties'] = f_props self.vol_ctr_info[f_cluster][f_svm][f_vol][f_ctr]['type'] = f_type self.vol_ctr_info[f_cluster][f_svm][f_vol][f_ctr]['unit'] = f_unit except IndexError: self.tellme("caught exception parsing %s - %s" % (targ_file, line)) def load_perf_counters(self, targ_file="/home/duane/cdot_api_pull/perf-counter-list.out"): self.perf_ctr_info = {} lines = open(targ_file).read() for line in string.split(lines, '\n'): try: fields = string.split(line, '|') if (len(fields) == 14): f_object_name = fields[0] f_instance_name = fields[1] f_instance_uuid = fields[2] f_counter_name = fields[3] f_counter_desc = fields[4] f_privs = fields[5] f_junk = fields[6] f_base_counter = fields[7] # use f_iskey = fields[8] f_labels = fields[9] # use f_properties = fields[10] # use f_junk = fields[11] f_type = fields[12] # use f_unit = fields[13] # use # # Store details as; # { object_name : { instance_name : { instance_uuid : { counter_name : { counter_name : value # # f_object_name.f_instance_uuid.f_counter_name if f_object_name not in self.perf_ctr_info: self.perf_ctr_info[f_object_name] = {} if f_instance_uuid not in self.perf_ctr_info[f_object_name]: self.perf_ctr_info[f_object_name][f_instance_uuid] = {} if f_counter_name not in self.perf_ctr_info[f_object_name][f_instance_uuid]: self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name] = {} # self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['object-name'] = f_object_name self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['counter-name'] = f_counter_name self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['instance-name'] = f_instance_name self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['instance-uuid'] = f_instance_uuid self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['base-counter'] = f_base_counter self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['labels'] = f_labels self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['properties'] = f_properties self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['type'] = f_type self.perf_ctr_info[f_object_name][f_instance_uuid][f_counter_name]['unit'] = f_unit else: pass #print "parsing line failed for >>%s<<" % line except IndexError: #print "caught exception parsing %s - %s" % (targ_file, line) self.tellme("caught exception parsing %s - %s" % (targ_file, line))