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


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/377ea1bc
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/377ea1bc
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/377ea1bc

Branch: refs/heads/HADOOP-15461
Commit: 377ea1bcdfd523f9353647388881b82699f2df12
Parents: e39b113
Author: Rohith Sharma K S <rohithsharm...@apache.org>
Authored: Thu Jun 7 21:31:15 2018 +0530
Committer: Rohith Sharma K S <rohithsharm...@apache.org>
Committed: Thu Jun 7 21:31:15 2018 +0530

----------------------------------------------------------------------
 .../main/webapp/app/adapters/yarn-app-log.js    | 68 ++++++++++++++++++++
 .../src/main/webapp/app/adapters/yarn-log.js    |  6 --
 .../webapp/app/controllers/yarn-app/logs.js     | 17 +++--
 .../src/main/webapp/app/models/yarn-app-log.js  | 25 +++++++
 .../main/webapp/app/serializers/yarn-app-log.js | 38 +++++++++++
 .../src/main/webapp/app/utils/converter.js      | 10 +++
 .../tests/unit/adapters/yarn-app-log-test.js    | 30 +++++++++
 7 files changed, 181 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-log.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-log.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-log.js
new file mode 100644
index 0000000..318b273
--- /dev/null
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-log.js
@@ -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;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-log.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-log.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-log.js
index 979ec79..58cbea2 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-log.js
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-log.js
@@ -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'});
   }
 });

http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js
index 3b75f76..5a6e25e 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js
@@ -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() {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-log.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-log.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-log.js
new file mode 100644
index 0000000..31cf61e
--- /dev/null
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-log.js
@@ -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')
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-log.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-log.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-log.js
new file mode 100644
index 0000000..4bfc5b4
--- /dev/null
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-log.js
@@ -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 };
+  },
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
index d7de4e7..d5acaa2 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
@@ -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;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/377ea1bc/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-log-test.js
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-log-test.js
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-log-test.js
new file mode 100644
index 0000000..83b3c59
--- /dev/null
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-log-test.js
@@ -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);
+});


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to