From 681ebf0f7cff186a0a4e84a0e4b6daf119a65afc Mon Sep 17 00:00:00 2001 From: Fabiano Franz Date: Fri, 7 Aug 2015 18:21:15 -0300 Subject: [PATCH 1/3] Deploy, rollback, retry and cancel deployments from the web console --- assets/app/scripts/controllers/builds.js | 18 +- assets/app/scripts/controllers/deployments.js | 232 ++++++- assets/app/scripts/filters/resources.js | 38 +- assets/app/scripts/filters/util.js | 15 + assets/app/scripts/services/data.js | 32 + assets/app/styles/_components.less | 38 +- assets/app/views/deployments.html | 164 +++-- pkg/assets/bindata.go | 590 +++++++++++++----- 8 files changed, 882 insertions(+), 245 deletions(-) diff --git a/assets/app/scripts/controllers/builds.js b/assets/app/scripts/controllers/builds.js index 8552257b2d04..276eb863177f 100644 --- a/assets/app/scripts/controllers/builds.js +++ b/assets/app/scripts/controllers/builds.js @@ -129,7 +129,7 @@ angular.module('openshiftConsole') { type: "error", message: "An error occurred while starting the build.", - details: getErrorDetails(result) + details: $filter('getErrorDetails')(result) } ]; } @@ -159,7 +159,7 @@ angular.module('openshiftConsole') { type: "error", message: "An error occurred while rerunning the build.", - details: getErrorDetails(result) + details: $filter('getErrorDetails')(result) } ]; } @@ -175,20 +175,6 @@ angular.module('openshiftConsole') }); }); - function getErrorDetails(result) { - var error = result.data || {}; - if (error.message) { - return error.message; - } - - var status = result.status || error.status; - if (status) { - return "Status: " + status; - } - - return ""; - } - $scope.$on('$destroy', function(){ DataService.unwatchAll(watches); }); diff --git a/assets/app/scripts/controllers/deployments.js b/assets/app/scripts/controllers/deployments.js index c88b522161c7..53d527afa5bb 100644 --- a/assets/app/scripts/controllers/deployments.js +++ b/assets/app/scripts/controllers/deployments.js @@ -30,7 +30,7 @@ angular.module('openshiftConsole') }); } - watches.push(DataService.watch("replicationcontrollers", $scope, function(deployments) { + watches.push(DataService.watch("replicationcontrollers", $scope, function(deployments, action, deployment) { $scope.unfilteredDeployments = deployments.by("metadata.name"); LabelFilter.addLabelSuggestionsFromResources($scope.unfilteredDeployments, $scope.labelSuggestions); LabelFilter.setLabelSuggestions($scope.labelSuggestions); @@ -41,6 +41,27 @@ angular.module('openshiftConsole') associateDeploymentsToDeploymentConfig(); updateFilterWarning(); + var deploymentConfigName; + var deploymentName; + if (deployment) { + deploymentConfigName = $filter('annotation')(deployment, 'deploymentConfig'); + deploymentName = deployment.metadata.name; + } + if (!action) { + // Loading of the page that will create deploymentConfigDeploymentsInProgress structure, which will associate running deployment to his deploymentConfig. + $scope.deploymentConfigDeploymentsInProgress = associateRunningDeploymentToDeploymentConfig($scope.deploymentsByDeploymentConfig); + } else if (action === 'ADDED' || (action === 'MODIFIED' && ['New', 'Pending', 'Running'].indexOf($scope.deploymentStatus(deployment)) > -1)) { + // When new deployment id instantiated/cloned, or in case of a retry, associate him to his deploymentConfig and add him into deploymentConfigDeploymentsInProgress structure. + $scope.deploymentConfigDeploymentsInProgress[deploymentConfigName] = $scope.deploymentConfigDeploymentsInProgress[deploymentConfigName] || {}; + $scope.deploymentConfigDeploymentsInProgress[deploymentConfigName][deploymentName] = deployment; + } else if (action === 'MODIFIED') { + // After the deployment ends remove him from the deploymentConfigDeploymentsInProgress structure. + var deploymentStatus = $scope.deploymentStatus(deployment); + if (deploymentStatus === "Complete" || deploymentStatus === "Failed"){ + delete $scope.deploymentConfigDeploymentsInProgress[deploymentConfigName][deploymentName]; + } + } + Logger.log("deployments (subscribe)", $scope.deployments); })); @@ -73,6 +94,20 @@ angular.module('openshiftConsole') }); } + function associateRunningDeploymentToDeploymentConfig(deploymentsByDeploymentConfig) { + var deploymentConfigDeploymentsInProgress = {}; + angular.forEach(deploymentsByDeploymentConfig, function(deploymentConfigDeployments, deploymentConfigName) { + deploymentConfigDeploymentsInProgress[deploymentConfigName] = {}; + angular.forEach(deploymentConfigDeployments, function(deployment, deploymentName) { + var deploymentStatus = $scope.deploymentStatus(deployment); + if (deploymentStatus === "New" || deploymentStatus === "Pending" || deploymentStatus === "Running") { + deploymentConfigDeploymentsInProgress[deploymentConfigName][deploymentName] = deployment; + } + }); + }); + return deploymentConfigDeploymentsInProgress; + } + function updateFilterWarning() { if (!LabelFilter.getLabelSelector().isEmpty() && $.isEmptyObject($scope.deployments) && !$.isEmptyObject($scope.unfilteredDeployments)) { $scope.alerts["deployments"] = { @@ -85,6 +120,201 @@ angular.module('openshiftConsole') } } + $scope.startLatestDeployment = function(deploymentConfigName) { + var deploymentConfig = $scope.deploymentConfigs[deploymentConfigName]; + + // increase latest version by one so starts new deployment based on latest + var req = { + kind: "DeploymentConfig", + apiVersion: "v1", + metadata: deploymentConfig.metadata, + spec: deploymentConfig.spec, + status: deploymentConfig.status + }; + if (!req.status.latestVersion) { + req.status.latestVersion = 0; + } + req.status.latestVersion++; + + // update the deployment config + DataService.update("deploymentconfigs", deploymentConfigName, req, $scope).then( + function() { + $scope.alerts = [ + { + type: "success", + message: "Deployment #" + req.status.latestVersion + " of " + deploymentConfigName + " has started.", + } + ]; + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred while starting the deployment.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + }; + + $scope.retryFailedDeployment = function(deploymentConfigName, deploymentName) { + var deployment = $scope.deploymentsByDeploymentConfig[deploymentConfigName][deploymentName]; + var req = deployment; + + // delete the deployer pod as well as the deployment hooks pods, if any + DataService.list("pods", $scope, function(list) { + var pods = list.by("metadata.name"); + var deleteDeployerPod = function(pod) { + var deployerPodForAnnotation = $filter('annotationName')('deployerPodFor'); + if (pod.metadata.labels[deployerPodForAnnotation] === deploymentName) { + DataService.delete("pods", pod.metadata.name, $scope).then( + function() { + Logger.info("Deployer pod " + pod.metadata.name + " deleted"); + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred while deleting the deployer pod.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + } + }; + angular.forEach(pods, deleteDeployerPod); + }); + + // set deployment to "New" and remove statuses so we can retry + var deploymentStatusAnnotation = $filter('annotationName')('deploymentStatus'); + var deploymentStatusReasonAnnotation = $filter('annotationName')('deploymentStatusReason'); + var deploymentCancelledAnnotation = $filter('annotationName')('deploymentCancelled'); + req.metadata.annotations[deploymentStatusAnnotation] = "New"; + delete req.metadata.annotations[deploymentStatusReasonAnnotation]; + delete req.metadata.annotations[deploymentCancelledAnnotation]; + + // update the deployment + DataService.update("replicationcontrollers", deploymentName, req, $scope).then( + function() { + $scope.alerts = [ + { + type: "success", + message: "Retrying deployment " + deploymentName + " of " + deploymentConfigName + ".", + } + ]; + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred while retrying the deployment.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + }; + + $scope.rollbackToDeployment = function(deploymentConfigName, deploymentName, changeScaleSettings, changeStrategy, changeTriggers) { + // put together a new rollback request + var req = { + kind: "DeploymentConfigRollback", + apiVersion: "v1", + spec: { + from: { + name: deploymentName + }, + includeTemplate: true, + includeReplicationMeta: changeScaleSettings, + includeStrategy: changeStrategy, + includeTriggers: changeTriggers + } + }; + + // create the deployment config rollback + DataService.create("deploymentconfigrollbacks", null, req, $scope).then( + function(newDeploymentConfig) { + // update the deployment config based on the one returned by the rollback + DataService.update("deploymentconfigs", deploymentConfigName, newDeploymentConfig, $scope).then( + function(rolledBackDeploymentConfig) { + $scope.alerts = [ + { + type: "success", + message: "Deployment #" + rolledBackDeploymentConfig.status.latestVersion + " is rolling back " + deploymentConfigName + " to " + deploymentName + ".", + } + ]; + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred while rolling back the deployment.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred while rolling back the deployment.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + }; + + $scope.cancelRunningDeployment = function(deploymentConfigName, deploymentName) { + var deployment = $scope.deploymentsByDeploymentConfig[deploymentConfigName][deploymentName]; + var req = deployment; + + // set the cancellation annotations + var deploymentCancelledAnnotation = $filter('annotationName')('deploymentCancelled'); + var deploymentStatusReasonAnnotation = $filter('annotationName')('deploymentStatusReason'); + req.metadata.annotations[deploymentCancelledAnnotation] = "true"; + req.metadata.annotations[deploymentStatusReasonAnnotation] = "The deployment was cancelled by the user"; + + // update the deployment with cancellation annotations + DataService.update("replicationcontrollers", deploymentName, req, $scope).then( + function() { + $scope.alerts = [ + { + type: "success", + message: "Cancelling deployment " + deploymentName + " of " + deploymentConfigName + ".", + } + ]; + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred while cancelling the deployment.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + }; + + $scope.deploymentIsLatest = function(deploymentConfig, deployment) { + var deploymentVersion = parseInt($filter('annotation')(deployment, 'deploymentVersion')); + var deploymentConfigVersion = deploymentConfig.status.latestVersion; + return deploymentVersion === deploymentConfigVersion; + }; + + $scope.deploymentStatus = function(deployment) { + return $filter('annotation')(deployment, 'deploymentStatus'); + }; + + $scope.deploymentIsInProgress = function(deployment) { + return ['New', 'Pending', 'Running'].indexOf($scope.deploymentStatus(deployment)) > -1; + }; + LabelFilter.onActiveFiltersChanged(function(labelSelector) { // trigger a digest loop $scope.$apply(function() { diff --git a/assets/app/scripts/filters/resources.js b/assets/app/scripts/filters/resources.js index 26ec17fc9e51..fda74799ac26 100644 --- a/assets/app/scripts/filters/resources.js +++ b/assets/app/scripts/filters/resources.js @@ -14,20 +14,28 @@ angular.module('openshiftConsole') } }; }) - .filter('annotation', function() { - // This maps an annotation key to all known synonymous keys to insulate - // the referring code from key renames across API versions. - var annotationMap = { - "deploymentConfig": ["openshift.io/deployment-config.name"], - "deployment": ["openshift.io/deployment.name"], - "pod": ["openshift.io/deployer-pod.name"], - "deploymentStatus": ["openshift.io/deployment.phase"], - "encodedDeploymentConfig": ["openshift.io/encoded-deployment-config"], - "deploymentVersion": ["openshift.io/deployment-config.latest-version"], - "displayName": ["openshift.io/display-name"], - "description": ["openshift.io/description"], - "buildNumber": ["openshift.io/build.number"] - }; + .filter('annotationName', function() { + return function(annotationKey) { + // This maps an annotation key to all known synonymous keys to insulate + // the referring code from key renames across API versions. + var annotationMap = { + "deploymentConfig": ["openshift.io/deployment-config.name"], + "deployment": ["openshift.io/deployment.name"], + "pod": ["openshift.io/deployer-pod.name"], + "deployerPodFor": ["openshift.io/deployer-pod-for.name"], + "deploymentStatus": ["openshift.io/deployment.phase"], + "deploymentStatusReason": ["openshift.io/deployment.status-reason"], + "deploymentCancelled": ["openshift.io/deployment.cancelled"], + "encodedDeploymentConfig": ["openshift.io/encoded-deployment-config"], + "deploymentVersion": ["openshift.io/deployment-config.latest-version"], + "displayName": ["openshift.io/display-name"], + "description": ["openshift.io/description"], + "buildNumber": ["openshift.io/build.number"] + }; + return annotationMap[annotationKey] || null; + }; + }) + .filter('annotation', function(annotationNameFilter) { return function(resource, key) { if (resource && resource.metadata && resource.metadata.annotations) { // If the key's already in the annotation map, return it. @@ -35,7 +43,7 @@ angular.module('openshiftConsole') return resource.metadata.annotations[key]; } // Try and return a value for a mapped key. - var mappings = annotationMap[key] || []; + var mappings = annotationNameFilter(key) || []; for (var i=0; i < mappings.length; i++) { var mappedKey = mappings[i]; if (resource.metadata.annotations[mappedKey] !== undefined) { diff --git a/assets/app/scripts/filters/util.js b/assets/app/scripts/filters/util.js index f7a4c5e1a247..dd6c4096f9da 100644 --- a/assets/app/scripts/filters/util.js +++ b/assets/app/scripts/filters/util.js @@ -249,4 +249,19 @@ angular.module('openshiftConsole') return limitToFilter(input, limit); }; + }) + .filter("getErrorDetails", function() { + return function(result) { + var error = result.data || {}; + if (error.message) { + return error.message; + } + + var status = result.status || error.status; + if (status) { + return "Status: " + status; + } + + return ""; + }; }); diff --git a/assets/app/scripts/services/data.js b/assets/app/scripts/services/data.js index 85a56bab7fc9..06545bfffaea 100644 --- a/assets/app/scripts/services/data.js +++ b/assets/app/scripts/services/data.js @@ -166,6 +166,38 @@ angular.module('openshiftConsole') return deferred.promise; }; +// resource: API resource (e.g. "pods") +// name: API name, the unique name for the object +// object: API object data(eg. { kind: "Build", parameters: { ... } } ) +// context: API context (e.g. {project: "..."}) +// opts: http - options to pass to the inner $http call +// Returns a promise resolved with response data or rejected with {data:..., status:..., headers:..., config:...} when the delete call completes. + DataService.prototype.update = function(resource, name, object, context, opts) { + resource = normalizeResource(resource); + opts = opts || {}; + var deferred = $q.defer(); + var self = this; + this._getNamespace(resource, context, opts).then(function(ns){ + $http(angular.extend({ + method: 'PUT', + data: object, + url: self._urlForResource(resource, name, object.apiVersion, context, false, ns) + }, opts.http || {})) + .success(function(data, status, headerFunc, config, statusText) { + deferred.resolve(data); + }) + .error(function(data, status, headers, config) { + deferred.reject({ + data: data, + status: status, + headers: headers, + config: config + }); + }); + }); + return deferred.promise; + }; + // resource: API resource (e.g. "pods") // name: API name, the unique name for the object. // In case the name of the Object is provided, expected format of 'resource' parameter is 'resource/subresource', eg: 'buildconfigs/instantiate'. diff --git a/assets/app/styles/_components.less b/assets/app/styles/_components.less index f27d0f296338..6646c8d295c5 100644 --- a/assets/app/styles/_components.less +++ b/assets/app/styles/_components.less @@ -329,18 +329,50 @@ } } +.deployment-well { + &:not(.active) { + background-color: white; + } + &:not(.detailed) { + padding-top: 12px; + padding-bottom: 12px; + .deployment-summary { + h3 { + margin-bottom: 5px; + text-transform: lowercase; + } + .deployment-summary-status { + font-size: 90%; + margin-left: 7px; + } + .deployment-summary-toggler { + float: right !important; + font-size: 80%; + } + } + .deployment-details { + display: none; + } + } + &.detailed { + .deployment-summary-status, .deployment-summary-toggler { + display: none; + } + } +} + .popover { min-width: 300px; font-size: 13px; line-height: 1.66667; } -.build-well, .pod-well { +.build-well, .pod-well, .deployment-well { overflow: hidden; margin-bottom: 10px; - .build-detail, .pod-detail { + .build-detail, .pod-detail, .deployment-detail { margin-bottom: 3px; - .build-detail-label, .pod-detail-label { + .build-detail-label, .pod-detail-label, .deployment-detail-label { margin-right: 10px; } } diff --git a/assets/app/views/deployments.html b/assets/app/views/deployments.html index 04c1bf794643..eefdcf433750 100644 --- a/assets/app/views/deployments.html +++ b/assets/app/views/deployments.html @@ -45,14 +45,14 @@

Template:

Triggers:

- +
Manual (CLI): @@ -82,68 +82,115 @@

Triggers:

+ + -
+
+
+

{{deployment.metadata.name}} - (latest) + (active) + + + + failed : {{deployment | annotation:'deploymentStatusReason'}} + + deployed + {{deploymentStatus(deployment)}} since + + + details

-
-
Created:
-
+
+ +
+
+
+
+ Status: + + + + + + + + {{deploymentStatus(deployment)}} + + +
+ Use the following settings from {{deployment.metadata.name}}: +
+ +
+
+ +
+
+ +
+ +
+ + +
-
- -
Status:
-
- {{deployment | annotation:'deploymentStatus'}} - - for - for - for - - - - - - -
+
+ Created: +
+
+ Status reason: + {{deployment | annotation:'deploymentStatusReason'}} +
+
+ Duration: + + running for + waiting for
-
-
Labels:
-
- none - {{labelKey}}={{labelValue}}, -
+
+ Labels: + none + {{labelKey}}={{labelValue}},
-
-
Selectors:
-
- none - {{labelKey}}={{labelValue}}, -
+
+ Selectors: + none + {{labelKey}}={{labelValue}},
-
-
Replicas:
-
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
+
+ Replicas: + {{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
-
-
Pod Template:
-
- -
+
+ Pod template: +
-
- - - +
+
+ +
@@ -167,7 +214,7 @@

-
+

{{deployment.metadata.name}}

@@ -179,13 +226,13 @@

Status:
- {{deployment | annotation:'deploymentStatus'}} - + {{deploymentStatus(deployment)}} + for for for - + @@ -213,7 +260,6 @@

Pod Template:
-
-1) a.deploymentConfigDeploymentsInProgress[m] = a.deploymentConfigDeploymentsInProgress[m] || {}, a.deploymentConfigDeploymentsInProgress[m][n] = l; else if ("MODIFIED" === k) { +var o = a.deploymentStatus(l); +("Complete" === o || "Failed" === o) && delete a.deploymentConfigDeploymentsInProgress[m][n]; +} +} else a.deploymentConfigDeploymentsInProgress = i(a.deploymentsByDeploymentConfig); +e.log("deployments (subscribe)", a.deployments); +})), k.push(b.watch("deploymentconfigs", a, function(b) { a.deploymentConfigs = b.by("metadata.name"), e.log("deploymentconfigs (subscribe)", a.deploymentConfigs); -})), j.push(b.watch("imagestreams", a, function(b) { +})), k.push(b.watch("imagestreams", a, function(b) { a.imageStreams = b.by("metadata.name"), f.buildDockerRefMapForImageStreams(a.imageStreams, a.imageStreamImageRefByDockerReference), f.fetchReferencedImageStreamImages(a.podTemplates, a.imagesByDockerReference, a.imageStreamImageRefByDockerReference, a), e.log("imagestreams (subscribe)", a.imageStreams); -})), j.push(b.watch("builds", a, function(b) { +})), k.push(b.watch("builds", a, function(b) { a.builds = b.by("metadata.name"), e.log("builds (subscribe)", a.builds); -})), d.onActiveFiltersChanged(function(b) { +})), a.startLatestDeployment = function(d) { +var e = a.deploymentConfigs[d], f = { +kind:"DeploymentConfig", +apiVersion:"v1", +metadata:e.metadata, +spec:e.spec, +status:e.status +}; +f.status.latestVersion || (f.status.latestVersion = 0), f.status.latestVersion++, b.update("deploymentconfigs", d, f, a).then(function() { +a.alerts = [ { +type:"success", +message:"Deployment #" + f.status.latestVersion + " of " + d + " has started." +} ]; +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred while starting the deployment.", +details:c("getErrorDetails")(b) +} ]; +}); +}, a.retryFailedDeployment = function(d, f) { +var g = a.deploymentsByDeploymentConfig[d][f], h = g; +b.list("pods", a, function(d) { +var g = d.by("metadata.name"), h = function(d) { +var g = c("annotationName")("deployerPodFor"); +d.metadata.labels[g] === f && b["delete"]("pods", d.metadata.name, a).then(function() { +e.info("Deployer pod " + d.metadata.name + " deleted"); +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred while deleting the deployer pod.", +details:c("getErrorDetails")(b) +} ]; +}); +}; +angular.forEach(g, h); +}); +var i = c("annotationName")("deploymentStatus"), j = c("annotationName")("deploymentStatusReason"), k = c("annotationName")("deploymentCancelled"); +h.metadata.annotations[i] = "New", delete h.metadata.annotations[j], delete h.metadata.annotations[k], b.update("replicationcontrollers", f, h, a).then(function() { +a.alerts = [ { +type:"success", +message:"Retrying deployment " + f + " of " + d + "." +} ]; +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred while retrying the deployment.", +details:c("getErrorDetails")(b) +} ]; +}); +}, a.rollbackToDeployment = function(d, e, f, g, h) { +var i = { +kind:"DeploymentConfigRollback", +apiVersion:"v1", +spec:{ +from:{ +name:e +}, +includeTemplate:!0, +includeReplicationMeta:f, +includeStrategy:g, +includeTriggers:h +} +}; +b.create("deploymentconfigrollbacks", null, i, a).then(function(f) { +b.update("deploymentconfigs", d, f, a).then(function(b) { +a.alerts = [ { +type:"success", +message:"Deployment #" + b.status.latestVersion + " is rolling back " + d + " to " + e + "." +} ]; +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred while rolling back the deployment.", +details:c("getErrorDetails")(b) +} ]; +}); +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred while rolling back the deployment.", +details:c("getErrorDetails")(b) +} ]; +}); +}, a.cancelRunningDeployment = function(d, e) { +var f = a.deploymentsByDeploymentConfig[d][e], g = f, h = c("annotationName")("deploymentCancelled"), i = c("annotationName")("deploymentStatusReason"); +g.metadata.annotations[h] = "true", g.metadata.annotations[i] = "The deployment was cancelled by the user", b.update("replicationcontrollers", e, g, a).then(function() { +a.alerts = [ { +type:"success", +message:"Cancelling deployment " + e + " of " + d + "." +} ]; +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred while cancelling the deployment.", +details:c("getErrorDetails")(b) +} ]; +}); +}, a.deploymentIsLatest = function(a, b) { +var d = parseInt(c("annotation")(b, "deploymentVersion")), e = a.status.latestVersion; +return d === e; +}, a.deploymentStatus = function(a) { +return c("annotation")(a, "deploymentStatus"); +}, a.deploymentIsInProgress = function(b) { +return [ "New", "Pending", "Running" ].indexOf(a.deploymentStatus(b)) > -1; +}, d.onActiveFiltersChanged(function(b) { a.$apply(function() { -a.deployments = b.select(a.unfilteredDeployments), h(), i(); +a.deployments = b.select(a.unfilteredDeployments), h(), j(); }); }), a.$on("$destroy", function() { -b.unwatchAll(j); +b.unwatchAll(k); }); } ]), angular.module("openshiftConsole").controller("ServicesController", [ "$scope", "DataService", "$filter", "LabelFilter", "Logger", "$location", "$anchorScroll", function(a, b, c, d, e, f, g) { function h(a) { @@ -16498,22 +16684,29 @@ return moment(a.metadata.creationTimestamp).diff(moment(b.metadata.creationTimes return function(a) { return a && a.metadata && a.metadata.uid ? a.metadata.uid :a; }; -}).filter("annotation", function() { -var a = { +}).filter("annotationName", function() { +return function(a) { +var b = { deploymentConfig:[ "openshift.io/deployment-config.name" ], deployment:[ "openshift.io/deployment.name" ], pod:[ "openshift.io/deployer-pod.name" ], +deployerPodFor:[ "openshift.io/deployer-pod-for.name" ], deploymentStatus:[ "openshift.io/deployment.phase" ], +deploymentStatusReason:[ "openshift.io/deployment.status-reason" ], +deploymentCancelled:[ "openshift.io/deployment.cancelled" ], encodedDeploymentConfig:[ "openshift.io/encoded-deployment-config" ], deploymentVersion:[ "openshift.io/deployment-config.latest-version" ], displayName:[ "openshift.io/display-name" ], description:[ "openshift.io/description" ], buildNumber:[ "openshift.io/build.number" ] }; +return b[a] || null; +}; +}).filter("annotation", [ "annotationNameFilter", function(a) { return function(b, c) { if (b && b.metadata && b.metadata.annotations) { if (void 0 !== b.metadata.annotations[c]) return b.metadata.annotations[c]; -for (var d = a[c] || [], e = 0; e < d.length; e++) { +for (var d = a(c) || [], e = 0; e < d.length; e++) { var f = d[e]; if (void 0 !== b.metadata.annotations[f]) return b.metadata.annotations[f]; } @@ -16521,7 +16714,7 @@ return null; } return null; }; -}).filter("imageStreamTagAnnotation", function() { +} ]).filter("imageStreamTagAnnotation", function() { return function(a, b, c) { if (c = c || "latest", a && a.spec && a.spec.tags) for (var d = a.spec.tags, e = 0; e < d.length; ++e) { var f = d[e]; @@ -16991,7 +17184,14 @@ return a ? a.replace(/^sha256:/, "") :a; return function(b, c) { return isNaN(c) ? b :a(b, c); }; -} ]), angular.module("openshiftConsoleExtensions", [ "openshiftConsole" ]).factory("ProxyPod", [ "DataService", function(a) { +} ]).filter("getErrorDetails", function() { +return function(a) { +var b = a.data || {}; +if (b.message) return b.message; +var c = a.status || b.status; +return c ? "Status: " + c :""; +}; +}), angular.module("openshiftConsoleExtensions", [ "openshiftConsole" ]).factory("ProxyPod", [ "DataService", function(a) { return function(b, c, d) { return d && (c = c + ":" + d), new URI(a.url({ resource:"pods/proxy", @@ -17043,7 +17243,7 @@ a.put("views/catalog/images.html", '
\n < a.put("views/create.html", '
\n
\n
\n \n
\n
\n

Create Using Your Code

\n
\n

Create your application from a Git source code repository. Optionally specify a branch, tag, or commit ID with #ref.

\n
\n
\n
\n \n \n \n \n \n \n
\n
For example, https://github.com/openshift/nodejs-ex#master\n Try it out!
\n Source repository should be a URL\n
\n
\n
\n\n
\n
\n
\n

Create Using a Template

\n

Templates have predefined resources for quickly creating components. You can customize some options in the next step.

\n

Instant Apps

\n
Loading...
\n
\n There are no instant apps available.\n
\n
\n \n \n
\n \n
\n

Other Templates

\n
\n \n \n
\n
\n
\n To load additional templates into this project, run the command\n oc create -f <template-filename> -n {{projectName}}\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/create/fromimage.html", '
\n
\n \n
\n
\n
\n
\n \n
\n \n
\n
\n

\n Name\n

\n
\n \n
\n

Used to uniquely identify within this project all the resources created to support the application.

\n
\n Please enter a valid name.\n

A valid name is applied to all generated resources. It is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the \'-\' character is allowed anywhere except the first or last character.

\n
\n
\n
\n A name is required.\n
\n
\n The name must have at least 2 characters.\n
\n
\n This name is already in use within the project. Please choose a different name.\n
\n
\n\n
\n \n After creation, these settings can only be modified through the oc command.\n
\n\n \n
\n
\n \n {{routing | yesNo}}\n
\n
\n
\n
\n \n
\n
\n
\n\n \n\n \n
\n

Autodeploy when

\n
\n \n {{deploymentConfig.deployOnNewImage | yesNo}}\n
\n
\n \n {{deploymentConfig.deployOnConfigChange | yesNo}}\n
\n

Environment Variables \n \n \n \n

\n \n \n
\n
\n

Autodeploy when

\n
\n \n
\n
\n \n
\n
\n

Environment Variables \n \n \n \n

\n \n
\n
\n
\n\n \n\n \n
\n
\n \n {{buildConfig.sourceUrl | defaultIfBlank: "Not Specified"}}\n
\n
\n \n {{buildConfig.buildOnSourceChange | yesNo}}\n
\n
\n \n {{buildConfig.buildOnImageChange | yesNo}}\n
\n
\n \n {{buildConfig.buildOnConfigChange | yesNo}}\n
\n
\n
\n
\n \n {{buildConfig.sourceUrl}}\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n\n \n\n \n
\n
\n \n {{scaling.replicas}}\n
\n
\n
\n \n
\n Replicas must be an integer value greater than or equal to 0\n
\n
\n
\n\n \n\n \n
\n \n \n Cancel\n
\n
\n
\n {{ emptyMessage }}\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/createProject.html", '
\n
\n
\n

New Project

\n
\n
\n \n \n \n \n
\n A unique name for the project.\n
\n
\n \n Project names may only contain lower-case letters, numbers, and dashes.\n They may not start or end with a dash.\n
\n
\n This name is already\n in use. Please choose a different name.\n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Cancel\n
\n
\n
\n
\n
'), -a.put("views/deployments.html", '
\n \n
\n \n \n
\n {{emptyMessage}}\n
\n\n
\n
\n

{{deploymentConfigName}}

\n
\n
\n
Created:
\n
\n
\n
\n
Labels:
none
\n
{{labelKey}}={{labelValue}},
\n
\n
\n
Latest Version:
\n
{{deploymentConfig.status.latestVersion}}
\n
\n
\n
Strategy:
\n
{{deploymentConfig.spec.strategy.type}}
\n \n
\n\n
\n

Template:

\n
\n
Selectors:
none
\n
{{selectorLabel}}={{selectorValue}},
\n
Replicas:
\n
\n {{deploymentConfig.spec.replicas}}\n
\n
\n
\n\n
\n

Triggers:

\n \n\n
\n
Manual (CLI):\n \n Learn more \n \n
\n
\n oc deploy {{deploymentConfigName}} --latest -n {{project.metadata.name}}\n \n
\n
\n\n
\n
\n \n {{trigger.type}}\n \n
New image for:
\n
{{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}}
\n
\n \n
Change of:
\n
Config
\n
\n
\n
\n
\n
\n \n
\n

\n {{deployment.metadata.name}}\n (latest)\n

\n
\n
Created:
\n
\n
\n
\n \n
Status:
\n
\n {{deployment | annotation:\'deploymentStatus\'}}\n \n for \n for \n for \n \n \n \n \n \n \n
\n
\n
\n
\n
Labels:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Selectors:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Replicas:
\n
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
\n
\n
\n
Pod Template:
\n
\n \n
\n
\n
\n\n \n
\n
\n
\n\n \n
\n
\n

\n {{deploymentConfigName}}\n \n \n \n \n \n \n

\n
\n
\n

\n {{deployment.metadata.name}}\n

\n
\n
Created:
\n
\n
\n
\n \n
Status:
\n
\n {{deployment | annotation:\'deploymentStatus\'}}\n \n for \n for \n for \n \n \n \n \n \n \n
\n
\n
\n
\n
Labels:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Selectors:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Replicas:
\n
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
\n
\n
\n
Pod Template:
\n\n
\n \n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
'), +a.put("views/deployments.html", '
\n \n
\n \n \n
\n {{emptyMessage}}\n
\n\n
\n
\n

{{deploymentConfigName}}

\n
\n
\n
Created:
\n
\n
\n
\n
Labels:
none
\n
{{labelKey}}={{labelValue}},
\n
\n
\n
Latest Version:
\n
{{deploymentConfig.status.latestVersion}}
\n
\n
\n
Strategy:
\n
{{deploymentConfig.spec.strategy.type}}
\n \n
\n\n
\n

Template:

\n
\n
Selectors:
none
\n
{{selectorLabel}}={{selectorValue}},
\n
Replicas:
\n
\n {{deploymentConfig.spec.replicas}}\n
\n
\n
\n\n
\n

Triggers:

\n
\n
Manual:
\n
\n \n \n \n
\n
\n\n
\n
Manual (CLI):\n \n Learn more \n \n
\n
\n oc deploy {{deploymentConfigName}} --latest -n {{project.metadata.name}}\n \n
\n
\n\n
\n
\n \n {{trigger.type}}\n \n
New image for:
\n
{{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}}
\n
\n \n
Change of:
\n
Config
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n

\n {{deployment.metadata.name}}\n (active)\n \n \n \n failed : {{deployment | annotation:\'deploymentStatusReason\'}}\n \n deployed \n {{deploymentStatus(deployment)}} since \n \n \n details\n

\n
\n \n
\n
\n
\n
\n Status:\n \n \n \n \n \n \n \n {{deploymentStatus(deployment)}}\n \n \n
\n Use the following settings from {{deployment.metadata.name}}: \n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n \n \n
\n
\n
\n Created:\n
\n
\n Status reason:\n {{deployment | annotation:\'deploymentStatusReason\'}}\n
\n
\n Duration:\n \n running for \n waiting for \n \n
\n
\n Labels:\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n Selectors:\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n Replicas:\n {{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired\n
\n
\n Pod template:\n \n
\n
\n
\n
\n\n \n
\n\n \n
\n
\n

\n {{deploymentConfigName}}\n \n \n \n \n \n \n

\n
\n
\n

\n {{deployment.metadata.name}}\n

\n
\n
Created:
\n
\n
\n
\n \n
Status:
\n
\n {{deploymentStatus(deployment)}}\n \n for \n for \n for \n \n \n \n \n \n \n
\n
\n
\n
\n
Labels:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Selectors:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Replicas:
\n
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
\n
\n
\n
Pod Template:
\n
\n \n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/directives/_click-to-reveal.html", '{{linkText || "Show"}}\n'), a.put("views/directives/_copy-to-clipboard.html", ''), a.put("views/directives/_custom-icon.html", '\n'), a.put("views/directives/_pod-content.html", '
\n {{pod.status.phase}}\n \n \n \n
\n scheduling...\n scheduled\n pulling...\n
\n
\n  \n {{pod.status.podIP}}\n \n  \n
\n
'), a.put("views/directives/_pod-warnings.html", '\n \n \n \n \n'), a.put("views/directives/labels.html", '\n
Each label is applied to each created resource.
\n
\n\n \n\n \n
\n
\n \n \n
\n
'), a.put("views/directives/osc-file-input.html", '
\n
\n \n \n Browse… \n \n \n \n
\n \n
\n There was an error reading the file. Please copy the file content into the text area.\n
\n
'), a.put("views/directives/osc-form-section.html", '
\n
\n

{{header}}

\n
\n
\n \n
\n
\n\n
'), @@ -18392,14 +18592,14 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp "\n" + "
\n" + "

Triggers:

\n" + - " \n" + + "
\n" + "\n" + "
\n" + "
Manual (CLI):\n" + @@ -18429,65 +18629,112 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp "
\n" + " \n" + "
\n" + + " \n" + + "
\n" + " \n" + - "
\n" + + "
\n" + + "
\n" + + "
\n" + "

\n" + " {{deployment.metadata.name}}\n" + - " (latest)\n" + + " (active)\n" + + " \n" + + " \n" + + " \n" + + " failed : {{deployment | annotation:'deploymentStatusReason'}}\n" + + " \n" + + " deployed \n" + + " {{deploymentStatus(deployment)}} since \n" + + " \n" + + " \n" + + " details\n" + "

\n" + - "
\n" + - "
Created:
\n" + - "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " Status:\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " {{deploymentStatus(deployment)}}\n" + + " \n" + + " \n" + + "
\n" + + " Use the following settings from {{deployment.metadata.name}}: \n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + "
\n" + "
\n" + - "
\n" + - " \n" + - "
Status:
\n" + - "
\n" + - " {{deployment | annotation:'deploymentStatus'}}\n" + - " \n" + - " for \n" + - " for \n" + - " for \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + + "
\n" + + " Created:\n" + + "
\n" + + "
\n" + + " Status reason:\n" + + " {{deployment | annotation:'deploymentStatusReason'}}\n" + + "
\n" + + "
\n" + + " Duration:\n" + + " \n" + + " running for \n" + + " waiting for \n" + " \n" + "
\n" + - "
\n" + - "
Labels:
\n" + - "
\n" + - " none\n" + - " {{labelKey}}={{labelValue}}, \n" + - "
\n" + + "
\n" + + " Labels:\n" + + " none\n" + + " {{labelKey}}={{labelValue}}, \n" + "
\n" + - "
\n" + - "
Selectors:
\n" + - "
\n" + - " none\n" + - " {{labelKey}}={{labelValue}}, \n" + - "
\n" + + "
\n" + + " Selectors:\n" + + " none\n" + + " {{labelKey}}={{labelValue}}, \n" + "
\n" + - "
\n" + - "
Replicas:
\n" + - "
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
\n" + + "
\n" + + " Replicas:\n" + + " {{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired\n" + "
\n" + - "
\n" + - "
Pod Template:
\n" + - "
\n" + - " \n" + - "
\n" + + "
\n" + + " Pod template:\n" + + " \n" + "
\n" + - "
\n" + - "\n" + - " \n" + - " \n" + + "
\n" + + "
\n" + "
\n" + + "\n" + + " \n" + "
\n" + "\n" + " \n" + @@ -18503,7 +18750,7 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp " \n" + " \n" + "
\n" + - "
\n" + + "
\n" + "

\n" + " {{deployment.metadata.name}}\n" + "

\n" + @@ -18515,13 +18762,13 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp " \n" + "
Status:
\n" + "
\n" + - " {{deployment | annotation:'deploymentStatus'}}\n" + - " \n" + + " {{deploymentStatus(deployment)}}\n" + + " \n" + " for \n" + " for \n" + " for \n" + " \n" + - " \n" + + " \n" + " \n" + " \n" + " \n" + @@ -18549,7 +18796,6 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp "
\n" + "
\n" + "
Pod Template:
\n" + - "\n" + "
\n" + " \n" + " \n" + @@ -39799,15 +40045,6 @@ value:a }); }, a.prototype.getLabelSelector = function() { return this._labelSelector; -}, a.prototype.setLabelSelector = function(a) { -if (this._labelFilterActiveFiltersElement.empty(), this._labelSelector = a, this._labelSelector.isEmpty()) this._labelFilterActiveElement.hide(); else { -this._labelFilterActiveElement.show(); -var b = this; -this._labelSelector.each(function(a) { -b._renderActiveFilter(a); -}); -} -this._onActiveFiltersChangedCallbacks.fire(this._labelSelector); }, a.prototype.onActiveFiltersChanged = function(a) { this._onActiveFiltersChangedCallbacks.add(a); }, a.prototype.setupFilterWidget = function(a, b, c) { @@ -39887,12 +40124,10 @@ b(c); } }), this._labelFilterValuesSelectize = this._labelFilterValuesInput.prop("selectize"), this._labelFilterValuesSelectizeInput = $(".selectize-control.label-filter-values", e), this._labelFilterValuesSelectizeInput.hide(), this._labelFilterAddBtn.click(function() { var a = d._labelFilterKeySelectize.getValue(), b = d._labelFilterOperatorSelectize.getValue(), c = d._labelFilterValuesSelectize.getValue(); -d._labelFilterKeySelectize.clear(), d._labelFilterOperatorSelectizeInput.hide(), d._labelFilterOperatorSelectize.clear(), d._labelFilterValuesSelectizeInput.hide(), d._labelFilterValuesSelectize.clear(), d._labelFilterAddBtn.addClass("disabled").prop("disabled", !0), d.addActiveFilter(a, b, c); +d._labelFilterKeySelectize.clear(), d._labelFilterOperatorSelectizeInput.hide(), d._labelFilterOperatorSelectize.clear(), d._labelFilterValuesSelectizeInput.hide(), d._labelFilterValuesSelectize.clear(), d._labelFilterAddBtn.addClass("disabled").prop("disabled", !0), d._labelFilterActiveElement.show(), d._addActiveFilter(a, b, c); }), this._labelSelector.isEmpty() || (this._labelFilterActiveElement.show(), this._labelSelector.each(function(a) { d._renderActiveFilter(a); })); -}, a.prototype.addActiveFilter = function(a, b, c) { -this._labelFilterActiveElement.show(), this._addActiveFilter(a, b, c); }, a.prototype._addActiveFilter = function(a, b, c) { var d = this._labelSelector.addConjunct(a, b, c); this._onActiveFiltersChangedCallbacks.fire(this._labelSelector), this._renderActiveFilter(d); @@ -65507,10 +65742,16 @@ to{transform:rotate(359deg)}} .pod-block .pod-container .pod.pod-unknown,.pod-block .pod-container .pod.pod-warning{background-color:#f9d67a} .pod-block .pod-container .pod.pod-unknown.pod-multiple,.pod-block .pod-container .pod.pod-warning.pod-multiple{box-shadow:1px 1px 0 rgba(0,0,0,.2),3px 3px 0 #f9d67a,4px 4px 0 rgba(0,0,0,.2),6px 6px 0 #f9d67a,7px 7px 0 rgba(0,0,0,.2)} .pod-block .pod-container .pod .pod-text{font-family:"Open Sans",Helvetica,Arial,sans-serif;font-size:11px} +.deployment-well:not(.active){background-color:#fff} +.deployment-well:not(.detailed){padding-top:12px;padding-bottom:12px} +.deployment-well:not(.detailed) .deployment-summary h3{margin-bottom:5px;text-transform:lowercase} +.deployment-well:not(.detailed) .deployment-summary .deployment-summary-status{font-size:90%;margin-left:7px} +.deployment-well:not(.detailed) .deployment-summary .deployment-summary-toggler{float:right!important;font-size:80%} +.deployment-well.detailed .deployment-summary-status,.deployment-well.detailed .deployment-summary-toggler,.deployment-well:not(.detailed) .deployment-details{display:none} .popover{min-width:300px;font-size:13px;line-height:1.66667} -.build-well,.pod-well{overflow:hidden;margin-bottom:10px} -.build-well .build-detail,.build-well .pod-detail,.pod-well .build-detail,.pod-well .pod-detail{margin-bottom:3px} -.build-well .build-detail .build-detail-label,.build-well .build-detail .pod-detail-label,.build-well .pod-detail .build-detail-label,.build-well .pod-detail .pod-detail-label,.pod-well .build-detail .build-detail-label,.pod-well .build-detail .pod-detail-label,.pod-well .pod-detail .build-detail-label,.pod-well .pod-detail .pod-detail-label{margin-right:10px} +.build-well,.deployment-well,.pod-well{overflow:hidden;margin-bottom:10px} +.build-well .build-detail,.build-well .deployment-detail,.build-well .pod-detail,.deployment-well .build-detail,.deployment-well .deployment-detail,.deployment-well .pod-detail,.pod-well .build-detail,.pod-well .deployment-detail,.pod-well .pod-detail{margin-bottom:3px} +.build-well .build-detail .build-detail-label,.build-well .build-detail .deployment-detail-label,.build-well .build-detail .pod-detail-label,.build-well .deployment-detail .build-detail-label,.build-well .deployment-detail .deployment-detail-label,.build-well .deployment-detail .pod-detail-label,.build-well .pod-detail .build-detail-label,.build-well .pod-detail .deployment-detail-label,.build-well .pod-detail .pod-detail-label,.deployment-well .build-detail .build-detail-label,.deployment-well .build-detail .deployment-detail-label,.deployment-well .build-detail .pod-detail-label,.deployment-well .deployment-detail .build-detail-label,.deployment-well .deployment-detail .deployment-detail-label,.deployment-well .deployment-detail .pod-detail-label,.deployment-well .pod-detail .build-detail-label,.deployment-well .pod-detail .deployment-detail-label,.deployment-well .pod-detail .pod-detail-label,.pod-well .build-detail .build-detail-label,.pod-well .build-detail .deployment-detail-label,.pod-well .build-detail .pod-detail-label,.pod-well .deployment-detail .build-detail-label,.pod-well .deployment-detail .deployment-detail-label,.pod-well .deployment-detail .pod-detail-label,.pod-well .pod-detail .build-detail-label,.pod-well .pod-detail .deployment-detail-label,.pod-well .pod-detail .pod-detail-label{margin-right:10px} .animate-repeat.ng-enter,.animate-repeat.ng-leave,.animate-repeat.ng-move{-webkit-transition:all 1s;transition:all 1s} .animate-repeat.ng-enter,.animate-repeat.ng-leave.ng-leave-active,.animate-repeat.ng-move{opacity:0} .animate-repeat.ng-enter.ng-enter-active,.animate-repeat.ng-leave,.animate-repeat.ng-move.ng-move-active{opacity:1} @@ -67715,7 +67956,14 @@ var _viewsDeploymentsHtml = []byte(`

Triggers:

- +
+
Manual:
+
+ + + +
+
Manual (CLI): @@ -67743,62 +67991,102 @@ var _viewsDeploymentsHtml = []byte(`
-
+
+
+
+
+

{{deployment.metadata.name}} -(latest) +(active) + + + +failed : {{deployment | annotation:'deploymentStatusReason'}} + +deployed +{{deploymentStatus(deployment)}} since + + +details

-
-
Created:
-
-
- -
Status:
-
-{{deployment | annotation:'deploymentStatus'}} - - for - for - for - - - + +
+
+
+
+Status: + + + + - +{{deploymentStatus(deployment)}} + + +
+Use the following settings from {{deployment.metadata.name}}: +
+ +
+
+ +
+
+ +
+ +
+ +
-
-
Labels:
-
+
+Created: +
+
+Status reason: +{{deployment | annotation:'deploymentStatusReason'}} +
+
+Duration: + +running for +waiting for + +
+
+Labels: none {{labelKey}}={{labelValue}}, -
-
-
Selectors:
-
+
+Selectors: none {{labelKey}}={{labelValue}}, -
-
-
Replicas:
-
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
+
+Replicas: +{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
-
-
Pod Template:
-
+
+Pod template: -
- -
+ +
@@ -67812,7 +68100,7 @@ var _viewsDeploymentsHtml = []byte(`
-
+

{{deployment.metadata.name}}

@@ -67824,13 +68112,13 @@ var _viewsDeploymentsHtml = []byte(`
Status:
-{{deployment | annotation:'deploymentStatus'}} - +{{deploymentStatus(deployment)}} + for for for - + From d4bc3ae93195deb30649b5a13643f5f7af035970 Mon Sep 17 00:00:00 2001 From: fabianofranz Date: Wed, 2 Sep 2015 16:13:03 -0300 Subject: [PATCH 2/3] Disable deployment retry on web console until we have an api --- assets/app/scripts/controllers/deployments.js | 6 ++++++ assets/app/views/deployments.html | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/assets/app/scripts/controllers/deployments.js b/assets/app/scripts/controllers/deployments.js index 53d527afa5bb..d50db1d4c798 100644 --- a/assets/app/scripts/controllers/deployments.js +++ b/assets/app/scripts/controllers/deployments.js @@ -162,6 +162,8 @@ angular.module('openshiftConsole') var deployment = $scope.deploymentsByDeploymentConfig[deploymentConfigName][deploymentName]; var req = deployment; + // TODO: we need a "retry" api endpoint so we don't have to do this manually + // delete the deployer pod as well as the deployment hooks pods, if any DataService.list("pods", $scope, function(list) { var pods = list.by("metadata.name"); @@ -233,6 +235,8 @@ angular.module('openshiftConsole') } }; + // TODO: we need a "rollback" api endpoint so we don't have to do this manually + // create the deployment config rollback DataService.create("deploymentconfigrollbacks", null, req, $scope).then( function(newDeploymentConfig) { @@ -273,6 +277,8 @@ angular.module('openshiftConsole') var deployment = $scope.deploymentsByDeploymentConfig[deploymentConfigName][deploymentName]; var req = deployment; + // TODO: we need a "cancel" api endpoint so we don't have to do this manually + // set the cancellation annotations var deploymentCancelledAnnotation = $filter('annotationName')('deploymentCancelled'); var deploymentStatusReasonAnnotation = $filter('annotationName')('deploymentStatusReason'); diff --git a/assets/app/views/deployments.html b/assets/app/views/deployments.html index eefdcf433750..ea2b9a05aa23 100644 --- a/assets/app/views/deployments.html +++ b/assets/app/views/deployments.html @@ -129,7 +129,7 @@

- Use the following settings from {{deployment.metadata.name}}: + Use the following settings from {{deployment.metadata.name}} when rolling back:
-
+

+
From 130dc4762e154484fcdbb5997109f605699d786d Mon Sep 17 00:00:00 2001 From: Samuel Padgett Date: Wed, 2 Sep 2015 16:45:20 -0400 Subject: [PATCH 3/3] Add Cancel button to UI for running builds --- assets/app/scripts/controllers/builds.js | 24 +++++++ assets/app/styles/_components.less | 3 + assets/app/views/builds.html | 18 +++--- pkg/assets/bindata.go | 80 ++++++++++++++++-------- 4 files changed, 89 insertions(+), 36 deletions(-) diff --git a/assets/app/scripts/controllers/builds.js b/assets/app/scripts/controllers/builds.js index 276eb863177f..a16ee264df18 100644 --- a/assets/app/scripts/controllers/builds.js +++ b/assets/app/scripts/controllers/builds.js @@ -136,6 +136,30 @@ angular.module('openshiftConsole') ); }; + $scope.cancelBuild = function(build, buildConfigName) { + var canceledBuild = angular.copy(build); + canceledBuild.status.cancelled = true; + DataService.update("builds", canceledBuild.metadata.name, canceledBuild, $scope).then( + function() { + $scope.alerts = [ + { + type: "success", + message: "Cancelling build " + build.metadata.name + " of " + buildConfigName + ".", + } + ]; + }, + function(result) { + $scope.alerts = [ + { + type: "error", + message: "An error occurred cancelling the build.", + details: $filter('getErrorDetails')(result) + } + ]; + } + ); + }; + // Function which will 'clone' build from given buildName $scope.cloneBuild = function(buildName) { var req = { diff --git a/assets/app/styles/_components.less b/assets/app/styles/_components.less index 6646c8d295c5..f5c688fb346a 100644 --- a/assets/app/styles/_components.less +++ b/assets/app/styles/_components.less @@ -376,6 +376,9 @@ margin-right: 10px; } } + .build-status-button { + margin-left: 7px; + } } .animate-repeat.ng-move, diff --git a/assets/app/views/builds.html b/assets/app/views/builds.html index 35e473df06f1..3c43a9b94fdf 100644 --- a/assets/app/views/builds.html +++ b/assets/app/views/builds.html @@ -142,20 +142,12 @@

Triggers:

-
+

{{build.metadata.name}}

-
-
- -
-
-
- Created: -
Status: @@ -167,6 +159,12 @@

{{build.metadata.name}}

{{build.status.phase}} + + + +
+
+ Created:
Duration: @@ -182,7 +180,7 @@

{{build.metadata.name}}

-
+
Build strategy:{{build.spec.strategy.type}} diff --git a/pkg/assets/bindata.go b/pkg/assets/bindata.go index 5bcdcedecb5a..505561e50693 100644 --- a/pkg/assets/bindata.go +++ b/pkg/assets/bindata.go @@ -10944,6 +10944,11 @@ h2, .deployment-well .deployment-detail .deployment-detail-label { margin-right: 10px; } +.build-well .build-status-button, +.pod-well .build-status-button, +.deployment-well .build-status-button { + margin-left: 7px; +} .animate-repeat.ng-move, .animate-repeat.ng-enter, .animate-repeat.ng-leave { @@ -15484,6 +15489,20 @@ message:"An error occurred while starting the build.", details:c("getErrorDetails")(b) } ]; }); +}, a.cancelBuild = function(d, e) { +var f = angular.copy(d); +f.status.cancelled = !0, b.update("builds", f.metadata.name, f, a).then(function() { +a.alerts = [ { +type:"success", +message:"Cancelling build " + d.metadata.name + " of " + e + "." +} ]; +}, function(b) { +a.alerts = [ { +type:"error", +message:"An error occurred cancelling the build.", +details:c("getErrorDetails")(b) +} ]; +}); }, a.cloneBuild = function(d) { var e = { kind:"BuildRequest", @@ -17236,14 +17255,14 @@ a.put("views/_project-page.html", '\n
\n \n \n \n '), a.put("views/_tasks.html", '
\n
\n
\n
\n
\n

\n \n {{ task | taskTitle }}\n \n \n \n

\n
\n

Helpful Links

\n \n
\n \n
\n \n
\n
\n
\n
\n
\n
'), a.put("views/_templateopt.html", '
\n
\n
\n

Parameters

\n
\n \n
\n
\n \n \n \n \n
{{parameter.description}}
\n
\n
{{parameter.name}} is required.
\n
\n
\n
    \n
  • \n \n {{ parameter | parameterValue }}\n
    {{parameter.description}}
    \n
    \n
    {{parameter.name}} is required.
    \n
    \n
  • \n
\n
'), a.put("views/_triggers.html", '
\n
\n
\n \n \n \n \n \n \n \n \n \n \n Build\n \n {{build.metadata.labels.buildconfig}} #{{build | annotation : \'buildNumber\'}}\n \n \n {{build.metadata.name}}\n \n \n completed.\n failed.\n encountered an error.\n was cancelled.\n is {{build.status.phase | lowercase}}.\n \n A new deployment will be created automatically once the build completes.\n \n \n \n Dismiss\n
\n
\n
'), -a.put("views/builds.html", '
\n \n
\n \n \n
\n
\n {{emptyMessage}}\n
\n
\n
\n
\n

{{buildConfigName}}

\n
\n
\n
Build strategy:
\n
{{buildConfig.spec.strategy.type}}
\n
\n
\n
\n
\n
Builder image:
\n
{{buildConfig.spec.strategy.sourceStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}
\n
\n
\n
\n
\n
Builder image stream:
\n
{{buildConfig.spec.strategy.dockerStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}
\n
\n
\n
\n
\n
Builder image stream:
\n
{{buildConfig.spec.strategy.customStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n
\n
\n
Source repo:
\n
\n
\n
\n
\n
Output to:
\n
{{buildConfig.spec.output.to | imageObjectRef : buildConfig.metadata.namespace}}
\n
\n
\n\n
\n

Triggers:

\n
\n\n
\n
\n
\n
GitHub webhook URL\n Learn more\n \n
\n
\n {{buildConfigName | webhookURL : trigger.type : trigger.github.secret : project.metadata.name}}\n \n
\n
\n
\n
Generic webhook URL\n Learn more \n
\n
\n {{buildConfigName | webhookURL : trigger.type : trigger.generic.secret : project.metadata.name}}\n \n
\n
\n
\n
\n
\n
\n New image for:\n
\n
\n Image stream {{buildConfig.spec.strategy.sourceStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n New image for:\n
\n
\n Image stream {{buildConfig.spec.strategy.dockerStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n New image for:\n
\n
\n Image stream {{buildConfig.spec.strategy.customStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n
\n
Config change for:
\n
Build config {{buildConfig.metadata.name}}
\n
\n
\n
Other trigger:
\n
{{trigger.type}}
\n
\n
\n
\n
\n\n
\n
Manual:
\n
\n \n \n \n
\n
\n\n
\n
Manual (CLI):\n \n Learn more \n \n
\n
\n oc start-build {{buildConfigName}} -n {{project.metadata.name}}\n \n
\n\n
\n
\n
\n \n
\n
\n
\n

{{build.metadata.name}}

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n Created:\n
\n
\n Status:\n \n \n \n \n \n \n \n \n {{build.status.phase}}\n
\n
\n Duration:\n \n {{(build.status.startTimestamp || build.metadata.creationTimestamp) | duration : build.status.completionTimestamp}}\n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n running for \n waiting for \n waiting for \n \n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n waited for {{build.metadata.creationTimestamp | duration : build.status.completionTimestamp}}\n \n \n
\n
\n
\n
\n Build strategy:{{build.spec.strategy.type}}\n
\n
\n
\n Builder image:{{build.spec.strategy.sourceStrategy.from | imageObjectRef : build.metadata.namespace}}\n
\n
\n
\n Builder image:{{build.spec.strategy.dockerStrategy.from | imageObjectRef : build.metadata.namespace}}\n
\n
\n
\n Builder image:{{build.spec.strategy.customStrategy.from | imageObjectRef : build.metadata.namespace}}\n
\n
\n
\n
\n
\n Source repo:\n
\n
\n \n
\n
Output image:{{build.spec.output.to | imageObjectRef : build.metadata.namespace}}
\n
\n
\n
\n \n
\n\n \n
\n

\n {{buildConfigName}}\n \n \n \n \n

\n
\n

{{build.metadata.name}}

\n
\n
\n
Created:
\n
\n Status:{{build.status.phase}} \n \n \n \n \n \n \n
\n
\n Duration:\n \n {{(build.status.startTimestamp || build.metadata.creationTimestamp) | duration : build.status.completionTimestamp}}\n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n running for \n waiting for \n waiting for \n \n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n waited for {{build.metadata.creationTimestamp | duration : build.status.completionTimestamp}}\n \n \n
\n
\n
\n
\n Build strategy:{{build.spec.strategy.type}}\n
\n
\n
\n Builder image:{{build.spec.strategy.sourceStrategy.image}}\n
\n
\n
\n Builder image:{{build.spec.strategy.dockerStrategy.image}}\n
\n
\n
\n Builder image:{{build.spec.strategy.customStrategy.image}}\n
\n
\n
\n
\n Source repo:\n
\n \n
\n
\n
\n
\n Output image:{{build.spec.output.to.name}}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
'), +a.put("views/builds.html", '
\n \n
\n \n \n
\n
\n {{emptyMessage}}\n
\n
\n
\n
\n

{{buildConfigName}}

\n
\n
\n
Build strategy:
\n
{{buildConfig.spec.strategy.type}}
\n
\n
\n
\n
\n
Builder image:
\n
{{buildConfig.spec.strategy.sourceStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}
\n
\n
\n
\n
\n
Builder image stream:
\n
{{buildConfig.spec.strategy.dockerStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}
\n
\n
\n
\n
\n
Builder image stream:
\n
{{buildConfig.spec.strategy.customStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n
\n
\n
Source repo:
\n
\n
\n
\n
\n
Output to:
\n
{{buildConfig.spec.output.to | imageObjectRef : buildConfig.metadata.namespace}}
\n
\n
\n\n
\n

Triggers:

\n
\n\n
\n
\n
\n
GitHub webhook URL\n Learn more\n \n
\n
\n {{buildConfigName | webhookURL : trigger.type : trigger.github.secret : project.metadata.name}}\n \n
\n
\n
\n
Generic webhook URL\n Learn more \n
\n
\n {{buildConfigName | webhookURL : trigger.type : trigger.generic.secret : project.metadata.name}}\n \n
\n
\n
\n
\n
\n
\n New image for:\n
\n
\n Image stream {{buildConfig.spec.strategy.sourceStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n New image for:\n
\n
\n Image stream {{buildConfig.spec.strategy.dockerStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n New image for:\n
\n
\n Image stream {{buildConfig.spec.strategy.customStrategy.from | imageObjectRef : buildConfig.metadata.namespace}}\n
\n
\n
\n
\n
\n
Config change for:
\n
Build config {{buildConfig.metadata.name}}
\n
\n
\n
Other trigger:
\n
{{trigger.type}}
\n
\n
\n
\n
\n\n
\n
Manual:
\n
\n \n \n \n
\n
\n\n
\n
Manual (CLI):\n \n Learn more \n \n
\n
\n oc start-build {{buildConfigName}} -n {{project.metadata.name}}\n \n
\n\n
\n
\n
\n \n
\n
\n
\n

{{build.metadata.name}}

\n
\n
\n
\n
\n
\n Status:\n \n \n \n \n \n \n \n \n {{build.status.phase}}\n\n \n \n
\n
\n Created:\n
\n
\n Duration:\n \n {{(build.status.startTimestamp || build.metadata.creationTimestamp) | duration : build.status.completionTimestamp}}\n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n running for \n waiting for \n waiting for \n \n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n waited for {{build.metadata.creationTimestamp | duration : build.status.completionTimestamp}}\n \n \n
\n
\n
\n
\n Build strategy:{{build.spec.strategy.type}}\n
\n
\n
\n Builder image:{{build.spec.strategy.sourceStrategy.from | imageObjectRef : build.metadata.namespace}}\n
\n
\n
\n Builder image:{{build.spec.strategy.dockerStrategy.from | imageObjectRef : build.metadata.namespace}}\n
\n
\n
\n Builder image:{{build.spec.strategy.customStrategy.from | imageObjectRef : build.metadata.namespace}}\n
\n
\n
\n
\n
\n Source repo:\n
\n
\n \n
\n
Output image:{{build.spec.output.to | imageObjectRef : build.metadata.namespace}}
\n
\n
\n
\n \n
\n\n \n
\n

\n {{buildConfigName}}\n \n \n \n \n

\n
\n

{{build.metadata.name}}

\n
\n
\n
Created:
\n
\n Status:{{build.status.phase}} \n \n \n \n \n \n \n
\n
\n Duration:\n \n {{(build.status.startTimestamp || build.metadata.creationTimestamp) | duration : build.status.completionTimestamp}}\n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n running for \n waiting for \n waiting for \n \n {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n waited for {{build.metadata.creationTimestamp | duration : build.status.completionTimestamp}}\n \n \n
\n
\n
\n
\n Build strategy:{{build.spec.strategy.type}}\n
\n
\n
\n Builder image:{{build.spec.strategy.sourceStrategy.image}}\n
\n
\n
\n Builder image:{{build.spec.strategy.dockerStrategy.image}}\n
\n
\n
\n Builder image:{{build.spec.strategy.customStrategy.image}}\n
\n
\n
\n
\n Source repo:\n
\n \n
\n
\n
\n
\n Output image:{{build.spec.output.to.name}}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/catalog/_image.html", '
\n
\n
\n \n
\n
\n

\n {{imageRepo.metadata.name}}:{{imageTag}}\n

\n

\n \n

\n
\n \n {{imageRepo | imageStreamTagAnnotation : \'provider\' : imageTag}}\n
\n
\n \n {{imageRepo.metadata.namespace}}\n
\n
\n \n {{version}}\n
\n \n {{tag}}\n \n
\n
\n
'), a.put("views/catalog/_template.html", '
\n
\n
\n \n
\n
\n

{{template.metadata.name}}

\n

\n \n

\n

\n

\n \n {{template | annotation : \'provider\'}}\n
\n
\n \n {{template.metadata.namespace}}\n
\n
\n \n {{template | annotation : \'version\'}}\n
\n

\n

\n \n {{tag}}\n \n

\n
\n
\n
'), a.put("views/catalog/images.html", '
\n
\n
\n \n

Select a builder image

\n
\n
Loading...
\n
There are no builder images to select from. To add a builder to your project, run oc create -f <image_stream_file> -n {{projectName}}
\n
\n
\n \n
\n
\n

\n Other images\n \n \n \n \n

\n
\n \n
\n
\n
\n
\n
'), a.put("views/create.html", '
\n
\n
\n \n
\n
\n

Create Using Your Code

\n
\n

Create your application from a Git source code repository. Optionally specify a branch, tag, or commit ID with #ref.

\n
\n
\n
\n \n \n \n \n \n \n
\n
For example, https://github.com/openshift/nodejs-ex#master\n Try it out!
\n Source repository should be a URL\n
\n
\n
\n\n
\n
\n
\n

Create Using a Template

\n

Templates have predefined resources for quickly creating components. You can customize some options in the next step.

\n

Instant Apps

\n
Loading...
\n
\n There are no instant apps available.\n
\n
\n \n \n
\n \n
\n

Other Templates

\n
\n \n \n
\n
\n
\n To load additional templates into this project, run the command\n oc create -f <template-filename> -n {{projectName}}\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/create/fromimage.html", '
\n
\n \n
\n
\n
\n
\n \n
\n \n
\n
\n

\n Name\n

\n
\n \n
\n

Used to uniquely identify within this project all the resources created to support the application.

\n
\n Please enter a valid name.\n

A valid name is applied to all generated resources. It is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the \'-\' character is allowed anywhere except the first or last character.

\n
\n
\n
\n A name is required.\n
\n
\n The name must have at least 2 characters.\n
\n
\n This name is already in use within the project. Please choose a different name.\n
\n
\n\n
\n \n After creation, these settings can only be modified through the oc command.\n
\n\n \n
\n
\n \n {{routing | yesNo}}\n
\n
\n
\n
\n \n
\n
\n
\n\n \n\n \n
\n

Autodeploy when

\n
\n \n {{deploymentConfig.deployOnNewImage | yesNo}}\n
\n
\n \n {{deploymentConfig.deployOnConfigChange | yesNo}}\n
\n

Environment Variables \n \n \n \n

\n \n \n
\n
\n

Autodeploy when

\n
\n \n
\n
\n \n
\n
\n

Environment Variables \n \n \n \n

\n \n
\n
\n
\n\n \n\n \n
\n
\n \n {{buildConfig.sourceUrl | defaultIfBlank: "Not Specified"}}\n
\n
\n \n {{buildConfig.buildOnSourceChange | yesNo}}\n
\n
\n \n {{buildConfig.buildOnImageChange | yesNo}}\n
\n
\n \n {{buildConfig.buildOnConfigChange | yesNo}}\n
\n
\n
\n
\n \n {{buildConfig.sourceUrl}}\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n\n \n\n \n
\n
\n \n {{scaling.replicas}}\n
\n
\n
\n \n
\n Replicas must be an integer value greater than or equal to 0\n
\n
\n
\n\n \n\n \n
\n \n \n Cancel\n
\n
\n
\n {{ emptyMessage }}\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/createProject.html", '
\n
\n
\n

New Project

\n
\n
\n \n \n \n \n
\n A unique name for the project.\n
\n
\n \n Project names may only contain lower-case letters, numbers, and dashes.\n They may not start or end with a dash.\n
\n
\n This name is already\n in use. Please choose a different name.\n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Cancel\n
\n
\n
\n
\n
'), -a.put("views/deployments.html", '
\n \n
\n \n \n
\n {{emptyMessage}}\n
\n\n
\n
\n

{{deploymentConfigName}}

\n
\n
\n
Created:
\n
\n
\n
\n
Labels:
none
\n
{{labelKey}}={{labelValue}},
\n
\n
\n
Latest Version:
\n
{{deploymentConfig.status.latestVersion}}
\n
\n
\n
Strategy:
\n
{{deploymentConfig.spec.strategy.type}}
\n \n
\n\n
\n

Template:

\n
\n
Selectors:
none
\n
{{selectorLabel}}={{selectorValue}},
\n
Replicas:
\n
\n {{deploymentConfig.spec.replicas}}\n
\n
\n
\n\n
\n

Triggers:

\n
\n
Manual:
\n
\n \n \n \n
\n
\n\n
\n
Manual (CLI):\n \n Learn more \n \n
\n
\n oc deploy {{deploymentConfigName}} --latest -n {{project.metadata.name}}\n \n
\n
\n\n
\n
\n \n {{trigger.type}}\n \n
New image for:
\n
{{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}}
\n
\n \n
Change of:
\n
Config
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n

\n {{deployment.metadata.name}}\n (active)\n \n \n \n failed : {{deployment | annotation:\'deploymentStatusReason\'}}\n \n deployed \n {{deploymentStatus(deployment)}} since \n \n \n details\n

\n
\n \n
\n
\n
\n
\n Status:\n \n \n \n \n \n \n \n {{deploymentStatus(deployment)}}\n \n \n
\n Use the following settings from {{deployment.metadata.name}}: \n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n \n \n
\n
\n
\n Created:\n
\n
\n Status reason:\n {{deployment | annotation:\'deploymentStatusReason\'}}\n
\n
\n Duration:\n \n running for \n waiting for \n \n
\n
\n Labels:\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n Selectors:\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n Replicas:\n {{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired\n
\n
\n Pod template:\n \n
\n
\n
\n
\n\n \n
\n\n \n
\n
\n

\n {{deploymentConfigName}}\n \n \n \n \n \n \n

\n
\n
\n

\n {{deployment.metadata.name}}\n

\n
\n
Created:
\n
\n
\n
\n \n
Status:
\n
\n {{deploymentStatus(deployment)}}\n \n for \n for \n for \n \n \n \n \n \n \n
\n
\n
\n
\n
Labels:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Selectors:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Replicas:
\n
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
\n
\n
\n
Pod Template:
\n
\n \n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
'), +a.put("views/deployments.html", '
\n \n
\n \n \n
\n {{emptyMessage}}\n
\n\n
\n
\n

{{deploymentConfigName}}

\n
\n
\n
Created:
\n
\n
\n
\n
Labels:
none
\n
{{labelKey}}={{labelValue}},
\n
\n
\n
Latest Version:
\n
{{deploymentConfig.status.latestVersion}}
\n
\n
\n
Strategy:
\n
{{deploymentConfig.spec.strategy.type}}
\n \n
\n\n
\n

Template:

\n
\n
Selectors:
none
\n
{{selectorLabel}}={{selectorValue}},
\n
Replicas:
\n
\n {{deploymentConfig.spec.replicas}}\n
\n
\n
\n\n
\n

Triggers:

\n
\n
Manual:
\n
\n \n \n \n
\n
\n\n
\n
Manual (CLI):\n \n Learn more \n \n
\n
\n oc deploy {{deploymentConfigName}} --latest -n {{project.metadata.name}}\n \n
\n
\n\n
\n
\n \n {{trigger.type}}\n \n
New image for:
\n
{{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}}
\n
\n \n
Change of:
\n
Config
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n

\n {{deployment.metadata.name}}\n (active)\n \n \n \n failed : {{deployment | annotation:\'deploymentStatusReason\'}}\n \n deployed \n {{deploymentStatus(deployment)}} since \n \n \n details\n

\n
\n \n
\n
\n
\n
\n Status:\n \n \n \n \n \n \n \n {{deploymentStatus(deployment)}}\n \n \n
\n Use the following settings from {{deployment.metadata.name}} when rolling back: \n
\n \n
\n
\n \n
\n
\n \n
\n \n
\n \n \n
\n
\n
\n Created:\n
\n
\n Status reason:\n {{deployment | annotation:\'deploymentStatusReason\'}}\n
\n
\n Duration:\n \n running for \n waiting for \n \n
\n
\n Labels:\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n Selectors:\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n Replicas:\n {{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired\n
\n
\n Pod template:\n \n
\n
\n
\n
\n\n \n
\n\n \n
\n
\n

\n {{deploymentConfigName}}\n \n \n \n \n \n \n

\n
\n
\n

\n {{deployment.metadata.name}}\n

\n
\n
Created:
\n
\n
\n
\n \n
Status:
\n
\n {{deploymentStatus(deployment)}}\n \n for \n for \n for \n \n \n \n \n \n \n
\n
\n
\n
\n
Labels:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Selectors:
\n
\n none\n {{labelKey}}={{labelValue}}, \n
\n
\n
\n
Replicas:
\n
{{deployment.status.replicas}} current / {{deployment.spec.replicas}} desired
\n
\n
\n
Pod Template:
\n
\n \n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
'), a.put("views/directives/_click-to-reveal.html", '{{linkText || "Show"}}\n'), a.put("views/directives/_copy-to-clipboard.html", ''), a.put("views/directives/_custom-icon.html", '\n'), a.put("views/directives/_pod-content.html", '
\n {{pod.status.phase}}\n \n \n \n
\n scheduling...\n scheduled\n pulling...\n
\n
\n  \n {{pod.status.podIP}}\n \n  \n
\n
'), a.put("views/directives/_pod-warnings.html", '\n \n \n \n \n'), a.put("views/directives/labels.html", '\n
Each label is applied to each created resource.
\n
\n\n \n\n \n
\n
\n \n \n
\n
'), a.put("views/directives/osc-file-input.html", '
\n
\n \n \n Browse… \n \n \n \n
\n \n
\n There was an error reading the file. Please copy the file content into the text area.\n
\n
'), a.put("views/directives/osc-form-section.html", '
\n
\n

{{header}}

\n
\n
\n \n
\n
\n\n
'), @@ -17960,21 +17979,13 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp " \n" + "
\n" + "
\n" + - "
\n" + + "
\n" + "

{{build.metadata.name}}

\n" + "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + "
\n" + "
\n" + "
\n" + "
\n" + - " Created:\n" + - "
\n" + - "
\n" + " Status:\n" + " \n" + " \n" + @@ -17985,6 +17996,12 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp " \n" + " \n" + " {{build.status.phase}}\n" + + "\n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " Created:\n" + "
\n" + "
\n" + " Duration:\n" + @@ -18000,7 +18017,7 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp " \n" + " \n" + "
\n" + - "
\n" + + "
\n" + "
\n" + "
\n" + " Build strategy:{{build.spec.strategy.type}}\n" + @@ -18676,7 +18693,7 @@ var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsole').run(['$temp " \n" + " \n" + "
\n" + - " Use the following settings from {{deployment.metadata.name}}: \n" + + " Use the following settings from {{deployment.metadata.name}} when rolling back: \n" + "
\n" + " \n" + "
\n" + " \n" + - "
\n" + + "
\n" + + " \n" + " \n" + " \n" + "
\n" + @@ -40045,6 +40064,15 @@ value:a }); }, a.prototype.getLabelSelector = function() { return this._labelSelector; +}, a.prototype.setLabelSelector = function(a) { +if (this._labelFilterActiveFiltersElement.empty(), this._labelSelector = a, this._labelSelector.isEmpty()) this._labelFilterActiveElement.hide(); else { +this._labelFilterActiveElement.show(); +var b = this; +this._labelSelector.each(function(a) { +b._renderActiveFilter(a); +}); +} +this._onActiveFiltersChangedCallbacks.fire(this._labelSelector); }, a.prototype.onActiveFiltersChanged = function(a) { this._onActiveFiltersChangedCallbacks.add(a); }, a.prototype.setupFilterWidget = function(a, b, c) { @@ -40124,10 +40152,12 @@ b(c); } }), this._labelFilterValuesSelectize = this._labelFilterValuesInput.prop("selectize"), this._labelFilterValuesSelectizeInput = $(".selectize-control.label-filter-values", e), this._labelFilterValuesSelectizeInput.hide(), this._labelFilterAddBtn.click(function() { var a = d._labelFilterKeySelectize.getValue(), b = d._labelFilterOperatorSelectize.getValue(), c = d._labelFilterValuesSelectize.getValue(); -d._labelFilterKeySelectize.clear(), d._labelFilterOperatorSelectizeInput.hide(), d._labelFilterOperatorSelectize.clear(), d._labelFilterValuesSelectizeInput.hide(), d._labelFilterValuesSelectize.clear(), d._labelFilterAddBtn.addClass("disabled").prop("disabled", !0), d._labelFilterActiveElement.show(), d._addActiveFilter(a, b, c); +d._labelFilterKeySelectize.clear(), d._labelFilterOperatorSelectizeInput.hide(), d._labelFilterOperatorSelectize.clear(), d._labelFilterValuesSelectizeInput.hide(), d._labelFilterValuesSelectize.clear(), d._labelFilterAddBtn.addClass("disabled").prop("disabled", !0), d.addActiveFilter(a, b, c); }), this._labelSelector.isEmpty() || (this._labelFilterActiveElement.show(), this._labelSelector.each(function(a) { d._renderActiveFilter(a); })); +}, a.prototype.addActiveFilter = function(a, b, c) { +this._labelFilterActiveElement.show(), this._addActiveFilter(a, b, c); }, a.prototype._addActiveFilter = function(a, b, c) { var d = this._labelSelector.addConjunct(a, b, c); this._onActiveFiltersChangedCallbacks.fire(this._labelSelector), this._renderActiveFilter(d); @@ -65752,6 +65782,7 @@ to{transform:rotate(359deg)}} .build-well,.deployment-well,.pod-well{overflow:hidden;margin-bottom:10px} .build-well .build-detail,.build-well .deployment-detail,.build-well .pod-detail,.deployment-well .build-detail,.deployment-well .deployment-detail,.deployment-well .pod-detail,.pod-well .build-detail,.pod-well .deployment-detail,.pod-well .pod-detail{margin-bottom:3px} .build-well .build-detail .build-detail-label,.build-well .build-detail .deployment-detail-label,.build-well .build-detail .pod-detail-label,.build-well .deployment-detail .build-detail-label,.build-well .deployment-detail .deployment-detail-label,.build-well .deployment-detail .pod-detail-label,.build-well .pod-detail .build-detail-label,.build-well .pod-detail .deployment-detail-label,.build-well .pod-detail .pod-detail-label,.deployment-well .build-detail .build-detail-label,.deployment-well .build-detail .deployment-detail-label,.deployment-well .build-detail .pod-detail-label,.deployment-well .deployment-detail .build-detail-label,.deployment-well .deployment-detail .deployment-detail-label,.deployment-well .deployment-detail .pod-detail-label,.deployment-well .pod-detail .build-detail-label,.deployment-well .pod-detail .deployment-detail-label,.deployment-well .pod-detail .pod-detail-label,.pod-well .build-detail .build-detail-label,.pod-well .build-detail .deployment-detail-label,.pod-well .build-detail .pod-detail-label,.pod-well .deployment-detail .build-detail-label,.pod-well .deployment-detail .deployment-detail-label,.pod-well .deployment-detail .pod-detail-label,.pod-well .pod-detail .build-detail-label,.pod-well .pod-detail .deployment-detail-label,.pod-well .pod-detail .pod-detail-label{margin-right:10px} +.build-well .build-status-button,.deployment-well .build-status-button,.pod-well .build-status-button{margin-left:7px} .animate-repeat.ng-enter,.animate-repeat.ng-leave,.animate-repeat.ng-move{-webkit-transition:all 1s;transition:all 1s} .animate-repeat.ng-enter,.animate-repeat.ng-leave.ng-leave-active,.animate-repeat.ng-move{opacity:0} .animate-repeat.ng-enter.ng-enter-active,.animate-repeat.ng-leave,.animate-repeat.ng-move.ng-move-active{opacity:1} @@ -67261,21 +67292,13 @@ Image stream {{buildConfig.spec.strategy.customStrategy.from | imageObjectRef :
-
+

{{build.metadata.name}}

-
-
- -
-
-Created: -
-
Status: @@ -67286,6 +67309,11 @@ Image stream {{buildConfig.spec.strategy.customStrategy.from | imageObjectRef : {{build.status.phase}} + + +
+
+Created:
Duration: @@ -68028,7 +68056,7 @@ failed
-Use the following settings from {{deployment.metadata.name}}: +Use the following settings from {{deployment.metadata.name}} when rolling back:
- +