YARN-8386. App log can not be viewed from Logs tab in secure cluster. Contributed by Sunil Govindan.

This commit is contained in:
Rohith Sharma K S 2018-06-07 21:31:15 +05:30
parent e39b113db0
commit 377ea1bcdf
7 changed files with 181 additions and 13 deletions

View File

@ -0,0 +1,68 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 DS from 'ember-data';
import Ember from 'ember';
import Converter from 'yarn-ui/utils/converter';
import RESTAbstractAdapter from './restabstract';
/**
* REST URL's response when fetching container logs will be
* in plain text format and not JSON.
*/
export default RESTAbstractAdapter.extend({
address: "timelineV1WebAddress",
restNameSpace: "timeline",
serverName: "ATS",
headers: {
Accept: 'text/plain'
},
urlForFindRecord(id/*, modelName, snapshot*/) {
var splits = Converter.splitForAppLogs(id);
var containerId = splits[0];
var logFile = splits[1];
var url = this._buildURL();
url = url + '/containers/' + containerId + '/logs/' + logFile;
console.log('log url' + url);
return url;
},
/**
* Override options so that result is not expected to be JSON
*/
ajaxOptions: function (url, type, options) {
var hash = options || {};
hash.url = url;
hash.type = type;
// Make sure jQuery does not try to convert response to JSON.
hash.dataType = 'text';
hash.context = this;
var headers = Ember.get(this, 'headers');
if (headers !== undefined) {
hash.beforeSend = function (xhr) {
Object.keys(headers).forEach(function (key) {
return xhr.setRequestHeader(key, headers[key]);
});
};
}
return hash;
}
});

View File

@ -29,11 +29,5 @@ export default AbstractAdapter.extend({
var containerId = query['containerId'];
delete query.containerId;
return url + '/containers/' + containerId + '/logs';
},
fetchLogFileContent(containerId, logFile) {
var url = this._buildURL();
url = url + '/containers/' + containerId + '/logs/' + logFile;
return Ember.$.ajax({url: url, type: 'GET', dataType: 'text'});
}
});

View File

@ -17,6 +17,7 @@
*/
import Ember from 'ember';
import Constants from 'yarn-ui/constants';
export default Ember.Controller.extend({
queryParams: ["service"],
@ -118,16 +119,17 @@ export default Ember.Controller.extend({
if (logFile) {
this.set("_isLoadingBottomPanel", true);
this.set("selectedLogFileName", logFile);
this.fetchContentForLogFile(this.get("selectedContainerId"), logFile)
var id = this.get("selectedContainerId") + Constants.PARAM_SEPARATOR + logFile;
this.fetchContentForLogFile(id)
.then(
content => {
this.set("selectedLogFileContent", content.trim());
hash => {
this.set("selectedLogFileContent", hash.logs.get('logs').trim());
},
() => {
this.set("selectedLogFileContent", "");
}
)
.always(() => {
.then(() => {
this.set("_isLoadingBottomPanel", false);
});
} else {
@ -224,9 +226,10 @@ export default Ember.Controller.extend({
});
},
fetchContentForLogFile(containerId, logFile) {
let logAdapter = this.store.adapterFor("yarn-log");
return logAdapter.fetchLogFileContent(containerId, logFile);
fetchContentForLogFile(id) {
return Ember.RSVP.hash({
logs: this.store.findRecord('yarn-app-log', id)
});
},
resetAfterRefresh() {

View File

@ -0,0 +1,25 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 DS from 'ember-data';
export default DS.Model.extend({
logs: DS.attr('string'),
containerID: DS.attr('string'),
logFileName: DS.attr('string')
});

View File

@ -0,0 +1,38 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 DS from 'ember-data';
import Converter from 'yarn-ui/utils/converter';
export default DS.JSONAPISerializer.extend({
normalizeSingleResponse(store, primaryModelClass, payload, id/*, requestType*/) {
// Convert plain text response into JSON.
// ID is of the form containerId!fileName
var splits = Converter.splitForAppLogs(id);
var convertedPayload = {
id: id,
type: primaryModelClass.modelName,
attributes: {
logs: payload,
containerID: splits[1],
logFileName: splits[2]
}
};
return { data: convertedPayload };
},
});

View File

@ -112,6 +112,16 @@ export default {
return [splits[0], splits[1], fileName];
}
},
splitForAppLogs: function(id) {
if (id) {
var splits = id.split(Constants.PARAM_SEPARATOR);
var splitLen = splits.length;
if (splitLen < 2) {
return null;
}
return [splits[0], splits[1]];
}
},
memoryToSimpliedUnit: function(mb) {
var unit = "MB";
var value = mb;

View File

@ -0,0 +1,30 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 { moduleFor, test } from 'ember-qunit';
moduleFor('adapter:yarn-app-log', 'Unit | Adapter | yarn app log', {
// Specify the other units that are required for this test.
// needs: ['serializer:foo']
});
// Replace this with your real tests.
test('it exists', function(assert) {
let adapter = this.subject();
assert.ok(adapter);
});