-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- The cloudant test action (testCloudantAction.js) sometimes failed with 404 since getDocument was started while putDocument was not completed, yet. - Also remove nodejs:8 support from this action.
- Loading branch information
Showing
1 changed file
with
157 additions
and
102 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,130 +1,185 @@ | ||
const nodeRuntime = process.version.startsWith('v8.') ? 'nodejs8' : 'nodejs10' | ||
const isNodeJS8 = nodeRuntime === 'nodejs8' ? true : false | ||
//var Cloudant = isNodeJS8 ? require("cloudant") : require("@cloudant/cloudant") | ||
// get the actual node version | ||
var nodeRuntime="unsupported"; | ||
switch (true) { | ||
case process.version.startsWith("v10."): nodeRuntime = "nodejs10"; break; | ||
case process.version.startsWith("v12."): nodeRuntime = "nodejs12"; break; | ||
case process.version.startsWith("v16."): nodeRuntime = "nodejs16"; break; | ||
case process.version.startsWith("v20."): nodeRuntime = "nodejs20"; break; | ||
} | ||
|
||
if (process.version.startsWith('v8.')) { | ||
var Cloudant = require("cloudant") | ||
} else if (process.version.startsWith('v16.') || process.version.startsWith('v20.')) { | ||
// load the cloudant package | ||
if (process.version.startsWith('v16.') || process.version.startsWith('v20.')) { | ||
console.log("------------------------- require @ibm-cloud/cloudant ----------------------"); | ||
var { CloudantV1 } = require('@ibm-cloud/cloudant'); | ||
} else { | ||
var Cloudant = require("@cloudant/cloudant") | ||
} | ||
|
||
function main(args){ | ||
// delete database | ||
async function deleteDatabase(client,databaseName) { | ||
try { | ||
console.log("Deleting possible existing database: "+databaseName); | ||
const response= await client.deleteDatabase({db: databaseName}); | ||
console.log("Returned from deleteDatabase response: %j",response); | ||
} catch (err) { | ||
if (err.status = 404) { | ||
// Database not found, we tolerate this for the delete. | ||
console.log("Database not found, ignored during deleteDatabase."); | ||
} else { | ||
// Other errors, progagte this to caller. | ||
throw new Error('Delete database failed!', { cause: err }); | ||
}; | ||
} | ||
return true; | ||
} | ||
|
||
// create database | ||
async function createDatabase(client,databaseName) { | ||
try { | ||
console.log("Creating database: "+databaseName); | ||
const response= await client.putDatabase({ db: databaseName }); | ||
console.log("Returned from putDatabase") | ||
if (response.result.ok) { | ||
console.log(`"${databaseName}" database created."`); | ||
} else { | ||
throw new Error('Error for client.putDatabase, response.result.ok=true expected!', {cause: response }); | ||
} | ||
} catch (err) { | ||
console.log("Error for client.putDatabase: %j",err); | ||
throw new Error('Error for client.putDatabase!', { cause: err }); | ||
} | ||
return true; | ||
} | ||
|
||
// post a document into the database | ||
async function postDocument(client,databaseName,doc) { | ||
try { | ||
console.log("writing document to database: "+databaseName); | ||
const response= await client.postDocument({db: databaseName, document: doc}) | ||
console.log("Returned from postDocument") | ||
if (response.result.ok) { | ||
console.log(`"${databaseName}" document written."`); | ||
} else { | ||
throw new Error('Error for client.postDocument, response.result.ok=true expected!', {cause: response }); | ||
} | ||
} catch (err) { | ||
console.log("Error for client.postDocument: %j",err); | ||
throw new Error('Error for client.putDatabase!', { cause: err }); | ||
} | ||
return true; | ||
} | ||
|
||
// get a document from database | ||
async function getDocument(client,databaseName,id) { | ||
var document={}; | ||
try { | ||
console.log("Get document from database: "+databaseName); | ||
const response= await client.getDocument({db: databaseName, docId: id}) | ||
console.log("Returned from getDocument, response: %j",response) | ||
if (response.statusText='OK') { | ||
console.log(`"${databaseName}" document "${id}" successfully read."`); | ||
document=response.result; | ||
} else { | ||
throw new Error('Error for client.getDocument, response.statusText=OK expected!', {cause: response }); | ||
} | ||
} catch (err) { | ||
console.log("Error for client.getDocument: %j",err); | ||
throw new Error('Error for client.getDocument!', { cause: err }); | ||
} | ||
return document; | ||
} | ||
|
||
// main action | ||
async function main(args) { | ||
var username = args.username; | ||
var password = args.password; | ||
var url = args.url; | ||
var dbName = `test_cloud_functions_nodejs_${nodeRuntime}_ibm_runtime` | ||
|
||
console.log("runtime: "+nodeRuntime) | ||
console.log("database name: "+dbName) | ||
console.log("username: "+username) | ||
|
||
if (process.version.startsWith('v16.') || process.version.startsWith('v20.')) { | ||
process.env['CLOUDANT_AUTH_TYPE'] = 'BASIC' | ||
process.env['CLOUDANT_URL'] = url | ||
process.env['CLOUDANT_USERNAME'] = username | ||
process.env['CLOUDANT_PASSWORD'] = password | ||
|
||
// 1. Create a client with `CLOUDANT` default service name | ||
// Create a client with `CLOUDANT` default service name | ||
const client = CloudantV1.newInstance({}); | ||
// Create DB | ||
const createDb = client.putDatabase({ db: dbName }) | ||
.then((putDatabaseResult) => { | ||
if (putDatabaseResult.result.ok) { | ||
console.log(`"${dbName}" database created."`); | ||
} | ||
}) | ||
.catch((err) => { | ||
if (err.code === 412) { | ||
console.log( | ||
`Cannot create "${dbName}" database, it already exists.` | ||
); | ||
} | ||
}); | ||
|
||
var friendinfo; | ||
// Writte to DB | ||
return createDb.then(() => { | ||
client | ||
.postDocument({ | ||
db: dbName, | ||
document: { | ||
"_id" : 'friend1', | ||
"firstname": "Suzzy", | ||
"lastname": "Queue" | ||
} | ||
}) | ||
.then((createDocumentResponse) => { | ||
rev = createDocumentResponse.result.rev; | ||
console.log('You have created the document:\n'); | ||
}); | ||
}).then(() => { | ||
// call service with predefined parameters: | ||
console.log('client.getDocument:\n'); | ||
return client.getDocument({db: dbName, docId: 'friend1'}).then((document) => { | ||
return document; | ||
}); | ||
}).then((data) => { | ||
friendinfo = data | ||
console.log('client.deleteDatabase friend=',friendinfo); | ||
return client.deleteDatabase({db: dbName}) //.then((db) => {return db}) | ||
}).then(function(){ | ||
console.log('return the document=', friendinfo); | ||
//return the document fetched from the db | ||
return friendinfo; | ||
}).catch(function(err){ | ||
console.log('error received:', err); | ||
//If an error occurrs at any part in execution; return error | ||
return {err: err} | ||
}) | ||
|
||
//fetch from DB | ||
// Delete a possible existing database from a previous run. | ||
const delDB= await deleteDatabase(client,dbName); | ||
|
||
// Create a database. | ||
const createDB= await createDatabase(client,dbName); | ||
console.log("createDatabase returned:"+createDB); | ||
|
||
// Post a document into the new database. | ||
const doc={ | ||
"_id" : 'friend1', | ||
"firstname": "Suzzy", | ||
"lastname": "Queue" | ||
} | ||
const postDoc= await postDocument(client,dbName,doc); | ||
console.log("postDocument returned:"+postDoc) | ||
|
||
// Read the document from the database. | ||
const getDoc= await getDocument(client,dbName,'friend1'); | ||
console.log("getDocument returned: %j",getDoc) | ||
|
||
// const delDB2= await deleteDatabase(client,dbName); | ||
|
||
// Return the document read from the database. | ||
return getDoc; | ||
|
||
} else { | ||
//Configuration to use Cloudant | ||
var config = {account:username, password:password} | ||
isNodeJS8 ? config.plugin='promises' : config.plugins=['promises'] | ||
var cloudant = Cloudant(config); | ||
|
||
var beforeAction = new Promise(function(resolve ,reject){ | ||
cloudant.db.destroy(dbName) | ||
.then(function(){ | ||
console.log("Previous database with name: "+dbName+"existed; it was cleaned up so that tests can run"); | ||
return resolve(); | ||
}) | ||
.catch(function(){ | ||
return resolve(); | ||
}) | ||
}); | ||
|
||
//Create the cloudant database | ||
return beforeAction.then(function(){ | ||
return cloudant.db.create(dbName) | ||
}) | ||
.then(function(data){ | ||
//Switch to use that newly created database. | ||
return cloudant.db.use(dbName); | ||
}) | ||
.then(function(db){ | ||
var friendinfo; | ||
//Inject a json document named friend1 into the database. | ||
return db.insert({firstname: "Suzzy", lastname: "Queue"}, 'friend1') | ||
.then(function(){ | ||
//fetch the newly injected document from the database | ||
return db.get('friend1'); | ||
|
||
//Configuration to use Cloudant | ||
var config = {account:username, password:password, plugins:['promises']} | ||
var cloudant = Cloudant(config); | ||
|
||
var beforeAction = new Promise(function(resolve ,reject){ | ||
cloudant.db.destroy(dbName) | ||
.then(function(){ | ||
console.log("Previous database with name: "+dbName+"existed; it was cleaned up so that tests can run"); | ||
return resolve(); | ||
}) | ||
.catch(function(){ | ||
return resolve(); | ||
}) | ||
}); | ||
|
||
//Create the cloudant database | ||
return beforeAction.then(function(){ | ||
return cloudant.db.create(dbName) | ||
}) | ||
.then(function(data){ | ||
friendinfo = data; | ||
//destroy the database | ||
return cloudant.db.destroy(dbName); | ||
//Switch to use that newly created database. | ||
return cloudant.db.use(dbName); | ||
}) | ||
.then(function(){ | ||
//return the document fetched from the db | ||
return friendinfo; | ||
.then(function(db){ | ||
var friendinfo; | ||
//Inject a json document named friend1 into the database. | ||
return db.insert({firstname: "Suzzy", lastname: "Queue"}, 'friend1') | ||
.then(function(){ | ||
//fetch the newly injected document from the database | ||
return db.get('friend1'); | ||
}) | ||
.then(function(data){ | ||
friendinfo = data; | ||
//destroy the database | ||
return cloudant.db.destroy(dbName); | ||
}) | ||
.then(function(){ | ||
//return the document fetched from the db | ||
return friendinfo; | ||
}) | ||
}) | ||
.catch(function(err){ | ||
//If an error occurrs at any part in execution; return error | ||
return {err: err} | ||
}) | ||
}) | ||
.catch(function(err){ | ||
//If an error occurrs at any part in execution; return error | ||
return {err: err} | ||
}) | ||
} | ||
} | ||
} |