Пример #1
0
def restart_cluster(cluster_name, log, function=None):
    '''
    Restart a cluster.
    '''

    # initialize the control variable
    OK = True

    # warn that the log window must not be closed
    if not isinstance(log, xlib.DevStdOut):
        log.write(
            'This process might take several minutes. Do not close this window, please wait!\n'
        )

    # warn that the requirements are being verified
    log.write('{0}\n'.format(xlib.get_separator()))
    log.write('Verifying process requirements ...\n')

    # verify the master is stopped
    if OK:
        (master_state_code,
         master_state_name) = xec2.get_node_state(cluster_name, 'master')
        if master_state_code != 80:
            log.write(
                '*** ERROR: The cluster {0} is not stopped. Its state is {1} ({2}).\n'
                .format(cluster_name, master_state_code, master_state_name))
            OK = False

    # warn that the requirements are OK
    if OK:
        log.write('Process requirements are OK.\n')

    # restart the cluster
    if OK:
        log.write('{0}\n'.format(xlib.get_separator()))
        log.write('Restarting cluster {0} using StarCluster ...\n'.format(
            cluster_name))
        log.write('\n')
        command = '{0} start --no-create {1}'.format(xlib.get_starcluster(),
                                                     cluster_name)
        rc = xlib.run_command(command, log)
        log.write('\n')
        if rc == 0:
            log.write('The cluster is restarted.\n')
        else:
            log.write('*** ERROR: Return code {0} in command -> {1}\n'.format(
                rc, command))
            OK = False

    # warn that the log window can be closed
    if not isinstance(log, xlib.DevStdOut):
        log.write('{0}\n'.format(xlib.get_separator()))
        log.write('You can close this window now.\n')

    # execute final function
    if function is not None:
        function()

    # return the control variable
    return OK
Пример #2
0
def remove_node(cluster_name, node_name, log, function=None):
    '''
    Remove a node in a cluster.
    '''

    # initialize the control variable
    OK = True

    # warn that the requirements are being verified
    log.write('{0}\n'.format(xlib.get_separator()))
    log.write('Verifying process requirements ...\n')

    # verify the master is running
    if OK:
        (master_state_code,
         master_state_name) = xec2.get_node_state(cluster_name, 'master')
        if master_state_code != 16:
            log.write(
                '*** ERROR: The cluster {0} is not running. Its state is {1} ({2}).'
                .format(cluster_name, master_state_code, master_state_name))
            OK = False

    # verify the node is running
    if OK:
        pass

    # warn that the requirements are OK
    if OK:
        log.write('Process requirements are OK.\n')

    # remove node
    if OK:
        log.write('{0}\n'.format(xlib.get_separator()))
        log.write(
            'Removing node {0} in cluster {1} using StarCluster ...\n'.format(
                node_name, cluster_name))
        log.write('\n')
        command = '{0} removenode --confirm {1} --alias={2}'.format(
            xlib.get_starcluster(), cluster_name, node_name)
        rc = xlib.run_command(command, log)
        log.write('\n')
        if rc == 0:
            log.write('The node is removed.\n')
        else:
            log.write('*** ERROR: Return code {0} in command -> {1}\n'.format(
                rc, command))
            OK = False

    # warn that the log window can be closed
    if not isinstance(log, xlib.DevStdOut):
        log.write('{0}\n'.format(xlib.get_separator()))
        log.write('You can close this window now.\n')

    # execute final function
    if function is not None:
        function()

    # return the control variable
    return OK
Пример #3
0
def remove_node(cluster_name, node_name, log, function=None):
    '''
    Remove a node in a cluster.
    '''

    # initialize the control variable
    OK = True

    # warn that the requirements are being verified
    log.write(f'{xlib.get_separator()}\n')
    log.write('Checking process requirements ...\n')

    # check the master is running
    if OK:
        (master_state_code,
         master_state_name) = xec2.get_node_state(cluster_name,
                                                  node_name='master')
        if master_state_code != 16:
            log.write(
                f'*** ERROR: The cluster {cluster_name} is not running. Its state is {master_state_code} ({master_state_name}).'
            )
            OK = False

    # check the node is running
    if OK:
        pass

    # warn that the requirements are OK
    if OK:
        log.write('Process requirements are OK.\n')

    # remove node
    if OK:
        log.write(f'{xlib.get_separator()}\n')
        log.write(
            f'Removing node {node_name} in cluster {cluster_name} using StarCluster ...\n'
        )
        log.write('\n')
        command = f'{xlib.get_starcluster()} removenode --confirm {cluster_name} --alias={node_name}'
        rc = xlib.run_command(command, log)
        log.write('\n')
        if rc == 0:
            log.write('The node is removed.\n')
        else:
            log.write(f'*** ERROR: Return code {rc} in command -> {command}\n')
            OK = False

    # warn that the log window can be closed
    if not isinstance(log, xlib.DevStdOut):
        log.write(f'{xlib.get_separator()}\n')
        log.write('You can close this window now.\n')

    # execute final function
    if function is not None:
        function()

    # return the control variable
    return OK
