def create_code(self): """ Create a code with the information contained in this class, BUT DOES NOT STORE IT. """ import os.path from aiida.orm import Code as AiidaOrmCode if self.is_local: file_list = [ os.path.realpath(os.path.join(self.folder_with_code, f)) for f in os.listdir(self.folder_with_code) ] code = AiidaOrmCode(local_executable=self.local_rel_path, files=file_list) else: code = AiidaOrmCode(remote_computer_exec=(self.computer, self.remote_abs_path)) code.label = self.label code.description = self.description code.set_input_plugin_name(self.input_plugin) code.set_prepend_text(self.prepend_text) code.set_append_text(self.append_text) return code
def prepare_code(codename, codelocation, computername, workdir): """.""" # first create or read computer comp = prepare_computer(computername, workdir) # now decide which code to add if codename == 'kkrhost': execname = 'kkr.x' pluginname = 'kkr.kkr' elif codename == 'voronoi': execname = 'voronoi.exe' pluginname = 'kkr.voro' elif codename == 'kkrimp': execname = 'kkrflex.exe' pluginname = 'kkr.kkrimp' else: raise ValueError('unknown codename') # then get code from database or create a new code from aiida.orm import Code from aiida.common.exceptions import NotExistent try: code = Code.get_from_string(codename + '@' + computername) except NotExistent as exception: code = Code() code.label = codename code.description = '' code.set_remote_computer_exec((comp, codelocation + execname)) code.set_input_plugin_name(pluginname) if codename == 'voronoi': code.set_prepend_text('ln -s ' + codelocation + 'ElementDataBase .') code.store()
def _setup_code(self, change=None): # pylint: disable=unused-argument """Setup an AiiDA code.""" with self._setup_code_out: clear_output() if self.label is None: print("You did not specify code label") return if not self.exec_path: print("You did not specify absolute path to the executable") return if self.exists(): print("Code {}@{} already exists".format( self.label, self.computer.name)) return code = Code(remote_computer_exec=(self.computer, self.exec_path)) code.label = self.label code.description = self.description code.set_input_plugin_name(self.plugin) code.set_prepend_text(self.prepend_text) code.set_append_text(self.append_text) code.store() code.reveal() full_string = "{}@{}".format(self.label, self.computer.name) print( check_output(['verdi', 'code', 'show', full_string]).decode('utf-8'))
def mock_vasp(fresh_aiida_env, localhost): """Points to a mock-up of a VASP executable.""" from aiida.orm import Code from aiida.orm.querybuilder import QueryBuilder query_builder = QueryBuilder() query_builder.append(Code, tag='code') query_builder.add_filter('code', {'label': {'==': 'mock-vasp'}}) query_results = query_builder.all() if query_results: code = query_results[0][0] else: os_env = os.environ.copy() if not localhost.pk: localhost.store() # returns unicode mock_vasp_path = sp.check_output(['which', 'mock-vasp'], env=os_env, universal_newlines=True).strip() code = Code() code.label = 'mock-vasp' code.description = 'Mock VASP for tests' code.set_remote_computer_exec((localhost, mock_vasp_path)) code.set_input_plugin_name('vasp.vasp') aiidapath = py_path.local( fresh_aiida_env._manager.root_dir).join('.aiida') code.set_prepend_text('export AIIDA_PATH={}'.format(aiidapath)) return code
def get_code(entry_point, executable, computer=aiida_localhost, label=None, prepend_text=None, append_text=None): """Get local code. Sets up code for given entry point on given computer. :param entry_point: Entry point of calculation plugin :param executable: name of executable; will be searched for in local system PATH. :param computer: (local) AiiDA computer :param prepend_text: a string of code that will be put in the scheduler script before the execution of the code. :param append_text: a string of code that will be put in the scheduler script after the execution of the code. :return: the `Code` either retrieved from the database or created if it did not yet exist. :rtype: :py:class:`aiida.orm.Code` """ from aiida.common import exceptions from aiida.orm import Code, Computer, QueryBuilder if label is None: label = executable builder = QueryBuilder().append(Computer, filters={'uuid': computer.uuid}, tag='computer') builder.append(Code, filters={ 'label': label, 'attributes.input_plugin': entry_point }, with_computer='computer') try: code = builder.one()[0] except (exceptions.MultipleObjectsError, exceptions.NotExistent): code = None else: return code executable_path = shutil.which(executable) if not executable_path: raise ValueError( 'The executable "{}" was not found in the $PATH.'.format( executable)) code = Code(input_plugin_name=entry_point, remote_computer_exec=[computer, executable_path]) code.label = label code.description = label if prepend_text is not None: code.set_prepend_text(prepend_text) if append_text is not None: code.set_append_text(append_text) return code.store()
def vasp_code(localhost): """Fixture for a vasp code, the executable it points to does not exist""" from aiida.orm import Code localhost.store() code = Code() code.label = 'vasp' code.description = 'VASP code' code.set_remote_computer_exec((localhost, '/usr/local/bin/vasp')) code.set_input_plugin_name('vasp.vasp') return code
def test_properties_code(test_computer): from aiida.orm import Code if not test_computer.pk: test_computer.store() code = Code() code.label = 'properties' code.description = 'CRYSTAL properties code' mock_exec = os.path.join(TEST_DIR, 'mock', 'crystal') code.set_remote_computer_exec((test_computer, mock_exec)) code.set_input_plugin_name('crystal_dft.properties') return code
def test_crystal_code(test_computer): from aiida.orm import Code if not test_computer.pk: test_computer.store() code = Code() code.label = 'crystal' code.description = 'CRYSTAL code' mock_exec = os.path.join(MOCK_DIR, 'crystal') code.set_remote_computer_exec((test_computer, mock_exec)) code.set_input_plugin_name('crystal_dft.serial') return code
def get_code(self): """Setup code on localhost computer""" from aiida.orm import Code script_dir = os.path.dirname(__file__) executable = os.path.realpath(os.path.join(script_dir, '../code.py')) code = Code( files=[executable], input_plugin_name='template.multiply', local_executable='code.py') code.label = 'plugin-template' code.description = 'multiply on this computer' return code
def _setup_code(self, _=None): """Setup an AiiDA code.""" with self._setup_code_out: clear_output() if self.label is None: print("You did not specify code label.") return if not self.remote_abs_path: print("You did not specify absolute path to the executable.") return if not self.inp_computer.selected_computer: print( "Please specify a computer that is configured in your AiiDA profile." ) return False if not self.input_plugin: print( "Please specify an input plugin that is installed in your AiiDA environment." ) return False if self.exists(): print( f"Code {self.label}@{self.inp_computer.selected_computer.label} already exists." ) return code = Code(remote_computer_exec=( self.inp_computer.selected_computer, self.remote_abs_path, )) code.label = self.label code.description = self.description code.set_input_plugin_name(self.input_plugin) code.set_prepend_text(self.prepend_text) code.set_append_text(self.append_text) code.store() code.reveal() full_string = f"{self.label}@{self.inp_computer.selected_computer.label}" print( check_output(["verdi", "code", "show", full_string]).decode("utf-8"))
def new(self): """Build and return a new code instance (not stored)""" self.validate() from aiida.orm import Code # Will be used at the end to check if all keys are known (those that are not None) passed_keys = set([ k for k in self._code_spec.keys() if self._code_spec[k] is not None ]) used = set() if self._get_and_count('code_type', used) == self.CodeType.STORE_AND_UPLOAD: file_list = [ os.path.realpath(os.path.join(self.code_folder, f)) for f in os.listdir(self._get_and_count('code_folder', used)) ] code = Code(local_executable=self._get_and_count( 'code_rel_path', used), files=file_list) else: code = Code(remote_computer_exec=( self._get_and_count('computer', used), self._get_and_count('remote_abs_path', used))) code.label = self._get_and_count('label', used) code.description = self._get_and_count('description', used) code.set_input_plugin_name( self._get_and_count('input_plugin', used).name) code.set_prepend_text(self._get_and_count('prepend_text', used)) code.set_append_text(self._get_and_count('append_text', used)) # Complain if there are keys that are passed but not used if passed_keys - used: raise self.CodeValidationError( 'Unknown parameters passed to the CodeBuilder: {}'.format( ", ".join(sorted(passed_keys - used)))) return code