diff --git a/app/index.html b/app/index.html
index 757186ce64..a1e24bfe82 100644
--- a/app/index.html
+++ b/app/index.html
@@ -328,6 +328,7 @@
JavaScript Required
+
diff --git a/app/scripts/controllers/secret.js b/app/scripts/controllers/secret.js
index 85041fd0a4..b0dd222f22 100644
--- a/app/scripts/controllers/secret.js
+++ b/app/scripts/controllers/secret.js
@@ -27,6 +27,16 @@ angular.module('openshiftConsole')
}
];
+ $scope.addToApplicationVisible = false;
+
+ $scope.addToApplication = function() {
+ $scope.addToApplicationVisible = true;
+ };
+
+ $scope.closeAddToApplication = function() {
+ $scope.addToApplicationVisible = false;
+ };
+
ProjectsService
.get($routeParams.project)
.then(_.spread(function(project, context) {
diff --git a/app/scripts/directives/addSecretToApplication.js b/app/scripts/directives/addSecretToApplication.js
new file mode 100644
index 0000000000..aa2542fae7
--- /dev/null
+++ b/app/scripts/directives/addSecretToApplication.js
@@ -0,0 +1,171 @@
+"use strict";
+(function() {
+ angular.module("openshiftConsole").component('addSecretToApplication', {
+ controller: [
+ '$filter',
+ '$scope',
+ 'APIService',
+ 'DataService',
+ 'NotificationsService',
+ 'StorageService',
+ AddSecretToApplication
+ ],
+ controllerAs: 'ctrl',
+ bindings: {
+ project: '<',
+ secret: '<',
+ onComplete: '<',
+ onCancel: '<'
+ },
+ templateUrl: 'views/directives/add-secret-to-application.html'
+ });
+
+ function AddSecretToApplication($filter, $scope, APIService, DataService, NotificationsService, StorageService) {
+ var ctrl = this;
+ var deploymentConfigs;
+ var deployments;
+ var replicationControllers;
+ var replicaSets;
+ var statefulSets;
+
+ var sortApplications = function() {
+ // Don't waste time sorting on each data load, just sort when we have them all
+ if (deploymentConfigs && deployments && replicationControllers && replicaSets && statefulSets) {
+ var apiObjects = deploymentConfigs.concat(deployments)
+ .concat(replicationControllers)
+ .concat(replicaSets)
+ .concat(statefulSets);
+ ctrl.applications = _.sortBy(apiObjects, ['metadata.name', 'kind']);
+ ctrl.updating = false;
+ }
+ };
+
+ var getApplications = function() {
+ var hasDeploymentFilter = $filter('hasDeployment');
+ var hasDeploymentConfigFilter = $filter('hasDeploymentConfig');
+
+ ctrl.updating = true;
+ var context = {
+ namespace: ctrl.project.metadata.name
+ };
+ // Load all the "application" types
+ DataService.list('deploymentconfigs', context).then(function(deploymentConfigData) {
+ deploymentConfigs = _.toArray(deploymentConfigData.by('metadata.name'));
+ sortApplications();
+ });
+ DataService.list('replicationcontrollers', context).then(function(replicationControllerData) {
+ replicationControllers = _.reject(replicationControllerData.by('metadata.name'), hasDeploymentConfigFilter);
+ sortApplications();
+ });
+ DataService.list({
+ group: 'apps',
+ resource: 'deployments'
+ }, context).then(function(deploymentData) {
+ deployments = _.toArray(deploymentData.by('metadata.name'));
+ sortApplications();
+ });
+ DataService.list({
+ group: 'extensions',
+ resource: 'replicasets'
+ }, context).then(function(replicaSetData) {
+ replicaSets = _.reject(replicaSetData.by('metadata.name'), hasDeploymentFilter);
+ sortApplications();
+ });
+ DataService.list({
+ group: 'apps',
+ resource: 'statefulsets'
+ }, context).then(function(statefulSetData) {
+ statefulSets = _.toArray(statefulSetData.by('metadata.name'));
+ sortApplications();
+ });
+ };
+
+ ctrl.$onInit = function() {
+ ctrl.addType = 'env';
+ ctrl.disableInputs = false;
+ getApplications();
+ };
+
+ ctrl.$postLink = function() {
+ $scope.$watch(function() {
+ return ctrl.application;
+ }, function() {
+ // Look at the existing mount paths so that we can warn if the new value is not unique.
+ var podTemplate = _.get(ctrl.application, 'spec.template');
+ ctrl.existingMountPaths = StorageService.getMountPaths(podTemplate);
+ });
+ };
+
+ ctrl.addToApplication = function() {
+ var podTemplate = _.get(ctrl.application, 'spec.template');
+
+ ctrl.disableInputs = true;
+
+ if (ctrl.addType === 'env') {
+ var newEnvFrom = {
+ secretRef: ctrl.secret.metadata
+ };
+
+ // For each container, add the new volume mount.
+ _.each(podTemplate.spec.containers, function(container) {
+ container.envFrom = container.envFrom || [];
+ container.envFrom.push(newEnvFrom);
+ });
+ } else {
+ var generateName = $filter('generateName');
+ var name = generateName('volume-');
+ var newVolumeMount = {
+ name: name,
+ mountPath: ctrl.mountVolume,
+ readOnly: true
+ };
+
+ // For each selected container, add the new volume mount.
+ _.each(podTemplate.spec.containers, function(container) {
+ container.volumeMounts = container.volumeMounts || [];
+ container.volumeMounts.push(newVolumeMount);
+ });
+
+ var newVolume = {
+ name: name,
+ secret: {
+ secretName: ctrl.secret.metadata.name,
+ }
+ };
+
+ podTemplate.spec.volumes = podTemplate.spec.volumes || [];
+ podTemplate.spec.volumes.push(newVolume);
+ }
+
+ var humanizeKind = $filter('humanizeKind');
+ var sourceKind = humanizeKind(ctrl.secret.kind);
+ var targetKind = humanizeKind(ctrl.application.kind);
+ var context = {
+ namespace: ctrl.project.metadata.name
+ };
+
+ DataService.update(APIService.kindToResource(ctrl.application.kind), ctrl.application.metadata.name, ctrl.application, context).then(
+ function() {
+ NotificationsService.addNotification({
+ type: "success",
+ message: "Successfully added " + sourceKind + " " + ctrl.secret.metadata.name + " to " + targetKind + " " + ctrl.application.metadata.name + "."
+ });
+ if (angular.isFunction(ctrl.onComplete)) {
+ ctrl.onComplete();
+ }
+ },
+ function(result) {
+ var getErrorDetails = $filter('getErrorDetails');
+
+ NotificationsService.addNotification({
+ type: "error",
+ message: "An error occurred adding " + sourceKind + " " + ctrl.secret.metadata.name + " to " + targetKind + " " + ctrl.application.metadata.name + ". " +
+ getErrorDetails(result)
+ });
+ }).finally(function() {
+ ctrl.disableInputs = false;
+ }
+ );
+ };
+ }
+})();
diff --git a/app/styles/_secrets.less b/app/styles/_secrets.less
index 08a7206b90..b3b45581a1 100644
--- a/app/styles/_secrets.less
+++ b/app/styles/_secrets.less
@@ -1,3 +1,58 @@
+.add-secret-to-application {
+ .catalogs-overlay-panel {
+ max-width: 600px;
+ }
+
+ .dialog-title {
+ border-bottom: 1px solid @color-pf-black-300;
+
+ h3 {
+ margin: 18px 0;
+ padding-left: 15px;
+ }
+ }
+
+ .dialog-body {
+ padding: 20px;
+
+ .add-choice {
+ margin-bottom: 10px;
+ }
+ .button-group {
+ .btn {
+ margin-left: 10px;
+ &:first-of-type {
+ margin-left: 0;
+ }
+ }
+ }
+ legend {
+ border-bottom: 0;
+ font-size: @font-size-base + 1;
+ font-weight: 600;
+ margin-bottom: 10px;
+ }
+ .radio {
+ margin-top: 0;
+ }
+ }
+
+ .updating {
+ background-color: @color-pf-white;
+ bottom: 55px;
+ left: 0;
+ padding-top: 60px;
+ position: absolute;
+ right: 0;
+ top: 55px;
+ z-index: 1000;
+ }
+
+ .volume-options {
+ margin-left: 20px;
+ }
+}
+
.osc-secrets-form {
.advanced-secrets,
.basic-secrets {
@@ -80,7 +135,7 @@ dl.secret-data {
}
.create-secret-modal {
- background-color: #F5F5F5;
+ background-color: @color-pf-black-150;
.modal-footer{
margin-top: 0px
}
diff --git a/app/views/browse/secret.html b/app/views/browse/secret.html
index ad84548998..ddac9b29ce 100644
--- a/app/views/browse/secret.html
+++ b/app/views/browse/secret.html
@@ -10,8 +10,11 @@ The secret details could not be loaded.
-
-
+
+
+
diff --git a/app/views/directives/add-secret-to-application.html b/app/views/directives/add-secret-to-application.html
new file mode 100644
index 0000000000..7e88b520c0
--- /dev/null
+++ b/app/views/directives/add-secret-to-application.html
@@ -0,0 +1,92 @@
+
+
+
Add to Application
+
+
+
diff --git a/dist/scripts/scripts.js b/dist/scripts/scripts.js
index be8564f3ef..0900a5dcd6 100644
--- a/dist/scripts/scripts.js
+++ b/dist/scripts/scripts.js
@@ -3,7 +3,7 @@
function OverviewController(e, t, n, a, r, o, i, s, c, l, u, d, m, p, f, g, h, v, y, b, C, S, w, k, j) {
var P = this, R = t("isIE")() || t("isEdge")();
e.projectName = n.project;
-var E, T, I = t("annotation"), N = t("buildConfigForBuild"), D = t("deploymentIsInProgress"), A = t("imageObjectRef"), B = t("isJenkinsPipelineStrategy"), L = t("isNewerResource"), U = t("label"), O = t("podTemplate"), F = {}, x = {}, M = {}, V = P.state = {
+var T, E, I = t("annotation"), N = t("buildConfigForBuild"), D = t("deploymentIsInProgress"), A = t("imageObjectRef"), B = t("isJenkinsPipelineStrategy"), L = t("isNewerResource"), U = t("label"), O = t("podTemplate"), F = {}, x = {}, M = {}, V = P.state = {
alerts: {},
builds: {},
clusterQuotas: {},
@@ -210,15 +210,15 @@ return "Succeeded" !== e.status.phase && "Failed" !== e.status.phase && (!U(e, "
V.podsByOwnerUID = C.groupByOwnerUID(P.pods), P.monopods = _.filter(V.podsByOwnerUID[""], je);
}, Re = function(e) {
return !!_.get(e, "status.replicas") || (!I(e, "deploymentConfig") || D(e));
-}, Ee = function(e) {
+}, Te = function(e) {
return I(e, "deploymentConfig");
-}, Te = function() {
+}, Ee = function() {
if (P.deploymentConfigs && P.replicationControllers) {
var e = [];
P.replicationControllersByDeploymentConfig = {}, P.currentByDeploymentConfig = {}, M = {};
var t = {}, n = {};
_.each(P.replicationControllers, function(a) {
-var r = Ee(a) || "";
+var r = Te(a) || "";
(!r || !P.deploymentConfigs[r] && _.get(a, "status.replicas")) && e.push(a);
var o = M[r];
o && !L(a, o) || (M[r] = a);
@@ -236,9 +236,9 @@ if (_.get(e, "status.replicas")) return !0;
var n = u.getRevision(e);
return !n || !!t && u.getRevision(t) === n;
}, Ne = function() {
-P.replicaSets && E && (P.replicaSetsByDeploymentUID = b.groupByControllerUID(P.replicaSets), P.currentByDeploymentUID = {}, _.each(P.replicaSetsByDeploymentUID, function(e, t) {
+P.replicaSets && T && (P.replicaSetsByDeploymentUID = b.groupByControllerUID(P.replicaSets), P.currentByDeploymentUID = {}, _.each(P.replicaSetsByDeploymentUID, function(e, t) {
if (t) {
-var n = E[t], a = _.filter(e, function(e) {
+var n = T[t], a = _.filter(e, function(e) {
return Ie(e, n);
}), r = u.sortByRevision(a);
P.replicaSetsByDeploymentUID[t] = r, P.currentByDeploymentUID[t] = _.head(r);
@@ -381,9 +381,9 @@ P.pods && p.fetchReferencedImageStreamImages(P.pods, V.imagesByDockerReference,
Ye.push(l.watch("pods", a, function(e) {
P.pods = e.by("metadata.name"), Pe(), r(), _e(), $e(P.monopods), pe(P.monopods), we(P.monopods), ie(), h.log("pods (subscribe)", P.pods);
})), Ye.push(l.watch("replicationcontrollers", a, function(e) {
-P.replicationControllers = e.by("metadata.name"), Te(), $e(P.vanillaReplicationControllers), $e(P.monopods), pe(P.vanillaReplicationControllers), we(P.vanillaReplicationControllers), Qe(), ie(), h.log("replicationcontrollers (subscribe)", P.replicationControllers);
+P.replicationControllers = e.by("metadata.name"), Ee(), $e(P.vanillaReplicationControllers), $e(P.monopods), pe(P.vanillaReplicationControllers), we(P.vanillaReplicationControllers), Qe(), ie(), h.log("replicationcontrollers (subscribe)", P.replicationControllers);
})), Ye.push(l.watch("deploymentconfigs", a, function(e) {
-P.deploymentConfigs = e.by("metadata.name"), Te(), $e(P.deploymentConfigs), $e(P.vanillaReplicationControllers), we(P.deploymentConfigs), Ce(), He(), We(), Qe(), ie(), h.log("deploymentconfigs (subscribe)", P.deploymentConfigs);
+P.deploymentConfigs = e.by("metadata.name"), Ee(), $e(P.deploymentConfigs), $e(P.vanillaReplicationControllers), we(P.deploymentConfigs), Ce(), He(), We(), Qe(), ie(), h.log("deploymentconfigs (subscribe)", P.deploymentConfigs);
})), Ye.push(l.watch({
group: "extensions",
resource: "replicasets"
@@ -393,7 +393,7 @@ P.replicaSets = e.by("metadata.name"), Ne(), $e(P.vanillaReplicaSets), $e(P.mono
group: "apps",
resource: "deployments"
}, a, function(e) {
-E = e.by("metadata.uid"), P.deployments = _.sortBy(E, "metadata.name"), Ne(), $e(P.deployments), $e(P.vanillaReplicaSets), we(P.deployments), Qe(), ie(), h.log("deployments (subscribe)", P.deploymentsByUID);
+T = e.by("metadata.uid"), P.deployments = _.sortBy(T, "metadata.name"), Ne(), $e(P.deployments), $e(P.vanillaReplicaSets), we(P.deployments), Qe(), ie(), h.log("deployments (subscribe)", P.deploymentsByUID);
})), Ye.push(l.watch("builds", a, function(e) {
V.builds = e.by("metadata.name"), Ke(), h.log("builds (subscribe)", V.builds);
})), Ye.push(l.watch({
@@ -429,7 +429,7 @@ P.horizontalPodAutoscalers = e.by("metadata.name"), Le(), h.log("autoscalers (su
poll: R,
pollInterval: 6e4
})), Ye.push(l.watch("imagestreams", a, function(e) {
-T = e.by("metadata.name"), p.buildDockerRefMapForImageStreams(T, V.imageStreamImageRefByDockerReference), r(), h.log("imagestreams (subscribe)", T);
+E = e.by("metadata.name"), p.buildDockerRefMapForImageStreams(E, V.imageStreamImageRefByDockerReference), r(), h.log("imagestreams (subscribe)", E);
}, {
poll: R,
pollInterval: 6e4
@@ -4714,9 +4714,9 @@ var t = a("annotation")(e, "deploymentVersion");
t && (n.logOptions.replicationControllers[e.metadata.name].version = t), n.logCanRun.replicationControllers[e.metadata.name] = !_.includes([ "New", "Pending" ], a("deploymentStatus")(e));
}, R = function(e) {
n.logOptions.builds[e.metadata.name] = {}, n.logCanRun.builds[e.metadata.name] = !_.includes([ "New", "Pending", "Error" ], e.status.phase);
-}, E = function() {
-n.filteredStatefulSets = s.filterForKeywords(_.values(n.statefulSets), S, w);
}, T = function() {
+n.filteredStatefulSets = s.filterForKeywords(_.values(n.statefulSets), S, w);
+}, E = function() {
b = _.filter(n.pods, function(e) {
return !n.filters.hideOlderResources || "Succeeded" !== e.status.phase && "Failed" !== e.status.phase;
}), n.filteredPods = s.filterForKeywords(b, S, w);
@@ -4780,13 +4780,13 @@ var t = _.get(n, [ "podsByOwnerUID", e.metadata.uid ], []);
_.isEmpty(t) || u.toPodsForDeployment(e, t);
}, m.get(e.project).then(_.spread(function(e, a) {
n.project = e, n.projectContext = a, o.watch("pods", a, function(e) {
-n.podsByName = e.by("metadata.name"), n.pods = C(n.podsByName, !0), n.podsByOwnerUID = d.groupByOwnerUID(n.pods), n.podsLoaded = !0, _.each(n.pods, j), T(), c.log("pods", n.pods);
+n.podsByName = e.by("metadata.name"), n.pods = C(n.podsByName, !0), n.podsByOwnerUID = d.groupByOwnerUID(n.pods), n.podsLoaded = !0, _.each(n.pods, j), E(), c.log("pods", n.pods);
}), o.watch({
resource: "statefulsets",
group: "apps",
version: "v1beta1"
}, a, function(e) {
-n.statefulSets = e.by("metadata.name"), n.statefulSetsLoaded = !0, E(), c.log("statefulSets", n.statefulSets);
+n.statefulSets = e.by("metadata.name"), n.statefulSetsLoaded = !0, T(), c.log("statefulSets", n.statefulSets);
}), o.watch("replicationcontrollers", a, function(e) {
n.replicationControllers = C(e.by("metadata.name"), !0), n.replicationControllersLoaded = !0, _.each(n.replicationControllers, P), U(), c.log("replicationcontrollers", n.replicationControllers);
}), o.watch("builds", a, function(e) {
@@ -4799,7 +4799,7 @@ n.replicaSets = C(e.by("metadata.name"), !0), n.replicaSetsLoaded = !0, O(), c.l
}), n.$on("$destroy", function() {
o.unwatchAll(f);
}), n.$watch("filters.hideOlderResources", function() {
-T(), A(), U(), O(), E();
+E(), A(), U(), O(), T();
var e = t.search();
e.hideOlderResources = n.filters.hideOlderResources ? "true" : "false", t.replace().search(e);
}), n.$watch("kindSelector.selected.kind", function() {
@@ -4897,14 +4897,14 @@ subjectName: n.name
httpErr: e("getErrorDetails")(a)
}));
});
-}, E = {};
-n.tab && (E[n.tab] = !0);
-var T = u.getSubjectKinds();
+}, T = {};
+n.tab && (T[n.tab] = !0);
+var E = u.getSubjectKinds();
angular.extend(a, {
-selectedTab: E,
+selectedTab: T,
projectName: g,
forms: {},
-subjectKinds: T,
+subjectKinds: E,
newBinding: {
role: "",
kind: n.tab || "User",
@@ -4980,7 +4980,7 @@ e && !_.includes(a.projects, e) ? a.projects = [ e ].concat(t) : a.projects = t;
}), l.get(n.project).then(_.spread(function(n, r) {
f = r, j(), k(f), angular.extend(a, {
project: n,
-subjectKinds: T,
+subjectKinds: E,
canUpdateRolebindings: y("rolebindings", "update", g),
confirmRemove: function(n, r, i) {
var c = null, l = I(n, r, i, a.user.metadata.name);
@@ -5739,10 +5739,10 @@ e.metricsAvailable = t;
});
var P = t("deploymentStatus"), R = function(t) {
e.logCanRun = !_.includes([ "New", "Pending" ], P(t));
-}, E = t("isIE")() || t("isEdge")();
+}, T = t("isIE")() || t("isEdge")();
g.get(n.project).then(_.spread(function(u, g) {
e.project = u, e.projectContext = g;
-var v = {}, T = function() {
+var v = {}, E = function() {
if (e.hpaForRS = s.filterHPA(v, y, n.replicaSet), e.deploymentConfigName && e.isActive) {
var t = s.filterHPA(v, "DeploymentConfig", e.deploymentConfigName);
e.autoscalers = e.hpaForRS.concat(t);
@@ -5755,7 +5755,7 @@ j.push(o.watch(e.resource, g, function(t) {
var n, a = [];
angular.forEach(t.by("metadata.name"), function(t) {
(C(t, "deploymentConfig") || "") === e.deploymentConfigName && a.push(t);
-}), n = i.getActiveDeployment(a), e.isActive = n && n.metadata.uid === e.replicaSet.metadata.uid, T();
+}), n = i.getActiveDeployment(a), e.isActive = n && n.metadata.uid === e.replicaSet.metadata.uid, E();
}));
}, N = function() {
s.getHPAWarnings(e.replicaSet, e.autoscalers, e.limitRanges, u).then(function(t) {
@@ -5813,7 +5813,7 @@ title: e.deployment.metadata.name,
link: m.resourceURL(e.deployment)
},
humanizedKind: "Deployments"
-}), $(), T();
+}), $(), E();
})), j.push(o.watch({
group: "extensions",
resource: "replicasets"
@@ -5876,9 +5876,9 @@ group: "autoscaling",
resource: "horizontalpodautoscalers",
version: "v1"
}, g, function(e) {
-v = e.by("metadata.name"), T(), N();
+v = e.by("metadata.name"), E(), N();
}, {
-poll: E,
+poll: T,
pollInterval: 6e4
})), o.list("limitranges", g).then(function(t) {
e.limitRanges = t.by("metadata.name"), N();
@@ -6106,7 +6106,11 @@ title: "Secrets",
link: "project/" + e.project + "/browse/secrets"
}, {
title: n.secretName
-} ], r.get(e.project).then(_.spread(function(e, t) {
+} ], n.addToApplicationVisible = !1, n.addToApplication = function() {
+n.addToApplicationVisible = !0;
+}, n.closeAddToApplication = function() {
+n.addToApplicationVisible = !1;
+}, r.get(e.project).then(_.spread(function(e, t) {
n.project = e, n.context = t, a.get("secrets", n.secretName, t, {
errorNotification: !1
}).then(function(e) {
@@ -6639,7 +6643,7 @@ e.$on("$destroy", b), u.get(a.project).then(_.spread(function(n, r) {
e.project = n, e.context = r, i.canI("buildconfigs", "update", a.project) ? s.get("buildconfigs", a.buildconfig, r, {
errorNotification: !1
}).then(function(t) {
-e.buildConfig = t, f(), e.updatedBuildConfig = angular.copy(e.buildConfig), e.buildStrategy = v(e.updatedBuildConfig), e.strategyType = e.buildConfig.spec.strategy.type, e.envVars = e.buildStrategy.env || [], e.triggers = C(e.triggers, e.buildConfig.spec.triggers), e.sources = E(e.sources, e.buildConfig.spec.source), _.has(t, "spec.strategy.jenkinsPipelineStrategy.jenkinsfile") && (e.jenkinsfileOptions.type = "inline"), s.list("secrets", r).then(function(t) {
+e.buildConfig = t, f(), e.updatedBuildConfig = angular.copy(e.buildConfig), e.buildStrategy = v(e.updatedBuildConfig), e.strategyType = e.buildConfig.spec.strategy.type, e.envVars = e.buildStrategy.env || [], e.triggers = C(e.triggers, e.buildConfig.spec.triggers), e.sources = T(e.sources, e.buildConfig.spec.source), _.has(t, "spec.strategy.jenkinsPipelineStrategy.jenkinsfile") && (e.jenkinsfileOptions.type = "inline"), s.list("secrets", r).then(function(t) {
var n = m.groupSecretsByType(t), a = _.mapValues(n, function(e) {
return _.map(e, "metadata.name");
});
@@ -6832,7 +6836,7 @@ var a = "Custom" === e.strategyType ? "secretSource" : "secret", r = _.filter(n,
return e[a].name;
});
_.isEmpty(r) ? delete t.secrets : t.secrets = r;
-}, E = function(e, t) {
+}, T = function(e, t) {
return "None" === t.type ? e : (e.none = !1, angular.forEach(t, function(t, n) {
e[n] = !0;
}), e);
@@ -7543,10 +7547,10 @@ link: "project/" + e.projectName + "/create?tab=fromCatalog"
}, {
title: R
} ];
-var E = {
+var T = {
name: "app",
value: ""
-}, T = t("orderByDisplayName"), I = t("getErrorDetails"), N = {}, D = function() {
+}, E = t("orderByDisplayName"), I = t("getErrorDetails"), N = {}, D = function() {
g.hideNotification("create-builder-list-config-maps-error"), g.hideNotification("create-builder-list-secrets-error"), _.each(N, function(e) {
!e.id || "error" !== e.type && "warning" !== e.type || g.hideNotification(e.id);
});
@@ -7567,7 +7571,7 @@ h = e.by("metadata.name"), m.log("quotas", h);
}), c.list("appliedclusterresourcequotas", n).then(function(e) {
y = e.by("metadata.name"), m.log("cluster quotas", y);
}), e.$watch("scaling.autoscale", S), e.$watch("container", S, !0), e.$watch("name", function(e, t) {
-E.value && E.value !== t || (E.value = e);
+T.value && T.value !== t || (T.value = e);
}), function(a) {
a.name = r.name, a.imageName = P, a.imageTag = r.imageTag, a.namespace = r.namespace, a.buildConfig = {
buildOnSourceChange: !0,
@@ -7587,7 +7591,7 @@ deployOnConfigChange: !0
}, a.DCEnvVarsFromImage, a.DCEnvVarsFromUser = [], a.routing = {
include: !0,
portOptions: []
-}, a.labelArray = [ E ], a.annotations = {}, a.scaling = {
+}, a.labelArray = [ T ], a.annotations = {}, a.scaling = {
replicas: 1,
autoscale: !1,
autoscaleOptions: [ {
@@ -7611,7 +7615,7 @@ var o = [], i = [];
e.valueFromObjects = [], c.list("configmaps", n, null, {
errorNotification: !1
}).then(function(t) {
-o = T(t.by("metadata.name")), e.valueFromObjects = o.concat(i);
+o = E(t.by("metadata.name")), e.valueFromObjects = o.concat(i);
}, function(e) {
403 !== e.code && g.addNotification({
id: "create-builder-list-config-maps-error",
@@ -7622,7 +7626,7 @@ details: I(e)
}), c.list("secrets", n, null, {
errorNotification: !1
}).then(function(t) {
-i = T(t.by("metadata.name")), e.valueFromObjects = i.concat(o);
+i = E(t.by("metadata.name")), e.valueFromObjects = i.concat(o);
var n = b.groupSecretsByType(t), a = _.mapValues(n, function(e) {
return _.map(e, "metadata.name");
});
@@ -9228,7 +9232,7 @@ selectedProject: p.project
}, p.aceLoaded = function(e) {
(j = e.getSession()).setOption("tabSize", 2), j.setOption("useSoftTabs", !0), e.setDragDelay = 0, e.$blockScrolling = 1 / 0;
};
-var E = function(e) {
+var T = function(e) {
a.open({
animation: !0,
templateUrl: "views/modals/confirm.html",
@@ -9245,18 +9249,18 @@ cancelButtonText: "Cancel"
}
}
}).result.then(y);
-}, T = {}, I = function() {
-c.hideNotification("from-file-error"), _.each(T, function(e) {
+}, E = {}, I = function() {
+c.hideNotification("from-file-error"), _.each(E, function(e) {
!e.id || "error" !== e.type && "warning" !== e.type || c.hideNotification(e.id);
});
}, N = function(e) {
-I(), T = u.getSecurityAlerts(p.createResources, p.input.selectedProject.metadata.name);
+I(), E = u.getSecurityAlerts(p.createResources, p.input.selectedProject.metadata.name);
var t = e.quotaAlerts || [];
-T = T.concat(t), _.filter(T, {
+E = E.concat(t), _.filter(E, {
type: "error"
-}).length ? (_.each(T, function(e) {
+}).length ? (_.each(E, function(e) {
e.id = _.uniqueId("from-file-alert-"), c.addNotification(e);
-}), p.disableInputs = !1) : T.length ? (E(T), p.disableInputs = !1) : y();
+}), p.disableInputs = !1) : E.length ? (T(E), p.disableInputs = !1) : y();
}, D = function() {
if (_.has(p.input.selectedProject, "metadata.uid")) return n.when(p.input.selectedProject);
var t = p.input.selectedProject.metadata.name, a = p.input.selectedProject.metadata.annotations["new-display-name"], r = e("description")(p.input.selectedProject);
@@ -10589,7 +10593,105 @@ showAction: "=?"
},
templateUrl: "views/directives/action-chip.html"
};
-}), angular.module("openshiftConsole").directive("templateOptions", function() {
+}), function() {
+angular.module("openshiftConsole").component("addSecretToApplication", {
+controller: [ "$filter", "$scope", "APIService", "DataService", "NotificationsService", "StorageService", function(e, t, n, a, r, o) {
+var i, s, c, l, u, d = this, m = function() {
+if (i && s && c && l && u) {
+var e = i.concat(s).concat(c).concat(l).concat(u);
+d.applications = _.sortBy(e, [ "metadata.name", "kind" ]), d.updating = !1;
+}
+}, p = function() {
+var t = e("hasDeployment"), n = e("hasDeploymentConfig");
+d.updating = !0;
+var r = {
+namespace: d.project.metadata.name
+};
+a.list("deploymentconfigs", r).then(function(e) {
+i = _.toArray(e.by("metadata.name")), m();
+}), a.list("replicationcontrollers", r).then(function(e) {
+c = _.reject(e.by("metadata.name"), n), m();
+}), a.list({
+group: "apps",
+resource: "deployments"
+}, r).then(function(e) {
+s = _.toArray(e.by("metadata.name")), m();
+}), a.list({
+group: "extensions",
+resource: "replicasets"
+}, r).then(function(e) {
+l = _.reject(e.by("metadata.name"), t), m();
+}), a.list({
+group: "apps",
+resource: "statefulsets"
+}, r).then(function(e) {
+u = _.toArray(e.by("metadata.name")), m();
+});
+};
+d.$onInit = function() {
+d.addType = "env", d.disableInputs = !1, p();
+}, d.$postLink = function() {
+t.$watch(function() {
+return d.application;
+}, function() {
+var e = _.get(d.application, "spec.template");
+d.existingMountPaths = o.getMountPaths(e);
+});
+}, d.addToApplication = function() {
+var t = _.get(d.application, "spec.template");
+if (d.disableInputs = !0, "env" === d.addType) {
+var o = {
+secretRef: d.secret.metadata
+};
+_.each(t.spec.containers, function(e) {
+e.envFrom = e.envFrom || [], e.envFrom.push(o);
+});
+} else {
+var i = e("generateName")("volume-"), s = {
+name: i,
+mountPath: d.mountVolume,
+readOnly: !0
+};
+_.each(t.spec.containers, function(e) {
+e.volumeMounts = e.volumeMounts || [], e.volumeMounts.push(s);
+});
+var c = {
+name: i,
+secret: {
+secretName: d.secret.metadata.name
+}
+};
+t.spec.volumes = t.spec.volumes || [], t.spec.volumes.push(c);
+}
+var l = e("humanizeKind"), u = l(d.secret.kind), m = l(d.application.kind), p = {
+namespace: d.project.metadata.name
+};
+a.update(n.kindToResource(d.application.kind), d.application.metadata.name, d.application, p).then(function() {
+r.addNotification({
+type: "success",
+message: "Successfully added " + u + " " + d.secret.metadata.name + " to " + m + " " + d.application.metadata.name + "."
+}), angular.isFunction(d.onComplete) && d.onComplete();
+}, function(t) {
+var n = e("getErrorDetails");
+r.addNotification({
+type: "error",
+message: "An error occurred adding " + u + " " + d.secret.metadata.name + " to " + m + " " + d.application.metadata.name + ". " + n(t)
+});
+}).finally(function() {
+d.disableInputs = !1;
+});
+};
+} ],
+controllerAs: "ctrl",
+bindings: {
+project: "<",
+secret: "<",
+onComplete: "<",
+onCancel: "<"
+},
+templateUrl: "views/directives/add-secret-to-application.html"
+});
+}(), angular.module("openshiftConsole").directive("templateOptions", function() {
return {
restrict: "E",
templateUrl: "views/_templateopt.html",
@@ -10823,8 +10925,8 @@ Used: t.available > 0 ? "#0088ce" : "#ec7a08",
Available: "#d1d1d1"
}
};
-E[t.id] ? E[t.id].load(r) : ((n = B(e)).data = r, a(function() {
-$ || (E[t.id] = c3.generate(n));
+T[t.id] ? T[t.id].load(r) : ((n = B(e)).data = r, a(function() {
+$ || (T[t.id] = c3.generate(n));
}));
}
}
@@ -10837,10 +10939,10 @@ _.each(e.datasets, function(e) {
t[e.id] = e.data;
});
var n, r = c.getSparklineData(t), o = e.chartPrefix + "sparkline";
-T[o] ? T[o].load(r) : ((n = L(e)).data = r, e.chartDataColors && (n.color = {
+E[o] ? E[o].load(r) : ((n = L(e)).data = r, e.chartDataColors && (n.color = {
pattern: e.chartDataColors
}), a(function() {
-$ || (T[o] = c3.generate(n));
+$ || (E[o] = c3.generate(n));
}));
}
}
@@ -10928,7 +11030,7 @@ m.loaded = !0;
}
}
m.includedMetrics = m.includedMetrics || [ "cpu", "memory", "network" ];
-var R, E = {}, T = {}, I = n("resources.limits.memory"), N = n("resources.limits.cpu"), D = 30, $ = !1;
+var R, T = {}, E = {}, I = n("resources.limits.memory"), N = n("resources.limits.cpu"), D = 30, $ = !1;
m.uniqueID = c.uniqueID(), m.metrics = [], _.includes(m.includedMetrics, "memory") && m.metrics.push({
label: "Memory",
units: "MiB",
@@ -11025,14 +11127,14 @@ delete e.data;
}, !0), R = t(P, c.getDefaultUpdateInterval(), !1);
});
var O = o.$on("metrics.charts.resize", function() {
-c.redraw(E), c.redraw(T);
+c.redraw(T), c.redraw(E);
});
m.$on("$destroy", function() {
-R && (t.cancel(R), R = null), O && (O(), O = null), angular.forEach(E, function(e) {
+R && (t.cancel(R), R = null), O && (O(), O = null), angular.forEach(T, function(e) {
e.destroy();
-}), E = null, angular.forEach(T, function(e) {
+}), T = null, angular.forEach(E, function(e) {
e.destroy();
-}), T = null, $ = !0;
+}), E = null, $ = !0;
});
}
};
@@ -11148,7 +11250,7 @@ _.set(R, [ e, n ], i);
} else _.set(R, [ e, n ], r);
}
function y() {
-if (!E && h()) {
+if (!T && h()) {
P = Date.now();
var e = f();
c.getPodMetrics(e).then(u, g).finally(function() {
@@ -11158,7 +11260,7 @@ t.loaded = !0;
}
var b, C = {}, S = 30, w = "compact" === t.profile, k = !1;
t.uniqueID = s.uniqueID();
-var j, P, R = {}, E = w, T = function(e) {
+var j, P, R = {}, T = w, E = function(e) {
return e >= 1024;
};
t.metrics = [ {
@@ -11166,10 +11268,10 @@ label: "Memory",
units: "MiB",
convert: i.bytesToMiB,
formatUsage: function(e) {
-return T(e) && (e /= 1024), s.formatUsage(e);
+return E(e) && (e /= 1024), s.formatUsage(e);
},
usageUnits: function(e) {
-return T(e) ? "GiB" : "MiB";
+return E(e) ? "GiB" : "MiB";
},
descriptor: "memory/usage",
type: "pod_container",
@@ -11231,7 +11333,7 @@ return _.set(n, "legend.show", !w && !t.showAverage), n;
t.$watch("options", function() {
R = {}, j = null, delete t.metricsError, y();
}, !0), b = e(y, s.getDefaultUpdateInterval(), !1), t.updateInView = function(e) {
-E = !e, e && (!P || Date.now() > P + s.getDefaultUpdateInterval()) && y();
+T = !e, e && (!P || Date.now() > P + s.getDefaultUpdateInterval()) && y();
};
var $ = r.$on("metrics.charts.resize", function() {
s.redraw(C);
@@ -11310,11 +11412,11 @@ y = setInterval(function() {
n > 10 ? e() : (n++, j().is(":visible") && (P(), e()));
}, 100);
}
-}, E = _.debounce(function() {
+}, T = _.debounce(function() {
P(!0), b(), S();
}, 100);
-m.on("resize", E);
-var T, I = function() {
+m.on("resize", T);
+var E, I = function() {
C = !0, d.scrollBottom(u);
}, N = document.createDocumentFragment(), D = _.debounce(function() {
l.appendChild(N), N = document.createDocumentFragment(), t.autoScrollActive && I(), t.showScrollLinks || b();
@@ -11322,9 +11424,9 @@ l.appendChild(N), N = document.createDocumentFragment(), t.autoScrollActive && I
maxWait: 300
}), A = function(e) {
var t = r.defer();
-return T ? (T.onClose(function() {
+return E ? (E.onClose(function() {
t.resolve();
-}), T.stop()) : t.resolve(), e || (D.cancel(), l && (l.innerHTML = ""), N = document.createDocumentFragment()), t.promise;
+}), E.stop()) : t.resolve(), e || (D.cancel(), l && (l.innerHTML = ""), N = document.createDocumentFragment()), t.promise;
}, B = function() {
A().then(function() {
t.$evalAsync(function() {
@@ -11344,7 +11446,7 @@ limitBytes: 10485760
}, t.options), n = 0, a = function(e) {
n++, N.appendChild(f(n, e)), D();
};
-(T = c.createStream(h, v, t.context, e)).onMessage(function(r, o, i) {
+(E = c.createStream(h, v, t.context, e)).onMessage(function(r, o, i) {
t.$evalAsync(function() {
t.empty = !1, "logs" !== t.state && (t.state = "logs", R());
}), r && (e.limitBytes && i >= e.limitBytes && (t.$evalAsync(function() {
@@ -11352,18 +11454,18 @@ t.limitReached = !0, t.loading = !1;
}), A(!0)), a(r), !t.largeLog && n >= e.tailLines && t.$evalAsync(function() {
t.largeLog = !0;
}));
-}), T.onClose(function() {
-T = null, t.$evalAsync(function() {
+}), E.onClose(function() {
+E = null, t.$evalAsync(function() {
t.loading = !1, t.autoScrollActive = !1, 0 !== n || t.emptyStateMessage || (t.state = "empty", t.emptyStateMessage = "The logs are no longer available or could not be loaded.");
});
-}), T.onError(function() {
-T = null, t.$evalAsync(function() {
+}), E.onError(function() {
+E = null, t.$evalAsync(function() {
angular.extend(t, {
loading: !1,
autoScrollActive: !1
}), 0 === n ? (t.state = "empty", t.emptyStateMessage = "The logs are no longer available or could not be loaded.") : t.errorWhileRunning = !0;
});
-}), T.start();
+}), E.start();
}
});
});
@@ -11409,7 +11511,7 @@ t.autoScrollActive = !t.autoScrollActive, t.autoScrollActive && I();
goChromeless: d.chromelessLink,
restartLogs: B
}), t.$on("$destroy", function() {
-A(), m.off("resize", E), m.off("scroll", S), u && $(u).off("scroll", S);
+A(), m.off("resize", T), m.off("scroll", S), u && $(u).off("scroll", S);
}), "deploymentconfigs/logs" === h && !v) return t.state = "empty", void (t.emptyStateMessage = "Logs are not available for this replication controller because it was not generated from a deployment configuration.");
t.$watchGroup([ "name", "options.container", "run" ], B);
} ],
@@ -13501,7 +13603,7 @@ hasErrors: r
project: n.input.selectedProject,
appName: n.app.name
}) : s.toNextSteps(n.app.name, n.input.selectedProject.metadata.name);
-}, E = function(e) {
+}, T = function(e) {
a.open({
animation: !0,
templateUrl: "views/modals/confirm.html",
@@ -13518,14 +13620,14 @@ cancelButtonText: "Cancel"
}
}
}).result.then(R);
-}, T = function(e) {
+}, E = function(e) {
h = e.quotaAlerts || [];
var t = _.filter(h, {
type: "error"
});
n.nameTaken || t.length ? (n.disableInputs = !1, _.each(h, function(e) {
e.id = _.uniqueId("deploy-image-alert-"), c.addNotification(e);
-})) : h.length ? (E(h), n.disableInputs = !1) : R();
+})) : h.length ? (T(h), n.disableInputs = !1) : R();
};
n.create = function() {
n.disableInputs = !0, v(), y().then(function(e) {
@@ -13535,7 +13637,7 @@ namespace: n.input.selectedProject.metadata.name
}), o = function(e) {
return n.nameTaken = e.nameTaken, a;
};
-t.then(o, o).then(T, T);
+t.then(o, o).then(E, E);
}, function(e) {
c.addNotification({
id: "deploy-image-create-project-error",
@@ -13994,14 +14096,14 @@ e.totalUnread = j(e.notifications).length, e.hasUnread = !!e.totalUnread, o.$emi
});
}, R = function() {
_.each(v, P);
-}, E = function(e) {
-return _.orderBy(e, [ "event.lastTimestamp", "event.firstTimestamp" ], [ "desc", "desc" ]);
}, T = function(e) {
+return _.orderBy(e, [ "event.lastTimestamp", "event.firstTimestamp" ], [ "desc", "desc" ]);
+}, E = function(e) {
var t = _.sortBy(e, function(e) {
return e.heading;
});
return _.each(t, function(e) {
-e.notifications = E(e.notifications), e.counts = P(e);
+e.notifications = T(e.notifications), e.counts = P(e);
}), t;
}, I = function(e) {
var t = {};
@@ -14026,7 +14128,7 @@ return e.project.metadata.name === r.project;
});
});
}, A = function(e) {
-h = I(e.by("metadata.uid")), v = T(h), $();
+h = I(e.by("metadata.uid")), v = E(h), $();
}, B = {
Normal: "pficon pficon-info",
Warning: "pficon pficon-warning-triangle-o"
diff --git a/dist/scripts/templates.js b/dist/scripts/templates.js
index 6bc308b253..e183012f32 100644
--- a/dist/scripts/templates.js
+++ b/dist/scripts/templates.js
@@ -3571,13 +3571,19 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
"\n" +
"\n" +
"
\n" +
- "\n" +
- "
\n" +
+ "\n" +
+ "
\n" +
+ "Add to Application\n" +
+ "\n" +
+ "
\n" +
"Actions\n" +
"\n" +
"\n" +
"
Actions\n" +
"\n" +
"
\n" +
+ "\n" +
+ "
\n" +
"{{secret.metadata.name}}\n" +
"created \n" +
"\n" +
@@ -3630,6 +3638,9 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
" \n" +
"
\n" +
"\n" +
+ "\n" +
+ "\n" +
+ "\n" +
"\n" +
""
);
@@ -5531,6 +5542,79 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
);
+ $templateCache.put('views/directives/add-secret-to-application.html',
+ "\n" +
+ "
\n" +
+ "
Add to Application
\n" +
+ "\n" +
+ "
\n" +
+ "
\n" +
+ "
\n" +
+ "
\n" +
+ "
\n" +
+ "Updating\n" +
+ "
\n" +
+ "
\n" +
+ "
\n" +
+ "
"
+ );
+
+
$templateCache.put('views/directives/annotations.html',
"\n" +
"Show Annotations\n" +
diff --git a/dist/styles/main.css b/dist/styles/main.css
index 15de5c4c76..f439f15cf8 100644
--- a/dist/styles/main.css
+++ b/dist/styles/main.css
@@ -3,6 +3,7 @@ body,figure{margin:0}
.text-left,caption,th{text-align:left}
.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}
.c3 svg,html{-webkit-tap-highlight-color:transparent}
+.list-view-pf-top-align .list-view-pf-actions,.list-view-pf-top-align .list-view-pf-checkbox{align-self:flex-start}
.fa,.font-icon,.glyphicon{-moz-osx-font-smoothing:grayscale}
@font-face{font-family:"Open Sans";font-style:normal;font-weight:300;src:url(../styles/fonts/OpenSans-Light-webfont.eot);src:local("Open Sans Light"),local("OpenSans-Light"),url(../styles/fonts/OpenSans-Light-webfont.eot?#iefix) format("embedded-opentype"),url(../styles/fonts/OpenSans-Light-webfont.woff2) format("woff2"),url(../styles/fonts/OpenSans-Light-webfont.woff) format("woff"),url(../styles/fonts/OpenSans-Light-webfont.ttf) format("truetype"),url(../styles/fonts/OpenSans-Light-webfont.svg#OpenSans) format("svg")}
@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;src:url(../styles/fonts/OpenSans-Regular-webfont.eot);src:local("Open Sans"),local("OpenSans"),url(../styles/fonts/OpenSans-Regular-webfont.eot?#iefix) format("embedded-opentype"),url(../styles/fonts/OpenSans-Regular-webfont.woff2) format("woff2"),url(../styles/fonts/OpenSans-Regular-webfont.woff) format("woff"),url(../styles/fonts/OpenSans-Regular-webfont.ttf) format("truetype"),url(../styles/fonts/OpenSans-Regular-webfont.svg#OpenSans) format("svg")}
@@ -766,6 +767,7 @@ select[multiple].input-lg,textarea.input-lg{height:auto}
.form-horizontal .form-group-sm .control-label{padding-top:3px;font-size:11px}
}
.btn{display:inline-block;margin-bottom:0;font-weight:600;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:2px 6px;font-size:13px;line-height:1.66666667;border-radius:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
+.bootstrap-switch,.datepicker table{-webkit-user-select:none;-moz-user-select:none}
.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin!important;outline:-webkit-focus-ring-color auto 5px!important;outline-offset:-2px!important}
.btn.focus,.btn:focus,.btn:hover{color:#4d5258;text-decoration:none}
.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}
@@ -950,7 +952,7 @@ select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.i
.navbar-collapse.in{overflow-y:visible}
.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}
}
-.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}
+.carousel-inner,.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}
@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}
}
.membership .ui-select-bootstrap>.ui-select-choices,.typeahead-long{max-height:300px}
@@ -1336,7 +1338,7 @@ button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance
.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}
.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#bbb}
.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}
-.carousel-inner{overflow:hidden;width:100%}
+.carousel-inner{width:100%}
.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}
@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}
.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}
@@ -2374,7 +2376,7 @@ td>.progress:first-child:last-child{margin-bottom:0;margin-top:3px}
.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}
.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #bbb}
.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}
-.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
+.datepicker table{margin:0;-webkit-touch-callout:none;-khtml-user-select:none;-ms-user-select:none;user-select:none}
.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border:none}
.datepicker table tr td.new,.datepicker table tr td.old{color:#9c9c9c}
.datepicker table tr td.day:hover,.datepicker table tr td.focused{background:#f1f1f1;cursor:pointer}
@@ -2510,7 +2512,8 @@ select.bs-select-hidden,select.selectpicker{display:none!important}
.bs-donebutton .btn-group button{width:100%}
.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}
.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none}
-.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:1px;border:1px solid #bbb;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}
+.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:1px;border:1px solid #bbb;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}
+.c3 text,.log-line-number{-moz-user-select:none;-webkit-user-select:none}
.bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:1px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}
.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block!important;height:100%;padding:2px 6px;font-size:13px;line-height:21px}
.ie9.layout-pf-alt-fixed .nav-pf-vertical-alt,.ie9.layout-pf-fixed .nav-pf-secondary-nav,.ie9.layout-pf-fixed .nav-pf-tertiary-nav,.ie9.layout-pf-fixed .nav-pf-vertical,.list-group-item-header{box-sizing:content-box}
@@ -2544,7 +2547,7 @@ select.bs-select-hidden,select.selectpicker{display:none!important}
.bootstrap-touchspin .input-group-btn-vertical i{position:absolute;font-weight:400}
.c3 svg{font:10px sans-serif}
.c3 line,.c3 path{fill:none;stroke:#000}
-.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}
+.c3 text{user-select:none}
.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}
.c3-chart-arc text{fill:#fff;font-size:13px}
.c3-grid text{fill:#aaa}
@@ -3129,7 +3132,6 @@ a.disabled{color:#8b8d8f;cursor:not-allowed;text-decoration:none}
}
.list-view-pf-actions{float:right;margin-bottom:20px;margin-left:20px;margin-top:20px;order:2}
.list-view-pf-actions .dropdown-kebab-pf,.list-view-pf-actions button,.list-view-pf-actions>a{margin-left:10px}
-.list-view-pf-top-align .list-view-pf-actions{align-self:flex-start}
.list-view-pf-additional-info{align-items:center;display:flex;flex-wrap:wrap}
@media (min-width:992px){.list-view-pf-additional-info{flex:1 0 auto;float:left;width:50%}
}
@@ -3144,7 +3146,6 @@ a.disabled{color:#8b8d8f;cursor:not-allowed;text-decoration:none}
@media (min-width:992px){.list-view-pf-body{align-items:center;display:flex;flex-direction:row}
}
.list-view-pf-checkbox{border-right:1px solid #d1d1d1;float:left;margin-right:15px;padding:3px 10px 3px 0}
-.list-view-pf-top-align .list-view-pf-checkbox{align-self:flex-start}
.list-view-pf-stacked .list-view-pf-description{display:block;flex:none}
@media (min-width:992px){.list-view-pf-description{align-items:center;display:flex;float:left;width:50%}
}
@@ -5307,6 +5308,17 @@ td.visible-print,th.visible-print{display:table-cell!important}
.landing::-webkit-scrollbar-track{background-color:#042e43}
.landing-side-bar::-webkit-scrollbar-track{background-color:#21272e}
.project-bar ::-webkit-scrollbar-track{background-color:#050505}
+.add-secret-to-application .catalogs-overlay-panel{max-width:600px}
+.add-secret-to-application .dialog-title{border-bottom:1px solid #d1d1d1}
+.add-secret-to-application .dialog-title h3{margin:18px 0;padding-left:15px}
+.add-secret-to-application .dialog-body{padding:20px}
+.add-secret-to-application .dialog-body .add-choice{margin-bottom:10px}
+.add-secret-to-application .dialog-body .button-group .btn{margin-left:10px}
+.add-secret-to-application .dialog-body .button-group .btn:first-of-type{margin-left:0}
+.add-secret-to-application .dialog-body legend{border-bottom:0;font-size:14px;font-weight:600;margin-bottom:10px}
+.add-secret-to-application .dialog-body .radio{margin-top:0}
+.add-secret-to-application .updating{background-color:#fff;bottom:55px;left:0;padding-top:60px;position:absolute;right:0;top:55px;z-index:1000}
+.add-secret-to-application .volume-options{margin-left:20px}
.osc-secrets-form .advanced-secrets .help-blocks,.osc-secrets-form .advanced-secrets .input-labels,.osc-secrets-form .basic-secrets .help-blocks,.osc-secrets-form .basic-secrets .input-labels{display:table;padding-right:30px;position:relative;width:100%}
.osc-secrets-form .advanced-secrets .help-blocks .help-block,.osc-secrets-form .advanced-secrets .help-blocks .input-label,.osc-secrets-form .advanced-secrets .input-labels .help-block,.osc-secrets-form .advanced-secrets .input-labels .input-label,.osc-secrets-form .basic-secrets .help-blocks .help-block,.osc-secrets-form .basic-secrets .help-blocks .input-label,.osc-secrets-form .basic-secrets .input-labels .help-block,.osc-secrets-form .basic-secrets .input-labels .input-label{width:100%;float:left;padding-right:5px}
.osc-secrets-form .advanced-secrets .secret-row,.osc-secrets-form .basic-secrets .secret-row{display:table;padding-right:30px;position:relative;width:100%;margin-bottom:15px}
@@ -5322,7 +5334,7 @@ dl.secret-data dt{margin-bottom:5px}
dl.secret-data dt{clear:left;float:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:160px}
}
dl.secret-data pre{margin-bottom:0}
-.create-secret-modal{background-color:#F5F5F5}
+.create-secret-modal{background-color:#f5f5f5}
.create-secret-modal .modal-footer{margin-top:0px}
.create-secret-modal .modal-body{padding:0px 18px}
.create-secret-editor{height:150px}
@@ -5657,7 +5669,7 @@ alerts+.chromeless .log-loading-msg{margin-top:130px}
.log-line{color:#d1d1d1}
.log-line:hover{background-color:#22262b;color:#ededed}
.log-line-number:before{content:attr(data-line-number)}
-.log-line-number{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;border-right:1px #272b30 solid;padding-right:10px;vertical-align:top;white-space:nowrap;width:60px;color:#72767b}
+.log-line-number{-ms-user-select:none;border-right:1px #272b30 solid;padding-right:10px;vertical-align:top;white-space:nowrap;width:60px;color:#72767b}
.log-line-text{padding:0 10px;white-space:pre-wrap;width:100%;word-wrap:break-word;word-break:break-word;overflow-wrap:break-word;min-width:0}
.appended-icon,.project-date [am-time-ago],.projects-list [am-time-ago]{white-space:nowrap}
.log-line-text::-moz-selection{color:#101214;background:#e5e5e5}