def get_consumed_product_pools(self, service_level=None, matches=None): # Use a named tuple so that the result can be unpacked into other functions ConsumedStatus = collections.namedtuple('ConsumedStatus', [ 'subscription_name', 'provides', 'sku', 'contract', 'account', 'serial', 'pool_id', 'provides_management', 'active', 'quantity_used', 'service_level', 'service_type', 'status_details', 'subscription_type', 'starts', 'ends', 'system_type', ]) sorter = inj.require(inj.CERT_SORTER) cert_reasons_map = sorter.reasons.get_subscription_reasons_map() pooltype_cache = inj.require(inj.POOLTYPE_CACHE) consumed_statuses = [] # FIXME: the cache of CertificateDirectory should be smart enough and refreshing # should not be necessary. When new certificate is installed/deleted and rhsm-service # is running, then list of certificate is not automatically refreshed ATM. self.entitlement_dir.refresh() certs = self.entitlement_dir.list() cert_filter = utils.EntitlementCertificateFilter( filter_string=matches, service_level=service_level) if service_level is not None or matches is not None: certs = list(filter(cert_filter.match, certs)) # Now we need to transform the EntitlementCertificate object into # something JSON-like for consumption for cert in certs: # for some certs, order can be empty # so we default the values and populate them if # they exist. BZ974587 name = "" sku = "" contract = "" account = "" quantity_used = "" service_level = "" service_type = "" system_type = "" provides_management = "No" order = cert.order if order: service_level = order.service_level or "" service_type = order.service_type or "" name = order.name sku = order.sku contract = order.contract or "" account = order.account or "" quantity_used = order.quantity_used if order.virt_only: system_type = _("Virtual") else: system_type = _("Physical") if order.provides_management: provides_management = _("Yes") else: provides_management = _("No") pool_id = _("Not Available") if hasattr(cert.pool, "id"): pool_id = cert.pool.id product_names = [p.name for p in cert.products] reasons = [] pool_type = '' if inj.require(inj.CERT_SORTER).are_reasons_supported(): if cert.subject and 'CN' in cert.subject: if cert.subject['CN'] in cert_reasons_map: reasons = cert_reasons_map[cert.subject['CN']] pool_type = pooltype_cache.get(pool_id) # 1180400: Status details is empty when GUI is not if not reasons: if cert in sorter.valid_entitlement_certs: reasons.append(_("Subscription is current")) else: if cert.valid_range.end() < datetime.datetime.now( certificate.GMT()): reasons.append(_("Subscription is expired")) else: reasons.append(_("Subscription has not begun")) else: reasons.append( _("Subscription management service doesn't support Status Details." )) consumed_statuses.append( ConsumedStatus( name, product_names, sku, contract, account, cert.serial, pool_id, provides_management, cert.is_valid(), quantity_used, service_level, service_type, reasons, pool_type, managerlib.format_date(cert.valid_range.begin()), managerlib.format_date(cert.valid_range.end()), system_type)) return consumed_statuses
def perform(self): # inject identity = inj.require(inj.IDENTITY) uuid = identity.getConsumerId() consumer = self.uep.getConsumer(uuid) if 'autoheal' not in consumer or not consumer['autoheal']: log.info("Auto-heal disabled on server, skipping.") return 0 try: log.info("Checking if system requires healing.") today = datetime.datetime.now(certificate.GMT()) tomorrow = today + datetime.timedelta(days=1) # Check if we're invalid today and heal if so. If we are # valid, see if 24h from now is greater than our "valid until" # date, and heal for tomorrow if so. cs = inj.require(inj.CERT_SORTER) cert_updater = entcertlib.EntCertActionInvoker() if not cs.is_valid(): log.warn("Found invalid entitlements for today: %s" % today) self.plugin_manager.run("pre_auto_attach", consumer_uuid=uuid) ents = self.uep.bind(uuid, today) self.plugin_manager.run("post_auto_attach", consumer_uuid=uuid, entitlement_data=ents) # NOTE: we need to call EntCertActionInvoker.update after Healing.update # otherwise, the locking get's crazy # hmm, we use RLock, maybe we could use it here self.report = cert_updater.update() else: log.info("Entitlements are valid for today: %s" % today) if cs.compliant_until is None: # Edge case here, not even sure this can happen as we # should have a compliant until date if we're valid # today, but just in case: log.warn("Got valid status from server but no valid until date.") elif tomorrow > cs.compliant_until: log.warn("Entitlements will be invalid by tomorrow: %s" % tomorrow) self.plugin_manager.run("pre_auto_attach", consumer_uuid=uuid) ents = self.uep.bind(uuid, tomorrow) self.plugin_manager.run("post_auto_attach", consumer_uuid=uuid, entitlement_data=ents) self.report = cert_updater.update() else: log.info("Entitlements are valid for tomorrow: %s" % tomorrow) except Exception, e: log.error("Error attempting to auto-heal:") log.exception(e) self.report._exceptions.append(e) return self.report
def get_consumed_product_pools(self, service_level=None, matches=None, iso_dates=False): # Use a named tuple so that the result can be unpacked into other functions OldConsumedStatus = collections.namedtuple( "OldConsumedStatus", [ "subscription_name", "provides", "sku", "contract", "account", "serial", "pool_id", "provides_management", "active", "quantity_used", "service_type", "service_level", "status_details", "subscription_type", "starts", "ends", "system_type", ], ) # Use a named tuple so that the result can be unpacked into other functions ConsumedStatus = collections.namedtuple( "ConsumedStatus", [ "subscription_name", "provides", "sku", "contract", "account", "serial", "pool_id", "provides_management", "active", "quantity_used", "service_type", "roles", "service_level", "usage", "addons", "status_details", "subscription_type", "starts", "ends", "system_type", ], ) sorter = inj.require(inj.CERT_SORTER) cert_reasons_map = sorter.reasons.get_subscription_reasons_map() pooltype_cache = inj.require(inj.POOLTYPE_CACHE) consumed_statuses = [] # FIXME: the cache of CertificateDirectory should be smart enough and refreshing # should not be necessary. When new certificate is installed/deleted and rhsm-service # is running, then list of certificate is not automatically refreshed ATM. self.entitlement_dir.refresh() certs = self.entitlement_dir.list() cert_filter = utils.EntitlementCertificateFilter( filter_string=matches, service_level=service_level) if service_level is not None or matches is not None: certs = list(filter(cert_filter.match, certs)) if iso_dates: date_formatter = managerlib.format_iso8601_date else: date_formatter = managerlib.format_date # Now we need to transform the EntitlementCertificate object into # something JSON-like for consumption for cert in certs: # for some certs, order can be empty # so we default the values and populate them if # they exist. BZ974587 name = "" sku = "" contract = "" account = "" quantity_used = "" service_type = "" roles = "" service_level = "" usage = "" addons = "" system_type = "" provides_management = "No" order = cert.order if order: service_type = order.service_type or "" service_level = order.service_level or "" if cert.version.major >= 3 and cert.version.minor >= 4: roles = order.roles or "" usage = order.usage or "" addons = order.addons or "" else: roles = None usage = None addons = None name = order.name sku = order.sku contract = order.contract or "" account = order.account or "" quantity_used = order.quantity_used if order.virt_only: system_type = _("Virtual") else: system_type = _("Physical") if order.provides_management: provides_management = _("Yes") else: provides_management = _("No") pool_id = _("Not Available") if hasattr(cert.pool, "id"): pool_id = cert.pool.id provided_products = {p.id: p.name for p in cert.products} reasons = [] pool_type = "" if inj.require(inj.CERT_SORTER).are_reasons_supported(): if cert.subject and "CN" in cert.subject: if cert.subject["CN"] in cert_reasons_map: reasons = cert_reasons_map[cert.subject["CN"]] pool_type = pooltype_cache.get(pool_id) # 1180400: Status details is empty when GUI is not if not reasons: if cert in sorter.valid_entitlement_certs: reasons.append(_("Subscription is current")) else: if cert.valid_range.end() < datetime.datetime.now( certificate.GMT()): reasons.append(_("Subscription is expired")) else: reasons.append(_("Subscription has not begun")) else: reasons.append( _("Subscription management service doesn't support Status Details." )) if roles is None and usage is None and addons is None: consumed_statuses.append( OldConsumedStatus( name, provided_products, sku, contract, account, cert.serial, pool_id, provides_management, cert.is_valid(), quantity_used, service_type, service_level, reasons, pool_type, date_formatter(cert.valid_range.begin()), date_formatter(cert.valid_range.end()), system_type, )) else: consumed_statuses.append( ConsumedStatus( name, provided_products, sku, contract, account, cert.serial, pool_id, provides_management, cert.is_valid(), quantity_used, service_type, roles, service_level, usage, addons, reasons, pool_type, date_formatter(cert.valid_range.begin()), date_formatter(cert.valid_range.end()), system_type, )) return consumed_statuses