Skip to content

Commit 3483dc3

Browse files
author
OpenShift Bot
authored
Merge pull request #1387 from benjaminapetersen/service-instance-row
Merged by openshift-bot
2 parents 5911991 + 9a50dda commit 3483dc3

14 files changed

+666
-178
lines changed

app/index.html

+2
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ <h1>JavaScript Required</h1>
210210
<script src="scripts/services/fullscreen.js"></script>
211211
<script src="scripts/services/apps.js"></script>
212212
<script src="scripts/services/resourceAlerts.js"></script>
213+
<script src="scripts/services/listRowUtils.js"></script>
213214
<script src="scripts/controllers/projects.js"></script>
214215
<script src="scripts/controllers/pods.js"></script>
215216
<script src="scripts/controllers/pod.js"></script>
@@ -358,6 +359,7 @@ <h1>JavaScript Required</h1>
358359
<script src="scripts/directives/notificationIcon.js"></script>
359360
<script src="scripts/directives/overview/builds.js"></script>
360361
<script src="scripts/directives/overview/listRow.js"></script>
362+
<script src="scripts/directives/overview/serviceInstanceRow.js"></script>
361363
<script src="scripts/directives/overview/networking.js"></script>
362364
<script src="scripts/directives/overview/pipelines.js"></script>
363365

app/scripts/controllers/newOverview.js

+42-5
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ function OverviewController($scope,
9393
recentPipelinesByDeploymentConfig: {},
9494
routesByService: {},
9595
servicesByObjectUID: {},
96+
serviceInstances: {},
9697
// Set to true below when metrics are available.
9798
showMetrics: false
9899
};
@@ -156,7 +157,8 @@ function OverviewController($scope,
156157
_.size(overview.deployments) +
157158
_.size(overview.vanillaReplicaSets) +
158159
_.size(overview.statefulSets) +
159-
_.size(overview.monopods);
160+
_.size(overview.monopods) +
161+
_.size(overview.state.serviceInstances);
160162
};
161163

162164
// The size of all visible top-level items after filtering.
@@ -166,7 +168,8 @@ function OverviewController($scope,
166168
_.size(overview.filteredDeployments) +
167169
_.size(overview.filteredReplicaSets) +
168170
_.size(overview.filteredStatefulSets) +
169-
_.size(overview.filteredMonopods);
171+
_.size(overview.filteredMonopods) +
172+
_.size(overview.state.serviceInstances);
170173
};
171174

172175
// Show the "Get Started" message if the project is empty.
@@ -183,7 +186,8 @@ function OverviewController($scope,
183186
overview.deployments &&
184187
overview.replicaSets &&
185188
overview.statefulSets &&
186-
overview.pods;
189+
overview.pods &&
190+
overview.state.serviceInstances;
187191

188192
state.expandAll = loaded && overview.size === 1;
189193

@@ -1061,6 +1065,33 @@ function OverviewController($scope,
10611065
});
10621066
};
10631067

1068+
var refreshSecrets = _.debounce(function(context) {
1069+
DataService.list("secrets", context, null, { errorNotification: false }).then(function(secretData) {
1070+
state.secrets = secretData.by("metadata.name");
1071+
});
1072+
}, 300);
1073+
1074+
// TODO: code duplicated from directives/bindService.js
1075+
// extract & share
1076+
var sortServiceInstances = function() {
1077+
if(!state.serviceInstances && !state.serviceClasses) {
1078+
return;
1079+
}
1080+
state.orderedServiceInstances = _.toArray(state.serviceInstances).sort(function(left, right) {
1081+
var leftName = _.get(state.serviceClasses, [left.spec.serviceClassName, 'osbMetadata', 'displayName']) || left.spec.serviceClassName;
1082+
var rightName = _.get(state.serviceClasses, [left.spec.serviceClassName, 'osbMetadata', 'displayName']) || right.spec.serviceClassName;
1083+
1084+
// Fall back to sorting by `metadata.name` if the display names are the
1085+
// same so that the sort is stable.
1086+
if (leftName === rightName) {
1087+
leftName = _.get(left, 'metadata.name', '');
1088+
rightName = _.get(right, 'metadata.name', '');
1089+
}
1090+
1091+
return leftName.localeCompare(rightName);
1092+
});
1093+
};
1094+
10641095
var watches = [];
10651096
ProjectsService.get($routeParams.project).then(_.spread(function(project, context) {
10661097
// Project must be set on `$scope` for the projects dropdown.
@@ -1221,15 +1252,19 @@ function OverviewController($scope,
12211252
resource: 'instances'
12221253
}, context, function(serviceInstances) {
12231254
state.serviceInstances = serviceInstances.by('metadata.name');
1255+
sortServiceInstances();
1256+
updateFilter();
12241257
}, {poll: limitWatches, pollInterval: DEFAULT_POLL_INTERVAL}));
12251258
}
12261259

