Commit 329b46fe by Jeffrey Phillips Committed by GitHub

Merge pull request #131 from jeff-phillips-18/bind

Add BindingService utility functions
parents 7241f657 3d4d222f
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
"hawtio-extension-service": "~2.0.2", "hawtio-extension-service": "~2.0.2",
"hopscotch": "~0.2.7", "hopscotch": "~0.2.7",
"jquery": "~3.2.1", "jquery": "~3.2.1",
"kubernetes-label-selector": "~2.0.0",
"lodash": "~4.17.4", "lodash": "~4.17.4",
"patternfly": "~3.25.1", "patternfly": "~3.25.1",
"uri.js": "~1.18.0" "uri.js": "~1.18.0"
......
...@@ -1085,6 +1085,91 @@ angular.module("openshiftCommonServices") ...@@ -1085,6 +1085,91 @@ angular.module("openshiftCommonServices")
return binding; return binding;
}; };
var isServiceBindable = function(serviceInstance, serviceClasses) {
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
// If being deleted, it is not bindable
if (_.get(serviceInstance, 'metadata.deletionTimestamp')) {
return false;
}
if (!serviceClass) {
return !!serviceInstance;
}
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
};
var getPodPresetSelectorsForBindings = function(bindings) {
// Build a map of pod preset selectors by binding name.
var podPresetSelectors = {};
_.each(bindings, function(binding) {
var podPresetSelector = _.get(binding, 'spec.alphaPodPresetTemplate.selector');
if (podPresetSelector) {
podPresetSelectors[binding.metadata.name] = new LabelSelector(podPresetSelector);
}
});
return podPresetSelectors;
};
var getBindingsForResource = function(bindings, apiObject) {
var podPresetSelectors = getPodPresetSelectorsForBindings(bindings);
// Create a selector for the potential binding target to check if the
// pod preset covers the selector.
var applicationSelector = new LabelSelector(_.get(apiObject, 'spec.selector'));
var resourceBindings = [];
// Look at each pod preset selector to see if it covers this API object selector.
_.each(podPresetSelectors, function(podPresetSelector, bindingName) {
if (podPresetSelector.covers(applicationSelector)) {
// Keep a map of the target UID to the binding and the binding to
// the target. We want to show bindings both in the "application"
// object rows and the service instance rows.
resourceBindings.push(bindings[bindingName]);
}
});
return resourceBindings;
};
var filterBindableServiceInstances = function(serviceInstances, serviceClasses) {
if (!serviceInstances && !serviceClasses) {
return null;
}
return _.filter(serviceInstances, function (serviceInstance) {
return isServiceBindable(serviceInstance, serviceClasses);
});
};
var sortServiceInstances = function(serviceInstances, serviceClasses) {
if (!serviceInstances && !serviceClasses) {
return null;
}
return _.sortBy(serviceInstances,
function(item) {
return _.get(serviceClasses, [item.spec.serviceClassName, 'externalMetadata', 'displayName']) || item.spec.serviceClassName;
},
function(item) {
return _.get(item, 'metadata.name', '');
}
);
};
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
getServiceClassForInstance: getServiceClassForInstance, getServiceClassForInstance: getServiceClassForInstance,
...@@ -1103,24 +1188,11 @@ angular.module("openshiftCommonServices") ...@@ -1103,24 +1188,11 @@ angular.module("openshiftCommonServices")
}); });
}, },
isServiceBindable: function(serviceInstance, serviceClasses) { isServiceBindable: isServiceBindable,
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses); getPodPresetSelectorsForBindings: getPodPresetSelectorsForBindings,
if (!serviceClass) { getBindingsForResource: getBindingsForResource,
return !!serviceInstance; filterBindableServiceInstances: filterBindableServiceInstances,
} sortServiceInstances: sortServiceInstances
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
}
}; };
}); });
;'use strict'; ;'use strict';
......
...@@ -2851,6 +2851,91 @@ angular.module("openshiftCommonServices") ...@@ -2851,6 +2851,91 @@ angular.module("openshiftCommonServices")
return binding; return binding;
}; };
var isServiceBindable = function(serviceInstance, serviceClasses) {
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
// If being deleted, it is not bindable
if (_.get(serviceInstance, 'metadata.deletionTimestamp')) {
return false;
}
if (!serviceClass) {
return !!serviceInstance;
}
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
};
var getPodPresetSelectorsForBindings = function(bindings) {
// Build a map of pod preset selectors by binding name.
var podPresetSelectors = {};
_.each(bindings, function(binding) {
var podPresetSelector = _.get(binding, 'spec.alphaPodPresetTemplate.selector');
if (podPresetSelector) {
podPresetSelectors[binding.metadata.name] = new LabelSelector(podPresetSelector);
}
});
return podPresetSelectors;
};
var getBindingsForResource = function(bindings, apiObject) {
var podPresetSelectors = getPodPresetSelectorsForBindings(bindings);
// Create a selector for the potential binding target to check if the
// pod preset covers the selector.
var applicationSelector = new LabelSelector(_.get(apiObject, 'spec.selector'));
var resourceBindings = [];
// Look at each pod preset selector to see if it covers this API object selector.
_.each(podPresetSelectors, function(podPresetSelector, bindingName) {
if (podPresetSelector.covers(applicationSelector)) {
// Keep a map of the target UID to the binding and the binding to
// the target. We want to show bindings both in the "application"
// object rows and the service instance rows.
resourceBindings.push(bindings[bindingName]);
}
});
return resourceBindings;
};
var filterBindableServiceInstances = function(serviceInstances, serviceClasses) {
if (!serviceInstances && !serviceClasses) {
return null;
}
return _.filter(serviceInstances, function (serviceInstance) {
return isServiceBindable(serviceInstance, serviceClasses);
});
};
var sortServiceInstances = function(serviceInstances, serviceClasses) {
if (!serviceInstances && !serviceClasses) {
return null;
}
return _.sortBy(serviceInstances,
function(item) {
return _.get(serviceClasses, [item.spec.serviceClassName, 'externalMetadata', 'displayName']) || item.spec.serviceClassName;
},
function(item) {
return _.get(item, 'metadata.name', '');
}
);
};
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
getServiceClassForInstance: getServiceClassForInstance, getServiceClassForInstance: getServiceClassForInstance,
...@@ -2869,24 +2954,11 @@ angular.module("openshiftCommonServices") ...@@ -2869,24 +2954,11 @@ angular.module("openshiftCommonServices")
}); });
}, },
isServiceBindable: function(serviceInstance, serviceClasses) { isServiceBindable: isServiceBindable,
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses); getPodPresetSelectorsForBindings: getPodPresetSelectorsForBindings,
if (!serviceClass) { getBindingsForResource: getBindingsForResource,
return !!serviceInstance; filterBindableServiceInstances: filterBindableServiceInstances,
} sortServiceInstances: sortServiceInstances
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
}
}; };
}]); }]);
;'use strict'; ;'use strict';
......
...@@ -1161,6 +1161,33 @@ matchLabels:appSelector ...@@ -1161,6 +1161,33 @@ matchLabels:appSelector
name:relatedObjName, name:relatedObjName,
selector:appSelector selector:appSelector
}), binding; }), binding;
}, isServiceBindable = function(serviceInstance, serviceClasses) {
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
if (_.get(serviceInstance, "metadata.deletionTimestamp")) return !1;
if (!serviceClass) return !!serviceInstance;
var plan = getPlanForInstance(serviceInstance, serviceClass), planBindable = _.get(plan, "bindable");
return planBindable === !0 ? !0 :planBindable === !1 ? !1 :serviceClass.bindable;
}, getPodPresetSelectorsForBindings = function(bindings) {
var podPresetSelectors = {};
return _.each(bindings, function(binding) {
var podPresetSelector = _.get(binding, "spec.alphaPodPresetTemplate.selector");
podPresetSelector && (podPresetSelectors[binding.metadata.name] = new LabelSelector(podPresetSelector));
}), podPresetSelectors;
}, getBindingsForResource = function(bindings, apiObject) {
var podPresetSelectors = getPodPresetSelectorsForBindings(bindings), applicationSelector = new LabelSelector(_.get(apiObject, "spec.selector")), resourceBindings = [];
return _.each(podPresetSelectors, function(podPresetSelector, bindingName) {
podPresetSelector.covers(applicationSelector) && resourceBindings.push(bindings[bindingName]);
}), resourceBindings;
}, filterBindableServiceInstances = function(serviceInstances, serviceClasses) {
return serviceInstances || serviceClasses ? _.filter(serviceInstances, function(serviceInstance) {
return isServiceBindable(serviceInstance, serviceClasses);
}) :null;
}, sortServiceInstances = function(serviceInstances, serviceClasses) {
return serviceInstances || serviceClasses ? _.sortBy(serviceInstances, function(item) {
return _.get(serviceClasses, [ item.spec.serviceClassName, "externalMetadata", "displayName" ]) || item.spec.serviceClassName;
}, function(item) {
return _.get(item, "metadata.name", "");
}) :null;
}; };
return { return {
bindingResource:bindingResource, bindingResource:bindingResource,
...@@ -1173,12 +1200,11 @@ namespace:serviceInstance.metadata.namespace ...@@ -1173,12 +1200,11 @@ namespace:serviceInstance.metadata.namespace
return DataService.create(bindingResource, null, newBinding, context); return DataService.create(bindingResource, null, newBinding, context);
}); });
}, },
isServiceBindable:function(serviceInstance, serviceClasses) { isServiceBindable:isServiceBindable,
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses); getPodPresetSelectorsForBindings:getPodPresetSelectorsForBindings,
if (!serviceClass) return !!serviceInstance; getBindingsForResource:getBindingsForResource,
var plan = getPlanForInstance(serviceInstance, serviceClass), planBindable = _.get(plan, "bindable"); filterBindableServiceInstances:filterBindableServiceInstances,
return planBindable === !0 ? !0 :planBindable === !1 ? !1 :serviceClass.bindable; sortServiceInstances:sortServiceInstances
}
}; };
} ]), angular.module("openshiftCommonServices").factory("Constants", function() { } ]), angular.module("openshiftCommonServices").factory("Constants", function() {
var constants = _.clone(window.OPENSHIFT_CONSTANTS || {}), version = _.clone(window.OPENSHIFT_VERSION || {}); var constants = _.clone(window.OPENSHIFT_CONSTANTS || {}), version = _.clone(window.OPENSHIFT_VERSION || {});
......
...@@ -74,6 +74,91 @@ angular.module("openshiftCommonServices") ...@@ -74,6 +74,91 @@ angular.module("openshiftCommonServices")
return binding; return binding;
}; };
var isServiceBindable = function(serviceInstance, serviceClasses) {
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses);
// If being deleted, it is not bindable
if (_.get(serviceInstance, 'metadata.deletionTimestamp')) {
return false;
}
if (!serviceClass) {
return !!serviceInstance;
}
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
};
var getPodPresetSelectorsForBindings = function(bindings) {
// Build a map of pod preset selectors by binding name.
var podPresetSelectors = {};
_.each(bindings, function(binding) {
var podPresetSelector = _.get(binding, 'spec.alphaPodPresetTemplate.selector');
if (podPresetSelector) {
podPresetSelectors[binding.metadata.name] = new LabelSelector(podPresetSelector);
}
});
return podPresetSelectors;
};
var getBindingsForResource = function(bindings, apiObject) {
var podPresetSelectors = getPodPresetSelectorsForBindings(bindings);
// Create a selector for the potential binding target to check if the
// pod preset covers the selector.
var applicationSelector = new LabelSelector(_.get(apiObject, 'spec.selector'));
var resourceBindings = [];
// Look at each pod preset selector to see if it covers this API object selector.
_.each(podPresetSelectors, function(podPresetSelector, bindingName) {
if (podPresetSelector.covers(applicationSelector)) {
// Keep a map of the target UID to the binding and the binding to
// the target. We want to show bindings both in the "application"
// object rows and the service instance rows.
resourceBindings.push(bindings[bindingName]);
}
});
return resourceBindings;
};
var filterBindableServiceInstances = function(serviceInstances, serviceClasses) {
if (!serviceInstances && !serviceClasses) {
return null;
}
return _.filter(serviceInstances, function (serviceInstance) {
return isServiceBindable(serviceInstance, serviceClasses);
});
};
var sortServiceInstances = function(serviceInstances, serviceClasses) {
if (!serviceInstances && !serviceClasses) {
return null;
}
return _.sortBy(serviceInstances,
function(item) {
return _.get(serviceClasses, [item.spec.serviceClassName, 'externalMetadata', 'displayName']) || item.spec.serviceClassName;
},
function(item) {
return _.get(item, 'metadata.name', '');
}
);
};
return { return {
bindingResource: bindingResource, bindingResource: bindingResource,
getServiceClassForInstance: getServiceClassForInstance, getServiceClassForInstance: getServiceClassForInstance,
...@@ -92,23 +177,10 @@ angular.module("openshiftCommonServices") ...@@ -92,23 +177,10 @@ angular.module("openshiftCommonServices")
}); });
}, },
isServiceBindable: function(serviceInstance, serviceClasses) { isServiceBindable: isServiceBindable,
var serviceClass = getServiceClassForInstance(serviceInstance, serviceClasses); getPodPresetSelectorsForBindings: getPodPresetSelectorsForBindings,
if (!serviceClass) { getBindingsForResource: getBindingsForResource,
return !!serviceInstance; filterBindableServiceInstances: filterBindableServiceInstances,
} sortServiceInstances: sortServiceInstances
var plan = getPlanForInstance(serviceInstance, serviceClass);
var planBindable = _.get(plan, 'bindable');
if (planBindable === true) {
return true;
}
if (planBindable === false) {
return false;
}
// If `plan.bindable` is not set, fall back to `serviceClass.bindable`.
return serviceClass.bindable;
}
}; };
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment