Ejemplo n.º 1
0
def computer_setup(ctx, non_interactive, **kwargs):
    """Create a new computer."""
    from aiida.orm.utils.builders.computer import ComputerBuilder

    if kwargs['label'] in get_computer_names():
        echo.echo_critical(
            'A computer called {c} already exists. '
            'Use "verdi computer duplicate {c}" to set up a new '
            'computer starting from the settings of {c}.'.format(
                c=kwargs['label']))

    kwargs['transport'] = kwargs['transport'].name
    kwargs['scheduler'] = kwargs['scheduler'].name

    computer_builder = ComputerBuilder(**kwargs)
    try:
        computer = computer_builder.new()
    except (ComputerBuilder.ComputerValidationError, ValidationError) as e:
        echo.echo_critical(f'{type(e).__name__}: {e}')

    try:
        computer.store()
    except ValidationError as err:
        echo.echo_critical(f'unable to store the computer: {err}. Exiting...')
    else:
        echo.echo_success(f'Computer<{computer.pk}> {computer.label} created')

    echo.echo_info(
        'Note: before the computer can be used, it has to be configured with the command:'
    )
    echo.echo_info(
        f'  verdi computer configure {computer.transport_type} {computer.label}'
    )
Ejemplo n.º 2
0
    def on_setup_computer(self, _=None, on_success=None):
        """Create a new computer."""
        with self.setup_compupter_out:
            clear_output()

            if self.label.value == "":  # check hostname
                print("Please specify the computer name (for AiiDA)")
                return
            try:
                computer = orm.Computer.objects.get(label=self.label.value)
                print(f"A computer called {self.label.value} already exists.")
                if on_success:
                    on_success()
                return
            except common.NotExistent:
                pass

            items_to_configure = [
                "label",
                "hostname",
                "description",
                "work_dir",
                "mpirun_command",
                "mpiprocs_per_machine",
                "transport",
                "scheduler",
                "prepend_text",
                "append_text",
                "shebang",
            ]
            kwargs = {
                key: getattr(self, key).value
                for key in items_to_configure
            }

            computer_builder = ComputerBuilder(**kwargs)
            try:
                computer = computer_builder.new()
            except (
                    ComputerBuilder.ComputerValidationError,
                    common.exceptions.ValidationError,
            ) as err:
                print(f"{type(err).__name__}: {err}")
                return

            try:
                computer.store()
            except common.exceptions.ValidationError as err:
                print(f"Unable to store the computer: {err}.")
                return

            if self._configure_computer():
                if on_success:
                    on_success()
                print(f"Computer<{computer.pk}> {computer.label} created")
Ejemplo n.º 3
0
    def setUp(self):
        """Prepare current user and computer builder with common properties."""
        from aiida.orm.utils.builders.computer import ComputerBuilder

        self.comp_builder = ComputerBuilder(label='test', description='computer', hostname='localhost')
        self.comp_builder.scheduler = 'direct'
        self.comp_builder.work_dir = '/tmp/aiida'
        self.comp_builder.prepend_text = ''
        self.comp_builder.append_text = ''
        self.comp_builder.mpiprocs_per_machine = 8
        self.comp_builder.mpirun_command = 'mpirun'
        self.comp_builder.shebang = '#!xonsh'
        self.user = orm.User.objects.get_default()
Ejemplo n.º 4
0
def computer_setup(ctx, non_interactive, **kwargs):
    """Create a new computer."""
    from aiida.orm.utils.builders.computer import ComputerBuilder

    if kwargs['label'] in get_computer_names():
        echo.echo_critical(
            'A computer called {c} already exists. '
            'Use "verdi computer duplicate {c}" to set up a new '
            'computer starting from the settings of {c}.'.format(
                c=kwargs['label']))

    if not non_interactive:
        try:
            pre, post = ensure_scripts(kwargs.pop('prepend_text', ''),
                                       kwargs.pop('append_text', ''), kwargs)
        except InputValidationError as exception:
            raise click.BadParameter(
                'invalid prepend and or append text: {}'.format(exception))

        kwargs['prepend_text'] = pre
        kwargs['append_text'] = post

    kwargs['transport'] = kwargs['transport'].name
    kwargs['scheduler'] = kwargs['scheduler'].name

    computer_builder = ComputerBuilder(**kwargs)
    try:
        computer = computer_builder.new()
    except (ComputerBuilder.ComputerValidationError, ValidationError) as e:
        echo.echo_critical('{}: {}'.format(type(e).__name__, e))

    try:
        computer.store()
    except ValidationError as err:
        echo.echo_critical(
            'unable to store the computer: {}. Exiting...'.format(err))
    else:
        echo.echo_success('Computer<{}> {} created'.format(
            computer.pk, computer.name))

    echo.echo_info(
        'Note: before the computer can be used, it has to be configured with the command:'
    )
    echo.echo_info('  verdi computer configure {} {}'.format(
        computer.get_transport_type(), computer.name))
def get_cx1_computer(work_dir=None, key_filename=None):
    """get or create a Computer node, to interface with the ICL Cx1 HPC

    Parameters
    ----------
    work_dir :str
        absolute path to the work directory
    key_filename : str
        ssh key filename, e.g. /Users/user_name/.ssh/id_rsa

    Returns
    -------
    aiida.orm.Computer

    """
    try:
        computer_cx1 = Computer.objects.get(name=_COMPUTER_NAME)
    except NotExistent:
        if work_dir is None:
            raise ValueError('work_dir not specified')
        computer_builder = ComputerBuilder(
            label=_COMPUTER_NAME,
            description='Imperial HPC cx1 computer',
            transport='ssh',
            scheduler='pbspro_cx1',
            hostname='login.cx1.hpc.ic.ac.uk',
            prepend_text='',
            append_text='',
            work_dir=work_dir,
            shebang='#!/bin/bash',
            mpiprocs_per_machine=16,
            mpirun_command='mpiexec')
        computer_cx1 = computer_builder.new()
        computer_cx1.store()
        computer_cx1.configure(look_for_keys=True,
                               key_filename=key_filename,
                               timeout=60,
                               allow_agent=True,
                               compress=True,
                               load_system_host_keys=True,
                               safe_interval=5.0)
    return computer_cx1