12271260
if(Constants.ENABLE_TECH_PREVIEW_FEATURE.service_catalog_landing_page) {
12281261
watches.push(DataService.watch({
12291262
group: 'servicecatalog.k8s.io',
12301263
resource: 'bindings'
1231-
}, context, function(serviceBindings) {
1232-
state.serviceBindings = serviceBindings.by('metadata.name');
1264+
}, context, function(bindings) {
1265+
state.bindings = bindings.by('metadata.name');
1266+
refreshSecrets(context);
1267+
updateFilter();
12331268
}, {poll: limitWatches, pollInterval: DEFAULT_POLL_INTERVAL}));
12341269
}
12351270

@@ -1247,6 +1282,8 @@ function OverviewController($scope,
12471282
resource: 'serviceclasses'
12481283
}, context, function(serviceClasses) {
12491284
state.serviceClasses = serviceClasses.by('metadata.name');
1285+
sortServiceInstances();
1286+
updateFilter();
12501287
});
12511288
}
12521289

app/scripts/directives/overview/listRow.js

+6-55
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ angular.module('openshiftConsole').component('overviewListRow', {
88
'BuildsService',
99
'DeploymentsService',
1010
'Navigate',
11+
'ListRowUtils',
1112
OverviewListRow
1213
],
1314
controllerAs: 'row',
@@ -27,9 +28,12 @@ function OverviewListRow($filter,
2728
APIService,
2829
BuildsService,
2930
DeploymentsService,
30-
Navigate) {
31+
Navigate,
32+
rowMethods) {
3133
var row = this;
3234

35+
_.extend(row, rowMethods.ui);
36+
3337
var canI = $filter('canI');
3438
var deploymentIsInProgress = $filter('deploymentIsInProgress');
3539
var getErrorDetails = $filter('getErrorDetails');
@@ -70,14 +74,6 @@ function OverviewListRow($filter,
7074
}
7175
};
7276

73-
var getNotifications = function(object) {
74-
var uid = _.get(object, 'metadata.uid');
75-
if (!uid) {
76-
return null;
77-
}
78-
return _.get(row, ['state', 'notificationsByObjectUID', uid]);
79-
};
80-
8177
// Return the same empty array each time. Otherwise, digest loop errors occur.
8278
var NO_HPA = [];
8379
var getHPA = function(object) {
@@ -95,54 +91,9 @@ function OverviewListRow($filter,
9591
return _.get(row.state.hpaByResource, [kind, name], NO_HPA);
9692
};
9793

98-
var expandedKey = function(apiObject) {
99-
var uid = _.get(apiObject, 'metadata.uid');
100-
if (!uid) {
101-
return null;
102-
}
103-
104-
return 'overview/expand/' + uid;
105-
};
106-
107-
row.toggleExpand = function(e, always) {
108-
// Don't toggle if clicking on a link inside the row unless `always` is set.
109-
if (!always && $(e.target).closest("a").length > 0) {
110-
return;
111-
}
112-
113-
var key = expandedKey(row.apiObject);
114-
if (!key) {
115-
return;
116-
}
117-
118-
row.expanded = !row.expanded;
119-
sessionStorage.setItem(key, row.expanded ? 'true' : 'false');
120-
};
121-
122-
var setInitialExpandedState = function() {
123-
var key = expandedKey(row.apiObject);
124-
if (!key) {
125-
row.expanded = false;
126-
return;
127-
}
128-
129-
var item = sessionStorage.getItem(key);
130-
if (!item && row.state.expandAll) {
131-
row.expanded = true;
132-
return;
133-
}
134-
135-
row.expanded = item === 'true';
136-
};
137-
138-
row.$onInit = function() {
139-
_.set(row, 'selectedTab.networking', true);
140-
setInitialExpandedState();
141-
};
142-
14394
row.$doCheck = function() {
14495
// Update notifications.
145-
row.notifications = getNotifications(row.apiObject);
96+
row.notifications = rowMethods.getNotifications(row.apiObject, row);
14697

14798
// Update HPA.
14899
row.hpa = getHPA(row.apiObject);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
'use strict';
2+
3+
angular.module('openshiftConsole').component('serviceInstanceRow', {
4+
controller: [
5+
'$filter',
6+
'DataService',
7+
'ListRowUtils',
8+
'$uibModal',
9+
ServiceInstanceRow
10+
],
11+
controllerAs: 'row',
12+
bindings: {
13+
apiObject: '<',
14+
state: '<'
15+
},
16+
templateUrl: 'views/overview/_service-instance-row.html'
17+
});
18+
19+
function ServiceInstanceRow($filter, DataService, rowMethods, $uibModal) {
20+
var row = this;
21+
_.extend(row, rowMethods.ui);
22+
23+
var getErrorDetails = $filter('getErrorDetails');
24+
25+
var getDisplayName = function() {
26+
var serviceClassName = row.apiObject.spec.serviceClassName;
27+
var instanceName = row.apiObject.metadata.name;
28+
var serviceClassDisplayName = _.get(row, ['state','serviceClasses', serviceClassName, 'osbMetadata', 'displayName']);
29+
return serviceClassDisplayName || serviceClassName || instanceName;
30+
};
31+
32+
var getDescription = function() {
33+
var serviceClassName = row.apiObject.spec.serviceClassName;
34+
return _.get(row, ['state','serviceClasses', serviceClassName, 'description']);
35+
};
36+
37+
var getBindings = function() {
38+
return _.filter(row.state.bindings, function(binding) {
39+
return binding.spec.instanceRef.name === row.apiObject.metadata.name;
40+
});
41+
};
42+
43+
row.$onChanges = function() {
44+
row.notifications = rowMethods.getNotifications(row.apiObject, row.state);
45+
row.displayName = getDisplayName();
46+
row.description = getDescription();
47+
row.instanceBindings = getBindings();
48+
};
49+
50+
row.getSecretForBinding = function(binding) {
51+
return binding && _.get(row, ['state', 'secrets', binding.spec.secretName]);
52+
};
53+
54+
55+
row.deprovision = function() {
56+
var modalScope = {
57+
alerts: {
58+
deprovision: {
59+
type: 'error',
60+
message: 'Service \'' + row.apiObject.spec.serviceClassName + '\' will be deleted and no longer available.'
61+
}
62+
},
63+
detailsMarkup: 'Deprovision Service?',
64+
okButtonText: 'Deprovision',
65+
okButtonClass: 'btn-danger',
66+
cancelButtonText: 'Cancel'
67+
};
68+
// TODO: we probably have to handle bindings in here.
69+
// either:
70+
// - automatically remove the bindings
71+
// - tell the user they must manually unbind before continue
72+
$uibModal.open({
73+
animation: true,
74+
templateUrl: 'views/modals/confirm.html',
75+
controller: 'ConfirmModalController',
76+
resolve: {
77+
modalConfig: function() {
78+
return modalScope;
79+
}
80+
}
81+
})
82+
.result.then(function() {
83+
DataService.delete({
84+
group: 'servicecatalog.k8s.io',
85+
resource: 'instances'
86+
},
87+
row.apiObject.metadata.name,
88+
{ namespace: row.apiObject.metadata.namespace })
89+
.then(function() {
90+
row.state.alerts["start-build"] = {
91+
type: "success",
92+
message: "Successfully deprovisioned " + row.apiObject.metadata.name
93+
};
94+
}, function(err) {
95+
row.state.alerts["start-build"] = {
96+
type: "error",
97+
message: "An error occurred while deprovisioning " + row.apiObject.metadata.name,
98+
details: "Reason: " + getErrorDetails(err)
99+
};
100+
});
101+
});
102+
};
103+
104+
}

app/scripts/services/listRowUtils.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
angular.module('openshiftConsole')
4+
.factory('ListRowUtils', function() {
5+
6+
var expandedKey = function(apiObject) {
7+
var uid = _.get(apiObject, 'metadata.uid');
8+
if (!uid) {
9+
return null;
10+
}
11+
12+
return 'overview/expand/' + uid;
13+
};
14+
15+
var setInitialExpandedState = function(row) {
16+
var key = expandedKey(row.apiObject);
17+
if (!key) {
18+
row.expanded = false;
19+
return;
20+
}
21+
22+
var item = sessionStorage.getItem(key);
23+
if (!item && row.state.expandAll) {
24+
row.expanded = true;
25+
return;
26+
}
27+
28+
row.expanded = item === 'true';
29+
};
30+
31+
return {
32+
getNotifications: function(object, state) {
33+
var uid = _.get(object, 'metadata.uid');
34+
if (!uid) {
35+
return null;
36+
}
37+
return _.get(state, ['notificationsByObjectUID', uid]);
38+
},
39+
// ui is a subset of methods intended to be passed to the view.
40+
// above methods are shared functionality, not necessarily view specific.
41+
ui: {
42+
toggleExpand: function(e, always) {
43+
// Don't toggle if clicking on a link inside the row unless `always` is set.
44+
if (!always && $(e.target).closest("a").length > 0) {
45+
return;
46+
}
47+
48+
var key = expandedKey(this.apiObject);
49+
if (!key) {
50+
return;
51+
}
52+
this.expanded = !this.expanded;
53+
sessionStorage.setItem(key, this.expanded ? 'true' : 'false');
54+
},
55+
$onInit: function() {
56+
_.set(this, 'selectedTab.networking', true);
57+
setInitialExpandedState(this);
58+
}
59+
}
60+
};
61+
});

app/styles/_list-pf.less

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
width: 45%;
4141
}
4242
}
43+
.list-pf-content-right {
44+
min-width: 300px;
45+
}
4346
}
4447

4548
.list-pf-item:not(.active) .list-pf-chevron + .list-pf-content {

app/styles/_utils.less

+4
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,7 @@
2929
.block {
3030
display: block;
3131
}
32+
33+
.tranform-none {
34+
text-transform: none !important;
35+
}

0 commit comments

Comments
 (0)