Skip to content
This repository has been archived by the owner on Mar 3, 2023. It is now read-only.

Commit

Permalink
Merge timeout branch
Browse files Browse the repository at this point in the history
  • Loading branch information
xlz-jbleclere committed Nov 3, 2020
2 parents 47c3246 + d006628 commit 5cac5b8
Show file tree
Hide file tree
Showing 14 changed files with 288 additions and 129 deletions.
2 changes: 1 addition & 1 deletion deployment/azure-pipelines-health-test-pkg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ trigger: none
schedules:
# Run tests from Production package daily
- cron: "0 0 * * *"
displayName: Daily midnight test of packages
displayName: Daily midnight test of Production packages
branches:
include:
- master
Expand Down
1 change: 1 addition & 0 deletions include/accelize/drm/ParameterKey.def
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,4 @@ PARAMETERKEY_ITEM( ws_verbosity ) ///< Read-(write), read (and
PARAMETERKEY_ITEM( trng_status ) ///< Read-only, read the TRNG related status registers
PARAMETERKEY_ITEM( num_license_loaded ) ///< Read-only, read the number of licenses provisioned in the DRM Controller
PARAMETERKEY_ITEM( derived_product ) ///< Read-write, read and write the derived product information with the format: "vendor/library/name"
PARAMETERKEY_ITEM( ws_connection_timeout ) ///< Read-(write), read (and write) the maximum period of time in seconds for the client to connect to the server. Can be set only from configuration file (no override from user's code)
5 changes: 3 additions & 2 deletions internal_inc/csp.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,14 @@ class CspBase {
std::string mName; // CSP name

protected:
uint32_t mTimeOutMS; // Connection timeout in millseconds
int32_t mConnectionTimeoutMS; // Connection timeout in milliseconds
int32_t mRequestTimeoutMS; // Request timeout in milliseconds
uint32_t mVerbosity; // HTTP verbosity: 0: default, 1:verbose

public:

CspBase() = delete; //!< No default constructor
CspBase( const std::string &name, const uint32_t timeout_ms );
CspBase( const std::string &name, const int32_t connection_timeout_ms, const int32_t request_timeout_ms );
virtual ~CspBase() {};

std::string getName() const { return mName; }
Expand Down
40 changes: 20 additions & 20 deletions internal_inc/ws_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ namespace DRM {
class CurlSingleton {

private:
CurlSingleton() { curl_global_init(CURL_GLOBAL_ALL); }
CurlSingleton() { curl_global_init( CURL_GLOBAL_ALL ); }
~CurlSingleton() { curl_global_cleanup(); }

public:
CurlSingleton(const CurlSingleton&) = delete;
CurlSingleton& operator=(const CurlSingleton&) = delete;
CurlSingleton( const CurlSingleton& ) = delete;
CurlSingleton& operator=( const CurlSingleton& ) = delete;

static void Init() {
static CurlSingleton g_curl;
Expand All @@ -57,10 +57,9 @@ class CurlEasyPost {
struct curl_slist *mHeaders_p = NULL;
struct curl_slist *mHostResolveList = NULL;
std::array<char, CURL_ERROR_SIZE> mErrBuff;
uint32_t mConnectionTimeout = 15; // Default timeout (in seconds) to establish connection

public:
static bool is_error_retryable(long resp_code) {
static bool is_error_retryable( long resp_code ) {
return resp_code == 408 // Request Timeout
|| resp_code == 429 // Too Many Requests
|| resp_code == 470 // Floating License: no token available
Expand Down Expand Up @@ -92,10 +91,10 @@ class CurlEasyPost {
return DRM_WSError;
}

CurlEasyPost();
CurlEasyPost( const uint32_t& connection_timeout_ms );
~CurlEasyPost();

double getTotalTime();
double getTotalTime(); // Get total time in seconds of the previous transfer

void setVerbosity( const uint32_t verbosity );
void setHostResolves( const Json::Value& host_json );
Expand All @@ -119,7 +118,6 @@ class CurlEasyPost {
curl_easy_setopt( mCurl, CURLOPT_HTTPHEADER, mHeaders_p );
}
curl_easy_setopt( mCurl, CURLOPT_WRITEDATA, (void*)&response );
curl_easy_setopt( mCurl, CURLOPT_CONNECTTIMEOUT, mConnectionTimeout );
curl_easy_setopt( mCurl, CURLOPT_TIMEOUT_MS, timeout_ms );
CURLcode res = curl_easy_perform( mCurl );

Expand All @@ -129,9 +127,9 @@ class CurlEasyPost {
|| res == CURLE_COULDNT_RESOLVE_HOST
|| res == CURLE_COULDNT_CONNECT
|| res == CURLE_OPERATION_TIMEDOUT ) {
Throw( DRM_WSMayRetry, "libcurl failed to perform HTTP request to Accelize webservice ({}) : {}", curl_easy_strerror( res ), mErrBuff.data() ); //LCOV_EXCL_LINE
Throw( DRM_WSMayRetry, "Failed to perform HTTP request to Accelize webservice ({}) : {}", curl_easy_strerror( res ), mErrBuff.data() ); //LCOV_EXCL_LINE
} else {
Throw( DRM_ExternFail, "libcurl failed to perform HTTP request to Accelize webservice ({}) : {}", curl_easy_strerror( res ), mErrBuff.data() ); //LCOV_EXCL_LINE
Throw( DRM_ExternFail, "Failed to perform HTTP request to Accelize webservice ({}) : {}", curl_easy_strerror( res ), mErrBuff.data() ); //LCOV_EXCL_LINE
}
}
curl_easy_getinfo( mCurl, CURLINFO_RESPONSE_CODE, &resp_code );
Expand Down Expand Up @@ -167,7 +165,6 @@ class CurlEasyPost {
}
curl_easy_setopt( mCurl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt( mCurl, CURLOPT_WRITEDATA, (void*)&response );
curl_easy_setopt( mCurl, CURLOPT_CONNECTTIMEOUT, mConnectionTimeout );
curl_easy_setopt( mCurl, CURLOPT_TIMEOUT_MS, timeout_ms );
CURLcode res = curl_easy_perform( mCurl );

Expand All @@ -177,10 +174,10 @@ class CurlEasyPost {
|| res == CURLE_COULDNT_RESOLVE_HOST
|| res == CURLE_COULDNT_CONNECT
|| res == CURLE_OPERATION_TIMEDOUT ) {
Throw( DRM_WSMayRetry, "libcurl failed to perform HTTP request to Accelize webservice ({}) : {}",
Throw( DRM_WSMayRetry, "Failed to perform HTTP request to Accelize webservice ({}) : {}",
curl_easy_strerror( res ), mErrBuff.data() );
} else {
Throw( DRM_ExternFail, "libcurl failed to perform HTTP request to Accelize webservice ({}) : {}",
Throw( DRM_ExternFail, "Failed to perform HTTP request to Accelize webservice ({}) : {}",
curl_easy_strerror( res ), mErrBuff.data() );
}
}
Expand Down Expand Up @@ -209,7 +206,8 @@ class CurlEasyPost {
class DrmWSClient {

const uint32_t cTokenExpirationMargin = 60; // In seconds
const uint32_t cRequestTimeout = 30; // In seconds
const int32_t cRequestTimeout = 30; // In seconds
const int32_t cConnectionTimeout = 15; // In seconds

protected:

Expand All @@ -226,10 +224,11 @@ class DrmWSClient {
uint32_t mTokenValidityPeriod; /// Validation period of the OAuth2 token in seconds
uint32_t mTokenExpirationMargin; /// OAuth2 token expiration margin in seconds
TClock::time_point mTokenExpirationTime; /// OAuth2 expiration time
int32_t mRequestTimeout; /// Maximum period in seconds for a request to complete
int32_t mRequestTimeoutMS; /// Maximum period in milliseconds for a request to complete
int32_t mConnectionTimeoutMS; /// Maximum period in milliseconds for the client to connect the server

bool isTokenValid() const;
Json::Value requestMetering( const std::string url, const Json::Value& json_req, int32_t timeout_sec );
Json::Value requestMetering( const std::string url, const Json::Value& json_req, int32_t timeout_msec );

public:
DrmWSClient(const std::string &conf_file_path, const std::string &cred_file_path);
Expand All @@ -240,12 +239,13 @@ class DrmWSClient {
uint32_t getTokenValidity() const { return mTokenValidityPeriod; }
int32_t getTokenTimeLeft() const;
std::string getTokenString() const { return mOAuth2Token; }
uint32_t getRequestTimeout() const { return mRequestTimeout; }
int32_t getRequestTimeoutMS() const { return mRequestTimeoutMS; }
int32_t getConnectionTimeoutMS() const { return mConnectionTimeoutMS; }

void requestOAuth2token( int32_t timeout_sec );
void requestOAuth2token( int32_t timeout_msec );

Json::Value requestLicense( const Json::Value& json_req, int32_t timeout_sec );
Json::Value requestHealth( const Json::Value& json_req, int32_t timeout_sec );
Json::Value requestLicense( const Json::Value& json_req, int32_t timeout_msec );
Json::Value requestHealth( const Json::Value& json_req, int32_t timeout_msec );

};

Expand Down
33 changes: 17 additions & 16 deletions source/csp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Json::Value GetCspInfo( uint32_t verbosity ) {

/** AWS class
*/
Aws::Aws():CspBase( "Aws", 50 ) {}
Aws::Aws():CspBase( "Aws", 50, 50 ) {}

Json::Value Aws::get_metadata() {
Json::Value metadata = Json::nullValue;
Expand All @@ -64,21 +64,21 @@ Json::Value Aws::get_metadata() {
// Using IMDSv2 method

// Get token
CurlEasyPost tokenReq;
CurlEasyPost tokenReq( mConnectionTimeoutMS );
tokenReq.setVerbosity( mVerbosity );
tokenReq.appendHeader( "X-aws-ec2-metadata-token-ttl-seconds: 21600" );
token = tokenReq.perform_put<std::string>( "http://169.254.169.254/latest/api/token", mTimeOutMS );
token = tokenReq.perform_put<std::string>( "http://169.254.169.254/latest/api/token", mRequestTimeoutMS );

// Collect AWS information
CurlEasyPost req;
CurlEasyPost req( mConnectionTimeoutMS );
req.setVerbosity( mVerbosity );
std::string header = fmt::format("X-aws-ec2-metadata-token: {}", token);
req.appendHeader( header );
std::string base_url("http://169.254.169.254/latest");
metadata["instance_id"] = req.perform_get<std::string>( fmt::format( "{}/meta-data/instance-id", base_url ), mTimeOutMS );
metadata["instance_type"] = req.perform_get<std::string>( fmt::format( "{}/meta-data/instance-type", base_url ), mTimeOutMS );
metadata["ami_id"] = req.perform_get<std::string>( fmt::format( "{}/meta-data/ami-id", base_url ), mTimeOutMS );
std::string doc_string = req.perform_get<std::string>( fmt::format( "{}/dynamic/instance-identity/document", base_url ), mTimeOutMS );
metadata["instance_id"] = req.perform_get<std::string>( fmt::format( "{}/meta-data/instance-id", base_url ), mRequestTimeoutMS );
metadata["instance_type"] = req.perform_get<std::string>( fmt::format( "{}/meta-data/instance-type", base_url ), mRequestTimeoutMS );
metadata["ami_id"] = req.perform_get<std::string>( fmt::format( "{}/meta-data/ami-id", base_url ), mRequestTimeoutMS );
std::string doc_string = req.perform_get<std::string>( fmt::format( "{}/dynamic/instance-identity/document", base_url ), mRequestTimeoutMS );
Json::Value doc_json = parseJsonString( doc_string );
metadata["region"] = doc_json["region"];
return metadata;
Expand All @@ -87,27 +87,28 @@ Json::Value Aws::get_metadata() {

/** Alibaba class
*/
Alibaba::Alibaba():CspBase( "Alibaba", 50 ) {}
Alibaba::Alibaba():CspBase( "Alibaba", 50, 50 ) {}

Json::Value Alibaba::get_metadata() {
Json::Value metadata = Json::nullValue;
CurlEasyPost req;
CurlEasyPost req( mConnectionTimeoutMS );
req.setVerbosity( mVerbosity );
// Collect Alibaba information
std::string base_url("http://100.100.100.200/latest/meta-data");
metadata["instance_id"] = req.perform_get<std::string>( fmt::format( "{}/instance-id", base_url ), mTimeOutMS );
metadata["instance_type"] = req.perform_get<std::string>( fmt::format( "{}/instance/instance-type", base_url ), mTimeOutMS );
metadata["ami_id"] = req.perform_get<std::string>( fmt::format( "{}/image-id", base_url ), mTimeOutMS );
metadata["region"] = req.perform_get<std::string>( fmt::format( "{}/region-id", base_url ), mTimeOutMS );
metadata["instance_id"] = req.perform_get<std::string>( fmt::format( "{}/instance-id", base_url ), mRequestTimeoutMS );
metadata["instance_type"] = req.perform_get<std::string>( fmt::format( "{}/instance/instance-type", base_url ), mRequestTimeoutMS );
metadata["ami_id"] = req.perform_get<std::string>( fmt::format( "{}/image-id", base_url ), mRequestTimeoutMS );
metadata["region"] = req.perform_get<std::string>( fmt::format( "{}/region-id", base_url ), mRequestTimeoutMS );
return metadata;
}


/** CspBase class
*/
CspBase::CspBase( const std::string &name, const uint32_t timeout_ms ) {
CspBase::CspBase( const std::string &name, const int32_t connection_timeout_ms, const int32_t request_timeout_ms ) {
mName = name;
mTimeOutMS = timeout_ms;
mConnectionTimeoutMS = connection_timeout_ms;
mRequestTimeoutMS = request_timeout_ms;
mVerbosity = 0;
}

Expand Down
Loading

0 comments on commit 5cac5b8

Please sign in to comment.