[LYN-3463] Improve error message based on resource mapping manager loading status (#551)

main
Vincent Liu 5 years ago committed by GitHub
parent ede1889507
commit 828284d109
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -25,13 +25,24 @@ namespace AWSCore
: AWSCoreInternalRequestBus::Handler : AWSCoreInternalRequestBus::Handler
{ {
public: public:
static constexpr const char AWSCORE_CONFIGURATION_FILENAME[] = "awscoreconfiguration.setreg"; static constexpr const char AWSCoreConfigurationName[] = "AWSCoreConfiguration";
static constexpr const char AWSCoreConfigurationFileName[] = "awscoreconfiguration.setreg";
static constexpr const char AWSCORE_RESOURCE_MAPPING_CONFIG_FOLDERNAME[] = "Config"; static constexpr const char AWSCoreResourceMappingConfigFolderName[] = "Config";
static constexpr const char AWSCORE_RESOURCE_MAPPING_CONFIG_FILENAME_KEY[] = "/AWSCore/ResourceMappingConfigFileName"; static constexpr const char AWSCoreResourceMappingConfigFileNameKey[] = "/AWSCore/ResourceMappingConfigFileName";
static constexpr const char AWSCoreDefaultProfileName[] = "default";
static constexpr const char AWSCoreProfileNameKey[] = "/AWSCore/ProfileName";
static constexpr const char ProjectSourceFolderNotFoundErrorMessage[] =
"Failed to get project source folder path.";
static constexpr const char ProfileNameNotFoundErrorMessage[] =
"Failed to get profile name, return default value instead.";
static constexpr const char ResourceMappingFileNameNotFoundErrorMessage[] =
"Failed to get resource mapping config file name, return empty value instead.";
static constexpr const char SettingsRegistryLoadFailureErrorMessage[] =
"Failed to load AWSCore settings registry file.";
static constexpr const char AWSCORE_DEFAULT_PROFILE_NAME[] = "default";
static constexpr const char AWSCORE_PROFILENAME_KEY[] = "/AWSCore/ProfileName";
AWSCoreConfiguration(); AWSCoreConfiguration();
~AWSCoreConfiguration() = default; ~AWSCoreConfiguration() = default;
@ -55,6 +66,9 @@ namespace AWSCore
// Parse values from project .setreg file // Parse values from project .setreg file
void ParseSettingsRegistryValues(); void ParseSettingsRegistryValues();
// Reset settings registry data
void ResetSettingsRegistryData();
AZStd::string m_sourceProjectFolder; AZStd::string m_sourceProjectFolder;
AZ::SettingsRegistryImpl m_settingsRegistry; AZ::SettingsRegistryImpl m_settingsRegistry;
AZStd::string m_profileName; AZStd::string m_profileName;

@ -14,20 +14,20 @@
namespace AWSCore namespace AWSCore
{ {
static constexpr const char AWS_CHINA_REGION_PREFIX[] = "cn-"; static constexpr const char AWSChinaRegionPrefix[] = "cn-";
static constexpr const char AWS_FEATURE_GEM_RESTAPI_ID_KEYNAME_SUFFIX[] = ".RESTApiId"; static constexpr const char AWSFeatureGemRESTApiIdKeyNameSuffix[] = ".RESTApiId";
static constexpr const char AWS_FEATURE_GEM_RESTAPI_STAGE_KEYNAME_SUFFIX[] = ".RESTApiStage"; static constexpr const char AWSFeatureGemRESTApiStageKeyNameSuffix[] = ".RESTApiStage";
static constexpr const char RESOURCE_MAPPING_ACCOUNTID_KEYNAME[] = "AccountId"; static constexpr const char ResourceMappingAccountIdKeyName[] = "AccountId";
static constexpr const char RESOURCE_MAPPING_RESOURCES_KEYNAME[] = "AWSResourceMappings"; static constexpr const char ResourceMappingResourcesKeyName[] = "AWSResourceMappings";
static constexpr const char RESOURCE_MAPPING_NAMEID_KEYNAME[] = "Name/ID"; static constexpr const char ResourceMappingNameIdKeyName[] = "Name/ID";
static constexpr const char RESOURCE_MAPPING_REGION_KEYNAME[] = "Region"; static constexpr const char ResourceMappingRegionKeyName[] = "Region";
static constexpr const char RESOURCE_MAPPING_TYPE_KEYNAME[] = "Type"; static constexpr const char ResourceMappingTypeKeyName[] = "Type";
static constexpr const char RESOURCE_MAPPING_VERSION_KEYNAME[] = "Version"; static constexpr const char ResourceMappingVersionKeyName[] = "Version";
// TODO: move this into an independent file under AWSCore gem, if resource mapping tool can reuse it // TODO: move this into an independent file under AWSCore gem, if resource mapping tool can reuse it
static constexpr const char RESOURCE_MAPPING_JSON_SCHEMA[] = static constexpr const char ResourceMappingJsonSchema[] =
R"({ R"({
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"type": "object", "type": "object",

@ -45,6 +45,35 @@ namespace AWSCore
}; };
public: public:
static constexpr const char AWSResourceMappingManagerName[] = "AWSResourceMappingManager";
static constexpr const char ManagerUnexpectedStatusErrorMessage[] =
"AWSResourceMappingManager is in unexpected status.";
static constexpr const char ResourceMappingFileInvalidPathErrorMessage[] =
"Failed to get resource mapping config file path.";
static constexpr const char ResourceMappingKeyNotFoundErrorMessage[] =
"Failed to find resource mapping key: %s";
static constexpr const char ResourceMappingFileNotLoadedErrorMessage[] =
"Resource mapping config file is not loaded, please confirm %s is setup correctly.";
static constexpr const char ResourceMappingFileLoadFailureErrorMessage[] =
"Resource mapping config file failed to load, please confirm file is present and in correct format.";
static constexpr const char ResourceMappingRESTApiIdAndStageInconsistentErrorMessage[] =
"Resource mapping %s and %s have inconsistent region value, return empty service url.";
static constexpr const char ResourceMappingRESTApiInvalidServiceUrlErrorMessage[] =
"Unable to format REST Api url with RESTApiId=%s, RESTApiRegion=%s, RESTApiStage=%s, return empty service url.";
static constexpr const char ResourceMappingFileInvalidJsonFormatErrorMessage[] =
"Failed to read resource mapping config file: %s";
static constexpr const char ResourceMappingFileInvalidSchemaErrorMessage[] =
"Failed to load resource mapping config file json schema.";
static constexpr const char ResourceMappingFileInvalidContentErrorMessage[] =
"Failed to parse resource mapping config file: %s";
enum class Status : AZ::u8
{
NotLoaded = 0,
Ready = 1,
Error = 2
};
AWSResourceMappingManager(); AWSResourceMappingManager();
~AWSResourceMappingManager() = default; ~AWSResourceMappingManager() = default;
@ -63,7 +92,12 @@ namespace AWSCore
const AZStd::string& restApiIdKeyName, const AZStd::string& restApiStageKeyName) const override; const AZStd::string& restApiIdKeyName, const AZStd::string& restApiStageKeyName) const override;
void ReloadConfigFile(bool reloadConfigFileName = false) override; void ReloadConfigFile(bool reloadConfigFileName = false) override;
Status GetStatus() const;
private: private:
// Get resource attribute error message based on the status
AZStd::string GetResourceAttributeErrorMessageByStatus(const AZStd::string& resourceKeyName) const;
// Get resource attribute from resource mappings // Get resource attribute from resource mappings
AZStd::string GetResourceAttribute( AZStd::string GetResourceAttribute(
AZStd::function<AZStd::string(const AWSResourceMappingAttributes&)> getAttributeFunction, AZStd::function<AZStd::string(const AWSResourceMappingAttributes&)> getAttributeFunction,
@ -83,6 +117,7 @@ namespace AWSCore
// Validate JSON document against schema // Validate JSON document against schema
bool ValidateJsonDocumentAgainstSchema(const rapidjson::Document& jsonDocument); bool ValidateJsonDocumentAgainstSchema(const rapidjson::Document& jsonDocument);
Status m_status;
// Resource mapping related data // Resource mapping related data
AZStd::string m_defaultAccountId; AZStd::string m_defaultAccountId;
AZStd::string m_defaultRegion; AZStd::string m_defaultRegion;

@ -20,7 +20,7 @@ namespace AWSCore
{ {
AWSCoreConfiguration::AWSCoreConfiguration() AWSCoreConfiguration::AWSCoreConfiguration()
: m_sourceProjectFolder("") : m_sourceProjectFolder("")
, m_profileName(AWSCORE_DEFAULT_PROFILE_NAME) , m_profileName(AWSCoreDefaultProfileName)
, m_resourceMappingConfigFileName("") , m_resourceMappingConfigFileName("")
{ {
} }
@ -44,16 +44,16 @@ namespace AWSCore
{ {
if (m_sourceProjectFolder.empty()) if (m_sourceProjectFolder.empty())
{ {
AZ_Warning("AWSCoreConfiguration", false, "Failed to get source project folder path."); AZ_Warning(AWSCoreConfigurationName, false, ProjectSourceFolderNotFoundErrorMessage);
return ""; return "";
} }
if (m_resourceMappingConfigFileName.empty()) if (m_resourceMappingConfigFileName.empty())
{ {
AZ_Warning("AWSCoreConfiguration", false, "Failed to get resource mapping config file name."); AZ_Warning(AWSCoreConfigurationName, false, ResourceMappingFileNameNotFoundErrorMessage);
return ""; return "";
} }
AZStd::string configFilePath = AZStd::string::format("%s/%s/%s", AZStd::string configFilePath = AZStd::string::format("%s/%s/%s",
m_sourceProjectFolder.c_str(), AWSCORE_RESOURCE_MAPPING_CONFIG_FOLDERNAME, m_resourceMappingConfigFileName.c_str()); m_sourceProjectFolder.c_str(), AWSCoreResourceMappingConfigFolderName, m_resourceMappingConfigFileName.c_str());
AzFramework::StringFunc::Path::Normalize(configFilePath); AzFramework::StringFunc::Path::Normalize(configFilePath);
return configFilePath; return configFilePath;
} }
@ -68,17 +68,17 @@ namespace AWSCore
{ {
if (m_sourceProjectFolder.empty()) if (m_sourceProjectFolder.empty())
{ {
AZ_Warning("AWSCoreConfiguration", false, "Failed to get source project folder path."); AZ_Warning(AWSCoreConfigurationName, false, ProjectSourceFolderNotFoundErrorMessage);
return; return;
} }
AZStd::string settingsRegistryPath = AZStd::string::format("%s/%s/%s", AZStd::string settingsRegistryPath = AZStd::string::format("%s/%s/%s",
m_sourceProjectFolder.c_str(), AZ::SettingsRegistryInterface::RegistryFolder, AWSCoreConfiguration::AWSCORE_CONFIGURATION_FILENAME); m_sourceProjectFolder.c_str(), AZ::SettingsRegistryInterface::RegistryFolder, AWSCoreConfiguration::AWSCoreConfigurationFileName);
AzFramework::StringFunc::Path::Normalize(settingsRegistryPath); AzFramework::StringFunc::Path::Normalize(settingsRegistryPath);
if (!m_settingsRegistry.MergeSettingsFile(settingsRegistryPath, AZ::SettingsRegistryInterface::Format::JsonMergePatch, "")) if (!m_settingsRegistry.MergeSettingsFile(settingsRegistryPath, AZ::SettingsRegistryInterface::Format::JsonMergePatch, ""))
{ {
AZ_Warning("AWSCoreConfiguration", false, "Failed to merge AWS core settings registry."); AZ_Warning(AWSCoreConfigurationName, false, SettingsRegistryLoadFailureErrorMessage);
return; return;
} }
@ -90,7 +90,7 @@ namespace AWSCore
auto sourceProjectFolder = AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@"); auto sourceProjectFolder = AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@");
if (!sourceProjectFolder) if (!sourceProjectFolder)
{ {
AZ_Error("AWSCoreConfiguration", false, "Failed to initialize source project folder path."); AZ_Error(AWSCoreConfigurationName, false, ProjectSourceFolderNotFoundErrorMessage);
} }
else else
{ {
@ -102,24 +102,38 @@ namespace AWSCore
{ {
m_resourceMappingConfigFileName.clear(); m_resourceMappingConfigFileName.clear();
auto resourceMappingConfigFileNamePath = AZStd::string::format("%s%s", auto resourceMappingConfigFileNamePath = AZStd::string::format("%s%s",
AZ::SettingsRegistryMergeUtils::OrganizationRootKey, AWSCORE_RESOURCE_MAPPING_CONFIG_FILENAME_KEY); AZ::SettingsRegistryMergeUtils::OrganizationRootKey, AWSCoreResourceMappingConfigFileNameKey);
if (!m_settingsRegistry.Get(m_resourceMappingConfigFileName, resourceMappingConfigFileNamePath)) if (!m_settingsRegistry.Get(m_resourceMappingConfigFileName, resourceMappingConfigFileNamePath))
{ {
AZ_Warning("AWSCoreConfiguration", false, "Failed to get resource mapping config file name from settings registry."); AZ_Warning(AWSCoreConfigurationName, false, ResourceMappingFileNameNotFoundErrorMessage);
} }
m_profileName.clear(); m_profileName.clear();
auto profileNamePath = AZStd::string::format( auto profileNamePath = AZStd::string::format(
"%s%s", AZ::SettingsRegistryMergeUtils::OrganizationRootKey, AWSCORE_PROFILENAME_KEY); "%s%s", AZ::SettingsRegistryMergeUtils::OrganizationRootKey, AWSCoreProfileNameKey);
if (!m_settingsRegistry.Get(m_profileName, profileNamePath)) if (!m_settingsRegistry.Get(m_profileName, profileNamePath))
{ {
AZ_Warning("AWSCoreConfiguration", false, "Failed to get profile name from settings registry, using default value instead."); AZ_Warning(AWSCoreConfigurationName, false, ProfileNameNotFoundErrorMessage);
m_profileName = AWSCORE_DEFAULT_PROFILE_NAME; m_profileName = AWSCoreDefaultProfileName;
} }
} }
void AWSCoreConfiguration::ResetSettingsRegistryData()
{
auto profileNamePath = AZStd::string::format("%s%s",
AZ::SettingsRegistryMergeUtils::OrganizationRootKey, AWSCoreProfileNameKey);
m_settingsRegistry.Remove(profileNamePath);
m_profileName.clear();
auto resourceMappingConfigFileNamePath = AZStd::string::format("%s%s",
AZ::SettingsRegistryMergeUtils::OrganizationRootKey, AWSCoreResourceMappingConfigFileNameKey);
m_settingsRegistry.Remove(resourceMappingConfigFileNamePath);
m_resourceMappingConfigFileName.clear();
}
void AWSCoreConfiguration::ReloadConfiguration() void AWSCoreConfiguration::ReloadConfiguration()
{ {
ResetSettingsRegistryData();
InitSettingsRegistry(); InitSettingsRegistry();
} }
} // namespace AWSCore } // namespace AWSCore

@ -84,7 +84,7 @@ namespace AWSCore
{ {
AZ_Warning("AWSDefaultCredentialHandler", false, "Failed to get profile name, use default profile name instead"); AZ_Warning("AWSDefaultCredentialHandler", false, "Failed to get profile name, use default profile name instead");
SetProfileCredentialsProvider(Aws::MakeShared<Aws::Auth::ProfileConfigFileAWSCredentialsProvider>( SetProfileCredentialsProvider(Aws::MakeShared<Aws::Auth::ProfileConfigFileAWSCredentialsProvider>(
AWSDEFAULTCREDENTIALHANDLER_ALLOC_TAG, AWSCoreConfiguration::AWSCORE_DEFAULT_PROFILE_NAME)); AWSDEFAULTCREDENTIALHANDLER_ALLOC_TAG, AWSCoreConfiguration::AWSCoreDefaultProfileName));
} }
else else
{ {

@ -12,12 +12,14 @@
#include <AzCore/IO/Path/Path.h> #include <AzCore/IO/Path/Path.h>
#include <AzCore/JSON/schema.h> #include <AzCore/JSON/schema.h>
#include <AzCore/JSON/prettywriter.h>
#include <AzCore/Settings/SettingsRegistry.h> #include <AzCore/Settings/SettingsRegistry.h>
#include <AzCore/Settings/SettingsRegistryImpl.h> #include <AzCore/Settings/SettingsRegistryImpl.h>
#include <AzFramework/FileFunc/FileFunc.h> #include <AzFramework/FileFunc/FileFunc.h>
#include <AzFramework/StringFunc/StringFunc.h> #include <AzFramework/StringFunc/StringFunc.h>
#include <AWSCoreInternalBus.h> #include <AWSCoreInternalBus.h>
#include <Configuration/AWSCoreConfiguration.h>
#include <ResourceMapping/AWSResourceMappingConstants.h> #include <ResourceMapping/AWSResourceMappingConstants.h>
#include <ResourceMapping/AWSResourceMappingManager.h> #include <ResourceMapping/AWSResourceMappingManager.h>
#include <ResourceMapping/AWSResourceMappingUtils.h> #include <ResourceMapping/AWSResourceMappingUtils.h>
@ -25,7 +27,8 @@
namespace AWSCore namespace AWSCore
{ {
AWSResourceMappingManager::AWSResourceMappingManager() AWSResourceMappingManager::AWSResourceMappingManager()
: m_defaultAccountId("") : m_status(Status::NotLoaded)
, m_defaultAccountId("")
, m_defaultRegion("") , m_defaultRegion("")
, m_resourceMappings() , m_resourceMappings()
{ {
@ -43,11 +46,27 @@ namespace AWSCore
ResetResourceMappingsData(); ResetResourceMappingsData();
} }
AZStd::string AWSResourceMappingManager::GetResourceAttributeErrorMessageByStatus(const AZStd::string& resourceKeyName) const
{
switch (m_status)
{
case Status::NotLoaded:
return AZStd::string::format(ResourceMappingFileNotLoadedErrorMessage, AWSCoreConfiguration::AWSCoreConfigurationFileName);
case Status::Ready:
return AZStd::string::format(ResourceMappingKeyNotFoundErrorMessage, resourceKeyName.c_str());
case Status::Error:
return ResourceMappingFileLoadFailureErrorMessage;
default:
return ManagerUnexpectedStatusErrorMessage;
}
}
AZStd::string AWSResourceMappingManager::GetDefaultAccountId() const AZStd::string AWSResourceMappingManager::GetDefaultAccountId() const
{ {
if (m_defaultAccountId.empty()) if (m_defaultAccountId.empty())
{ {
AZ_Warning("AWSResourceMappingManager", false, "Account Id should not be empty, please make sure config file is valid."); AZ_Warning(AWSResourceMappingManagerName, false,
GetResourceAttributeErrorMessageByStatus(ResourceMappingAccountIdKeyName).c_str());
} }
return m_defaultAccountId; return m_defaultAccountId;
} }
@ -56,7 +75,8 @@ namespace AWSCore
{ {
if (m_defaultRegion.empty()) if (m_defaultRegion.empty())
{ {
AZ_Warning("AWSResourceMappingManager", false, "Region should not be empty, please make sure config file is valid."); AZ_Warning(AWSResourceMappingManagerName, false,
GetResourceAttributeErrorMessageByStatus(ResourceMappingRegionKeyName).c_str());
} }
return m_defaultRegion; return m_defaultRegion;
} }
@ -100,8 +120,8 @@ namespace AWSCore
AZStd::string AWSResourceMappingManager::GetServiceUrlByServiceName(const AZStd::string& serviceName) const AZStd::string AWSResourceMappingManager::GetServiceUrlByServiceName(const AZStd::string& serviceName) const
{ {
return GetServiceUrlByRESTApiIdAndStage( return GetServiceUrlByRESTApiIdAndStage(
AZStd::string::format("%s%s", serviceName.c_str(), AWS_FEATURE_GEM_RESTAPI_ID_KEYNAME_SUFFIX), AZStd::string::format("%s%s", serviceName.c_str(), AWSFeatureGemRESTApiIdKeyNameSuffix),
AZStd::string::format("%s%s", serviceName.c_str(), AWS_FEATURE_GEM_RESTAPI_STAGE_KEYNAME_SUFFIX)); AZStd::string::format("%s%s", serviceName.c_str(), AWSFeatureGemRESTApiStageKeyNameSuffix));
} }
AZStd::string AWSResourceMappingManager::GetServiceUrlByRESTApiIdAndStage( AZStd::string AWSResourceMappingManager::GetServiceUrlByRESTApiIdAndStage(
@ -113,16 +133,13 @@ namespace AWSCore
AZStd::string serviceRegion = GetResourceRegion(restApiIdKeyName); AZStd::string serviceRegion = GetResourceRegion(restApiIdKeyName);
if (serviceRegion != GetResourceRegion(restApiStageKeyName)) if (serviceRegion != GetResourceRegion(restApiStageKeyName))
{ {
AZ_Warning( AZ_Warning(AWSResourceMappingManagerName, false, ResourceMappingRESTApiIdAndStageInconsistentErrorMessage,
"AWSResourceMappingManager", false, "%s and %s have inconsistent region value, return empty service url.",
restApiIdKeyName.c_str(), restApiStageKeyName.c_str()); restApiIdKeyName.c_str(), restApiStageKeyName.c_str());
return ""; return "";
} }
AZStd::string serviceRESTApiUrl = AWSResourceMappingUtils::FormatRESTApiUrl(serviceRESTApiId, serviceRegion, serviceRESTApiStage); AZStd::string serviceRESTApiUrl = AWSResourceMappingUtils::FormatRESTApiUrl(serviceRESTApiId, serviceRegion, serviceRESTApiStage);
AZ_Warning( AZ_Warning(AWSResourceMappingManagerName, !serviceRESTApiUrl.empty(), ResourceMappingRESTApiInvalidServiceUrlErrorMessage,
"AWSResourceMappingManager", !serviceRESTApiUrl.empty(),
"Unable to format REST Api url with RESTApiId=%s, RESTApiRegion=%s, RESTApiStage=%s, return empty service url.",
serviceRESTApiId.c_str(), serviceRegion.c_str(), serviceRESTApiStage.c_str()); serviceRESTApiId.c_str(), serviceRegion.c_str(), serviceRESTApiStage.c_str());
return serviceRESTApiUrl; return serviceRESTApiUrl;
} }
@ -136,16 +153,21 @@ namespace AWSCore
return getAttributeFunction(iter->second); return getAttributeFunction(iter->second);
} }
AZ_Warning("AWSResourceMappingManager", false, "Failed to find resource mapping key: %s.", resourceKeyName.c_str()); AZ_Warning(AWSResourceMappingManagerName, false, GetResourceAttributeErrorMessageByStatus(resourceKeyName).c_str());
return ""; return "";
} }
AWSResourceMappingManager::Status AWSResourceMappingManager::GetStatus() const
{
return m_status;
}
void AWSResourceMappingManager::ParseJsonDocument(const rapidjson::Document& jsonDocument) void AWSResourceMappingManager::ParseJsonDocument(const rapidjson::Document& jsonDocument)
{ {
m_defaultAccountId = jsonDocument.FindMember(RESOURCE_MAPPING_ACCOUNTID_KEYNAME)->value.GetString(); m_defaultAccountId = jsonDocument.FindMember(ResourceMappingAccountIdKeyName)->value.GetString();
m_defaultRegion = jsonDocument.FindMember(RESOURCE_MAPPING_REGION_KEYNAME)->value.GetString(); m_defaultRegion = jsonDocument.FindMember(ResourceMappingRegionKeyName)->value.GetString();
auto resourceMappings = jsonDocument.FindMember(RESOURCE_MAPPING_RESOURCES_KEYNAME)->value.GetObject(); auto resourceMappings = jsonDocument.FindMember(ResourceMappingResourcesKeyName)->value.GetObject();
for (auto mappingIter = resourceMappings.MemberBegin(); mappingIter != resourceMappings.MemberEnd(); mappingIter++) for (auto mappingIter = resourceMappings.MemberBegin(); mappingIter != resourceMappings.MemberEnd(); mappingIter++)
{ {
auto mappingValue = mappingIter->value.GetObject(); auto mappingValue = mappingIter->value.GetObject();
@ -162,16 +184,16 @@ namespace AWSCore
const JsonObject& jsonObject) const JsonObject& jsonObject)
{ {
AWSResourceMappingAttributes attributes; AWSResourceMappingAttributes attributes;
if (jsonObject.HasMember(RESOURCE_MAPPING_ACCOUNTID_KEYNAME)) if (jsonObject.HasMember(ResourceMappingAccountIdKeyName))
{ {
attributes.resourceAccountId = jsonObject.FindMember(RESOURCE_MAPPING_ACCOUNTID_KEYNAME)->value.GetString(); attributes.resourceAccountId = jsonObject.FindMember(ResourceMappingAccountIdKeyName)->value.GetString();
} }
attributes.resourceNameId = jsonObject.FindMember(RESOURCE_MAPPING_NAMEID_KEYNAME)->value.GetString(); attributes.resourceNameId = jsonObject.FindMember(ResourceMappingNameIdKeyName)->value.GetString();
if (jsonObject.HasMember(RESOURCE_MAPPING_REGION_KEYNAME)) if (jsonObject.HasMember(ResourceMappingRegionKeyName))
{ {
attributes.resourceRegion = jsonObject.FindMember(RESOURCE_MAPPING_REGION_KEYNAME)->value.GetString(); attributes.resourceRegion = jsonObject.FindMember(ResourceMappingRegionKeyName)->value.GetString();
} }
attributes.resourceType = jsonObject.FindMember(RESOURCE_MAPPING_TYPE_KEYNAME)->value.GetString(); attributes.resourceType = jsonObject.FindMember(ResourceMappingTypeKeyName)->value.GetString();
return attributes; return attributes;
} }
@ -188,7 +210,7 @@ namespace AWSCore
AWSCoreInternalRequestBus::BroadcastResult(configJsonPath, &AWSCoreInternalRequests::GetResourceMappingConfigFilePath); AWSCoreInternalRequestBus::BroadcastResult(configJsonPath, &AWSCoreInternalRequests::GetResourceMappingConfigFilePath);
if (configJsonPath.empty()) if (configJsonPath.empty())
{ {
AZ_Warning("AWSResourceMappingManager", false, "Failed to get resource mapping config file path."); AZ_Warning(AWSResourceMappingManagerName, false, ResourceMappingFileInvalidPathErrorMessage);
return; return;
} }
@ -201,20 +223,26 @@ namespace AWSCore
if (!ValidateJsonDocumentAgainstSchema(jsonDocument)) if (!ValidateJsonDocumentAgainstSchema(jsonDocument))
{ {
// Failed to satisfy the validation against json schema // Failed to satisfy the validation against json schema
m_status = Status::Error;
return; return;
} }
ParseJsonDocument(jsonDocument); ParseJsonDocument(jsonDocument);
} }
else else
{ {
AZ_Warning( m_status = Status::Error;
"AWSResourceMappingManager", false, "Failed to get read resource mapping config file: %s\n Error: %s", AZ_Warning(AWSResourceMappingManagerName, false,
configJsonPath.c_str(), readJsonOutcome.GetError().c_str()); ResourceMappingFileInvalidJsonFormatErrorMessage, readJsonOutcome.GetError().c_str());
return;
} }
// Resource mapping config file gets loaded successfully
m_status = Status::Ready;
} }
void AWSResourceMappingManager::ResetResourceMappingsData() void AWSResourceMappingManager::ResetResourceMappingsData()
{ {
m_status = Status::NotLoaded;
m_defaultAccountId = ""; m_defaultAccountId = "";
m_defaultRegion = ""; m_defaultRegion = "";
m_resourceMappings.clear(); m_resourceMappings.clear();
@ -223,9 +251,9 @@ namespace AWSCore
bool AWSResourceMappingManager::ValidateJsonDocumentAgainstSchema(const rapidjson::Document& jsonDocument) bool AWSResourceMappingManager::ValidateJsonDocumentAgainstSchema(const rapidjson::Document& jsonDocument)
{ {
rapidjson::Document jsonSchemaDocument; rapidjson::Document jsonSchemaDocument;
if (jsonSchemaDocument.Parse(RESOURCE_MAPPING_JSON_SCHEMA).HasParseError()) if (jsonSchemaDocument.Parse(ResourceMappingJsonSchema).HasParseError())
{ {
AZ_Error("AWSResourceMappingManager", false, "Invalid resource mapping json schema."); AZ_Error(AWSResourceMappingManagerName, false, ResourceMappingFileInvalidSchemaErrorMessage);
return false; return false;
} }
@ -235,12 +263,10 @@ namespace AWSCore
if (!jsonDocument.Accept(validator)) if (!jsonDocument.Accept(validator))
{ {
rapidjson::StringBuffer error; rapidjson::StringBuffer error;
validator.GetInvalidSchemaPointer().StringifyUriFragment(error); rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(error);
AZ_Warning("AWSResourceMappingManager", false, "Failed to load config file, invalid schema: %s.", error.GetString()); validator.GetError().Accept(writer);
AZ_Warning("AWSResourceMappingManager", false, "Failed to load config file, invalid keyword: %s.", validator.GetInvalidSchemaKeyword()); AZ_Warning(AWSResourceMappingManagerName, false, ResourceMappingFileInvalidContentErrorMessage, error.GetString());
error.Clear();
validator.GetInvalidDocumentPointer().StringifyUriFragment(error);
AZ_Warning("AWSResourceMappingManager", false, "Failed to load config file, invalid document: %s.", error.GetString());
return false; return false;
} }
return true; return true;

@ -18,8 +18,8 @@ namespace AWSCore
namespace AWSResourceMappingUtils namespace AWSResourceMappingUtils
{ {
// https://docs.aws.amazon.com/general/latest/gr/apigateway.html // https://docs.aws.amazon.com/general/latest/gr/apigateway.html
static constexpr char RESTAPI_URL_FORMAT[] = "https://%s.execute-api.%s.amazonaws.com/%s"; static constexpr char RESTApiUrlFormat[] = "https://%s.execute-api.%s.amazonaws.com/%s";
static constexpr char RESTAPI_CHINA_URL_FORMAT[] = "https://%s.execute-api.%s.amazonaws.com.cn/%s"; static constexpr char RESTApiChinaUrlFormat[] = "https://%s.execute-api.%s.amazonaws.com.cn/%s";
AZStd::string FormatRESTApiUrl( AZStd::string FormatRESTApiUrl(
const AZStd::string& restApiId, const AZStd::string& restApiRegion, const AZStd::string& restApiStage) const AZStd::string& restApiId, const AZStd::string& restApiRegion, const AZStd::string& restApiStage)
@ -27,14 +27,14 @@ namespace AWSCore
// https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html // https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html
if (!restApiId.empty() && !restApiRegion.empty() && !restApiStage.empty()) if (!restApiId.empty() && !restApiRegion.empty() && !restApiStage.empty())
{ {
if (restApiRegion.rfind(AWS_CHINA_REGION_PREFIX, 0) == 0) if (restApiRegion.rfind(AWSChinaRegionPrefix, 0) == 0)
{ {
return AZStd::string::format(RESTAPI_CHINA_URL_FORMAT, return AZStd::string::format(RESTApiChinaUrlFormat,
restApiId.c_str(), restApiRegion.c_str(), restApiStage.c_str()); restApiId.c_str(), restApiRegion.c_str(), restApiStage.c_str());
} }
else else
{ {
return AZStd::string::format(RESTAPI_URL_FORMAT, return AZStd::string::format(RESTApiUrlFormat,
restApiId.c_str(), restApiRegion.c_str(), restApiStage.c_str()); restApiId.c_str(), restApiRegion.c_str(), restApiStage.c_str());
} }
} }

@ -46,7 +46,7 @@ public:
void CreateTestSetRegFile(const AZStd::string& setregContent) void CreateTestSetRegFile(const AZStd::string& setregContent)
{ {
m_normalizedSetRegFilePath = AZStd::string::format("%s/%s", m_normalizedSetRegFilePath = AZStd::string::format("%s/%s",
m_normalizedSetRegFolderPath.c_str(), AWSCore::AWSCoreConfiguration::AWSCORE_CONFIGURATION_FILENAME); m_normalizedSetRegFolderPath.c_str(), AWSCore::AWSCoreConfiguration::AWSCoreConfigurationFileName);
AzFramework::StringFunc::Path::Normalize(m_normalizedSetRegFilePath); AzFramework::StringFunc::Path::Normalize(m_normalizedSetRegFilePath);
CreateTestFile(m_normalizedSetRegFilePath, setregContent); CreateTestFile(m_normalizedSetRegFilePath, setregContent);
} }
@ -177,7 +177,7 @@ TEST_F(AWSCoreConfigurationTest, ReloadConfiguration_LoadValidSettingsRegistryAf
auto actualConfigFilePath = m_awsCoreConfiguration->GetResourceMappingConfigFilePath(); auto actualConfigFilePath = m_awsCoreConfiguration->GetResourceMappingConfigFilePath();
auto actualProfileName = m_awsCoreConfiguration->GetProfileName(); auto actualProfileName = m_awsCoreConfiguration->GetProfileName();
EXPECT_TRUE(actualConfigFilePath.empty()); EXPECT_TRUE(actualConfigFilePath.empty());
EXPECT_TRUE(actualProfileName == AWSCoreConfiguration::AWSCORE_DEFAULT_PROFILE_NAME); EXPECT_TRUE(actualProfileName == AWSCoreConfiguration::AWSCoreDefaultProfileName);
CreateTestSetRegFile(TEST_VALID_RESOURCE_MAPPING_SETREG); CreateTestSetRegFile(TEST_VALID_RESOURCE_MAPPING_SETREG);
m_awsCoreConfiguration->ReloadConfiguration(); m_awsCoreConfiguration->ReloadConfiguration();
@ -185,5 +185,24 @@ TEST_F(AWSCoreConfigurationTest, ReloadConfiguration_LoadValidSettingsRegistryAf
actualConfigFilePath = m_awsCoreConfiguration->GetResourceMappingConfigFilePath(); actualConfigFilePath = m_awsCoreConfiguration->GetResourceMappingConfigFilePath();
actualProfileName = m_awsCoreConfiguration->GetProfileName(); actualProfileName = m_awsCoreConfiguration->GetProfileName();
EXPECT_FALSE(actualConfigFilePath.empty()); EXPECT_FALSE(actualConfigFilePath.empty());
EXPECT_TRUE(actualProfileName != AWSCoreConfiguration::AWSCORE_DEFAULT_PROFILE_NAME); EXPECT_TRUE(actualProfileName != AWSCoreConfiguration::AWSCoreDefaultProfileName);
}
TEST_F(AWSCoreConfigurationTest, ReloadConfiguration_LoadInvalidSettingsRegistryAfterValidOne_ReturnEmptyConfigFilePath)
{
CreateTestSetRegFile(TEST_VALID_RESOURCE_MAPPING_SETREG);
m_awsCoreConfiguration->InitConfig();
auto actualConfigFilePath = m_awsCoreConfiguration->GetResourceMappingConfigFilePath();
auto actualProfileName = m_awsCoreConfiguration->GetProfileName();
EXPECT_FALSE(actualConfigFilePath.empty());
EXPECT_TRUE(actualProfileName != AWSCoreConfiguration::AWSCoreDefaultProfileName);
CreateTestSetRegFile(TEST_INVALID_RESOURCE_MAPPING_SETREG);
m_awsCoreConfiguration->ReloadConfiguration();
actualConfigFilePath = m_awsCoreConfiguration->GetResourceMappingConfigFilePath();
actualProfileName = m_awsCoreConfiguration->GetProfileName();
EXPECT_TRUE(actualConfigFilePath.empty());
EXPECT_TRUE(actualProfileName == AWSCoreConfiguration::AWSCoreDefaultProfileName);
} }

@ -98,7 +98,7 @@ public:
"AWSResourceMappingManager", AZ::Uuid::CreateRandom().ToString<AZStd::string>(false, false).c_str()); "AWSResourceMappingManager", AZ::Uuid::CreateRandom().ToString<AZStd::string>(false, false).c_str());
AzFramework::StringFunc::Path::Normalize(m_normalizedSourceProjectFolder); AzFramework::StringFunc::Path::Normalize(m_normalizedSourceProjectFolder);
m_normalizedConfigFolderPath = AZStd::string::format("%s/%s/", m_normalizedConfigFolderPath = AZStd::string::format("%s/%s/",
m_normalizedSourceProjectFolder.c_str(), AWSCore::AWSCoreConfiguration::AWSCORE_RESOURCE_MAPPING_CONFIG_FOLDERNAME); m_normalizedSourceProjectFolder.c_str(), AWSCore::AWSCoreConfiguration::AWSCoreResourceMappingConfigFolderName);
AzFramework::StringFunc::Path::Normalize(m_normalizedConfigFolderPath); AzFramework::StringFunc::Path::Normalize(m_normalizedConfigFolderPath);
AWSCoreInternalRequestBus::Handler::BusConnect(); AWSCoreInternalRequestBus::Handler::BusConnect();
} }
@ -178,6 +178,7 @@ TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseInvalidConfigFile_Con
EXPECT_EQ(m_reloadConfigurationCounter, 1); EXPECT_EQ(m_reloadConfigurationCounter, 1);
EXPECT_TRUE(actualAccountId.empty()); EXPECT_TRUE(actualAccountId.empty());
EXPECT_TRUE(actualRegion.empty()); EXPECT_TRUE(actualRegion.empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Error);
} }
TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_ConfigDataIsNotEmpty) TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_ConfigDataIsNotEmpty)
@ -192,6 +193,7 @@ TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_Confi
EXPECT_EQ(m_reloadConfigurationCounter, 1); EXPECT_EQ(m_reloadConfigurationCounter, 1);
EXPECT_FALSE(actualAccountId.empty()); EXPECT_FALSE(actualAccountId.empty());
EXPECT_FALSE(actualRegion.empty()); EXPECT_FALSE(actualRegion.empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Ready);
} }
TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_ConfigDataIsNotEmptyWithMultithreadCalls) TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_ConfigDataIsNotEmptyWithMultithreadCalls)
@ -230,11 +232,13 @@ TEST_F(AWSResourceMappingManagerTest, DeactivateManager_AfterActivatingWithValid
AWSResourceMappingRequestBus::BroadcastResult(actualRegion, &AWSResourceMappingRequests::GetDefaultRegion); AWSResourceMappingRequestBus::BroadcastResult(actualRegion, &AWSResourceMappingRequests::GetDefaultRegion);
EXPECT_FALSE(actualAccountId.empty()); EXPECT_FALSE(actualAccountId.empty());
EXPECT_FALSE(actualRegion.empty()); EXPECT_FALSE(actualRegion.empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Ready);
m_resourceMappingManager->DeactivateManager(); m_resourceMappingManager->DeactivateManager();
EXPECT_TRUE(m_resourceMappingManager->GetDefaultAccountId().empty()); EXPECT_TRUE(m_resourceMappingManager->GetDefaultAccountId().empty());
EXPECT_TRUE(m_resourceMappingManager->GetDefaultRegion().empty()); EXPECT_TRUE(m_resourceMappingManager->GetDefaultRegion().empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::NotLoaded);
} }
TEST_F(AWSResourceMappingManagerTest, GetDefaultAccountId_AfterParsingValidConfigFile_GetExpectedDefaultAccountId) TEST_F(AWSResourceMappingManagerTest, GetDefaultAccountId_AfterParsingValidConfigFile_GetExpectedDefaultAccountId)
@ -416,6 +420,7 @@ TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_ParseValidConfigFileAfter
EXPECT_EQ(m_reloadConfigurationCounter, 1); EXPECT_EQ(m_reloadConfigurationCounter, 1);
EXPECT_TRUE(actualAccountId.empty()); EXPECT_TRUE(actualAccountId.empty());
EXPECT_TRUE(actualRegion.empty()); EXPECT_TRUE(actualRegion.empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Error);
CreateTestConfigFile(TEST_VALID_RESOURCE_MAPPING_CONFIG_FILE); CreateTestConfigFile(TEST_VALID_RESOURCE_MAPPING_CONFIG_FILE);
m_resourceMappingManager->ReloadConfigFile(); m_resourceMappingManager->ReloadConfigFile();
@ -425,6 +430,7 @@ TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_ParseValidConfigFileAfter
EXPECT_EQ(m_reloadConfigurationCounter, 1); EXPECT_EQ(m_reloadConfigurationCounter, 1);
EXPECT_FALSE(actualAccountId.empty()); EXPECT_FALSE(actualAccountId.empty());
EXPECT_FALSE(actualRegion.empty()); EXPECT_FALSE(actualRegion.empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Ready);
} }
TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_ReloadConfigFileNameAndParseValidConfigFile_ConfigDataGetParsed) TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_ReloadConfigFileNameAndParseValidConfigFile_ConfigDataGetParsed)
@ -435,6 +441,7 @@ TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_ReloadConfigFileNameAndPa
EXPECT_EQ(m_reloadConfigurationCounter, 1); EXPECT_EQ(m_reloadConfigurationCounter, 1);
EXPECT_FALSE(m_resourceMappingManager->GetDefaultAccountId().empty()); EXPECT_FALSE(m_resourceMappingManager->GetDefaultAccountId().empty());
EXPECT_FALSE(m_resourceMappingManager->GetDefaultRegion().empty()); EXPECT_FALSE(m_resourceMappingManager->GetDefaultRegion().empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Ready);
} }
TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_MissingSetRegFile_ConfigDataIsNotParsed) TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_MissingSetRegFile_ConfigDataIsNotParsed)
@ -444,4 +451,5 @@ TEST_F(AWSResourceMappingManagerTest, ReloadConfigFile_MissingSetRegFile_ConfigD
EXPECT_EQ(m_reloadConfigurationCounter, 1); EXPECT_EQ(m_reloadConfigurationCounter, 1);
EXPECT_TRUE(m_resourceMappingManager->GetDefaultAccountId().empty()); EXPECT_TRUE(m_resourceMappingManager->GetDefaultAccountId().empty());
EXPECT_TRUE(m_resourceMappingManager->GetDefaultRegion().empty()); EXPECT_TRUE(m_resourceMappingManager->GetDefaultRegion().empty());
EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::NotLoaded);
} }

Loading…
Cancel
Save