Пример #4
0
def list_clusters(log, function=None):
    '''
    List clusters.
    '''

    # initialize the control variable
    OK = True

    # get current region
    region_name = xconfiguration.get_current_region_name()

    # warn that the log window must not be closed
    if not isinstance(log, xlib.DevStdOut):
        log.write(
            'This process might take a few minutes. Do not close this window, please wait!\n'
        )

    # warn that the requirements are being verified
    log.write('{0}\n'.format(xlib.get_separator()))
    log.write('Verifying process requirements ...\n')

    # verify if there are some running clusters
    if xec2.get_running_cluster_list(volume_creator_included=True) == []:
        log.write('WARNING: There is not any running cluster.\n')
        OK = False

    # warn that the requirements are OK
    if OK:
        log.write('Process requirements are OK.\n')

    # list clusters
    if OK:
        log.write('{0}\n'.format(xlib.get_separator()))
        log.write('Listing clusters using StarCluster ...\n')
        log.write('\n')
        command = '{0} --region={1} listclusters'.format(
            xlib.get_starcluster(), region_name)
        rc = xlib.run_command(command, log)
        if rc != 0:
            log.write('*** ERROR: Return code {0} in command -> {1}\n'.format(
                rc, command))
            OK = False

    # warn that the log window can be closed
    if not isinstance(log, xlib.DevStdOut):
        log.write('{0}\n'.format(xlib.get_separator()))
        log.write('You can close this window now.\n')

    # execute final function
    if function is not None:
        function()

    # return the control variable
    return OK
Пример #5
0
def get_starcluster_dir():
    '''
    Get the directory where StarCluster is installed.
    '''

    # initialize the control variable and the error list
    OK = True
    error_list = []

    # initialize the StarCluster directory
    starcluster_dir = ''

    # set the path of the file used to store the StarCluster information
    sci_file_path = '{0}/sci.txt'.format(xlib.get_temp_dir())

    # store the StarCluster information
    if OK:
        command = '{0} {1}'.format(xlib.get_sci(), sci_file_path)
        rc = xlib.run_command(command, sys.stdout)
        if rc != 0:
            error_list.append('*** ERROR: Return code {0} in command -> {1}\n'.format(rc, command))
            OK = False

    # find the StarCluster path
    if OK:
        try:
            file_id = open(sci_file_path, mode='r', encoding='iso-8859-1', newline='\n')
        except Exception as e:
            error_list.append('*** ERROR: The file {0} can not be opened.\n'.format(sci_file_path))
            OK = False
        else:
            OK = False
            record = file_id.readline()
            while record != '':
                if record.startswith('FILE'):
                    record = file_id.readline().strip()
                    starcluster_dir = record[:record.find('__init__.py')]
                    OK = True
                    break
                record = file_id.readline()

    # return the control variable, error list and StarCluster directory
    return (OK, error_list, starcluster_dir)
