Skip to content

Commit

Permalink
Delete bindings when deleting a service instance
Browse files Browse the repository at this point in the history
  • Loading branch information
jeff-phillips-18 committed Sep 25, 2017
1 parent 5897e5b commit 5cdf111
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 80 deletions.
122 changes: 81 additions & 41 deletions app/scripts/services/serviceInstances.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,64 +3,104 @@
angular.module("openshiftConsole")
.factory("ServiceInstancesService", function($filter,
$uibModal,
BindingService,
CatalogService,
DataService,
Logger,
NotificationsService) {

function deprovision(apiObject) {
var getErrorDetails = $filter('getErrorDetails');
var deprovisionInstance = function(apiObject) {
var context = {namespace: apiObject.metadata.namespace};
var resource = {
group: 'servicecatalog.k8s.io',
resource: 'serviceinstances'
};

NotificationsService.hideNotification("deprovision-service-error");

// TODO - remove once this is resolved https://github.com/kubernetes-incubator/service-catalog/issues/942
var opts = {
propagationPolicy: null
};

return DataService.delete(resource, apiObject.metadata.name, context, opts).then(function() {
NotificationsService.addNotification({
type: "success",
message: "Provisioned service '" + apiObject.metadata.name + "' was marked for deletion."
});
}, function(err) {
NotificationsService.addNotification({
id: "deprovision-service-error",
type: "error",
message: "An error occurred while deleting provisioned service " + apiObject.metadata.name + ".",
details: $filter('getErrorDetails')(err)
});
Logger("An error occurred while deleting provisioned service " + apiObject.metadata.name + ".", err);
});
};

var deprovisionBindings = function(apiObject) {
var context = {namespace: apiObject.metadata.namespace};
var resource = {
group: 'servicecatalog.k8s.io',
resource: 'serviceinstancecredentials'
};

if (CatalogService.SERVICE_CATALOG_ENABLED) {
DataService.list(resource, context, function (bindings) {
var serviceBindings = BindingService.getBindingsForResource(bindings.by('metadata.name'), apiObject);

_.each(serviceBindings, function (binding) {
DataService.delete(resource, binding.metadata.name, context)
.then(function () {
NotificationsService.addNotification({
type: "success",
message: 'Binding ' + binding.metadata.name + "' was marked for deletion."
});
})
.catch(function (err) {
NotificationsService.addNotification({
type: "error",
message: 'Binding ' + binding.metadata.name + "' could not be deleted.",
details: $filter('getErrorDetails')(err)
});
Logger.error('Binding ' + binding.metadata.name + "' could not be deleted.", err);
});
});
});
}
};

var deprovision = function (apiObject) {
var modalInstance;

var modalScope = {
alerts: {
deprovision: {
type: 'error',
message: 'Service \'' + apiObject.spec.serviceClassName + '\' will be deleted and no longer available.'
}
},
detailsMarkup: 'Delete Service?',
kind: apiObject.kind,
displayName: apiObject.metadata.name,
okButtonText: 'Delete',
okButtonClass: 'btn-danger',
cancelButtonText: 'Cancel'
cancelButtonText: 'Cancel',
delete: function() {
modalInstance.close('delete');
}
};

// TODO: we probably have to handle bindings in here.
// either:
// - automatically remove the bindings
// - tell the user they must manually unbind before continue
return $uibModal.open({
modalInstance = $uibModal.open({
animation: true,
templateUrl: 'views/modals/confirm.html',
templateUrl: 'views/modals/delete-resource.html',
controller: 'ConfirmModalController',
resolve: {
modalConfig: function() {
return modalScope;
}
}
})
.result.then(function() {
NotificationsService.hideNotification("deprovision-service-error");
});

return DataService.delete({
group: 'servicecatalog.k8s.io',
resource: 'serviceinstances'
},
apiObject.metadata.name,
{ namespace: apiObject.metadata.namespace },
{ propagationPolicy: null
}) // TODO - remove once this is resolved https://github.com/kubernetes-incubator/service-catalog/issues/942
.then(function() {
NotificationsService.addNotification({
type: "success",
message: "Successfully deleted provisioned service " + apiObject.metadata.name + "."
});
}, function(err) {
NotificationsService.addNotification({
id: "deprovision-service-error",
type: "error",
message: "An error occurred while deleting provisioned service " + apiObject.metadata.name + ".",
details: getErrorDetails(err)
});
});
return modalInstance.result.then(function() {
deprovisionBindings(apiObject);
deprovisionInstance(apiObject);
});
}
};

return {
deprovision: deprovision
Expand Down
2 changes: 1 addition & 1 deletion app/views/directives/_service-binding.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ <h3>
<status-icon status="'Pending'"></status-icon>Pending
</div>
</div>
<div class="service-binding-actions" ng-if="!ctrl.binding.metadata.deletionTimestamp">
<div class="service-binding-actions" ng-if="!$ctrl.binding.metadata.deletionTimestamp">
<delete-link
ng-if="({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'} | canI : 'delete')"
kind="ServiceInstanceCredential"
Expand Down
4 changes: 4 additions & 0 deletions app/views/modals/delete-resource.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ <h1>Are you sure you want to delete the {{typeDisplayName || (kind | humanizeKin
This will delete the {{typeDisplayName || (kind | humanizeKind)}} and any running pods.
</span>

<span ng-if="kind === 'ServiceInstance'">
{{displayName ? displayName : resourceName}} and its data will no longer be available to your applications.
</span>

<span ng-if="isProject">
This will <strong>delete all resources</strong> associated with the
project {{displayName ? displayName : resourceName}}.
Expand Down
2 changes: 1 addition & 1 deletion app/views/overview/_service-bindings.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
service-instances="$ctrl.serviceInstances"
secrets="$ctrl.secrets">
</service-binding>
<div ng-if="($ctrl.bindableServiceInstances | size) && ({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'} | canI : 'create')">
<div ng-if="!$ctrl.refApiObject.metadata.deletionTimestamp && ($ctrl.bindableServiceInstances | size) && ({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'} | canI : 'create')">
<a href="" ng-click="$ctrl.createBinding()" role="button">
<span class="pficon pficon-add-circle-o" aria-hidden="true"></span>
Create Binding
Expand Down
98 changes: 63 additions & 35 deletions dist/scripts/scripts.js
Original file line number Diff line number Diff line change
Expand Up @@ -4277,51 +4277,79 @@ controller: !0
});
}
};
}), angular.module("openshiftConsole").factory("ServiceInstancesService", [ "$filter", "$uibModal", "DataService", "NotificationsService", function(e, t, n, a) {
return {
deprovision: function(r) {
var o = e("getErrorDetails"), i = {
alerts: {
deprovision: {
}), angular.module("openshiftConsole").factory("ServiceInstancesService", [ "$filter", "$uibModal", "BindingService", "CatalogService", "DataService", "Logger", "NotificationsService", function(e, t, n, a, r, o, i) {
var s = function(t) {
var n = {
namespace: t.metadata.namespace
}, a = {
group: "servicecatalog.k8s.io",
resource: "serviceinstances"
};
i.hideNotification("deprovision-service-error");
var s = {
propagationPolicy: null
};
return r.delete(a, t.metadata.name, n, s).then(function() {
i.addNotification({
type: "success",
message: "Provisioned service '" + t.metadata.name + "' was marked for deletion."
});
}, function(n) {
i.addNotification({
id: "deprovision-service-error",
type: "error",
message: "Service '" + r.spec.serviceClassName + "' will be deleted and no longer available."
}
},
detailsMarkup: "Delete Service?",
message: "An error occurred while deleting provisioned service " + t.metadata.name + ".",
details: e("getErrorDetails")(n)
}), o("An error occurred while deleting provisioned service " + t.metadata.name + ".", n);
});
}, c = function(t) {
var s = {
namespace: t.metadata.namespace
}, c = {
group: "servicecatalog.k8s.io",
resource: "serviceinstancecredentials"
};
a.SERVICE_CATALOG_ENABLED && r.list(c, s, function(a) {
var l = n.getBindingsForResource(a.by("metadata.name"), t);
_.each(l, function(t) {
r.delete(c, t.metadata.name, s).then(function() {
i.addNotification({
type: "success",
message: "Binding " + t.metadata.name + "' was marked for deletion."
});
}).catch(function(n) {
i.addNotification({
type: "error",
message: "Binding " + t.metadata.name + "' could not be deleted.",
details: e("getErrorDetails")(n)
}), o.error("Binding " + t.metadata.name + "' could not be deleted.", n);
});
});
});
};
return {
deprovision: function(e) {
var n, a = {
kind: e.kind,
displayName: e.metadata.name,
okButtonText: "Delete",
okButtonClass: "btn-danger",
cancelButtonText: "Cancel"
cancelButtonText: "Cancel",
delete: function() {
n.close("delete");
}
};
return t.open({
return (n = t.open({
animation: !0,
templateUrl: "views/modals/confirm.html",
templateUrl: "views/modals/delete-resource.html",
controller: "ConfirmModalController",
resolve: {
modalConfig: function() {
return i;
return a;
}
}
}).result.then(function() {
return a.hideNotification("deprovision-service-error"), n.delete({
group: "servicecatalog.k8s.io",
resource: "serviceinstances"
}, r.metadata.name, {
namespace: r.metadata.namespace
}, {
propagationPolicy: null
}).then(function() {
a.addNotification({
type: "success",
message: "Successfully deleted provisioned service " + r.metadata.name + "."
});
}, function(e) {
a.addNotification({
id: "deprovision-service-error",
type: "error",
message: "An error occurred while deleting provisioned service " + r.metadata.name + ".",
details: o(e)
});
});
})).result.then(function() {
c(e), s(e);
});
}
};
Expand Down
7 changes: 5 additions & 2 deletions dist/scripts/templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -5633,7 +5633,7 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
"<status-icon status=\"'Pending'\"></status-icon>Pending\n" +
"</div>\n" +
"</div>\n" +
"<div class=\"service-binding-actions\" ng-if=\"!ctrl.binding.metadata.deletionTimestamp\">\n" +
"<div class=\"service-binding-actions\" ng-if=\"!$ctrl.binding.metadata.deletionTimestamp\">\n" +
"<delete-link ng-if=\"({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'} | canI : 'delete')\" kind=\"ServiceInstanceCredential\" group=\"servicecatalog.k8s.io\" type-display-name=\"binding\" resource-name=\"{{$ctrl.binding.metadata.name}}\" project-name=\"{{$ctrl.binding.metadata.namespace}}\" stay-on-current-page=\"true\">\n" +
"</delete-link>\n" +
"<a ng-if=\"('secrets' | canI : 'get') && ($ctrl.binding | isBindingReady)\" ng-href=\"{{$ctrl.binding.spec.secretName | navigateResourceURL : 'Secret' : $ctrl.namespace}}\">\n" +
Expand Down Expand Up @@ -10801,6 +10801,9 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
"<span ng-if=\"kind === 'ReplicationController' || kind === 'ReplicaSet' || kind === 'StatefulSet'\">\n" +
"This will delete the {{typeDisplayName || (kind | humanizeKind)}} and any running pods.\n" +
"</span>\n" +
"<span ng-if=\"kind === 'ServiceInstance'\">\n" +
"{{displayName ? displayName : resourceName}} and its data will no longer be available to your applications.\n" +
"</span>\n" +
"<span ng-if=\"isProject\">\n" +
"This will <strong>delete all resources</strong> associated with the project {{displayName ? displayName : resourceName}}.\n" +
"</span>\n" +
Expand Down Expand Up @@ -12258,7 +12261,7 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
"<div class=\"section-title hidden-xs\">{{$ctrl.sectionTitle}}</div>\n" +
"<service-binding ng-repeat=\"binding in $ctrl.bindings track by (binding | uid)\" is-overview=\"true\" namespace=\"$ctrl.namespace\" ref-api-object=\"$ctrl.refApiObject\" binding=\"binding\" service-classes=\"$ctrl.serviceClasses\" service-instances=\"$ctrl.serviceInstances\" secrets=\"$ctrl.secrets\">\n" +
"</service-binding>\n" +
"<div ng-if=\"($ctrl.bindableServiceInstances | size) && ({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'} | canI : 'create')\">\n" +
"<div ng-if=\"!$ctrl.refApiObject.metadata.deletionTimestamp && ($ctrl.bindableServiceInstances | size) && ({resource: 'serviceinstancecredentials', group: 'servicecatalog.k8s.io'} | canI : 'create')\">\n" +
"<a href=\"\" ng-click=\"$ctrl.createBinding()\" role=\"button\">\n" +
"<span class=\"pficon pficon-add-circle-o\" aria-hidden=\"true\"></span>\n" +
"Create Binding\n" +
Expand Down

0 comments on commit 5cdf111

Please sign in to comment.