def get_releases(self): # cdn base url # let us pass in a facts object for testing if not self.facts: self.facts = Facts(ent_dir=self.entitlement_dir, prod_dir=self.product_dir) # find entitlements for rhel product? (or vice versa) sorter = CertSorter(self.product_dir, self.entitlement_dir, self.facts.get_facts()) # find the rhel product rhel_product = None for product_hash in sorter.installed_products: product_cert = sorter.installed_products[product_hash] products = product_cert.products for product in products: product_tags = product.provided_tags if self._is_rhel(product_tags): rhel_product = product if rhel_product is None: return [] entitlements = sorter.get_entitlements_for_product(rhel_product.id) listings = [] for entitlement in entitlements: contents = entitlement.content for content in contents: # ignore content that is not enabled # see bz #820639 if not content.enabled: continue if self._is_correct_rhel(rhel_product.provided_tags, content.required_tags): content_url = content.url listing_parts = content_url.split('$releasever', 1) listing_base = listing_parts[0] listing_path = "%s/listing" % listing_base listings.append(listing_path) # FIXME: not sure how to get the "base" content if we have multiple # entitlements for a product # for a entitlement, gran the corresponding entitlement cert # use it for this connection # hmm. We are really only supposed to have one product # with one content with one listing file. We shall see. releases = [] listings = sorted(set(listings)) for listing_path in listings: data = self.content_connection.get_versions(listing_path) ver_listing = listing.ListingFile(data=data) releases = releases + ver_listing.get_releases() releases_set = sorted(set(releases)) return releases_set
def get_releases(self): # cdn base url # find the rhel product release_product = None installed_products = self.product_dir.get_installed_products() for product_hash in installed_products: product_cert = installed_products[product_hash] products = product_cert.products for product in products: rhel_matcher = rhelproduct.RHELProductMatcher(product) if rhel_matcher.is_rhel(): release_product = product if release_product is None: log.info("No products with RHEL product tags found") return [] entitlements = self.entitlement_dir.list_for_product(release_product.id) listings = [] for entitlement in entitlements: contents = entitlement.content for content in contents: # ignore content that is not enabled # see bz #820639 if not content.enabled: continue if self._is_correct_rhel(release_product.provided_tags, content.required_tags): listing_path = self._build_listing_path(content.url) listings.append(listing_path) # FIXME: not sure how to get the "base" content if we have multiple # entitlements for a product # for a entitlement, grant the corresponding entitlement cert # use it for this connection # hmm. We are really only supposed to have one product # with one content with one listing file. We shall see. releases = [] listings = sorted(set(listings)) for listing_path in listings: try: data = self.content_connection.get_versions(listing_path) except (socket.error, httplib.HTTPException, SSLError) as e: # content connection doesn't handle any exceptions # and the code that invokes this doesn't either, so # swallow them here. log.exception(e) continue # any non 200 response on fetching the release version # listing file returns a None here if not data: continue ver_listing = listing.ListingFile(data=data) # ver_listing.releases can be empty releases = releases + ver_listing.get_releases() releases_set = sorted(set(releases)) return releases_set
def setUp(self): self.listing = listing.ListingFile(self.data)
def test(self): listing_file = listing.ListingFile() self.assertEquals(listing_file.get_releases(), [])
def get_releases(self): # cdn base url # Find the rhel products release_products = [] certificates = set() installed_products = self.product_dir.get_installed_products() for product_hash in installed_products: product_cert = installed_products[product_hash] products = product_cert.products for product in products: rhel_matcher = rhelproduct.RHELProductMatcher(product) if rhel_matcher.is_rhel(): release_products.append(product) certificates.add(product_cert) if len(release_products) == 0: log.debug("No products with RHEL product tags found") return [] elif len(release_products) > 1: raise MultipleReleaseProductsError(certificates=certificates) # Note: only release_products with one item can pass previous if-elif release_product = release_products[0] entitlements = self.entitlement_dir.list_for_product(release_product.id) listings = [] ent_cert_key_pairs = set() for entitlement in entitlements: contents = entitlement.content for content in contents: # ignore content that is not enabled # see bz #820639 if not content.enabled: continue if self._is_correct_rhel(release_product.provided_tags, content.required_tags): listing_path = self._build_listing_path(content.url) listings.append(listing_path) ent_cert_key_pairs.add((entitlement.path, entitlement.key_path())) # FIXME: not sure how to get the "base" content if we have multiple # entitlements for a product # for a entitlement, grant the corresponding entitlement cert # use it for this connection # hmm. We are really only supposed to have one product # with one content with one listing file. We shall see. releases = [] listings = sorted(set(listings)) for listing_path in listings: try: data = self.content_connection.get_versions(listing_path) except (socket.error, six.moves.http_client.HTTPException, ssl.SSLError, NoValidEntitlement) as e: # content connection doesn't handle any exceptions # and the code that invokes this doesn't either, so # swallow them here. log.exception(e) continue # any non 200 response on fetching the release version # listing file returns a None here if not data: continue ver_listing = listing.ListingFile(data=data) # ver_listing.releases can be empty releases = releases + ver_listing.get_releases() releases_set = sorted(set(releases)) return releases_set