Skip to content

Commit

Permalink
Updates for Service Instance & Bindings
Browse files Browse the repository at this point in the history
Updates for service instances. Prep to allow updates
to chosen parameters for instance and bindings.
  • Loading branch information
cdcabrera committed Aug 15, 2017
1 parent 215a1b5 commit 496cfdb
Show file tree
Hide file tree
Showing 12 changed files with 834 additions and 16 deletions.
30 changes: 16 additions & 14 deletions app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
<meta name="msapplication-TileImage" content="images/mstile-144x144.png">
<!-- build:css(.) styles/vendor.css -->
<!-- bower:css -->
<link rel="stylesheet" href="bower_components/angularjs-datatables/dist/css/angular-datatables.css" />
<link rel="stylesheet" href="bower_components/angularjs-datatables/dist/plugins/bootstrap/datatables.bootstrap.min.css" />
<link rel="stylesheet" href="bower_components/angular-datatables/dist/css/angular-datatables.css" />
<link rel="stylesheet" href="bower_components/angular-datatables/dist/plugins/bootstrap/datatables.bootstrap.min.css" />
<link rel="stylesheet" href="bower_components/angular-patternfly/dist/styles/angular-patternfly.css" />
<link rel="stylesheet" href="bower_components/kubernetes-label-selector/labelFilter.css" />
<link rel="stylesheet" href="bower_components/xterm.js/dist/xterm.css" />
Expand Down Expand Up @@ -102,18 +102,18 @@ <h1>JavaScript Required</h1>
<script src="bower_components/jquery-ui/jquery-ui.js"></script>
<script src="bower_components/angular-dragdrop/src/angular-dragdrop.js"></script>
<script src="bower_components/datatables.net/js/jquery.dataTables.js"></script>
<script src="bower_components/angularjs-datatables/dist/angular-datatables.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/bootstrap/angular-datatables.bootstrap.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/colreorder/angular-datatables.colreorder.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/columnfilter/angular-datatables.columnfilter.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/light-columnfilter/angular-datatables.light-columnfilter.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/colvis/angular-datatables.colvis.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/fixedcolumns/angular-datatables.fixedcolumns.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/fixedheader/angular-datatables.fixedheader.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/scroller/angular-datatables.scroller.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/tabletools/angular-datatables.tabletools.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/buttons/angular-datatables.buttons.js"></script>
<script src="bower_components/angularjs-datatables/dist/plugins/select/angular-datatables.select.js"></script>
<script src="bower_components/angular-datatables/dist/angular-datatables.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/bootstrap/angular-datatables.bootstrap.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/colreorder/angular-datatables.colreorder.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/columnfilter/angular-datatables.columnfilter.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/light-columnfilter/angular-datatables.light-columnfilter.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/colvis/angular-datatables.colvis.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/fixedcolumns/angular-datatables.fixedcolumns.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/fixedheader/angular-datatables.fixedheader.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/scroller/angular-datatables.scroller.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/tabletools/angular-datatables.tabletools.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/buttons/angular-datatables.buttons.js"></script>
<script src="bower_components/angular-datatables/dist/plugins/select/angular-datatables.select.js"></script>
<script src="bower_components/angular-drag-and-drop-lists/angular-drag-and-drop-lists.js"></script>
<script src="bower_components/datatables.net-select/js/dataTables.select.js"></script>
<script src="bower_components/lodash/lodash.js"></script>
Expand Down Expand Up @@ -255,6 +255,8 @@ <h1>JavaScript Required</h1>
<script src="scripts/controllers/statefulSet.js"></script>
<script src="scripts/controllers/services.js"></script>
<script src="scripts/controllers/service.js"></script>
<script src="scripts/controllers/provisionedServices.js"></script>
<script src="scripts/controllers/provisionedService.js"></script>
<script src="scripts/controllers/secrets.js"></script>
<script src="scripts/controllers/secret.js"></script>
<script src="scripts/controllers/createSecret.js"></script>
Expand Down
10 changes: 10 additions & 0 deletions app/scripts/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,16 @@ angular
controller: 'ServiceController',
reloadOnSearch: false
})
.when('/project/:project/browse/service-instances', {
templateUrl: 'views/provisioned.html',
controller: 'ProvisionedServicesController',
reloadOnSearch: false
})
.when('/project/:project/browse/service-instances/:instance', {
templateUrl: 'views/browse/provisioned-service.html',
controller: 'ProvisionedServiceController',
reloadOnSearch: false
})
.when('/project/:project/browse/storage', {
templateUrl: 'views/storage.html',
controller: 'StorageController',
Expand Down
14 changes: 14 additions & 0 deletions app/scripts/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,20 @@ angular.extend(window.OPENSHIFT_CONSTANTS, {
prefixes: [
"/browse/routes/"
]
},
{
label: "Provisioned Services",
href: "/browse/service-instances",
prefixes: [
"/browse/service-instances/"
],
isValid: function(){
return _.get(window.OPENSHIFT_CONSTANTS, 'ENABLE_TECH_PREVIEW_FEATURE.service_catalog_landing_page');
},
canI: {
resource: 'rolebindings',
verb: 'list'
}
}
]
}
Expand Down
96 changes: 96 additions & 0 deletions app/scripts/controllers/provisionedService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
'use strict';

angular.module('openshiftConsole')
.controller('ProvisionedServiceController', function ($scope,
$filter,
$routeParams,
DataService,
ProjectsService) {
$scope.alerts = {};
$scope.displayName = null;
$scope.projectName = $routeParams.project;
$scope.serviceInstance = null;
$scope.serviceInstances = null;
$scope.serviceClasses = {};

$scope.breadcrumbs = [
{
title: "Provisioned Services",
link: "project/" + $routeParams.project + "/browse/service-instances"
},
{
title: $routeParams.instance
}
];

var watches = [];

var setDisplayName = function() {
if(!$scope.serviceInstance || !$scope.serviceClasses) {
return;
}

$scope.displayName = $filter('serviceInstanceDisplayName')($scope.serviceInstance, $scope.serviceClasses);
};

var serviceResolved = function(service, action) {
$scope.loaded = true;
$scope.serviceInstance = service;

if (action === "DELETED") {
$scope.alerts["deleted"] = {
type: "warning",
message: "This provisioned service has been deleted."
};
}
};

ProjectsService
.get($routeParams.project)
.then(_.spread(function(project, context) {
$scope.project = project;
$scope.projectContext = context;

DataService
.get({
group: 'servicecatalog.k8s.io',
resource: 'instances'
}, $routeParams.instance, context, { errorNotification: false })
.then(function(service) {
serviceResolved(service);
setDisplayName();
watches.push(DataService.watchObject({
group: 'servicecatalog.k8s.io',
resource: 'instances'
}, $routeParams.instance, context, serviceResolved));

}, function(error) {
$scope.loaded = true;
$scope.alerts["load"] = {
type: "error",
message: "The service details could not be loaded.",
details: $filter('getErrorDetails')(error)
};
});

DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceclasses'
}, context, function(serviceClasses) {
$scope.serviceClasses = serviceClasses.by('metadata.name');
setDisplayName();
});

watches.push(DataService.watch({
group: 'servicecatalog.k8s.io',
resource: 'instances'
}, context, function(services) {
$scope.serviceInstances = services.by("metadata.name");
}));

$scope.$on('$destroy', function(){
DataService.unwatchAll(watches);
});

}));
});
185 changes: 185 additions & 0 deletions app/scripts/controllers/provisionedServices.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
'use strict';

