/// /// module Kubernetes { export var Apps = controller("Apps", ["$scope", "KubernetesModel", "KubernetesServices", "KubernetesReplicationControllers", "KubernetesPods", "KubernetesState", "KubernetesApiURL", "$templateCache", "$location", "$routeParams", "$http", "$dialog", "$timeout", ($scope, KubernetesModel: Kubernetes.KubernetesModelService, KubernetesServices:ng.resource.IResourceClass, KubernetesReplicationControllers:ng.resource.IResourceClass, KubernetesPods:ng.resource.IResourceClass, KubernetesState, KubernetesApiURL, $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $dialog, $timeout) => { $scope.model = KubernetesModel; $scope.apps = []; $scope.allApps = []; $scope.kubernetes = KubernetesState; $scope.fetched = false; $scope.json = ''; ControllerHelpers.bindModelToSearchParam($scope, $location, 'id', '_id', undefined); ControllerHelpers.bindModelToSearchParam($scope, $location, 'appSelectorShow', 'openApp', undefined); ControllerHelpers.bindModelToSearchParam($scope, $location, 'mode', 'mode', 'detail'); var branch = $scope.branch || "master"; var namespace = null; function appMatches(app) { var filterText = $scope.appSelector.filterText; if (filterText) { return Core.matchFilterIgnoreCase(app.groupId, filterText) || Core.matchFilterIgnoreCase(app.artifactId, filterText) || Core.matchFilterIgnoreCase(app.name, filterText) || Core.matchFilterIgnoreCase(app.description, filterText); } else { return true; } } function appRunning(app) { return $scope.model.apps.any((running) => running.appPath === app.appPath); } $scope.tableConfig = { data: 'model.apps', showSelectionCheckbox: true, enableRowClickSelection: false, multiSelect: true, selectedItems: [], filterOptions: { filterText: $location.search()["q"] || '' }, columnDefs: [ { field: '$name', displayName: 'App', cellTemplate: $templateCache.get(UrlHelpers.join(templatePath, "appIconTemlate.html")) }, { field: '$servicesText', displayName: 'Services', cellTemplate: $templateCache.get(UrlHelpers.join(templatePath, "appServicesTemplate.html")) }, { field: '$replicationControllersText', displayName: 'Controllers', cellTemplate: $templateCache.get(UrlHelpers.join(templatePath, "appReplicationControllerTemplate.html")) }, { field: '$podCount', displayName: 'Pods', cellTemplate: $templateCache.get(UrlHelpers.join(templatePath, "appPodCountsAndLinkTemplate.html")) }, { field: '$creationDate', displayName: 'Deployed', cellTemplate: $templateCache.get(UrlHelpers.join(templatePath, "appDeployedTemplate.html")) } ] }; Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); $scope.expandedPods = []; $scope.$on('do-resize', ($event, controller) => { $scope.resizeDialog.open(controller); }); $scope.podExpanded = (pod) => { var id = getName(pod) return id && ($scope.expandedPods || []).indexOf(id) >= 0; }; $scope.expandPod = (pod) => { var id = getName(pod); if (id) { $scope.expandedPods.push(id); } }; $scope.collapsePod = (pod) => { var id = getName(pod); if (id) { _.remove($scope.expandedPods, (v) => id === v); } }; $scope.$on('$routeUpdate', ($event) => { Kubernetes.setJson($scope, $location.search()['_id'], $scope.model.apps); }); function deleteApp(app, onCompleteFn) { function deleteServices(services, service, onCompletedFn) { if (!service || !services) { return onCompletedFn(); } var id = getName(service); if (!id) { log.warn("No ID for service " + angular.toJson(service)); } else { KubernetesServices.delete({ id: id }, undefined, () => { log.debug("Deleted service: ", id); deleteServices(services, services.shift(), onCompletedFn); }, (error) => { log.debug("Error deleting service: ", error); deleteServices(services, services.shift(), onCompletedFn); }); } } function deleteReplicationControllers(replicationControllers, replicationController, onCompletedFn) { if (!replicationController || !replicationControllers) { return onCompletedFn(); } var id = getName(replicationController); if (!id) { log.warn("No ID for replicationController " + angular.toJson(replicationController)); } else { KubernetesReplicationControllers.delete({ id: id }, undefined, () => { log.debug("Deleted replicationController: ", id); deleteReplicationControllers(replicationControllers, replicationControllers.shift(), onCompletedFn); }, (error) => { log.debug("Error deleting replicationController: ", error); deleteReplicationControllers(replicationControllers, replicationControllers.shift(), onCompletedFn); }); } } function deletePods(pods, pod, onCompletedFn) { if (!pod || !pods) { return onCompletedFn(); } var id = getName(pod); if (!id) { log.warn("No ID for pod " + angular.toJson(pod)); } else { KubernetesPods.delete({ id: id }, undefined, () => { log.debug("Deleted pod: ", id); deletePods(pods, pods.shift(), onCompletedFn); }, (error) => { log.debug("Error deleting pod: ", error); deletePods(pods, pods.shift(), onCompletedFn); }); } } var services = [].concat(app.services); deleteServices(services, services.shift(), () => { var replicationControllers = [].concat(app.replicationControllers); deleteReplicationControllers(replicationControllers, replicationControllers.shift(), () => { var pods = [].concat(app.pods); deletePods(pods, pods.shift(), onCompleteFn); }); }); } $scope.deleteSingleApp = (app) => { $scope.deletePrompt([app]); } $scope.deletePrompt = (selected) => { if (angular.isString(selected)) { selected = [{ id: selected }]; } UI.multiItemConfirmActionDialog({ collection: selected, index: '$name', onClose: (result:boolean) => { if (result) { function deleteSelected(selected, next) { if (next) { var id = next.name; log.debug("deleting: ", id); deleteApp(next, () => { log.debug("deleted: ", id); deleteSelected(selected, selected.shift()); }); } } deleteSelected(selected, selected.shift()); } }, title: 'Delete Apps?', action: 'The following Apps will be deleted:', okText: 'Delete', okClass: 'btn-danger', custom: "This operation is permanent once completed!", customClass: "alert alert-warning" }).open(); }; $scope.appSelector = { filterText: "", folders: [], selectedApps: [], isOpen: (folder) => { if ($scope.appSelector.filterText !== '' || folder.expanded) { return "opened"; } return "closed"; }, getSelectedClass: (app) => { if (app.abstract) { return "abstract"; } if (app.selected) { return "selected"; } return ""; }, showApp: (app) => { return appMatches(app) && !appRunning(app); }, showFolder: (folder) => { return !$scope.appSelector.filterText || folder.apps.some((app) => appMatches(app) && !appRunning(app)); }, clearSelected: () => { angular.forEach($scope.model.appFolders, (folder) => { angular.forEach(folder.apps, (app) => { app.selected = false; }); }); $scope.appSelector.selectedApps = []; Core.$apply($scope); }, updateSelected: () => { // lets update the selected apps var selectedApps = []; angular.forEach($scope.model.appFolders, (folder) => { var apps = folder.apps.filter((app) => app.selected); if (apps) { selectedApps = selectedApps.concat(apps); } }); $scope.appSelector.selectedApps = _.sortBy(selectedApps, "name"); }, select: (app, flag) => { app.selected = flag; $scope.appSelector.updateSelected(); }, hasSelection: () => { return $scope.model.appFolders.any((folder) => folder.apps.any((app) => app.selected)); }, runSelectedApps: () => { // lets run all the selected apps angular.forEach($scope.appSelector.selectedApps, (app) => { var name = app.name; var metadataPath = app.metadataPath; if (metadataPath) { // lets load the json/yaml //var url = gitPathToUrl(Wiki.gitRelativeURL(branch, metadataPath)); var url = gitPathToUrl(metadataPath, branch); if (url) { $http.get(url). success(function (data, status, headers, config) { if (data) { // lets convert the json object structure into a string var json = angular.toJson(data); var fn = () => {}; Kubernetes.runApp($location, $scope, $http, KubernetesApiURL, json, name, fn, namespace); } }). error(function (data, status, headers, config) { $scope.summaryHtml = null; log.warn("Failed to load " + url + " " + data + " " + status); }); } } }); // lets go back to the apps view $scope.appSelector.clearSelected(); $scope.appSelectorShow = false; } }; }]); }