--- /dev/null
+/* Copyright (c) 2019 AT&T Intellectual Property. #\r
+# #\r
+# Licensed under the Apache License, Version 2.0 (the "License"); #\r
+# you may not use this file except in compliance with the License. #\r
+# You may obtain a copy of the License at #\r
+# #\r
+# http://www.apache.org/licenses/LICENSE-2.0 #\r
+# #\r
+# Unless required by applicable law or agreed to in writing, software #\r
+# distributed under the License is distributed on an "AS IS" BASIS, #\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #\r
+# See the License for the specific language governing permissions and #\r
+# limitations under the License. #\r
+##############################################################################*/\r
+\r
+\r
+const axios = require('axios');\r
+const pickleRick = require('pickle-rick');\r
+const Response = require('http-response-object');\r
+const logger = require('../../../lib/logger');\r
+const util = require('../../../lib/otf-util');\r
+const Readable = require('stream').Readable;\r
+const request = require('request');\r
+\r
+class Service {\r
+ constructor(options) {\r
+ this.options = options || {};\r
+ }\r
+\r
+ async find(params) {\r
+ return [];\r
+ }\r
+\r
+ async get(id, params) {\r
+ return {\r
+ id, text: `A new message with ID: ${id}!`\r
+ };\r
+ }\r
+\r
+ async create(data, params) {\r
+ if (Array.isArray(data)) {\r
+ return Promise.all(data.map(current => this.create(current, params)));\r
+ }\r
+\r
+ data.deploying = true;\r
+\r
+ //let formData = new FormData();\r
+ let formData = {};\r
+ //prepare multipart form data\r
+ //formData.append('testDefinitionDeployerId', JSON.stringify(params.user._id));\r
+ formData['testDefinitionDeployerId'] = JSON.stringify(params.user._id);\r
+ if (data.testDefinition._id) {\r
+ //formData.append('testDefinitionId', JSON.stringify(data.testDefinition._id));\r
+ formData['testDefinitionId'] = JSON.stringify(data.testDefinition._id);\r
+ }\r
+\r
+ //If version was supplied change current version\r
+ if(data.version != null && data.version != undefined){\r
+ data.testDefinition.currentVersion = data.testDefinition.bpmnInstances.findIndex(e => e.version == data.version);\r
+ }\r
+\r
+ //get bpmnfile\r
+ await this.options.app.services[this.options.app.get('base-path') + 'file-transfer'].get(data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].bpmnFileId)\r
+ .then(result => {\r
+ // let b = new Buffer(result);\r
+ // console.log(b.toString())\r
+ let s = new Readable();\r
+\r
+ s.push(result);\r
+ s.push(null);\r
+ formData['bpmn'] = s.read();\r
+ // s.pipe(formData['bpmn']);\r
+ \r
+ }).catch(err => {\r
+ console.log(err);\r
+ });\r
+\r
+\r
+ //get resource zip file\r
+ if (data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].resourceFileId) {\r
+ await this.options.app.services[this.options.app.get('base-path') + 'file-transfer'].get(data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].resourceFileId)\r
+ .then(result => {\r
+ //let b = new Buffer(result);\r
+ let s = new Readable();\r
+\r
+ s.push(result);\r
+ s.push(null);\r
+ \r
+ formData['resources'] = s.read();\r
+ //formData.append('resource', s);\r
+\r
+ }).catch(err => {\r
+ console.log(err);\r
+ });\r
+ }\r
+\r
+ //prepare request\r
+ let options = {\r
+ url: this.options.app.get('serviceApi').url + 'testStrategy/deploy/v1',\r
+ headers: {\r
+ 'Authorization': 'Basic ' + util.base64Encode(this.options.app.get('serviceApi').aafId + ':' + this.options.app.get('serviceApi').aafPassword),\r
+ 'Content-Type': "multipart/form-data"\r
+ },\r
+ rejectUnauthorized: false,\r
+ formData: formData\r
+ }\r
+ let deployed = false;\r
+ let deployedDefinition;\r
+ let response;\r
+ await new Promise((resolve, reject) => {\r
+ request.post(options, (err, res, body) => {\r
+ response = res || err;\r
+ if(err){\r
+ reject(err);\r
+ }\r
+ if(res && res.statusCode == 200){\r
+ deployed = true;\r
+ resolve(body);\r
+ }else{\r
+ reject(res);\r
+ }\r
+ });\r
+ }).then(\r
+ result => {\r
+ if(result){\r
+ deployedDefinition = JSON.parse(result);\r
+ }\r
+ }\r
+ ).catch(\r
+ err => {\r
+ console.log(err.body);\r
+ }\r
+ );\r
+ if (!deployed) {\r
+ pickleRick();\r
+ return new Response(500, {}, { errors: { deployment: 'The bpmn file failed to deploy on the server.' } });\r
+ }\r
+\r
+ // Since test head objects are sent, we only store the test head id. this for loop adds those to the object to save\r
+ // for (let i = 0; i < data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].testHeads.length; i++) {\r
+ // data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].testHeads[i].testHeadId = data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].testHeads[i].testHead._id;\r
+ // }\r
+\r
+ // let td = await this.options.app.services[this.options.app.get('base-path') + 'test-definitions'].create(data.testDefinition, params)\r
+ // .then(result => {\r
+ // return result['data'];\r
+ // })\r
+ // .catch(err => {\r
+ // console.log(err);\r
+ // }\r
+ // Set as deployed\r
+ delete params.query;\r
+\r
+ //check to see if the process definition Key was set\r
+ // if (!data.testDefinition.processDefinitionKey) {\r
+ // data.testDefinition.processDefinitionKey = validated.body.processDefinitionKey;\r
+ // }\r
+ let td = await this.options.app.services[this.options.app.get('base-path') + 'test-definitions'].patch(data.testDefinition._id, {\r
+ $set:{\r
+ ['bpmnInstances.' + data.testDefinition.currentVersion + '.isDeployed']: true,\r
+ ['bpmnInstances.' + data.testDefinition.currentVersion + '.processDefinitionId']: deployedDefinition['processDefinitionId'],\r
+ ['bpmnInstances.' + data.testDefinition.currentVersion + '.deploymentId']: deployedDefinition['deploymentId']\r
+ }\r
+ }, params)\r
+ .then(result => {\r
+ return result;\r
+ })\r
+ .catch(err => {\r
+ logger.error(err);\r
+ });\r
+\r
+ return new Response(200, {}, {\r
+ //bpmnVthTaskIds: validated.body.bpmnVthTaskIds,\r
+ //errors: validated.body.errors,\r
+ testDefinition: td\r
+ });\r
+ }\r
+\r
+ async update(id, data, params) {\r
+ return data;\r
+ }\r
+\r
+ async patch(id, data, params) {\r
+ return data;\r
+ }\r
+\r
+ async remove(id, params) {\r
+ return { id };\r
+ }\r
+}\r
+\r
+module.exports = function (options) {\r
+ return new Service(options);\r
+};\r
+\r
+module.exports.Service = Service;\r