[ 'action', ['all', 'upgrade_restore'], [ 'resolv_conf', 'spot_prefix', 'mksysb_prefix', 'bosinst_data_prefix' ] ], ], ) # ========================================================================= # Get Module params # ========================================================================= MODULE.status = {} MODULE.targets = [] MODULE.nim_node = {} nb_error = 0 # build a time structure for time_limit attribute, MODULE.time_limit = None if MODULE.params['time_limit']: match_key = re.match(r"^\s*\d{2}/\d{2}/\d{4} \S*\d{2}:\d{2}\s*$", MODULE.params['time_limit']) if match_key: time_limit = time.strptime(MODULE.params['time_limit'], '%m/%d/%Y %H:%M') MODULE.time_limit = time_limit else: msg = 'Malformed time limit "{}", please use mm/dd/yyyy hh:mm format.'\ .format(MODULE.params['time_limit']) MODULE.fail_json(msg=msg)
def main(): global CHANGED DEBUG_DATA = [] OUTPUT = [] MODULE = AnsibleModule( # TODO: remove not needed attributes argument_spec=dict( # description=dict(required=False, type='str'), # IBM automation generic attributes action=dict( required=True, type='str', choices=['altdisk_install', 'bos_install', 'get_status']), vars=dict(required=False, type='dict'), vios_status=dict(required=False, type='dict'), # not used so far, can be used to get if1 for hostname resolution # nim_node=dict(required=False, type='dict'), # nim_migvios_setup not supported yet? # nim_migvios_setup [ -a [ mk_resource={yes|no}] [ file_system=fs_name ] # [ volume_group=vg_name ] [ disk=disk_name ] # [device=device ] # ] [ -B ] [ -F ] [ -S ] [ -v ] # mutually exclisive targets=dict(required=False, type='list', elements='str'), target_file_name=dict(required=False, type='str'), # following attributes are dictionaries with # key: 'all' or hostname and value: a string # example: # mksysb_name={"tgt1": "hdisk1", "tgt2": "hdisk1"} # mksysb_name={"all": "hdisk1"} mksysb_name=dict(required=False, type='dict'), spot_name=dict(required=False, type='dict'), backup_file=dict(required=False, type='dict'), rootvg_clone_disk=dict(required=False, type='dict'), rootvg_install_disk=dict(required=False, type='dict'), # Resources (-e option): res_resolv_conf=dict(required=False, type='dict'), res_script=dict(required=False, type='dict'), res_fb_script=dict(required=False, type='dict'), res_file_res=dict(required=False, type='dict'), res_image_data=dict(required=False, type='dict'), res_log=dict(required=False, type='dict'), # dictionaries with key: 'all' or hostname and value: bool cluster_exists=dict(required=False, type='dict'), validate_input_data=dict(required=False, type='dict'), skip_rootvg_cloning=dict(required=False, type='dict'), ), mutually_exclusive=[['targets', 'target_file_name']], required_one_of=[['targets', 'target_file_name']], # TODO: VRO determine mandatory attributes required_if=[], ) # ========================================================================= # Get Module params # ========================================================================= MODULE.status = {} MODULE.targets = [] MODULE.nim_node = {} MODULE.debug('*** START NIM VIOSUPGRADE OPERATION ***') OUTPUT.append('VIOSUpgrade operation for {}'.format( MODULE.params['targets'])) MODULE.log('Action {} for {} targets'.format(MODULE.params['action'], MODULE.params['targets'])) # build NIM node info (if needed) if MODULE.params['nim_node']: MODULE.nim_node = MODULE.params['nim_node'] # TODO: remove this, not needed, except maybe for hostname # if 'nim_vios' not in MODULE.nim_node: # MODULE.nim_node['nim_vios'] = get_nim_clients_info(MODULE, 'vios') # MODULE.debug('NIM VIOS: {}'.format(MODULE.nim_node['nim_vios'])) if MODULE.params['target_file_name']: try: myfile = open(MODULE.params['target_file_name'], 'r') csvreader = csv.reader(myfile, delimiter=':') for line in csvreader: MODULE.targets.append(line[0].strip()) myfile.close() except IOError as e: msg = 'Failed to parse file {}: {}.'.format(e.filename, e.strerror) MODULE.log(msg) MODULE.fail_json(changed=CHANGED, msg=msg, output=OUTPUT, debug_output=DEBUG_DATA, status=MODULE.status) else: MODULE.params['target_file_name'] = "" MODULE.targets = MODULE.params['targets'] if not MODULE.targets: msg = 'Empty target list' OUTPUT.append(msg) MODULE.warn(msg + ': {}'.format(MODULE.params['targets'])) MODULE.exit_json(changed=False, msg=msg, nim_node=MODULE.nim_node, debug_output=DEBUG_DATA, output=OUTPUT, status=MODULE.status) OUTPUT.append('Targets list:{}'.format(MODULE.targets)) MODULE.debug('Target list: {}'.format(MODULE.targets)) if MODULE.params['target_file_name']: if MODULE.params['action'] != 'get_status': viosupgrade_file(MODULE, MODULE.params['target_file_name']) if 'get_status' in MODULE.params['action']: viosupgrade_query(MODULE) elif MODULE.params['targets']: if MODULE.params['action'] != 'get_status': viosupgrade_list(MODULE, MODULE.params['targets']) if 'get_status' in MODULE.params['action']: viosupgrade_query(MODULE) else: # should not happen msg = 'Please speficy one of "targets" or "target_file_name" parameters.' MODULE.log(msg) MODULE.fail_json(changed=CHANGED, msg=msg, output=OUTPUT, debug_output=DEBUG_DATA, status=MODULE.status) # # Prints status for each targets # nb_error = 0 # msg = 'VIOSUpgrade {} operation status:'.format(MODULE.params['action']) # if MODULE.status: # OUTPUT.append(msg) # MODULE.log(msg) # for vios_key in MODULE.status: # OUTPUT.append(' {} : {}'.format(vios_key, MODULE.status[vios_key])) # MODULE.log(' {} : {}'.format(vios_key, MODULE.status[vios_key])) # if not re.match(r"^SUCCESS", MODULE.status[vios_key]): # nb_error += 1 # else: # MODULE.log(msg + ' MODULE.status table is empty') # OUTPUT.append(msg + ' Error getting the status') # MODULE.status = MODULE.params['vios_status'] # can be None # # Prints a global result statement # if nb_error == 0: # msg = 'VIOSUpgrade {} operation succeeded'\ # .format(MODULE.params['action']) # OUTPUT.append(msg) # MODULE.log(msg) # else: # msg = 'VIOSUpgrade {} operation failed: {} errors'\ # .format(MODULE.params['action'], nb_error) # OUTPUT.append(msg) # MODULE.log(msg) # # ========================================================================= # # Exit # # ========================================================================= # if nb_error == 0: # MODULE.exit_json( # changed=CHANGED, # msg=msg, # targets=MODULE.targets, # nim_node=MODULE.nim_node, # debug_output=DEBUG_DATA, # output=OUTPUT, # status=MODULE.status) MODULE.fail_json(changed=CHANGED, msg=msg, targets=MODULE.targets, nim_node=MODULE.nim_node, debug_output=DEBUG_DATA, output=OUTPUT, status=MODULE.status)