Пример #6
0
def main(argv):
    '''
    Main line of the program.
    '''

    # verify the operating system.
    if not sys.platform.startswith('linux') and not sys.platform.startswith(
            'darwin') and not sys.platform.startswith(
                'win32') and not sys.platform.startswith('cygwin'):
        print('*** ERROR: The {1} OS is not supported.'.format(sys.platform))
        sys.exit(1)

    # verify the Python version.
    if sys.version_info[0] == 3 and sys.version_info[1] >= 5:
        pass
    else:
        print('A Python version equal or greater than 3.5 is required.')
        sys.exit(1)

    # verify if Boto3 is set up
    try:
        import boto3
    except:
        print('*** ERROR: The library boto3 is not installed.')
        print('Please, review how to set up Boto3 in the manual.')
        sys.exit(1)

    # verify if Paramiko is set up
    try:
        import paramiko
    except:
        print('*** ERROR: The library paramiko is not installed.')
        print('Please, review how to set up Paramiko in the manual.')
        sys.exit(1)

    # verify if Paramiko is set up
    try:
        import paramiko
    except:
        print('*** ERROR: The library paramiko is not installed.')
        print('Please, review how to set up Paramiko in the manual.')
        sys.exit(1)

    # get and verify the options
    parser = build_parser()
    (options, args) = parser.parse_args()
    verify_options(options)

    # verify if the required graphical libraries are setup
    if options.mode == 'gui' or options.mode is None:

        # verify if the library PIL.Image is set up
        try:
            import tkinter
        except:
            print('*** ERROR: The library tkinter is not installed.')
            print('Please, review how to set up Tkinter in the manual.')
            sys.exit(1)

        # verify if the library PIL.Image is set up
        try:
            import PIL.Image
        except:
            print('*** ERROR: The library PIL.Image is not installed.')
            print('Please, review how to set up PIL.Image in the manual.')
            sys.exit(1)

        # verify if the library PIL.ImageTk is set up
        try:
            import PIL.ImageTk
        except:
            print('*** ERROR: The library PIL.ImageTk is not installed.')
            print('Please, review how to set up PIL.ImageTk in the manual.')
            sys.exit(1)

    # import required application libraries
    import ccloud
    import cmenu
    import gmain
    import xlib

    # verify if StarCluster is set up
    command = '{0} --version'.format(xlib.get_starcluster())
    devstdout = xlib.DevStdOut('starcluster_version', print_stdout=False)
    rc = xlib.run_command(command, devstdout)
    if rc != 0:
        print(
            '*** ERROR: The cluster-computing toolkit StarCluster 0.95.6 is not installed or excecution permissions have not set.'
        )
        print('Please, review how to set up in the manual.')
        sys.exit(1)
    else:
        with open(devstdout.get_log_file(), 'r') as log_command:
            version_found = False
            for line in log_command:
                if line.startswith('0.95.6'):
                    version_found = True
            if not version_found:
                print(
                    '*** ERROR: The cluster-computing toolkit StarCluster 0.95.6 is not installed or excecution permissions have not set.'
                )
                print('Please, review how to set up in the manual.')
                sys.exit(1)

    # start the user interface depending on the mode
    if options.mode == 'gui' or options.mode is None:
        main = gmain.Main()
        main.mainloop()
    else:
        ccloud.form_set_environment()
        cmenu.build_menu_main()
Пример #7
0
def terminate_cluster(cluster_name,
                      force,
                      log,
                      function=None,
                      is_menu_call=True):
    '''
    Terminate a cluster.
    '''

    # initialize the control variable
    OK = True

    # get current region
    region_name = xconfiguration.get_current_region_name()

    # warn that the log window does not have to be closed
    if not isinstance(log, xlib.DevStdOut) and is_menu_call:
        log.write(
            'This process might take a few minutes. Do not close this window, please wait!\n'
        )

    # warn that the requirements are being verified
    log.write(f'{xlib.get_separator()}\n')
    log.write('Checking process requirements ...\n')

    # check the cluster is running
    if OK:
        (master_state_code,
         master_state_name) = xec2.get_node_state(cluster_name,
                                                  node_name='master')
        if not force and master_state_code != 16:
            log.write(
                f'*** ERROR: The cluster {cluster_name} is not running. Its state is {master_state_code} ({master_state_name}).\n'
            )
            OK = False

    # warn that the requirements are OK
    if OK:
        log.write('Process requirements are OK.\n')

    # terminate cluster
    if OK:
        log.write(f'{xlib.get_separator()}\n')
        if cluster_name == xlib.get_volume_creator_name():
            log.write('Terminating the volume creator using StarCluster ...\n')
        else:
            log.write(
                'Terminating the cluster {0} using StarCluster ...\n'.format(
                    cluster_name))
        log.write('\n')
        if not force:
            command = '{0} --region={1} terminate --confirm {2}'.format(
                xlib.get_starcluster(), region_name, cluster_name)
        else:
            command = '{0} --region={1} terminate --force --confirm {2}'.format(
                xlib.get_starcluster(), region_name, cluster_name)
        rc = xlib.run_command(command, log)
        log.write('\n')
        if rc == 0:
            if cluster_name == xlib.get_volume_creator_name():
                log.write('The volume creator is terminated.\n')
            else:
                log.write('The cluster is terminated.\n')
        else:
            log.write('*** ERROR: Return code {0} in command -> {1}\n'.format(
                rc, command))
            OK = False

    # warn that the log window can be closed
    if not isinstance(log, xlib.DevStdOut) and is_menu_call:
        log.write(f'{xlib.get_separator()}\n')
        log.write('You can close this window now.\n')

    # execute final function
    if function is not None:
        function()

    # return the control variable
    return OK
