diff --git a/slapos/resiliencytest/suites/slaprunner.py b/slapos/resiliencytest/suites/slaprunner.py index 7714b38a383256073e624df7449733dd8706c45c..f610710f7990a40eb5cc5f94cf3865f73c609f43 100644 --- a/slapos/resiliencytest/suites/slaprunner.py +++ b/slapos/resiliencytest/suites/slaprunner.py @@ -229,10 +229,10 @@ class SlaprunnerTestSuite(ResiliencyTestSuite): def _openSoftwareRelease(self, software_release='erp5testnode/testsuite/dummy'): self.logger.debug('Opening %s software release...' % software_release) data = self._connectToSlaprunner( - resource='setCurrentProject', + resource='supplySoftwareRelease', data='path=workspace/slapos/software/%s/' % software_release ) - assert json.loads(data)['code'] != 0, 'Unexpecting result in call to setCurrentProject: %s' % data + assert json.loads(data)['code'] != 0, 'Unexpecting result in call to supplySoftwareRelease: %s' % data def generateData(self): """ diff --git a/slapos/runner/runnertest.py b/slapos/runner/runnertest.py index 0fddd1dbcd8209a2f6764334344629c4fb926046..b7f18360dc1c387fcdc372e72813e7afb109b9ea 100644 --- a/slapos/runner/runnertest.py +++ b/slapos/runner/runnertest.py @@ -327,7 +327,7 @@ setuptools = 33.1.1 """Scenario 3: Open software release""" self.test_cloneProject() software = os.path.join(self.software, 'helloworld') # Drupal SR must exist in SR folder - response = loadJson(self.app.post('/setCurrentProject', + response = loadJson(self.app.post('/supplySoftwareRelease', data=dict(path=software), follow_redirects=True)) self.assertEqual(response['result'], "") @@ -378,7 +378,7 @@ setuptools = 33.1.1 self.setupTestSoftware() #Set current projet and run Slapgrid-cp software = self.software + 'slaprunner-test/' - response = loadJson(self.app.post('/setCurrentProject', + response = loadJson(self.app.post('/supplySoftwareRelease', data=dict(path=software), follow_redirects=True)) self.assertEqual(response['result'], "") @@ -567,7 +567,7 @@ setuptools = 33.1.1 ), follow_redirects=True)).get(u'code') self.assertEqual(response, 1) - response = loadJson(self.app.post('/setCurrentProject', + response = loadJson(self.app.post('/supplySoftwareRelease', data=dict(path=software), follow_redirects=True)).get(u'code') self.assertEqual(response, 1) diff --git a/slapos/runner/static/js/scripts/inspectInstance.js b/slapos/runner/static/js/scripts/inspectInstance.js index 363687f312302ac4de57157454d4a168fc2d6746..a650075fb5a73fae66720e1d86fbabf6d57d2d22 100644 --- a/slapos/runner/static/js/scripts/inspectInstance.js +++ b/slapos/runner/static/js/scripts/inspectInstance.js @@ -81,6 +81,7 @@ $(document).ready(function () { var xml = '\n', software_type = '', software_type_input_value = $('input#software_type').val(), + software_release = $('#software_release').val(), size = $('#partitionParameter > tbody > tr').length, i; @@ -102,7 +103,11 @@ $(document).ready(function () { $.ajax({ type: 'POST', url: $SCRIPT_ROOT + '/saveParameterXml', - data: {software_type: software_type, parameter: xml}, + data: { + software_type: software_type, + software_release: software_release, + parameter: xml + }, success: function (data) { if (data.code === 1) { $('#error').Popup('Instance parameters has been updated, please run your instance now!', {type: 'confirm', duration: 5000}); diff --git a/slapos/runner/static/js/scripts/inspectSoftware.js b/slapos/runner/static/js/scripts/inspectSoftware.js deleted file mode 100644 index e1429338e91091cdfaee9453c2dc51c084e0658d..0000000000000000000000000000000000000000 --- a/slapos/runner/static/js/scripts/inspectSoftware.js +++ /dev/null @@ -1,99 +0,0 @@ -/*jslint undef: true */ -/*global $, document, window, $SCRIPT_ROOT, ace */ -/* vim: set et sts=4: */ - - -$(document).ready(function () { - "use strict"; - - var editor, - send = false, - runnerDir = $("input#runnerdir").val(); - - function fillContent() { - $('#fileNavigator').gsFileManager({script: $SCRIPT_ROOT + "/fileBrowser", root: runnerDir}); - } - - $("#reloadfiles").click(function () { - fillContent(); - }); - fillContent(); - - $("#open").click(function () { - var elt = $("option:selected", $("#softwarelist")); - if (elt.val() === "No Software Release found") { - $("#error").Popup("Please select your Software Release", {type: 'alert', duration: 5000}); - return false; - } - $.ajax({ - type: "POST", - url: $SCRIPT_ROOT + '/setCurrentProject', - data: "path=" + elt.attr('rel'), - success: function (data) { - if (data.code === 1) { - window.location.href = $SCRIPT_ROOT + '/editSoftwareProfile'; - } else { - $("#error").Popup(data.result, {type: 'error', duration: 5000}); - } - } - }); - return false; - }); - - $("#delete").click(function () { - if ($("#softwarelist").val() === "No Software Release found") { - $("#error").Popup("Please select your Software Release", {type: 'alert', duration: 5000}); - return false; - } - if (send) { - return; - } - if (!window.confirm("Do you really want to delete this software release?")) { - return; - } - send = false; - var elt = $("option:selected", $("#softwarelist")); - $.ajax({ - type: "POST", - url: $SCRIPT_ROOT + '/removeSoftwareDir', - data: { - md5: $("#softwarelist").val(), - title: elt.attr('title') - }, - success: function (data) { - var i; - if (data.code === 1) { - $("#softwarelist").empty(); - for (i = 0; i < data.result.length; i += 1) { - $("#softwarelist").append(''); - } - if (data.result.length < 1) { - $("#softwarelist").append(''); - $('#fileTree').empty(); - } - fillContent(); - $("#error").Popup("Operation complete, Selected Software Release has been delete!", - {type: 'confirm', duration: 5000}); - } else { - $("#error").Popup(data.result, {type: 'error'}); - } - send = false; - } - }); - return false; - }); - - function setupEditor() { - editor = ace.edit("editor"); - editor.setTheme("ace/theme/crimson_editor"); - - var CurentMode = require("ace/mode/text").Mode; - editor.getSession().setMode(new CurentMode()); - editor.getSession().setTabSize(2); - editor.getSession().setUseSoftTabs(true); - editor.renderer.setHScrollBarAlwaysVisible(false); - editor.setReadOnly(true); - } -}); diff --git a/slapos/runner/static/js/scripts/process.js b/slapos/runner/static/js/scripts/process.js index 0c5c60a5e11f64ffd2789586c492dbfa6adedb45..85c34d499892773f6cd6651a0e918439e54a584f 100644 --- a/slapos/runner/static/js/scripts/process.js +++ b/slapos/runner/static/js/scripts/process.js @@ -100,7 +100,7 @@ function getRunningState() { position: logReadingPosition, log: (openedlogpage !== "") ? currentProcess : "" }, - jqxhr = $.post(url, param, function (data) { + jqxhr = $.get(url, param, function (data) { running = data.result; if (data.instance.state) { currentProcess = processTypes.instance; diff --git a/slapos/runner/static/js/scripts/project.js b/slapos/runner/static/js/scripts/project.js index 72c35b63f6f461c5e8bbcdf1432a33f003916b57..c5fed34d04591faaa96c4e3fb309d7ac3b3bf078 100644 --- a/slapos/runner/static/js/scripts/project.js +++ b/slapos/runner/static/js/scripts/project.js @@ -106,7 +106,7 @@ $(document).ready(function () { } $.ajax({ type: "POST", - url: $SCRIPT_ROOT + '/setCurrentProject', + url: $SCRIPT_ROOT + '/supplySoftwareRelease', data: "path=" + $("input#path").val(), success: function (data) { if (data.code === 1) { diff --git a/slapos/runner/templates/instanceInspect.html b/slapos/runner/templates/instanceInspect.html index 5152dcbe63199b47fa4b79ccb0bf7b796a4ad48c..cda768f692767d89882acf7ba1b4d5e97f6fa738 100644 --- a/slapos/runner/templates/instanceInspect.html +++ b/slapos/runner/templates/instanceInspect.html @@ -19,7 +19,7 @@
  • Connection Information
  • Parameters
  • Partitions Content
  • -
  • Monitoring
  • +
  • Software Releases
  • @@ -94,6 +94,16 @@ {%endif%}
    +
    +

    Software Release of main instance

    + +
    +

    Software Type of main instance

    @@ -133,14 +143,30 @@ {%endif%}
    -

    Monitoring interface

    -
    -

    By clicking on the next link, you can access to the monitoring interface of the instance running inside the webrunner.

    -
    -

    Notice that you have to extend the stack monitor in your software release (as explained here) for this weblink to work. -

    -

    {{ g.instance_monitoring_url }}

    +

    List of unused Software Releases

    +

    +

    Request here the deletion of Software Releases.

    +

    A Software Release won't be deleted from disk until Build&Run is executed. If you requested a Software Release removal by mistake, and Build&Run didn't run yet, it is still possible to request it again.

    +
    + + + + + {% for software_release_uri in software_release_uri_list %} + + + + + {% endfor %} +
    Software Release URIAsk Deletion
    + {{ software_release_uri }} + +
    + + +
    +
    diff --git a/slapos/runner/templates/layout.html b/slapos/runner/templates/layout.html index ac45239c93e2bd58f128c2b7b9cd60037ca0051f..e741441d87e2c106ead245f0309befae863bca8c 100644 --- a/slapos/runner/templates/layout.html +++ b/slapos/runner/templates/layout.html @@ -98,7 +98,6 @@
  • Redeploy Services
  • Browse Workspace
  • -
  • My Software Releases
  • diff --git a/slapos/runner/templates/projectFolder.html b/slapos/runner/templates/projectFolder.html index 9dd408c367c223d4c7a141323d77a46c74b01c52..bbde0a62dababd6cc0bb81e25baa9a9c52663749 100644 --- a/slapos/runner/templates/projectFolder.html +++ b/slapos/runner/templates/projectFolder.html @@ -33,7 +33,6 @@
    -

    WARNING: Opening a new software release WILL ERASE YOUR EXISTING INSTANCE. Proceed with caution!

    diff --git a/slapos/runner/templates/runResult.html b/slapos/runner/templates/runResult.html deleted file mode 100644 index b64146cbf4539605a95b865b9c1123fae6075dca..0000000000000000000000000000000000000000 --- a/slapos/runner/templates/runResult.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends "layout.html" %} -{% block title %}Webrunner software Inspection{% endblock %} -{% block head %} - {{ super() }} - - - - - - -{% endblock %} -{% block body %} - - - -   -   -

    -
    -
    -Reload Files -
    -{% endblock %} diff --git a/slapos/runner/utils.py b/slapos/runner/utils.py index e761fd88c2dd1e4cdf2ca637c1a9c22abd165c13..8762d6cb89885d754dec463e6048f8cc9f8d5a58 100644 --- a/slapos/runner/utils.py +++ b/slapos/runner/utils.py @@ -28,6 +28,7 @@ from slapos.runner.process import Popen from passlib.apache import HtpasswdFile import slapos.slap from slapos.grid.utils import md5digest +from slapos.slap.exception import NotFoundError from slapos.util import str2bytes logger = logging.getLogger('slaprunner') @@ -121,6 +122,20 @@ def createNewUser(config, name, passwd): return False return True +def _getSoftwareReleaseList(config): + slap = slapos.slap.slap() + slap.initializeConnection(config['master_url']) + return slap.registerComputer(config['computer_id']).getSoftwareReleaseList() + +def getAvailableSoftwareReleaseURIList(config): + return [ + x.getURI() for x in _getSoftwareReleaseList(config) + if x._requested_state == "available" + ] + +def getAllSoftwareReleaseURIList(config): + return [x.getURI() for x in _getSoftwareReleaseList(config)] + def getCurrentSoftwareReleaseProfile(config): """ Returns used Software Release profile as a string. @@ -134,6 +149,21 @@ def getCurrentSoftwareReleaseProfile(config): except IOError: return '' +def getCurrentUsedSoftwareReleaseProfile(config): + """ + Returns used Software Release profile as a string. + """ + slap = slapos.slap.slap() + slap.initializeConnection(config['master_url']) + # Try to return the SR related to the current instance + try: + computer_partition = slap.registerComputerPartition(config['computer_id'], 'slappart0') + software_release = computer_partition.getSoftwareRelease() + return software_release.getURI() + # If there are no instances, return the last requested Software Release + except NotFoundError: + return '' + def requestInstance(config, software_type=None): """ @@ -162,7 +192,7 @@ def requestInstance(config, software_type=None): return slap.registerOpenOrder().request( profile, - partition_reference=getSoftwareReleaseName(config), + partition_reference='slaprunner', # we want only one instance in webrunner partition_parameter_kw=partition_parameter_kw, software_type=software_type, filter_kw=None, @@ -170,6 +200,57 @@ def requestInstance(config, software_type=None): shared=False) +def supplySoftwareRelease(config, sr_path): + """ + Act like "slapos node supply" by registering a new SR to current slapproxy + """ + folder = realpath(config, sr_path) + if not folder: + return + + sup_process.stopProcess(config, 'slapgrid-cp') + sup_process.stopProcess(config, 'slapgrid-sr') + + updateProxy(config) + slap = slapos.slap.slap() + slap.initializeConnection(config['master_url']) + + software_release_path = os.path.join(realpath(config, sr_path), config['software_profile']) + logger.info('Supplying new Software Release : %s' % software_release_path) + + slap.registerSupply().supply( + software_release_path, + computer_guid=config['computer_id'], + ) + # Don't replace .project if there is a running instance + if not getCurrentUsedSoftwareReleaseProfile(config): + setCurrentSoftwareRelease(config, sr_path) + +def destroySoftwareRelease(config, uri): + available_sr_list = getAllSoftwareReleaseURIList(config) + for available_sr in available_sr_list: + if os.path.realpath(available_sr) == os.path.realpath(uri): + real_uri = available_sr + break + else: + return False + slap = slapos.slap.slap() + slap.initializeConnection(config['master_url']) + try: + software_release, = [ + x for x in slap.registerComputer(config['computer_id']).getSoftwareReleaseList() + if x.getURI() == real_uri + ] + except ValueError: + return False + slap.registerSupply().supply( + real_uri, + computer_guid=config['computer_id'], + state='destroyed', + ) + return True + + def updateProxy(config): """ Configure Slapos Node computer and partitions. @@ -179,10 +260,8 @@ def updateProxy(config): if not os.path.exists(config['instance_root']): os.mkdir(config['instance_root']) slap = slapos.slap.slap() - profile = getCurrentSoftwareReleaseProfile(config) slap.initializeConnection(config['master_url']) - slap.registerSupply().supply(profile, computer_guid=config['computer_id']) computer = slap.registerComputer(config['computer_id']) prefix = 'slappart' slap_config = { @@ -225,7 +304,6 @@ def updateInstanceParameter(config, software_type=None): config: Slaprunner configuration. software_type: reconfigure Software Instance with software type. """ - time.sleep(1) if not (updateProxy(config) and requestInstance(config, software_type)): return False @@ -246,13 +324,6 @@ def stopProxy(config): return sup_process.stopProcess(config, "slapproxy") -def removeProxyDb(config): - """Remove Slapproxy database, this is used to initialize proxy for example when - configuring new Software Release""" - if os.path.exists(config['database_uri']): - os.unlink(config['database_uri']) - - def isSoftwareRunning(config): """ Return True if slapos is still running and false if slapos if not @@ -260,29 +331,22 @@ def isSoftwareRunning(config): return sup_process.isRunning(config, 'slapgrid-sr') -def slapgridResultToFile(config, step, returncode, datetime): - filename = step + "_info.json" - file = os.path.join(config['runner_workdir'], filename) - result = {'last_build':datetime, 'success':returncode} - with open(file, "w") as f: - json.dump(result, f) - - def getSlapgridResult(config, step): filename = step + "_info.json" file = os.path.join(config['runner_workdir'], filename) + result = {'last_build': 0, 'success':-1} if os.path.exists(file): - result = json.loads(open(file, "r").read()) - else: - result = {'last_build': 0, 'success':-1} + try: + with open(file, "r") as f: + result = json.loads(f.read()) + except ValueError: + # It seems this call can fail with + # ValueError("No JSON object could be decoded") + # Probably the file is being written at the same time ? + pass return result -def waitProcess(config, process, step): - process.wait() - date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - slapgridResultToFile(config, step, process.returncode, date) - def runSlapgridWithLock(config, step, process_name, lock=False): """ * process_name is the name of the process given to supervisord, which will @@ -304,7 +368,7 @@ def runSlapgridWithLock(config, step, process_name, lock=False): os.remove(log_file) if not updateProxy(config): return 1 - if step == 'instance' and not requestInstance(config): + if step == 'instance' and not getCurrentUsedSoftwareReleaseProfile(config): return 1 try: sup_process.runProcess(config, process_name) @@ -477,11 +541,6 @@ def removeCurrentInstance(config): # Stop all processes svcStopAll(config) - if stopProxy(config): - removeProxyDb(config) - startProxy(config) - else: - return "Something went wrong when trying to stop slapproxy." # Remove Instance directory and data related to the instance try: @@ -557,26 +616,11 @@ def listFolder(config, path): return folderList -def configNewSR(config, projectpath): - """Configure a Software Release as current Software Release - - Args: - config: slaprunner configuration - projectpath: path of the directory that contains the software realease to configure - Returns: - True if all is done well, otherwise return false. - """ - folder = realpath(config, projectpath) - if folder: - sup_process.stopProcess(config, 'slapgrid-cp') - sup_process.stopProcess(config, 'slapgrid-sr') - logger.warning("User opened a new SR. Removing all instances...") - removeCurrentInstance(config) - with open(os.path.join(config['etc_dir'], ".project"), 'w') as f: - f.write(projectpath) - return True - else: - return False +def setCurrentSoftwareRelease(config, relative_project_path): + if relative_project_path.endswith(config['software_profile']): + relative_project_path = relative_project_path[:-len(config['software_profile'])] + with open(os.path.join(config['etc_dir'], ".project"), 'w') as f: + f.write(relative_project_path) def newSoftware(folder, config, session): @@ -608,11 +652,7 @@ def newSoftware(folder, config, session): pass with open(os.path.join(basedir, ".project"), 'w') as f: f.write(folder + "/") - #Clean sapproxy Database - stopProxy(config) - removeProxyDb(config) - startProxy(config) - #Stop runngin process and remove existing instance + #Stop running process and remove existing instance logger.warning("User created a new SR. Removing all instances...") removeCurrentInstance(config) session['title'] = getProjectTitle(config) @@ -825,6 +865,21 @@ def realpath(config, path, check_exist=True): return path +def relativepath(config, path): + # Sorted by less generic to more generic + path = os.path.realpath(path) + virtual_path_list = ( + 'software_root', + 'instance_root', + 'workspace', + 'software_link', + 'runner_workdir', + ) + for virtual_path in virtual_path_list: + if os.path.realpath(path).startswith(os.path.realpath(config[virtual_path])): + return path.replace(os.path.realpath(config[virtual_path]), virtual_path) + return '' + def readParameters(path): """Read Instance parameters stored into a local file. @@ -849,15 +904,18 @@ def readParameters(path): else: return "No such file or directory: %s" % path -def isSoftwareReleaseCompleted(config): - software_name = getSoftwareReleaseName(config) - if software_name is None: - return False - elif os.path.exists(os.path.join(config['software_link'], - software_name, '.completed')): - return True - else: - return False +def isSoftwareReleaseCompleted(config, software_release_uri): + software_release_path = os.path.join( + config['software_root'], + md5digest(software_release_uri) + ) + return os.path.exists(os.path.join(software_release_path, '.completed')) + +def areAllSoftwareReleaseCompleted(config): + result_list = [] + for software_release_uri in getAvailableSoftwareReleaseURIList(config): + result_list.append(isSoftwareReleaseCompleted(config, software_release_uri)) + return all(result_list) def isSoftwareReleaseReady(config): """Return 1 if the Software Release has @@ -869,7 +927,7 @@ def isSoftwareReleaseReady(config): if not ( os.path.exists(project) and (auto_run or auto_deploy) ): return "0" updateInstanceParameter(config) - if isSoftwareReleaseCompleted(config): + if areAllSoftwareReleaseCompleted(config): if auto_run: runSlapgridUntilSuccess(config, 'instance') return "1" @@ -952,17 +1010,6 @@ def runSlapgridUntilSuccess(config, step, bang=False): return max_tries -def setupDefaultSR(config): - """If a default_sr is in the parameters, - and no SR is deployed yet, setup it - also run SR and Instance if required""" - project = os.path.join(config['etc_dir'], '.project') - if not os.path.exists(project) and config['default_sr'] != '': - configNewSR(config, config['default_sr']) - if config['auto_deploy']: - _thread.start_new_thread(buildAndRun, (config,)) - - def setMiniShellHistory(config, command): history_max_size = 10 command = command + "\n" diff --git a/slapos/runner/views.py b/slapos/runner/views.py index 4506b52c37fc4c6409b5815b3a5030c1253e52d8..c8d566d3c3073489aae6306382bd4506f15d4b05 100644 --- a/slapos/runner/views.py +++ b/slapos/runner/views.py @@ -16,7 +16,8 @@ from flask import (Flask, request, redirect, url_for, render_template, import slapos from slapos.util import bytes2str -from slapos.runner.utils import (checkSoftwareFolder, configNewSR, checkUserCredential, +import utils +from slapos.runner.utils import (checkSoftwareFolder, checkUserCredential, createNewUser, getBuildAndRunParams, getProfilePath, getSlapgridResult, html_escape, @@ -28,7 +29,7 @@ from slapos.runner.utils import (checkSoftwareFolder, configNewSR, checkUserCred loadSoftwareRList, md5sum, newSoftware, readFileFrom, readParameters, realpath, removeCurrentInstance, - removeSoftwareByName, runSlapgridUntilSuccess, + runSlapgridUntilSuccess, saveBuildAndRunParams, setMiniShellHistory, stopProxy, @@ -142,24 +143,6 @@ def editSoftwareProfile(): profile=profile, projectList=listFolder(app.config, 'workspace')) -def inspectSoftware(): - return render_template('runResult.html', softwareRoot='software_link/', - softwares=loadSoftwareRList(app.config)) - - -#remove content of compiled software release -def removeSoftware(): - if isSoftwareRunning(app.config) or isInstanceRunning(app.config): - flash('Software installation or instantiation in progress, cannot remove') - elif os.path.exists(app.config['software_root']): - svcStopAll(app.config) - shutil.rmtree(app.config['software_root']) - for link in os.listdir(app.config['software_link']): - os.remove(os.path.join(app.config['software_link'], link)) - flash('Software removed') - return redirect(url_for('inspectSoftware')) - - def runSoftwareProfile(): _thread.start_new_thread(runSlapgridUntilSuccess, (app.config, "software", True)) @@ -183,6 +166,21 @@ def inspectInstance(): else: file_path = '' supervisor = [] + current_sr = utils.relativepath(app.config, utils.getCurrentSoftwareReleaseProfile(app.config)) + available_sr_uri_list = utils.getAvailableSoftwareReleaseURIList(app.config) + available_sr_list = [ + utils.relativepath(app.config, x) + for x in available_sr_uri_list + ] + built_available_sr_list = [ + utils.relativepath(app.config, x) + for x in available_sr_uri_list + if utils.isSoftwareReleaseCompleted(app.config, x) + ] + if current_sr in available_sr_list: + available_sr_list.remove(current_sr) + if current_sr in built_available_sr_list: + built_available_sr_list.remove(current_sr) if "application/json" in request.accept_mimetypes.best: result_list = [] for service in supervisor: @@ -191,11 +189,16 @@ def inspectInstance(): 'status': service[1], }) return jsonify(result_list) - return render_template('instanceInspect.html', - file_path=file_path, - supervisor=supervisor, - slap_status=getSlapStatus(app.config), - partition_amount=app.config['partition_amount']) + return render_template( + 'instanceInspect.html', + file_path=file_path, + supervisor=supervisor, + slap_status=getSlapStatus(app.config), + partition_amount=app.config['partition_amount'], + current_software_release_uri=current_sr, + built_available_sr_list=built_available_sr_list, + software_release_uri_list=available_sr_list + ) def getConnectionParameter(partition_reference): """ @@ -313,12 +316,17 @@ def checkFolder(): return checkSoftwareFolder(request.form['path'], app.config) -def setCurrentProject(): - if configNewSR(app.config, request.form['path']): - session['title'] = getProjectTitle(app.config) - return jsonify(code=1, result="") - else: - return jsonify(code=0, result=("Can not setup this Software Release")) +def supplySoftwareRelease(): + if request.form.get('path'): + sr_absolute_path = realpath(app.config, request.form['path']) + sr_absolute_path = sr_absolute_path and os.path.join(sr_absolute_path, 'software.cfg') # XXX: find where this one was added before + if os.path.exists(sr_absolute_path): + utils.supplySoftwareRelease(app.config, request.form['path']) + # request instance if no instance has been requested yet + if not utils.getCurrentUsedSoftwareReleaseProfile(app.config): + utils.requestInstance(app.config) + return jsonify(code=1, result="") + return jsonify(code=0, result=("Can not setup this Software Release")) def getProjectStatus(): @@ -376,12 +384,6 @@ def removeFile(): return jsonify(code=0, result=str(e)) -def removeSoftwareDir(): - status, message = removeSoftwareByName(app.config, request.form['md5'], - request.form['title']) - return jsonify(code=status, result=message) - - #read file and return content to ajax def getFileContent(): file_path = realpath(app.config, request.form['file']) @@ -505,11 +507,11 @@ def slapgridResult(): 'position': 0, 'truncated': False } - if request.form['log'] in ['software', 'instance']: - log_file = request.form['log'] + "_log" + if request.args.get('log') in ['software', 'instance']: + log_file = request.args['log'] + "_log" if os.path.exists(app.config[log_file]): with open(app.config[log_file], 'rb') as f: - log_result = bytes2str(readFileFrom(f, int(request.form['position']))) + log_result = bytes2str(readFileFrom(f, int(request.args['position']))) build_result = getSlapgridResult(app.config, 'software') run_result = getSlapgridResult(app.config, 'instance') software_info = {'state':software_state, @@ -552,8 +554,11 @@ def saveParameterXml(): Update instance parameter into a local xml file. """ project = os.path.join(app.config['etc_dir'], ".project") - if not os.path.exists(project): + current_software_release = utils.getCurrentSoftwareReleaseProfile(app.config) + if not current_software_release: return jsonify(code=0, result="Please first open a Software Release") + software_release = request.form['software_release'] + utils.setCurrentSoftwareRelease(app.config, software_release) content = request.form['parameter'].encode("utf-8") param_path = os.path.join(app.config['etc_dir'], ".parameter.xml") try: @@ -803,13 +808,20 @@ def getMiniShellHistory(): return json.dumps(history) +def destroySoftwareRelease(): + software_release_uri = request.form['uri'] + if utils.destroySoftwareRelease(app.config, realpath(app.config, software_release_uri)): + flash('Software Release deleted.') + else: + flash('Error: Software Release not found') + return redirect(url_for('inspectInstance')) + + #Setup List of URLs app.add_url_rule('/', 'home', home) app.add_url_rule('/browseWorkspace', 'browseWorkspace', browseWorkspace) app.add_url_rule('/editSoftwareProfile', 'editSoftwareProfile', editSoftwareProfile) -app.add_url_rule('/inspectSoftware', 'inspectSoftware', inspectSoftware) -app.add_url_rule('/removeSoftware', 'removeSoftware', removeSoftware) app.add_url_rule('/runSoftwareProfile', 'runSoftwareProfile', runSoftwareProfile, methods=['GET', 'POST']) app.add_url_rule('/editInstanceProfile', 'editInstanceProfile', @@ -839,7 +851,7 @@ app.add_url_rule('/getSoftwareType', 'getSoftwareType', getSoftwareType, methods=['GET']) app.add_url_rule("/stopSlapgrid", 'stopSlapgrid', stopSlapgrid, methods=['POST']) app.add_url_rule("/slapgridResult", 'slapgridResult', - slapgridResult, methods=['POST']) + slapgridResult, methods=['GET']) app.add_url_rule("/getmd5sum", 'getmd5sum', getmd5sum, methods=['POST']) app.add_url_rule("/checkFileType", 'checkFileType', checkFileType, methods=['POST']) @@ -855,8 +867,6 @@ app.add_url_rule("/newBranch", 'newBranch', newBranch, methods=['POST']) app.add_url_rule("/changeBranch", 'changeBranch', changeBranch, methods=['POST']) app.add_url_rule("/saveFileContent", 'saveFileContent', saveFileContent, methods=['POST']) -app.add_url_rule("/removeSoftwareDir", 'removeSoftwareDir', removeSoftwareDir, - methods=['POST']) app.add_url_rule("/getFileContent", 'getFileContent', getFileContent, methods=['POST']) app.add_url_rule("/removeFile", 'removeFile', removeFile, methods=['POST']) @@ -866,7 +876,7 @@ app.add_url_rule("/getProjectStatus", 'getProjectStatus', getProjectStatus, methods=['POST']) app.add_url_rule('/openProject/', 'openProject', openProject, methods=['GET']) -app.add_url_rule("/setCurrentProject", 'setCurrentProject', setCurrentProject, +app.add_url_rule("/supplySoftwareRelease", 'supplySoftwareRelease', supplySoftwareRelease, methods=['POST']) app.add_url_rule("/checkFolder", 'checkFolder', checkFolder, methods=['POST']) app.add_url_rule('/createSoftware', 'createSoftware', createSoftware, @@ -892,3 +902,4 @@ app.add_url_rule('/addUser', 'addUser', addUser, methods=['POST']) app.add_url_rule('/getSlapgridParameters', 'getSlapgridParameters', getSlapgridParameters, methods=['GET']) app.add_url_rule('/runCommand', 'runCommand', runCommand, methods=['POST']) app.add_url_rule("/getMiniShellHistory", 'getMiniShellHistory', getMiniShellHistory, methods=['GET']) +app.add_url_rule("/destroySoftwareRelease", "destroySoftwareRelease", destroySoftwareRelease, methods=['POST'])