You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2018/09/26 14:58:30 UTC

[1/4] brooklyn-ui git commit: pass the model to config filters

Repository: brooklyn-ui
Updated Branches:
  refs/heads/master de857cfec -> a32e8f1eb


pass the model to config filters

and for "required" include all which have issues recorded against them


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/commit/eeb17a0e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/tree/eeb17a0e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/diff/eeb17a0e

Branch: refs/heads/master
Commit: eeb17a0ec2ae622201f97928212cf106b0fd2e4a
Parents: de857cf
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Sep 21 16:42:52 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Sep 21 16:42:52 2018 +0100

----------------------------------------------------------------------
 .../components/spec-editor/spec-editor.directive.js  | 15 ++++++++-------
 .../components/spec-editor/spec-editor.template.html |  2 +-
 2 files changed, 9 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/eeb17a0e/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
----------------------------------------------------------------------
diff --git a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
index a6b19e8..858e167 100644
--- a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
+++ b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
@@ -50,15 +50,16 @@ export const CONFIG_FILTERS = [
     {
         id: 'required',
         label: 'Required',
-        filter: (item)=> {
-            return item.constraints && item.constraints.required;
+        filter: (item, model)=> {
+            return (item.constraints && item.constraints.required) ||
+                (model && model.issues && model.issues.some((issue)=>(issue.group === 'config' && issue.ref === item.name)) );
         }
     },
     {
         id: 'inuse',
         label: 'In Use',
-        filter: (item, currentConfig)=> {
-            return currentConfig.has(item.name);
+        filter: (item, model)=> {
+            return model && model.config && model.config.has(item.name);
         }
     },
     {
@@ -601,7 +602,7 @@ export function specEditorDirective($rootScope, $templateCache, $injector, $sani
             if (!angular.isArray(scope.model.miscData.get('config'))) {
                 return [];
             }
-            let filteredConfig = $filter('specEditorConfig')(scope.model.miscData.get('config'), scope.state.config.filter.values, scope.model.config);
+            let filteredConfig = $filter('specEditorConfig')(scope.model.miscData.get('config'), scope.state.config.filter.values, scope.model);
             return scope.model.miscData.get('config').map((config)=> {
                 config.isHidden = scope.model.miscData.get('config').indexOf(config) > -1 ? filteredConfig.indexOf(config) === -1 : false;
                 return config;
@@ -827,7 +828,7 @@ export function specEditorDirective($rootScope, $templateCache, $injector, $sani
 }
 
 export function specEditorConfigFilter() {
-    return function (input, filtersMapById, currentConfig) {
+    return function (input, filtersMapById, model) {
         let filters = [];
         Object.keys(filtersMapById).forEach( (k) => { if (filtersMapById[k]) filters.push(k); } );
         
@@ -838,7 +839,7 @@ export function specEditorConfigFilter() {
             return input;
         }
         return input.filter((item)=> {
-            return filters.some(filterId => CONFIG_FILTERS.find(filter => filter.id === filterId).filter(item, currentConfig));
+            return filters.some(filterId => CONFIG_FILTERS.find(filter => filter.id === filterId).filter(item, model));
         });
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/eeb17a0e/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.template.html
----------------------------------------------------------------------
diff --git a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.template.html b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.template.html
index 04ffdfc..713da93 100644
--- a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.template.html
+++ b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.template.html
@@ -126,7 +126,7 @@
         </div>
 
         <form name="formSpecConfig" novalidate class="lightweight">
-            <div ng-repeat="item in (filteredItems = (model.miscData.get('config') | specEditorConfig:state.config.filter.values:model.config | filter:{name:state.config.search} | orderBy:+priority)) track by item.name ">
+            <div ng-repeat="item in (filteredItems = (model.miscData.get('config') | specEditorConfig:state.config.filter.values:model | filter:{name:state.config.search} | orderBy:+priority)) track by item.name ">
                 <div class="form-group" ng-class="{'has-error': (model.issues | filter:{ref: item.name}:true).length > 0, 'used': config[item.name] !== undefined}" 
                         ng-switch="getConfigWidgetMode(item)" 
                         tabindex="1"


[4/4] brooklyn-ui git commit: This closes #72

Posted by he...@apache.org.
This closes #72


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/commit/a32e8f1e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/tree/a32e8f1e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/diff/a32e8f1e

Branch: refs/heads/master
Commit: a32e8f1eb3e8ff31f7bc8c1bcda9ab2e1c6625e1
Parents: de857cf 4310fbd
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Sep 26 15:56:56 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Sep 26 15:56:56 2018 +0100

----------------------------------------------------------------------
 .../providers/blueprint-service.provider.js     | 75 +++++++++++++-------
 .../spec-editor/spec-editor.directive.js        | 15 ++--
 .../spec-editor/spec-editor.template.html       |  2 +-
 3 files changed, 57 insertions(+), 35 deletions(-)
----------------------------------------------------------------------



[2/4] brooklyn-ui git commit: add {forbidden, required}{If, Unless} constraints

Posted by he...@apache.org.
add {forbidden,required}{If,Unless} constraints

also keep constraints as a list, not a map (eg if multiple forbiddenIfs), and update checks to expect json


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/commit/bd41dce2
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/tree/bd41dce2
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/diff/bd41dce2

Branch: refs/heads/master
Commit: bd41dce23e38194e6134ae9c5379c513a7e0a25f
Parents: eeb17a0
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Sep 22 01:27:36 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Sep 22 01:27:36 2018 +0100

----------------------------------------------------------------------
 .../providers/blueprint-service.provider.js     | 69 ++++++++++++--------
 1 file changed, 43 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/bd41dce2/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
----------------------------------------------------------------------
diff --git a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
index 3a0dd78..b7ed6be 100644
--- a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
+++ b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
@@ -236,8 +236,8 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
 
             promise.then((data)=> {
                 deferred.resolve(populateEntityFromApiSuccess(entity, data));
-            }).catch(function () {
-                deferred.resolve(populateEntityFromApiError(entity));
+            }).catch(function (error) {
+                deferred.resolve(populateEntityFromApiError(entity, error));
             });
         } else if (entity.parent) {
             entity.clearIssues({group: 'type'}).addIssue(Issue.builder().group('type').message('Entity needs a type').level(ISSUE_LEVEL.WARN).build());
@@ -275,10 +275,20 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
         return $q((resolve) => {
             if (entity.miscData.has('config')) {
                 entity.miscData.get('config')
-                    .filter(config => config.constraints && Object.keys(config.constraints).length > 0)
+                    .filter(config => config.constraints && config.constraints.length > 0)
                     .forEach(config => {
-                        for (let [key, constraint] of Object.entries(config.constraints) ) {
+                        for (let constraintO of config.constraints) {
                             let message = null;
+                            let key = null, args = null;
+                            if (constraintO instanceof String) {
+                                key = constraintO;
+                            } else if (Object.keys(constraintO).length==1) {
+                                key = Object.keys(constraintO)[0];
+                                args = constraintO[key];
+                            } else {
+                                $log.warn("Unknown constraint object", constraintO);
+                                key = constraintO;
+                            }
                             switch (key) {
                                 case 'Predicates.notNull()':
                                 case 'required':
@@ -287,8 +297,28 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
                                     }
                                     break;
                                 case 'regex':
-                                    if (!entity.config.has(config.name) || !angular.isDefined(entity.config.get(config.name)) || !(new RegExp(constraint).test(entity.config.get(config.name)))) {
-                                        message = `<samp>${config.name}</samp> does not match the required format: <samp>${config.constraints.regex}</samp>`;
+                                    if (entity.config.has(config.name) && angular.isDefined(entity.config.get(config.name)) && !(new RegExp(args).test(entity.config.get(config.name)))) {
+                                        message = `<samp>${config.name}</samp> does not match the required format: <samp>${args}</samp>`;
+                                    }
+                                    break;
+                                case 'forbiddenIf':
+                                    if (entity.config.get(config.name) && entity.config.get(args)) {
+                                        message = `<samp>${config.name}</samp> cannot be set when <samp>${args}</samp> is set`;
+                                    }
+                                    break;
+                                case 'forbiddenUnless':
+                                    if (entity.config.get(config.name) && !entity.config.get(args)) {
+                                        message = `<samp>${config.name}</samp> cannot be set unless <samp>${args}</samp> is set`;
+                                    }
+                                    break;
+                                case 'requiredIf':
+                                    if (!entity.config.get(config.name) && entity.config.get(args)) {
+                                        message = `<samp>${config.name}</samp> is required when <samp>${args}</samp> is set`;
+                                    }
+                                    break;
+                                case 'requiredUnless':
+                                    if (!entity.config.get(config.name) && !entity.config.get(args)) {
+                                        message = `<samp>${config.name}</samp> is required when <samp>${args}</samp> is not set`;
                                     }
                                     break;
                             }
@@ -321,8 +351,8 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
 
             paletteApi.getType(policy.type, policy.version).then((data)=> {
                 deferred.resolve(populateEntityFromApiSuccess(policy, data));
-            }).catch(function () {
-                deferred.resolve(populateEntityFromApiError(policy));
+            }).catch(function (error) {
+                deferred.resolve(populateEntityFromApiError(policy, error));
             }).finally(()=> {
                 policy.miscData.set('loading', false);
             });
@@ -340,8 +370,8 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
 
             paletteApi.getType(enricher.type, enricher.version).then((data)=> {
                 deferred.resolve(populateEntityFromApiSuccess(enricher, data));
-            }).catch(function () {
-                deferred.resolve(populateEntityFromApiError(enricher));
+            }).catch(function (error) {
+                deferred.resolve(populateEntityFromApiError(enricher, error));
             }).finally(()=> {
                 enricher.miscData.set('loading', false);
             });
@@ -482,21 +512,7 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
             version: data.containingBundle.split(':')[1]
         });
         entity.miscData.set('typeName', data.displayName || data.symbolicName);
-        entity.miscData.set('config', (data.config || []).map(config => {
-            if (config.constraints) {
-                config.constraints = config.constraints.reduce((map, constraint) => {
-                    if (constraint.startsWith('matchesRegex')) {
-                        map.regex = constraint.replace(/matchesRegex\(([^)]*)\)/, '$1');
-                    } else {
-                        // The constraint "required" falls back into this case. Good enough for now as we only support
-                        // 2 types of constraints.
-                        map[constraint] = true;
-                    }
-                    return map;
-                }, {});
-            }
-            return config;
-        }));
+        entity.miscData.set('config', data.config || []);
         entity.miscData.set('sensors', data.sensors || []);
         entity.miscData.set('traits', data.supertypes || []);
         entity.miscData.set('tags', data.tags || []);
@@ -520,7 +536,8 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
         return dst;
     }
 
-    function populateEntityFromApiError(entity) {
+    function populateEntityFromApiError(entity, error) {
+        $log.warn("Error loading/populating type, data will be incomplete.", entity, error);
         entity.clearIssues({group: 'type'});
         entity.addIssue(Issue.builder().group('type').message($sce.trustAsHtml(`Type <samp>${entity.type + (entity.hasVersion ? ':' + entity.version : '')}</samp> does not exist`)).build());
         entity.miscData.set('typeName', entity.type || '');


[3/4] brooklyn-ui git commit: tidy constraint evaluation logic

Posted by he...@apache.org.
tidy constraint evaluation logic

make tighter around things like `false` values and empty string


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/commit/4310fbdd
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/tree/4310fbdd
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/diff/4310fbdd

Branch: refs/heads/master
Commit: 4310fbdddb6d31ca81433603608f3fdf2ef655af
Parents: bd41dce
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Sep 24 15:39:46 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Sep 24 15:39:46 2018 +0100

----------------------------------------------------------------------
 .../providers/blueprint-service.provider.js         | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/4310fbdd/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
----------------------------------------------------------------------
diff --git a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
index b7ed6be..069fb3c 100644
--- a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
+++ b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
@@ -289,35 +289,39 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
                                 $log.warn("Unknown constraint object", constraintO);
                                 key = constraintO;
                             }
+                            let val = (k) => entity.config.get(k || config.name);
+                            let isSet = (k) => entity.config.has(k || config.name) && angular.isDefined(val(k));
+                            let hasDefault = () => angular.isDefined(config.defaultValue);
                             switch (key) {
                                 case 'Predicates.notNull()':
                                 case 'required':
-                                    if (!angular.isDefined(config.defaultValue) && (!entity.config.has(config.name) || !angular.isDefined(entity.config.get(config.name)))) {
+                                    if (!isSet() && !hasDefault() && val()!='') {
+                                        // "required" also means that it must not be the empty string
                                         message = `<samp>${config.name}</samp> is required`;
                                     }
                                     break;
                                 case 'regex':
-                                    if (entity.config.has(config.name) && angular.isDefined(entity.config.get(config.name)) && !(new RegExp(args).test(entity.config.get(config.name)))) {
+                                    if (isSet() && !(new RegExp(args).test(val))) {
                                         message = `<samp>${config.name}</samp> does not match the required format: <samp>${args}</samp>`;
                                     }
                                     break;
                                 case 'forbiddenIf':
-                                    if (entity.config.get(config.name) && entity.config.get(args)) {
+                                    if (isSet() && isSet(args)) {
                                         message = `<samp>${config.name}</samp> cannot be set when <samp>${args}</samp> is set`;
                                     }
                                     break;
                                 case 'forbiddenUnless':
-                                    if (entity.config.get(config.name) && !entity.config.get(args)) {
+                                    if (isSet() && !isSet(args)) {
                                         message = `<samp>${config.name}</samp> cannot be set unless <samp>${args}</samp> is set`;
                                     }
                                     break;
                                 case 'requiredIf':
-                                    if (!entity.config.get(config.name) && entity.config.get(args)) {
+                                    if (!isSet() && isSet(args)) {
                                         message = `<samp>${config.name}</samp> is required when <samp>${args}</samp> is set`;
                                     }
                                     break;
                                 case 'requiredUnless':
-                                    if (!entity.config.get(config.name) && !entity.config.get(args)) {
+                                    if (!isSet() && !isSet(args)) {
                                         message = `<samp>${config.name}</samp> is required when <samp>${args}</samp> is not set`;
                                     }
                                     break;