Skip to content

Commit fad96e0

Browse files
authored
Make logs view work with all pods, not only ones coming from RCs (#875)
Fixes #771
1 parent 8c5bacc commit fad96e0

File tree

13 files changed

+96
-227
lines changed

13 files changed

+96
-227
lines changed

src/app/backend/handler/apihandler.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,18 @@ func CreateHttpApiHandler(client *client.Client, heapsterClient HeapsterClient,
191191
apiV1Ws.GET("/pod/{namespace}/{pod}").
192192
To(apiHandler.handleGetPodDetail).
193193
Writes(pod.PodDetail{}))
194+
apiV1Ws.Route(
195+
apiV1Ws.GET("/pod/{namespace}/{pod}/container").
196+
To(apiHandler.handleGetPodContainers).
197+
Writes(pod.PodDetail{}))
198+
apiV1Ws.Route(
199+
apiV1Ws.GET("/pod/{namespace}/{pod}/log").
200+
To(apiHandler.handleLogs).
201+
Writes(Logs{}))
202+
apiV1Ws.Route(
203+
apiV1Ws.GET("/pod/{namespace}/{pod}/log/{container}").
204+
To(apiHandler.handleLogs).
205+
Writes(Logs{}))
194206

195207
apiV1Ws.Route(
196208
apiV1Ws.GET("/deployment").
@@ -244,15 +256,6 @@ func CreateHttpApiHandler(client *client.Client, heapsterClient HeapsterClient,
244256
To(apiHandler.handleGetNamespaces).
245257
Writes(NamespaceList{}))
246258

247-
apiV1Ws.Route(
248-
apiV1Ws.GET("/log/{namespace}/{podId}").
249-
To(apiHandler.handleLogs).
250-
Writes(Logs{}))
251-
apiV1Ws.Route(
252-
apiV1Ws.GET("/log/{namespace}/{podId}/{container}").
253-
To(apiHandler.handleLogs).
254-
Writes(Logs{}))
255-
256259
apiV1Ws.Route(
257260
apiV1Ws.GET("/event/{namespace}/{replicationController}").
258261
To(apiHandler.handleEvents).
@@ -780,7 +783,7 @@ func (apiHandler *ApiHandler) handleGetSecrets(request *restful.Request, respons
780783
// Handles log API call.
781784
func (apiHandler *ApiHandler) handleLogs(request *restful.Request, response *restful.Response) {
782785
namespace := request.PathParameter("namespace")
783-
podId := request.PathParameter("podId")
786+
podId := request.PathParameter("pod")
784787
container := request.PathParameter("container")
785788

786789
result, err := GetPodLogs(apiHandler.client, namespace, podId, container)
@@ -791,6 +794,18 @@ func (apiHandler *ApiHandler) handleLogs(request *restful.Request, response *res
791794
response.WriteHeaderAndEntity(http.StatusCreated, result)
792795
}
793796

797+
func (apiHandler *ApiHandler) handleGetPodContainers(request *restful.Request, response *restful.Response) {
798+
namespace := request.PathParameter("namespace")
799+
podId := request.PathParameter("pod")
800+
801+
result, err := GetPodContainers(apiHandler.client, namespace, podId)
802+
if err != nil {
803+
handleInternalError(response, err)
804+
return
805+
}
806+
response.WriteHeaderAndEntity(http.StatusCreated, result)
807+
}
808+
794809
// Handles event API call.
795810
func (apiHandler *ApiHandler) handleEvents(request *restful.Request, response *restful.Response) {
796811
namespace := request.PathParameter("namespace")

src/app/backend/resource/container/containerlogs.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,29 @@ type Logs struct {
3939
Container string `json:"container"`
4040
}
4141

42+
// PodContainerList is a list of containers of a pod.
43+
type PodContainerList struct {
44+
Containers []string `json:"containers"`
45+
}
46+
47+
// GetPodContainers returns containers that a pod has.
48+
func GetPodContainers(client *client.Client, namespace, podId string) (*PodContainerList, error) {
49+
log.Printf("Getting containers from %s pod in %s namespace", podId, namespace)
50+
51+
pod, err := client.Pods(namespace).Get(podId)
52+
if err != nil {
53+
return nil, err
54+
}
55+
56+
containers := &PodContainerList{Containers: make([]string, 0)}
57+
58+
for _, container := range pod.Spec.Containers {
59+
containers.Containers = append(containers.Containers, container.Name)
60+
}
61+
62+
return containers, nil
63+
}
64+
4265
// GetPodLogs returns logs for particular pod and container or error when occurred. When container
4366
// is null, logs for the first one are returned.
4467
func GetPodLogs(client *client.Client, namespace, podId string, container string) (*Logs, error) {

src/app/frontend/common/resource/resourcedetail.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* Parameters for this state.
1717
*
1818
* All properties are @exported and in sync with URL param names.
19-
* @final
2019
*/
2120
export class StateParams {
2221
/**

src/app/frontend/logs/logs_state.js

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
import {StateParams as ResourceStateParams} from 'common/resource/resourcedetail';
16+
1517
/** Name of the state. Can be used in, e.g., $state.go method. */
1618
export const stateName = 'log';
1719

@@ -21,22 +23,14 @@ export const stateName = 'log';
2123
* All properties are @exported and in sync with URL param names.
2224
* @final
2325
*/
24-
export class StateParams {
26+
export class StateParams extends ResourceStateParams {
2527
/**
26-
* @param {string} rcNamespace
27-
* @param {string} replicationController
28-
* @param {string} podId
28+
* @param {string} objectNamespace
29+
* @param {string} objectName
2930
* @param {string=} opt_container
3031
*/
31-
constructor(rcNamespace, replicationController, podId, opt_container) {
32-
/** @export {string} Namespace of this Replication Controller. */
33-
this.rcNamespace = rcNamespace;
34-
35-
/** @export {string} Name of this Replication Controller. */
36-
this.replicationController = replicationController;
37-
38-
/** @export {string} Id of this Pod. */
39-
this.podId = podId;
32+
constructor(objectNamespace, objectName, opt_container) {
33+
super(objectNamespace, objectName);
4034

4135
/** @export {string|undefined} Name of this pod container. */
4236
this.container = opt_container;

src/app/frontend/logs/logs_stateconfig.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {stateName} from './logs_state';
1717
import LogsToolbarController from './logstoolbar/logstoolbar_controller';
1818
import {toolbarViewName} from '../chrome/chrome_state';
1919

20+
import {appendDetailParamsToUrl} from 'common/resource/resourcedetail';
2021
import {stateName as chromeStateName} from 'chrome/chrome_state';
2122

2223
/**
@@ -40,10 +41,10 @@ export default function stateConfig($stateProvider) {
4041
};
4142

4243
$stateProvider.state(stateName, {
43-
url: '/log/:rcNamespace/:replicationController/:podId/:container',
44+
url: `${appendDetailParamsToUrl('/log')}/:container`,
4445
parent: chromeStateName,
4546
resolve: {
46-
'replicationControllerPods': resolveReplicationControllerPods,
47+
'podContainers': resolvePodContainers,
4748
'podLogs': resolvePodLogs,
4849
},
4950
views: views,
@@ -56,12 +57,13 @@ export default function stateConfig($stateProvider) {
5657
* @return {!angular.$q.Promise}
5758
* @ngInject
5859
*/
59-
function resolveReplicationControllerPods($stateParams, $resource) {
60-
let namespace = $stateParams.rcNamespace;
61-
let rc = $stateParams.replicationController;
60+
function resolvePodLogs($stateParams, $resource) {
61+
let namespace = $stateParams.objectNamespace;
62+
let podId = $stateParams.objectName;
63+
let container = $stateParams.container || '';
6264

63-
/** @type {!angular.Resource<!backendApi.ReplicationControllerPods>} */
64-
let resource = $resource(`api/v1/replicationcontroller/pod/${namespace}/${rc}`);
65+
/** @type {!angular.Resource<!backendApi.Logs>} */
66+
let resource = $resource(`api/v1/pod/${namespace}/${podId}/log/${container}`);
6567

6668
return resource.get().$promise;
6769
}
@@ -72,13 +74,12 @@ function resolveReplicationControllerPods($stateParams, $resource) {
7274
* @return {!angular.$q.Promise}
7375
* @ngInject
7476
*/
75-
function resolvePodLogs($stateParams, $resource) {
76-
let namespace = $stateParams.rcNamespace;
77-
let podId = $stateParams.podId;
78-
let container = $stateParams.container;
77+
function resolvePodContainers($stateParams, $resource) {
78+
let namespace = $stateParams.objectNamespace;
79+
let podId = $stateParams.objectName;
7980

80-
/** @type {!angular.Resource<!backendApi.Logs>} */
81-
let resource = $resource(`api/v1/log/${namespace}/${podId}/${container}`);
81+
/** @type {!angular.Resource<!backendApi.PodContainerList>} */
82+
let resource = $resource(`api/v1/pod/${namespace}/${podId}/container`);
8283

8384
return resource.get().$promise;
8485
}

src/app/frontend/logs/logstoolbar/logstoolbar.html

Lines changed: 3 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,17 @@
1616

1717
<div layout="row" hide show-gt-sm layout-margin layout-align="center center"
1818
class="kd-logs-toolbar">
19-
<span class="kd-logs-toolbar-text">Pod:</span>
20-
<md-select class="kd-logs-toolbar-select" aria-label="Logs from pod" ng-model="ctrl.pod"
21-
md-on-close="ctrl.onPodChange(ctrl.pod.name)"
22-
required>
23-
<md-option ng-repeat="item in ctrl.pods" ng-value="item">
24-
<span class="kd-logs-toolbar-text">{{item.name}}</span>
25-
</md-option>
26-
</md-select>
19+
<span class="kd-logs-toolbar-text">Pod: {{::ctrl.stateParams.objectName}}</span>
2720

2821
<span class="kd-logs-toolbar-text">Container:</span>
2922
<md-select class="kd-logs-toolbar-select" aria-label="Containers" ng-model="ctrl.container"
30-
md-on-close="ctrl.onContainerChange(ctrl.container.name)"
23+
md-on-close="ctrl.onContainerChange(ctrl.container)"
3124
required>
3225
<md-option ng-repeat="item in ctrl.containers" ng-value="item">
33-
<span class="kd-logs-toolbar-text">{{item.name}}</span>
26+
<span class="kd-logs-toolbar-text">{{::item}}</span>
3427
</md-option>
3528
</md-select>
3629

37-
<span class="kd-logs-toolbar-text" flex="auto">
38-
<span ng-if="ctrl.podCreationTime">
39-
Running since {{ctrl.podCreationTime | date:'d/M/yy HH:mm':'UTC'}} UTC
40-
</span>
41-
<span ng-if="!ctrl.podCreationTime">
42-
Not running
43-
</span>
44-
</span>
45-
4630
<span flex="auto"></span>
4731
<md-button ng-click="ctrl.onTextColorChange()">
4832
<md-icon md-font-library="material-icons"
@@ -51,44 +35,3 @@
5135
</md-icon>
5236
</md-button>
5337
</div>
54-
55-
<div layout="row" hide-gt-sm layout-no-wrap layout-margin layout-align="center center"
56-
class="kd-logs-toolbar">
57-
<md-menu-bar class="kd-logs-toolbar-menu-bar">
58-
<md-menu>
59-
<button ng-click="$mdOpenMenu()" class="kd-logs-toolbar-menu-button">
60-
Logs source
61-
</button>
62-
<md-menu-content width="3">
63-
<md-menu-item>
64-
<md-menu>
65-
<md-button ng-click="$mdOpenMenu()">Pods</md-button>
66-
<md-menu-content width="4">
67-
<md-button ng-repeat="item in ctrl.pods"
68-
ng-click="ctrl.onPodChange(item.name)">{{item.name}}
69-
</md-button>
70-
</md-menu-content>
71-
</md-menu>
72-
</md-menu-item>
73-
<md-menu-item>
74-
<md-menu>
75-
<md-button ng-click="$mdOpenMenu()">Containers</md-button>
76-
<md-menu-content width="4">
77-
<md-button ng-repeat="item in ctrl.containers"
78-
ng-click="ctrl.onContainerChange(item.name)">{{item.name}}
79-
</md-button>
80-
</md-menu-content>
81-
</md-menu>
82-
</md-menu-item>
83-
</md-menu-content>
84-
</md-menu>
85-
</md-menu-bar>
86-
87-
<span flex="auto"></span>
88-
<md-button class="kd-logs-toolbar-icon" ng-click="ctrl.onTextColorChange()">
89-
<md-icon md-font-library="material-icons"
90-
ng-class="ctrl.getStyleClass()">
91-
format_color_text
92-
</md-icon>
93-
</md-button>
94-
</div>

src/app/frontend/logs/logstoolbar/logstoolbar_controller.js

Lines changed: 10 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,11 @@ export default class LogsToolbarController {
2222
/**
2323
* @param {!ui.router.$state} $state
2424
* @param {!StateParams} $stateParams
25-
* @param {!backendApi.ReplicationControllerPods} replicationControllerPods
2625
* @param {!backendApi.Logs} podLogs
2726
* @param {!../logs_service.LogColorInversionService} logsColorInversionService
2827
* @ngInject
2928
*/
30-
constructor($state, $stateParams, replicationControllerPods, podLogs, logsColorInversionService) {
29+
constructor($state, $stateParams, podLogs, podContainers, logsColorInversionService) {
3130
/** @private {!ui.router.$state} */
3231
this.state_ = $state;
3332

@@ -37,38 +36,16 @@ export default class LogsToolbarController {
3736
*/
3837
this.logsColorInversionService_ = logsColorInversionService;
3938

40-
/** @export {!Array<!backendApi.ReplicationControllerPodWithContainers>} */
41-
this.pods = replicationControllerPods.pods;
39+
/** @export {!Array<string>} */
40+
this.containers = podContainers.containers;
4241

43-
/**
44-
* Currently chosen pod.
45-
* @export {!backendApi.ReplicationControllerPodWithContainers|undefined}
46-
*/
47-
this.pod = this.findPodByName_(this.pods, $stateParams.podId);
48-
49-
/** @export {!Array<!backendApi.PodContainer>} */
50-
this.containers = this.pod.podContainers;
51-
52-
/** @export {!backendApi.PodContainer} */
53-
this.container = this.initializeContainer_(this.containers, podLogs.container);
54-
55-
/**
56-
* Pod creation time.
57-
* @export {?string}
58-
*/
59-
this.podCreationTime = this.pod.startTime;
60-
61-
/**
62-
* Namespace.
63-
* @private {string}
64-
*/
65-
this.namespace_ = $stateParams.rcNamespace;
42+
/** @export {string} */
43+
this.container = $stateParams.container || this.containers[0];
6644

6745
/**
68-
* Replication Controller name.
69-
* @private {string}
46+
* @export {../logs_state.StateParams}
7047
*/
71-
this.replicationControllerName_ = $stateParams.replicationController;
48+
this.stateParams = $stateParams;
7249
}
7350

7451
/**
@@ -79,28 +56,16 @@ export default class LogsToolbarController {
7956
*/
8057
isTextColorInverted() { return this.logsColorInversionService_.getInverted(); }
8158

82-
/**
83-
* Execute a code when a user changes the selected option of a pod element.
84-
* @param {string} podId
85-
* @return {string}
86-
* @export
87-
*/
88-
onPodChange(podId) {
89-
return this.state_.transitionTo(
90-
logs, new StateParams(
91-
this.namespace_, this.replicationControllerName_, podId, this.container.name));
92-
}
93-
9459
/**
9560
* Execute a code when a user changes the selected option of a container element.
9661
* @param {string} container
9762
* @return {string}
9863
* @export
9964
*/
10065
onContainerChange(container) {
101-
return this.state_.transitionTo(
102-
logs, new StateParams(
103-
this.namespace_, this.replicationControllerName_, this.pod.name, container));
66+
return this.state_.go(
67+
logs,
68+
new StateParams(this.stateParams.objectNamespace, this.stateParams.objectName, container));
10469
}
10570

10671
/**

0 commit comments

Comments
 (0)