angular.module('openshiftConsole')
.controller('ProvisionedServicesController', function ($scope,
$filter,
$routeParams,
APIService,
BindingService,
Constants,
DataService,
LabelFilter,
Logger,
ProjectsService) {
$scope.alerts = $scope.alerts || {};
$scope.applicationsByBinding = {};
$scope.bindings = {};
$scope.bindableServiceInstances = {};
//$scope.bindingsByApplicationUID = {};
$scope.bindingsByInstanceRef = {};
$scope.emptyMessage = "Loading...";
$scope.labelSuggestions = {};
$scope.projectName = $routeParams.project;
$scope.serviceClasses = {};
$scope.serviceInstances = {};
$scope.unfilteredServiceInstances = {};

var watches = [];

var updateFilter = function() {
$scope.serviceInstances = LabelFilter.getLabelSelector().select($scope.unfilteredServiceInstances);
};

var sortServiceInstances = function() {
$scope.bindableServiceInstances = BindingService.filterBindableServiceInstances($scope.unfilteredServiceInstances, $scope.serviceClasses);
$scope.unfilteredServiceInstances = BindingService.sortServiceInstances($scope.unfilteredServiceInstances, $scope.serviceClasses);
};

var groupBindings = function() {
// Build two maps:
// - Bindings by the UID of the target object
// - API objects by binding name
/*
state.bindingsByApplicationUID = {};
state.applicationsByBinding = {};
//state.deleteableBindingsByApplicationUID = {};
// If there are no bindings, nothing to do.
if (_.isEmpty(state.bindings)) {
return;
}
// All objects that can be a target for bindings.
var objectsByKind = [
overview.deployments,
overview.deploymentConfigs,
overview.vanillaReplicationControllers,
overview.vanillaReplicaSets,
overview.statefulSets
];
// Make sure all the binding targets have loaded first.
if (_.some(objectsByKind, function(collection) { return !collection; })) {
return;
}
// Build a map of pod preset selectors by binding name.
var podPresetSelectors = {};
_.each(state.bindings, function(binding) {
var podPresetSelector = _.get(binding, 'spec.alphaPodPresetTemplate.selector');
if (podPresetSelector) {
podPresetSelectors[binding.metadata.name] = new LabelSelector(podPresetSelector);
}
});
_.each(objectsByKind, function(collection) {
_.each(collection, function(apiObject) {
// Key by UID since name is not unique across different kinds.
var applicationUID = getUID(apiObject);
// 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'));
state.bindingsByApplicationUID[applicationUID] = [];
state.deleteableBindingsByApplicationUID[applicationUID] = [];
// 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.
state.bindingsByApplicationUID[applicationUID].push(state.bindings[bindingName]);
if (!_.get(state.bindings[bindingName], 'metadata.deletionTimestamp')) {
state.deleteableBindingsByApplicationUID[applicationUID].push(state.bindings[bindingName]);
}
state.applicationsByBinding[bindingName] = state.applicationsByBinding[bindingName] || [];
state.applicationsByBinding[bindingName].push(apiObject);
}
});
});
});
$scope.bindingsByInstanceRef = _.reduce(state.bindingsByInstanceRef, function(result, bindingList, key) {
result[key] = _.sortBy(bindingList, function(binding) {
var apps = _.get(state.applicationsByBinding, [binding.metadata.name]);
var firstName = _.get(_.head(apps), ['metadata', 'name']);
return firstName || binding.metadata.name;
});
return result;
}, {});*/
};

ProjectsService
.get($routeParams.project)
.then(_.spread(function(project, context) {
$scope.project = project;
$scope.projectContext = context;

watches.push(DataService.watch({
group: 'servicecatalog.k8s.io',
resource: 'bindings'
}, context, function(bindings) {
$scope.bindings = bindings.by('metadata.name');
$scope.bindingsByInstanceRef = _.groupBy($scope.bindings, 'spec.instanceRef.name');
groupBindings();
//refreshSecrets(context);
}));

watches.push(DataService.watch({
group: 'servicecatalog.k8s.io',
resource: 'instances'
}, context, function(serviceInstances) {
$scope.emptyMessage = "No provisioned services to show";
$scope.unfilteredServiceInstances = serviceInstances.by('metadata.name');

//_.each($scope.unfilteredServiceInstances, function (instance) {
// var notifications = ResourceAlertsService.getServiceInstanceAlerts(instance);
// setNotifications(instance, notifications);
//});

sortServiceInstances();
updateFilter();
updateFilterWarning();

LabelFilter.addLabelSuggestionsFromResources($scope.unfilteredServiceInstances, $scope.labelSuggestions);
LabelFilter.setLabelSuggestions($scope.labelSuggestions);

Logger.log("provisioned services (subscribe)", $scope.unfilteredServiceInstances);
}));

DataService.list({
group: 'servicecatalog.k8s.io',
resource: 'serviceclasses'
}, context, function(serviceClasses) {
$scope.serviceClasses = serviceClasses.by('metadata.name');
sortServiceInstances();
updateFilter();
});

function updateFilterWarning() {
if (!LabelFilter.getLabelSelector().isEmpty() && _.isEmpty($scope.serviceInstances) && !_.isEmpty($scope.unfilteredServiceInstances)) {
$scope.alerts["all-instances-filtered"] = {
type: "warning",
details: "The active filters are hiding all provisioned services."
};
}
else {
delete $scope.alerts["all-instances-filtered"];
}
}

LabelFilter.onActiveFiltersChanged(function(labelSelector) {
// trigger a digest loop
$scope.$apply(function() {
$scope.serviceInstances = labelSelector.select($scope.unfilteredServiceInstances);
updateFilterWarning();
});
});

$scope.$on('$destroy', function(){
DataService.unwatchAll(watches);
});

}));
});
3 changes: 3 additions & 0 deletions app/scripts/filters/canI.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ angular
'imageStreams': [
{group: '', resource: 'imagestreams', verbs: ['update', 'delete']}
],
'instances': [
{group: 'servicecatalog.k8s.io', resource: 'instances', verbs: ['update', 'create', 'delete']}
],
'persistentVolumeClaims': [
{group: '', resource: 'persistentvolumeclaims', verbs: ['update', 'delete']}
],
Expand Down
Loading

0 comments on commit 496cfdb

Please sign in to comment.