You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by hi...@apache.org on 2016/04/27 20:29:53 UTC

ambari git commit: AMBARI-16103. Tez View : Equip the tez view shim to work with both version 1 & 2 of Tez UI. (Sreenath Somarajapuram via hitesh)

Repository: ambari
Updated Branches:
  refs/heads/trunk 85ac3c22e -> 6a906e630


AMBARI-16103. Tez View : Equip the tez view shim to work with both version 1 & 2 of Tez UI. (Sreenath Somarajapuram via hitesh)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6a906e63
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6a906e63
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6a906e63

Branch: refs/heads/trunk
Commit: 6a906e6309d634461d683f38badc0b5440cff5e0
Parents: 85ac3c2
Author: Hitesh Shah <hi...@apache.org>
Authored: Wed Apr 27 11:29:36 2016 -0700
Committer: Hitesh Shah <hi...@apache.org>
Committed: Wed Apr 27 11:29:36 2016 -0700

----------------------------------------------------------------------
 contrib/views/tez/pom.xml                       |  29 +-
 .../resources/ui/ambari-scripts/init-view.js    | 287 +++++++++++++++++++
 .../views/tez/src/main/resources/ui/index.html  |  50 ----
 .../resources/ui/scripts/init-ambari-view.js    | 229 ---------------
 4 files changed, 313 insertions(+), 282 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6a906e63/contrib/views/tez/pom.xml
----------------------------------------------------------------------
diff --git a/contrib/views/tez/pom.xml b/contrib/views/tez/pom.xml
index 9e626b8..a40d6c8 100644
--- a/contrib/views/tez/pom.xml
+++ b/contrib/views/tez/pom.xml
@@ -103,12 +103,36 @@
                  <outputDirectory>target/classes</outputDirectory>
                </artifactItem>
              </artifactItems>
-             <includes>fonts/**/*, img/**/*, scripts/**/*, styles/**/*</includes>
+             <includes>fonts/**/*, img/**/*, scripts/**/*, assets/**/*, config/**/*, styles/**/*, index.html</includes>
            </configuration>
          </execution>
        </executions>
       </plugin>
 
+      <!-- Adds init view script to the UI -->
+      <plugin>
+        <groupId>com.google.code.maven-replacer-plugin</groupId>
+        <artifactId>replacer</artifactId>
+        <version>1.5.3</version>
+        <executions>
+          <execution>
+            <phase>process-resources</phase>
+            <goals>
+              <goal>replace</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <file>target/classes/index.html</file>
+          <replacements>
+            <replacement>
+              <token>&lt;/body&gt;</token>
+              <value>&lt;script src="ambari-scripts/init-view.js"&gt;&lt;/script&gt;&lt;/body&gt;</value>
+            </replacement>
+          </replacements>
+        </configuration>
+      </plugin>
+
       <plugin>
         <groupId>org.vafer</groupId>
         <artifactId>jdeb</artifactId>
@@ -133,8 +157,7 @@
         <directory>src/main/resources/ui</directory>
         <filtering>false</filtering>
         <includes>
