diff --git a/alien4cloud-core/src/main/java/alien4cloud/cloud/CloudResourceMatcherService.java b/alien4cloud-core/src/main/java/alien4cloud/cloud/CloudResourceMatcherService.java index cc26babd..7a7cd0f8 100644 --- a/alien4cloud-core/src/main/java/alien4cloud/cloud/CloudResourceMatcherService.java +++ b/alien4cloud-core/src/main/java/alien4cloud/cloud/CloudResourceMatcherService.java @@ -62,7 +62,7 @@ public CloudResourceTopologyMatchResult matchTopology(Topology topology, Cloud c Map flavorMap = Maps.newHashMap(); for (Map.Entry templateEntry : matchableNodes.entrySet()) { List computeTemplates = Lists.newArrayList(); - List images = getAvailableImagesForCompute(cloud, templateEntry.getValue()); + List images = getAvailableImagesForCompute(cloud, templateEntry.getValue(), types.get(templateEntry.getKey())); for (CloudImage image : images) { List flavors = getAvailableFlavorForCompute(cloud, templateEntry.getValue(), image); boolean templateAdded = false; @@ -99,7 +99,7 @@ private Map getMatchableTemplates(Topology topology, Map nodeTemplateEntry : allNodeTemplates.entrySet()) { - if (toscaService.isCompute(nodeTemplateEntry.getValue().getType(), types.get(nodeTemplateEntry.getKey()))) { + if (toscaService.isOfType(NormativeComputeConstants.COMPUTE_TYPE, types.get(nodeTemplateEntry.getKey()))) { // TODO check also network and other cloud related resources ... matchableNodeTemplates.put(nodeTemplateEntry.getKey(), nodeTemplateEntry.getValue()); } @@ -114,8 +114,8 @@ private Map getMatchableTemplates(Topology topology, Map getAvailableImagesForCompute(Cloud cloud, NodeTemplate nodeTemplate) { - if (!NormativeComputeConstants.COMPUTE_TYPE.equals(nodeTemplate.getType())) { + private List getAvailableImagesForCompute(Cloud cloud, NodeTemplate nodeTemplate, IndexedNodeType nodeType) { + if (!toscaService.isOfType(NormativeComputeConstants.COMPUTE_TYPE, nodeType)) { throw new InvalidArgumentException("Node is not a compute but of type [" + nodeTemplate.getType() + "]"); } Map computeTemplateProperties = nodeTemplate.getProperties(); @@ -166,9 +166,6 @@ public int compare(CloudImage left, CloudImage right) { * @return the available flavors for the compute and the image on the given cloud */ private List getAvailableFlavorForCompute(Cloud cloud, NodeTemplate nodeTemplate, CloudImage cloudImage) { - if (!NormativeComputeConstants.COMPUTE_TYPE.equals(nodeTemplate.getType())) { - throw new InvalidArgumentException("Node is not a compute but of type [" + nodeTemplate.getType() + "]"); - } Map allFlavors = Maps.newHashMap(); for (CloudImageFlavor flavor : cloud.getFlavors()) { allFlavors.put(flavor.getId(), flavor); diff --git a/alien4cloud-core/src/main/java/alien4cloud/tosca/ToscaService.java b/alien4cloud-core/src/main/java/alien4cloud/tosca/ToscaService.java index e638e529..98a95376 100644 --- a/alien4cloud-core/src/main/java/alien4cloud/tosca/ToscaService.java +++ b/alien4cloud-core/src/main/java/alien4cloud/tosca/ToscaService.java @@ -2,17 +2,12 @@ import org.springframework.stereotype.Component; -import alien4cloud.component.model.IndexedNodeType; -import alien4cloud.tosca.container.model.NormativeComputeConstants; +import alien4cloud.component.model.IndexedInheritableToscaElement; @Component public class ToscaService { - public boolean isCompute(String nodeTypeName, IndexedNodeType nodeType) { - if (NormativeComputeConstants.COMPUTE_TYPE.equals(nodeTypeName)) { - return true; - } else { - return nodeType.getDerivedFrom() != null && nodeType.getDerivedFrom().contains(NormativeComputeConstants.COMPUTE_TYPE); - } + public boolean isOfType(String type, IndexedInheritableToscaElement toscaElement) { + return type.equals(toscaElement.getElementId()) || (toscaElement.getDerivedFrom() != null && toscaElement.getDerivedFrom().contains(type)); } } diff --git a/alien4cloud-rest-api/src/main/java/alien4cloud/rest/topology/TopologyController.java b/alien4cloud-rest-api/src/main/java/alien4cloud/rest/topology/TopologyController.java index b0e722eb..be7636e9 100644 --- a/alien4cloud-rest-api/src/main/java/alien4cloud/rest/topology/TopologyController.java +++ b/alien4cloud-rest-api/src/main/java/alien4cloud/rest/topology/TopologyController.java @@ -39,6 +39,7 @@ import alien4cloud.rest.model.RestResponseBuilder; import alien4cloud.security.ApplicationRole; import alien4cloud.topology.TopologyServiceCore; +import alien4cloud.tosca.ToscaService; import alien4cloud.tosca.container.model.template.DeploymentArtifact; import alien4cloud.tosca.container.model.topology.NodeTemplate; import alien4cloud.tosca.container.model.topology.RelationshipTemplate; @@ -84,6 +85,9 @@ public class TopologyController { @Resource private IFileRepository artifactRepository; + @Resource + private ToscaService toscaService; + /** * Retrieve an existing {@link Topology} * @@ -415,10 +419,17 @@ public RestResponse deleteNodeTemplate(@PathVariable String topolog removeInputs(nodeTemplateName, topology); removeOutputs(nodeTemplateName, topology); + removeScalingPolicy(nodeTemplateName, topology); alienDAO.save(topology); return RestResponseBuilder. builder().data(topologyService.buildTopologyDTO(topology)).build(); } + private void removeScalingPolicy(String nodeTemplateName, Topology topology) { + if (topology.getScalingPolicies() != null) { + topology.getScalingPolicies().remove(nodeTemplateName); + } + } + /** * Remove a nodeTemplate inputs in a topology */ diff --git a/alien4cloud-security/.gitignore b/alien4cloud-security/.gitignore new file mode 100644 index 00000000..ea8c4bf7 --- /dev/null +++ b/alien4cloud-security/.gitignore @@ -0,0 +1 @@ +/target diff --git a/alien4cloud-ui/yo/Gruntfile.js b/alien4cloud-ui/yo/Gruntfile.js index ff03c598..9cd3018e 100644 --- a/alien4cloud-ui/yo/Gruntfile.js +++ b/alien4cloud-ui/yo/Gruntfile.js @@ -138,12 +138,10 @@ module.exports = function(grunt) { // Empties folders to start fresh clean: { dist: { - files: [ - { - dot: true, - src: ['.tmp', '<%= yeoman.dist %>/*', '!<%= yeoman.dist %>/.git*'] - } - ] + files: [{ + dot: true, + src: ['.tmp', '<%= yeoman.dist %>/*', '!<%= yeoman.dist %>/.git*'] + }] }, server: '.tmp' }, @@ -154,14 +152,12 @@ module.exports = function(grunt) { browsers: ['last 1 version'] }, dist: { - files: [ - { - expand: true, - cwd: '.tmp/styles/', - src: '{,*/}*.css', - dest: '.tmp/styles/' - } - ] + files: [{ + expand: true, + cwd: '.tmp/styles/', + src: '{,*/}*.css', + dest: '.tmp/styles/' + }] } }, @@ -236,26 +232,22 @@ module.exports = function(grunt) { // The following *-min tasks produce minified files in the dist folder imagemin: { dist: { - files: [ - { - expand: true, - cwd: '<%= yeoman.app %>/images', - src: '{,*/}*.{png,jpg,jpeg,gif}', - dest: '<%= yeoman.dist %>/images' - } - ] + files: [{ + expand: true, + cwd: '<%= yeoman.app %>/images', + src: '{,*/}*.{png,jpg,jpeg,gif}', + dest: '<%= yeoman.dist %>/images' + }] } }, svgmin: { dist: { - files: [ - { - expand: true, - cwd: '<%= yeoman.app %>/images', - src: '{,*/}*.svg', - dest: '<%= yeoman.dist %>/images' - } - ] + files: [{ + expand: true, + cwd: '<%= yeoman.app %>/images', + src: '{,*/}*.svg', + dest: '<%= yeoman.dist %>/images' + }] } }, htmlmin: { @@ -266,15 +258,13 @@ module.exports = function(grunt) { removeCommentsFromCDATA: true, removeOptionalTags: true }, - files: [ - { - expand: true, - cwd: '<%= yeoman.dist %>', - // src: ['*.html', 'views/{,*/}*.html'], - src: ['*.html', 'views/**/*.html'], - dest: '<%= yeoman.dist %>' - } - ] + files: [{ + expand: true, + cwd: '<%= yeoman.dist %>', + // src: ['*.html', 'views/{,*/}*.html'], + src: ['*.html', 'views/**/*.html'], + dest: '<%= yeoman.dist %>' + }] } }, @@ -282,14 +272,12 @@ module.exports = function(grunt) { // minsafe compatible so Uglify does not destroy the ng references ngmin: { dist: { - files: [ - { - expand: true, - cwd: '.tmp/concat/scripts', - src: '*.js', - dest: '.tmp/concat/scripts' - } - ] + files: [{ + expand: true, + cwd: '.tmp/concat/scripts', + src: '*.js', + dest: '.tmp/concat/scripts' + }] } }, @@ -303,27 +291,24 @@ module.exports = function(grunt) { // Copies remaining files to places other tasks can use copy: { dist: { - files: [ - { - expand: true, - dot: true, - cwd: '<%= yeoman.app %>', - dest: '<%= yeoman.dist %>', - src: ['*.{ico,png,txt}', '.htaccess', '*.html', - // 'views/{,*/}*.html', - 'views/**/*.html', 'bower_components/**/*', 'images/**/*', 'data/**/*', 'api-doc/**/*', - // 'images/{,*/}*.{webp}', - // 'images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', - 'fonts/*' - ] - }, - { - expand: true, - cwd: '.tmp/images', - dest: '<%= yeoman.dist %>/images', - src: ['generated/*'] - } - ] + files: [{ + expand: true, + dot: true, + cwd: '<%= yeoman.app %>', + dest: '<%= yeoman.dist %>', + src: ['*.{ico,png,txt}', '.htaccess', '*.html', + // 'views/{,*/}*.html', + 'views/**/*.html', 'bower_components/**/*', 'images/**/*', 'data/**/*', 'api-doc/**/*', + // 'images/{,*/}*.{webp}', + // 'images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', + 'fonts/*' + ] + }, { + expand: true, + cwd: '.tmp/images', + dest: '<%= yeoman.dist %>/images', + src: ['generated/*'] + }] }, styles: { expand: true, @@ -340,7 +325,7 @@ module.exports = function(grunt) { dist: ['compass:dist', // 'imagemin', 'svgmin' - ] + ], }, // By default, your `index.html`'s will take care of @@ -433,39 +418,45 @@ module.exports = function(grunt) { baseUrl: 'http://localhost:8088', specs: [ 'test/e2e/setup-scenario/before-all.js', -// 'test/e2e/scenarios/admin_cloud.js', -// 'test/e2e/scenarios/admin_cloud_image.js', -// 'test/e2e/scenarios/admin_groups_management.js', -// 'test/e2e/scenarios/admin_metaprops_configuration.js', -// 'test/e2e/scenarios/admin_users_management.js', -// 'test/e2e/scenarios/application.js', -// 'test/e2e/scenarios/application_metaprops.js', -// 'test/e2e/scenarios/application_security.js', -// 'test/e2e/scenarios/application_tags.js', -// 'test/e2e/scenarios/application_topology_editor_editrelationshipname.js', -// 'test/e2e/scenarios/application_topology_editor_editrequiredprops.js', -// 'test/e2e/scenarios/application_topology_editor_input_output.js', -// 'test/e2e/scenarios/application_topology_editor_multiplenodeversions.js', -// 'test/e2e/scenarios/application_topology_editor_nodetemplate.js', -// 'test/e2e/scenarios/application_topology_editor_plan.js', -// 'test/e2e/scenarios/application_topology_editor_relationships.js', -// 'test/e2e/scenarios/application_topology_editor_replacenode.js', -// 'test/e2e/scenarios/application_topology_runtime.js', -// 'test/e2e/scenarios/authentication.js', -// 'test/e2e/scenarios/component_details.js', -// 'test/e2e/scenarios/component_details_tags.js', -// 'test/e2e/scenarios/csar.js', -// 'test/e2e/scenarios/deployment.js', -// 'test/e2e/scenarios/deployment_matcher.js', -// 'test/e2e/scenarios/homepage.js', -// 'test/e2e/scenarios/language_test.js', -// 'test/e2e/scenarios/plugins.js', -// 'test/e2e/scenarios/quick_search.js', -// 'test/e2e/scenarios/security_cloud.js', -// 'test/e2e/scenarios/security_groups.js', -// 'test/e2e/scenarios/security_users.js', -// 'test/e2e/scenarios/topology_template.js', -// 'test/e2e/scenarios/*' + // 'test/e2e/scenarios/homepage.js', + // 'test/e2e/scenarios/language_test.js', + // 'test/e2e/scenarios/authentication.js', + // 'test/e2e/scenarios/admin_users_management.js', + // 'test/e2e/scenarios/admin_groups_management.js', + // 'test/e2e/scenarios/plugins.js', + // 'test/e2e/scenarios/admin_metaprops_configuration.js', + // 'test/e2e/scenarios/admin_cloud_image.js', + // 'test/e2e/scenarios/admin_cloud.js', + + // 'test/e2e/scenarios/csar_upload.js', + // 'test/e2e/scenarios/component_details.js', + // 'test/e2e/scenarios/component_details_tags.js', + + // 'test/e2e/scenarios/topology_template.js', + + // 'test/e2e/scenarios/application.js', + // 'test/e2e/scenarios/application_metaprops.js', + // 'test/e2e/scenarios/application_tags.js', + // 'test/e2e/scenarios/application_topology_editor_nodetemplate.js', + // 'test/e2e/scenarios/application_topology_editor_relationships.js', + // 'test/e2e/scenarios/application_topology_editor_replacenode.js', + // 'test/e2e/scenarios/application_topology_editor_editrelationshipname.js', + // 'test/e2e/scenarios/application_topology_editor_editrequiredprops.js', + // 'test/e2e/scenarios/application_topology_editor_multiplenodeversions.js', + // 'test/e2e/scenarios/application_topology_editor_input_output.js', + // 'test/e2e/scenarios/application_topology_runtime.js', + // 'test/e2e/scenarios/application_security.js', + + // 'test/e2e/scenarios/deployment.js', + 'test/e2e/scenarios/deployment_matcher.js', + + // 'test/e2e/scenarios/quick_search.js', + + // 'test/e2e/scenarios/security_users.js', + // 'test/e2e/scenarios/security_groups.js', + //'test/e2e/scenarios/security_cloud.js', + // 'test/e2e/scenarios/*' + ] } } diff --git a/alien4cloud-ui/yo/app/index.html b/alien4cloud-ui/yo/app/index.html index e75667bd..70df162f 100644 --- a/alien4cloud-ui/yo/app/index.html +++ b/alien4cloud-ui/yo/app/index.html @@ -164,6 +164,7 @@ + diff --git a/alien4cloud-ui/yo/app/scripts/applications/controllers/topology_runtime.js b/alien4cloud-ui/yo/app/scripts/applications/controllers/topology_runtime.js index 8e930e00..3844077c 100644 --- a/alien4cloud-ui/yo/app/scripts/applications/controllers/topology_runtime.js +++ b/alien4cloud-ui/yo/app/scripts/applications/controllers/topology_runtime.js @@ -1,5 +1,6 @@ /** TODO Update Topology runtime to make it independant from the application. */ /* global UTILS */ +/* global CONSTANTS */ 'use strict'; @@ -437,6 +438,15 @@ angular.module('alienUiApp').controller( // reset parameter inputs ? injectPropertyDefinitionToInterfaces($scope.selectedNodeCustomInterface); }; - + + // check if compute type + $scope.isComputeType = function (nodeTemplate){ + if(UTILS.isUndefinedOrNull($scope.topology) || UTILS.isUndefinedOrNull(nodeTemplate)){ + return false; + } + var nodeType = $scope.topology.nodeTypes[nodeTemplate.type]; + return UTILS.isFromNodeType(nodeType, CONSTANTS.toscaComputeType); + }; + } ]); diff --git a/alien4cloud-ui/yo/app/scripts/topology/controllers/topology.js b/alien4cloud-ui/yo/app/scripts/topology/controllers/topology.js index e2662354..94d81c94 100644 --- a/alien4cloud-ui/yo/app/scripts/topology/controllers/topology.js +++ b/alien4cloud-ui/yo/app/scripts/topology/controllers/topology.js @@ -19,7 +19,8 @@ angular.module('alienUiApp').controller( var border = 2; var detailDivWidth = 450; var widthOffset = detailDivWidth + (3 * borderSpacing) + (2 * border); - + var COMPUTE_TYPE = "tosca.nodes.Compute"; + function onResize(width, height) { $scope.dimensions = { width: width, @@ -815,5 +816,15 @@ angular.module('alienUiApp').controller( }); } // if end }; + + // check if compute type + $scope.isComputeType = function(nodeTemplate){ + console.log($scope.topology) + if(UTILS.isUndefinedOrNull($scope.topology) || UTILS.isUndefinedOrNull(nodeTemplate)){ + return false; + } + var nodeType = $scope.topology.nodeTypes[nodeTemplate.type]; + return UTILS.isFromNodeType(nodeType, COMPUTE_TYPE); + }; } ]); diff --git a/alien4cloud-ui/yo/app/scripts/utils/CONSTANTS.js b/alien4cloud-ui/yo/app/scripts/utils/CONSTANTS.js new file mode 100644 index 00000000..e41149e1 --- /dev/null +++ b/alien4cloud-ui/yo/app/scripts/utils/CONSTANTS.js @@ -0,0 +1,5 @@ +'use strict'; + +var CONSTANTS = {}; + +CONSTANTS.toscaComputeType = 'tosca.nodes.Compute'; \ No newline at end of file diff --git a/alien4cloud-ui/yo/app/scripts/utils/UTILS.js b/alien4cloud-ui/yo/app/scripts/utils/UTILS.js index 58382666..dd2bc0c9 100644 --- a/alien4cloud-ui/yo/app/scripts/utils/UTILS.js +++ b/alien4cloud-ui/yo/app/scripts/utils/UTILS.js @@ -126,6 +126,11 @@ UTILS.isHostedOnRelationship = function(relationshipTypeName, relationshipTypes) return relationshipTypeName === hostedOnRelationshipName || (UTILS.isDefinedAndNotNull(superTypes) && superTypes.indexOf(hostedOnRelationshipName) >= 0); }; +UTILS.isFromNodeType = function(nodeType, type) { + var superTypes = nodeType.derivedFrom; + return nodeType.elementId === type || (UTILS.isDefinedAndNotNull(superTypes) && superTypes.indexOf(type) >= 0); +}; + /* Split a string into chunks of the given size */ UTILS.splitString = function(string, size) { var re = new RegExp('.{1,' + size + '}', 'g'); diff --git a/alien4cloud-ui/yo/app/views/applications/topology_runtime.html b/alien4cloud-ui/yo/app/views/applications/topology_runtime.html index 36111842..9efada86 100644 --- a/alien4cloud-ui/yo/app/views/applications/topology_runtime.html +++ b/alien4cloud-ui/yo/app/views/applications/topology_runtime.html @@ -69,7 +69,7 @@

{{selectedNodeTemplate.name | split:39}}

-
+

{{selectedNodeTemplate.newInstancesCount diff --git a/alien4cloud-ui/yo/app/views/topology/topology_editor.html b/alien4cloud-ui/yo/app/views/topology/topology_editor.html index 99df0e2d..cf67def7 100644 --- a/alien4cloud-ui/yo/app/views/topology/topology_editor.html +++ b/alien4cloud-ui/yo/app/views/topology/topology_editor.html @@ -103,20 +103,20 @@

- - - - - - - - + + + + + + + + @@ -454,7 +454,7 @@

-
+