Beispiel #1
0
            [
                '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)
Beispiel #2
0
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)