diff --git a/src/app/backend/replicasetdetail.go b/src/app/backend/replicasetdetail.go index d9952f8bf0bb74cc62f932c6b56a5f5ac9ed0d1f..b77fcebd2181218b0cfd029c07a9078351e61ceb 100644 --- a/src/app/backend/replicasetdetail.go +++ b/src/app/backend/replicasetdetail.go @@ -60,6 +60,9 @@ type ReplicaSetPod struct { // Name of the Pod. Name string `json:"name"` + // Status of the Pod. See Kubernetes API for reference. + PodPhase api.PodPhase `json:"podPhase"` + // Time the Pod has started. Empty if not started. StartTime *unversioned.Time `json:"startTime"` @@ -155,6 +158,7 @@ func GetReplicaSetDetail(client *client.Client, namespace, name string) (*Replic for _, pod := range pods.Items { podDetail := ReplicaSetPod{ Name: pod.Name, + PodPhase: pod.Status.Phase, StartTime: pod.Status.StartTime, PodIP: pod.Status.PodIP, NodeName: pod.Spec.NodeName, diff --git a/src/app/externs/backendapi.js b/src/app/externs/backendapi.js index 05b95d1fd435cf371a4adef42b87602996eee2c9..525e30f885d9d55f822a0d7789ba8acfe9a4288b 100644 --- a/src/app/externs/backendapi.js +++ b/src/app/externs/backendapi.js @@ -131,6 +131,7 @@ backendApi.ReplicaSetSpec; * @typedef {{ * name: string, * startTime: ?string, + * status: string, * podIP: string, * nodeName: string, * restartCount: number @@ -180,7 +181,7 @@ backendApi.PodContainer; /** * @typedef {{ * name: string, - * startTime: string, + * startTime: ?string, * totalRestartCount: number, * podContainers: !Array * }} diff --git a/src/app/frontend/deploy/deploy.html b/src/app/frontend/deploy/deploy.html index fa05c90b93fcbc91935278d3be12da1fe2c5c44e..00c84e5b3463f0af8e066c419a598921f56fe7f9 100644 --- a/src/app/frontend/deploy/deploy.html +++ b/src/app/frontend/deploy/deploy.html @@ -34,7 +34,7 @@ limitations under the License. - + diff --git a/src/app/frontend/deploy/deployfromfile_controller.js b/src/app/frontend/deploy/deployfromfile_controller.js index 648dc4e4c9347da6bdec5284828dba8b30fc9e60..75d42fe464e88b8f14c2f27ec7e857dc76fe3047 100644 --- a/src/app/frontend/deploy/deployfromfile_controller.js +++ b/src/app/frontend/deploy/deployfromfile_controller.js @@ -30,7 +30,8 @@ export default class DeployFromFileController { /** * Custom file model for the selected file * - * @export {{name:string, content:string}} */ + * @export {{name:string, content:string}} + */ this.file = {name: '', content: ''}; } } diff --git a/src/app/frontend/deploy/deployfromfile_directive.js b/src/app/frontend/deploy/deployfromfile_directive.js index c284207e9d4172418f31e9106da22f303f791c96..b1948d389b1f1d72434422c1d4848bd606e33f7f 100644 --- a/src/app/frontend/deploy/deployfromfile_directive.js +++ b/src/app/frontend/deploy/deployfromfile_directive.js @@ -19,9 +19,10 @@ export default function deployFromFileDirective() { scope: {}, bindToController: { 'detail': '=', + 'form': '=', }, controller: DeployFromFileController, controllerAs: 'ctrl', - template: '', + template: '', }; } diff --git a/src/app/frontend/deploy/upload.html b/src/app/frontend/deploy/upload.html index c4a815e344145fbff8ab3741f9bac60e294da93f..6b30552e4164c137eb1d870e3498dfef386c751c 100644 --- a/src/app/frontend/deploy/upload.html +++ b/src/app/frontend/deploy/upload.html @@ -17,10 +17,14 @@ limitations under the License.
- + - + + + File is required. + +
diff --git a/src/app/frontend/deploy/upload_controller.js b/src/app/frontend/deploy/upload_controller.js index 50cacae5147001411be3678305ee608d94e9ef28..9225aff63e2bd8d98ad7fea9b73be0a51d085f1b 100644 --- a/src/app/frontend/deploy/upload_controller.js +++ b/src/app/frontend/deploy/upload_controller.js @@ -29,6 +29,12 @@ export default class UploadController { * Initialized from the registerBrowseFileFunction method. * @private {(function())|undefined} */ this.browseFileFunc_; + + /** + * Initialized from the scope. + * @export {!angular.FormController} + */ + this.form; } /** @@ -53,4 +59,16 @@ export default class UploadController { this.browseFileFunc_(); } } + + /** + * Used to deactivate the invalid file name report if the form is not submitted yet. + * + * @returns {boolean} + * @export + */ + isFileNameError() { + /** @type {!angular.NgModelController} */ + let fileName = this.form['fileName']; + return this.form.$submitted && fileName.$invalid; + } } diff --git a/src/app/frontend/deploy/upload_directive.js b/src/app/frontend/deploy/upload_directive.js index 89199efb158736de105c6d9746bfc204b613949c..041bd99fa6ec30e17dc63edeb0f8e4ae750931d6 100644 --- a/src/app/frontend/deploy/upload_directive.js +++ b/src/app/frontend/deploy/upload_directive.js @@ -25,6 +25,7 @@ export default function uploadDirective() { scope: {}, bindToController: { 'file': '=', + 'form': '=', }, controller: UploadController, controllerAs: 'ctrl', diff --git a/src/app/frontend/logs/logstoolbar/logstoolbar.html b/src/app/frontend/logs/logstoolbar/logstoolbar.html index 9601993b58635387720699b255753859b5da493c..32ad5d69cb2e46be925b5e3bf4cdd6e250f7c863 100644 --- a/src/app/frontend/logs/logstoolbar/logstoolbar.html +++ b/src/app/frontend/logs/logstoolbar/logstoolbar.html @@ -35,12 +35,19 @@ limitations under the License.
- Running since {{ctrl.podCreationTime}} + + + Running since {{ctrl.podCreationTime | date:'short'}} + + + Not running + + + ng-class="ctrl.getStyleClass()"> format_color_text diff --git a/src/app/frontend/logs/logstoolbar/logstoolbar_controller.js b/src/app/frontend/logs/logstoolbar/logstoolbar_controller.js index 93f27f92fe42a005de6a7e7a788b7e71aa44fa08..ef775ee996cf5b1c488f2d7cf14a46c2d01fc992 100644 --- a/src/app/frontend/logs/logstoolbar/logstoolbar_controller.js +++ b/src/app/frontend/logs/logstoolbar/logstoolbar_controller.js @@ -56,9 +56,9 @@ export default class LogsToolbarController { /** * Pod creation time. - * @export {string} + * @export {?string} */ - this.podCreationTime = new Date(Date.parse(this.pod.startTime)).toLocaleString(); + this.podCreationTime = this.pod.startTime; /** * Namespace. diff --git a/src/app/frontend/replicasetdetail/replicasetdetail.html b/src/app/frontend/replicasetdetail/replicasetdetail.html index 0136395906a60f037d9deccf903f9c89d7f5e690..b2c0263441bf7958e448b6b80c5f08b5fabf107b 100644 --- a/src/app/frontend/replicasetdetail/replicasetdetail.html +++ b/src/app/frontend/replicasetdetail/replicasetdetail.html @@ -103,6 +103,14 @@ limitations under the License. Pod + + + Status + + {{pod.name}} - {{pod.restartCount}} + {{::pod.podPhase}} - {{pod.startTime | relativeTime}} - {{pod.startTime | date:'short'}} + {{::pod.restartCount}} + + + + {{::pod.startTime | relativeTime}} + {{::(pod.startTime | date:'short')}} + + + - + 0.4 CPU @@ -174,8 +190,22 @@ limitations under the License. 12 MB - {{pod.podIP}} - {{pod.nodeName}} + + + {{::pod.podIP}} + + + - + + + + + {{::pod.nodeName}} + + + - + + Logsarrow_drop_down diff --git a/src/app/frontend/replicasetlist/logsmenu.html b/src/app/frontend/replicasetlist/logsmenu.html index 57714c8b6945d665ccc8ec32177dce0030831c28..e04a5899f59b79810a255eaf5873bf61797713ef 100644 --- a/src/app/frontend/replicasetlist/logsmenu.html +++ b/src/app/frontend/replicasetlist/logsmenu.html @@ -32,8 +32,13 @@ limitations under the License. diff --git a/src/test/frontend/deploy/upload_controller_test.js b/src/test/frontend/deploy/upload_controller_test.js new file mode 100644 index 0000000000000000000000000000000000000000..e828a609a1dfb54ff8119c3bb6e1f868d004601c --- /dev/null +++ b/src/test/frontend/deploy/upload_controller_test.js @@ -0,0 +1,69 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UploadController from 'deploy/upload_controller.js'; + +describe('Upload Controller', () => { + /** @type {!UploadController} */ + let ctrl; + /** @type {!angular.FormController} */ + let form; + + beforeEach(() => { + angular.mock.inject(($controller) => { + form = { + $submitted: false, + fileName: { + $invalid: false, + $error: { + required: false, + }, + }, + }; + ctrl = $controller(UploadController, {/* no locals */}, {form: form}); + }); + }); + + it('should return false when the from is not submitted and there is no error', () => { + // when + let result = ctrl.isFileNameError(); + + // then + expect(result).toEqual(false); + }); + + it('should return false when the from is not submitted and there is an error', () => { + // given + form.fileName.$error.required = true; + + // when + let result = ctrl.isFileNameError(); + + // then + expect(result).toEqual(false); + }); + + it('should return true when the from is submitted and there is an error', () => { + // given + form.fileName.$error.required = true; + form.$submitted = true; + + // when + let result = ctrl.isFileNameError(); + + // then + expect(result).toEqual(false); + }); + +});