Пример #8
0
def create_cluster(template_name,
                   cluster_name,
                   log,
                   function=None,
                   is_menu_call=True):
    '''
    Create a cluster from a template name.
    '''

    # initialize the control variable
    OK = True

    # initialize the state variables
    master_state_code = ''
    master_state_name = ''

    # get current region and zone names
    region_name = xconfiguration.get_current_region_name()
    zone_name = xconfiguration.get_current_zone_name()

    # warn that the log window does not have to be closed
    if not isinstance(log, xlib.DevStdOut) and is_menu_call:
        log.write(
            'This process might take several minutes. Do not close this window, please wait!\n'
        )

    # warn that the requirements are being verified
    log.write(f'{xlib.get_separator()}\n')
    log.write('Checking process requirements ...\n')

    # check that the cluster is defined in the NGScloud config file
    if OK:
        if not xconfiguration.is_template_defined(template_name):
            log.write(
                '*** ERROR: The cluster {0} is not defined in the {1} config file.\n'
                .format(cluster_name, xlib.get_project_name()))
            OK = False

    # check that the cluster mode is None
    if OK:
        if xec2.get_cluster_mode(cluster_name) is not None:
            log.write('*** ERROR: There is a cluster or a instance running.\n')
            OK = False

    # check that the zone is available
    if OK:
        if not xec2.is_zone_available(region_name, zone_name):
            log.write(
                '*** ERROR: The zone name {0} is not available.\n'.format(
                    zone_name))
            OK = False

    # warn that the requirements are OK
    if OK:
        log.write('Process requirements are OK.\n')

    # create the cluster
    if OK:
        log.write(f'{xlib.get_separator()}\n')
        if cluster_name == xlib.get_volume_creator_name():
            log.write('Creating the volume creator using StarCluster ...\n')
        else:
            log.write(
                'Creating the cluster {0} using StarCluster ...\n'.format(
                    cluster_name))
        log.write('\n')
        if template_name == xlib.get_volume_creator_name():
            command = '{0} --region={1} start --availability-zone={2} --cluster-template={3} --disable-queue {4}'.format(
                xlib.get_starcluster(), region_name, zone_name, template_name,
                cluster_name)
        else:
            command = '{0} --region={1} start --availability-zone={2} --cluster-template={3} {4}'.format(
                xlib.get_starcluster(), region_name, zone_name, template_name,
                cluster_name)
        rc = xlib.run_command(command, log)
        log.write('\n')
        if rc == 0:
            (master_state_code,
             master_state_name) = xec2.get_node_state(cluster_name,
                                                      node_name='master')
            if cluster_name == xlib.get_volume_creator_name():
                log.write('The volume creator is created.\n')
            else:
                log.write('The cluster is created.\n')
        else:
            log.write('*** ERROR: Return code {0} in command -> {1}\n'.format(
                rc, command))
            log.write('***')
            log.write(
                '*** You have to terminate {0} (option "Force termination of a cluster")\n'
                .format(cluster_name))
            log.write('*** and create it again.\n')
            OK = False

    # install infrastructure  software in every node of the cluster
    if OK:
        if cluster_name != xlib.get_volume_creator_name():
            cluster_node_list = xec2.get_cluster_node_list(cluster_name)
            for node_name in cluster_node_list:
                OK = xnode.install_node_infrastructure_software(
                    cluster_name, node_name, log)

    # warn that the log window can be closed
    if not isinstance(log, xlib.DevStdOut) and is_menu_call:
        log.write(f'{xlib.get_separator()}\n')
        log.write('You can close this window now.\n')

    # execute final function
    if function is not None:
        function()

    # return the control variable and the state
    return (OK, master_state_code, master_state_name)