gcontini
2020-04-25 e047dbe884f5288943d5ba2f8843a078d647d7ef
src/library/os/execution_environment_common.cpp
@@ -8,6 +8,7 @@
#include <string.h>
#include <unordered_map>
#include <array>
#include <licensecc/datatypes.h>
#include "../base/base.h"
#include "cpu_info.hpp"
@@ -17,39 +18,83 @@
namespace os {
using namespace std;
VIRTUALIZATION ExecutionEnvironment::getVirtualization() const {
   VIRTUALIZATION result;
   CpuInfo cpuInfo;
const unordered_map<string, LCC_API_VIRTUALIZATION_DETAIL> virtual_cpu_names{
   {"bhyve bhyve ", V_OTHER}, {"KVM", KVM},      {"MICROSOFT", HV},      {" lrpepyh vr", HV},
   {"prl hyperv  ", V_OTHER}, {"VMWARE", VMWARE}, {"XenVMMXenVMM", V_XEN}, {"ACRNACRNACRN", V_OTHER},
   {"VBOX", VIRTUALBOX}};
const unordered_map<string, LCC_API_VIRTUALIZATION_DETAIL> vm_vendors{{"VMWARE", VMWARE},
                                               {"MICROSOFT", HV},
                                               {"VITRUAL MACHINE", V_OTHER},
                                               {"INNOTEK GMBH", V_OTHER},
                                               {"POWERVM", V_OTHER},
                                               {"BOCHS", V_OTHER},
                                               {"KVM", KVM}};
static LCC_API_VIRTUALIZATION_DETAIL find_in_map(const unordered_map<string, LCC_API_VIRTUALIZATION_DETAIL>& map, const string& data) {
   for (auto it : map) {
      if (data.find(it.first) != string::npos) {
         return it.second;
      }
   }
   return BARE_TO_METAL;
}
LCC_API_VIRTUALIZATION_SUMMARY ExecutionEnvironment::virtualization() const {
   LCC_API_VIRTUALIZATION_SUMMARY result;
   bool isContainer = is_container();
   if (isContainer) {
      result = CONTAINER;
   } else if (cpuInfo.cpu_virtual() || is_cloud()) {
      result = VM;
      result = LCC_API_VIRTUALIZATION_SUMMARY::CONTAINER;
   } else if (virtualization_detail() != BARE_TO_METAL || is_cloud()) {
      result = LCC_API_VIRTUALIZATION_SUMMARY::VM;
   } else {
      result = NONE;
      result = LCC_API_VIRTUALIZATION_SUMMARY::NONE;
   }
   return result;
}
LCC_API_VIRTUALIZATION_DETAIL ExecutionEnvironment::virtualization_detail() const {
   LCC_API_VIRTUALIZATION_DETAIL result = BARE_TO_METAL;
   const string bios_description = m_dmi_info.bios_description();
   const string bios_vendor = m_dmi_info.bios_vendor();
   const string sys_vendor = m_dmi_info.sys_vendor();
   if ((result = find_in_map(vm_vendors, bios_description)) == BARE_TO_METAL) {
      if ((result = find_in_map(vm_vendors, bios_vendor)) == BARE_TO_METAL) {
         if ((result = find_in_map(vm_vendors, sys_vendor)) == BARE_TO_METAL) {
            if ((result = find_in_map(virtual_cpu_names, m_cpu_info.vendor())) == BARE_TO_METAL) {
               result = find_in_map(virtual_cpu_names, m_cpu_info.brand());
            }
         }
      }
   }
   if (result == BARE_TO_METAL && m_cpu_info.is_hypervisor_set()) {
      result = V_OTHER;
   }
   return result;
}
bool ExecutionEnvironment::is_cloud() const {
   CLOUD_PROVIDER prov = getCloudProvider();
   const LCC_API_CLOUD_PROVIDER prov = cloud_provider();
   return prov != ON_PREMISE && prov != PROV_UNKNOWN;
}
// TODO test and azure
CLOUD_PROVIDER ExecutionEnvironment::getCloudProvider() const {
   CLOUD_PROVIDER result = PROV_UNKNOWN;
   if (m_bios_description.size() > 0 || m_bios_vendor.size() > 0 || m_sys_vendor.size() > 0) {
      if (m_bios_vendor.find("SEABIOS") != string::npos || m_bios_description.find("ALIBABA") != string::npos ||
         m_sys_vendor.find("ALIBABA") != string::npos) {
LCC_API_CLOUD_PROVIDER ExecutionEnvironment::cloud_provider() const {
   LCC_API_CLOUD_PROVIDER result = PROV_UNKNOWN;
   const string bios_description = m_dmi_info.bios_description();
   const string bios_vendor = m_dmi_info.bios_vendor();
   const string sys_vendor = m_dmi_info.sys_vendor();
   if (bios_description.size() > 0 || bios_vendor.size() > 0 || sys_vendor.size() > 0) {
      if (bios_vendor.find("SEABIOS") != string::npos || bios_description.find("ALIBABA") != string::npos ||
         sys_vendor.find("ALIBABA") != string::npos) {
         result = ALI_CLOUD;
      } else if (m_sys_vendor.find("GOOGLE") != string::npos || m_bios_description.find("GOOGLE") != string::npos) {
      } else if (sys_vendor.find("GOOGLE") != string::npos || bios_description.find("GOOGLE") != string::npos) {
         result = GOOGLE_CLOUD;
      } else if (m_bios_vendor.find("AWS") != string::npos || m_bios_description.find("AMAZON") != string::npos ||
               m_sys_vendor.find("AWS") != string::npos) {
      } else if (bios_vendor.find("AWS") != string::npos || bios_description.find("AMAZON") != string::npos ||
               sys_vendor.find("AWS") != string::npos) {
         result = AWS;
      } else if (m_bios_description.find("HP-COMPAQ") != string::npos || m_bios_description.find("ASUS") ||
               m_bios_description.find("DELL")) {
      } else if (bios_description.find("HP-COMPAQ") != string::npos || bios_description.find("ASUS") ||
               bios_description.find("DELL")) {
         result = ON_PREMISE;
      }
   }