You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by cs...@apache.org on 2017/08/03 20:44:35 UTC
[incubator-openwhisk] branch master updated: Set user agent header
in API GW requests (#2439)
This is an automated email from the ASF dual-hosted git repository.
csantanapr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git
The following commit(s) were added to refs/heads/master by this push:
new d27e2e4 Set user agent header in API GW requests (#2439)
d27e2e4 is described below
commit d27e2e4efb9dee456e100dd4b6c17180feb11602
Author: Mark Deuser <md...@us.ibm.com>
AuthorDate: Thu Aug 3 16:44:33 2017 -0400
Set user agent header in API GW requests (#2439)
* Add OW User-Agent header in API GW requests
* Adhere to user-agent header format
Append any incoming user-agent header value as a sub user-agent
---
core/routemgmt/common/apigw-utils.js | 34 +++++++++++++++++++++++-----------
core/routemgmt/createApi/createApi.js | 11 ++++++++---
core/routemgmt/deleteApi/deleteApi.js | 9 +++++++--
core/routemgmt/getApi/getApi.js | 12 +++++++++---
4 files changed, 47 insertions(+), 19 deletions(-)
diff --git a/core/routemgmt/common/apigw-utils.js b/core/routemgmt/common/apigw-utils.js
index 5f60e1c..a234595 100644
--- a/core/routemgmt/common/apigw-utils.js
+++ b/core/routemgmt/common/apigw-utils.js
@@ -21,6 +21,9 @@
var request = require('request');
var _ = require('lodash');
+const ApimgmtUserAgent = "OpenWhisk-apimgmt/1.0.0";
+var UserAgent = ApimgmtUserAgent;
+
/**
* Configures an API route on the API Gateway. This API will map to an OpenWhisk action that
* will be invoked by the API Gateway when the API route is accessed.
@@ -42,15 +45,17 @@ function addApiToGateway(gwInfo, spaceGuid, swaggerApi, apiId) {
followAllRedirects: true,
url: gwInfo.gwUrl+'/'+encodeURIComponent(spaceGuid) + '/apis',
json: swaggerApi, // Use of json automatically sets header: 'Content-Type': 'application/json'
+ headers: {
+ 'User-Agent': UserAgent
+ }
};
if (gwInfo.gwAuth) {
_.set(options, "headers.Authorization", 'Bearer ' + gwInfo.gwAuth);
}
- console.log('addApiToGateway: ');
if (apiId) {
console.log("addApiToGateway: Updating existing API");
- options.url = gwInfo.gwUrl + '/' + encodeURIComponent(spaceGuid) + '/apis/' + encodeURIComponent(apiId)
+ options.url = gwInfo.gwUrl + '/' + encodeURIComponent(spaceGuid) + '/apis/' + encodeURIComponent(apiId);
requestFcn = request.put;
}
@@ -64,8 +69,8 @@ function addApiToGateway(gwInfo, spaceGuid, swaggerApi, apiId) {
var statusCode = response ? response.statusCode : undefined;
console.log('addApiToGateway: response status:'+ statusCode);
if (error) console.error('Warning: addRouteToGateway request failed: '+ makeJsonString(error));
+ if (response && response.headers) console.log('addApiToGateway: response headers: '+makeJsonString(response.headers));
if (body) console.log('addApiToGateway: response body: '+makeJsonString(body));
-
if (error) {
console.error('addApiToGateway: Unable to configure the API Gateway');
reject('Unable to configure the API Gateway: '+makeJsonString(error));
@@ -103,7 +108,8 @@ function deleteApiFromGateway(gwInfo, spaceGuid, apiId) {
url: gwInfo.gwUrl+'/'+encodeURIComponent(spaceGuid)+'/apis/'+encodeURIComponent(apiId),
agentOptions: {rejectUnauthorized: false},
headers: {
- 'Accept': 'application/json'
+ 'Accept': 'application/json',
+ 'User-Agent': UserAgent
}
};
if (gwInfo.gwAuth) {
@@ -117,6 +123,7 @@ function deleteApiFromGateway(gwInfo, spaceGuid, apiId) {
console.log('deleteApiFromGateway: response status:'+ statusCode);
if (error) console.error('Warning: deleteGatewayApi request failed: '+ makeJsonString(error));
if (body) console.log('deleteApiFromGateway: response body: '+makeJsonString(body));
+ if (response && response.headers) console.log('deleteApiFromGateway: response headers: '+makeJsonString(response.headers));
if (error) {
console.error('deleteApiFromGateway: Unable to delete the API Gateway');
reject('Unable to delete the API Gateway: '+makeJsonString(error));
@@ -155,7 +162,8 @@ function getApis(gwInfo, spaceGuid, bpOrApiName) {
followAllRedirects: true,
url: gwInfo.gwUrl+'/'+encodeURIComponent(spaceGuid)+'/apis',
headers: {
- 'Accept': 'application/json'
+ 'Accept': 'application/json',
+ 'User-Agent': UserAgent
},
json: true
};
@@ -375,7 +383,7 @@ function generateBaseSwaggerApi(basepath, apiname) {
function addEndpointToSwaggerApi(swaggerApi, endpoint, responsetype) {
var operation = endpoint.gatewayMethod.toLowerCase();
var operationId = makeOperationId(operation, endpoint.gatewayPath);
- var responsetype = responsetype || 'json';
+ responsetype = responsetype || 'json';
console.log('addEndpointToSwaggerApi: operationid = '+operationId);
try {
var auth_base64 = Buffer.from(endpoint.action.authkey,'ascii').toString('base64');
@@ -477,9 +485,8 @@ function removeEndpointFromSwaggerApi(swaggerApi, endpoint) {
if (!operation) {
console.log('removeEndpointFromSwaggerApi: No operation; removing entire relpath '+relpath);
if (swaggerApi.paths[relpath]) {
- for (var operation in swaggerApi.paths[relpath]) {
- var operationId = makeOperationId(operation, relpath);
- deleteActionOperationInvocationDetails(swaggerApi, operationId);
+ for (var op in swaggerApi.paths[relpath]) {
+ deleteActionOperationInvocationDetails(swaggerApi, makeOperationId(op, relpath));
}
delete swaggerApi.paths[relpath];
} else {
@@ -487,14 +494,13 @@ function removeEndpointFromSwaggerApi(swaggerApi, endpoint) {
return 'path \''+relpath+'\' does not exist in the API';
}
} else { // relpath and operation are specified, just delete the specific operation
- var operationId = makeOperationId(operation, relpath);
if (swaggerApi.paths[relpath] && swaggerApi.paths[relpath][operation]) {
delete swaggerApi.paths[relpath][operation];
if (Object.keys(swaggerApi.paths[relpath]).length === 0) {
console.log('removeEndpointFromSwaggerApi: after deleting operation '+operation+', relpath '+relpath+' has no more operations; so deleting entire relpath '+relpath);
delete swaggerApi.paths[relpath];
}
- deleteActionOperationInvocationDetails(swaggerApi, operationId);
+ deleteActionOperationInvocationDetails(swaggerApi, makeOperationId(operation, relpath));
} else {
console.log('removeEndpointFromSwaggerApi: relpath '+relpath+' with operation '+operation+' does not exist in the API');
return 'path \''+relpath+'\' with operation \''+operation+'\' does not exist in the API';
@@ -865,6 +871,11 @@ function makeCamelCase(str) {
return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();
}
+function setSubUserAgent(subAgent) {
+ if (subAgent && subAgent.length > 0) {
+ UserAgent = UserAgent + " " + subAgent;
+ }
+}
module.exports.getApis = getApis;
module.exports.addApiToGateway = addApiToGateway;
@@ -882,3 +893,4 @@ module.exports.updateNamespace = updateNamespace;
module.exports.makeErrorResponseObject = makeErrorResponseObject;
module.exports.makeResponseObject = makeResponseObject;
module.exports.makeJsonString = makeJsonString;
+module.exports.setSubUserAgent = setSubUserAgent;
diff --git a/core/routemgmt/createApi/createApi.js b/core/routemgmt/createApi/createApi.js
index e71b50a..a984b33 100644
--- a/core/routemgmt/createApi/createApi.js
+++ b/core/routemgmt/createApi/createApi.js
@@ -58,7 +58,7 @@ function main(message) {
//console.log('message: '+JSON.stringify(message)); // ONLY FOR TEMPORARY/LOCAL DEBUG; DON'T ENABLE PERMANENTLY
var badArgMsg = validateArgs(message);
if (badArgMsg) {
- return Promise.reject(utils2.makeErrorResponseObject(badArgMsg, (message.__ow_method != undefined)));
+ return Promise.reject(utils2.makeErrorResponseObject(badArgMsg, (message.__ow_method !== undefined)));
}
var gwInfo = {
@@ -73,6 +73,11 @@ function main(message) {
utils.updateNamespace(message.apidoc, message.__ow_user);
}
+ // Set the User-Agent header value
+ if (message.__ow_headers && message.__ow_headers['user-agent']) {
+ utils2.setSubUserAgent(message.__ow_headers['user-agent']);
+ }
+
// message.apidoc already validated; creating shortcut to it
var doc;
if (typeof message.apidoc === 'object') {
@@ -95,7 +100,7 @@ function main(message) {
var tenantInstance = message.tenantInstance || 'openwhisk';
// This can be invoked as either a standard web action or as a normal action
- var calledAsWebAction = message.__ow_method != undefined;
+ var calledAsWebAction = message.__ow_method !== undefined;
// Log parameter values
console.log('GW URL : '+message.gwUrl);
@@ -133,7 +138,7 @@ function main(message) {
.then(function(endpointDocs) {
console.log('Got '+endpointDocs.length+' APIs');
if (endpointDocs.length === 0) {
- console.log('No API found for namespace '+doc.namespace + ' with basePath '+ basepath)
+ console.log('No API found for namespace '+doc.namespace + ' with basePath '+ basepath);
return Promise.resolve(utils2.generateBaseSwaggerApi(basepath, doc.apiName));
} else {
apiDocId = endpointDocs[0].artifact_id;
diff --git a/core/routemgmt/deleteApi/deleteApi.js b/core/routemgmt/deleteApi/deleteApi.js
index 4fd4c5e..421c25b 100644
--- a/core/routemgmt/deleteApi/deleteApi.js
+++ b/core/routemgmt/deleteApi/deleteApi.js
@@ -57,13 +57,18 @@ function main(message) {
gwInfo.gwAuth = Buffer.from(message.gwUser+':'+message.gwPwd,'ascii').toString('base64');
}
+ // Set the User-Agent header value
+ if (message.__ow_headers && message.__ow_headers['user-agent']) {
+ utils2.setSubUserAgent(message.__ow_headers['user-agent']);
+ }
+
// Set namespace override if provided
message.namespace = message.__ow_user || message.namespace;
var tenantInstance = message.tenantInstance || 'openwhisk';
// This can be invoked as either a web action or as a normal action
- var calledAsWebAction = message.__ow_method != undefined;
+ var calledAsWebAction = message.__ow_method !== undefined;
// Log parameter values
console.log('GW URL : '+message.gwUrl);
@@ -98,7 +103,7 @@ function main(message) {
.then(function(endpointDocs) {
console.log('Got '+endpointDocs.length+' APIs');
if (endpointDocs.length === 0) {
- console.log('No API found for namespace '+message.namespace + ' with basePath '+ message.basepath)
+ console.log('No API found for namespace '+message.namespace + ' with basePath '+ message.basepath);
return Promise.reject('API \''+message.basepath+'\' does not exist.');
} else if (endpointDocs.length > 1) {
console.error('Multiple APIs found for namespace '+message.namespace+' with basepath/apiname '+message.basepath);
diff --git a/core/routemgmt/getApi/getApi.js b/core/routemgmt/getApi/getApi.js
index 04766ed..198b820 100644
--- a/core/routemgmt/getApi/getApi.js
+++ b/core/routemgmt/getApi/getApi.js
@@ -46,9 +46,10 @@ var utils = require('./utils.js');
var utils2 = require('./apigw-utils.js');
function main(message) {
+ console.log('message: '+JSON.stringify(message)); // ONLY FOR TEMPORARY/LOCAL DEBUG; DON'T ENABLE PERMANENTLY
var badArgMsg = validateArgs(message);
if (badArgMsg) {
- return Promise.reject(utils2.makeErrorResponseObject(badArgMsg, (message.__ow_method != undefined)));
+ return Promise.reject(utils2.makeErrorResponseObject(badArgMsg, (message.__ow_method !== undefined)));
}
message.outputFormat = message.outputFormat || 'swagger';
@@ -61,11 +62,16 @@ function main(message) {
gwInfo.gwAuth = Buffer.from(message.gwUser+':'+message.gwPwd,'ascii').toString('base64');
}
+ // Set the User-Agent header value
+ if (message.__ow_headers && message.__ow_headers['user-agent']) {
+ utils2.setSubUserAgent(message.__ow_headers['user-agent']);
+ }
+
// Set namespace override if provided
message.namespace = message.__ow_user || message.namespace;
// This can be invoked as either web action or as a normal action
- var calledAsWebAction = message.__ow_method != undefined;
+ var calledAsWebAction = message.__ow_method !== undefined;
// Log parameter values
console.log('gwUrl : '+message.gwUrl);
@@ -89,7 +95,7 @@ function main(message) {
.then(function(endpointDocs) {
console.log('Got '+endpointDocs.length+' APIs');
if (endpointDocs.length === 0) {
- console.log('No API found for namespace '+message.namespace + ' with basePath '+ message.basepath)
+ console.log('No API found for namespace '+message.namespace + ' with basePath '+ message.basepath);
}
var cliApis = utils2.generateCliResponse(endpointDocs);
console.log('getApi success');
--
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].