def _smoke_test(): """ Simple smoke tests of GCP detector and collector """ # Gather only information about hardware and virtualization from rhsmlib.facts.host_collector import HostCollector import sys root = logging.getLogger() root.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) root.addHandler(handler) facts = {} facts.update(HostCollector().get_all()) gcp_cloud_provider = GCPCloudProvider(facts) result = gcp_cloud_provider.is_running_on_cloud() probability = gcp_cloud_provider.is_likely_running_on_cloud() print(">>> debug <<< result: %s, %6.3f" % (result, probability)) if result is True: # 1. using default audience token = gcp_cloud_provider.get_metadata() print(f">>> debug <<< 1. token: {token}") # 2. using some custom audience gcp_cloud_provider = GCPCloudProvider(facts, audience_url="https://localhost:8443/candlepin") token = gcp_cloud_provider.get_metadata() print(f">>> debug <<< 2. token: {token}")
def _smoke_tests(): """ Simple smoke test of azure detector and collector :return: None """ # Gather only information about hardware and virtualization from rhsmlib.facts.host_collector import HostCollector from rhsmlib.facts.hwprobe import HardwareCollector import sys root = logging.getLogger() root.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) root.addHandler(handler) facts = {} facts.update(HostCollector().get_all()) facts.update(HardwareCollector().get_all()) azure_cloud_detector = AzureCloudDetector(facts) result = azure_cloud_detector.is_running_on_cloud() probability = azure_cloud_detector.is_likely_running_on_cloud() print('>>> debug <<< result: %s, %6.3f' % (result, probability)) if result is True: azure_cloud_collector = AzureCloudCollector() metadata = azure_cloud_collector.get_metadata() signature = azure_cloud_collector.get_signature() print(f'>>> debug <<< metadata: {metadata}') print(f'>>> debug <<< signature: {signature}')
def detect_cloud_provider(): """ This method tries to detect cloud provider using hardware information provided by dmidecode. When there is strong sign that the VM is running on one of the cloud provider, then return list containing only one provider. When there is no strong sign of one cloud provider, then try to detect cloud provider using heuristics methods. In this case this method will return list of all cloud providers sorted according detected probability :return: List of string representing detected cloud providers. E.g. ['aws'] or ['aws', 'gcp'] """ # Gather only information about hardware and virtualization facts = {} facts.update(HostCollector().get_all()) facts.update(HardwareCollector().get_all()) cloud_detectors = [cls(facts) for cls in CLOUD_DETECTORS] log.debug('Trying to detect cloud provider') # First try to detect cloud providers using strong signs cloud_list = [] for cloud_detector in cloud_detectors: cloud_detected = cloud_detector.is_running_on_cloud() if cloud_detected is True: cloud_list.append(cloud_detector.ID) # When only one cloud provider was detected, then return the list with # one cloud provider. Print error in other cases and try to detect cloud providers # using heuristics methods if len(cloud_list) == 1: return cloud_list elif len(cloud_list) == 0: log.error('No cloud provider detected using strong signs') elif len(cloud_list) > 1: log.error( 'More than one cloud provider detected using strong signs ({providers})' .format(providers=", ".join(cloud_list))) # When no cloud provider detected using strong signs, because behavior of cloud providers # has changed, then try to detect cloud provider using some heuristics cloud_list = [] for cloud_detector in cloud_detectors: probability = cloud_detector.is_likely_running_on_cloud() if probability > 0.0: cloud_list.append((probability, cloud_detector.ID)) # Sort list according probability (provider with highest probability first) cloud_list.sort(reverse=True) # We care only about order, not probability in the result (filter probability out) cloud_list = [item[1] for item in cloud_list] if len(cloud_list) == 0: log.error('No cloud provider detected using heuristics') return cloud_list
def _smoke_tests(): """ Simple smoke test of azure detector and collector :return: None """ # Gather only information about hardware and virtualization from rhsmlib.facts.host_collector import HostCollector import sys root = logging.getLogger() root.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) root.addHandler(handler) facts = {} facts.update(HostCollector().get_all()) azure_cloud_provider = AzureCloudProvider(facts) result = azure_cloud_provider.is_running_on_cloud() probability = azure_cloud_provider.is_likely_running_on_cloud() print(">>> debug <<< result: %s, %6.3f" % (result, probability)) if result is True: metadata = azure_cloud_provider.get_metadata() signature = azure_cloud_provider.get_signature() print(f">>> debug <<< metadata: {metadata}") print(f">>> debug <<< signature: {signature}") api_versions = azure_cloud_provider.get_api_versions() print(f">>> debug <<< api_versions: {api_versions}") # Test getting metadata and signature with too old API version AzureCloudProvider.API_VERSION = "2011-01-01" AzureCloudProvider.CLOUD_PROVIDER_METADATA_URL = ( "http://169.254.169.254/metadata/instance?api-version=2011-01-01") AzureCloudProvider.CLOUD_PROVIDER_SIGNATURE_URL = ( "http://169.254.169.254/metadata/attested/document?api-version=2011-01-01" ) azure_cloud_provider = AzureCloudProvider({}) azure_cloud_provider._cached_metadata = None azure_cloud_provider._cached_signature = None metadata = azure_cloud_provider.get_metadata() print(f">>> debug <<< metadata: {metadata}") signature = azure_cloud_provider.get_signature() print(f">>> debug <<< signature: {signature}")
def gather_system_facts() -> dict: """ Try to gather system facts necessary for detection of cloud provider :return: Dictionary with system facts """ facts = {} # Gather only basic information about hardware, virtualization and custom facts facts.update(HostCollector().get_all()) # When cloud provider will change information provided by SM BIOS, then # customers will be able to create simple workaround using custom facts. facts.update(CustomFactsCollector().get_all()) return facts
def _smoke_tests(): """ Simple smoke tests of AWS detector and collector :return: None """ # Gather only information about hardware and virtualization from rhsmlib.facts.host_collector import HostCollector from rhsmlib.facts.hwprobe import HardwareCollector import sys root = logging.getLogger() root.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) root.addHandler(handler) facts = {} facts.update(HostCollector().get_all()) facts.update(HardwareCollector().get_all()) aws_cloud_detector = AWSCloudDetector(facts) result = aws_cloud_detector.is_running_on_cloud() probability = aws_cloud_detector.is_likely_running_on_cloud() print( f'>>> debug <<< cloud provider: {result}, probability: {probability}') if result is True: metadata_collector = AWSCloudCollector() metadata = metadata_collector.get_metadata() print(f'>>> debug <<< cloud metadata: {metadata}') signature = metadata_collector.get_signature() print(f'>>> debug <<< metadata signature: {signature}') metadata_v2 = metadata_collector._get_metadata_from_server_imds_v2() print(f'>>> debug <<< cloud metadata: {metadata_v2}') signature_v2 = metadata_collector._get_signature_from_server_imds_v2() print(f'>>> debug <<< cloud signature: {signature_v2}')
found_google = False found_gcp = False for hw_item in self.hw_info.values(): if type(hw_item) != str: continue if 'google' in hw_item.lower(): found_google = True elif 'gcp' in hw_item.lower(): found_gcp = True if found_google is True: probability += 0.3 if found_gcp is True: probability += 0.1 return probability # Some temporary smoke testing code. You can test this module using: # sudo PYTHONPATH=./src:./syspurse/src python3 -m rhsmlib.cloud.providers.gcp if __name__ == '__main__': # Gather only information about hardware and virtualization from rhsmlib.facts.host_collector import HostCollector from rhsmlib.facts.hwprobe import HardwareCollector _facts = {} _facts.update(HostCollector().get_all()) _facts.update(HardwareCollector().get_all()) _gcp_cloud_detector = GCPCloudDetector(_facts) _result = _gcp_cloud_detector.is_running_on_cloud() _probability = _gcp_cloud_detector.is_likely_running_on_cloud() print('>>> debug <<< result: %s, %6.3f' % (_result, _probability))