def test_positive_on_demand_sync(self): """Create a repository with 'on_demand' sync, add it to lifecycle environment with a capsule, sync repository, examine existing packages on capsule, download any package, examine packages once more :id: ba470269-a7ad-4181-bc7c-8e17a177ca20 :expectedresults: 1. After initial syncing only symlinks are present on both satellite and capsule, no real packages were fetched. 2. All the symlinks are pointing to non-existent files. 3. Attempt to download package is successful 4. Downloaded package checksum matches checksum of the source package :CaseLevel: System """ repo_url = FAKE_3_YUM_REPO packages_count = FAKE_3_YUM_REPOS_COUNT package = FAKE_1_YUM_REPO_RPMS[0] # Create organization, product, repository in satellite, and lifecycle # environment org = entities.Organization().create() prod = entities.Product(organization=org).create() repo = entities.Repository( download_policy='on_demand', mirror_on_sync=True, product=prod, url=repo_url, ).create() lce = entities.LifecycleEnvironment(organization=org).create() # Associate the lifecycle environment with the capsule capsule = entities.Capsule(id=self.capsule_id).read() capsule.content_add_lifecycle_environment(data={ 'environment_id': lce.id, }) result = capsule.content_lifecycle_environments() self.assertGreaterEqual(len(result['results']), 1) self.assertIn(lce.id, [capsule_lce['id'] for capsule_lce in result['results']]) # Create a content view with the repository cv = entities.ContentView( organization=org, repository=[repo], ).create() # Sync repository repo.sync() repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() self.assertEqual(len(cv.version), 1) cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, lce.id) cvv = cvv.read() self.assertEqual(len(cvv.environment), 2) # Assert that a task to sync lifecycle environment to the capsule # is started (or finished already) sync_status = capsule.content_get_sync() self.assertTrue( len(sync_status['active_sync_tasks']) >= 1 or sync_status['last_sync_time']) # Check whether the symlinks for all the packages were created on # satellite cvv_repo_path = form_repo_path( org=org.label, cv=cv.label, cvv=cvv.version, prod=prod.label, repo=repo.label, ) result = ssh.command('find {}/ -type l'.format(cvv_repo_path)) self.assertEqual(result.return_code, 0) links = set(link for link in result.stdout if link) self.assertEqual(len(links), packages_count) # Ensure all the symlinks on satellite are broken (pointing to # nonexistent files) result = ssh.command( 'find {}/ -type l ! -exec test -e {{}} \\; -print'.format( cvv_repo_path)) self.assertEqual(result.return_code, 0) broken_links = set(link for link in result.stdout if link) self.assertEqual(len(broken_links), packages_count) self.assertEqual(broken_links, links) # Wait till capsule sync finishes for task in sync_status['active_sync_tasks']: entities.ForemanTask(id=task['id']).poll() lce_repo_path = form_repo_path( org=org.label, lce=lce.label, cv=cv.label, prod=prod.label, repo=repo.label, ) # Check whether the symlinks for all the packages were created on # capsule result = ssh.command( 'find {}/ -type l'.format(lce_repo_path), hostname=self.capsule_ip, ) self.assertEqual(result.return_code, 0) links = set(link for link in result.stdout if link) self.assertEqual(len(links), packages_count) # Ensure all the symlinks on capsule are broken (pointing to # nonexistent files) result = ssh.command( 'find {}/ -type l ! -exec test -e {{}} \\; -print'.format( lce_repo_path), hostname=self.capsule_ip, ) self.assertEqual(result.return_code, 0) broken_links = set(link for link in result.stdout if link) self.assertEqual(len(broken_links), packages_count) self.assertEqual(broken_links, links) # Download package from satellite and get its md5 checksum published_repo_url = 'http://{}{}/pulp/{}/'.format( settings.server.hostname, ':{}'.format(settings.server.port) if settings.server.port else '', lce_repo_path.split('http/')[1]) package_md5 = md5_by_url('{}{}'.format(repo_url, package)) # Get md5 checksum of source package published_package_md5 = md5_by_url('{}{}'.format( published_repo_url, package)) # Assert checksums are matching self.assertEqual(package_md5, published_package_md5)
def test_positive_on_demand_sync(self, capsule_configured, default_sat): """Create a repository with 'on_demand' policy, add it to a CV, promote to an 'on_demand' Capsule's LCE, check artifacts were created, download a published package, assert it matches the source. :id: ba470269-a7ad-4181-bc7c-8e17a177ca20 :expectedresults: 1. A custom yum repository is successfully synced and ContentView published 2. The ContentView is successfully promoted to the Capsule's LCE and the content is automatically synced to the Capsule 3. Artifacts are created on the Capsule in /var/lib/pulp/media/artifacts/ 4. Package is successfully downloaded from the Capsule, its checksum matches the original package from the upstream repo :CaseLevel: System """ repo_url = settings.repos.yum_3.url packages_count = constants.FAKE_3_YUM_REPOS_COUNT package = constants.FAKE_3_YUM_REPO_RPMS[0] # Create organization, product, repository in satellite, and lifecycle # environment org = entities.Organization().create() prod = entities.Product(organization=org).create() repo = entities.Repository(download_policy='on_demand', mirror_on_sync=True, product=prod, url=repo_url).create() lce = entities.LifecycleEnvironment(organization=org).create() # Associate the lifecycle environment with the capsule capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': lce.id}) result = capsule_configured.nailgun_capsule.content_lifecycle_environments( ) assert len(result['results']) assert lce.id in [ capsule_lce['id'] for capsule_lce in result['results'] ] # Create a content view with the repository cv = entities.ContentView(organization=org, repository=[repo]).create() # Sync repository repo.sync() repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() assert len(cv.version) == 1 cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, lce.id) cvv = cvv.read() assert len(cvv.environment) == 2 # Assert that a task to sync lifecycle environment to the capsule # is started (or finished already) sync_status = capsule_configured.nailgun_capsule.content_get_sync() assert len( sync_status['active_sync_tasks']) or sync_status['last_sync_time'] # Wait till capsule sync finishes for task in sync_status['active_sync_tasks']: entities.ForemanTask(id=task['id']).poll() # Verify that new artifacts were created on Capsule but rpms were not downloaded result = capsule_configured.run( 'find /var/lib/pulp/media/artifact -type f | wc -l') assert 0 < int(result.stdout) < packages_count # Verify packages on Capsule match the source caps_repo_url = form_repo_url( capsule_configured, org=org.label, lce=lce.label, cv=cv.label, prod=prod.label, repo=repo.label, ) source_files = get_repo_files_by_url(repo_url) caps_files = get_repo_files_by_url(caps_repo_url) assert source_files == caps_files assert len(caps_files) == packages_count # Download a package from the Capsule and get its md5 checksum published_package_md5 = md5_by_url(f'{caps_repo_url}/{package}') # Get md5 checksum of source package package_md5 = md5_by_url(f'{repo_url}/{package}') # Assert checksums are matching assert package_md5 == published_package_md5
def test_positive_on_demand_sync(self, capsule_configured): """Create a repository with 'on_demand' sync, add it to lifecycle environment with a capsule, sync repository, examine existing packages on capsule, download any package, examine packages once more :id: ba470269-a7ad-4181-bc7c-8e17a177ca20 :expectedresults: 1. After initial syncing only symlinks are present on both satellite and capsule, no real packages were fetched. 2. All the symlinks are pointing to non-existent files. 3. Attempt to download package is successful 4. Downloaded package checksum matches checksum of the source package :CaseLevel: System """ repo_url = constants.repos.FAKE_3_YUM_REPO packages_count = constants.FAKE_3_YUM_REPOS_COUNT package = constants.YUM_REPO_RPMS[0] # Create organization, product, repository in satellite, and lifecycle # environment org = entities.Organization().create() prod = entities.Product(organization=org).create() repo = entities.Repository(download_policy='on_demand', mirror_on_sync=True, product=prod, url=repo_url).create() lce = entities.LifecycleEnvironment(organization=org).create() # Associate the lifecycle environment with the capsule capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': lce.id}) result = capsule_configured.nailgun_capsule.content_lifecycle_environments( ) assert len(result['results']) assert lce.id in [ capsule_lce['id'] for capsule_lce in result['results'] ] # Create a content view with the repository cv = entities.ContentView(organization=org, repository=[repo]).create() # Sync repository repo.sync() repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() assert len(cv.version) == 1 cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, lce.id) cvv = cvv.read() assert len(cvv.environment) == 2 # Assert that a task to sync lifecycle environment to the capsule # is started (or finished already) sync_status = capsule_configured.nailgun_capsule.content_get_sync() assert len( sync_status['active_sync_tasks']) or sync_status['last_sync_time'] # Check whether the symlinks for all the packages were created on # satellite cvv_repo_path = form_repo_path(org=org.label, cv=cv.label, cvv=cvv.version, prod=prod.label, repo=repo.label) result = ssh.command(f'find {cvv_repo_path}/ -type l') assert result.return_code == 0 links = {link for link in result.stdout if link} assert len(links) == packages_count # Ensure all the symlinks on satellite are broken (pointing to # nonexistent files) result = ssh.command( f'find {cvv_repo_path}/ -type l ! -exec test -e {{}} \\; -print') assert result.return_code == 0 broken_links = {link for link in result.stdout if link} assert len(broken_links) == packages_count assert broken_links == links # Wait till capsule sync finishes for task in sync_status['active_sync_tasks']: entities.ForemanTask(id=task['id']).poll() lce_repo_path = form_repo_path(org=org.label, lce=lce.label, cv=cv.label, prod=prod.label, repo=repo.label) # Check whether the symlinks for all the packages were created on # capsule result = capsule_configured.run(f'find {lce_repo_path}/ -type l') assert result.status == 0 links = {link for link in result.stdout if link} assert len(links) == packages_count # Ensure all the symlinks on capsule are broken (pointing to # nonexistent files) result = capsule_configured.run( f'find {lce_repo_path}/ -type l ! -exec test -e {{}} \\; -print', ) assert result.status == 0 broken_links = {link for link in result.stdout if link} assert len(broken_links) == packages_count assert broken_links == links # Download package from satellite and get its md5 checksum published_repo_url = 'http://{}{}/pulp/{}/'.format( settings.server.hostname, f':{settings.server.port}' if settings.server.port else '', lce_repo_path.split('http/')[1], ) package_md5 = md5_by_url(f'{repo_url}{package}') # Get md5 checksum of source package published_package_md5 = md5_by_url(f'{published_repo_url}{package}') # Assert checksums are matching assert package_md5 == published_package_md5
def test_positive_on_demand_sync(self): """Create a repository with 'on_demand' sync, add it to lifecycle environment with a capsule, sync repository, examine existing packages on capsule, download any package, examine packages once more :id: ba470269-a7ad-4181-bc7c-8e17a177ca20 :expectedresults: 1. After initial syncing only symlinks are present on both satellite and capsule, no real packages were fetched. 2. All the symlinks are pointing to non-existent files. 3. Attempt to download package is successful 4. Downloaded package checksum matches checksum of the source package :CaseLevel: System """ repo_url = FAKE_3_YUM_REPO packages_count = FAKE_3_YUM_REPOS_COUNT package = FAKE_1_YUM_REPO_RPMS[0] # Create organization, product, repository in satellite, and lifecycle # environment org = entities.Organization().create() prod = entities.Product(organization=org).create() repo = entities.Repository( download_policy='on_demand', mirror_on_sync=True, product=prod, url=repo_url, ).create() lce = entities.LifecycleEnvironment(organization=org).create() # Associate the lifecycle environment with the capsule capsule = entities.Capsule(id=self.capsule_id).read() capsule.content_add_lifecycle_environment(data={ 'environment_id': lce.id, }) result = capsule.content_lifecycle_environments() self.assertGreaterEqual(len(result['results']), 1) self.assertIn( lce.id, [capsule_lce['id'] for capsule_lce in result['results']] ) # Create a content view with the repository cv = entities.ContentView( organization=org, repository=[repo], ).create() # Sync repository repo.sync() repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() self.assertEqual(len(cv.version), 1) cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, lce.id) cvv = cvv.read() self.assertEqual(len(cvv.environment), 2) # Assert that a task to sync lifecycle environment to the capsule # is started (or finished already) sync_status = capsule.content_get_sync() self.assertTrue( len(sync_status['active_sync_tasks']) >= 1 or sync_status['last_sync_time'] ) # Check whether the symlinks for all the packages were created on # satellite cvv_repo_path = form_repo_path( org=org.label, cv=cv.label, cvv=cvv.version, prod=prod.label, repo=repo.label, ) result = ssh.command('find {}/ -type l'.format(cvv_repo_path)) self.assertEqual(result.return_code, 0) links = set(link for link in result.stdout if link) self.assertEqual(len(links), packages_count) # Ensure all the symlinks on satellite are broken (pointing to # nonexistent files) result = ssh.command( 'find {}/ -type l ! -exec test -e {{}} \\; -print' .format(cvv_repo_path) ) self.assertEqual(result.return_code, 0) broken_links = set(link for link in result.stdout if link) self.assertEqual(len(broken_links), packages_count) self.assertEqual(broken_links, links) # Wait till capsule sync finishes for task in sync_status['active_sync_tasks']: entities.ForemanTask(id=task['id']).poll() lce_repo_path = form_repo_path( org=org.label, lce=lce.label, cv=cv.label, prod=prod.label, repo=repo.label, ) # Check whether the symlinks for all the packages were created on # capsule result = ssh.command( 'find {}/ -type l'.format(lce_repo_path), hostname=self.capsule_ip, ) self.assertEqual(result.return_code, 0) links = set(link for link in result.stdout if link) self.assertEqual(len(links), packages_count) # Ensure all the symlinks on capsule are broken (pointing to # nonexistent files) result = ssh.command( 'find {}/ -type l ! -exec test -e {{}} \\; -print' .format(lce_repo_path), hostname=self.capsule_ip, ) self.assertEqual(result.return_code, 0) broken_links = set(link for link in result.stdout if link) self.assertEqual(len(broken_links), packages_count) self.assertEqual(broken_links, links) # Download package from satellite and get its md5 checksum published_repo_url = 'http://{}{}/pulp/{}/'.format( settings.server.hostname, ':{}'.format(settings.server.port) if settings.server.port else '', lce_repo_path.split('http/')[1] ) package_md5 = md5_by_url('{}{}'.format(repo_url, package)) # Get md5 checksum of source package published_package_md5 = md5_by_url( '{}{}'.format(published_repo_url, package)) # Assert checksums are matching self.assertEqual(package_md5, published_package_md5)
def test_positive_sync_kickstart_repo(self, module_manifest_org, default_sat, capsule_configured): """Sync kickstart repository to the capsule. :id: bc97b53f-f79b-42f7-8014-b0641435bcfc :steps: 1. Sync a kickstart repository to Satellite. 2. Publish it in a CV, promote to Capsule's LCE. 3. Check it is synced to Capsule without errors. 4. Check for kickstart content on Satellite and Capsule. :expectedresults: 1. The kickstart repo is successfully synced to the Capsule. :CaseLevel: Integration :BZ: 1992329 """ repo_id = enable_rhrepo_and_fetchid( basearch='x86_64', org_id=module_manifest_org.id, product=constants.PRDS['rhel8'], repo=constants.REPOS['rhel8_bos_ks']['name'], reposet=constants.REPOSET['rhel8_bos_ks'], releasever='8.4', ) repo = entities.Repository(id=repo_id).read() lce = entities.LifecycleEnvironment( organization=module_manifest_org).create() # Associate the lifecycle environment with the capsule capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': lce.id}) result = capsule_configured.nailgun_capsule.content_lifecycle_environments( ) assert len(result['results']) assert lce.id in [ capsule_lce['id'] for capsule_lce in result['results'] ] # Create a content view with the repository cv = entities.ContentView(organization=module_manifest_org, repository=[repo]).create() # Sync repository repo.sync() repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() assert len(cv.version) == 1 cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, lce.id) cvv = cvv.read() assert len(cvv.environment) == 2 # Assert that a task to sync lifecycle environment to the capsule # is started (or finished already) sync_status = capsule_configured.nailgun_capsule.content_get_sync() assert len( sync_status['active_sync_tasks']) or sync_status['last_sync_time'] # Wait till capsule sync finishes for task in sync_status['active_sync_tasks']: entities.ForemanTask(id=task['id']).poll() # Assert the sync task succeeded sync_status = capsule_configured.nailgun_capsule.content_get_sync() assert len(sync_status['last_failed_sync_tasks']) == 0 # Check for kickstart content on SAT and CAPS url_base = ( f'pulp/content/{module_manifest_org.label}/{lce.label}/' f'{cv.label}/content/dist/rhel8/8.4/x86_64/baseos/kickstart') # Check kickstart specific files for file in constants.KICKSTART_CONTENT: sat_file = md5_by_url(f'{default_sat.url}/{url_base}/{file}') caps_file = md5_by_url( f'{capsule_configured.url}/{url_base}/{file}') assert sat_file == caps_file # Check packages sat_pkg_url = f'{default_sat.url}/{url_base}/Packages/' caps_pkg_url = f'{capsule_configured.url}/{url_base}/Packages/' sat_pkgs = get_repo_files_by_url(sat_pkg_url) caps_pkgs = get_repo_files_by_url(caps_pkg_url) assert len(caps_pkgs) assert sat_pkgs == caps_pkgs
def test_positive_sync_kickstart_repo( self, target_sat, module_capsule_configured, module_manifest_org ): """Sync kickstart repository to the capsule. :id: bc97b53f-f79b-42f7-8014-b0641435bcfc :steps: 1. Sync a kickstart repository to Satellite. 2. Publish it in a CV, promote to Capsule's LCE. 3. Check it is synced to Capsule without errors. 4. Check for kickstart content on Satellite and Capsule. :expectedresults: 1. The kickstart repo is successfully synced to the Capsule. :CaseLevel: Integration :BZ: 1992329 """ distro = 'rhel8_aps' repo_id = enable_rhrepo_and_fetchid( basearch='x86_64', org_id=module_manifest_org.id, product=constants.REPOS['kickstart'][distro]['product'], reposet=constants.REPOSET['kickstart'][distro], repo=constants.REPOS['kickstart'][distro]['name'], releasever=constants.REPOS['kickstart'][distro]['version'], ) repo = entities.Repository(id=repo_id).read() lce = entities.LifecycleEnvironment(organization=module_manifest_org).create() # Associate the lifecycle environment with the capsule module_capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': lce.id} ) result = module_capsule_configured.nailgun_capsule.content_lifecycle_environments() assert len(result['results']) assert lce.id in [capsule_lce['id'] for capsule_lce in result['results']] # Update capsule's download policy to on_demand self.update_capsule_download_policy(module_capsule_configured, 'on_demand') # Create a content view with the repository cv = entities.ContentView(organization=module_manifest_org, repository=[repo]).create() # Sync repository repo.sync(timeout=600) repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() assert len(cv.version) == 1 cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, lce.id) cvv = cvv.read() assert len(cvv.environment) == 2 self.wait_for_sync(module_capsule_configured) # Check for kickstart content on SAT and CAPS url_base = ( f'pulp/content/{module_manifest_org.label}/{lce.label}/' f'{cv.label}/content/dist/rhel8/8.5/x86_64/appstream/kickstart' ) # Check kickstart specific files for file in constants.KICKSTART_CONTENT: sat_file = md5_by_url(f'{target_sat.url}/{url_base}/{file}') caps_file = md5_by_url(f'{module_capsule_configured.url}/{url_base}/{file}') assert sat_file == caps_file # Check packages sat_pkg_url = f'{target_sat.url}/{url_base}/Packages/' caps_pkg_url = f'{module_capsule_configured.url}/{url_base}/Packages/' sat_pkgs = get_repo_files_by_url(sat_pkg_url) caps_pkgs = get_repo_files_by_url(caps_pkg_url) assert len(caps_pkgs) assert sat_pkgs == caps_pkgs
def test_positive_on_demand_sync( self, target_sat, module_capsule_configured, function_org, function_product, function_lce ): """Create a repository with 'on_demand' policy, add it to a CV, promote to an 'on_demand' Capsule's LCE, download a published package, assert it matches the source. :id: ba470269-a7ad-4181-bc7c-8e17a177ca20 :expectedresults: 1. A custom yum repository is successfully synced and ContentView published 2. The ContentView is successfully promoted to the Capsule's LCE and the content is automatically synced to the Capsule 3. Package is successfully downloaded from the Capsule, its checksum matches the original package from the upstream repo :CaseLevel: System """ repo_url = settings.repos.yum_3.url packages_count = constants.FAKE_3_YUM_REPOS_COUNT package = constants.FAKE_3_YUM_REPO_RPMS[0] repo = entities.Repository( download_policy='on_demand', mirroring_policy='mirror_complete', product=function_product, url=repo_url, ).create() # Associate the lifecycle environment with the capsule module_capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': function_lce.id} ) result = module_capsule_configured.nailgun_capsule.content_lifecycle_environments() assert len(result['results']) assert function_lce.id in [capsule_lce['id'] for capsule_lce in result['results']] # Update capsule's download policy to on_demand self.update_capsule_download_policy(module_capsule_configured, 'on_demand') # Create a content view with the repository cv = entities.ContentView(organization=function_org, repository=[repo]).create() # Sync repository repo.sync() repo = repo.read() # Publish new version of the content view cv.publish() cv = cv.read() assert len(cv.version) == 1 cvv = cv.version[-1].read() # Promote content view to lifecycle environment promote(cvv, function_lce.id) cvv = cvv.read() assert len(cvv.environment) == 2 self.wait_for_sync(module_capsule_configured) # Verify packages on Capsule match the source caps_repo_url = form_repo_url( module_capsule_configured, org=function_org.label, lce=function_lce.label, cv=cv.label, prod=function_product.label, repo=repo.label, ) source_files = get_repo_files_by_url(repo_url) caps_files = get_repo_files_by_url(caps_repo_url) assert source_files == caps_files assert len(caps_files) == packages_count # Download a package from the Capsule and get its md5 checksum published_package_md5 = md5_by_url(f'{caps_repo_url}/{package}') # Get md5 checksum of source package package_md5 = md5_by_url(f'{repo_url}/{package}') # Assert checksums are matching assert package_md5 == published_package_md5
def test_positive_sync_file_repo( self, target_sat, module_capsule_configured, function_org, function_product, function_lce ): """Sync file-type repository to the capsule. :id: 8835c440-016f-408b-8b08-17da8e25a991 :steps: 1. Sync file-type repository to Satellite. 2. Upload one extra file to the repository. 3. Publish it in a CV, promote to Capsule's LCE. 4. Check it is synced to Capsule without errors. 5. Run one more sync, check it succeeds. 6. Check for content on Satellite and Capsule. :expectedresults: 1. Both capsule syncs succeed. 2. Content is accessible on both, Satellite and Capsule. :CaseLevel: Integration :BZ: 1985122 """ repo = entities.Repository( content_type='file', product=function_product, url=constants.FAKE_FILE_LARGE_URL, ).create() repo.sync() # Upload one more iso file with open(get_data_file(constants.FAKE_FILE_NEW_NAME), 'rb') as handle: repo.upload_content(files={'content': handle}) # Associate LCE with the capsule module_capsule_configured.nailgun_capsule.content_add_lifecycle_environment( data={'environment_id': function_lce.id} ) result = module_capsule_configured.nailgun_capsule.content_lifecycle_environments() assert len(result['results']) assert function_lce.id in [capsule_lce['id'] for capsule_lce in result['results']] # Create and publish a content view with all repositories cv = entities.ContentView(organization=function_org, repository=[repo]).create() cv.publish() cv = cv.read() assert len(cv.version) == 1 # Promote the latest CV version into capsule's LCE cvv = cv.version[-1].read() promote(cvv, function_lce.id) cvv = cvv.read() assert len(cvv.environment) == 2 self.wait_for_sync(module_capsule_configured) # Run one more sync, check for status (BZ#1985122) sync_status = module_capsule_configured.nailgun_capsule.content_sync() assert sync_status['result'] == 'success' # Check for content on SAT and CAPS sat_repo_url = form_repo_url( target_sat, org=function_org.label, lce=function_lce.label, cv=cv.label, prod=function_product.label, repo=repo.label, ) caps_repo_url = form_repo_url( module_capsule_configured, org=function_org.label, lce=function_lce.label, cv=cv.label, prod=function_product.label, repo=repo.label, ) sat_files = get_repo_files_by_url(sat_repo_url, extension='iso') caps_files = get_repo_files_by_url(caps_repo_url, extension='iso') assert len(sat_files) == len(caps_files) == constants.FAKE_FILE_LARGE_COUNT + 1 assert constants.FAKE_FILE_NEW_NAME in caps_files assert sat_files == caps_files for file in sat_files: sat_file = md5_by_url(f'{sat_repo_url}{file}') caps_file = md5_by_url(f'{caps_repo_url}{file}') assert sat_file == caps_file