blob: 652078eee20dd3ff790e3eb3f11c130837fc63bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var shell = require('shelljs');
// will be populated by processArgs()
var cloudant,
cloudant_user,
cloudant_pass,
db_name;
function processArgs() {
if(process.argv.length != 5) {
console.log('USAGE: node index.js CLOUDANT_USER CLOUDANT_PASS DB_NAME');
process.exit(1);
} else {
cloudant_user = process.argv[2];
cloudant_pass = process.argv[3];
db_name = process.argv[4];
const Cloudant = require('cloudant');
cloudant = Cloudant({
url: `https://${cloudant_user}:${cloudant_pass}@${cloudant_user}.cloudant.com`,
plugin: 'promises'
});
}
}
function verifyDBMigration() {
return verifyDBCreatedWithDesignDoc("container0", false)
.then(() => {
return verifyDBCreatedWithDesignDoc("container1", true);
})
.catch(err => console.error(`Failed to validate migration: ${JSON.stringify(err)}`));
}
function verifyDBCreatedWithDesignDoc(containerName, letContainerCreateDB) {
return destroyDBIfNeeded()
.then(() => {
if(!letContainerCreateDB) {
console.log(`Creating DB`);
return cloudant.db.create(db_name)
} else {
console.log(`Letting the container create the DB`);
}
})
.then(() => {
console.log(`Firing up the docker container`);
return startDockerContainer(containerName)
})
.then(() => {
return verifyView();
});
}
function destroyDBIfNeeded() {
console.log('destroying db');
return cloudant.db.list()
.then(existingDBs => {
if(existingDBs.indexOf(db_name) >= 0) {
console.log(`${db_name} already exists - DESTROY!`);
return cloudant.db.destroy(db_name);
}
});
}
function startDockerContainer(containerName) {
var dockerStartStopPromise = new Promise((resolve, reject) => {
var returnCode = shell.exec(`docker run -d --name ${containerName} -e CLOUDANT_USER=${cloudant_user} -e CLOUDANT_PASS=${cloudant_pass} openwhisk/kafkaprovider`).code
if(returnCode != 0) {
reject(`Failed to start docker container: ${returnCode}`);
return;
}
console.log("Giving the container some time to start up...");
setTimeout(function() {
console.log("Stopping the container");
var returnCode = shell.exec(`docker stop ${containerName}`).code;
if(returnCode != 0) {
reject('Failed to stop docker container');
return;
}
console.log("Deleting the container");
returnCode = shell.exec(`docker rm ${containerName}`).code;
if(returnCode != 0) {
reject('Failed to delete container');
return;
}
resolve();
}, 20000);
});
return dockerStartStopPromise;
}
function verifyView() {
var db = cloudant.db.use(db_name);
console.log('Verifying view exists and works as expected');
return ensureViewReturns(db, 0)
.then(() => {
return db.insert({
triggerURL: 'this is the only property needed by the view'
});
})
.then(() => {
// give it a few extra seconds to make sure the view is indexed
return new Promise((resolve, reject) => {
setTimeout(() => {
ensureViewReturns(db, 1)
.then(resolve)
.catch(reject);
}, 3000);
});
});
}
function ensureViewReturns(db, expectedNumberOfRows) {
return db.view('filters', 'only-triggers', {include_docs: false})
.then(results => {
if(results.rows.length != expectedNumberOfRows) {
return Promise.reject(`Expected view to contain ${expectedNumberOfRows} rows but got ${results.rows.length}`);
}
});
}
processArgs();
verifyDBMigration()
.then(() => console.log('done!'))
.catch(err => console.error(JSON.stringify(err)));