Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor Computer and add --format option to verdi computer show #3616

Closed
wants to merge 2 commits into from

Conversation

sphuber
Copy link
Contributor

@sphuber sphuber commented Dec 9, 2019

Fixes #2135 and fixes #3521

The `aiida.orm.computers.Computer` front-end class had a mixture of
properties and methods to get and set various properties. Which one was
available depended on how that property was stored in the backend. Those
that are stored as database columns were exposed through property getter
and setters, whereas properties that are part of the `metadata` JSONB
column had individual methods.

Besides being inconsistent, having explicit methods for each property,
of which there are already quite a few and which might increase in the
future, is inconvenient. It also makes it more difficult to
programmatically get all the properties that "define" a computer. By
defining all properties in a mapping class attribute, one can define all
setters and getters dynamically.
This allows to, in addition to the default table display, dump the
contents of a computer in yaml format which can in turn be used for the
`--config` option of `verdi computer setup`. This makes the sharing of a
particular computer that has been setup very easy. Sharing yaml config
files is more apt than AiiDA export archives which was the only possible
way of sharing `Computer` instances to date.
Copy link
Member

@ltalirz ltalirz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @sphuber - I fully agree with the direction of the PR.

I started looking through dir(Computer()) and I have some questions:

  • do we want to expose the PROPERTY_... variables at the class level for autocompletion?
  • what decides whether a certain quantity gets its own @property or whether it needs to go via get_property/set_property methods? Perhaps we should add the list to the commit message:
    Accessible via property: description, hostname, id, label, pk, scheduler_type, transport_type
  • The naming of "property" here vs "attributes/extras" in nodes. I guess semantically they are extras in the sense that one can simply change them. I was surprised to find that you can do that via the python API, while the CLI clearly suggests to clone the computer if you need to. I think this is problematic from a provenance point of view.

Below the output of dir(Computer()), minus the methods starting with double underscores.
I've marked deprecated methods with an X.

['Collection',
 'PROPERTY_APPEND_TEXT',
 'PROPERTY_MINIMUM_SCHEDULER_POLL_INTERVAL',
 'PROPERTY_MPI_PROCES_PER_MACHINE',
 'PROPERTY_MPI_RUN_COMMAND',
 'PROPERTY_PREPEND_TEXT',
 'PROPERTY_SHEBANG',
 'PROPERTY_WORK_DIR',
'_backend_entity',
 '_called',
 '_logger',
 '_objects',
 '_property_mapping',
 'backend',
 'backend_entity',
 'configure',
 'copy',
 'delete_property',
 'description',
 'from_backend_entity',
 'full_text_info', X
 'get',
 'get_append_text', X
 'get_authinfo',
 'get_configuration',
 'get_default_mpiprocs_per_machine', X
 'get_description', X
 'get_hostname', X
 'get_metadata',
 'get_minimum_job_poll_interval', X
 'get_mpirun_command', X
 'get_name', X
 'get_prepend_text', X
 'get_properties',
 'get_property', 
 'get_scheduler', 
 'get_scheduler_type', X
 'get_schema', X
 'get_shebang', X
 'get_transport',
 'get_transport_class',
 'get_transport_type', X
 'get_workdir',X
 'hostname',
 'id',
 'init_from_backend',
 'initialize',
 'is_stored',
 'is_user_configured',
 'is_user_enabled',
 'label',
 'logger',
 'name', X
 'objects',
 'pk',
 'scheduler_type',
 'set_append_text', X
 'set_default_mpiprocs_per_machine', X
 'set_description', X
 'set_hostname', X
 'set_metadata',
 'set_minimum_job_poll_interval', X
 'set_mpirun_command', X
 'set_name', X
 'set_prepend_text', X
 'set_property',
 'set_scheduler_type', X
 'set_shebang', X
 'set_transport_type', X
 'set_workdir', X
 'store',
 'transport_type',
 'uuid']

@@ -245,7 +245,7 @@ def code_list(computer, input_plugin, all_entries, all_users, show_owner):

qb_computer_filters = dict()
if computer is not None:
qb_computer_filters['name'] = computer.name
qb_computer_filters['name'] = computer.lbael
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
qb_computer_filters['name'] = computer.lbael
qb_computer_filters['name'] = computer.label

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure whether this is also in other places (I guess not?) - a quick search should show

@@ -130,21 +128,13 @@ def get_workdir(self):
try:
return self.get_metadata()[self.PROPERTY_WORKDIR]
except KeyError:
return self.computer.get_workdir()
return self.computer.get_property('work_dir')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The property seems to be called workdir - at least on profile (on your branch) I get:

In [1]: c=load_computer(1)

In [2]: c.get_metadata()
Out[2]:
{'shebang': '#!/bin/bash',
 'workdir': '/scratch/{username}/aiida_run/',
 'append_text': ' ',
 'prepend_text': ' ',
 'mpirun_command': ['srun', '-n', '{tot_num_mpiprocs}'],
 'default_mpiprocs_per_machine': 28}

would this be broken now?

@ramirezfranciscof
Copy link
Member

@ltalirz is this your review or just a few comments? Just to know if after @sphuber answers this would be ready to be merged or further reviewing is needed.

@ltalirz
Copy link
Member

ltalirz commented Feb 26, 2020

This was my review of the PR (but it does contain a couple of questions).

@ramirezfranciscof
Copy link
Member

Yes yes, I was just checking if after @sphuber addressed them it could be merged or further full reviewing was needed.

@sphuber
Copy link
Contributor Author

sphuber commented Feb 27, 2020

This needs quite a bit more discussion. The goal was to homogenize the interface of the Computer class, to reduce the number of defined methods and to provide a way to programmatically determine what "properties" define a Computer. This is necessary to implement a sort of export functionality that can export a computer in yaml format that can then be consumed again by verdi computer setup --config. However, I am not happy with the current solution. Still not sure what the best way is to do this

@ramirezfranciscof
Copy link
Member

ramirezfranciscof commented Feb 27, 2020

Would it help to bring it for discussion during the next fortnightly meeting? If it needs more than that and we are not sure when we'll be able to deal with it maybe we should close the PR?

@sphuber
Copy link
Contributor Author

sphuber commented Mar 27, 2020

Since I think this requires quite a bit more discussion and work, I will close this for now

@sphuber sphuber closed this Mar 27, 2020
@ltalirz
Copy link
Member

ltalirz commented Apr 14, 2020

Just one comment in case someone wants to pick this up again: I think fixing #3521 (i.e. adding the yaml export) is quite straightforward.
What needs discussion is which methods etc. to expose on Computers.

@sphuber
Copy link
Contributor Author

sphuber commented Apr 14, 2020

Just one comment in case someone wants to pick this up again: I think fixing #3521 (i.e. adding the yaml export) is quite straightforward.
What needs discussion is which methods etc. to expose on Computers.

An ad-hoc implementation would indeed be straightforward, but this would most likely hard code which properties need to be dumped, how to fetch them from a computer instance and to what keys they should be written.

The whole reason why my attempt became so much more involved was because I was exactly trying to find a way to avoid this, for which a significant redesign of these ORM classes is necessary

@sphuber sphuber deleted the fix_3521_refactor_computer branch June 23, 2020 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

orm.Computer define class constants for all properties dump computer/codes in YAML format
3 participants