-          <include>scripts/*</include>
-          <include>index.html</include>
+          <include>ambari-scripts/*</include>
         </includes>
       </resource>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a906e63/contrib/views/tez/src/main/resources/ui/ambari-scripts/init-view.js
----------------------------------------------------------------------
diff --git a/contrib/views/tez/src/main/resources/ui/ambari-scripts/init-view.js b/contrib/views/tez/src/main/resources/ui/ambari-scripts/init-view.js
new file mode 100644
index 0000000..4b7d94d
--- /dev/null
+++ b/contrib/views/tez/src/main/resources/ui/ambari-scripts/init-view.js
@@ -0,0 +1,287 @@
+/**
+ * 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.
+ */
+
+var PATH_PARAM_NAME = "viewPath";
+
+/**
+ * Constructs URL for fetching Ambari view instance parameters.
+ * @return {String}
+ */
+function getStatusURL() {
+  var urlParts = location.pathname.split('/');
+
+  return "/api/v1/views/%@/versions/%@/instances/%@/resources/status".fmt(
+    urlParts[2],
+    urlParts[3],
+    urlParts[4]
+  );
+}
+
+function getStatus() {
+  var hashArray = location.pathname.split('/');
+
+  return $.ajax({
+    type: 'GET',
+    dataType: 'json',
+    async: true,
+    context: this,
+    url: getStatusURL(),
+  });
+}
+
+/**
+ * Creates an object from query string
+ * @param getQueryObject {String}
+ * @return {Object}
+ */
+function getQueryObject(queryString) {
+  queryString = queryString ? queryString.replace('?', '') : '';
+
+  return queryString.split('&').reduce(function (obj, param) {
+    var paramParts;
+    if(param.trim()) {
+      paramParts = param.split('=');
+      if(paramParts[0] == PATH_PARAM_NAME) {
+        paramParts[1] = decodeURIComponent(paramParts[1]);
+      }
+      obj[paramParts[0]] = paramParts[1];
+    }
+    return obj;
+  }, {});
+}
+
+/**
+ * Creates query string from an object
+ * @param getQueryObject {String}
+ * @return {Object}
+ */
+function getQueryString(object) {
+  var params = [];
+
+  function addParam(key, value) {
+    params.push('%@=%@'.fmt(key, value));
+  }
+
+  object = $.extend({}, object);
+
+  // Because of the way Ambari handles viewPath, its better to put it at the front
+  if(object.hasOwnProperty(PATH_PARAM_NAME)) {
+    addParam(
+      PATH_PARAM_NAME,
+      encodeURIComponent(object[PATH_PARAM_NAME])
+    );
+    delete object[PATH_PARAM_NAME];
+  }
+  $.each(object, addParam);
+
+  return params.join('&');
+}
+
+// Redirect if required
+function redirectionCheck() {
+  var href = window.location.href;
+
+  // Ember expects the url to have /#/
+  if(href.indexOf('?') != -1 && href.indexOf('/#/') == -1) {
+    href = href.replace('?', '/#/?');
+  }
+
+  // If opened outside ambari, redirect
+  if(window.parent == window) {
+    var hrefParts = href.split('/#/'),
+        pathParts = hrefParts[1].split('?'),
+        queryParams =getQueryObject(pathParts[1]);
+
+        if(pathParts[0]) {
+          queryParams[PATH_PARAM_NAME] = '/#/' + pathParts[0];
+        }
+
+    href = '%@?%@'.fmt(
+      hrefParts[0].replace('/views/', '/#/main/views/'),
+      getQueryString(queryParams)
+    );
+  }
+
+  // Normalize href
+  href = href.replace(/\/\//g, '/').replace(':/', '://');
+
+  if(href != window.location.href) {
+    window.location = href;
+    return true;
+  }
+}
+
+// Force Ambari iframe to support fullscreen
+function allowFullScreen() {
+  if(window.parent) {
+    var arrFrames = parent.document.getElementsByTagName("IFRAME"),
+        iframe;
+    for (var i = 0; i < arrFrames.length; i++) {
+      if (arrFrames[i].contentWindow === window) {
+        iframe = arrFrames[i];
+        break;
+      }
+    }
+
+    if(iframe) {
+      iframe.setAttribute('AllowFullScreen', true);
+    }
+  }
+}
+
+// Replace Ambari's url on view URL change
+function onPathChange() {
+  var path = window.location.hash.substr(2).trim(),
+      pathParts = path.split('?'),
+
+      parentUrlParts = window.parent.location.href.split('?'),
+      parentQueryParam = getQueryObject(pathParts[1]);
+
+  if(pathParts[0]) {
+    parentQueryParam[PATH_PARAM_NAME] = '/#/' + pathParts[0];
+  }
+
+  path = getQueryString(parentQueryParam);
+  window.parent.history.replaceState(
+    null,
+    null,
+    path ? '%@?%@'.fmt(parentUrlParts[0], path) : parentUrlParts[0]
+  );
+}
+
+function scheduleChangeHandler() {
+  if(typeof this._super === 'function') {
+    this._super.apply(this, arguments);
+  }
+  setTimeout(onPathChange, 100);
+}
+
+function getConfigs(parameters) {
+  var host = window.location.protocol +
+      "//" +
+      window.location.hostname +
+      (window.location.port ? ':' + window.location.port: ''),
+      urlParts = location.pathname.split('/'),
+      resourcesPrefix = 'api/v1/views/%@/versions/%@/instances/%@/resources/'.fmt(
+        urlParts[2],
+        urlParts[3],
+        urlParts[4]
+      );
+
+  parameters = parameters || {};
+
+  return {
+    host: host,
+    yarnProtocol: parameters["yarn.protocol"],
+    resourcesPrefix: resourcesPrefix,
+    namespaces: {
+      webService: {
+        timeline: '%@atsproxy/ws/v1/timeline'.fmt(resourcesPrefix),
+        appHistory: '%@atsproxy/ws/v1/applicationhistory'.fmt(resourcesPrefix),
+        rm: '%@rmproxy/ws/v1/cluster'.fmt(resourcesPrefix),
+        am: '%@rmproxy/proxy/{app_id}/ws/v2/tez'.fmt(resourcesPrefix)
+      },
+      web: {
+        rm: '%@rmredirect/cluster'.fmt(resourcesPrefix)
+      },
+    }
+  };
+}
+
+function setUI1Configs(parameters) {
+  var configs = getConfigs(parameters);
+
+  $.extend(true, App.Configs, {
+    envDefaults: {
+      isStandalone: false,
+      timelineBaseUrl: configs.host,
+      RMWebUrl: configs.host,
+      yarnProtocol: configs.yarnProtocol,
+    },
+    restNamespace: {
+      timeline: configs.namespaces.webService.timeline,
+      applicationHistory: configs.namespaces.webService.appHistory,
+
+      aminfo: '%@rmproxy/proxy/__app_id__/ws/v1/tez'.fmt(configs.resourcesPrefix),
+      aminfoV2: '%@rmproxy/proxy/__app_id__/ws/v2/tez'.fmt(configs.resourcesPrefix),
+      cluster: configs.namespaces.webService.rm
+    },
+    otherNamespace: {
+      cluster: configs.namespaces.web.rm
+    }
+  });
+
+  App.TimelineRESTAdapter.reopen({
+    namespace: App.Configs.restNamespace.timeline
+  });
+}
+
+function setUI2Configs(parameters) {
+  var configs = getConfigs(parameters);
+
+  $.extend(true, ENV, {
+    isStandalone: false,
+    yarnProtocol: configs.yarnProtocol,
+    hosts: {
+      timeline: configs.host,
+      rm: configs.host,
+    },
+    namespaces: configs.namespaces
+  });
+};
+
+function setAppRoute(AppRoute) {
+  AppRoute.reopen({
+    actions: {
+      didTransition: scheduleChangeHandler,
+      queryParamsDidChange: scheduleChangeHandler
+    }
+  });
+}
+
+function loadParams(app, callBack) {
+  app.deferReadiness();
+  getStatus().always(function(status) {
+    callBack(status || {});
+    app.advanceReadiness();
+  });
+}
+
+if(!redirectionCheck()) {
+  var initializerOptions = {
+        name: 'configs',
+      },
+      App = window.App;
+
+  if(App) {
+    initializerOptions.initialize = function () {
+      setAppRoute(App.ApplicationRoute);
+      loadParams(App, setUI1Configs);
+    };
+  }
+  else {
+    initializerOptions.before = 'env';
+    initializerOptions.initialize = function (app) {
+      setAppRoute(app.get("__container__").lookup('route:application'));
+      loadParams(app, setUI2Configs);
+    };
+  }
+  Ember.Application.initializer(initializerOptions);
+
+  allowFullScreen();
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a906e63/contrib/views/tez/src/main/resources/ui/index.html
----------------------------------------------------------------------
diff --git a/contrib/views/tez/src/main/resources/ui/index.html b/contrib/views/tez/src/main/resources/ui/index.html
deleted file mode 100644
index ed0230a..0000000
--- a/contrib/views/tez/src/main/resources/ui/index.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-* 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.
--->
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>Tez UI</title>
-
-    <link rel="shortcut icon" href="img/tez-favicon.png" type="image/x-icon">
-
-    <link rel="stylesheet" href="styles/main.css">
-  </head>
-
-  <body>
-    <script src="scripts/components.js"></script>
-    <script src="scripts/templates.js"></script>
-    <script src="scripts/main.js"></script>
-    <script src="scripts/configs.js"></script>
-
-    <script src="scripts/init-ambari-view.js"></script>
-
-    <div class="error-bar" style="border: none;">
-      <div class="main-container">
-        <div class="message-container">
-          <span class="error-icon"></span>&nbsp;
-          <span class="message"></span>
-        </div><div class="close-container">
-          <div class="close">&#65516;</div>
-        </div>
-        <div class="details"></div>
-      </div>
-    </div>
-
-  </body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6a906e63/contrib/views/tez/src/main/resources/ui/scripts/init-ambari-view.js
----------------------------------------------------------------------
diff --git a/contrib/views/tez/src/main/resources/ui/scripts/init-ambari-view.js b/contrib/views/tez/src/main/resources/ui/scripts/init-ambari-view.js
deleted file mode 100644
index 25d4da0..0000000
--- a/contrib/views/tez/src/main/resources/ui/scripts/init-ambari-view.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * 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.
- */
-
-App.deferReadiness();
-
-var PATH_PARAM_NAME = "viewPath";
-
-/**
- * Constructs URL for fetching Ambari view instance parameters.
- * @return {String}
- */
-function getStatusURL() {
-  var urlParts = location.pathname.split('/');
-
-  return "/api/v1/views/%@/versions/%@/instances/%@/resources/status".fmt(
-    urlParts[2],
-    urlParts[3],
-    urlParts[4]
-  );
-}
-
-function getStatus() {
-  var hashArray = location.pathname.split('/');
-
-  return $.ajax({
-    type: 'GET',
-    dataType: 'json',
-    async: true,
-    context: this,
-    url: getStatusURL(),
-  });
-}
-
-/**
- * Creates an object from query string
- * @param getQueryObject {String}
- * @return {Object}
- */
-function getQueryObject(queryString) {
-  queryString = queryString ? queryString.replace('?', '') : '';
-
-  return queryString.split('&').reduce(function (obj, param) {
-    var paramParts;
-    if(param.trim()) {
-      paramParts = param.split('=');
-      if(paramParts[0] == PATH_PARAM_NAME) {
-        paramParts[1] = decodeURIComponent(paramParts[1]);
-      }
-      obj[paramParts[0]] = paramParts[1];
-    }
-    return obj;
-  }, {});
-}
-
-/**
- * Creates query string from an object
- * @param getQueryObject {String}
- * @return {Object}
- */
-function getQueryString(object) {
-  var params = [];
-
-  function addParam(key, value) {
-    params.push('%@=%@'.fmt(key, value));
-  }
-
-  object = $.extend({}, object);
-
-  // Because of the way Ambari handles viewPath, its better to put it at the front
-  if(object.hasOwnProperty(PATH_PARAM_NAME)) {
-    addParam(
-      PATH_PARAM_NAME,
-      encodeURIComponent(object[PATH_PARAM_NAME])
-    );
-    delete object[PATH_PARAM_NAME];
-  }
-  $.each(object, addParam);
-
-  return params.join('&');
-}
-
-// Redirect if required
-function redirectionCheck() {
-  var href = window.location.href;
-
-  // Ember expects the url to have /#/
-  if(href.indexOf('?') != -1 && href.indexOf('/#/') == -1) {
-    href = href.replace('?', '/#/?');
-  }
-
-  // If opened outside ambari, redirect
-  if(window.parent == window) {
-    var hrefParts = href.split('/#/'),
-        pathParts = hrefParts[1].split('?'),
-        queryParams =getQueryObject(pathParts[1]);
-
-        if(pathParts[0]) {
-          queryParams[PATH_PARAM_NAME] = '/#/' + pathParts[0];
-        }
-
-    href = '%@?%@'.fmt(
-      hrefParts[0].replace('/views/', '/#/main/views/'),
-      getQueryString(queryParams)
-    );
-  }
-
-  // Normalize href
-  href = href.replace(/\/\//g, '/').replace(':/', '://');
-
-  if(href != window.location.href) {
-    window.location = href;
-    return true;
-  }
-}
-
-function allowFullScreen() {
-  if(window.parent) {
-    var arrFrames = parent.document.getElementsByTagName("IFRAME"),
-        iframe;
-    for (var i = 0; i < arrFrames.length; i++) {
-      if (arrFrames[i].contentWindow === window) {
-        iframe = arrFrames[i];
-        break;
-      }
-    }
-
-    if(iframe) {
-      iframe.setAttribute('AllowFullScreen', true);
-    }
-  }
-}
-
-function onPathChange() {
-  var path = window.location.hash.substr(2).trim(),
-      pathParts = path.split('?'),
-
-      parentUrlParts = window.parent.location.href.split('?'),
-      parentQueryParam = getQueryObject(pathParts[1]);
-
-  if(pathParts[0]) {
-    parentQueryParam[PATH_PARAM_NAME] = '/#/' + pathParts[0];
-  }
-
-  path = getQueryString(parentQueryParam);
-  window.parent.history.replaceState(
-    null,
-    null,
-    path ? '%@?%@'.fmt(parentUrlParts[0], path) : parentUrlParts[0]
-  );
-}
-
-function scheduleChangeHandler(arguments) {
-  setTimeout(onPathChange, 100);
-}
-
-function setConfigs(parameters) {
-  var host = window.location.protocol +
-      "//" +
-      window.location.hostname +
-      (window.location.port ? ':' + window.location.port: ''),
-      urlParts = location.pathname.split('/'),
-      resourcesPrefix = 'api/v1/views/%@/versions/%@/instances/%@/resources/'.fmt(
-        urlParts[2],
-        urlParts[3],
-        urlParts[4]
-      );
-
-  parameters = parameters || {};
-
-  $.extend(true, App.Configs, {
-    envDefaults: {
-      isStandalone: false,
-      timelineBaseUrl: host,
-      RMWebUrl: host,
-      yarnProtocol: parameters["yarn.protocol"]
-    },
-    restNamespace: {
-      timeline: '%@atsproxy/ws/v1/timeline'.fmt(resourcesPrefix),
-      applicationHistory: '%@atsproxy/ws/v1/applicationhistory'.fmt(resourcesPrefix),
-
-      aminfo: '%@rmproxy/proxy/__app_id__/ws/v1/tez'.fmt(resourcesPrefix),
-      aminfoV2: '%@rmproxy/proxy/__app_id__/ws/v2/tez'.fmt(resourcesPrefix),
-      cluster: '%@rmproxy/ws/v1/cluster'.fmt(resourcesPrefix)
-    },
-    otherNamespace: {
-      cluster: '%@rmredirect/cluster'.fmt(resourcesPrefix)
-    }
-  });
-
-  App.TimelineRESTAdapter.reopen({
-    namespace: App.Configs.restNamespace.timeline
-  });
-
-  App.advanceReadiness();
-}
-
-function loadParams() {
-  getStatus().always(function(status) {
-    status = status || {};
-    setConfigs(status.parameters);
-  });
-}
-
-if(!redirectionCheck()) {
-  App.ApplicationRoute.reopen({
-    actions: {
-      didTransition: scheduleChangeHandler,
-      queryParamsDidChange: scheduleChangeHandler
-    }
-  });
-
-  allowFullScreen();
-  loadParams();
-}