diff --git a/meteos_ui/api/client.py b/meteos_ui/api/client.py index db84519..5a23017 100644 --- a/meteos_ui/api/client.py +++ b/meteos_ui/api/client.py @@ -154,6 +154,17 @@ def model_create(request, **kwargs): return meteosclient(request).models.create(**args) +def model_recreate(request, id, **kwargs): + args = {} + for (key, value) in kwargs.items(): + if key in MODEL_CREATE_ATTRS: + args[str(key)] = str(value) + else: + raise exceptions.BadRequest( + "Key must be in %s" % ",".join(MODEL_CREATE_ATTRS)) + return meteosclient(request).models.recreate(id, **args) + + def model_delete(request, id): return meteosclient(request).models.delete(id) diff --git a/meteos_ui/api/rest_api.py b/meteos_ui/api/rest_api.py index 0dbcdbf..977a4ef 100644 --- a/meteos_ui/api/rest_api.py +++ b/meteos_ui/api/rest_api.py @@ -200,6 +200,11 @@ class ModelActions(generic.View): return client.model_load(request, id) elif action == 'unload': return client.model_unload(request, id) + elif action == 'recreate': + new_model = client.model_recreate(request, id, **request.DATA) + return rest_utils.CreatedResponse( + '/api/meteos/model/%s' % new_model.id, + new_model.to_dict()) @urls.register diff --git a/meteos_ui/static/dashboard/machine_learning/meteos.service.js b/meteos_ui/static/dashboard/machine_learning/meteos.service.js index f955c67..29bb5ae 100644 --- a/meteos_ui/static/dashboard/machine_learning/meteos.service.js +++ b/meteos_ui/static/dashboard/machine_learning/meteos.service.js @@ -42,6 +42,7 @@ deleteDataset: deleteDataset, deleteDatasets: deleteDatasets, createModel: createModel, + recreateModel: recreateModel, getModel: getModel, getModels: getModels, deleteModel: deleteModel, @@ -211,6 +212,13 @@ }); } + function recreateModel(id, params) { + return apiService.post('/api/meteos/models/' + id + '/recreate', params) + .error(function() { + toastService.add('error', gettext('Unable to recreate Model')); + }); + } + function getModel(id) { return apiService.get('/api/meteos/models/' + id) .success(function(data, status, headers, config) { diff --git a/meteos_ui/static/dashboard/machine_learning/models/actions.module.js b/meteos_ui/static/dashboard/machine_learning/models/actions.module.js index 43e6187..30535aa 100644 --- a/meteos_ui/static/dashboard/machine_learning/models/actions.module.js +++ b/meteos_ui/static/dashboard/machine_learning/models/actions.module.js @@ -30,6 +30,7 @@ 'horizon.framework.util.i18n.gettext', 'horizon.dashboard.machine_learning.models.create.service', 'horizon.dashboard.machine_learning.models.delete.service', + 'horizon.dashboard.machine_learning.models.recreate.service', 'horizon.dashboard.machine_learning.models.load.service', 'horizon.dashboard.machine_learning.models.unload.service', 'horizon.dashboard.machine_learning.models.resourceType', @@ -40,6 +41,7 @@ gettext, createModelService, deleteModelService, + recreateModelService, loadModelService, unloadModelService, resourceType) @@ -67,6 +69,13 @@ }); modelsResourceType.itemActions + .append({ + id: 'recreateModelAction', + service: recreateModelService, + template: { + text: gettext('Recreate Model') + } + }) .append({ id: 'loadModelAction', service: loadModelService, diff --git a/meteos_ui/static/dashboard/machine_learning/models/create/info/info.html b/meteos_ui/static/dashboard/machine_learning/models/create/info/info.html index b22f6a5..d2a26c1 100644 --- a/meteos_ui/static/dashboard/machine_learning/models/create/info/info.html +++ b/meteos_ui/static/dashboard/machine_learning/models/create/info/info.html @@ -25,6 +25,7 @@ diff --git a/meteos_ui/static/dashboard/machine_learning/models/create/model-model.js b/meteos_ui/static/dashboard/machine_learning/models/create/model-model.js index 0fbda3e..1642534 100644 --- a/meteos_ui/static/dashboard/machine_learning/models/create/model-model.js +++ b/meteos_ui/static/dashboard/machine_learning/models/create/model-model.js @@ -25,6 +25,7 @@ function modelModel(meteos) { var model = { + id: null, newModelSpec: {}, newCommonDataset: {}, newParamsSpec: {}, @@ -86,6 +87,7 @@ } function createModel() { + var modelId = model.id; var finalSpec = angular.copy(model.newModelSpec); var commonDataset = angular.copy(model.newCommonDataset); var finalParams = angular.copy(model.newParamsSpec); @@ -109,7 +111,12 @@ finalSpec.swift_username = commonDataset.swift_username; finalSpec.swift_password = commonDataset.swift_password; - return meteos.createModel(finalSpec); + if(modelId){ + delete finalSpec['experiment_id']; + return meteos.recreateModel(modelId, finalSpec); + }else{ + return meteos.createModel(finalSpec); + } } diff --git a/meteos_ui/static/dashboard/machine_learning/models/operations/recreate.service.js b/meteos_ui/static/dashboard/machine_learning/models/operations/recreate.service.js new file mode 100644 index 0000000..1fbef07 --- /dev/null +++ b/meteos_ui/static/dashboard/machine_learning/models/operations/recreate.service.js @@ -0,0 +1,115 @@ +/** + * Licensed 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. + */ + +(function() { + 'use strict'; + + /** + * @ngdoc overview + * @name horizon.dashboard.machine_learning.models.create.service + * @description Service for the model create modal + */ + angular + .module('horizon.dashboard.machine_learning.models') + .factory('horizon.dashboard.machine_learning.models.recreate.service', recreateService); + + recreateService.$inject = [ + '$location', + 'horizon.app.core.openstack-service-api.policy', + 'horizon.framework.util.actions.action-result.service', + 'horizon.framework.util.i18n.gettext', + 'horizon.framework.util.q.extensions', + 'horizon.framework.widgets.modal.wizard-modal.service', + 'horizon.framework.widgets.toast.service', + 'horizon.dashboard.machine_learning.models.modelModel', + 'horizon.dashboard.machine_learning.models.events', + 'horizon.dashboard.machine_learning.models.resourceType', + 'horizon.dashboard.machine_learning.models.workflow' + ]; + + function recreateService( + $location, policy, actionResult, gettext, $qExtensions, wizardModalService, toast, model, events, resourceType, createWorkflow + ) { + var scope; + var message = { + success: gettext('Model %s was successfully recreated.') + }; + + var service = { + initAction: initAction, + perform: perform, + allowed: allowed + }; + + return service; + + ////////////// + + function initAction() { + } + + function perform(selected, newScope) { + scope = newScope; + scope.workflow = createWorkflow; + scope.model = model; + scope.model.init(); + scope.model.id = selected.id; + // for creation according to selected item + scope.selected = selected; + + scope.model.newModelSpec.display_name = selected.name; + scope.model.newModelSpec.display_description = selected.description; + scope.model.newModelSpec.experiment_id = selected.experiment_id; + scope.model.newModelSpec.model_type = selected.type; + + var s_url = selected.source_dataset_url.split('://'); + + if (s_url[0] === 'swift'){ + scope.model.newCommonDataset.location = 'swift'; + scope.model.newCommonDataset.container_name = s_url[1].split('/')[0]; + scope.model.newCommonDataset.object_name = s_url[1].split('/')[1]; + }else{ + scope.model.newCommonDataset.location = 'internal'; + scope.model.newCommonDataset.dataset_uuid = s_url[1]; + } + + return wizardModalService.modal({ + scope: scope, + workflow: createWorkflow, + submit: submit + }).result; + } + + function allowed() { + return $qExtensions.booleanAsPromise(true); + //return policy.ifAllowed({ rules: [['model', 'add_model']] }); + } + + function submit(){ + return model.createModel().then(success); + } + + function success(response) { + response.data.id = response.data.id; + toast.add('success', interpolate(message.success, [response.data.id])); + var result = actionResult.getActionResult() + .created(resourceType, response.data.id); + if(result.result.failed.length == 0 && result.result.created.length > 0){ + $location.path('/project/machine_learning/models'); + }else{ + return result.result; + } + } + } +})();