diff --git a/amuser/am_browser_ability.py b/amuser/am_browser_ability.py index e1fc0da6..bf6691b2 100644 --- a/amuser/am_browser_ability.py +++ b/amuser/am_browser_ability.py @@ -218,7 +218,7 @@ def wait_for_dip_in_transfer_backlog(self, dip_uuid): ).send_keys(dip_uuid) Select( self.driver.find_element_by_css_selector('select[title="field name"]') - ).select_by_visible_text("SIP UUID") + ).select_by_visible_text("Transfer UUID") Select( self.driver.find_element_by_css_selector('select[title="query type"]') ).select_by_visible_text("Phrase") diff --git a/amuser/am_mets_ability.py b/amuser/am_mets_ability.py index 1e7dc0d6..9872ed82 100644 --- a/amuser/am_mets_ability.py +++ b/amuser/am_mets_ability.py @@ -24,24 +24,23 @@ def get_premis_events(mets): dicts. """ result = [] - for premis_event_el in mets.findall(".//premis3:event", c.METS_NSMAP): + for premis_event_el in mets.findall(".//premis:event", c.METS_NSMAP): result.append( { "event_type": premis_event_el.find( - "premis3:eventType", c.METS_NSMAP + "premis:eventType", c.METS_NSMAP ).text, "event_detail": premis_event_el.find( - "premis3:eventDetailInformation/premis3:eventDetail", - c.METS_NSMAP, + "premis:eventDetailInformation/premis:eventDetail", c.METS_NSMAP ).text, "event_outcome": premis_event_el.find( - "premis3:eventOutcomeInformation/premis3:eventOutcome", + "premis:eventOutcomeInformation/premis:eventOutcome", c.METS_NSMAP, ).text, "event_outcome_detail_note": premis_event_el.find( - "premis3:eventOutcomeInformation" - "/premis3:eventOutcomeDetail" - "/premis3:eventOutcomeDetailNote", + "premis:eventOutcomeInformation" + "/premis:eventOutcomeDetail" + "/premis:eventOutcomeDetailNote", c.METS_NSMAP, ).text, } @@ -120,13 +119,13 @@ def assert_empty_dir_documented_identified(mets_doc, empty_dir_rel_path): assert dmd_sec_el is not None identifiers = [] for obj_idfr_el in dmd_sec_el.findall( - "mets:mdWrap/" "mets:xmlData/" "premis3:object/" "premis3:objectIdentifier", + "mets:mdWrap/" "mets:xmlData/" "premis:object/" "premis:objectIdentifier", ns, ): identifiers.append( ( - obj_idfr_el.find("premis3:objectIdentifierType", ns).text, - obj_idfr_el.find("premis3:objectIdentifierValue", ns).text, + obj_idfr_el.find("premis:objectIdentifierType", ns).text, + obj_idfr_el.find("premis:objectIdentifierValue", ns).text, ) ) uuid_id = [ival for itype, ival in identifiers if itype == "UUID"][0] @@ -153,27 +152,27 @@ def _add_entity_identifiers(entity, doc, ns): obj_idfr_els = amd_sec_el.findall( ".//mets:mdWrap/" "mets:xmlData/" - "premis3:object/" - "premis3:objectIdentifier", + "premis:object/" + "premis:objectIdentifier", ns, ) for obj_idfr_el in obj_idfr_els: identifiers.append( ( - obj_idfr_el.find("premis3:objectIdentifierType", ns).text, - obj_idfr_el.find("premis3:objectIdentifierValue", ns).text, + obj_idfr_el.find("premis:objectIdentifierType", ns).text, + obj_idfr_el.find("premis:objectIdentifierValue", ns).text, ) ) else: dmd_sec_el = doc.xpath("mets:dmdSec[@ID='{}']".format(e_id), namespaces=ns)[0] for obj_idfr_el in dmd_sec_el.findall( - "mets:mdWrap/" "mets:xmlData/" "premis3:object/" "premis3:objectIdentifier", + "mets:mdWrap/" "mets:xmlData/" "premis:object/" "premis:objectIdentifier", ns, ): identifiers.append( ( - obj_idfr_el.find("premis3:objectIdentifierType", ns).text, - obj_idfr_el.find("premis3:objectIdentifierValue", ns).text, + obj_idfr_el.find("premis:objectIdentifierType", ns).text, + obj_idfr_el.find("premis:objectIdentifierValue", ns).text, ) ) entity["identifiers"] = identifiers diff --git a/amuser/constants.py b/amuser/constants.py index 63b74b32..cfa1d40a 100644 --- a/amuser/constants.py +++ b/amuser/constants.py @@ -315,8 +315,7 @@ def varvn(varname, vn): # Namespace map for parsing METS XML. METS_NSMAP = { "mets": "http://www.loc.gov/METS/", - "premis": "info:lc/xmlns/premis-v2", - "premis3": "http://www.loc.gov/premis/v3", + "premis": "http://www.loc.gov/premis/v3", "dc": "http://purl.org/dc/elements/1.1/", "dcterms": "http://purl.org/dc/terms/", "xlink": "http://www.w3.org/1999/xlink", diff --git a/features/steps/aip_encryption_steps.py b/features/steps/aip_encryption_steps.py index 4821012f..e5066250 100644 --- a/features/steps/aip_encryption_steps.py +++ b/features/steps/aip_encryption_steps.py @@ -51,7 +51,9 @@ def step_impl(context): " attributes" " Purpose: AIP Storage;" " Relative path: var/archivematica/sharedDirectory/www/AIPsStoreEncrypted;" - " Description: Store AIP Encrypted in standard Archivematica Directory;" + " Description: {};".format( + utils.get_gpg_space_location_description(context.scenario.space_uuid) + ) ) @@ -149,15 +151,19 @@ def step_impl(context): ) context.scenario.new_key_name = new_key_name context.scenario.new_key_fingerprint = new_key_fingerprint - # Edit the "standard GPG-encrypted space" to use the new GPG key - standard_encr_space_uuid = context.am_user.browser.search_for_ss_space( - { - "Access protocol": "GPG encryption on Local Filesystem", - "Path": "/", - "Staging path": "/var/archivematica/storage_service/storage_service_encrypted", - "GnuPG Private Key": "Archivematica Storage Service GPG Key", - } - )["uuid"] + if getattr(context.scenario, "space_uuid", None) is not None: + # Don't look for a space if previos steps saved it + standard_encr_space_uuid = context.scenario.space_uuid + else: + # Edit the "standard GPG-encrypted space" to use the new GPG key + standard_encr_space_uuid = context.am_user.browser.search_for_ss_space( + { + "Access protocol": "GPG encryption on Local Filesystem", + "Path": "/", + "Staging path": "/var/archivematica/storage_service/storage_service_encrypted", + "GnuPG Private Key": "Archivematica Storage Service GPG Key", + } + )["uuid"] new_key_repr = "{} <{}>".format(new_key_name, new_key_email) logger.info('Created a new GPG key "%s"', new_key_repr) context.am_user.browser.change_encrypted_space_key( @@ -170,7 +176,9 @@ def step_impl(context): ) def step_impl(context): context.execute_steps( - 'Given the processing config decision "Store AIP location" is set to "Store AIP Encrypted in standard Archivematica Directory"\n' + 'Given the processing config decision "Store AIP location" is set to "{}"\n'.format( + utils.get_gpg_space_location_description(context.scenario.space_uuid) + ) ) @@ -207,15 +215,19 @@ def step_impl(context): """Edit the standard GPG-encrypted space so that it is using a GPG key other than the one stored in ``context.scenario.new_key_name``. """ - # Edit the "standard GPG-encrypted space" to use the new GPG key - standard_encr_space_uuid = context.am_user.browser.search_for_ss_space( - { - "Access protocol": "GPG encryption on Local Filesystem", - "Path": "/", - "Staging path": "/var/archivematica/storage_service/storage_service_encrypted", - "GnuPG Private Key": context.scenario.new_key_name, - } - )["uuid"] + if getattr(context.scenario, "space_uuid", None) is not None: + # Don't look for a space if previos steps saved it + standard_encr_space_uuid = context.scenario.space_uuid + else: + # Edit the "standard GPG-encrypted space" to use the new GPG key + standard_encr_space_uuid = context.am_user.browser.search_for_ss_space( + { + "Access protocol": "GPG encryption on Local Filesystem", + "Path": "/", + "Staging path": "/var/archivematica/storage_service/storage_service_encrypted", + "GnuPG Private Key": context.scenario.new_key_name, + } + )["uuid"] context.am_user.browser.change_encrypted_space_key(standard_encr_space_uuid) @@ -346,7 +358,7 @@ def step_impl(context): './/mets:mdWrap[@MDTYPE="PREMIS:EVENT"]', context.am_user.mets.mets_nsmap ): premis_event_type_el = premis_event_el.find( - "mets:xmlData/premis3:event/premis3:eventType", + "mets:xmlData/premis:event/premis:eventType", context.am_user.mets.mets_nsmap, ) if premis_event_type_el.text.strip() == "encryption": @@ -356,13 +368,13 @@ def step_impl(context): # program=gpg (GPG); version=1.4.16; python-gnupg; # version=0.4.0 premis_event_detail = premis_event.find( - "mets:xmlData/premis3:event/premis3:eventDetailInformation/premis3:eventDetail", + "mets:xmlData/premis:event/premis:eventDetailInformation/premis:eventDetail", context.am_user.mets.mets_nsmap, ).text assert "GPG" in premis_event_detail assert "version=" in premis_event_detail premis_event_od_note = premis_event.find( - "mets:xmlData/premis3:event/premis3:eventOutcomeInformation/premis3:eventOutcomeDetail/premis3:eventOutcomeDetailNote", + "mets:xmlData/premis:event/premis:eventOutcomeInformation/premis:eventOutcomeDetail/premis:eventOutcomeDetailNote", context.am_user.mets.mets_nsmap, ).text.strip() assert 'Status="encryption ok"' in premis_event_od_note @@ -590,7 +602,7 @@ def assert_pointer_premis_event(**kwargs): kwargs["context"].am_user.mets.mets_nsmap, ): premis_event_type_el = premis_event_el.find( - "mets:xmlData/premis3:event/premis3:eventType", + "mets:xmlData/premis:event/premis:eventType", kwargs["context"].am_user.mets.mets_nsmap, ) if premis_event_type_el.text.strip() == kwargs["event_type"]: @@ -598,13 +610,13 @@ def assert_pointer_premis_event(**kwargs): break assert premis_event is not None premis_event_uuid = premis_event.find( - "mets:xmlData/premis3:event/premis3:eventIdentifier/premis3:eventIdentifierValue", + "mets:xmlData/premis:event/premis:eventIdentifier/premis:eventIdentifierValue", kwargs["context"].am_user.mets.mets_nsmap, ).text.strip() if kwargs.get("in_evt_dtl"): in_evt_dtl = kwargs["in_evt_dtl"] or [] premis_event_detail = premis_event.find( - "mets:xmlData/premis3:event/premis3:eventDetailInformation/premis3:eventDetail", + "mets:xmlData/premis:event/premis:eventDetailInformation/premis:eventDetail", kwargs["context"].am_user.mets.mets_nsmap, ).text.strip() for substr in in_evt_dtl: @@ -612,7 +624,7 @@ def assert_pointer_premis_event(**kwargs): if kwargs.get("in_evt_out"): in_evt_out = kwargs["in_evt_out"] or [] premis_event_out = premis_event.find( - "mets:xmlData/premis3:event/premis3:eventOutcomeInformation/premis3:eventOutcome", + "mets:xmlData/premis:event/premis:eventOutcomeInformation/premis:eventOutcome", kwargs["context"].am_user.mets.mets_nsmap, ).text.strip() for substr in in_evt_out: @@ -620,7 +632,7 @@ def assert_pointer_premis_event(**kwargs): if kwargs.get("in_evt_out_dtl_nt"): in_evt_out_dtl_nt = kwargs["in_evt_out_dtl_nt"] or [] premis_event_od_note = premis_event.find( - "mets:xmlData/premis3:event/premis3:eventOutcomeInformation/premis3:eventOutcomeDetail/premis3:eventOutcomeDetailNote", + "mets:xmlData/premis:event/premis:eventOutcomeInformation/premis:eventOutcomeDetail/premis:eventOutcomeDetailNote", kwargs["context"].am_user.mets.mets_nsmap, ).text.strip() for substr in in_evt_out_dtl_nt: @@ -706,14 +718,14 @@ def assert_pointer_transform_file_encryption(pointer_path, ns, fingerprint=None) "TRANSFORMKEY fingerprint {} does not match expected" " fingerprint {}".format(transform_key, fingerprint) ) - # premis3:compositionLevel incremented + # premis:compositionLevel incremented compos_lvl_el = doc.find( "mets:amdSec/mets:techMD/mets:mdWrap/mets:xmlData/premis:object/premis:objectCharacteristics/premis:compositionLevel", ns, ) assert compos_lvl_el is not None assert compos_lvl_el.text.strip() == "2" - # premis3:inhibitors added + # premis:inhibitors added inhibitors_el = doc.find( "mets:amdSec/mets:techMD/mets:mdWrap/mets:xmlData/premis:object/premis:objectCharacteristics/premis:inhibitors", ns, diff --git a/features/steps/black_box_steps.py b/features/steps/black_box_steps.py index 5c81de73..56daab40 100644 --- a/features/steps/black_box_steps.py +++ b/features/steps/black_box_steps.py @@ -231,9 +231,9 @@ def step_impl(context): 'mets:amdSec[@ID="{}"]'.format(amdsec_id), namespaces=context.mets_nsmap ) object_uuid = amdsec.xpath( - "mets:techMD/mets:mdWrap/mets:xmlData/premis3:object/" - 'premis3:objectIdentifier/premis3:objectIdentifierType[text()="UUID"]/' - "../premis3:objectIdentifierValue", + "mets:techMD/mets:mdWrap/mets:xmlData/premis:object/" + 'premis:objectIdentifier/premis:objectIdentifierType[text()="UUID"]/' + "../premis:objectIdentifierValue", namespaces=context.mets_nsmap, )[0].text assert object_uuid == file_uuid @@ -263,7 +263,7 @@ def step_impl(context): tree = etree.parse(context.current_transfer["aip_mets_location"]) premis_events = tree.findall( 'mets:amdSec/mets:digiprovMD/mets:mdWrap[@MDTYPE="PREMIS:EVENT"]/' - "mets:xmlData/premis3:event", + "mets:xmlData/premis:event", namespaces=context.mets_nsmap, ) error = "The {} file does not contain any PREMIS events".format( @@ -272,12 +272,12 @@ def step_impl(context): assert premis_events, error for event in premis_events: event_agents = event.findall( - "premis3:linkingAgentIdentifier", namespaces=context.mets_nsmap + "premis:linkingAgentIdentifier", namespaces=context.mets_nsmap ) event_agent_types = set( [ event_agent.findtext( - "premis3:linkingAgentIdentifierType", namespaces=context.mets_nsmap + "premis:linkingAgentIdentifierType", namespaces=context.mets_nsmap ) for event_agent in event_agents ] diff --git a/features/steps/utils.py b/features/steps/utils.py index aa5cb601..003eacbc 100644 --- a/features/steps/utils.py +++ b/features/steps/utils.py @@ -869,3 +869,9 @@ def assert_source_md_in_bagit_mets(mets_root, mets_nsmap): assert element_count > 0, "No elements in BagIt transfer metadata: {}".format( element_count ) + + +def get_gpg_space_location_description(space_uuid): + return "Store AIP Encrypted in standard Archivematica Directory ({})".format( + space_uuid + ) diff --git a/features/steps/uuids_for_directories_steps.py b/features/steps/uuids_for_directories_steps.py index 48258843..bcce49f8 100644 --- a/features/steps/uuids_for_directories_steps.py +++ b/features/steps/uuids_for_directories_steps.py @@ -240,10 +240,10 @@ def step_impl(context): ), "Could not find a for directory at {}".format(dirpath) try: id_type = dmdSec_el.find( - ".//premis3:objectIdentifierType", ns + ".//premis:objectIdentifierType", ns ).text.strip() id_val = dmdSec_el.find( - ".//premis3:objectIdentifierValue", ns + ".//premis:objectIdentifierValue", ns ).text.strip() except AttributeError: logger.info(ns)